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

FREE IQReportSystem : 3.0.1 3.0.1

Нет прав для скачивания
C#:
using System.Collections.Generic;
using System.Linq;
using Oxide.Core;
using Oxide.Core.Plugins;
using UnityEngine.UI;
using System;
using Net = Network.Net;
using Object = System.Object;
using Network;
using Facepunch.Utility;
using Newtonsoft.Json;
using UnityEngine;
using Oxide.Game.Rust.Cui;
using Time = UnityEngine.Time;
using UnityEngine.Networking;
using Newtonsoft.Json.Linq;
using System.Collections;
using ConVar;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Libraries;
using System.Text.RegularExpressions;
using System.Text;
namespace Oxide.Plugins {
    [Info("IQReportSystem", "SMOKEPLUGINS", "3.0.1")]
    [Description("One love IQReportSystem")]
    internal class IQReportSystem : RustPlugin {
        private List<String> GetTeamsNames(BasePlayer Target) {
            List<String> TeamsName = new List<String>();
            if (Target.Team == null) return TeamsName;
            foreach (UInt64 teamMember in Target.Team.members) {
                IPlayer TeamPlayer = covalence.Players.FindPlayerById(teamMember.ToString());
                TeamsName.Add(TeamPlayer.Name);
            }
            return TeamsName;
        }
        object OnItemCraft(ItemCraftTask task, BasePlayer player, Item item) {
            if (!PlayerChecks.ContainsKey(player.userID)) return null;
            if (config.CheckControllerSettings.TrackCrafting) {
                BasePlayer Moderator = BasePlayer.FindByID(PlayerChecks[player.userID].ModeratorID);
                if (Moderator != null) SendChat(GetLang("FUNCIONAL_MESSAGE_CHECK_AFK_PLAYER_START_CRAFTING", Moderator.UserIDString), Moderator);
            }
            player.ResetInputIdleTime();
            return null;
        }
        private void StopDamageRemove(UInt64 playerID) {
            if (StopDamageMan == null) return;
            if (!config.ReferenceSettings.StopDamageManSetting.UseStopDamage) return;
            StopDamageMan.CallHook("RemovePlayerSDM", playerID);
        }
        private void DrawUI_HeaderUI_Search(BasePlayer player, Boolean IsModerator = false) {
            String Interface = InterfaceBuilder.GetInterface($"{InterfaceBuilder.UI_LAYER}_SEARCH_HEADER");
            if (Interface == null) return;
            Interface = Interface.Replace("%ISMODERATOR%", $"{IsModerator}");
            Interface = Interface.Replace("%TITLE_PLAYER_HEADER_TITLE_SEARCH_PLAYER%", GetLang("TITLE_PLAYER_HEADER_TITLE_SEARCH_PLAYER", player.UserIDString));
            CuiHelper.DestroyUi(player, "InputPanelSearch" + ".Input");
            CuiHelper.AddUi(player, Interface);
        }
        private class PlayerRepository {
            public Double Cooldown;
            public Int32 GetCooldownLeft(UInt64 TargetID) {
                if (config.ReportSendControllerSettings.CooldownRepeatOrAll) {
                    if (IsReportedPlayer(TargetID)) return Convert.ToInt32(ReportedList[TargetID] - CurrentTime);
                }
                else return Convert.ToInt32(Cooldown - CurrentTime);
                return 0;
            }
            public void AddCooldown(UInt64 TargetID) {
                Int32 TimeCooldown = Convert.ToInt32(config.ReportSendControllerSettings.CooldownReport + CurrentTime);
                if (config.ReportSendControllerSettings.CooldownRepeatOrAll || config.ReportSendControllerSettings.NoRepeatReport) {
                    if (IsReportedPlayer(TargetID)) ReportedList[TargetID] = TimeCooldown;
                    else ReportedList.Add(TargetID, TimeCooldown);
                }
                else Cooldown = TimeCooldown;
            }
            public Boolean IsRepeatReported(UInt64 TargetID) => config.ReportSendControllerSettings.NoRepeatReport && IsReportedPlayer(TargetID);
            public Dictionary<UInt64, Double> ReportedList = new Dictionary<UInt64, Double>();
            public Boolean IsCooldown(UInt64 TargetID) {
                if (config.ReportSendControllerSettings.CooldownRepeatOrAll) {
                    if (IsReportedPlayer(TargetID)) return ReportedList[TargetID] > CurrentTime;
                }
                else return Cooldown > CurrentTime;
                return false;
            }
            private Boolean IsReportedPlayer(UInt64 TargetID) => ReportedList.ContainsKey(TargetID);
        }
        public Boolean IsDuel(UInt64 userID) {
            if (!config.ReferenceSettings.NoCheckedDuel) return false;
            if (EventHelper) {
                if ((Boolean)EventHelper.CallHook("EMAtEvent", userID)) return true;
            }
            if (Battles) return (Boolean)Battles?.Call("IsPlayerOnBattle", userID);
            if (Duel) return (Boolean)Duel?.Call("IsPlayerOnActiveDuel", BasePlayer.FindByID(userID));
            if (Duelist) return (Boolean)Duelist?.Call("inEvent", BasePlayer.FindByID(userID));
            if (ArenaTournament) return ArenaTournament.Call<Boolean>("IsOnTournament", userID);
            return false;
        }
        private Boolean IsSteam(String id) {
            if (MultiFighting == null) return true;
            BasePlayer player = BasePlayer.Find(id);
            if (player == null) return false;
            Object obj = MultiFighting.CallHook("IsSteam", player.Connection);
            if (obj is Boolean) return (Boolean)obj;
            return false;
        }
        private Authors GetAuthorDiscord(Configuration.NotifyDiscord.Webhooks.TemplatesNotify templatesNotify) => new Authors(templatesNotify.AuthorName, null, templatesNotify.IconURL, null);
        private String GetClanTag(String userID) {
            if (Clans) return (String)Clans.Call("GetClanOf", userID);
            else return null;
        }
        private void WriteData() {
            Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQSystem/IQReportSystem/PlayerInformations", PlayerInformations);
            Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQSystem/IQReportSystem/ModeratorInformations", ModeratorInformations);
        }
        private String VKT_StartCheck(BasePlayer Target, BasePlayer Moderator, Boolean IsConsole = false) {
            String ModeratorName = !IsConsole && Moderator != null ? Moderator.displayName : "Console";
            String ModeratorID = !IsConsole && Moderator != null ? Moderator.UserIDString : "Console";
            String Message = LanguageEn ? $"▣ PLAYER CHECK HAS STARTED ▣\nInformation about the moderator:\n• Nickname: {ModeratorName}\n• Steam64ID: {ModeratorID} (https://steamcommunity.com/profiles/{ModeratorID})\nInformation about the suspect:\n• Nickname: {Target.displayName}\n• Steam64ID: {Target.userID} (https://steamcommunity.com/profiles/{Target.userID})" : $"▣ ЗАПУЩЕНА ПРОВЕРКА ИГРОКА ▣\nИнформация о модераторе :\n• Ник : {ModeratorName}\n• Steam64ID : {ModeratorID} (https://steamcommunity.com/profiles/{ModeratorID})\nИнформация о подозреваемом :\n• Ник : {Target.displayName}\n• Steam64ID : {Target.userID} (https://steamcommunity.com/profiles/{Target.userID})";
            return Message;
        }
        protected override void LoadConfig() {
            base.LoadConfig();
            try {
                config = Config.ReadObject<Configuration>();
                if (config == null) LoadDefaultConfig();
                if (config.NotifyVKSettings.VKTokenGroup == null) config.NotifyVKSettings.VKTokenGroup = "";
                if (config.NotifyVKSettings.VKChatID == null) config.NotifyVKSettings.VKChatID = "";
            }
            catch {
                PrintWarning(LanguageEn ? $"Error #58 reading configuration'oxide/config/{Name}', create a new configuration!" : $"Ошибка #58 чтения конфигурации 'oxide/config/{Name}', создаём новую конфигурацию!!");
                LoadDefaultConfig();
            }
            NextTick(SaveConfig);
        }
        private void Unload() {
            WriteData();
            InterfaceBuilder.DestroyAll();
            ImageUi.Unload();
            if (config.CheckControllerSettings.UseSoundAlert) {
                if (RoutineSounds != null && RoutineSounds.Count != 0) {
                    foreach (KeyValuePair<BasePlayer, Coroutine> routineSound in RoutineSounds.Where(x => x.Value != null)) ServerMgr.Instance.StopCoroutine(routineSound.Value);
                }
                SpeakerEntityMgr.Shutdown();
            }
            if (AfkCheckRoutine != null && AfkCheckRoutine.Count != 0) {
                foreach (KeyValuePair<BasePlayer, Coroutine> coroutineList in AfkCheckRoutine.Where(x => x.Value != null)) ServerMgr.Instance.StopCoroutine(coroutineList.Value);
                AfkCheckRoutine.Clear();
                AfkCheckRoutine = null;
            }
            if (PlayerRepositories != null && PlayerRepositories.Count != 0) {
                PlayerRepositories.Clear();
                PlayerRepositories = null;
            }
            if (TimerWaitChecked != null && TimerWaitChecked.Count != 0) {
                foreach (Timer timer in TimerWaitChecked.Values.Where(t => !t.Destroyed)) timer.Destroy();
                TimerWaitChecked.Clear();
                TimerWaitChecked = null;
            }
            if (config.CheckControllerSettings.StopCheckLeavePlayer) {
                if (TimerWaitPlayer != null && TimerWaitPlayer.Count != 0) {
                    foreach (Timer timer in TimerWaitPlayer.Values.Where(t => !t.Destroyed)) timer.Destroy();
                    TimerWaitPlayer.Clear();
                    TimerWaitPlayer = null;
                }
            }
            _interface = null;
            _ = null;
        }
        private static IQReportSystem _;
        private void DrawUI_Report_Panel(BasePlayer player) {
            String Interface = InterfaceBuilder.GetInterface($"{InterfaceBuilder.UI_LAYER}_BACKGORUND");
            if (Interface == null) return;
            Interface = Interface.Replace("%TITLE_PLAYER_HEADER_TITLE_SEND_REPORT%", GetLang("TITLE_PLAYER_HEADER_TITLE_SEND_REPORT", player.UserIDString));
            Interface = Interface.Replace("%TITLE_PLAYER_HEADER_TITLE_DESC_SEND_REPORT%", GetLang("TITLE_PLAYER_HEADER_TITLE_DESC_SEND_REPORT", player.UserIDString));
            Interface = Interface.Replace("%TITLE_PROFILE_INFO_CHECKED%", GetLang("TITLE_PROFILE_INFO_CHECKED", player.UserIDString, PlayerInformations[player.userID].AmountChecked));
            Interface = Interface.Replace("%NICK_PROFILE%", player.displayName.Length > 7 ? player.displayName.Substring(0, 7).ToUpper() + ".." : player.displayName.ToUpper());
            Interface = Interface.Replace("%AVATAR_PLAYER%", _.GetImage(player.UserIDString));
            Interface = Interface.Replace("%TITLE_NAME_REPORT_SYSTEM%", GetLang("TITLE_NAME_REPORT_SYSTEM", player.UserIDString));
            Interface = Interface.Replace("%TITLE_CLOSE_BUTTON_REPORT%", GetLang("TITLE_CLOSE_BUTTON_REPORT", player.UserIDString));
            CuiHelper.DestroyUi(player, InterfaceBuilder.UI_REPORT_PANEL);
            CuiHelper.AddUi(player, Interface);
            DrawUI_PlayerPanel(player);
            DrawUI_LeftMenu(player);
            DrawUI_HeaderUI_Search(player);
            if (IsModerator(player)) DrawUI_ModeratorStatistics(player);
        }
        private void AlertMaxReportDiscord(String PlayerName, Int32 ReportCount, UInt64 TargetID) {
            Configuration.NotifyDiscord.Webhooks.TemplatesNotify TemplateDiscord = config.NotifyDiscordSettings.WebhooksList.NotifyMaxReport;
            if (!String.IsNullOrWhiteSpace(TemplateDiscord.WebhookNotify)) {
                List<Fields> fields = DT_PlayerMaxReport(PlayerName, ReportCount, TargetID);
                SendDiscord(TemplateDiscord.WebhookNotify, fields, GetAuthorDiscord(TemplateDiscord), TemplateDiscord.Color);
            }
            SendVK(VKT_PlayerMaxReport(PlayerName, ReportCount, TargetID));
        }
        private void OnPlayerDisconnected(BasePlayer player, String reason) {
            CheckStatusPlayer(player, reason);
            if (IsModerator(player)) CheckStatusModerator(player, reason);
        }
        private void BanPlayerRCC(UInt64 TargetID, String ReasonBan) {
            if (String.IsNullOrWhiteSpace(config.ReferenceSettings.RCCSettings.RCCKey)) return;
            String API = $"https://rustcheatcheck.ru/panel/api?action=addBan&key={config.ReferenceSettings.RCCSettings.RCCKey}&player={TargetID}&reason={ReasonBan}";
            try {
                webrequest.Enqueue(API, null, (code, response) => {
                }
                , this);
            }
            catch (Exception e) {
                PrintError(LanguageEn ? "RCC : We were unable to block the player using RCC, please check if your key is up to date or if RCC is available" : "RCC : Мы не смогли заблокировать игрока с помощью RCC, проверьте актуальность вашего ключа или доступность RCC");
            }
        }
        private void DrawUI_PageController(BasePlayer player, Int32 Page, Boolean IsModerator, String SearchName = "") {
            List<FakePlayer> fakePlayers = null;
            List<BasePlayer> playerList = null;
            Int32 AllCountPlayers = 0;
            Int32 MaxPlayerPage = IsModerator ? 7 : 27;
            if (IsModerator)  //x.userID != player.userID &&
            {
                List<BasePlayer> moderatorSortedList = BasePlayer.activePlayerList.Where(x => !permission.UserHasPermission(x.UserIDString, HideMenuPermissions) && !PlayerChecks.ContainsKey(x.userID) && PlayerInformations[x.userID].Reports >= config.ReportContollerModerationSettings.ReportCountTrigger && x.displayName.ToLower().Contains(SearchName.ToLower())).OrderByDescending(x => PlayerInformations[x.userID].Reports).ToList();
                playerList = moderatorSortedList.Skip(Page * MaxPlayerPage).Take(MaxPlayerPage).ToList();
                AllCountPlayers = moderatorSortedList.Count;
            }
            else {
                if (IQFakeActive && config.ReferenceSettings.IQFakeActiveUse) {
                    List<FakePlayer> fakePlayersSorted = PlayerBases.Where(x => x.UserID != player.userID && !permission.UserHasPermission(x.UserID.ToString(), HideMenuPermissions) && x.DisplayName.ToLower().Contains(SearchName.ToLower())).ToList();
                    fakePlayers = fakePlayersSorted.Skip(Page * MaxPlayerPage).Take(MaxPlayerPage).ToList();
                    AllCountPlayers = fakePlayersSorted.Count;
                }
                else  //x.userID != player.userID &&
                {
                    List<BasePlayer> sortedPlayers = BasePlayer.activePlayerList.Where(x => !permission.UserHasPermission(x.UserIDString, HideMenuPermissions) && x.displayName.ToLower().Contains(SearchName.ToLower()) && (!IsFriendSendReport(player.userID, x.userID) || !IsClansSendReport(player.UserIDString, x.UserIDString))).ToList();
                    playerList = sortedPlayers.Skip(Page * MaxPlayerPage).Take(MaxPlayerPage).ToList();
                    AllCountPlayers = sortedPlayers.Count;
                }
            }
            String Interface = InterfaceBuilder.GetInterface($"{InterfaceBuilder.UI_LAYER}_PANEL_PLAYERS_PAGE_CONTROLLER");
            if (Interface == null) return;
            Interface = Interface.Replace("%AMOUNT_PAGE%", $"{Page}");
            Interface = Interface.Replace("%COMMAND_PAGE_NEXT%", AllCountPlayers < MaxPlayerPage ? "" : $"report.panel page.controller {(AllCountPlayers >= (Page + 1) * MaxPlayerPage ? (Page + 1) : 0)} {IsModerator}");
            Interface = Interface.Replace("%COMMAND_PAGE_BACK%", AllCountPlayers < MaxPlayerPage ? "" : $"report.panel page.controller {(Page <= 0 ? AllCountPlayers / MaxPlayerPage : Page - 1)} {IsModerator}");
            CuiHelper.DestroyUi(player, "ActionPageCount");
            CuiHelper.DestroyUi(player, "ButtonNextPage");
            CuiHelper.DestroyUi(player, "ButtonBackPage");
            CuiHelper.AddUi(player, Interface);
            ShowPlayersList(player, playerList, fakePlayers, IsModerator);
        }
        [ConsoleCommand("iqrs")]
        private void ConsoleCommandReport(ConsoleSystem.Arg arg)  ///iqrs call SteamID
        {
            if (!arg.HasArgs(1)) return;
            String Actions = arg.Args[0];
            BasePlayer player = arg.Player();
            if (player != null) if (!IsModerator(player)) return;
            Boolean IsConsole = player == null;
            BasePlayer Target = null;
            UInt64 UserIDPlayer = 0;
            if (!Actions.Contains("report")) {
                if (!arg.HasArgs(2)) return;
                String NameOrID = arg.Args[1];
                UserIDPlayer = Convert.ToUInt64(NameOrID.IsSteamId() ? NameOrID : covalence.Players.FindPlayer(NameOrID)?.Id);
                Target = BasePlayer.Find(NameOrID);
                if (Target == null) {
                    if (!Actions.Contains("dismiss")) {
                        if (player != null) player.ConsoleMessage(LanguageEn ? "The player is not on the server or you have entered incorrect data" : "Игрока нет на сервере или вы указали неверные данные");
                        else Puts(LanguageEn ? "The player is not on the server or you have entered incorrect data" : "Игрока нет на сервере или вы указали неверные данные");
                        return;
                    }
                }
            }
            switch (Actions) {
                case "give" : {
                    if (!arg.HasArgs(3)) return;
                    if (!IsConsole && !player.IsAdmin) return;
                    Int32 AmountGive;
                    if (!Int32.TryParse(arg.Args[2], out AmountGive)) {
                        PrintWarning(LanguageEn ? "You have entered a letter as quantity! Only numbers are supported" : "Вы ввели в качестве количества буквы! Поддерживаются только цифры");
                        return;
                    }
                    if (AmountGive <= 0) {
                        PrintWarning(LanguageEn ? "Value cannot be less than or equal to zero." : "Значение не может быть меньше или равно нулю");
                        return;
                    }
                    if (!PlayerInformations.ContainsKey(UserIDPlayer)) {
                        PrintWarning(LanguageEn ? "The player is not in the complaint system database" : "Игрока нет в базе данных системы жалоб");
                        return;
                    }
                    PlayerInformations[UserIDPlayer].Reports += AmountGive;
                    Puts(LanguageEn ? $"Player {UserIDPlayer} has been successfully awarded {AmountGive} reports. Total amount: {PlayerInformations[UserIDPlayer].Reports}" : $"Игроку {UserIDPlayer} успешно было начислено {AmountGive} репортов. Общее количество {PlayerInformations[UserIDPlayer].Reports}");
                    break;
                }
                case "remove" : {
                    if (!arg.HasArgs(3)) return;
                    if (!IsConsole && !player.IsAdmin) return;
                    Int32 AmountRemove;
                    if (!Int32.TryParse(arg.Args[2], out AmountRemove)) {
                        PrintWarning(LanguageEn ? "You have entered a letter as quantity! Only numbers are supported" : "Вы ввели в качестве количества буквы! Поддерживаются только цифры");
                        return;
                    }
                    if (AmountRemove <= 0) {
                        PrintWarning(LanguageEn ? "Value cannot be less than or equal to zero." : "Значение не может быть меньше или равно нулю");
                        return;
                    }
                    if (!PlayerInformations.ContainsKey(UserIDPlayer)) {
                        PrintWarning(LanguageEn ? "The player is not in the complaint system database" : "Игрока нет в базе данных системы жалоб");
                        return;
                    }
                    PlayerInformations[UserIDPlayer].Reports -= PlayerInformations[UserIDPlayer].Reports <= AmountRemove ? PlayerInformations[UserIDPlayer].Reports : AmountRemove;
                    Puts(LanguageEn ? $"Player {UserIDPlayer} has been successfully remove {AmountRemove} reports. Total amount: {PlayerInformations[UserIDPlayer].Reports}" : $"Игроку {UserIDPlayer} успешно было удалено {AmountRemove} репортов. Общее количество {PlayerInformations[UserIDPlayer].Reports}");
                    break;
                }
                case "call" : {
                    if (!IsConsole && (!player.IsAdmin || !IsModerator(player))) return;
                    if (AfkCheckRoutine.ContainsKey(Target)) {
                        if (AfkCheckRoutine[Target] != null) {
                            ServerMgr.Instance.StopCoroutine(AfkCheckRoutine[Target]);
                            AfkCheckRoutine[Target] = null;
                            if(PlayerChecks.ContainsKey(Target.userID)) PlayerChecks.Remove(Target.userID);
                        }
                    }
                    Coroutine routineAFK = ServerMgr.Instance.StartCoroutine(StartAfkCheck(Target, player, IsConsole, !config.CheckControllerSettings.UseCheckAFK));
                    if (!AfkCheckRoutine.ContainsKey(Target)) AfkCheckRoutine.Add(Target, routineAFK);
                    else AfkCheckRoutine[Target] = routineAFK;
                    break;
                }
                case "dismiss" : {
                    if (!IsConsole && (!player.IsAdmin || !IsModerator(player))) return;
                    StopCheckedPlayer(UserIDPlayer, player, IsConsole : IsConsole);
                    break;
                }
                case "report.list" : case "reports" : {
                    if (!IsConsole && !player.IsAdmin) return;
                    IOrderedEnumerable<BasePlayer> moderatorSortedList = BasePlayer.activePlayerList .Where(x => PlayerInformations[x.userID].Reports >= config.ReportContollerModerationSettings.ReportCountTrigger) .OrderByDescending(x => PlayerInformations[x.userID].Reports);
                    Int32 Number = 1;
                    String PlayersInfo = String.Empty;
                    foreach (BasePlayer pList in moderatorSortedList) {
                        PlayersInfo += $"{Number}. {pList.displayName} ({pList.userID}) : {PlayerInformations[pList.userID].Reports} ";
                        PlayersInfo += LanguageEn ? "reports\n" : "жалоб\n";
                        Number++;
                    }
                    if (String.IsNullOrWhiteSpace(PlayersInfo)) PlayersInfo = LanguageEn ? "There are no players with complaints" : "Игроков с жалобами нет";
                    if (IsConsole) Puts(LanguageEn ? $"Players with complaints :\n{PlayersInfo}" : $"Игроки с жалобами :\n{PlayersInfo}");
                    else PrintToConsole(player, !lang.GetLanguage(player.UserIDString).Equals("ru") ? $"Players with complaints :\n{PlayersInfo}" : $"Игроки с жалобами :\n{PlayersInfo}");
                    break;
                }
            }
        }
        [ChatCommand("report")]
        private void ChatCommandReport(BasePlayer player, String cmd, String[] args) {
            if (player == null) return;
            if (_interface == null) return;
            DrawUI_Report_Panel(player);
        }
        private void Init() => ReadData();
        private void RegisteredPlayer(BasePlayer player) {
            if(!PlayerInformations.ContainsKey(player.userID)) PlayerInformations.Add(player.userID, new PlayerInformation());
            if (IsModerator(player)) {
                if (!ModeratorInformations.ContainsKey(player.userID)) ModeratorInformations.Add(player.userID, new ModeratorInformation());
            }
            else {
                if(ModeratorInformations.ContainsKey(player.userID)) ModeratorInformations.Remove(player.userID);
            }
        }
        private Boolean IsModerator(BasePlayer moderator) => permission.UserHasPermission(moderator.UserIDString, ModeratorPermissions);
        private void DrawUI_PoopUp_Moderator(BasePlayer player, BasePlayer Target) {
            String Interface = InterfaceBuilder.GetInterface($"{InterfaceBuilder.UI_LAYER}_POOPUP_MODERATOR");
            if (Interface == null) return;
            PlayerInformation InformationTarget = PlayerInformations[Target.userID];
            String LastModerator = String.IsNullOrWhiteSpace(InformationTarget.LastModerator) ? GetLang("TITLE_POOPUP_MODERATION_NO_CHECKED", player.UserIDString) : InformationTarget.LastModerator;
            String AmountCheck = InformationTarget.AmountChecked == 0 ? GetLang("TITLE_POOPUP_MODERATION_NO_CHECKED", player.UserIDString) : InformationTarget.AmountChecked.ToString();
            Interface = Interface.Replace("%TITLE_POOPUP_MODERATION_REPORTS_TITLE%", GetLang("TITLE_POOPUP_MODERATION_REPORTS_TITLE", player.UserIDString));
            Interface = Interface.Replace("%TITLE_POOPUP_MODERATION_AMOUNT_CHECK_TITLE%", GetLang("TITLE_POOPUP_MODERATION_AMOUNT_CHECK_TITLE", player.UserIDString));
            Interface = Interface.Replace("%TITLE_POOPUP_MODERATION_LAST_CHECK_TITLE%", GetLang("TITLE_POOPUP_MODERATION_LAST_CHECK_TITLE", player.UserIDString));
            Interface = Interface.Replace("%TITLE_PLAYER_STEAMID%", GetLang("TITLE_PLAYER_STEAMID", player.UserIDString));
            Interface = Interface.Replace("%TITLE_PLAYER_NICK_NAME%", GetLang("TITLE_PLAYER_NICK_NAME", player.UserIDString));
            Interface = Interface.Replace("%TITLE_POOPUP_MODERATION_INFO_BUTTON_START_CHECK%", GetLang("TITLE_POOPUP_MODERATION_INFO_BUTTON_START_CHECK", player.UserIDString));
            Interface = Interface.Replace("%PLAYER_NAME%", Target.displayName.Length > 7 ? Target.displayName.Substring(0, 7).ToUpper() + ".." : Target.displayName.ToUpper());
            Interface = Interface.Replace("%PLAYER_USERID%", Target.UserIDString);
            Interface = Interface.Replace("%AMOUNT_REPORTS%", InformationTarget.Reports.ToString());
            Interface = Interface.Replace("%AMOUNT_CHECK%", AmountCheck);
            Interface = Interface.Replace("%LAST_MODER_CHECK_NAME%", LastModerator);
            Interface = Interface.Replace("%AVATAR%", GetImage(Target.UserIDString));
            Interface = Interface.Replace("%COMMAND_START%", $"report.panel start.check.player {Target.UserIDString}" );
            CuiHelper.AddUi(player, Interface);
            ///История жалоб
            DrawUI_PoopUp_Moderator_Panel_Info(player, Target, GetLang("TITLE_POOPUP_MODERATION_HISTORY_REPORTS_TITLE", player.UserIDString), InformationTarget.ReasonHistory.Take(6).ToList(), "-232.807 -141.2", "-102.14 18.8");
            if (!String.IsNullOrEmpty(config.ReferenceSettings.RCCSettings.RCCKey)) {
                ///История проверок на серверах [RCC]
                DrawUI_PoopUp_Moderator_Panel_Info(player, Target, GetLang("TITLE_POOPUP_MODERATION_INFO_CHECK_SERVERS_RCC", player.UserIDString), null, "-65.333 -141.2", "65.333 18.8", GetServersCheckRCC(Target.userID).Take(6).ToList());
                ///История банов на серверах [RCC]
                DrawUI_PoopUp_Moderator_Panel_Info(player, Target, GetLang("TITLE_POOPUP_MODERATION_INFO_BANS_SERVERS_RCC", player.UserIDString), null, "102.833 -141.2", "233.5 18.8", GetServersBansRCC(Target.userID).Take(6).ToList());
                return;
            }
            if (!String.IsNullOrWhiteSpace(config.ReferenceSettings.OzProtectSettings.OzProtectKey)) {
                ///Тиммейты игрока
                DrawUI_PoopUp_Moderator_Panel_Info(player, Target, GetLang("TITLE_POOPUP_MODERATION_INFO_TEAMS_NAME_PLAYER", player.UserIDString), null, "-65.333 -141.2", "65.333 18.8", GetTeamsNames(Target).Take(6).ToList());
                ///История банов на серверах [OzProtect]
                DrawUI_PoopUp_Moderator_Panel_Info(player, Target, GetLang("TITLE_POOPUP_MODERATION_INFO_BANS_SERVERS_OZPROTECT", player.UserIDString), null, "102.833 -141.2", "233.5 18.8", GetServersBansOzProtect(Target.userID).Take(6).ToList());
                return;
            }
            ///Тиммейты игрока
            DrawUI_PoopUp_Moderator_Panel_Info(player, Target, GetLang("TITLE_POOPUP_MODERATION_INFO_TEAMS_NAME_PLAYER", player.UserIDString), null, "-65.333 -141.2", "65.333 18.8", GetTeamsNames(Target).Take(6).ToList());
        }
        private String VKT_PlayerSendReport(BasePlayer Sender, UInt64 TargetID, String Reason) {
            String Message = LanguageEn ? $"▣ NEW COMPLAINT ▣" + $"\nInformation about the sender:\n• Nickname: {Sender.displayName}\n• Steam64ID: {Sender.userID} (https://steamcommunity.com/profiles/{Sender.userID})" + $"\nInformation about the suspect:\n• Nickname: {covalence.Players.FindPlayerById(TargetID.ToString()).Name ?? "EMPTY"}\n• Steam64ID: {TargetID} (https://steamcommunity.com/profiles/{TargetID})" + $"\nComplaint reason: {Reason}" : $"▣ НОВАЯ ЖАЛОБА ▣" + $"\nИнформация об отправителе :\n• Ник : {Sender.displayName}\n• Steam64ID : {Sender.userID} (https://steamcommunity.com/profiles/{Sender.userID})" + $"\nИнформация о подозреваемом :\n• Ник : {covalence.Players.FindPlayerById(TargetID.ToString()).Name ?? "EMPTY"}\n• Steam64ID : {TargetID} (https://steamcommunity.com/profiles/{TargetID})" + $"\nПричина жалобы : {Reason}";
            return Message;
        }
        private void RequestVK(String Message) {
            try {
                webrequest.Enqueue(GetUrlVK(Message), null, (code, response) => {
                }
                , this, RequestMethod.GET, timeout : 10F);
            }
            catch (Exception ex) {
                PrintWarning(LanguageEn ? "Check the correctness of the entered data for VK! Vkontakte returns an error of your data!" : "Проверьте корректность введенных данных для ВК! Вконтакте возвращает ошибку ваших данных!");
            }
        }
        private void DrawUI_LeftMenu(BasePlayer player, Boolean IsModerator = false) {
            String Interface = InterfaceBuilder.GetInterface($"{InterfaceBuilder.UI_LAYER}_LEFT_MENU");
            if (Interface == null) return;
            CuiHelper.DestroyUi(player, InterfaceBuilder.UI_REPORT_LEFT_PANEL);
            CuiHelper.AddUi(player, Interface);
            DrawUI_LeftMenu_Button(player, GetLang("TITLE_LEFT_MENU_BUTTON_REPORTS", player.UserIDString), ImageUi.GetImage(config.ImagesSettings.LeftBlockSettings.ReportIcon), IsModerator ? config.ColorsSettings.AdditionalColorElements : "0 0 0 0", "-70.333 -34", "55 0", IsModerator ? $"report.panel select.type.mod {true}" : "");
            if (_.IsModerator(player)) DrawUI_LeftMenu_Button(player, GetLang("TITLE_LEFT_MENU_BUTTON_MODERATION", player.UserIDString), ImageUi.GetImage(config.ImagesSettings.LeftBlockSettings.ModerationIcon), IsModerator ? "0 0 0 0" : config.ColorsSettings.AdditionalColorElements, "-70.333 -71.267", "55 -37.267", IsModerator ? "" : $"report.panel select.type.mod {false}");
        }
        private void DrawUI_PoopUp_Moderator_Panel_Info(BasePlayer player, BasePlayer Target, String TitlePanel, List<Configuration.LangText> InfoList, String OffsetMin, String OffsetMax, List<String> AlternativeInfoList = null) {
            String Interface = InterfaceBuilder.GetInterface($"{InterfaceBuilder.UI_LAYER}_POOPUP_MODERATOR_INFO_BLOCK");
            if (Interface == null) return;
            Interface = Interface.Replace("%TITLE_PANEL%", TitlePanel);
            Interface = Interface.Replace("%OFFSET_MIN%", OffsetMin);
            Interface = Interface.Replace("%OFFSET_MAX%", OffsetMax);
            CuiHelper.AddUi(player, Interface);
            if (AlternativeInfoList != null) {
                if (AlternativeInfoList.Count == 0) {
                    DrawUI_PoopUp_Moderator_InfoText(player, 0, GetLang("TITLE_POOPUP_MODERATION_INFO_BLOCK_EMPTY", player.UserIDString));
                    return;
                }
                for (Int32 Y = 0; Y < AlternativeInfoList.Count; Y++) DrawUI_PoopUp_Moderator_InfoText(player, Y, AlternativeInfoList[Y]);
                return;
            }
            if (InfoList.Count == 0) {
                DrawUI_PoopUp_Moderator_InfoText(player, 0, GetLang("TITLE_POOPUP_MODERATION_INFO_BLOCK_EMPTY", player.UserIDString));
                return;
            }
            for (Int32 Y = 0; Y < InfoList.Count; Y++) DrawUI_PoopUp_Moderator_InfoText(player, Y, InfoList[Y].GetReasonTitle(player.userID));
        }
        private void RunEffect(BasePlayer Moderator) {
            if (!config.ReportContollerModerationSettings.AlertModerationSettings.AlertSound || String.IsNullOrWhiteSpace(config.ReportContollerModerationSettings.AlertModerationSettings.PathSound)) return;
            Effect effect = new Effect(config.ReportContollerModerationSettings.AlertModerationSettings.PathSound, Moderator, 0, new Vector3(), new Vector3());
            EffectNetwork.Send(effect, Moderator.Connection);
        }
        private void StartCheckedPlayer(BasePlayer Target, BasePlayer Moderator, Boolean IsConsole = false) {
            if (!IsConsole) {
                if (Moderator == null) {
                    PrintWarning(LanguageEn ? $"The moderator who called the player {Target.displayName}({Target.UserIDString}) - left the server, interrupting start checking!" : $"Модератор вызвавший игрока {Target.displayName}({Target.UserIDString}) - покинул сервер, прервав запуск проверки!");
                    StopCheckedPlayer(Target.userID, Moderator);
                    return;
                }
                DrawUI_Moderator_Checked_Menu(Moderator, Target.userID);
            }
            PlayerChecks[Target.userID].DisplayName = Target.displayName;
            UInt64 ModratorID = !IsConsole ? Moderator.userID : 0;
            StartCheckRCC(Target.userID, ModratorID);
            StartCheckOzProtect(Target.userID, ModratorID);
            DrawUI_Player_Alert(Target);
            if(config.CheckControllerSettings.UseDemo) Target.StartDemoRecording();
            StopDamageAdd(Target);
            if (config.NotifyChatSettings.UseNotifyCheck) {
                if (!IsConsole && Moderator != null) {
                    foreach (BasePlayer player in BasePlayer.activePlayerList) SendChat(GetLang("NOTIFY_PLAYERS_START_CHECK_MODERATOR", player.UserIDString, Moderator.displayName, PlayerChecks[Target.userID].DisplayName), player);
                }
                else {
                    foreach (BasePlayer player in BasePlayer.activePlayerList) SendChat(GetLang("NOTIFY_PLAYERS_START_CHECK_NOT_MODERATOR", player.UserIDString, Target.displayName), player);
                }
            }
            Configuration.NotifyDiscord.Webhooks.TemplatesNotify TemplateDiscord = config.NotifyDiscordSettings.WebhooksList.NotifyStartCheck;
            if (!String.IsNullOrWhiteSpace(TemplateDiscord.WebhookNotify)) {
                List<Fields> fields = DT_StartCheck(Target, Moderator, IsConsole);
                SendDiscord(TemplateDiscord.WebhookNotify, fields, GetAuthorDiscord(TemplateDiscord), TemplateDiscord.Color);
            }
            SendVK(VKT_StartCheck(Target, Moderator, IsConsole));
            if(!IsConsole && Moderator != null) SendChat(GetLang("FUNCIONAL_MESSAGE_CHECK_START", Moderator.UserIDString), Moderator);
            else Puts(LanguageEn ? "The check is started, the player is notified!" : "Проверка запущена, игрок уведомлен!");
            if (config.ReportSendControllerSettings.NoRepeatReport) {
                PlayerRepository repository = PlayerRepositories.FirstOrDefault(x => x.Value.IsRepeatReported(Target.userID)).Value;
                if (repository != null) repository.ReportedList.Remove(Target.userID);
            }
            Interface.Call("OnStartedChecked", Target, Moderator, IsConsole);
        }
        private Dictionary<UInt64, Timer> TimerWaitPlayer = new Dictionary<UInt64, Timer>();
        private static StringBuilder sb = new StringBuilder();
        private List<Fields> DT_PlayerSendReport(BasePlayer Sender, UInt64 TargetID, String Reason) {
            List<Fields> fields = new List<Fields> {
                new Fields(LanguageEn ? "New complaint received :" : "Получена новая жалоба :", "", false), new Fields("", "", false), new Fields(LanguageEn ? "Information about the sender :" : "Информация об отправителе :", "", false), new Fields("", "", false), new Fields(LanguageEn ? "Nick" : "Ник", $"{Sender.displayName}", true), new Fields("Steam64ID", $"[{Sender.userID}](https://steamcommunity.com/profiles/{Sender.userID})", true), new Fields("", "", false), new Fields(LanguageEn ? "Information about the suspect :" : "Информация о подозреваемом :", "", false), new Fields("", "", false), new Fields(LanguageEn ? "Nick" : "Ник", $"{covalence.Players.FindPlayerById(TargetID.ToString()).Name ?? "EMPTY"}", true), new Fields("Steam64ID", $"[{TargetID}](https://steamcommunity.com/profiles/{TargetID})", true), new Fields(LanguageEn ? "Reason for complaint :" : "Причина жалобы :", Reason, false),
            }
            ;
            return fields;
        }
        private void SendDiscord(String Webhook, List<Fields> fields, Authors Authors, Int32 Color) {
            if (Webhook == null || String.IsNullOrWhiteSpace(Webhook)) return;
            FancyMessage newMessage = new FancyMessage(null, false, new FancyMessage.Embeds[1] {
                new FancyMessage.Embeds(null, Color, fields, Authors)
            }
            );
            Request($"{Webhook}", newMessage.toJSON());
        }
        private void ShowPlayersList(BasePlayer player, List<BasePlayer> playersList, List<FakePlayer> fakePlayers, Boolean IsModerator = false) {
            Int32 X = 0, Y = 0;
            if (fakePlayers != null) {
                foreach (FakePlayer fList in fakePlayers) {
                    DrawUI_TemplatePlayer(player, X, Y, fList.DisplayName, fList.UserID.ToString());
                    X++;
                    if (X != 3) continue;
                    X = 0;
                    Y++;
                }
            }
            else {
                foreach (BasePlayer pList in playersList) {
                    if (IsModerator) {
                        DrawUI_TemplatePlayer_Moderator(player, Y, pList.UserIDString, CorrectedClanName(pList));
                        Y++;
                    }
                    else {
                        DrawUI_TemplatePlayer(player, X, Y, CorrectedClanName(pList), pList.UserIDString);
                        X++;
                        if (X != 3) continue;
                        X = 0;
                        Y++;
                    }
                }
            }
        }
        private void AddCooldown(UInt64 SenderID, UInt64 TargetID) {
            if (config.ReportSendControllerSettings.CooldownReport == 0 && !config.ReportSendControllerSettings.NoRepeatReport) return;
            if (!PlayerRepositories.ContainsKey(SenderID)) {
                PlayerRepositories.Add(SenderID, new PlayerRepository {
                    ReportedList = new Dictionary<UInt64, Double>(), Cooldown = 0
                }
                );
            }
            PlayerRepositories[SenderID].AddCooldown(TargetID);
        }
        private static Double CurrentTime => Facepunch.Math.Epoch.Current;
        private void DrawUI_ShowPoopUP(BasePlayer player, String displayName, String userID) {
            String Interface = InterfaceBuilder.GetInterface($"{InterfaceBuilder.UI_LAYER}_TEMPLATE_POOPUP");
            if (Interface == null) return;
            Interface = Interface.Replace("%POOPUP_BACKGORUND%", ImageUi.GetImage(config.ImagesSettings.PlayerListBlockSettings.PoopUpBackgorund));
            Interface = Interface.Replace("%AVATAR%", GetImage(userID));
            Interface = Interface.Replace("%NICK_NAME%", displayName.Length > 7 ? displayName.Substring(0, 7).ToUpper() + ".." : displayName.ToUpper());
            Interface = Interface.Replace("%STEAMID%", userID);
            Interface = Interface.Replace("%TITLE_PLAYER_NICK_NAME%", GetLang("TITLE_PLAYER_NICK_NAME", player.UserIDString));
            Interface = Interface.Replace("%TITLE_PLAYER_STEAMID%", GetLang("TITLE_PLAYER_STEAMID", player.UserIDString));
            CuiHelper.AddUi(player, Interface);
            DrawUI_ShowPoopUP_Reason(player, userID);
        }
        private IEnumerator SendSounds(BasePlayer player, String clipName, SpeakerEntityMgr.SpeakerEntity speakerEntity) {
            NpcSound sound = LoadDataSound(clipName);
            if (sound == null) {
                if (RoutineSounds[player] != null) ServerMgr.Instance.StopCoroutine(RoutineSounds[player]);
                speakerEntity?.Kill();
                yield break;
            }
            yield return CoroutineEx.waitForSeconds(0.1f);
            foreach (byte[] data in sound.Data) {
                if (speakerEntity == null) {
                    break;
                }
                SendSound(speakerEntity.UID_SPEAKER, data);
                yield return CoroutineEx.waitForSeconds(0.07f);
            }
            if (RoutineSounds[player] != null) ServerMgr.Instance.StopCoroutine(RoutineSounds[player]);
            yield break;
        }
        private const String ModeratorPermissions = "iqreportsystem.moderation";
        private List<Fields> DT_StopCheck(UInt64 TargetID, BasePlayer Moderator, Boolean AutoStop = false, Boolean IsConsole = false, Configuration.ReasonReport Verdict = null) {
            String ModeratorName = !IsConsole && Moderator != null ? Moderator.displayName : "Console";
            String ModeratorID = !IsConsole && Moderator != null ? Moderator.UserIDString : "Console";
            List<Fields> fields;
            if (AutoStop) {
                fields = new List<Fields> {
                    new Fields(LanguageEn ? "Player verification is completed automatically :" : "Проверка игрока завершена автоматически :", "", false), new Fields("", "", false), new Fields(LanguageEn ? "Suspect Information:" : "Информация о подозреваемом :", "", false), new Fields("", "", false), new Fields(LanguageEn ? "Nick" : "Ник", $"{PlayerChecks[TargetID].DisplayName}", true), new Fields("SteamID", $"{TargetID}", true), new Fields("Результат", LanguageEn ? "The player's reports are not reset" : "Репорты игрока не сброшены", false),
                }
                ;
            }
            else {
                fields = new List<Fields> {
                    new Fields(LanguageEn ? "Player check completed :" : "Завершена проверка игрока :", "", false), new Fields("", "", false), new Fields(LanguageEn ? "Moderator Information :" : "Информация о модераторе :", "", false), new Fields("", "", false), new Fields(LanguageEn ? "Nick" : "Ник", $"{ModeratorName}", true), new Fields("Steam64ID", $"[{ModeratorID}](https://steamcommunity.com/profiles/{ModeratorID})", true), new Fields("", "", false), new Fields(LanguageEn ? "Suspect Information:" : "Информация о подозреваемом :", "", false), new Fields("", "", false), new Fields(LanguageEn ? "Nick" : "Ник", $"{PlayerChecks[TargetID].DisplayName}", true), new Fields("SteamID", $"{TargetID}", true), new Fields("Результат", $"{(Verdict == null ? (LanguageEn ? "No violations found" : "Нарушений не выявлено") : LanguageEn ? Verdict.Title.LanguageEN : Verdict.Title.LanguageRU)}", false),
                }
                ;
            }
            return fields;
        }
        private Dictionary<UInt64, PlayerInformation> PlayerInformations = new Dictionary<UInt64, PlayerInformation>();
        private Boolean IsCombatBlock(BasePlayer Target) {
            if (!NoEscape) return false;
            if (!config.ReferenceSettings.NoEscapeSetting.NoCheckedCombatBlock) return false;
            Boolean IsCombatBlock = (Boolean)NoEscape.CallHook("IsCombatBlocked", Target);
            return IsCombatBlock;
        }
        private Boolean IsClans(String userID, String targetID) {
            if (!Clans) return false;
            if (!Clans.Author.Contains("dcode")) {
                Object result = Clans.Call("IsClanMember", userID, targetID);
                if (result == null) return false;
                return (Boolean)result;
            }
            String TagUserID = (String)Clans.Call("GetClanOf", userID);
            String TagTargetID = (String)Clans.Call("GetClanOf", targetID);
            return TagUserID == TagTargetID;
        }
        private String GetImage(String fileName, UInt64 skin = 0) {
            var imageId = (String)plugins.Find("ImageLibrary").CallHook("GetImage", fileName, skin);
            if (!string.IsNullOrEmpty(imageId)) return imageId;
            return String.Empty;
        }
        private void DrawUI_TemplatePlayer_Moderator_IsSteam(BasePlayer player, String UserID) {
            String Interface = InterfaceBuilder.GetInterface($"{InterfaceBuilder.UI_LAYER}_TEMPLATE_PLAYER_MODERATOR_ISSTEAM");
            if (Interface == null) return;
            Interface = Interface.Replace("%STATUS_PLAYER%", IsSteam(UserID) ? ImageUi.GetImage(config.ImagesSettings.ModeratorMenuCheckedSettings.SteamIcoPlayer) : ImageUi.GetImage(config.ImagesSettings.ModeratorMenuCheckedSettings.PirateIcoPlayer));
            CuiHelper.AddUi(player, Interface);
        }
        private void DrawUI_TemplatePlayer(BasePlayer player, Int32 X, Int32 Y, String NickName, String UserID) {
            String Interface = InterfaceBuilder.GetInterface($"{InterfaceBuilder.UI_LAYER}_TEMPLATE_PLAYER");
            if (Interface == null) return;
            Interface = Interface.Replace("%STEAMID%", GetImage(UserID));
            Interface = Interface.Replace("%NICK%", NickName.Length > 7 ? NickName.Substring(0, 7).ToUpper() + ".." : NickName.ToUpper());
            Interface = Interface.Replace("%OFFSET_MIN%", $"{-219.214 + (X * 160)} {174.147 - (Y * 50)}");
            Interface = Interface.Replace("%OFFSET_MAX%", $"{-89.973 + (X * 160)} {210.147 - (Y * 50)}");
            Interface = Interface.Replace("%COMMAND%", $"report.panel select.player {UserID} false");
            Interface = Interface.Replace("%TITLE_PLAYER_NICK_NAME%", GetLang("TITLE_PLAYER_NICK_NAME", player.UserIDString));
            CuiHelper.AddUi(player, Interface);
        }
        private Dictionary<UInt64, LocalRepositoryOzProtect> OzProtect_LocalRepository = new Dictionary<UInt64, LocalRepositoryOzProtect>();
        internal class LocalRepositoryOzProtect {
            public List<String> LastBansServers = new List<String>();
        }
        private readonly Dictionary<UInt64, ProcessCheckRepository> PlayerChecks = new Dictionary<UInt64, ProcessCheckRepository>();
        private String VKT_PlayerMaxReport(String PlayerName, Int32 Reports, UInt64 TargetID) {
            String Message = LanguageEn ? $"▣ EXCESS OF COMPLAINTS ▣\nInformation about the suspect:\n• Nickname: {PlayerName}\n• Steam64ID : {TargetID} (https://steamcommunity.com/profiles/{TargetID})\nNumber of reports: {Reports}" : $"▣ ПРЕВЫШЕНИЕ КОЛИЧЕСТВА ЖАЛОБ ▣\nИнформация об подозреваемом :\n• Ник : {PlayerName}\n• Steam64ID : {TargetID} (https://steamcommunity.com/profiles/{TargetID})\nКоличество репортов : {Reports}";
            return Message;
        }
        private List<String> GetServersBansOzProtect(UInt64 TargetID) {
            if (String.IsNullOrWhiteSpace(config.ReferenceSettings.OzProtectSettings.OzProtectKey)) return null;
            return !OzProtect_LocalRepository.ContainsKey(TargetID) ? new List<String>() : OzProtect_LocalRepository[TargetID].
// ... [Code preview truncated due to length. Full source in attached file] ...

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