Иконка ресурса

FREE ADRWatch : 1.0.2 1.0.2

Нет прав для скачивания
C#:
using Oxide.Core;
using Oxide.Core.Plugins;
using System;
using System.Collections.Generic;
using System.Linq;

///Скачано с дискорд сервера Rust Edit [PRO+]
///discord.gg/9vyTXsJyKR

namespace Oxide.Plugins
{
    /*
     * This Version Changes:
     * - Fixed compiling issues in update
     */
    [Info("ADR Watch", "discord.gg/9vyTXsJyKR", "1.0.2")]
    [Description("Records a demo when banned players TC's and codelocks are accessed")]
    internal class ADRWatch : RustPlugin
    {
        [PluginReference] Plugin AutoDemoRecord, Clans;
        Dictionary<ulong, DateTime> _banWatchList = new Dictionary<ulong, DateTime>();
        int lastSavedCount = 0;
        private ADRWatchConfig config;

        #region Helpers
        List<ulong> GetTeamMembers(ulong userid) => RelationshipManager.ServerInstance.FindPlayersTeam(userid)?.members;
        bool IsMemberOrAlly(ulong userid1, ulong userid2) {
            if (userid1.Equals(userid2)) return true;
            var isClan = Clans != null && Clans.IsLoaded ? Clans.Call<bool>("IsMemberOrAlly", userid1.ToString(), userid2.ToString()) : false;
            var teamMembers = GetTeamMembers(userid1);
            var isTeam = teamMembers != null ? teamMembers.Contains(userid2) : false;
            return isClan || isTeam;
        }

        void CheckHooks() {
            if (config.monitorEvent_OnCodeEntered)
                Subscribe(nameof(OnCodeEntered));
            else
                Unsubscribe(nameof(OnCodeEntered));

            if (config.monitorEvent_OnCupboardAuthorize)
                Subscribe(nameof(OnCupboardAuthorize));
            else
                Unsubscribe(nameof(OnCupboardAuthorize));

            if (config.monitorEvent_OnCupboardClearList)
                Subscribe(nameof(OnCupboardClearList));
            else
                Unsubscribe(nameof(OnCupboardClearList));

            if (config.monitorEvent_OnCupboardDeauthorize)
                Subscribe(nameof(OnCupboardDeauthorize));
            else
                Unsubscribe(nameof(OnCupboardDeauthorize));
        }

        bool IsWatched(ulong userId, ulong suspectedUserId) {

            if (config.ignoreTeamMembers && IsMemberOrAlly(userId, suspectedUserId)) {
                return false;
            }

            return _banWatchList.ContainsKey(userId);
        }

        void Record(BasePlayer player, string msg) {
            AutoDemoRecord?.Call("API_StartRecording", player, msg, config.recordMinutes);
        }
        #endregion

        #region Hooks
        void Loaded() {
            LoadData();
            CheckHooks();
        }

        void Unload() => SaveData();

        void OnServerSave() => SaveData();

        void OnPlayerBanned(string name, ulong id, string address, string reason) {
            _banWatchList.TryAdd(id, DateTime.Now);
        }
        void OnUserBanned(string name, string id, string ipAddress, string reason) {
            _banWatchList.TryAdd(ulong.Parse(id), DateTime.Now);
        }
        void OnUserUnbanned(string name, string id, string ipAddress) {
            ulong userId = ulong.Parse(id);
            if (_banWatchList.ContainsKey(userId)) {
                _banWatchList.Remove(ulong.Parse(id));
            }
        }

        object OnCodeEntered(CodeLock codeLock, BasePlayer player, string code) {
            if (IsWatched(codeLock.OwnerID, player.userID)) {
                Record(player, string.Format(GetMsg("Watched Events - Code Entered - Owned"), code, codeLock.OwnerID, codeLock.name));
            } else {
                foreach (var userId in codeLock.whitelistPlayers) {
                    if (IsWatched(userId, player.userID)) {
                        Record(player, string.Format(GetMsg("Watched Events - Code Entered - Whitelist"), code, codeLock.OwnerID, codeLock.name));
                        break;
                    }
                }
                foreach (var userId in codeLock.guestPlayers) {
                    if (IsWatched(userId, player.userID)) {
                        Record(player, string.Format(GetMsg("Watched Events - Code Entered - Guest"), code, codeLock.OwnerID, codeLock.name));
                        break;
                    }
                }
            }

            return null;
        }

        void OnCupboardAuthorize(BuildingPrivlidge privilege, BasePlayer player) {
            if (IsWatched(privilege.OwnerID, player.userID)) {
                Record(player, string.Format(GetMsg("Watched Events - Cupboard Authorize - Owned"), privilege.OwnerID));
            } else {
                foreach (var userProto in privilege.authorizedPlayers) {
                    if (IsWatched(userProto.userid, player.userID)) {
                        // trigger recording, he is authed on it.Record(player, string.Format(GetMsg("Watched Events - Cupboard Authorize - Authed"), privilege.OwnerID));
                        break;
                    }
                }
            }
        }

