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] ...