C#:
using System;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using Oxide.Game.Rust.Cui;
using Oxide.Core.Libraries.Covalence;
using ConVar;
using Newtonsoft.Json.Linq;
using Oxide.Core.Libraries;
using System.Linq;
using Oxide.Core.Plugins;
using System.Text;
namespace Oxide.Plugins {
[Info("IQReportSystem", "Mercury", "0.2.5")]
class IQReportSystem : RustPlugin {
/// <summary>
/// Обновление 0.2.4 :
/// - Добавил возможность записывать Demo игроков во время скрытой проверки афк и во время проверке (Если у вас их нет, значит у вас нет доступа к данной папке)
/// - Изменен метод форматирования сообщения из Lang
/// - Добавлена поддержка чекера ozProtect
/// - Поправлено растягивание UI при извращении с разрешением экрана
/// - Корректировка UI
/// - Добавлена поддержка будущего IQModalMenu ( Больше новостей на счёт моих наработках и IQModalMenu в моей группе вк - https://vk.com/mercurydev )
/// Обновление 0.2.5
/// - Поправлен UI
/// - Добавлена проверка синтаксиса на консольную команду call
/// - Добавлена возможность вызыать по нику и стимИд через команду call
/// /// </summary>
#region Reference
[PluginReference]
Plugin GameWerAC, ImageLibrary, MultiFighting, IQChat, Friends, IQPersonal, IQFakeActive, NoEscape, IQModalMenu, SLMenu;
#region Image Library
public string GetImage(string shortname, ulong skin = 0) => (string)ImageLibrary?.Call("GetImage", shortname, skin);
public bool AddImage(string url, string shortname, ulong skin = 0) => (bool)ImageLibrary?.Call("AddImage", url, shortname, skin);
#endregion
#region IQPersonal
public void SetCheck(BasePlayer player) => IQPersonal?.CallHook("API_SET_CHECK", player.userID);
public void SetBans(BasePlayer player) => IQPersonal?.CallHook("API_SET_BANS", player.userID);
public void SetScore(ulong UserID, int Amount) => IQPersonal?.CallHook("API_SET_SCORE", UserID, Amount);
public void RemoveScore(ulong UserID, int Amount) => IQPersonal?.CallHook("API_REMOVE_SCORE", UserID, Amount);
#endregion
#region NoEcape
public bool IsRaidBlocked(BasePlayer player) {
if (NoEscape) return (bool)NoEscape?.Call("IsRaidBlocked", player);
else return false;
}
#endregion
#region IQFakeActive
public bool IsFake(ulong userID) {
if (!IQFakeActive) return false;
if (!config.IQFakeActiveSettings.UseIQFakeActive) return false;
return (bool)IQFakeActive?.Call("IsFake", userID);
}
public string FindFakeName(ulong userID) => (string)IQFakeActive?.Call("FindFakeName", userID);
public void StartSysncFakeActive() => IQFakeActive?.Call("SyncReserved");
void SyncReservedFinish(string JSON) {
if (!config.IQFakeActiveSettings.UseIQFakeActive) return;
List<FakePlayer> ContentDeserialize = JsonConvert.DeserializeObject<List<FakePlayer>>(JSON);
PlayerBases = ContentDeserialize;
PrintWarning("IQReportSystem - успешно синхронизирована с IQFakeActive");
PrintWarning("=============SYNC==================");
}
public List<FakePlayer> PlayerBases = new List<FakePlayer>();
public class FakePlayer {
public ulong UserID;
public string DisplayName;
public string IQChatPreifx;
public string IQChatColorChat;
public string IQChatColorNick;
}
#endregion
#region IQModalMenu
bool IQModalMenuConnected() => (bool)IQModalMenu.Call("API_Connected_Plugin", this, config.Setting.IQModalMenuSettings.Avatar, config.Setting.IQModalMenuSettings.Sprite, "iq.report.modal");
bool IQModalMenuDisconnected() => (bool)IQModalMenu.Call("API_Disconnected_Plugin", this);
void IQModalSend(BasePlayer player) => IQModalMenu.Call("API_Send_Menu", player, this);
#endregion
#endregion
#region Vars
#region Permission
string PermissionModeration = "iqreportsystem.moderation";
string PermissionAdmin = "iqreportsystem.admin";
#endregion
#region Lists
public Dictionary<ulong, int> CooldownPC = new Dictionary<ulong, int>();
public Dictionary<ulong, PlayerSaveCheckClass> PlayerSaveCheck = new Dictionary<ulong, PlayerSaveCheckClass>();
public class PlayerSaveCheckClass {
public string Discord;
public string NickName;
public string StatusNetwork;
public ulong ModeratorID;
}
#endregion
#region JSON
private class Response {
public List<string> last_ip;
public string last_nick;
public List<ulong> another_accs;
public List<last_checks> last_check;
public class last_checks {
public ulong moderSteamID;
public string serverName;
public int time;
}
public List<RustCCBans> bans;
public class RustCCBans {
public int banID;
public string reason;
public string serverName;
public int OVHserverID;
public int banDate;
}
}
#endregion
#endregion
#region Configuration
private static Configuration config = new Configuration();
public class Configuration {
[JsonProperty("Основные настройки")]
public Settings Setting = new Settings();
[JsonProperty("Причины репорта")]
public List<string> ReasonReport = new List<string>();
[JsonProperty("Причины блокировки")]
public List<BanReason> ReasonBan = new List<BanReason>();
[JsonProperty("Настройки RustCheatCheck(Будет при проверке выдавать доступ в чекер и выводить информацию модератору)")]
public RCCSettings RCCSetting = new RCCSettings();
[JsonProperty("Настройки ozProtect, поддержка чекера ozProtect")]
public ozProtectSettings ozProtectSetting = new ozProtectSettings();
[JsonProperty("Настройка репутации для проверяющих")]
public RaitingSettings RaitingSetting = new RaitingSettings();
[JsonProperty("Настройка совместной работы с IQFakeActive")]
public IQFakeActive IQFakeActiveSettings = new IQFakeActive();
internal class BanReason {
[JsonProperty("Название")]
public string DisplayName;
[JsonProperty("Команда")]
public string Command;
}
internal class ozProtectSettings {
[JsonProperty("Включить поддержку ozProtect чекера")]
public bool ozPUse;
[JsonProperty("Ключ от ozProtect")]
public string Key;
}
internal class RCCSettings {
[JsonProperty("Включить поддержку RCC")]
public bool RCCUse;
[JsonProperty("Ключ от RCC")]
public string Key;
}
internal class RaitingSettings {
[JsonProperty("Сколько репутации снимать за 1-2 звезды(IQPersonal)")]
public int RemoveAmountOneTwo;
[JsonProperty("Сколько репутации давать за 3-4 звезды(IQPersonal)")]
public int GiveAmountThreeFour;
[JsonProperty("Сколько репутации давать за 5 звезд(IQPersonal)")]
public int GiveAmountFive;
}
internal class IQFakeActive {
[JsonProperty("Использовать IQFakeActive")]
public bool UseIQFakeActive;
}
internal class Settings {
[JsonProperty("Настройка IQModalMenu")]
public IQModalMenu IQModalMenuSettings = new IQModalMenu();
[JsonProperty("Настройки IQChat")]
public ChatSettings ChatSetting = new ChatSettings();
[JsonProperty("Настройки интерфейса")]
public InterfaceSetting Interface = new InterfaceSetting();
[JsonProperty("NoEscape: Перенести проверку игрока если у него есть рейдблок")]
public bool NoEscapeCheckStop;
[JsonProperty("Включение проверки на AFK(true - включена/false - выключена)(Если будет выключена - игроку сразу придет уведомление о проверки)")]
public bool AfkUse;
[JsonProperty("Включение записывания экрана игрока в demos сервера?")]
public bool DemosActivate;
[JsonProperty("Включить/отключить общее оповоещение для всех игроков(если игрока вызвали на проверку или вынесли вердикт,сообщение будет видно всем)")]
public bool UseAlertUsers;
[JsonProperty("Включить/отключить оповещение о максимальном кол-во репортов")]
public bool MaxReportAlert;
[JsonProperty("Максимальное количество репортов")]
public int MaxReport;
[JsonProperty("Перезарядка для отправки репорта(секунды)")]
public int CooldownTime;
[JsonProperty("Запретить друзьям репортить друг друга")]
public bool FriendNoReport;
[JsonProperty("Включить логирование в беседу ВК")]
public bool VKMessage;
[JsonProperty("Включить логирование в Discord")]
public bool DiscrodMessage;
[JsonProperty("Webhooks для дискорда")]
public string WebHook;
[JsonProperty("Настройки ВК")]
public VKSetting VKSettings = new VKSetting();
internal class ChatSettings {
[JsonProperty("IQChat : Кастомный префикс в чате")]
public string CustomPrefix;
[JsonProperty("IQChat : Кастомный аватар в чате(Если требуется)")]
public string CustomAvatar;
}
internal class VKSetting {
[JsonProperty("Токен от группы ВК(От группы будут идти сообщения в беседу.Вам нужно добавить свою группу в беседу!)")]
public string Token;
[JsonProperty("ID беседы для группы")]
public string ChatID;
}
internal class IQModalMenu {
[JsonProperty("Спрайт на кнопку в модальном меню")]
public string Sprite;
[JsonProperty("Ссылка на кнопку в модальном меню(имеет приоритет над спрайтом)")]
public string Avatar;
[JsonProperty("HEX : Для задней панели")]
public string HexPanel;
[JsonProperty("HEX : Для боковой панели")]
public string HexRightPanel;
[JsonProperty("Цвет текста в плагине")]
public string HexLabels;
[JsonProperty("Цвет кнопок боковой панели")]
public string HexButtonRightMenu;
[JsonProperty("Цвет кнопки у игрока для перехода к действию")]
public string HexPlayerButton;
[JsonProperty("Sprite кнопки у игрока для преехода к действию")]
public string SpritePlayerButton;
[JsonProperty("Спрайт для рейтинга(звезды)")]
public string SpriteRaiting;
[JsonProperty("Спрайт для кнопки жалоб в панели модератора")]
public string SpriteReportModeration;
[JsonProperty("Спрайт для иконки жалоб")]
public string SpriteReport;
[JsonProperty("HEX : Блюра для меню")]
public string HexBlurMute;
}
internal class InterfaceSetting {
[JsonProperty("Настройка интерфейса для отправки жалобы")]
public ReasonInterfaceSetting ReasonInterface = new ReasonInterfaceSetting();
[JsonProperty("Настройка интерфейса для уведомления")]
public AlertInterfaceSettings AlertInterface = new AlertInterfaceSettings();
[JsonProperty("Настройка интерфейса для мини-панели модератора")]
public ModeratorPanelInterfaceSettings ModderatorPanel = new ModeratorPanelInterfaceSettings();
[JsonProperty("Настройка интерфейса для рейтинга")]
public RaitingInterfaceSettings RaitingInterface = new RaitingInterfaceSettings();
[JsonProperty("Sprite для рейтинга(звезды)")]
public string SpriteRaiting;
[JsonProperty("Sprite для кнопки жалоб в панели модератора")]
public string SpriteReportModeration;
[JsonProperty("Sprite для иконки жалоб")]
public string SpriteReport;
[JsonProperty("Цвет текста в плагине")]
public string HexLabels;
[JsonProperty("Цвет боковой панели")]
public string HexRightMenu;
[JsonProperty("Цвет кнопок боковой панели")]
public string HexButtonRightMenu;
[JsonProperty("Цвет основной панели")]
public string HexMainPanel;
[JsonProperty("Цвет панели поиска и заднего фона игроков")]
public string HexSearchPanel;
[JsonProperty("Цвет кнопки у игрока для перехода к действию")]
public string HexPlayerButton;
[JsonProperty("Sprite кнопки у игрока для преехода к действию")]
public string SpritePlayerButton;
internal class ReasonInterfaceSetting {
[JsonProperty("Цвет основной панели")]
public string HexMain;
[JsonProperty("Цвет панели с заголовком")]
public string HexTitlePanel;
[JsonProperty("Цвет жалоб")]
public string HexButton;
[JsonProperty("Цвет текста с жалобами")]
public string HexLabel;
[JsonProperty("Sprite кнопки закрыть")]
public string SpriteClose;
[JsonProperty("Sprite панели с заголовком")]
public string SpriteTitlePanel;
[JsonProperty("Цвет кнопки закрыть")]
public string HexClose;
}
internal class AlertInterfaceSettings {
[JsonProperty("Цвет основной панели")]
public string HexMain;
[JsonProperty("Цвет заголовка и полоски")]
public string HexTitle;
[JsonProperty("Цвет текста")]
public string HexLabel;
}
internal class ModeratorPanelInterfaceSettings {
[JsonProperty("Цвет основной панели")]
public string HexMain;
[JsonProperty("Цвет панели с заголовком")]
public string HexTitlePanel;
[JsonProperty("Sprite панели с заголовком")]
public string SpriteTitlePanel;
[JsonProperty("Цвет текста")]
public string HexLabel;
[JsonProperty("Цвет кнопки вердикт и задний фон причин")]
public string HexBanButton;
[JsonProperty("Цвет кнопки окончания проверки")]
public string HexStopButton;
}
internal class RaitingInterfaceSettings {
[JsonProperty("Цвет основной панели")]
public string HexMain;
[JsonProperty("Цвет панели с заголовком")]
public string HexTitlePanel;
[JsonProperty("Sprite панели с заголовком")]
public string SpriteTitlePanel;
[JsonProperty("Цвет текста")]
public string HexLabel;
[JsonProperty("Цвет иконок с рейтингом")]
public string HexRaitingButton;
[JsonProperty("Sprite рейтинга")]
public string SpriteRaiting;
}
}
}
public static Configuration GetNewConfiguration() {
return new Configuration {
Setting = new Settings {
AfkUse = true, DemosActivate = false, NoEscapeCheckStop = false, UseAlertUsers = true, FriendNoReport = false, MaxReport = 3, MaxReportAlert = true, CooldownTime = 600, VKMessage = true, DiscrodMessage = false, WebHook = "", ChatSetting = new Settings.ChatSettings {
CustomAvatar = "", CustomPrefix = ""
}
, VKSettings = new Settings.VKSetting {
Token = "", ChatID = ""
}
, IQModalMenuSettings = new Settings.IQModalMenu {
Sprite = "assets/icons/broadcast.png", Avatar = "", HexPanel = "#3B3A2EFF", HexRightPanel = "#1c211b", HexLabels = "#efedee", HexButtonRightMenu = "#252a24", SpriteRaiting = "assets/icons/favourite_servers.png", SpriteReportModeration = "assets/icons/subtract.png", SpriteReport = "assets/icons/examine.png", SpritePlayerButton = "assets/icons/vote_up.png", HexPlayerButton = "#45542BFF", HexBlurMute = "#3B3A2E71",
}
, Interface = new Settings.InterfaceSetting {
SpriteRaiting = "assets/icons/favourite_servers.png", SpriteReportModeration = "assets/icons/subtract.png", SpriteReport = "assets/icons/examine.png", SpritePlayerButton = "assets/icons/vote_up.png", HexPlayerButton = "#45542BFF", HexLabels = "#DAD1C7FF", HexButtonRightMenu = "#802A2AFF", HexMainPanel = "#21211AF2", HexRightMenu = "#762424FF", HexSearchPanel = "#3B3D37FF", ReasonInterface = new Settings.InterfaceSetting.ReasonInterfaceSetting {
HexMain = "#585450FF", HexTitlePanel = "#54514DFF", HexButton = "#3E482EFF", HexClose = "#B4371EFF", HexLabel = "#bdd197", SpriteClose = "assets/icons/vote_down.png", SpriteTitlePanel = "assets/icons/connection.png"
}
, AlertInterface = new Settings.InterfaceSetting.AlertInterfaceSettings {
HexMain = "#21211AF2", HexLabel = "#DAD1C7FF", HexTitle = "#B4371EFF",
}
, ModderatorPanel = new Settings.InterfaceSetting.ModeratorPanelInterfaceSettings {
HexMain = "#575450FF", HexTitlePanel = "#54514DFF", HexLabel = "#DAD1C7FF", SpriteTitlePanel = "assets/icons/study.png", HexBanButton = "#B4371EFF", HexStopButton = "#3E482EFF"
}
, RaitingInterface = new Settings.InterfaceSetting.RaitingInterfaceSettings {
HexMain = "#575450FF", HexTitlePanel = "#54514DFF", HexLabel = "#DAD1C7FF", HexRaitingButton = "#cdb980", SpriteTitlePanel = "assets/icons/ignite.png", SpriteRaiting = "assets/icons/favourite_servers.png"
}
}
}
, ReasonReport = new List<string> {
"Использование читов", "Макросы", "Игра 3+",
}
, ReasonBan = new List<BanReason> {
new BanReason {
DisplayName = "Использование читов", Command = "ban {0} soft",
}
, new BanReason {
DisplayName = "Макросы", Command = "ban {0} 30d macros",
}
, new BanReason {
DisplayName = "Игра 3+", Command = "ban {0} 14d 3+",
}
, new BanReason {
DisplayName = "Отказ", Command = "ban {0} 7d otkaz",
}
,
}
, RCCSetting = new RCCSettings {
RCCUse = false, Key = "xxxxxxxxxxxxxxRCCKey",
}
, ozProtectSetting = new ozProtectSettings {
ozPUse = false, Key = "xxxozProtectIDxxx",
}
, IQFakeActiveSettings = new IQFakeActive {
UseIQFakeActive = false,
}
, RaitingSetting = new RaitingSettings {
RemoveAmountOneTwo = 4, GiveAmountThreeFour = 3, GiveAmountFive = 5
}
}
;
}
}
protected override void LoadConfig() {
base.LoadConfig();
try {
config = Config.ReadObject<Configuration>();
if (config == null) LoadDefaultConfig();
if(config.ozProtectSetting == null) {
config.ozProtectSetting = new Configuration.ozProtectSettings {
Key = "", ozPUse = false,
}
;
}
if(config.Setting.IQModalMenuSettings == null) {
config.Setting.IQModalMenuSettings = new Configuration.Settings.IQModalMenu {
Sprite = "assets/icons/broadcast.png", Avatar = "", HexPanel = "#3B3A2EFF", HexRightPanel = "#1c211b", HexLabels = "#efedee", HexButtonRightMenu = "#252a24", SpriteRaiting = "assets/icons/favourite_servers.png", SpriteReportModeration = "assets/icons/subtract.png", SpriteReport = "assets/icons/examine.png", SpritePlayerButton = "assets/icons/vote_up.png", HexPlayerButton = "#45542BFF", HexBlurMute = "#3B3A2EC4",
}
;
}
if (config.Setting.IQModalMenuSettings.Sprite == null) config.Setting.IQModalMenuSettings.Sprite = "assets/icons/broadcast.png";
if (config.Setting.IQModalMenuSettings.Avatar == null) config.Setting.IQModalMenuSettings.Avatar = "";
if (config.Setting.IQModalMenuSettings.HexPanel == null) config.Setting.IQModalMenuSettings.HexPanel = "#3B3A2EFF";
if (config.Setting.IQModalMenuSettings.HexRightPanel == null) config.Setting.IQModalMenuSettings.HexRightPanel = "#1c211b";
if (config.Setting.IQModalMenuSettings.HexButtonRightMenu == null) config.Setting.IQModalMenuSettings.HexButtonRightMenu = "#252a24";
if (config.Setting.IQModalMenuSettings.HexLabels == null) config.Setting.IQModalMenuSettings.HexLabels = "#efedee";
if (config.Setting.IQModalMenuSettings.SpriteRaiting == null) config.Setting.IQModalMenuSettings.SpriteRaiting = "assets/icons/favourite_servers.png";
if (config.Setting.IQModalMenuSettings.SpriteReportModeration == null) config.Setting.IQModalMenuSettings.SpriteReportModeration = "assets/icons/subtract.png";
if (config.Setting.IQModalMenuSettings.SpriteReport == null) config.Setting.IQModalMenuSettings.SpriteReport = "assets/icons/examine.png";
if (config.Setting.IQModalMenuSettings.SpritePlayerButton == null) config.Setting.IQModalMenuSettings.SpritePlayerButton = "assets/icons/vote_up.png";
if (config.Setting.IQModalMenuSettings.HexPlayerButton == null) config.Setting.IQModalMenuSettings.HexPlayerButton = "#45542BFF";
if (config.Setting.IQModalMenuSettings.HexBlurMute == null) config.Setting.IQModalMenuSettings.HexBlurMute = "#3B3A2EC4";
}
catch {
PrintWarning($"Ошибка чтения конфигурации #93 'oxide/config/{Name}', создаём новую конфигурацию!!");
LoadDefaultConfig();
}
NextTick(SaveConfig);
}
protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
protected override void SaveConfig() => Config.WriteObject(config);
#endregion
#region Data
public Dictionary<ulong, PlayerInfo> ReportInformation = new Dictionary<ulong, PlayerInfo>();
public Dictionary<ulong, ModeratorInfo> ModeratorInformation = new Dictionary<ulong, ModeratorInfo>();
public class PlayerInfo {
[JsonProperty("Отображаемое имя")]
public string DisplayName;
[JsonProperty("IP Адреса")]
public List<string> IP;
[JsonProperty("Последняя жалоба")]
public string LastReport;
[JsonProperty("Последний проверяющий модератор")]
public string LastCheckModerator;
[JsonProperty("Количество проверок")]
public int CheckCount;
[JsonProperty("История жалоб")]
public List<string> ReportHistory;
[JsonProperty("Количество жалоб")]
public int ReportCount;
[JsonProperty("Игровой статус")]
public string GameStatus;
}
public class ModeratorInfo {
[JsonProperty("Проверки игроков с вердиктами")]
public Dictionary<string, string> CheckPlayerModerator = new Dictionary<string, string>();
[JsonProperty("Блокировки игроков с вердиктом")]
public Dictionary<string, string> BanPlayerModerator = new Dictionary<string, string>();
[JsonProperty("Общее количество проверок")]
public int CheckCount;
[JsonProperty("История оценок модератора")]
public List<int> Arrayrating;
[JsonProperty("Средняя оценка качества")]
public float AverageRating;
}
#endregion
#region Metods
#region MetodsReport
void Metods_PlayerConnected(BasePlayer player) {
if (player == null) return;
if (!ReportInformation.ContainsKey(player.userID)) {
PlayerInfo pInfo = new PlayerInfo {
DisplayName = player.displayName, IP = new List<string>(), LastReport = "", LastCheckModerator = "", CheckCount = 0, ReportCount = 0, GameStatus = IsSteam(player.UserIDString), ReportHistory = new List<string>(),
}
;
ReportInformation.Add(player.userID, pInfo);
}
else {
var User = ReportInformation[player.userID];
var IP = covalence.Players.FindPlayerById(player.UserIDString).Address;
User.GameStatus = IsSteam(player.UserIDString);
if (!String.IsNullOrWhiteSpace(IP)) if (!User.IP.Contains(IP)) User.IP.Add(IP);
}
if (permission.UserHasPermission(player.UserIDString, PermissionModeration)) {
if (!ModeratorInformation.ContainsKey(player.userID)) {
ModeratorInfo mInfo = new ModeratorInfo {
CheckCount = 0, BanPlayerModerator = new Dictionary<string, string>(), CheckPlayerModerator = new Dictionary<string, string>(), Arrayrating = new List<int>(), AverageRating = 0,
}
;
ModeratorInformation.Add(player.userID, mInfo);
}
}
else {
if (ModeratorInformation.ContainsKey(player.userID)) ModeratorInformation.Remove(player.userID);
}
Metods_StatusNetwork(player, GetLang("NETWORD_STATUS_ONLINE", player.UserIDString));
}
void Metods_Report(BasePlayer target, int ReasonIndex) {
if (permission.UserHasPermission(target.UserIDString, PermissionAdmin)) return;
if (IsSteam(target.UserIDString) == GetLang("IS_STEAM_STATUS_PIRATE", target.UserIDString)) {
if (GameWerAC != null) {
GameWerAC.Call("GetScreenReport", target);
Puts("Выполнен скриншот экрана для пирата");
}
}
string ReasonReport = config.ReasonReport[ReasonIndex];
var User = ReportInformation[target.userID];
User.ReportCount++;
User.LastReport = ReasonReport;
User.ReportHistory.Insert(0, ReasonReport);
if (config.Setting.MaxReportAlert) if (User.ReportCount >= config.Setting.MaxReport) {
foreach (var MList in BasePlayer.activePlayerList) if (permission.UserHasPermission(MList.UserIDString, PermissionModeration)) SendChat(MList, GetLang("METODS_HELP_MODERS", MList.UserIDString, target.displayName, User.ReportCount));
VKSendMessage(GetLang("METODS_HELP_MODERS_VK", null, target.displayName, User.ReportCount));
DiscordSendMessage(GetLang("METODS_HELP_MODERS_VK", null, target.displayName, User.ReportCount));
}
}
#endregion
#region MetodsCooldown
void Metods_GiveCooldown(ulong ID, int cooldown) {
CooldownPC[ID] = cooldown + (int)CurrentTime();
}
bool Metods_GetCooldown(ulong ID) {
if (!CooldownPC.ContainsKey(ID) || Math.Max(0, CooldownPC[ID]) < 1 || CooldownPC[ID] <= (int)CurrentTime()) return false;
else return true;
}
#endregion
#region MetodsModeration
void Metods_CheckModeration(BasePlayer Suspect, BasePlayer Moderator) {
if (PlayerSaveCheck.ContainsKey(Suspect.userID)) {
if (IQModalMenu) AlertModal(Moderator, GetLang("PLAYER_CHECKED_IQMODAL", Moderator.UserIDString));
else SendChat(Moderator, GetLang("PLAYER_CHECKED", Moderator.UserIDString));
return;
}
if (config.Setting.NoEscapeCheckStop) if (IsRaidBlocked(Suspect)) {
if (IQModalMenu) AlertModal(Moderator, GetLang("RAID_BLOCK_TRUE_STOP_IQMODAL", Moderator.UserIDString, Moderator.UserIDString));
else SendChat(Moderator, GetLang("RAID_BLOCK_TRUE_STOP", Moderator.UserIDString, Moderator.UserIDString));
return;
}
PlayerSaveCheck.Add(Suspect.userID, new PlayerSaveCheckClass {
Discord = GetLang("DISCORD_NULL"), NickName = Suspect.displayName, StatusNetwork = GetLang("NETWORD_STATUS_ONLINE", null, Suspect.UserIDString), ModeratorID = Moderator.userID,
}
);
if (IQModalMenu) AlertModal(Moderator, GetLang("METODS_MODER_START_CHECK_IQMODAL", Moderator.UserIDString, Suspect.displayName));
else SendChat(Moderator, GetLang("METODS_MODER_START_CHECK", Moderator.UserIDString, Suspect.displayName));
VKSendMessage(GetLang("METODS_MODER_START_CHECK_VK", null, Moderator.displayName, Moderator.UserIDString, Suspect.displayName, Suspect.UserIDString));
Metods_AFK(Suspect.userID, Moderator);
if(config.Setting.UseAlertUsers) foreach(var p in BasePlayer.activePlayerList) SendChat(p, GetLang("METODS_MODER_START_CHECK_VK", p.UserIDString, Moderator.displayName, Moderator.UserIDString, Suspect.displayName, Suspect.UserIDString));
}
void Metods_CheckModerationFinish(BasePlayer moderator, ulong SuspectID) {
IPlayer Suspect = covalence.Players.FindPlayerById(SuspectID.ToString());
if (Suspect.IsConnected) {
BasePlayer SOnline = BasePlayer.FindByID(ulong.Parse(Suspect.Id));
CuiHelper.DestroyUi(SOnline, PARENT_UI_ALERT_SEND);
SendChat(SOnline, GetLang("MSG_CHECK_CHECK_STOP", moderator.UserIDString));
}
CuiHelper.DestroyUi(moderator, PARENT_UI_MODERATOR_MINI_PANEL);
PlayerSaveCheck.Remove(ulong.Parse(Suspect.Id));
var User = ReportInformation[ulong.Parse(Suspect.Id)];
var Moderator = ModeratorInformation[moderator.userID];
Moderator.CheckCount++;
if (!Moderator.CheckPlayerModerator.ContainsKey(Suspect.Name)) Moderator.CheckPlayerModerator.Add(Suspect.Name, User.LastReport);
User.ReportCount = 0;
User.ReportHistory.Clear();
User.LastReport = GetLang("NON_REPORT");
User.CheckCount++;
User.LastCheckModerator = moderator.displayName;
SendChat(moderator, GetLang("METODS_MODER_STOP_CHECK", moderator.UserIDString));
VKSendMessage(GetLang("METODS_MODER_STOP_CHECK_VK", null, moderator.displayName));
DiscordSendMessage(GetLang("METODS_MODER_STOP_CHECK_VK", null, moderator.displayName));
SetCheck(moderator);
if (config.Setting.UseAlertUsers) foreach (var p in BasePlayer.activePlayerList) SendChat(p, GetLang("METODS_MODER_STOP_CHECK_ALERT", p.UserIDString, moderator.displayName, Suspect.Name));
if (config.Setting.DemosActivate) if (BasePlayer.FindByID(SuspectID) != null) BasePlayer.FindByID(SuspectID).StopDemoRecording();
}
void Metods_StatusNetwork(BasePlayer Suspect, string Reason) {
if (Suspect == null) return;
if (PlayerSaveCheck.ContainsKey(Suspect.userID)) {
if (Suspect.IsConnected) if (Suspect.IsReceivingSnapshot) {
timer.Once(3, () => Metods_StatusNetwork(Suspect, GetLang("NETWORD_STATUS_ONLINE", null)));
return;
}
PlayerSaveCheck[Suspect.userID].StatusNetwork = Reason;
BasePlayer Moderator = BasePlayer.FindByID(PlayerSaveCheck[Suspect.userID].ModeratorID);
CuiHelper.DestroyUi(Moderator, UI_MODERATION_CHECK_MENU_NETWORK);
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiLabel {
RectTransform = {
AnchorMin = "0.6782616 0.5478261", AnchorMax = "0.9884076 0.7333333"
}
, Text = {
Text = $"{PlayerSaveCheck[Suspect.userID].StatusNetwork}", FontSize = 12, Font = "robotocondensed-regular.ttf", Align = TextAnchor.UpperCenter, Color = HexToRustFormat("#FFFFFFFF")
}
}
, PARENT_UI_MODERATOR_MINI_PANEL, UI_MODERATION_CHECK_MENU_NETWORK);
CuiHelper.AddUi(Moderator, container);
UI_AlertSendPlayer(Suspect);
SendChat(Moderator, GetLang("STATUS_CHANGED", Moderator.UserIDString, Suspect.displayName, Reason));
VKSendMessage(GetLang("STATUS_CHANGED_VK", null, Suspect.displayName, Reason));
DiscordSendMessage(GetLang("STATUS_CHANGED_VK", null, Suspect.displayName, Reason));
}
}
public Timer ModerTimeOutTimer;
void Metods_ModeratorExitCheck(BasePlayer Moderator) {
foreach (var ModeratorCritical in PlayerSaveCheck) if (ModeratorCritical.Value.ModeratorID == Moderator.userID) {
IPlayer ModeratorOffline = covalence.Players.FindPlayerById(ModeratorCritical.Value.ModeratorID.ToString());
IPlayer Suspect = covalence.Players.FindPlayerById(ModeratorCritical.Key.ToString());
int TimeOutCount = 0;
ModerTimeOutTimer = timer.Repeat(5, 10, () => {
if (ModeratorOffline.IsConnected) {
UI_MiniPanelModerator(Moderator, ModeratorCritical.Key);
SendChat(Moderator, GetLang("MODERATOR_RETURN_WELCOME", Moderator.UserIDString));
if (ModerTimeOutTimer != null) {
ModerTimeOutTimer.Destroy();
ModerTimeOutTimer = null;
}
return;
}
else {
TimeOutCount++;
if (TimeOutCount >= 10) {
PlayerSaveCheck.Remove(ModeratorCritical.Key);
foreach (var OnlineModeration in BasePlayer.activePlayerList) if (permission.UserHasPermission(OnlineModeration.UserIDString, PermissionModeration)) if (Suspect.IsConnected) {
BasePlayer SOnline = BasePlayer.FindByID(ulong.Parse(Suspect.Id));
CuiHelper.DestroyUi(SOnline, PARENT_UI_ALERT_SEND);
SendChat(SOnline, GetLang("MODERATOR_DISCONNECTED_STOP_CHECK", Moderator.UserIDString, ModeratorOffline.Name));
SendChat(OnlineModeration, GetLang("MODERATOR_DISCONNECTED_STOP_RESEND", Moderator.UserIDString, ModeratorOffline.Name, Suspect.Name));
VKSendMessage(GetLang("MODERATOR_DISCONNECTED_STOP_RESEND", null, ModeratorOffline.Name, Suspect.Name));
DiscordSendMessage(GetLang("MODERATOR_DISCONNECTED_STOP_RESEND", null, ModeratorOffline.Name, Suspect.Name));
if (ModerTimeOutTimer != null) {
ModerTimeOutTimer.Destroy();
ModerTimeOutTimer = null;
}
}
return;
}
}
}
);
}
}
void Metods_ModeratorBanned(BasePlayer Moderator, ulong SuspectID, int i) {
CuiHelper.DestroyUi(Moderator, PARENT_UI_MODERATOR_MINI_PANEL);
IPlayer Suspect = covalence.Players.FindPlayerById(SuspectID.ToString());
string Reason = config.ReasonBan[i].DisplayName;
rust.RunClientCommand(Moderator, String.Format(config.ReasonBan[i].Command, SuspectID));
PlayerSaveCheck.Remove(SuspectID);
var ModeratorInfo = ModeratorInformation[Moderator.userID];
ModeratorInfo.CheckCount++;
if (!ModeratorInfo.CheckPlayerModerator.ContainsKey(Suspect.Name)) ModeratorInfo.CheckPlayerModerator.Add(Suspect.Name, Reason);
if (!ModeratorInfo.BanPlayerModerator.ContainsKey(Suspect.Name)) ModeratorInfo.BanPlayerModerator.Add(Suspect.Name, Reason);
SendChat(Moderator, GetLang("MODERATOR_COMPLETED_CHECK", Moderator.UserIDString, Reason));
VKSendMessage(GetLang("MODERATOR_COMPLETED_CHECK_VK", null, Moderator.displayName, Moderator.UserIDString, Suspect.Name, SuspectID, Reason));
DiscordSendMessage(GetLang("MODERATOR_COMPLETED_CHECK_VK", null, Moderator.displayName, Moderator.UserIDString, Suspect.Name, SuspectID, Reason));
SetBans(Moderator);
if (config.Setting.UseAlertUsers) foreach (var p in BasePlayer.activePlayerList) SendChat(p, GetLang("MODERATOR_COMPLETED_CHECK_ALERT", p.UserIDString, Moderator.displayName, Suspect.Name, Reason));
}
#endregion
#region MetodsAFK
void Metods_CheckStopInAFK(BasePlayer moderator, string ID) {
IPlayer Suspect = covalence.Players.FindPlayerById(ID);
if (Suspect.IsConnected) {
BasePlayer SOnline = BasePlayer.FindByID(ulong.Parse(Suspect.Id));
CuiHelper.DestroyUi(SOnline, PARENT_UI_ALERT_SEND);
}
CuiHelper.DestroyUi(moderator, PARENT_UI_MODERATOR_MINI_PANEL);
PlayerSaveCheck.Remove(ulong.Parse(Suspect.Id));
SendChat(moderator, GetLang("PLAYER_AFK_CHECK_STOP", moderator.UserIDString));
VKSendMessage(GetLang("PLAYER_AFK_CHECK_STOP_VK", null, moderator.displayName, moderator.userID, Suspect.Name));
DiscordSendMessage(GetLang("PLAYER_AFK_CHECK_STOP_VK", null, moderator.displayName, moderator.userID, Suspect.Name));
if (config.Setting.DemosActivate) if (BasePlayer.FindByID(ulong.Parse(ID)) != null) BasePlayer.FindByID(ulong.Parse(ID)).StopDemoRecording();
}
public Dictionary<ulong, GenericPosition> AFKPositionTry = new Dictionary<ulong, GenericPosition>();
public Dictionary<ulong, int> AFKCheckedTry = new Dictionary<ulong, int>();
void Metods_AFK(ulong SuspectID, BasePlayer Moderator) {
if (config.Setting.AfkUse) {
IPlayer Suspect = covalence.Players.FindPlayerById(SuspectID.ToString());
if (!AFKCheckedTry.ContainsKey(SuspectID)) AFKCheckedTry.Add(SuspectID, 0);
else AFKCheckedTry[SuspectID] = 0;
StartAFKCheck(Suspect, Moderator);
}
else {
BasePlayer SuspectOnline = BasePlayer.FindByID(SuspectID);
if (SuspectOnline == null || !SuspectOnline.IsConnected) {
SendChat(Moderator, GetLang("PLAYER_LEAVE_AFK_METOD", Moderator.UserIDString));
CuiHelper.DestroyUi(Moderator, PARENT_UI_MODERATOR_MINI_PANEL);
if (PlayerSaveCheck.ContainsKey(SuspectID)) PlayerSaveCheck.Remove(SuspectID);
return;
}
if (config.Setting.DemosActivate) if(SuspectOnline != null) SuspectOnline.StartDemoRecording();
UI_AlertSendPlayer(SuspectOnline);
PlayerSaveCheck = new Dictionary<ulong, PlayerSaveCheckClass> {
[SuspectOnline.userID]
= new PlayerSaveCheckClass {
Discord = GetLang("DISCORD_NULL"), NickName = SuspectOnline.displayName, StatusNetwork = GetLang("NETWORD_STATUS_ONLINE", SuspectOnline.UserIDString), ModeratorID = Moderator.userID,
}
}
;
UI_MiniPanelModerator(Moderator, SuspectOnline.userID);
SendChat(Moderator, GetLang("PLAYER_NON_AFK", Moderator.UserIDString));
if (config.RCCSetting.RCCUse) {
string Key = config.RCCSetting.Key;
if (String.IsNullOrEmpty(Key)) return;
try {
string API = $"https://rustcheatcheck.ru/panel/api?action=addPlayer&key={Key}&player={SuspectID}";
webrequest.Enqueue(API, null, (code, response) => {
}
, this);
}
catch {
}
}
if (config.ozProtectSetting.ozPUse) {
string Key = config.ozProtectSetting.Key;
if (String.IsNullOrEmpty(Key)) return;
try {
string API = $"https://api.ozliginus.ru/ozprotect/addusertocheck?ozprotectid={Key}&minutes=15&checking={Moderator.UserIDString}&suspect={SuspectID}";
webrequest.Enqueue(API, null, (code, response) => {
Puts("[ozProtect][ozApi][Response]: " + response);
}
, this);
}
catch {
}
}
}
}
public void StartAFKCheck(IPlayer Suspect, BasePlayer Moderator) {
ulong SuspectID = ulong.Parse(Suspect.Id);
var Postion = Suspect.Position();
if (!AFKPositionTry.ContainsKey(SuspectID)) AFKPositionTry.Add(SuspectID, Postion);
if (config.Setting.DemosActivate) if (BasePlayer.FindByID(SuspectID) != null) BasePlayer.FindByID(SuspectID).StartDemoRecording();
int Try = 1;
timer.Repeat(5f, 5, () => {
Postion = Suspect.Position();
if (AFKPositionTry[SuspectID] != Postion) {
SendChat(Moderator, GetLang("PLAYER_AFK_CHANGE_POS", Moderator.UserIDString, Try));
AFKCheckedTry[SuspectID]++;
}
else SendChat(Moderator, GetLang("PLAYER_AFK_CHANGE_NO_POS", Moderator.UserIDString, Try));
AFKPositionTry[SuspectID] = Postion;
Try++;
}
);
timer.Once(30f, () => {
if(AFKCheckedTry[SuspectID] < 3) Metods_CheckStopInAFK(Moderator, Suspect.Id);
else {
BasePlayer SuspectOnline = BasePlayer.FindByID(ulong.Parse(Suspect.Id));
if (SuspectOnline == null || !SuspectOnline.IsConnected) {
SendChat(Moderator, GetLang("PLAYER_LEAVE_AFK_METOD", Moderator.UserIDString));
CuiHelper.DestroyUi(Moderator, PARENT_UI_MODERATOR_MINI_PANEL);
if (PlayerSaveCheck.ContainsKey(SuspectID)) PlayerSaveCheck.Remove(SuspectID);
return;
}
UI_AlertSendPlayer(SuspectOnline);
PlayerSaveCheck = new Dictionary<ulong, PlayerSaveCheckClass> {
[SuspectOnline.userID]
= new PlayerSaveCheckClass {
Discord = GetLang("DISCORD_NULL"), NickName = SuspectOnline.displayName, StatusNetwork = GetLang("NETWORD_STATUS_ONLINE"), ModeratorID = Moderator.userID,
}
}
;
UI_MiniPanelModerator(Moderator, SuspectOnline.userID);
SendChat(Moderator, GetLang("PLAYER_NON_AFK", Moderator.UserIDString));
if (config.RCCSetting.RCCUse) {
string Key = config.RCCSetting.Key;
if (String.IsNullOrEmpty(Key)) return;
try {
string API = $"https://rustcheatcheck.ru/panel/api?action=addPlayer&key={Key}&player={Suspect.Id}";
webrequest.Enqueue(API, null, (code, response) => {
}
, this);
}
catch {
}
}
if (config.ozProtectSetting.ozPUse) {
string Key = config.ozProtectSetting.Key;
if (String.IsNullOrEmpty(Key)) return;
try {
string API = $"https://api.ozliginus.ru/ozprotect/addusertocheck?ozprotectid={Key}&minutes=15&checking={Moderator.UserIDString}&suspect={SuspectID}";
webrequest.Enqueue(API, null, (code, response) => {
Puts("[ozProtect][ozApi][Response]: " + response);
}
, this);
}
catch {
}
}
}
if (AFKCheckedTry.ContainsKey(SuspectID)) AFKCheckedTry.Remove(SuspectID);
}
);
}
#endregion
#endregion
#region Comm
// ... [Code preview truncated due to length. Full source in attached file] ...