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

FREE IQReportSystem : 2.23.90 2.23.90

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Oxide.Game.Rust.Cui;
using System.Text;
using System.Collections.Generic;
using Oxide.Core.Libraries;
using Object = System.Object;
using ConVar;
using Newtonsoft.Json;
using Facepunch.Utility;
using System.Linq;
using Network;
using Oxide.Core;
using Net = Network.Net;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEngine.UI;
using Oxide.Core.Plugins;
using UnityEngine.Networking;
using System.Collections;
using Newtonsoft.Json.Linq;
using Oxide.Core.Libraries.Covalence;
using System;
using Time = UnityEngine.Time;
namespace Oxide.Plugins {
    /* Плагин */
    [Info("IQReportSystem", "Mercury", "2.23.90")]
    [Description("One love IQReportSystem")]
    internal class IQReportSystem : RustPlugin {
        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 class ImageUi {
            private static Coroutine coroutineImg = null;
            private static Dictionary<String, String> Images = new Dictionary<String, String>();
            private static List<String> KeyImages = new List<String>();
            public static void DownloadImages() {
                coroutineImg = ServerMgr.Instance.StartCoroutine(AddImage());
            }
            private static IEnumerator AddImage() {
                if (_ == null) yield break;
                _.PrintWarning("Генерируем интерфейс, ожидайте ~10-15 секунд!");
                foreach (String URL in KeyImages) {
                    String KeyName = URL;
                    if (KeyName == null) throw new ArgumentNullException(nameof(KeyName));
                    UnityWebRequest www = UnityWebRequestTexture.GetTexture(URL);
                    yield return www.SendWebRequest();
                    if (www.isNetworkError || www.isHttpError) {
                        _.PrintWarning($"Image download error! Error: {www.error}, Image name: {KeyName}");
                        www.Dispose();
                        coroutineImg = null;
                        yield break;
                    }
                    Texture2D texture = DownloadHandlerTexture.GetContent(www);
                    if (texture != null) {
                        Byte[] bytes = texture.EncodeToPNG();
                        String image = FileStorage.server.Store(bytes, FileStorage.Type.png, CommunityEntity.ServerInstance.net.ID).ToString();
                        if (!Images.ContainsKey(KeyName)) Images.Add(KeyName, image);
                        else Images[KeyName] = image;
                        UnityEngine.Object.DestroyImmediate(texture);
                    }
                    www.Dispose();
                    yield return CoroutineEx.waitForSeconds(0.02f);
                }
                yield return CoroutineEx.waitForSeconds(0.02f);
                coroutineImg = null;
                _interface = new InterfaceBuilder();
                _.PrintWarning("Интерфейс успешно загружен!");
            }
            public static string GetImage(String ImgKey) {
                if (Images.ContainsKey(ImgKey)) return Images[ImgKey];
                return _.GetImage("LOADING");
            }
            public static void Initialize() {
                KeyImages = new List<String>();
                Images = new Dictionary<string, string>();
                Configuration.Images ImagesPlugin = config.ImagesSettings;
                if (!KeyImages.Contains(ImagesPlugin.Background)) KeyImages.Add(ImagesPlugin.Background);
                if (!KeyImages.Contains(ImagesPlugin.PageDown)) KeyImages.Add(ImagesPlugin.PageDown);
                if (!KeyImages.Contains(ImagesPlugin.PageUp)) KeyImages.Add(ImagesPlugin.PageUp);
                if (!KeyImages.Contains(ImagesPlugin.Search)) KeyImages.Add(ImagesPlugin.Search);
                if (!KeyImages.Contains(ImagesPlugin.AvatarBlur)) KeyImages.Add(ImagesPlugin.AvatarBlur);
                if (!KeyImages.Contains(ImagesPlugin.ReasonModeratorAndRaiting)) KeyImages.Add(ImagesPlugin.ReasonModeratorAndRaiting);
                if (!KeyImages.Contains(ImagesPlugin.PlayerAlerts)) KeyImages.Add(ImagesPlugin.PlayerAlerts);
                if (!KeyImages.Contains(ImagesPlugin.StatisticsBlockSettings.BlockStatsModeration)) KeyImages.Add(ImagesPlugin.StatisticsBlockSettings.BlockStatsModeration);
                if (!KeyImages.Contains(ImagesPlugin.StatisticsBlockSettings.BlockStatsRaitingModeration)) KeyImages.Add(ImagesPlugin.StatisticsBlockSettings.BlockStatsRaitingModeration);
                if (!KeyImages.Contains(ImagesPlugin.StatisticsBlockSettings.RaitingImage)) KeyImages.Add(ImagesPlugin.StatisticsBlockSettings.RaitingImage);
                if (!KeyImages.Contains(ImagesPlugin.PlayerListBlockSettings.PoopUpBackgorund)) KeyImages.Add(ImagesPlugin.PlayerListBlockSettings.PoopUpBackgorund);
                if (!KeyImages.Contains(ImagesPlugin.PlayerListBlockSettings.PoopUpReasonBackgorund)) KeyImages.Add(ImagesPlugin.PlayerListBlockSettings.PoopUpReasonBackgorund);
                if (!KeyImages.Contains(ImagesPlugin.LeftBlockSettings.ButtonBackgorund)) KeyImages.Add(ImagesPlugin.LeftBlockSettings.ButtonBackgorund);
                if (!KeyImages.Contains(ImagesPlugin.LeftBlockSettings.ModerationIcon)) KeyImages.Add(ImagesPlugin.LeftBlockSettings.ModerationIcon);
                if (!KeyImages.Contains(ImagesPlugin.LeftBlockSettings.ReportIcon)) KeyImages.Add(ImagesPlugin.LeftBlockSettings.ReportIcon);
                if (!KeyImages.Contains(ImagesPlugin.ModerationBlockSettings.ModeratorPoopUPBackgorund)) KeyImages.Add(ImagesPlugin.ModerationBlockSettings.ModeratorPoopUPBackgorund);
                if (!KeyImages.Contains(ImagesPlugin.ModerationBlockSettings.ModeratorPoopUPTextBackgorund)) KeyImages.Add(ImagesPlugin.ModerationBlockSettings.ModeratorPoopUPTextBackgorund);
                if (!KeyImages.Contains(ImagesPlugin.ModerationBlockSettings.ModeratorPoopUPPanelBackgorund)) KeyImages.Add(ImagesPlugin.ModerationBlockSettings.ModeratorPoopUPPanelBackgorund);
                if (!KeyImages.Contains(ImagesPlugin.ModeratorMenuCheckedSettings.ModeratorCheckedBackground)) KeyImages.Add(ImagesPlugin.ModeratorMenuCheckedSettings.ModeratorCheckedBackground);
                if (!KeyImages.Contains(ImagesPlugin.ModeratorMenuCheckedSettings.ModeratorCheckedStopButton)) KeyImages.Add(ImagesPlugin.ModeratorMenuCheckedSettings.ModeratorCheckedStopButton);
                if (!KeyImages.Contains(ImagesPlugin.ModeratorMenuCheckedSettings.ModeratorVerdictButton)) KeyImages.Add(ImagesPlugin.ModeratorMenuCheckedSettings.ModeratorVerdictButton);
                if (!KeyImages.Contains(ImagesPlugin.ModeratorMenuCheckedSettings.SteamIcoPlayer)) KeyImages.Add(ImagesPlugin.ModeratorMenuCheckedSettings.SteamIcoPlayer);
                if (!KeyImages.Contains(ImagesPlugin.ModeratorMenuCheckedSettings.PirateIcoPlayer)) KeyImages.Add(ImagesPlugin.ModeratorMenuCheckedSettings.PirateIcoPlayer);
                if (!KeyImages.Contains(ImagesPlugin.PlayerMenuRaitingSettings.PlayerMenuRaitingBackground)) KeyImages.Add(ImagesPlugin.PlayerMenuRaitingSettings.PlayerMenuRaitingBackground);
            }
            public static void Unload() {
                coroutineImg = null;
                foreach (KeyValuePair<String, String> item in Images) FileStorage.server.RemoveExact(UInt32.Parse(item.Value), FileStorage.Type.png, CommunityEntity.ServerInstance.net.ID, 0U);
                KeyImages.Clear();
                KeyImages = null;
                Images.Clear();
                Images = null;
            }
        }
        private Boolean CanStartedChecked(BasePlayer Target) => IsValidStartChecked(Target, null);
        [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;
                }
            }
        }
        private void DrawUI_ModeratorStitistics_Banner(BasePlayer Moderator, String OffsetMin, String OffsetMax, String TitleBanner, String ArgBanner, String AdditionalText = "", Int32 CountRaiting = -1) {
            String Interface = InterfaceBuilder.GetInterface($"{InterfaceBuilder.UI_LAYER}_PROFILE_BANNER_TEMPLATE");
            if (Interface == null) return;
            Interface = Interface.Replace("%OFFSET_MIN%", OffsetMin);
            Interface = Interface.Replace("%OFFSET_MAX%", OffsetMax);
            Interface = Interface.Replace("%TITLE_BANNER%", TitleBanner);
            Interface = Interface.Replace("%ARGS_BANNER%", ArgBanner);
            CuiHelper.AddUi(Moderator, Interface);
            if (!String.IsNullOrWhiteSpace(AdditionalText)) {
                DrawUI_ModeratorStitistics_Banner_AdditionalText(Moderator, AdditionalText);
                return;
            }
            if (CountRaiting < 0) return;
            for (Int32 Raiting = 0; Raiting < CountRaiting; Raiting++) DrawUI_ModeratorStitistics_Banner_RaitingImage(Moderator, Raiting);
        }
        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 OnPlayerConnected(BasePlayer player) {
            SteamAvatarAdd(player.UserIDString);
            RegisteredPlayer(player);
            CheckStatusPlayer(player);
            if (IsModerator(player)) CheckStatusModerator(player);
        }
        private void DrawUI_ModeratorStitistics_Banner_AdditionalText(BasePlayer Moderator, String AdditionalText) {
            String Interface = InterfaceBuilder.GetInterface($"{InterfaceBuilder.UI_LAYER}_PROFILE_BANNER_TEMPLATE_ADDITIONAL_TEXT");
            if (Interface == null) return;
            Interface = Interface.Replace("%ADDITIONAL_TEXT%", AdditionalText);
            CuiHelper.AddUi(Moderator, Interface);
        }
        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 void WriteData() {
            Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQSystem/IQReportSystem/PlayerInformations", PlayerInformations);
            Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQSystem/IQReportSystem/ModeratorInformations", ModeratorInformations);
        }
        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 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 void StartPluginLoad() {
            _ = this;
            //AddCommands
            cmd.AddChatCommand(config.CommandForContact, this, nameof(ChatCommandDiscord));
            cmd.AddConsoleCommand(config.CommandForContact, this, nameof(ConsoleCommandDiscord));
            //Validate DataFile
            foreach (BasePlayer player in BasePlayer.activePlayerList) OnPlayerConnected(player);
            //Load your images here
            ImageUi.Initialize();
            ImageUi.DownloadImages();
            //Starting IQFakeActive
            StartSysncFakeActive();
        }
        private void CheckStatusPlayer(BasePlayer player, String ReasonDisconnected = null) {
            if (player == null) return;
            if (!PlayerChecks.ContainsKey(player.userID)) return;
            Boolean IsConsole = PlayerChecks[player.userID].ModeratorID == 0;
            BasePlayer Moderator = BasePlayer.FindByID(PlayerChecks[player.userID].ModeratorID);
            Configuration.NotifyDiscord.Webhooks.TemplatesNotify TemplateDiscord = config.NotifyDiscordSettings.WebhooksList.NotifyStatusPlayerOrModerator;
            if (Moderator == null && !IsConsole) {
                SendChat(GetLang("FUNCIONAL_CHANGE_STATUS_MODERATOR_DISCONNECTED", player.UserIDString), player);
                Timer WaitModerator = timer.Once(600f, () => {
                    StopCheckedPlayer(player.userID, null, true);
                    SendChat(GetLang("FUNCIONAL_CHANGE_STATUS_MODERATOR_DISCONNECTED_FULL_LEAVE", player.UserIDString), player);
                }
                );
                if (!TimerWaitChecked.ContainsKey(player.userID)) TimerWaitChecked.Add(player.userID, WaitModerator);
                else TimerWaitChecked[player.userID] = WaitModerator;
                return;
            }
            if (ReasonDisconnected != null) {
                if (config.CheckControllerSettings.StopCheckLeavePlayer) {
                    Timer WaitPlayer = timer.Once(900, () => {
                        StopCheckedPlayer(player.userID, Moderator, true);
                    }
                    );
                    if (!TimerWaitPlayer.ContainsKey(player.userID)) TimerWaitPlayer.Add(player.userID, WaitPlayer);
                    else TimerWaitPlayer[player.userID] = WaitPlayer;
                }
                if (IsConsole) {
                    Puts(LanguageEn ? $"The player's connection status has changed from server to : {ReasonDisconnected}" : $"У игрока изменился статус соединения с сервером на : {ReasonDisconnected}");
                    return;
                }
                DrawUI_Moderator_Checked_Menu_Status(Moderator, ReasonDisconnected);
                SendChat(GetLang("FUNCIONAL_CHANGE_STATUS_PLAYER_ALERT_MODERATOR", Moderator.UserIDString, ReasonDisconnected), Moderator);
                if (!String.IsNullOrWhiteSpace(TemplateDiscord.WebhookNotify)) {
                    List<Fields> fields = DT_ChangeStatus(false, player.displayName, player.UserIDString, ReasonDisconnected);
                    SendDiscord(TemplateDiscord.WebhookNotify, fields, GetAuthorDiscord(TemplateDiscord), TemplateDiscord.Color);
                }
                SendVK(VKT_ChangeStatus(false, player.displayName, player.UserIDString, ReasonDisconnected));
                StopDamageRemove(player.userID);
                return;
            }
            if (!player.IsConnected) return;
            player.Invoke(() => {
                SendChat(GetLang("FUNCIONAL_CHANGE_STATUS_PLAYER_ONLINE_ALERT_PLAYER", player.UserIDString), player);
                DrawUI_Player_Alert(player);
                if(config.CheckControllerSettings.UseDemo) player.StartDemoRecording();
                if (IsConsole) {
                    Puts(LanguageEn ? "The player has connected to the server.Check continued" : "Игрок подключился к серверу.Проверка продолжена");
                    return;
                }
                if (Moderator == null) return;
                DrawUI_Moderator_Checked_Menu_Status(Moderator, GetLang("TITLE_PROFILE_MODERATOR_CHECKED_MENU_TITLE_STATUS_DEFAULT", Moderator.UserIDString));
                SendChat(GetLang("FUNCIONAL_CHANGE_STATUS_PLAYER_ONLINE_ALERT_MODERATOR", Moderator.UserIDString), Moderator);
                StopDamageAdd(player);
            }
            , 3f);
            if (!String.IsNullOrWhiteSpace(TemplateDiscord.WebhookNotify)) {
                List<Fields> fields = DT_ChangeStatus(false, player.displayName, player.UserIDString, "Online");
                SendDiscord(TemplateDiscord.WebhookNotify, fields, GetAuthorDiscord(TemplateDiscord), TemplateDiscord.Color);
            }
            SendVK(VKT_ChangeStatus(false, player.displayName, player.UserIDString, "Online"));
            if (!TimerWaitPlayer.ContainsKey(player.userID)) return;
            if (TimerWaitPlayer[player.userID].Destroyed) return;
            TimerWaitPlayer[player.userID].Destroy();
            TimerWaitPlayer.Remove(player.userID);
        }
        private static Configuration config = new Configuration();
        private String CorrectedClanName(BasePlayer player) {
            String ClanTag = GetClanTag(player.UserIDString);
            String pattern = @"\[.*?\]";
            String CorrectedResult = ClanTag == null || String.IsNullOrWhiteSpace(ClanTag) ? player.displayName : Regex.Replace(player.displayName, pattern, String.Empty);
            if (String.IsNullOrWhiteSpace(CorrectedResult) || CorrectedResult == null) CorrectedResult = player.displayName;
            return CorrectedResult;
        }
        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 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 void DrawUI_Player_Alert(BasePlayer player) {
            String Interface = InterfaceBuilder.GetInterface($"{InterfaceBuilder.UI_LAYER}_PLAYER_ALERT");
            if (Interface == null) return;
            Interface = Interface.Replace("%TITLE_TEXT%", GetLang("TITLE_PLAYER_ALERT_INFORMATION_TITLE", player.UserIDString));
            Interface = Interface.Replace("%DESCRIPTION_TEXT%", GetLang("TITLE_PLAYER_ALERT_INFORMATION_DESCRIPTION", player.UserIDString));
            CuiHelper.DestroyUi(player, InterfaceBuilder.UI_REPORT_PLAYER_ALERT);
            CuiHelper.AddUi(player, Interface);
            if (!config.CheckControllerSettings.UseSoundAlert) return;
            NextTick(() => {
                SoundPlay(player);
            }
            );
        }
        private void SendRaitingModerator(UInt64 ModeratorID, Int32 IndexAchive, Int32 StarAmount) {
            if (!ModeratorInformations.ContainsKey(ModeratorID)) return;
            ModeratorInformation ModeratorInfo = ModeratorInformations[ModeratorID];
            List<Int32> ListScore = IndexAchive == 1 ? ModeratorInfo.OneScore : IndexAchive == 2 ? ModeratorInfo.TwoScore : IndexAchive == 3 ? ModeratorInfo.ThreeScore : null;
            ListScore?.Add(StarAmount);
            Interface.Call("OnSendedFeedbackChecked", ModeratorID, IndexAchive, StarAmount);
        }
        private void ReadData() {
            PlayerInformations = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<UInt64, PlayerInformation>>("IQSystem/IQReportSystem/PlayerInformations");
            ModeratorInformations = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<UInt64, ModeratorInformation>>("IQSystem/IQReportSystem/ModeratorInformations");
        }
        private Dictionary<UInt64, Timer> TimerWaitPlayer = new Dictionary<UInt64, Timer>();
        private List<String> GetServersBansRCC(UInt64 TargetID) {
            if (String.IsNullOrWhiteSpace(config.ReferenceSettings.RCCSettings.RCCKey)) return null;
            return !RCC_LocalRepository.ContainsKey(TargetID) ? new List<String>() : RCC_LocalRepository[TargetID].LastBansServers;
        }
        private void OnPlayerDisconnected(BasePlayer player, String reason) {
            CheckStatusPlayer(player, reason);
            if (IsModerator(player)) CheckStatusModerator(player, reason);
        }
        private List<Fields> DT_PlayerSendContact(BasePlayer Sender, String Contact) {
            List<Fields> fields = new List<Fields> {
                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(LanguageEn ? "Contacts for communication :" : "Контакты для связи :", Contact, false),
            }
            ;
            return fields;
        }
        public Dictionary<BasePlayer, Coroutine> RoutineSounds = new Dictionary<BasePlayer, Coroutine>();
        private Dictionary<UInt64, LocalRepositoryOzProtect> OzProtect_LocalRepository = new Dictionary<UInt64, LocalRepositoryOzProtect>();
        protected override void SaveConfig() => Config.WriteObject(config);
        public class OzResponse {
            public int unixtime {
                get;
                set;
            }
            public string reason {
                get;
                set;
            }
            public string proofid {
                get;
                set;
            }
            public bool pirate {
                get;
                set;
            }
            public bool active {
                get;
                set;
            }
            public bool reliable {
                get;
                set;
            }
            public bool unnecessary {
                get;
                set;
            }
            public OzServer server {
                get;
                set;
            }
            public string admin {
                get;
                set;
            }
            public int game {
                get;
                set;
            }
            public string date {
                get;
                set;
            }
            public int bantime {
                get;
                set;
            }
        }
        private void DrawUI_Moderator_Checked_Menu_Discord(BasePlayer moderator, String Discord) {
            String Interface = InterfaceBuilder.GetInterface($"{InterfaceBuilder.UI_LAYER}_DISCORD_STATUS_CHECKED_MODERATOR");
            if (Interface == null) return;
            Interface = Interface.Replace("%TITLE_PROFILE_MODERATOR_CHECKED_MENU_TITLE_DISCORD%", GetLang("TITLE_PROFILE_MODERATOR_CHECKED_MENU_TITLE_DISCORD", moderator.UserIDString, Discord));
            CuiHelper.DestroyUi(moderator, "InfoDiscord");
            CuiHelper.AddUi(moderator, Interface);
        }
        private String GetClanTag(String userID) {
            if (Clans) return (String)Clans.Call("GetClanOf", userID);
            else return null;
        }
        private void DrawUI_Raiting_Menu_Stars(BasePlayer player, Int32 SelectedAmount, UInt64 ModeratorID) {
            for (Int32 X = 0; X < 5; X++) {
                String Interface = InterfaceBuilder.GetInterface($"{InterfaceBuilder.UI_LAYER}_RAITING_MENU_PLAYER_STARS");
                if (Interface == null) return;
                Interface = Interface.Replace("%OFFSET_MIN%", $"{-88.24 + (X * 15)} -22");
                Interface = Interface.Replace("%OFFSET_MAX%", $"{-77.58 + (X * 15)} -12");
                Interface = Interface.Replace("%COLOR_STARS%", SelectedAmount >= X ? "1 1 1 1" : "1 1 1 0.5");
                Interface = Interface.Replace("%COMMAND_STARS%", SelectedAmount >= 0 ? "" : $"report.panel select.raiting.star {X} {ModeratorID}");
                CuiHelper.AddUi(player, Interface);
            }
        }
        public Boolean IsValidStartChecked(BasePlayer Target, BasePlayer Moderator, Boolean IsConsole = false) {
            if (PlayerChecks.ContainsKey(Target.userID)) {
                if (IsConsole) Puts(LanguageEn ? "This player has already been called for checked" : "Данного игрока уже вызвали на проверку");
                else if(Moderator != null) SendChat(GetLang("NOTIFY_MODERATOR_ITS_PLAYER_CHECKED", Moderator.UserIDString), Moderator);
                return false;
            }
            if (IsRaidBlock(Target)) {
                if (IsConsole) Puts(LanguageEn ? "The check was canceled automatically with complaints saved! Reason : the player has an active raid-block" : "Проверка отменена автоматически с сохранением жалоб! Причина : у игрока активный рейд-блок");
                else if(Moderator != null) SendChat(GetLang("NOTIFY_MODERATOR_RAIDBLOCK_PLAYER", Moderator.UserIDString), Moderator);
                return false;
            }
            if (IsCombatBlock(Target)) {
                if (IsConsole) Puts(LanguageEn ? "The check was canceled automatically with complaints saved! Reason : the player has an active combat-block" : "Проверка отменена автоматически с сохранением жалоб! Причина : у игрока активный комбат-блок");
                else if(Moderator != null) SendChat(GetLang("NOTIFY_MODERATOR_COMBATBLOCK_PLAYER", Moderator.UserIDString), Moderator);
                return false;
            }
            if (IsDuel(Target.userID)) {
                if (IsConsole) Puts(LanguageEn ? "The check is canceled automatically with complaints saved! Reason : the player is in a duel" : "Проверка отменена автоматически с сохранением жалоб! Причина : игрок находится на дуэли");
                else if(Moderator != null) SendChat(GetLang("NOTIFY_MODERATOR_DUEL_PLAYER", Moderator.UserIDString), Moderator);
                return false;
            }
            if (Moderator != null && !IsConsole) {
                if (IsFriendStartChecked(Moderator.userID, Target.userID)) {
                    SendChat(GetLang("NOTIFY_MODERATOR_FRIEND_PLAYER", Moderator.UserIDString), Moderator);
                    return false;
                }
                if (IsClansStartChecked(Moderator.UserIDString, Target.UserIDString)) {
                    SendChat(GetLang("NOTIFY_MODERATOR_FRIEND_PLAYER", Moderator.UserIDString), Moderator);
                    return false;
                }
            }
            return true;
        }
        protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
        private void SendChat(String Message, BasePlayer player, ConVar.Chat.ChatChannel channel = ConVar.Chat.ChatChannel.Global) {
            if (IQChat) if (config.ReferenceSettings.IQChatSetting.UIAlertUse) IQChat?.Call("API_ALERT_PLAYER_UI", player, Message);
            else IQChat?.Call("API_ALERT_PLAYER", player, Message, config.ReferenceSettings.IQChatSetting.CustomPrefix, config.ReferenceSettings.IQChatSetting.CustomAvatar);
            else player.SendConsoleCommand("chat.add", channel, 0, Message);
        }
        private class InterfaceBuilder {
            public static InterfaceBuilder Instance;
            public const String UI_LAYER = "UI_IQREPORT_INTERFACE";
            public const String UI_REPORT_PANEL = "UI_REPORT_PANEL";
            public const String UI_REPORT_LEFT_PANEL = "UI_REPORT_LEFT_PANEL";
            public const String UI_REPORT_PLAYER_PANEL = "UI_REPORT_PLAYER_PANEL";
            public const String UI_REPORT_POOPUP_PLAYER = "UI_REPORT_POOPUP_PLAYER";
            public const String UI_REPORT_POOPUP_MODERATOR = "UI_REPORT_POOPUP_MODERATOR";
            public const String UI_REPORT_MODERATOR_STATISTICS = "UI_REPORT_MODERATOR_STATISTICS";
            public const String UI_REPORT_MODERATOR_MENU_CHECKED = "UI_REPORT_MODERATOR_MENU_CHECKED";
            public const String UI_REPORT_RAITING_PLAYER_PANEL = "UI_REPORT_RAITING_PLAYER_PANEL";
            public const String UI_REPORT_PLAYER_ALERT = "UI_REPORT_PLAYER_ALERT";
            public Dictionary<String, String> Interfaces;
            public InterfaceBuilder() {
                Instance = this;
                Interfaces = new Dictionary<String, String>();
                Building_Bacgkround();
                Building_Panel_Players();
                Building_PageController();
                Building_PlayerTemplate();
                Building_PoopUp_Player();
                Building_PoopUp_Reason();
                Building_PlayerTemplate_Moderator();
                Building_Left_Menu();
                Building_Button_Template();
                Building_PoopUP_Moderator();
                Building_PoopUP_Moderator_InfoBlock();
                Building_Text_Template_Moderator_Block_Info();
                Building_HeaderPanel_Search();
                Building_Profile_Moderator_Stats();
                Building_Profile_Template_Banner();
                Building_Profile_Template_Banner_AdditionalImg();
                Building_Profile_Template_Banner_AdditionalText();
                Building_Moderator_Menu();
                Building_ModeratorMenuChecked_InfoDiscord();
                Building_ModeratorMenuChecked_InfoOnline();
                Building_ModeratorMenu_Verdict_Button();
                Building_Raiting_Menu();
                Building_Raiting_Select_Button();
                Building_DropList_Reasons();
                Building_Player_Alert();
                Building_PlayerTemplate_Moderator_IsSteam();
            }
            public static void AddInterface(String name, String json) {
                if (Instance.Interfaces.ContainsKey(name)) {
                    _.PrintError($"Error! Tried to add existing cui elements! -> {name}");
                    return;
                }
                Instance.Interfaces.Add(name, json);
            }
            public static String GetInterface(String name) {
                String json = String.Empty;
                if (Instance.Interfaces.TryGetValue(name, out json) == false) {
                    _.PrintWarning($"Warning! UI elements not found by name! -> {name}");
                }
                return json;
            }
            public static void DestroyAll() {
                for (Int32 i = 0; i < BasePlayer.activePlayerList.Count; i++) {
                    BasePlayer player = BasePlayer.activePlayerList[i];
                    CuiHelper.DestroyUi(player, UI_REPORT_PANEL);
                    CuiHelper.DestroyUi(player, UI_REPORT_MODERATOR_MENU_CHECKED);
                    CuiHelper.DestroyUi(player, UI_REPORT_RAITING_PLAYER_PANEL);
                    CuiHelper.DestroyUi(player, UI_REPORT_PLAYER_ALERT);
                }
            }
            private void Building_Bacgkround() {
                CuiElementContainer container = new CuiElementContainer();
                container.Add(new CuiPanel {
                    CursorEnabled = true, Image = {
                        Color = "0 0 0 0"
                    }
                    , RectTransform = {
                        AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-459.83 -316.66", OffsetMax = "461.49 316.67"
                    }
                }
                , "Overlay", UI_REPORT_PANEL);
                container.Add(new CuiButton {
                    RectTransform = {
                        AnchorMin = "-100 -100", AnchorMax = "100 100"
                    }
                    , Button = {
                        Close = UI_REPORT_PANEL, Color = "0 0 0 0"
                    }
                    , Text = {
                        Text = ""
                    }
                }
                , UI_REPORT_PANEL);
                container.Add(new CuiElement {
                    Name = "PNG_BACKGORUND", Parent = UI_REPORT_PANEL, Components = {
                        new CuiRawImageComponent {
                            Color = config.ColorsSettings.MainColor, Png = ImageUi.GetImage(config.ImagesSettings.Background)
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0 0", AnchorMax = "1 1"
                        }
                    }
                }
                );
                container.Add(new CuiElement {
                    Name = "TitleUi", Parent = UI_REPORT_PANEL, Components = {
                        new CuiTextComponent {
                            Text = "%TITLE_NAME_REPORT_SYSTEM%", Font = "robotocondensed-regular.ttf", FontSize = 18, Align = TextAnchor.MiddleCenter, Color = config.ColorsSettings.MainColorText
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0 0.5", AnchorMax = "0 0.5", OffsetMin = "38.72 242.11", OffsetMax = "180.96 276.15"
                        }
                    }
                }
                );
                container.Add(new CuiPanel {
                    CursorEnabled = false, Image = {
                        Color = "0 0 0 0"
                    }
                    , RectTransform = {
                        AnchorMin = "0.5 1", AnchorMax = "0.5 1", OffsetMin = "-265.27 -93.21", OffsetMax = "224.90 -28.37"
                    }
                }
                , UI_REPORT_PANEL, "HeaderUI");
                container.Add(new CuiElement {
                    Name = "HeaderActionTitle", Parent = "HeaderUI", Components = {
                        new CuiTextComponent {
                            Text = "%TITLE_PLAYER_HEADER_TITLE_SEND_REPORT%", Font = "robotocondensed-regular.ttf", FontSize = 18, Align = TextAnchor.UpperLeft, Color = config.ColorsSettings.MainColorText
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-219.38 -21.38", OffsetMax = "-33.95 4.11"
                        }
                    }
                }
                );
                container.Add(new CuiElement {
                    Name = "HeaderActionDescription", Parent = "HeaderUI", Components = {
                        new CuiTextComponent {
                            Text = "%TITLE_PLAYER_HEADER_TITLE_DESC_SEND_REPORT%", Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.UpperLeft, Color = config.ColorsSettings.AdditionalColorText
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-219.38 0", OffsetMax = "-78.11 19.54"
                        }
                    }
                }
                );
                container.Add(new CuiElement {
                    Name = "HeaderSearchIcon", Parent = "HeaderUI", Components = {
                        new CuiRawImageComponent {
                            Color = config.ColorsSettings.MainColorText, Png = ImageUi.GetImage(config.ImagesSettings.Search)
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "136.33 -6.55", OffsetMax = "147 4.11"
                        }
                    }
                }
                );
                container.Add(new CuiPanel {
                    CursorEnabled = false, Image = {
                        Color = "0 0 0 0"
                    }
                    , RectTransform = {
                        AnchorMin = "1 0.5", AnchorMax = "1 0.5", OffsetMin = "-235.75 -288.17", OffsetMax = "-28.33 288.29"
                    }
                }
                , UI_REPORT_PANEL, "ProfilePanel");
                container.Add(new CuiElement {
                    Name = "AvatarUser", Parent = "ProfilePanel", Components = {
                        new CuiRawImageComponent {
                            Color = "1 1 1 1", Png = "%AVATAR_PLAYER%"
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0.5 1", AnchorMax = "0.5 1", OffsetMin = "-66.32 -51.29", OffsetMax = "-23.66 -8.63"
                        }
                    }
                }
                );
                container.Add(new Cui
// ... [Code preview truncated due to length. Full source in attached file] ...

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