C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Net;
using System.Linq;
using System.Globalization;
using System.Collections.Generic;
using Network;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using UnityEngine;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Core.Libraries;
//
// This plugin is designed to work with the PvE Rust APIs - https://pverust.com
//
namespace Oxide.Plugins {
[Info("PvE Rust", "pverust.com", "0.0.5")]
[Description("The plugin component of the PvE Rust platform.")]
class ActionLoggingCore : RustPlugin {
private ConfigData configData;
string hostname = "https://api.pverust.com";
string version = "v1";
string serverSecretKey;
bool debug;
List<string> ignoreListOnEntityBuilt = new List<string>();
List<string> ignoreListOnEntityDeath = new List<string>();
List<string> ignoreListOnLootEntity = new List<string>();
List<string> ignoreListHandleDoorActions = new List<string>();
List<string> ignoreListHandleMountableActions = new List<string>();
public List<object> actions;
public List<object> actionsToSend;
bool canSendToPvERust = false;
private readonly Dictionary<string, string> header = new Dictionary<string, string> {
["Content-Type"] = "application/json"
};
void Init() {
LoadConfigVariables();
serverSecretKey = configData.Keys.serverSecretKey;
debug = configData.Options.debug;
actions = new List<object>();
actionsToSend = new List<object>();
timer.Repeat(10f, 0, () => {
SendActionLog();
});
VerifyKeys();
InitialiseServer();
}
void VerifyKeys() {
if (serverSecretKey != "") {
canSendToPvERust = true;
}
}
void InitialiseServer() {
if (canSendToPvERust) {
string path = "initialise/fetch.php";
string endpoint = hostname + "/" + version + "/" + path;
var data = new {
serverSecretKey = serverSecretKey
};
string payload = JsonConvert.SerializeObject(data);
webrequest.Enqueue(endpoint, payload, (code, response) => InitialiseServerCallback(code, response), this, RequestMethod.POST, header);
}
}
void InitialiseServerCallback(int code, string response) {
if (debug) {
Puts(response);
}
var json = JObject.Parse(response);
if ((string)json["status"] == "ok") {
foreach (string prefabName in json["ignoreListOnEntityBuilt"]) {
ignoreListOnEntityBuilt.Add(prefabName);
}
foreach (string prefabName in json["ignoreListOnEntityDeath"]) {
ignoreListOnEntityDeath.Add(prefabName);
}
foreach (string prefabName in json["ignoreListOnLootEntity"]) {
ignoreListOnLootEntity.Add(prefabName);
}
foreach (string prefabName in json["ignoreListHandleDoorActions"]) {
ignoreListHandleDoorActions.Add(prefabName);
}
foreach (string prefabName in json["ignoreListHandleMountableActions"]) {
ignoreListHandleMountableActions.Add(prefabName);
}
} else if ((string)json["status"] == "error") {
Puts((string)json["message"]);
}
}
void AppendToLog(string category, BasePlayer initiator, string prefab, string info, int rag) {
Int32 timestamp = GetTimestamp();
string initiatorSteamID = initiator.UserIDString;
string initiatorSteamName = initiator.displayName;
float positionX = initiator.transform.position.x;
float positionY = initiator.transform.position.y;
float positionZ = initiator.transform.position.z;
actions.Add(new {
timestamp = timestamp,
initiatorSteamID = initiatorSteamID,
initiatorSteamName = initiatorSteamName,
category = category,
prefab = prefab,
info = info,
rag = rag,
positionX = positionX,
positionY = positionY,
positionZ = positionZ
});
}
void SendActionLog() {
int logCount = actions.Count();
if (logCount != 0) {
Puts("Send Action Log: " + logCount + " actions");
string path = "actions/put.php";
string endpoint = hostname + "/" + version + "/" + path;
actionsToSend = actions;
actions.Clear();
var serializedActions = JsonConvert.SerializeObject(actionsToSend);
if (debug) {
Puts("Action log: " + serializedActions);
}
var data = new {
serverSecretKey = serverSecretKey,
actions = serializedActions
};
string payload = JsonConvert.SerializeObject(data);
webrequest.Enqueue(endpoint, payload, (code, response) => SendActionLogCallback(code, response), this, RequestMethod.POST);
} else {
if (debug) {
Puts("Send Action Log: No actions to send");
}
}
}
void SendActionLogCallback(int code, string response) {
if (code == 200) {
JObject jsonResponse = JObject.Parse(response);
string status = (string)jsonResponse["status"];
if (status == "success") {
if (debug) {
string records = (string)jsonResponse["records"];
Puts("Status: " + status + " | Records: " + records);
Puts("Clear action log");
}
actionsToSend.Clear();
} else if (status == "error") {
string message = (string)jsonResponse["message"];
Puts("Status: " + status + " | Message: " + message);
}
} else {
Puts("Error Code: " + code);
Puts("Error Response: " + response);
}
}
// Construction & deployables
void OnEntityBuilt(Planner plan, GameObject entity) {
string prefab = entity.ToBaseEntity().ShortPrefabName;
if (prefab != null) {
if (!ignoreListOnEntityBuilt.Contains(prefab)) {
BasePlayer initiator = plan.GetOwnerPlayer();
if (initiator != null) {
string category = "build";
string info = "";
int rag = 0;
AppendToLog(category, initiator, prefab, info, rag);
}
}
}
}
void CanPickupEntity(BasePlayer initiator, BaseCombatEntity entity) {
string prefab = entity.ShortPrefabName;
if (prefab != null) {
if (!ignoreListOnEntityBuilt.Contains(prefab)) {
string category = "pickup";
string info = "";
int rag = 1;
AppendToLog(category, initiator, prefab, info, rag);
}
}
}
void OnStructureUpgrade(BaseCombatEntity entity, BasePlayer initiator, BuildingGrade.Enum grade) {
if (entity != null) {
string prefab = entity.ShortPrefabName;
if ((prefab != null) && (initiator != null)) {
string category = "upgrade";
string info = grade.ToString();
int rag = 0;
AppendToLog(category, initiator, prefab, info, rag);
}
}
}
void OnStructureDemolish(BaseCombatEntity entity, BasePlayer initiator) {
string prefab = entity.ShortPrefabName;
if ((prefab != null) && (initiator != null)) {
string category = "demolish";
string info = "";
int rag = 1;
AppendToLog(category, initiator, prefab, info, rag);
}
}
void OnEntityDeath(BaseCombatEntity entity, HitInfo player) {
string prefab = entity.ShortPrefabName;
if (prefab != null) {
if (!ignoreListOnEntityDeath.Contains(prefab)) {
if ((player != null) && (player.Initiator != null)) {
BasePlayer initiator = player.Initiator.ToPlayer();
if (initiator != null) {
string category = "destroy";
string info = "";
int rag = 2;
AppendToLog(category, initiator, prefab, info, rag);
}
}
}
}
}
// Looting
void OnLootEntity(BasePlayer initiator, BaseEntity entity) {
if (entity != null) {
string category;
string info;
int rag;
string prefab = entity.ShortPrefabName;
if (!ignoreListOnLootEntity.Contains(prefab)) {
if (entity is BasePlayer) {
var looted = entity.ToPlayer();
category = "looted";
info = looted.displayName;
rag = 1;
} else {
category = "looted";
info = "";
rag = 0;
}
AppendToLog(category, initiator, prefab, info, rag);
}
}
}
// Cupboard auth
void OnCupboardAuthorize(BuildingPrivlidge privilege, BasePlayer initiator) {
if (initiator != null) {
string category = "cupboard";
string prefab = "cupboard.tool.deployed";
string info = "authorised";
int rag = 0;
AppendToLog(category, initiator, prefab, info, rag);
}
}
void OnCupboardDeauthorize(BuildingPrivlidge privilege, BasePlayer initiator) {
if (initiator != null) {
string category = "cupboard";
string prefab = "cupboard.tool.deployed";
string info = "deauthorised";
int rag = 0;
AppendToLog(category, initiator, prefab, info, rag);
}
}
void OnCupboardClearList(BuildingPrivlidge privilege, BasePlayer initiator) {
if (initiator != null) {
string category = "cupboard";
string prefab = "cupboard.tool.deployed";
string info = "cleared";
int rag = 1;
AppendToLog(category, initiator, prefab, info, rag);
}
}
// Sign usage
void OnSignUpdated(Signage sign, BasePlayer initiator, string text) {
string prefab = sign.ShortPrefabName;
if ((prefab != null) && (initiator != null)) {
string category = "sign";
string info = "updated";
int rag = 0;
AppendToLog(category, initiator, prefab, info, rag);
}
}
void OnSignLocked(Signage sign, BasePlayer initiator) {
string prefab = sign.ShortPrefabName;
if ((prefab != null) && (initiator != null)) {
string category = "sign";
string info = "locked";
int rag = 0;
AppendToLog(category, initiator, prefab, info, rag);
}
}
// Door usage
void OnDoorKnocked(Door door, BasePlayer initiator) {
HandleDoorActions(door, initiator, "knocked");
}
void OnDoorOpened(Door door, BasePlayer initiator) {
HandleDoorActions(door, initiator, "opened");
}
void OnDoorClosed(Door door, BasePlayer initiator) {
HandleDoorActions(door, initiator, "closed");
}
void HandleDoorActions(Door door, BasePlayer initiator, string action) {
string prefab = door.ShortPrefabName;
if (prefab != null) {
if (!ignoreListHandleDoorActions.Contains(prefab)) {
if (initiator != null) {
string category = action;
string info = action;
int rag = 0;
AppendToLog(category, initiator, prefab, info, rag);
}
}
}
}
// Mount & dismount
void OnEntityMounted(BaseMountable mountable, BasePlayer initiator) {
HandleMountableActions(mountable, initiator, "mounted");
}
void OnEntityDismounted(BaseMountable mountable, BasePlayer initiator) {
HandleMountableActions(mountable, initiator, "dismounted");
}
void HandleMountableActions(BaseMountable mountable, BasePlayer initiator, string action) {
string prefab = mountable.ShortPrefabName;
if (prefab != null) {
if (!ignoreListHandleMountableActions.Contains(prefab)) {
if (initiator != null) {
string category = action;
string info = action;
int rag = 0;
AppendToLog(category, initiator, prefab, info, rag);
}
}
}
}
// Map wipe
void OnNewSave(string filename) {
if (canSendToPvERust) {
string path = "wipe/put.php";
string endpoint = hostname + "/" + version + "/" + path;
var data = new {
serverSecretKey = serverSecretKey
};
string payload = JsonConvert.SerializeObject(data);
webrequest.Enqueue(endpoint, payload, (code, response) => OnNewSaveCallback(code, response), this, RequestMethod.POST, header);
}
}
void OnNewSaveCallback(int code, string response) {
var json = JObject.Parse(response);
if ((string)json["status"] == "error") {
string status = (string)json["status"];
string message = (string)json["message"];
Puts("Status: " + status + " | Message: " + message);
}
}
// WebRequests
void GenericWebRequest(string endpoint, string payload) {
if (debug) {
Puts("Endpoint debug: " + endpoint);
Puts("Payload debug: " + payload);
}
if (canSendToPvERust) {
webrequest.Enqueue(endpoint, payload, (code, response) => GenericCallback(code, response), this, RequestMethod.POST, header);
}
}
void GenericCallback(int code, string response) {
var json = JObject.Parse(response);
if ((string)json["status"] == "error") {
string message = (string)json["message"];
string endpoint = (string)json["endpoint"];
Puts("Status: error | Message: " + message + " | Endpoint: " + endpoint);
}
}
// Helpers
private int GetTimestamp() {
return (int)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
}
private string GetFormattedDate() {
return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
void DoChat(string chat) {
rust.BroadcastChat(null, chat);
}
// Config management
private void LoadConfigVariables() {
configData = Config.ReadObject<ConfigData>();
// if (configData.Version < new VersionNumber(0, 2, 4)) {
// configData.Store.other4 = 14;
// }
configData.Version = Version;
SaveConfig(configData);
}
protected override void LoadDefaultConfig() {
ConfigData configDefault = new() {
Keys = new Keys() {
serverSecretKey = ""
},
Options = new Options() {
debug = false
},
Version = Version
};
SaveConfig(configDefault);
}
private void SaveConfig(ConfigData config) {
Config.WriteObject(config, true);
}
private class ConfigData {
public Keys Keys;
public Options Options;
public VersionNumber Version;
}
public class Keys {
public string serverSecretKey;
}
public class Options {
public bool debug;
}
}
}