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", "Mercury", "3.0.0")]
[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].LastB
// ... [Code preview truncated due to length. Full source in attached file] ...