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

FREE IQReportSystem : 0.1.0 0.1.0

Нет прав для скачивания
C#:
using System;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using Oxide.Game.Rust.Cui;
using Oxide.Core.Libraries.Covalence;
using ConVar;
using Newtonsoft.Json.Linq;
using System.Linq;
using Oxide.Core.Plugins;
namespace Oxide.Plugins {
    [Info("IQReportSystem", "", "0.1.0")]
    class IQReportSystem : RustPlugin {
#region Reference
        [PluginReference]
        Plugin GameWerAC, ImageLibrary, MultiFighting, IQChat, Friends, IQPersonal;
        public string GetImage(string shortname, ulong skin = 0) => (string)ImageLibrary?.Call("GetImage", shortname, skin);
        public bool AddImage(string url, string shortname, ulong skin = 0) => (bool)ImageLibrary?.Call("AddImage", url, shortname, skin);
        public void SetCheck(BasePlayer player) => IQPersonal?.CallHook("API_SET_CHECK", player.userID);
        public void SetBans(BasePlayer player) => IQPersonal?.CallHook("API_SET_BANS", player.userID);
        public void SetScore(ulong UserID, int Amount) => IQPersonal?.CallHook("API_SET_SCORE", UserID, Amount);
        public void RemoveScore(ulong UserID, int Amount) => IQPersonal?.CallHook("API_REMOVE_SCORE", UserID, Amount);
#endregion
#region Vars
#region Permission
        string PermissionModeration = "iqreportsystem.moderation";
        string PermissionAdmin = "iqreportsystem.admin";
#endregion
#region Lists
        public Dictionary<ulong, int> CooldownPC = new Dictionary<ulong, int>();
        public Dictionary<ulong, PlayerSaveCheckClass> PlayerSaveCheck = new Dictionary<ulong, PlayerSaveCheckClass>();
        public class PlayerSaveCheckClass {
            public string Discord;
            public string NickName;
            public string StatusNetwork;
            public ulong ModeratorID;
        }
#endregion
#region JSON
        private class Response {
            public List<string> last_ip;
            public string last_nick;
            public List<ulong> another_accs;
            public List<last_checks> last_check;
            public class last_checks {
                public ulong moderSteamID;
                public string serverName;
                public int time;
            }
            public List<RustCCBans> bans;
            public class RustCCBans {
                public int banID;
                public string reason;
                public string serverName;
                public int OVHserverID;
                public int banDate;
            }
        }
#endregion
#endregion
#region Configuration
        private static Configuration config = new Configuration();
        public class Configuration {
            [JsonProperty("Основные настройки")]
            public Settings Setting = new Settings();
            [JsonProperty("Причины репорта")]
            public List<string> ReasonReport = new List<string>();
            [JsonProperty("Причины блокировки")]
            public List<BanReason> ReasonBan = new List<BanReason>();
            [JsonProperty("Настройки RustCheatCheck(Будет при проверке выдавать доступ в чекер и выводить информацию модератору)")]
            public RCCSettings RCCSetting = new RCCSettings();
            [JsonProperty("Настройка репутации для проверяющих")]
            public RaitingSettings RaitingSetting = new RaitingSettings();
            internal class BanReason {
                [JsonProperty("Название")]
                public string DisplayName;
                [JsonProperty("Команда")]
                public string Command;
            }
            internal class RCCSettings {
                [JsonProperty("Включить поддержку RCC")]
                public bool RCCUse;
                [JsonProperty("Ключ от RCC")]
                public string Key;
            }
            internal class RaitingSettings {
                [JsonProperty("Сколько репутации снимать за 1-2 звезды(IQPersonal)")]
                public int RemoveAmountOneTwo;
                [JsonProperty("Сколько репутации давать за 3-4 звезды(IQPersonal)")]
                public int GiveAmountThreeFour;
                [JsonProperty("Сколько репутации давать за 5 звезд(IQPersonal)")]
                public int GiveAmountFive;
            }
            internal class Settings {
                [JsonProperty("Настройки IQChat")]
                public ChatSettings ChatSetting = new ChatSettings();
                [JsonProperty("Настройки интерфейса")]
                public InterfaceSetting Interface = new InterfaceSetting();
                [JsonProperty("Включить/отключить оповещение о максимальном кол-во репортов")]
                public bool MaxReportAlert;
                [JsonProperty("Максимальное количество репортов")]
                public int MaxReport;
                [JsonProperty("Перезарядка для отправки репорта(секунды)")]
                public int CooldownTime;
                [JsonProperty("Запретить друзьям репортить друг друга")]
                public bool FriendNoReport;
                [JsonProperty("Включить логирование в беседу ВК")]
                public bool VKMessage;
                [JsonProperty("Включить логирование в Discord")]
                public bool DiscrodMessage;
                [JsonProperty("Webhooks для дискорда")]
                public string WebHook;
                [JsonProperty("Настройки ВК")]
                public VKSetting VKSettings = new VKSetting();
                internal class ChatSettings {
                    [JsonProperty("IQChat : Кастомный префикс в чате")]
                    public string CustomPrefix;
                    [JsonProperty("IQChat : Кастомный аватар в чате(Если требуется)")]
                    public string CustomAvatar;
                }
                internal class VKSetting {
                    [JsonProperty("Токен от группы ВК(От группы будут идти сообщения в беседу.Вам нужно добавить свою группу в беседу!)")]
                    public string Token;
                    [JsonProperty("ID беседы для группы")]
                    public string ChatID;
                }
                internal class InterfaceSetting {
                    [JsonProperty("Настройка интерфейса для отправки жалобы")]
                    public ReasonInterfaceSetting ReasonInterface = new ReasonInterfaceSetting();
                    [JsonProperty("Настройка интерфейса для уведомления")]
                    public AlertInterfaceSettings AlertInterface = new AlertInterfaceSettings();
                    [JsonProperty("Настройка интерфейса для мини-панели модератора")]
                    public ModeratorPanelInterfaceSettings ModderatorPanel = new ModeratorPanelInterfaceSettings();
                    [JsonProperty("Настройка интерфейса для рейтинга")]
                    public RaitingInterfaceSettings RaitingInterface = new RaitingInterfaceSettings();
                    [JsonProperty("Sprite для рейтинга(звезды)")]
                    public string SpriteRaiting;
                    [JsonProperty("Sprite для кнопки жалоб в панели модератора")]
                    public string SpriteReportModeration;
                    [JsonProperty("Sprite для иконки жалоб")]
                    public string SpriteReport;
                    [JsonProperty("Цвет текста в плагине")]
                    public string HexLabels;
                    [JsonProperty("Цвет боковой панели")]
                    public string HexRightMenu;
                    [JsonProperty("Цвет кнопок боковой панели")]
                    public string HexButtonRightMenu;
                    [JsonProperty("Цвет основной панели")]
                    public string HexMainPanel;
                    [JsonProperty("Цвет панели поиска и заднего фона игроков")]
                    public string HexSearchPanel;
                    [JsonProperty("Цвет кнопки у игрока для перехода к действию")]
                    public string HexPlayerButton;
                    [JsonProperty("Sprite кнопки у игрока для преехода к действию")]
                    public string SpritePlayerButton;
                    internal class ReasonInterfaceSetting {
                        [JsonProperty("Цвет основной панели")]
                        public string HexMain;
                        [JsonProperty("Цвет панели с заголовком")]
                        public string HexTitlePanel;
                        [JsonProperty("Цвет жалоб")]
                        public string HexButton;
                        [JsonProperty("Цвет текста с жалобами")]
                        public string HexLabel;
                        [JsonProperty("Sprite кнопки закрыть")]
                        public string SpriteClose;
                        [JsonProperty("Sprite панели с заголовком")]
                        public string SpriteTitlePanel;
                        [JsonProperty("Цвет кнопки закрыть")]
                        public string HexClose;
                    }
                    internal class AlertInterfaceSettings {
                        [JsonProperty("Цвет основной панели")]
                        public string HexMain;
                        [JsonProperty("Цвет заголовка и полоски")]
                        public string HexTitle;
                        [JsonProperty("Цвет текста")]
                        public string HexLabel;
                    }
                    internal class ModeratorPanelInterfaceSettings {
                        [JsonProperty("Цвет основной панели")]
                        public string HexMain;
                        [JsonProperty("Цвет панели с заголовком")]
                        public string HexTitlePanel;
                        [JsonProperty("Sprite панели с заголовком")]
                        public string SpriteTitlePanel;
                        [JsonProperty("Цвет текста")]
                        public string HexLabel;
                        [JsonProperty("Цвет кнопки вердикт и задний фон причин")]
                        public string HexBanButton;
                        [JsonProperty("Цвет кнопки окончания проверки")]
                        public string HexStopButton;
                    }
                    internal class RaitingInterfaceSettings {
                        [JsonProperty("Цвет основной панели")]
                        public string HexMain;
                        [JsonProperty("Цвет панели с заголовком")]
                        public string HexTitlePanel;
                        [JsonProperty("Sprite панели с заголовком")]
                        public string SpriteTitlePanel;
                        [JsonProperty("Цвет текста")]
                        public string HexLabel;
                        [JsonProperty("Цвет иконок с рейтингом")]
                        public string HexRaitingButton;
                        [JsonProperty("Sprite рейтинга")]
                        public string SpriteRaiting;
                    }
                }
            }
            public static Configuration GetNewConfiguration() {
                return new Configuration {
                    Setting = new Settings {
                        FriendNoReport = false, MaxReport = 3, MaxReportAlert = true, CooldownTime = 600, VKMessage = true, DiscrodMessage = false, WebHook = "", ChatSetting = new Settings.ChatSettings {
                            CustomAvatar = "", CustomPrefix = ""
                        }
                        , VKSettings = new Settings.VKSetting {
                            Token = "", ChatID = ""
                        }
                        , Interface = new Settings.InterfaceSetting {
                            SpriteRaiting = "assets/icons/favourite_servers.png", SpriteReportModeration = "assets/icons/subtract.png", SpriteReport = "assets/icons/examine.png", SpritePlayerButton = "assets/icons/vote_up.png", HexPlayerButton = "#45542BFF", HexLabels = "#DAD1C7FF", HexButtonRightMenu = "#802A2AFF", HexMainPanel = "#21211AF2", HexRightMenu = "#762424FF", HexSearchPanel = "#3B3D37FF", ReasonInterface = new Settings.InterfaceSetting.ReasonInterfaceSetting {
                                HexMain = "#585450FF", HexTitlePanel = "#54514DFF", HexButton = "#3E482EFF", HexClose = "#B4371EFF", HexLabel = "#bdd197", SpriteClose = "assets/icons/vote_down.png", SpriteTitlePanel = "assets/icons/connection.png"
                            }
                            , AlertInterface = new Settings.InterfaceSetting.AlertInterfaceSettings {
                                HexMain = "#21211AF2", HexLabel = "#DAD1C7FF", HexTitle = "#B4371EFF",
                            }
                            , ModderatorPanel = new Settings.InterfaceSetting.ModeratorPanelInterfaceSettings {
                                HexMain = "#575450FF", HexTitlePanel = "#54514DFF", HexLabel = "#DAD1C7FF", SpriteTitlePanel = "assets/icons/study.png", HexBanButton = "#B4371EFF", HexStopButton = "#3E482EFF"
                            }
                            , RaitingInterface = new Settings.InterfaceSetting.RaitingInterfaceSettings {
                                HexMain = "#575450FF", HexTitlePanel = "#54514DFF", HexLabel = "#DAD1C7FF", HexRaitingButton = "#cdb980", SpriteTitlePanel = "assets/icons/ignite.png", SpriteRaiting = "assets/icons/favourite_servers.png"
                            }
                        }
                    }
                    , ReasonReport = new List<string> {
                        "Использование читов", "Макросы", "Игра 3+",
                    }
                    , ReasonBan = new List<BanReason> {
                        new BanReason {
                            DisplayName = "Использование читов", Command = "ban {0} soft",
                        }
                        , new BanReason {
                            DisplayName = "Макросы", Command = "ban {0} 30d macros",
                        }
                        , new BanReason {
                            DisplayName = "Игра 3+", Command = "ban {0} 14d 3+",
                        }
                        , new BanReason {
                            DisplayName = "Отказ", Command = "ban {0} 7d otkaz",
                        }
                        ,
                    }
                    , RCCSetting = new RCCSettings {
                        RCCUse = false, Key = "xxxxxxxxxxxxxxRCCKey",
                    }
                    , RaitingSetting = new RaitingSettings {
                        RemoveAmountOneTwo = 4, GiveAmountThreeFour = 3, GiveAmountFive = 5
                    }
                }
                ;
            }
        }
        protected override void LoadConfig() {
            base.LoadConfig();
            try {
                config = Config.ReadObject<Configuration>();
                if (config == null) LoadDefaultConfig();
            }
            catch {
                PrintWarning($"Ошибка чтения конфигурации #13 'oxide/config/{Name}', создаём новую конфигурацию!!");
                LoadDefaultConfig();
            }
            NextTick(SaveConfig);
        }
        protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
        protected override void SaveConfig() => Config.WriteObject(config);
#endregion
#region Data
        public Dictionary<ulong, PlayerInfo> ReportInformation = new Dictionary<ulong, PlayerInfo>();
        public Dictionary<ulong, ModeratorInfo> ModeratorInformation = new Dictionary<ulong, ModeratorInfo>();
        public class PlayerInfo {
            [JsonProperty("Отображаемое имя")]
            public string DisplayName;
            [JsonProperty("IP Адреса")]
            public List<string> IP;
            [JsonProperty("Последняя жалоба")]
            public string LastReport;
            [JsonProperty("Последний проверяющий модератор")]
            public string LastCheckModerator;
            [JsonProperty("Количество проверок")]
            public int CheckCount;
            [JsonProperty("История жалоб")]
            public List<string> ReportHistory;
            [JsonProperty("Количество жалоб")]
            public int ReportCount;
            [JsonProperty("Игровой статус")]
            public string GameStatus;
        }
        public class ModeratorInfo {
            [JsonProperty("Проверки игроков с вердиктами")]
            public Dictionary<string, string> CheckPlayerModerator = new Dictionary<string, string>();
            [JsonProperty("Блокировки игроков с вердиктом")]
            public Dictionary<string, string> BanPlayerModerator = new Dictionary<string, string>();
            [JsonProperty("Общее количество проверок")]
            public int CheckCount;
            [JsonProperty("История оценок модератора")]
            public List<int> Arrayrating;
            [JsonProperty("Средняя оценка качества")]
            public float AverageRating;
        }
#endregion
#region Metods
#region MetodsReport
        void Metods_PlayerConnected(BasePlayer player) {
            if (!ReportInformation.ContainsKey(player.userID)) {
                PlayerInfo pInfo = new PlayerInfo {
                    DisplayName = player.displayName, IP = new List<string>(), LastReport = "", LastCheckModerator = "", CheckCount = 0, ReportCount = 0, GameStatus = IsSteam(player.UserIDString), ReportHistory = new List<string>(),
                }
                ;
                ReportInformation.Add(player.userID, pInfo);
            }
            else {
                var User = ReportInformation[player.userID];
                var IP = covalence.Players.FindPlayerById(player.UserIDString).Address;
                User.GameStatus = IsSteam(player.UserIDString);
                if (!User.IP.Contains(IP)) User.IP.Add(IP);
            }
            if (permission.UserHasPermission(player.UserIDString, PermissionModeration)) {
                if (!ModeratorInformation.ContainsKey(player.userID)) {
                    ModeratorInfo mInfo = new ModeratorInfo {
                        CheckCount = 0, BanPlayerModerator = new Dictionary<string, string>(), CheckPlayerModerator = new Dictionary<string, string>(), Arrayrating = new List<int>(), AverageRating = 0,
                    }
                    ;
                    ModeratorInformation.Add(player.userID, mInfo);
                }
            }
            Metods_StatusNetwork(player, lang.GetMessage("NETWORD_STATUS_ONLINE", this, player.UserIDString));
        }
        void Metods_Report(BasePlayer target, int ReasonIndex) {
            if (permission.UserHasPermission(target.UserIDString, PermissionAdmin)) return;
            if (IsSteam(target.UserIDString) == lang.GetMessage("IS_STEAM_STATUS_PIRATE", this, target.UserIDString)) {
                if (GameWerAC != null) {
                    GameWerAC.Call("GetScreenReport", target);
                    Puts("Выполнен скриншот экрана для пирата");
                }
            }
            string ReasonReport = config.ReasonReport[ReasonIndex];
            var User = ReportInformation[target.userID];
            User.ReportCount++;
            User.LastReport = ReasonReport;
            User.ReportHistory.Insert(0, ReasonReport);
            if (config.Setting.MaxReportAlert) if (User.ReportCount >= config.Setting.MaxReport) {
                foreach (var MList in BasePlayer.activePlayerList) if (permission.UserHasPermission(MList.UserIDString, PermissionModeration)) SendChat(MList, String.Format(lang.GetMessage("METODS_HELP_MODERS", this, MList.UserIDString), target.displayName, User.ReportCount));
                VKSendMessage(String.Format(lang.GetMessage("METODS_HELP_MODERS_VK", this), target.displayName, User.ReportCount));
                DiscordSendMessage(String.Format(lang.GetMessage("METODS_HELP_MODERS_VK", this), target.displayName, User.ReportCount));
            }
        }
#endregion
#region MetodsCooldown
        void Metods_GiveCooldown(ulong ID, int cooldown) {
            CooldownPC[ID] = cooldown + (int)CurrentTime();
        }
        bool Metods_GetCooldown(ulong ID) {
            if (!CooldownPC.ContainsKey(ID) || Math.Max(0, CooldownPC[ID]) < 1 || CooldownPC[ID] <= (int)CurrentTime()) return false;
            else return true;
        }
#endregion
#region MetodsModeration
        void Metods_CheckModeration(BasePlayer Suspect, BasePlayer Moderator) {
            if (PlayerSaveCheck.ContainsKey(Suspect.userID)) {
                SendChat(Moderator, lang.GetMessage("PLAYER_CHECKED", this));
                return;
            }
            else PlayerSaveCheck.Add(Suspect.userID, new PlayerSaveCheckClass {
            }
            );
            SendChat(Moderator, String.Format(lang.GetMessage("METODS_MODER_START_CHECK", this, Moderator.UserIDString), Suspect.displayName));
            VKSendMessage(String.Format(lang.GetMessage("METODS_MODER_START_CHECK_VK", this), Moderator.displayName, Moderator.UserIDString, Suspect.displayName, Suspect.UserIDString));
            Metods_AFK(Suspect.userID, Moderator);
        }
        void Metods_CheckModerationFinish(BasePlayer moderator, ulong SuspectID) {
            IPlayer Suspect = covalence.Players.FindPlayerById(SuspectID.ToString());
            if (Suspect.IsConnected) {
                BasePlayer SOnline = BasePlayer.FindByID(ulong.Parse(Suspect.Id));
                CuiHelper.DestroyUi(SOnline, PARENT_UI_ALERT_SEND);
                SendChat(SOnline, lang.GetMessage("MSG_CHECK_CHECK_STOP", this, moderator.UserIDString));
            }
            CuiHelper.DestroyUi(moderator, PARENT_UI_MODERATOR_MINI_PANEL);
            PlayerSaveCheck.Remove(ulong.Parse(Suspect.Id));
            var User = ReportInformation[ulong.Parse(Suspect.Id)];
            var Moderator = ModeratorInformation[moderator.userID];
            Moderator.CheckCount++;
            if (!Moderator.CheckPlayerModerator.ContainsKey(Suspect.Name)) Moderator.CheckPlayerModerator.Add(Suspect.Name, User.LastReport);
            User.ReportCount = 0;
            User.ReportHistory.Clear();
            User.LastReport = lang.GetMessage("NON_REPORT", this);
            User.CheckCount++;
            User.LastCheckModerator = moderator.displayName;
            foreach(BasePlayer player in BasePlayer.activePlayerList) {
                SendChat(player, $"<size=12>Модератор {moderator.displayName} закончил проверку игрока {Suspect.Name}.Игрок не был заблокирован.</size>");
            }
            SendChat(moderator, lang.GetMessage("METODS_MODER_STOP_CHECK", this, moderator.UserIDString));
            VKSendMessage(String.Format(lang.GetMessage("METODS_MODER_STOP_CHECK_VK", this), moderator.displayName));
            DiscordSendMessage(String.Format(lang.GetMessage("METODS_MODER_STOP_CHECK_VK", this), moderator.displayName));
            SetCheck(moderator);
        }
        void Metods_StatusNetwork(BasePlayer Suspect, string Reason) {
            if (PlayerSaveCheck.ContainsKey(Suspect.userID)) {
                if (Suspect.IsConnected()) if (Suspect.IsReceivingSnapshot()) {
                    timer.Once(3, () => Metods_StatusNetwork(Suspect, lang.GetMessage("NETWORD_STATUS_ONLINE", this, Suspect.UserIDString)));
                    return;
                }
                PlayerSaveCheck[Suspect.userID].StatusNetwork = Reason;
                BasePlayer Moderator = BasePlayer.FindByID(PlayerSaveCheck[Suspect.userID].ModeratorID);
                CuiHelper.DestroyUi(Moderator, UI_MODERATION_CHECK_MENU_NETWORK);
                CuiElementContainer container = new CuiElementContainer();
                container.Add(new CuiLabel {
                    RectTransform = {
                        AnchorMin = "0.6782616 0.5478261", AnchorMax = "0.9884076 0.7333333"
                    }
                    , Text = {
                        Text = $"{PlayerSaveCheck[Suspect.userID].StatusNetwork}", FontSize = 12, Font = "robotocondensed-regular.ttf", Align = TextAnchor.UpperCenter, Color = HexToRustFormat("#FFFFFFFF")
                    }
                }
                , PARENT_UI_MODERATOR_MINI_PANEL, UI_MODERATION_CHECK_MENU_NETWORK);
                CuiHelper.AddUi(Moderator, container);
                UI_AlertSendPlayer(Suspect);
                SendChat(Moderator, String.Format(lang.GetMessage("STATUS_CHANGED", this, Moderator.UserIDString), Suspect.displayName, Reason));
                VKSendMessage(String.Format(lang.GetMessage("STATUS_CHANGED_VK", this), Suspect.displayName, Reason));
                DiscordSendMessage(String.Format(lang.GetMessage("STATUS_CHANGED_VK", this), Suspect.displayName, Reason));
            }
        }
        public Timer ModerTimeOutTimer;
        void Metods_ModeratorExitCheck(BasePlayer Moderator) {
            foreach (var ModeratorCritical in PlayerSaveCheck) if (ModeratorCritical.Value.ModeratorID == Moderator.userID) {
                IPlayer ModeratorOffline = covalence.Players.FindPlayerById(ModeratorCritical.Value.ModeratorID.ToString());
                IPlayer Suspect = covalence.Players.FindPlayerById(ModeratorCritical.Key.ToString());
                int TimeOutCount = 0;
                ModerTimeOutTimer = timer.Repeat(5, 10, () => {
                    if (ModeratorOffline.IsConnected) {
                        UI_MiniPanelModerator(Moderator, ModeratorCritical.Key);
                        SendChat(Moderator, lang.GetMessage("MODERATOR_RETURN_WELCOME", this, Moderator.UserIDString));
                        if (ModerTimeOutTimer != null) {
                            ModerTimeOutTimer.Destroy();
                            ModerTimeOutTimer = null;
                        }
                        return;
                    }
                    else {
                        TimeOutCount++;
                        if (TimeOutCount >= 10) {
                            PlayerSaveCheck.Remove(ModeratorCritical.Key);
                            foreach (var OnlineModeration in BasePlayer.activePlayerList) if (permission.UserHasPermission(OnlineModeration.UserIDString, PermissionModeration)) if (Suspect.IsConnected) {
                                BasePlayer SOnline = BasePlayer.FindByID(ulong.Parse(Suspect.Id));
                                CuiHelper.DestroyUi(SOnline, PARENT_UI_ALERT_SEND);
                                SendChat(SOnline, String.Format(lang.GetMessage("MODERATOR_DISCONNECTED_STOP_CHECK", this, Moderator.UserIDString), ModeratorOffline.Name));
                                SendChat(OnlineModeration, String.Format(lang.GetMessage("MODERATOR_DISCONNECTED_STOP_RESEND", this, Moderator.UserIDString), ModeratorOffline.Name, Suspect.Name));
                                VKSendMessage(String.Format(lang.GetMessage("MODERATOR_DISCONNECTED_STOP_RESEND", this), ModeratorOffline.Name, Suspect.Name));
                                DiscordSendMessage(String.Format(lang.GetMessage("MODERATOR_DISCONNECTED_STOP_RESEND", this), ModeratorOffline.Name, Suspect.Name));
                                if (ModerTimeOutTimer != null) {
                                    ModerTimeOutTimer.Destroy();
                                    ModerTimeOutTimer = null;
                                }
                            }
                            return;
                        }
                    }
                }
                );
            }
        }
        void Metods_ModeratorBanned(BasePlayer Moderator, ulong SuspectID, int i) {
            CuiHelper.DestroyUi(Moderator, PARENT_UI_MODERATOR_MINI_PANEL);
            IPlayer Suspect = covalence.Players.FindPlayerById(SuspectID.ToString());
            string Reason = config.ReasonBan[i].DisplayName;
            rust.RunClientCommand(Moderator, String.Format(config.ReasonBan[i].Command, SuspectID));
            PlayerSaveCheck.Remove(SuspectID);
            var ModeratorInfo = ModeratorInformation[Moderator.userID];
            ModeratorInfo.CheckCount++;
            if (!ModeratorInfo.CheckPlayerModerator.ContainsKey(Suspect.Name)) ModeratorInfo.CheckPlayerModerator.Add(Suspect.Name, Reason);
            if (!ModeratorInfo.BanPlayerModerator.ContainsKey(Suspect.Name)) ModeratorInfo.BanPlayerModerator.Add(Suspect.Name, Reason);
            foreach (BasePlayer player in BasePlayer.activePlayerList) {
                SendChat(player, $"<size=12>Модератор {Moderator.displayName} окончил проверку игрока {Suspect.Name}.Игрок был заблокирован.Причина: {Reason}.</size>");
            }
            SendChat(Moderator, String.Format(lang.GetMessage("MODERATOR_COMPLETED_CHECK", this, Moderator.UserIDString), Reason));
            VKSendMessage(String.Format(lang.GetMessage("MODERATOR_COMPLETED_CHECK_VK", this), Moderator.displayName, Moderator.UserIDString, Suspect.Name, SuspectID, Reason, AFKCheck[SuspectID]));
            DiscordSendMessage(String.Format(lang.GetMessage("MODERATOR_COMPLETED_CHECK_VK", this), Moderator.displayName, Moderator.UserIDString, Suspect.Name, SuspectID, Reason, AFKCheck[SuspectID]));
            SetBans(Moderator);
        }
#endregion
#region MetodsAFK
        void Metods_CheckStopInAFK(BasePlayer moderator, string ID) {
            IPlayer Suspect = covalence.Players.FindPlayerById(ID);
            if (Suspect.IsConnected) {
                BasePlayer SOnline = BasePlayer.FindByID(ulong.Parse(Suspect.Id));
                CuiHelper.DestroyUi(SOnline, PARENT_UI_ALERT_SEND);
            }
            CuiHelper.DestroyUi(moderator, PARENT_UI_MODERATOR_MINI_PANEL);
            PlayerSaveCheck.Remove(ulong.Parse(Suspect.Id));
            SendChat(moderator, lang.GetMessage("PLAYER_AFK_CHECK_STOP", this));
            VKSendMessage(String.Format(lang.GetMessage("PLAYER_AFK_CHECK_STOP_VK", this), moderator.displayName, moderator.userID, Suspect.Name));
            DiscordSendMessage(String.Format(lang.GetMessage("PLAYER_AFK_CHECK_STOP_VK", this), moderator.displayName, moderator.userID, Suspect.Name));
        }
        public Dictionary<ulong, int> AFKCheck = new Dictionary<ulong, int>();
        void Metods_AFK(ulong SuspectID, BasePlayer moderator) {
            IPlayer Suspect = covalence.Players.FindPlayerById(SuspectID.ToString());
            if (!AFKCheck.ContainsKey(SuspectID)) AFKCheck.Add(SuspectID, 0);
            else AFKCheck[SuspectID] = 0;
            int tryAFK = 0;
            SavePositionAFK(Suspect, moderator, tryAFK);
            timer.Repeat(5f, 6, () => {
                SavePositionAFK(Suspect, moderator, tryAFK);
                tryAFK++;
            }
            );
        }
        readonly Hash<string, GenericPosition> lastPosition = new Hash<string, GenericPosition>();
        void SavePositionAFK(IPlayer Suspect, BasePlayer moderator, int num) {
            var pPosition = Suspect.Position();
            if (!lastPosition.ContainsKey(Suspect.Id)) lastPosition.Add(Suspect.Id, pPosition);
            else {
                if (lastPosition[Suspect.Id] != pPosition) SendChat(moderator, String.Format(lang.GetMessage("PLAYER_AFK_CHANGE_POS", this, moderator.UserIDString), num));
                else {
                    SendChat(moderator, String.Format(lang.GetMessage("PLAYER_AFK_CHANGE_NO_POS", this, moderator.UserIDString), num));
                    AFKCheck[ulong.Parse(Suspect.Id)] += 1;
                }
                lastPosition[Suspect.Id] = pPosition;
            }
            if (num >= 5) {
                if (AFKCheck[ulong.Parse(Suspect.Id)] >= 3) Metods_CheckStopInAFK(moderator, Suspect.Id);
                else {
                    BasePlayer SuspectOnline = BasePlayer.FindByID(ulong.Parse(Suspect.Id));
                    UI_AlertSendPlayer(SuspectOnline);
                    foreach(BasePlayer player in BasePlayer.activePlayerList) {
                        SendChat(player, $"<size=12>Модератор {moderator.displayName} вызвал игрока {Suspect.Name} на проверку.</size>");
                    }
                    PlayerSaveCheck = new Dictionary<ulong, PlayerSaveCheckClass> {
                        [SuspectOnline.userID]
                        = new PlayerSaveCheckClass {
                            Discord = lang.GetMessage("DISCORD_NULL", this), NickName = SuspectOnline.displayName, StatusNetwork = lang.GetMessage("NETWORD_STATUS_ONLINE", this, SuspectOnline.UserIDString), ModeratorID = moderator.userID,
                        }
                    }
                    ;
                    UI_MiniPanelModerator(moderator, SuspectOnline.userID);
                    SendChat(moderator, lang.GetMessage("PLAYER_NON_AFK", this, moderator.UserIDString));
                    if (config.RCCSetting.RCCUse) {
                        string Key = config.RCCSetting.Key;
                        if (String.IsNullOrEmpty(Key)) return;
                        try {
                            string API = $"https://rustcheatcheck.ru/panel/api?action=addPlayer&key={Key}&player={Suspect.Id}";
                            webrequest.EnqueueGet(API, (code, response) => {
                            }
                            , this);
                        }
                        catch {
                        }
                    }
                }
            }
        }
#endregion
#endregion
#region Command
#region UseCommand
        [ChatCommand("report")]
        void ReportChatCommand(BasePlayer player, string command, string[] args) {
            if (player == null) return;
            if (args == null || args.Length == 0) {
                UI_Interface(player);
                return;
            }
        }
        [ConsoleCommand("report.list")]
        void ReportList(ConsoleSystem.Arg arg) {
            PrintError(lang.GetMessage("REPORT_LIST_CONSOLE", this));
            foreach (var List in BasePlayer.activePlayerList) if (ReportInformation[List.userID].ReportCount >= config.Setting.MaxReport) PrintError($"{List.displayName} : {ReportInformation[List.userID].ReportCount}");
        }
        [ChatCommand("discord")]
        void SendDiscord(BasePlayer Suspect, string command, string[] args) {
            if (!PlayerSaveCheck.ContainsKey(Suspect.userID)) {
                SendChat(Suspect, lang.GetMessage("MSG_CHECK_DISCORD", this, Suspect.UserIDString));
                return;
            }
            string Discord = "";
            foreach (var arg in args) Discord += " " + arg;
            PlayerSaveCheck[Suspect.userID].Discord = Discord;
            SendChat(Suspect, String.Format(lang.GetMessage("MSG_DISCORD_SEND", this, Suspect.UserIDString), Discord));
            VKSendMessage(String.Format(lang.GetMessage("DISCROD_VK_SEND", this), Suspect.displayName, Suspect.userID, Discord));
            DiscordSendMessage(String.Format(lang.GetMessage("DISCROD_VK_SEND", this), Suspect.displayName, Suspect.userID, Discord));
            BasePlayer Moderator = BasePlayer.FindByID(PlayerSaveCheck[Suspect.userID].ModeratorID);
            CuiHelper.DestroyUi(Moderator, UI_MODERATION_CHECK_MENU_DISCORD);
            CuiElementContainer container = new CuiElementContainer();
            container.Add(new CuiLabel {
                RectTransform = {
                    AnchorMin = "0.01159436 0.5478261", AnchorMax = "0.7072465 0.7333333"
                }
                , Text = {
                    Text = $"Discord : {PlayerSaveCheck[Suspect.userID].Discord}", FontSize = 12, Font = "robotocondensed-regular.ttf", Align = TextAnchor.UpperCenter, Color = HexToRustFormat("#FFFFFFFF")
                }
            }
            , PARENT_UI_MODERATOR_MINI_PANEL, UI_MODERATION_CHECK_MENU_DISCORD);
            CuiHelper.AddUi(Moderator, container);
        }
        [ConsoleCommand("call")]
        void CallAdminCheck(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            if (!player.IsAdmin()) return;
            ulong SuspectID = ulong.Parse(arg.Args[0]);
            if (player == null) {
                PrintWarning("Вы должны быть на сервере");
                SendChat(player, "Вы должны быть на сервере");
                return;
            }
            BasePlayer Suspect = BasePlayer.FindByID(SuspectID);
            if (Suspect == null) {
                PrintWarning("Игрока нет");
                SendChat(player, "Игрока нет");
                return;
            }
            Metods_CheckModeration(Suspect, player);
            Puts("Вы вызвали игрока на проверку");
            SendChat(player, "Вы вызвали игрока на проверку");
        }
        [ConsoleCommand("report")]
        void ReportCommand(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            if (arg == null || arg.Args == null || arg.Args.Length == 0) {
                if (player == null) return;
                UI_Interface(player);
                return;
            }
            switch (arg.Args[0].ToLower()) {
                case "give" : {
                    if (arg.Args.Length != 3) {
                        PrintWarning("Используйте правильный синтаксис : report give SteamID Amount");
                        return;
                    }
                    if (string.IsNullOrEmpty(arg.Args[1])) {
                        PrintWarning("Укажите корректный Steam64ID");
                        return;
                    }
                    if (!BasePlayer.FindByID(Convert.ToUInt64(arg.Args[1])) && !BasePlayer.FindSleeping(Convert.ToUInt64(arg.Args[1]))) {
                        PrintWarning("Укажите корректный Steam64ID");
                        return;
                    }
                    if (string.IsNullOrEmpty(arg.Args[2])) {
                        PrintWarning("Укажите корректное количество");
                        return;
                    }
                    ReportInformation[ulong.Parse(arg.Args[1])].ReportCount += Convert.ToInt32(arg.Args[2]);
                    if (player != null) {
                        VKSendMessage(String.Format(lang.GetMessage("CONSOLE_REPORT_GIVE", this), arg.Args[1], arg.Args[2], ReportInformation[ulong.Parse(arg.Args[1])].ReportCount));
                        DiscordSendMessage(String.Format(lang.GetMessage("CONSOLE_REPORT_GIVE", this), arg.Args[1], arg.Args[2], ReportInformation[ulong.Parse(arg.Args[1])].ReportCount));
                    }
                    PrintWarning("ACCESS");
                    return;
                }
                case "remove" : {
                    if (arg.Args.Length != 3) {
                        PrintWarning("Используйте правильный синтаксис : report remove SteamID Amount");
                        return;
                    }
                    if (string.IsNullOrEmpty(arg.Args[1])) {
                        PrintWarning("Укажите корректный Steam64ID");
                        return;
                    }
                    if (!BasePlayer.FindByID(Convert.ToUInt64(arg.Args[1])) && !BasePlayer.FindSleeping(Convert.ToUInt64(arg.Args[1]))) {
                        PrintWarning("Укажите корректный Steam64ID");
                        return;
                    }
                    if (string.IsNullOrEmpty(arg.Args[2])) {
                        PrintWarning("Укажите корректное количество");
                        return;
                    }
                    ReportInformation[ulong.Parse(arg.Args[1])].ReportCount -= Convert.ToInt32(arg.Args[2]);
                    if (player != null) {
                        VKSendMessage(String.Format(lang.GetMessage("CONSOLE_REPORT_REMOVE", this), arg.Args[1], arg.Args[2], ReportInformation[ulong.Parse(arg.Args[1])].ReportCount));
                    }
                    PrintWarning("ACCESS");
                    return;
                }
            }
        }
#endregion
#region FuncCommand
        [ConsoleCommand("iqreport")]
        void IQReportSystemCommands(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            string Key = arg.Args[0].ToLower();
            switch (Key) {
                case "page" : {
                    string PageAction = arg.Args[1];
                    bool Moderation = Convert.ToBoolean(arg.Args[2]);
                    int Page = Convert.ToInt32(arg.Args[3]);
                    switch (PageAction) {
                        case "next" : {
                            UI_Player_Loaded(player, Moderation, Page + 1);
                            break;
                        }
                        case "back" : {
                            UI_Player_Loaded(player, Moderation, Page - 1);
                            break;
                        }
                    }
                    break;
                }
                ;
                case "moderation_menu" : {
                    UI_PanelReportsPlayer(player, true);
                    break;
                }
                ;
                case "reports_menu" : {
                    ulong SuspectID = ulong.Parse(arg.Args[1]);
                    BasePlayer Suspect = BasePlayer.FindByID(SuspectID);
                    UI_SendReport(player, Suspect);
                    break;
                }
                case "moderation_send" : {
                    ulong SuspectID = ulong.Parse(arg.Args[1]);
                    BasePlayer Suspect = BasePlayer.FindByID(SuspectID);
                    UI_ModerReport(player, Suspect);
                    break;
                }
                case "send_report" : {
                    ulong SuspectID = ulong.Parse(arg.Args[1]);
                    int IndexReason = Convert.ToInt32(arg.Args[2]);
                    string ReasonReport = config.ReasonReport[IndexReason];
                    if (player == null) return;
                    CuiHelper.DestroyUi(player, PARENT_UI);
                    if (Metods_GetCooldown(player.userID) == true) {
                        SendChat(player, String.Format(lang.GetMessage("MSG_COOLDOWN", this, player.UserIDString), FormatTime(TimeSpan.FromSeconds(Math.Max(0, CooldownPC[player.userID] - CurrentTime())))));
                        return;
                    }
                    BasePlayer Suspect = BasePlayer.FindByID(SuspectID);
                    Metods_Report(Suspect, IndexReason);
                    Metods_GiveCooldown(player.userID, config.Setting.CooldownTime);
                    SendChat(player, String.Format(lang.GetMessage("MSG_REPORTED_SUSPECT", this, player.UserIDString), Suspect.displayName, ReasonReport));
                    VKSendMessage(String.Format(lang.GetMessage("METODS_SEND_REPORT_VK", this), Suspect.displayName, Suspect.UserIDString, ReasonReport, player.displayName, player.userID));
                    DiscordSendMessage(String.Format(lang.GetMessage("METODS_SEND_REPORT_VK", this), Suspect.displayName, Suspect.UserIDString, ReasonReport, player.displayName, player.userID));
                    break;
                }
                case "search" : {
                    if (arg.Args.Length != 4) return;
                    bool Moderation = Convert.ToBoolean(arg.Args[1]);
                    int Page = Convert.ToInt32(arg.Args[2]);
                    string SearchSay = arg.Args[3];
                    UI_Player_Loaded(player, Moderation, Page, SearchSay);
                    break;
                }
                case "send_check" : {
                    if (player == null) return;
                    ulong SuspectID = ulong.Parse(arg.Args[1]);
                    BasePlayer Suspect = BasePlayer.FindByID(SuspectID);
                    if (permission.UserHasPermission(player.UserIDString, PermissionModeration)) Metods_CheckModeration(Suspect, player);
                    break;
                }
                case "moderator_reason_ban" : {
                    if (player == null) return;
                    ulong SuspectID = ulong.Parse(arg.Args[1]);
                    BasePlayer Suspect = BasePlayer.FindByID(SuspectID);
                    if (permission.UserHasPermission(player.UserIDString, PermissionModeration)) UI_OpenReasonsBan(player, SuspectID);
                    break;
                }
                case "moderator_ban" : {
                    if (player == null) return;
                    ulong SuspectID = ulong.Parse(arg.Args[1]);
                    BasePlayer Suspect = BasePlayer.FindByID(SuspectID);
                    int Index = Convert.ToInt32(arg.Args[2]);
                    Metods_ModeratorBanned(player, SuspectID, Index);
                    break;
                }
                case "moderator_stop" : {
                    if (player == null) return;
                    ulong SuspectID = ulong.Parse(arg.Args[1]);
                    BasePlayer Suspect = BasePlayer.FindByID(SuspectID);
                    if (permission.UserHasPermission(player.UserIDString, PermissionModeration)) Metods_CheckModerationFinish(player, SuspectID);
                    UI_RaitingSend(Suspect, player);
                    return;
                }
                case "raiting" : {
                    BasePlayer Moderator = BasePlayer.FindByID(ulong.Parse(arg.Args[1]));
                    int Raiting = Convert.ToInt32(arg.Args[2]);
                    var RaitingModerator = ModeratorInformation[Moderator.userID].Arrayrating;
                    VKSendMessage(String.Format(lang.GetMessage("UI_RAITING_MODERATION_VK_GIVE", this), player.displayName, player.UserIDString, Moderator.displayName, Moderator.UserIDString, Raiting));
                    DiscordSendMessage(String.Format(lang.GetMessage("UI_RAITING_MODERATION_VK_GIVE", this), player.displayName, player.UserIDString, Moderator.displayName, Moderator.UserIDString, Raiting));
                    SendChat(player, lang.GetMessage("UI_RAITING_MODERATION_VK_GIVE_THX", this, player.UserIDString));
                    RaitingModerator.Add(Raiting);
                    if (Raiting <= 2) {
                        RemoveScore(Moderator.userID, config.RaitingSetting.RemoveAmountOneTwo);
                        SendChat(Moderator, String.Format(lang.GetMessage("UI_RAIT_ALERT_MODER", this, Moderator.UserIDString), Raiting, $"-{config.RaitingSetting.RemoveAmountOneTwo}"));
                        return;
                    }
                    if (Raiting > 2 && Raiting < 5) {
                        SetScore(Moderator.userID, config.RaitingSetting.GiveAmountThreeFour);
                        SendChat(Moderator, String.Format(lang.GetMessage("UI_RAIT_ALERT_MODER", this, Moderator.UserIDString), Raiting, $"{config.RaitingSetting.GiveAmountThreeFour}"));
                        return;
                    }
                    if (Raiting >= 5) {
                        SetScore(Moderator.userID, config.RaitingSetting.GiveAmountFive);
                        SendChat(Moderator, String.Format(lang.GetMessage("UI_RAIT_ALERT_MODER", this, Moderator.UserIDString), Raiting, $"{config.RaitingSetting.GiveAmountFive}"));
                        return;
                    }
                    break;
                }
            }
        }
#endregion
        public float GetAverageRaiting(ulong userID) {
            var Data = ModeratorInformation[userID];
            float AverageRaiting = Data.AverageRating;
            int RaitingFull = 0;
            for (in
// ... [Code preview truncated due to length. Full source in attached file] ...

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

Другие ресурсы пользователя 15FPS

Сверху