        void OnCupboardClearList(BuildingPrivlidge privilege, BasePlayer player) {
            if (IsWatched(privilege.OwnerID, player.userID)) {
                Record(player, string.Format(GetMsg("Watched Events - Cupboard Clearlist - Owned"), privilege.OwnerID));
            } else {
                foreach (var userProto in privilege.authorizedPlayers) {
                    if (IsWatched(userProto.userid, player.userID)) {
                        Record(player, string.Format(GetMsg("Watched Events - Cupboard Clearlist - Authed"), privilege.OwnerID));
                        break;
                    }
                }
            }
        }

        void OnCupboardDeauthorize(BuildingPrivlidge privilege, BasePlayer player) {
            if (IsWatched(privilege.OwnerID, player.userID)) {
                Record(player, string.Format(GetMsg("Watched Events - Cupboard Deauthorize - Owned"), privilege.OwnerID));
            } else {
                foreach (var userProto in privilege.authorizedPlayers) {
                    if (IsWatched(userProto.userid, player.userID)) {
                        Record(player, string.Format(GetMsg("Watched Events - Cupboard Deauthorize - Authed"), privilege.OwnerID));
                        break;
                    }
                }
            }
        }
        #endregion


        #region Configuration
        private class ADRWatchConfig
        {
            // Config default vars
            public int monitorHours = 24;
            public int recordMinutes = 10;
            public bool ignoreTeamMembers = true;
            public bool monitorEvent_OnCodeEntered = true;
            public bool monitorEvent_OnCupboardAuthorize = true;
            public bool monitorEvent_OnCupboardClearList = true;
            public bool monitorEvent_OnCupboardDeauthorize = true;

            // Plugin reference
            private ADRWatch plugin;
            public ADRWatchConfig(ADRWatch plugin) {
                this.plugin = plugin;
                /**
                 * Load all saved config values
                 * */
                GetConfig(ref monitorHours, "General", "Monitor banned for X hours");
                GetConfig(ref recordMinutes, "General", "Record for X minutes");
                GetConfig(ref ignoreTeamMembers, "General", "Ignore team mates");

                GetConfig(ref monitorEvent_OnCodeEntered, "Watched Events", "Code Entered");
                GetConfig(ref monitorEvent_OnCupboardAuthorize, "Watched Events", "Cupboard Authorize");
                GetConfig(ref monitorEvent_OnCupboardDeauthorize, "Watched Events", "Cupboard Deauthorize");
                GetConfig(ref monitorEvent_OnCupboardClearList, "Watched Events", "Cupboard ClearList");

                plugin.SaveConfig();
            }

            private void GetConfig<T>(ref T variable, params string[] path) {
                if (path.Length == 0) return;
                if (plugin.Config.Get(path) == null) {
                    SetConfig(ref variable, path);
                    plugin.PrintWarning($"Added new field to config: {string.Join("/", path)}");
                }
                variable = (T)Convert.ChangeType(plugin.Config.Get(path), typeof(T));
            }

            private void SetConfig<T>(ref T variable, params string[] path) => plugin.Config.Set(path.Concat(new object[] { variable }).ToArray());

        }
        string GetMsg(string key) => lang.GetMessage(key, this);
        protected override void LoadConfig() {
            base.LoadConfig();
            config = new ADRWatchConfig(this);
        }
        protected override void LoadDefaultMessages() {
            lang.RegisterMessages(new Dictionary<string, string> {
                ["Watched Events - Code Entered - Owned"] = "Entered code `{0}` correctly on a banned player's ({1}) {2}",
                ["Watched Events - Code Entered - Guest"] = "Entered code `{0}` correctly on {2} that a banned player ({1}) is guest to",
                ["Watched Events - Code Entered - Whitelist"] = "Entered code `{0}` correctly on {2} that a banned player ({1}) is whitelisted to",
                ["Watched Events - Cupboard Authorize - Owned"] = "Authorized on a banned player's ({0}) TC",
                ["Watched Events - Cupboard Authorize - Authed"] = "Authorized on a TC that a banned player ({0}) is authorized on",
                ["Watched Events - Cupboard Deauthorize - Owned"] = "Deauthed on a TC a banned player ({0}) owns",
                ["Watched Events - Cupboard Deauthorize - Authed"] = "Deauthed on a TC a banned player ({0}) is authorized on",
                ["Watched Events - Cupboard Clearlist - Owned"] = "Cleared a TC that belongs to a banned player ({0})",
                ["Watched Events - Cupboard Clearlist - Authed"] = "Cleared a TC that a banned player ({0}) is authorized on",
            }, this);
        }

        void LoadData() {
            try {
                _banWatchList = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, DateTime>>(this.Name);
                lastSavedCount = _banWatchList.Count();
            } catch (Exception e) {
                Puts(e.Message);
            }
        }
        void SaveData() {
            _banWatchList = _banWatchList.Where(x => x.Value >= DateTime.Now.AddHours(-config.monitorHours)).ToDictionary(i => i.Key, i => i.Value);
            int records = _banWatchList.Count();
            int recordsDiff = records - lastSavedCount;

            if (recordsDiff == 0) return;
            try {
                Interface.Oxide.DataFileSystem.WriteObject(this.Name, _banWatchList, true);
                lastSavedCount = records;
            } catch (Exception e) {
                Puts(e.Message);
            }
        }

        protected override void LoadDefaultConfig() => PrintWarning("Generating new configuration file.");
        #endregion

    }
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху