C#:
using System.Text.RegularExpressions;
using System.Linq;
using System.Collections.Generic;
using Facepunch;
using Newtonsoft.Json;
using System.Collections;
using UnityEngine;
using Newtonsoft.Json.Linq;
using CompanionServer;
using Oxide.Core.Libraries;
using Oxide.Game.Rust.Cui;
using Oxide.Core.Plugins;
using UnityEngine.Networking;
using System.IO;
using Oxide.Core.Libraries.Covalence;
using System.Text;
using ConVar;
using System;
using Oxide.Core;
namespace Oxide.Plugins {
[Info("IQChat", "sdapro", "2.11.53")]
[Description("The most pleasant chat for your server from the IQ system")]
class IQChat : RustPlugin {
private void DrawUI_IQChat_Alert(BasePlayer player, String Description, String Title = null) {
if (_interface == null) {
PrintWarning("Генерируем интерфейс, ожидайте сообщения об успешной генерации");
return;
}
String Interface = InterfaceBuilder.GetInterface("UI_Chat_Alert");
if (Interface == null) return;
Interface = Interface.Replace("%TITLE%", Title ?? GetLang("IQCHAT_ALERT_TITLE", player.UserIDString));
Interface = Interface.Replace("%DESCRIPTION%", Description);
CuiHelper.DestroyUi(player, InterfaceBuilder.UI_Chat_Alert);
CuiHelper.AddUi(player, Interface);
player.Invoke(() => {
CuiHelper.DestroyUi(player, InterfaceBuilder.UI_Chat_Alert);
}
, config.ControllerMessages.GeneralSetting.OtherSetting.TimeDeleteAlertUI);
}
void Init() {
ReadData();
}
public class User {
public Information Info = new Information();
public Setting Settings = new Setting();
public Mute MuteInfo = new Mute();
internal class Information {
public String Prefix;
public String ColorNick;
public String ColorMessage;
public String Rank;
public List<String> PrefixList = new List<String>();
}
internal class Setting {
public Boolean TurnPM = true;
public Boolean TurnAlert = true;
public Boolean TurnBroadcast = true;
public Boolean TurnSound = true;
public List<UInt64> IgnoreUsers = new List<UInt64>();
public Boolean IsIgnored(UInt64 TargetID) => IgnoreUsers.Contains(TargetID);
public void IgnoredAddOrRemove(UInt64 TargetID) {
if (IsIgnored(TargetID)) IgnoreUsers.Remove(TargetID);
else IgnoreUsers.Add(TargetID);
}
}
internal class Mute {
public Double TimeMuteChat;
public Double TimeMuteVoice;
public Double GetTime(MuteType Type) {
Double TimeMuted = 0;
switch (Type) {
case MuteType.Chat : TimeMuted = TimeMuteChat - CurrentTime;
break;
case MuteType.Voice : TimeMuted = TimeMuteVoice - CurrentTime;
break;
default : break;
}
return TimeMuted;
}
public void SetMute(MuteType Type, Int32 Time) {
switch (Type) {
case MuteType.Chat : TimeMuteChat = Time + CurrentTime;
break;
case MuteType.Voice : TimeMuteVoice = Time + CurrentTime;
break;
default : break;
}
}
public void UnMute(MuteType Type) {
switch (Type) {
case MuteType.Chat : TimeMuteChat = 0;
break;
case MuteType.Voice : TimeMuteVoice = 0;
break;
default : break;
}
}
public Boolean IsMute(MuteType Type) => GetTime(Type) > 0;
}
}
public List<String> KeyImages = new List<String> {
"UI_IQCHAT_CONTEXT_NO_RANK", "UI_IQCHAT_CONTEXT_RANK", "IQCHAT_INFORMATION_ICON", "IQCHAT_SETTING_ICON", "IQCHAT_IGNORE_INFO_ICON", "IQCHAT_MODERATION_ICON", "IQCHAT_ELEMENT_PANEL_ICON", "IQCHAT_ELEMENT_PREFIX_MULTI_TAKE_ICON", "IQCHAT_ELEMENT_SLIDER_ICON", "IQCHAT_ELEMENT_SLIDER_LEFT_ICON", "IQCHAT_ELEMENT_SLIDER_RIGHT_ICON", "IQCHAT_ELEMENT_DROP_LIST_OPEN_ICON", "IQCHAT_ELEMENT_DROP_LIST_OPEN_ARGUMENT_ICON", "IQCHAT_ELEMENT_DROP_LIST_OPEN_TAKED", "IQCHAT_ELEMENT_SETTING_CHECK_BOX", "IQCHAT_ALERT_PANEL", "IQCHAT_MUTE_AND_IGNORE_PANEL", "IQCHAT_MUTE_AND_IGNORE_ICON", "IQCHAT_MUTE_AND_IGNORE_SEARCH", "IQCHAT_MUTE_AND_IGNORE_PAGE_PANEL", "IQCHAT_MUTE_AND_IGNORE_PLAYER", "IQCHAT_MUTE_AND_IGNORE_PLAYER_STATUS", "IQCHAT_IGNORE_ALERT_PANEL", "IQCHAT_IGNORE_ALERT_ICON", "IQCHAT_IGNORE_ALERT_BUTTON_YES", "IQCHAT_IGNORE_ALERT_BUTTON_NO", "IQCHAT_MUTE_ALERT_PANEL", "IQCHAT_MUTE_ALERT_ICON", "IQCHAT_MUTE_ALERT_PANEL_REASON",
}
;
[ChatCommand("pm")]
void PmChat(BasePlayer Sender, String cmd, String[] arg) {
Configuration.ControllerMessage ControllerMessages = config.ControllerMessages;
if (!ControllerMessages.TurnedFunc.PMSetting.PMActivate) return;
if (arg.Length == 0 || arg == null) {
ReplySystem(Sender, lang.GetMessage("COMMAND_PM_NOTARG", this, Sender.UserIDString));
return;
}
Configuration.ControllerMessage.TurnedFuncional.AntiNoob.Settings antiNoob = config.ControllerMessages.TurnedFunc.AntiNoobSetting.AntiNoobPM;
if (antiNoob.AntiNoobActivate) if (IsNoob(Sender.userID, antiNoob.TimeBlocked)) {
ReplySystem(Sender, GetLang("IQCHAT_INFO_ANTI_NOOB_PM", Sender.UserIDString, FormatTime(UserInformationConnection[Sender.userID].LeftTime(antiNoob.TimeBlocked), Sender.UserIDString)));
return;
}
String NameUser = arg[0];
if (config.ReferenceSetting.IQFakeActiveSettings.UseIQFakeActive) if (IQFakeActive) if (IsFake(NameUser)) {
ReplySystem(Sender, GetLang("COMMAND_PM_SUCCESS", Sender.UserIDString, string.Join(" ", arg.ToArray()).Replace(NameUser, ""), NameUser));
return;
}
BasePlayer TargetUser = GetPlayerNickOrID(NameUser);
if (TargetUser == null || NameUser == null || !UserInformation.ContainsKey(TargetUser.userID)) {
ReplySystem(Sender, GetLang("COMMAND_PM_NOT_USER", Sender.UserIDString));
return;
}
User InfoTarget = UserInformation[TargetUser.userID];
User InfoSender = UserInformation[Sender.userID];
if (!InfoTarget.Settings.TurnPM) {
ReplySystem(Sender, GetLang("FUNC_MESSAGE_PM_TURN_FALSE", Sender.UserIDString));
return;
}
if (ControllerMessages.TurnedFunc.IgnoreUsePM) {
if (InfoTarget.Settings.IsIgnored(Sender.userID)) {
ReplySystem(Sender, GetLang("IGNORE_NO_PM", Sender.UserIDString));
return;
}
if (InfoSender.Settings.IsIgnored(TargetUser.userID)) {
ReplySystem(Sender, GetLang("IGNORE_NO_PM_ME", Sender.UserIDString));
return;
}
}
String Message = GetMessageInArgs(Sender, arg.Skip(1).ToArray());
if (Message == null || Message.Length <= 0) {
ReplySystem(Sender, GetLang("COMMAND_PM_NOT_NULL_MSG", Sender.UserIDString));
return;
}
Message = Message.EscapeRichText();
if (Message.Length > 125) return;
PMHistory[TargetUser] = Sender;
PMHistory[Sender] = TargetUser;
GeneralInformation.RenameInfo RenamerSender = GeneralInfo.GetInfoRename(Sender.userID);
GeneralInformation.RenameInfo RenamerTarget = GeneralInfo.GetInfoRename(TargetUser.userID);
String DisplayNameSender = RenamerSender != null ? RenamerSender.RenameNick ?? Sender.displayName : Sender.displayName;
String TargetDisplayName = RenamerTarget != null ? RenamerTarget.RenameNick ?? TargetUser.displayName : TargetUser.displayName;
ReplySystem(TargetUser, GetLang("COMMAND_PM_SEND_MSG", TargetUser.UserIDString, DisplayNameSender, Message));
ReplySystem(Sender, GetLang("COMMAND_PM_SUCCESS", Sender.UserIDString, Message, TargetDisplayName));
if (InfoTarget.Settings.TurnSound) Effect.server.Run(ControllerMessages.TurnedFunc.PMSetting.SoundPM, TargetUser.GetNetworkPosition());
Log(LanguageEn ? $"PRIVATE MESSAGES : {Sender.userID}({Sender.displayName}) sent a message to the player - {TargetUser.displayName}({TargetDisplayName})\nMESSAGE : {Message}" : $"ЛИЧНЫЕ СООБЩЕНИЯ : {Sender.userID}({Sender.displayName}) отправил сообщение игроку - {TargetUser.displayName}({TargetDisplayName})\nСООБЩЕНИЕ : {Message}");
DiscordLoggPM(Sender, TargetUser, Message);
RCon.Broadcast(RCon.LogType.Chat, new Chat.ChatEntry {
Message = LanguageEn ? $"PRIVATE MESSAGES : {Sender.displayName}({Sender.userID}) -> {TargetUser.displayName} : MESSAGE : {Message}" : $"ЛИЧНЫЕ СООБЩЕНИЯ : {Sender.displayName}({Sender.userID}) -> {TargetUser.displayName} : СООБЩЕНИЕ : {Message}", UserId = Sender.UserIDString, Username = Sender.displayName, Channel = Chat.ChatChannel.Global, Time = (DateTime.UtcNow.Hour * 3600) + (DateTime.UtcNow.Minute * 60), Color = "#3f4bb8",
}
);
PrintWarning(LanguageEn ? $"PRIVATE MESSAGES : {Sender.displayName}({Sender.userID}) -> {TargetUser.displayName} : MESSAGE : {Message}" : $"ЛИЧНЫЕ СООБЩЕНИЯ : {Sender.displayName}({Sender.userID}) -> {TargetUser.displayName} : СООБЩЕНИЕ : {Message}");
}
Boolean API_CHECK_MUTE_CHAT(UInt64 ID) {
if (!UserInformation.ContainsKey(ID)) return false;
return UserInformation[ID].MuteInfo.IsMute(MuteType.Chat);
}
public String FormatTime(Double Second, String UserID = null) {
TimeSpan time = TimeSpan.FromSeconds(Second);
String Result = String.Empty;
String Days = GetLang("TITLE_FORMAT_DAYS", UserID);
String Hourse = GetLang("TITLE_FORMAT_HOURSE", UserID);
String Minutes = GetLang("TITLE_FORMAT_MINUTES", UserID);
String Seconds = GetLang("TITLE_FORMAT_SECONDS", UserID);
if (time.Seconds != 0) Result = $"{Format(time.Seconds, Seconds, Seconds, Seconds)}";
if (time.Minutes != 0) Result = $"{Format(time.Minutes, Minutes, Minutes, Minutes)}";
if (time.Hours != 0) Result = $"{Format(time.Hours, Hourse, Hourse, Hourse)}";
if (time.Days != 0) Result = $"{Format(time.Days, Days, Days, Days)}";
return Result;
}
String API_GET_DEFAULT_NICK_COLOR() => config.ControllerConnect.SetupDefaults.NickDefault;
private void AlertController(BasePlayer player) {
Configuration.ControllerAlert.Alert Alert = config.ControllerAlertSetting.AlertSetting;
Configuration.ControllerAlert.AdminSession AlertSessionAdmin = config.ControllerAlertSetting.AdminSessionSetting;
Configuration.ControllerAlert.PlayerSession AlertSessionPlayer = config.ControllerAlertSetting.PlayerSessionSetting;
Configuration.ControllerAlert.PersonalAlert AlertPersonal = config.ControllerAlertSetting.PersonalAlertSetting;
GeneralInformation.RenameInfo RenameInformation = GeneralInfo.GetInfoRename(player.userID);
Configuration.ControllerMessage ControllerMessage = config.ControllerMessages;
String DisplayName = player.displayName;
if (ControllerMessage.Formatting.ControllerNickname.UseNickController) foreach (String DetectedBadNick in DisplayName.Split(' ')) {
if (ControllerMessage.Formatting.ControllerNickname.BadNicks.Count(x => x.ToLower() == DetectedBadNick.ToLower()) > 0) DisplayName = DisplayName.Replace(DetectedBadNick, ControllerMessage.Formatting.ControllerNickname.ReplaceBadNick);
}
UInt64 UserID = player.userID;
if (RenameInformation != null) {
DisplayName = RenameInformation.RenameNick;
UserID = RenameInformation.RenameID;
}
if (AlertSessionPlayer.ConnectedAlert) {
if (!AlertSessionAdmin.ConnectedAlertAdmin) if (player.IsAdmin) return;
String Avatar = AlertSessionPlayer.ConnectedAvatarUse ? UserID.ToString() : String.Empty;
String Message = String.Empty;
if (AlertSessionPlayer.ConnectedWorld) {
webrequest.Enqueue("http://ip-api.com/json/" + player.net.connection.ipaddress.Split(':')[0], null, (code, response) => {
if (code != 200 || response == null) return;
String country = JsonConvert.DeserializeObject<Response>(response).Country;
if (AlertSessionPlayer.ConnectionAlertRandom) {
sb.Clear();
Message = sb.AppendFormat(GetMessages(player, AlertSessionPlayer.RandomConnectionAlert.LanguageMessages), DisplayName, country).ToString();
}
else Message = GetLang("WELCOME_PLAYER_WORLD", player.UserIDString, DisplayName, country);
if (!permission.UserHasPermission(player.UserIDString, PermissionHideConnection)) ReplyBroadcast(Message, "", Avatar);
Log($"[{player.userID}] {Message}");
}
, this);
}
else {
if (AlertSessionPlayer.ConnectionAlertRandom) {
sb.Clear();
Message = sb.AppendFormat(GetMessages(player, AlertSessionPlayer.RandomConnectionAlert.LanguageMessages), DisplayName).ToString();
}
else Message = GetLang("WELCOME_PLAYER", player.UserIDString, DisplayName);
if (!permission.UserHasPermission(player.UserIDString, PermissionHideConnection)) ReplyBroadcast(Message, "", Avatar);
Log($"[{player.userID}] {Message}");
}
}
if (AlertPersonal.UseWelcomeMessage) {
String WelcomeMessage = GetMessages(player, AlertPersonal.WelcomeMessage.LanguageMessages);
ReplySystem(player, WelcomeMessage);
}
}
String API_GET_NICK_COLOR(ulong ID) {
if (!UserInformation.ContainsKey(ID)) return String.Empty;
return UserInformation[ID].Info.ColorNick;
}
private Dictionary<BasePlayer, InformationOpenedUI> LocalBase = new Dictionary<BasePlayer, InformationOpenedUI>();
private void DrawUI_IQChat_Mute_Alert_Reasons(BasePlayer player, BasePlayer Target, MuteType Type, UInt64 IDFake = 0) {
String Interface = InterfaceBuilder.GetInterface("UI_Chat_Mute_Alert_DropList_Title");
if (Interface == null) return;
Interface = Interface.Replace("%TITLE%", GetLang("IQCHAT_BUTTON_MODERATION_MUTE_MENU_TITLE_ALERT_REASON", player.UserIDString));
CuiHelper.DestroyUi(player, "AlertMuteTitleReason");
CuiHelper.DestroyUi(player, "PanelMuteReason");
CuiHelper.AddUi(player, Interface);
List<Configuration.ControllerMute.Muted> Reasons = Type == MuteType.Chat ? config.ControllerMutes.MuteChatReasons : config.ControllerMutes.MuteVoiceReasons;
Int32 Y = 0;
foreach(Configuration.ControllerMute.Muted Reason in Reasons.Take(6)) DrawUI_IQChat_Mute_Alert_Reasons(player, Target, Reason.Reason, Y++, Type, IDFake);
}
[ConsoleCommand("alertuip")]
private void AlertUIPConsoleCommand(ConsoleSystem.Arg args) {
BasePlayer Sender = args.Player();
if (Sender != null) if (!permission.UserHasPermission(Sender.UserIDString, PermissionAlert)) return;
if (args.Args == null || args.Args.Length == 0) {
if (Sender != null) ReplySystem(Sender, LanguageEn ? "You didn't specify a player!" : "Вы не указали игрока!");
else PrintWarning(LanguageEn ? "You didn't specify a player!" : "Вы не указали игрока!");
return;
}
BasePlayer Recipient = BasePlayer.Find(args.Args[0]);
if (Recipient == null) {
if (Sender != null) ReplySystem(Sender, LanguageEn ? "The player is not on the server!" : "Игрока нет на сервере!");
else PrintWarning(LanguageEn ? "The player is not on the server!" : "Игрока нет на сервере!");
return;
}
AlertUI(Sender, Recipient, args.Args.Skip(1).ToArray());
}
String API_GET_CHAT_COLOR(UInt64 ID) {
if (!UserInformation.ContainsKey(ID)) return String.Empty;
return UserInformation[ID].Info.ColorMessage;
}
private void MigrateDataToNoob() {
if (config.ControllerMessages.TurnedFunc.AntiNoobSetting.AntiNoobPM.AntiNoobActivate || config.ControllerMessages.TurnedFunc.AntiNoobSetting.AntiNoobChat.AntiNoobActivate) {
if (UserInformationConnection.Count == 0 || UserInformationConnection == null) {
PrintWarning(LanguageEn ? "Migration of old players to Anti-Nub.." : "Миграция старых игроков в Анти-Нуб..");
foreach (KeyValuePair<UInt64, User> InfoUser in UserInformation.Where(x => !UserInformationConnection.ContainsKey(x.Key))) UserInformationConnection.Add(InfoUser.Key, new AntiNoob {
DateConnection = new DateTime(2022, 1, 1)
}
);
PrintWarning(LanguageEn ? "Migration of old players completed" : "Миграция старых игроков завершена");
}
}
}
String IQRankGetNameRankKey(string Key) => (string)(IQRankSystem?.Call("API_GET_RANK_NAME", Key));
private class InformationOpenedUI {
public List<Configuration.ControllerParameters.AdvancedFuncion> ElementsPrefix;
public List<Configuration.ControllerParameters.AdvancedFuncion> ElementsNick;
public List<Configuration.ControllerParameters.AdvancedFuncion> ElementsChat;
public List<Configuration.ControllerParameters.AdvancedFuncion> ElementsRanks;
public Int32 SlideIndexPrefix = 0;
public Int32 SlideIndexNick = 0;
public Int32 SlideIndexChat = 0;
public Int32 SlideIndexRank = 0;
}
private class ConfigurationOld {
[JsonProperty("Настройка информации о игроке")]
public ControllerConnection ControllerConnect = new ControllerConnection();
internal class ControllerConnection {
[JsonProperty("Перключатели функций")]
public Turned Turneds = new Turned();
[JsonProperty("Настройка стандартных значений")]
public SetupDefault SetupDefaults = new SetupDefault();
internal class SetupDefault {
[JsonProperty("Данный префикс установится если игрок впервые зашел на сервер или в случае окончания прав на префикс, который у него стоял ранее")]
public String PrefixDefault = "<color=#CC99FF>[ИГРОК]</color>";
[JsonProperty("Данный цвет ника установится если игрок впервые зашел на сервер или в случае окончания прав на цвет ника, который у него стоял ранее")]
public String NickDefault = "#33CCCC";
[JsonProperty("Данный цвет чата установится если игрок впервые зашел на сервер или в случае окончания прав на цвет чата, который у него стоял ранее")]
public String MessageDefault = "#0099FF";
}
internal class Turned {
[JsonProperty("Устанавливать автоматически префикс игроку, когда он получил права на него")]
public Boolean TurnAutoSetupPrefix;
[JsonProperty("Устанавливать автоматически цвет ника игроку, когда он получил права на него")]
public Boolean TurnAutoSetupColorNick;
[JsonProperty("Устанавливать автоматически цвет чата игроку, когда он получил права на него")]
public Boolean TurnAutoSetupColorChat;
[JsonProperty("Сбрасывать автоматически префикс при окончании прав на него у игрока")]
public Boolean TurnAutoDropPrefix;
[JsonProperty("Сбрасывать автоматически цвет ника при окончании прав на него у игрока")]
public Boolean TurnAutoDropColorNick;
[JsonProperty("Сбрасывать автоматически цвет чата при окончании прав на него у игрока")]
public Boolean TurnAutoDropColorChat;
}
}
[JsonProperty("Настройка параметров для игрока")]
public ControllerParameters ControllerParameter = new ControllerParameters();
internal class ControllerParameters {
[JsonProperty("Настройка отображения параметров для выбора игрока")]
public VisualSettingParametres VisualParametres = new VisualSettingParametres();
[JsonProperty("Список и настройка цветов для ника")]
public List<AdvancedFuncion> NickColorList = new List<AdvancedFuncion>();
[JsonProperty("Список и настройка цветов для сообщений в чате")]
public List<AdvancedFuncion> MessageColorList = new List<AdvancedFuncion>();
[JsonProperty("Список и настройка префиксов в чате")]
public PrefixSetting Prefixes = new PrefixSetting();
internal class PrefixSetting {
[JsonProperty("Включить поддержку нескольких префиксов сразу (true - можно установить несколько префиксов/false - установить можно только 1 на выбор)")]
public Boolean TurnMultiPrefixes;
[JsonProperty("Максимальное количество префиксов, которое можно установить за раз(Данный параметр работает только если включена установка нескольких префиксов)")]
public Int32 MaximumMultiPrefixCount;
[JsonProperty("Список префиксов и их настройка")]
public List<AdvancedFuncion> Prefixes = new List<AdvancedFuncion>();
}
internal class AdvancedFuncion {
[JsonProperty("Права")]
public String Permissions;
[JsonProperty("Значение")]
public String Argument;
}
internal class VisualSettingParametres {
[JsonProperty("Тип отображения выбора префикса для игрока - (0 - выпадающий список, 1 - слайдер (Учтите, что если у вас включен мульти-префикс, будет установлен выпадающий список))")]
public SelectedParametres PrefixType;
[JsonProperty("Тип отображения выбора цвета ника для игрока - (0 - выпадающий список, 1 - слайдер)")]
public SelectedParametres NickColorType;
[JsonProperty("Тип отображения выбора цвета сообщения для игрока - (0 - выпадающий список, 1 - слайдер)")]
public SelectedParametres ChatColorType;
[JsonProperty("IQRankSystem : Тип отображения выбора ранга для игрока - (0 - выпадающий список, 1 - слайдер)")]
public SelectedParametres IQRankSystemType;
}
}
[JsonProperty("Настройка мута в плагине")]
public ControllerMute ControllerMutes = new ControllerMute();
internal class ControllerMute {
[JsonProperty("Настройка автоматического мута")]
public AutoMute AutoMuteSettings = new AutoMute();
internal class AutoMute {
[JsonProperty("Включить автоматический мут по запрещенным словам(true - да/false - нет)")]
public Boolean UseAutoMute;
[JsonProperty("Причина автоматического мута")]
public Muted AutoMuted;
}
[JsonProperty("Дополнительная настройка для логирования о мутах в дискорд")]
public LoggedFuncion LoggedMute = new LoggedFuncion();
internal class LoggedFuncion {
[JsonProperty("Поддержка логирования последних N сообщений (Должно быть включено логирование в дискорд о мутах)")]
public Boolean UseHistoryMessage;
[JsonProperty("Сколько последних сообщений игрока отправлять в логировании")]
public Int32 CountHistoryMessage;
}
[JsonProperty("Причины для блокировки чата")]
public List<Muted> MuteChatReasons = new List<Muted>();
[JsonProperty("Причины для блокировки голоса")]
public List<Muted> MuteVoiceReasons = new List<Muted>();
internal class Muted {
[JsonProperty("Причина для блокировки")]
public String Reason;
[JsonProperty("Время блокировки(в секундах)")]
public Int32 SecondMute;
}
}
[JsonProperty("Настройка обработки сообщений")]
public ControllerMessage ControllerMessages = new ControllerMessage();
internal class ControllerMessage {
[JsonProperty("Основная настройка сообщений в чат от плагина")]
public GeneralSettings GeneralSetting = new GeneralSettings();
[JsonProperty("Настройка переключения функционала в чате")]
public TurnedFuncional TurnedFunc = new TurnedFuncional();
[JsonProperty("Настройка форматирования сообщений игроков")]
public FormattingMessage Formatting = new FormattingMessage();
internal class GeneralSettings {
[JsonProperty("Настройка формата оповещения в чате")]
public BroadcastSettings BroadcastFormat = new BroadcastSettings();
[JsonProperty("Настройка формата упоминания в чате, через @")]
public AlertSettings AlertFormat = new AlertSettings();
[JsonProperty("Дополнительная настройка")]
public OtherSettings OtherSetting = new OtherSettings();
internal class BroadcastSettings {
[JsonProperty("Наименование оповещения в чат")]
public String BroadcastTitle;
[JsonProperty("Цвет сообщения оповещения в чат")]
public String BroadcastColor;
[JsonProperty("Steam64ID для аватарки в чате")]
public String Steam64IDAvatar;
}
internal class AlertSettings {
[JsonProperty("Цвет сообщения упоминания игрока в чате")]
public String AlertPlayerColor;
[JsonProperty("Звук при при получении и отправки упоминания через @")]
public String SoundAlertPlayer;
}
internal class OtherSettings {
[JsonProperty("Время,через которое удалится сообщение с UI от администратора")]
public Int32 TimeDeleteAlertUI;
[JsonProperty("Размер сообщения от игрока в чате")]
public Int32 SizeMessage = 14;
[JsonProperty("Размер ника игрока в чате")]
public Int32 SizeNick = 14;
[JsonProperty("Размер префикса игрока в чате (будет использовано, если в самом префиксе не установвлен <size=N></size>)")]
public Int32 SizePrefix = 14;
}
}
internal class TurnedFuncional {
[JsonProperty("Настройка защиты от спама")]
public AntiSpam AntiSpamSetting = new AntiSpam();
[JsonProperty("Настройка временной блокировки чата новичкам (которые только зашли на сервер)")]
public AntiNoob AntiNoobSetting = new AntiNoob();
[JsonProperty("Настройка личных сообщений")]
public PM PMSetting = new PM();
internal class AntiNoob {
[JsonProperty("Защита от новичка в PM/R")]
public Settings AntiNoobPM = new Settings();
[JsonProperty("Защита от новичка в глобальном и коммандном чате")]
public Settings AntiNoobChat = new Settings();
internal class Settings {
[JsonProperty("Включить защиту?")]
public Boolean AntiNoobActivate = false;
[JsonProperty("Время блокировки чата для новичка")]
public Int32 TimeBlocked = 1200;
}
}
internal class AntiSpam {
[JsonProperty("Включить защиту от спама (Анти-спам)")]
public Boolean AntiSpamActivate;
[JsonProperty("Время через которое игрок может отправлять сообщение (АнтиСпам)")]
public Int32 FloodTime;
[JsonProperty("Дополнительная настройка Анти-Спама")]
public AntiSpamDuples AntiSpamDuplesSetting = new AntiSpamDuples();
internal class AntiSpamDuples {
[JsonProperty("Включить дополнительную защиту от спама (Анти-дубликаты, повторяющие сообщения)")]
public Boolean AntiSpamDuplesActivate = true;
[JsonProperty("Сколько дублирующих сообщений нужно сделать игроку чтобы его замутила система")]
public Int32 TryDuples = 3;
[JsonProperty("Настройка автоматического мута за дубликаты")]
public ControllerMute.Muted MuteSetting = new ControllerMute.Muted {
Reason = "Блокировка за дублирующие сообщения (СПАМ)", SecondMute = 300,
}
;
}
}
internal class PM {
[JsonProperty("Включить личные сообщения")]
public Boolean PMActivate;
[JsonProperty("Звук при при получении личного сообщения")]
public String SoundPM;
}
[JsonProperty("Включить игнор ЛС игрокам(/ignore nick или через интерфейс)")]
public Boolean IgnoreUsePM;
[JsonProperty("Скрыть из чата выдачу предметов Админу")]
public Boolean HideAdminGave;
[JsonProperty("Переносить мут в командный чат(В случае мута, игрок не сможет писать даже в командный чат)")]
public Boolean MuteTeamChat;
}
internal class FormattingMessage {
[JsonProperty("Включить форматирование сообщений [Будет контроллировать капс, формат сообщения] (true - да/false - нет)")]
public Boolean FormatMessage;
[JsonProperty("Использовать список запрещенных слов (true - да/false - нет)")]
public Boolean UseBadWords;
[JsonProperty("Слово которое будет заменять запрещенное слово")]
public String ReplaceBadWord;
[JsonProperty("Список запрещенных слов")]
public List<String> BadWords = new List<String>();
[JsonProperty("Настройка контроллера ников")]
public NickController ControllerNickname = new NickController();
internal class NickController {
[JsonProperty("Включить форматирование ников игроков (должно быть включено форматирование сообщений)")]
public Boolean UseNickController = true;
[JsonProperty("Слово которое будет заменять запрещенное слово (Вы можете оставить пустым и будет просто удалять)")]
public String ReplaceBadNick = "****";
[JsonProperty("Список запрещенных ников")]
public List<String> BadNicks = new List<String>();
}
}
}
[JsonProperty("Настройка оповещений в чате")]
public ControllerAlert ControllerAlertSetting;
internal class ControllerAlert {
[JsonProperty("Настройка оповещений в чате")]
public Alert AlertSetting;
[JsonProperty("Настройка оповещений о статусе сессии игрока")]
public PlayerSession PlayerSessionSetting;
[JsonProperty("Настройка оповещений о статусе сессии администратора")]
public AdminSession AdminSessionSetting;
[JsonProperty("Настройка персональных оповоещений игроку при коннекте")]
public PersonalAlert PersonalAlertSetting;
internal class Alert {
[JsonProperty("Включить автоматические сообщения в чат (true - да/false - нет)")]
public Boolean AlertMessage;
[JsonProperty("Тип автоматических сообщений : true - поочередные/false - случайные")]
public Boolean AlertMessageType;
[JsonProperty("Список автоматических сообщений в чат")]
public List<String> MessageList;
[JsonProperty("Интервал отправки сообщений в чат (Броадкастер) (в секундах)")]
public Int32 MessageListTimer;
}
internal class PlayerSession {
[JsonProperty("При уведомлении о входе/выходе игрока отображать его аватар напротив ника (true - да/false - нет)")]
public Boolean ConnectedAvatarUse;
[JsonProperty("Уведомлять в чате о входе игрока (true - да/false - нет)")]
public Boolean ConnectedAlert;
[JsonProperty("Включить случайные уведомления о входе игрока из списка (true - да/false - нет)")]
public Boolean ConnectionAlertRandom;
[JsonProperty("Отображать страну зашедшего игрока (true - да/false - нет")]
public Boolean ConnectedWorld;
[JsonProperty("Уведомлять о выходе игрока в чат(выбираются из списка) (true - да/false - нет)")]
public Boolean DisconnectedAlert;
[JsonProperty("Включить случайные уведомления о выходе игрока (true - да/false - нет)")]
public Boolean DisconnectedAlertRandom;
[JsonProperty("Отображать причину выхода игрока (true - да/false - нет)")]
public Boolean DisconnectedReason;
[JsonProperty("Случайные уведомления о входе игрока({0} - ник игрока, {1} - страна(если включено отображение страны)")]
public List<String> RandomConnectionAlert = new List<String>();
[JsonProperty("Случайные уведомления о выходе игрока({0} - ник игрока, {1} - причина выхода(если включена причина)")]
public List<String> RandomDisconnectedAlert = new List<String>();
}
internal class AdminSession {
[JsonProperty("Уведомлять о входе админа на сервер в чат (true - да/false - нет)")]
public Boolean ConnectedAlertAdmin;
[JsonProperty("Уведомлять о выходе админа на сервер в чат (true - да/false - нет)")]
public Boolean DisconnectedAlertAdmin;
}
internal class PersonalAlert {
[JsonProperty("Включить случайное сообщение зашедшему игроку (true - да/false - нет)")]
public Boolean UseWelcomeMessage;
[JsonProperty("Список сообщений игроку при входе")]
public List<String> WelcomeMessage = new List<String>();
}
}
[JsonProperty("Настройка Rust+")]
public RustPlus RustPlusSettings;
internal class RustPlus {
[JsonProperty("Использовать Rust+")]
public Boolean UseRustPlus;
[JsonProperty("Название для уведомления Rust+")]
public String DisplayNameAlert;
}
[JsonProperty("Настройка плагинов поддержки")]
public ReferenceSettings ReferenceSetting = new ReferenceSettings();
internal class ReferenceSettings {
[JsonProperty("Настройка IQFakeActive")]
public IQFakeActive IQFakeActiveSettings = new IQFakeActive();
[JsonProperty("Настройка IQRankSystem")]
public IQRankSystem IQRankSystems = new IQRankSystem();
internal class IQRankSystem {
[JsonProperty("Формат отображения ранга в чате ( {0} - это ранг юзера, не удаляйте это значение)")]
public String FormatRank = "[{0}]";
[JsonProperty("Формат отображения времени с IQRankSystem в чате ( {0} - это время юзера, не удаляйте это значение)")]
public String FormatRankTime = "[{0}]";
[JsonProperty("Использовать поддержку рангов")]
public Boolean UseRankSystem;
[JsonProperty("Отображать игрокам их отыгранное время рядом с рангом")]
public Boolean UseTimeStandart;
}
internal class IQFakeActive {
[JsonProperty("Использовать поддержку IQFakeActive")]
public Boolean UseIQFakeActive;
}
}
[JsonProperty("Настройка автоответчика")]
public AnswerMessage AnswerMessages = new AnswerMessage();
internal class AnswerMessage {
[JsonProperty("Включить автоответчик?(true - да/false - нет)")]
public bool UseAnswer;
[JsonProperty("Настройка сообщений [Ключевое слово] = Ответ")]
public Dictionary<String, String> AnswerMessageList = new Dictionary<String, String>();
}
[JsonProperty("Дополнительная настройка")]
public OtherSettings OtherSetting;
internal class OtherSettings {
[JsonProperty("Настройка логирования сообщений")]
public LoggedChat LogsChat = new LoggedChat();
[JsonProperty("Настройка логирования личных сообщений игроков")]
public General LogsPMChat = new General();
[JsonProperty("Настройка логирования блокировок/разблокировок чата/голоса")]
public General LogsMuted = new General();
[JsonProperty("Настройка логирования чат-команд от игроков")]
public General LogsChatCommands = new General();
internal class LoggedChat {
[JsonProperty("Настройка логирования общего чата")]
public General GlobalChatSettings = new General();
[JsonProperty("Настройка логирования тим чата")]
public General TeamChatSettings = new General();
}
internal class General {
[JsonProperty("Включить логирование (true - да/false - нет)")]
public Boolean UseLogged = false;
[JsonProperty("Webhooks канала для логирования")]
public String Webhooks = "";
}
}
}
private new void LoadDefaultMessages() {
PrintWarning(LanguageEn ? "Language file is loading..." : "Языковой файл загружается...");
lang.RegisterMessages(new Dictionary<string, string> {
["FUNC_MESSAGE_MUTE_CHAT"]
= "{0} muted {1}\nDuration : {2}\nReason : {3}", ["FUNC_MESSAGE_UNMUTE_CHAT"] = "{0} unmuted {1}", ["FUNC_MESSAGE_MUTE_VOICE"] = "{0} muted voice to {1}\nDuration : {2}\nReason : {3}", ["FUNC_MESSAGE_UNMUTE_VOICE"] = "{0} unmuted voice to {1}", ["FUNC_MESSAGE_MUTE_ALL_CHAT"] = "Chat disabled", ["FUNC_MESSAGE_UNMUTE_ALL_CHAT"] = "Chat enabled", ["FUNC_MESSAGE_MUTE_ALL_VOICE"] = "Voice chat disabled", ["FUNC_MESSAGE_UNMUTE_ALL_VOICE"] = "Voice chat enabled", ["FUNC_MESSAGE_MUTE_ALL_ALERT"] = "Blocking by Administrator", ["FUNC_MESSAGE_PM_TURN_FALSE"] = "The player has forbidden to send himself private messages", ["FUNC_MESSAGE_ALERT_TURN_FALSE"] = "The player has not been allowed to notify himself", ["FUNC_MESSAGE_NO_ARG_BROADCAST"] = "You can not send an empty broadcast message!", ["UI_ALERT_TITLE"] = "<size=14><b>Notification</b></size>", ["COMMAND_NOT_PERMISSION"] = "You dont have permissions to use this command", ["COMMAND_RENAME_NOTARG"] = "For rename use : /rename [NewNickname] [NewID (Optional)]", ["COMMAND_RENAME_NOT_ID"] = "Incorrect ID for renaming! Use Steam64ID or leave blank", ["COMMAND_RENAME_SUCCES"] = "You have successfully changed your nickname!\nyour nickname : {0}\nYour ID : {1}", ["COMMAND_PM_NOTARG"] = "To send pm use : /pm Nickname Message", ["COMMAND_PM_NOT_NULL_MSG"] = "Message is empty!", ["COMMAND_PM_NOT_USER"] = "User not found or offline", ["COMMAND_PM_SUCCESS"] = "Your private message sent successful\nMessage : {0}\nDelivered : {1}", ["COMMAND_PM_SEND_MSG"] = "Message from {0}\n{1}", ["COMMAND_R_NOTARG"] = "For reply use : /r Message", ["COMMAND_R_NOTMSG"] = "You dont have any private conversations yet!", ["FLOODERS_MESSAGE"] = "You're typing too fast! Please Wait {0} seconds", ["PREFIX_SETUP"] = "You have successfully removed the prefix {0}, it is already activated and installed", ["COLOR_CHAT_SETUP"] = "You have successfully picked up the <color={0}>chat color</color>, it is already activated and installed", ["COLOR_NICK_SETUP"] = "You have successfully taken the <color={0}>nickname color</color>, it is already activated and installed", ["PREFIX_RETURNRED"] = "Your prefix {0} expired, it was reset automatically", ["COLOR_CHAT_RETURNRED"] = "Action of your <color={0}>color chat</color> over, it is reset automatically", ["COLOR_NICK_RETURNRED"] = "Action of your <color={0}>color nick</color> over, it is reset automatically", ["WELCOME_PLAYER"] = "{0} came online", ["LEAVE_PLAYER"] = "{0} left", ["WELCOME_PLAYER_WORLD"] = "{0} came online. Country: {1}", ["LEAVE_PLAYER_REASON"] = "{0} left. Reason: {1}", ["IGNORE_ON_PLAYER"] = "You added {0} in black list", ["IGNORE_OFF_PLAYER"] = "You removed {0} from black list", ["IGNORE_NO_PM"] = "This player added you in black list. Your message has not been delivered.", ["IGNORE_NO_PM_ME"] = "You added this player in black list. Your message has not been delivered.", ["INGORE_NOTARG"] = "To ignore a player use : /ignore nickname", ["DISCORD_SEND_LOG_CHAT"] = "Player : {0}({1})\nFiltred message : {2}\nMessage : {3}", ["DISCORD_SEND_LOG_MUTE"] = "{0}({1}) give mute chat\nSuspect : {2}({3})\nReason : {4}", ["TITLE_FORMAT_DAYS"] = "D", ["TITLE_FORMAT_HOURSE"] = "H", ["TITLE_FORMAT_MINUTES"] = "M", ["TITLE_FORMAT_SECONDS"] = "S", ["IQCHAT_CONTEXT_TITLE"] = "SETTING UP A CHAT", ///"%TITLE%"
["IQCHAT_CONTEXT_SETTING_ELEMENT_TITLE"]
= "CUSTOM SETTING", ///"%SETTING_ELEMENT%"
["IQCHAT_CONTEXT_INFORMATION_TITLE"]
= "INFORMATION", ///"%INFORMATION%"
["IQCHAT_CONTEXT_SETTINGS_TITLE"]
= "SETTINGS", ///"%SETTINGS%"
["IQCHAT_CONTEXT_SETTINGS_PM_TITLE"]
= "Private messages", ///"%SETTINGS_PM%"
["IQCHAT_CONTEXT_SETTINGS_ALERT_TITLE"]
= "Notification in the chat", ///"%SETTINGS_ALERT%"
["IQCHAT_CONTEXT_SETTINGS_ALERT_PM_TITLE"]
= "Mention in the chat", ///"%SETTINGS_ALERT_PM%"
["IQCHAT_CONTEXT_SETTINGS_SOUNDS_TITLE"]
= "Sound notification", ///"%SETTINGS_SOUNDS%"
["IQCHAT_CONTEXT_MUTE_STATUS_NOT"]
= "NO", ///"%MUTE_STATUS_PLAYER%"
["IQCHAT_CONTEXT_MUTE_STATUS_TITLE"]
= "Blocking the chat", ///"%MUTE_STATUS_TITLE%"
["IQCHAT_CONTEXT_IGNORED_STATUS_COUNT"]
= "<size=11>{0}</size> human (а)", ///"%IGNORED_STATUS_COUNT%"
["IQCHAT_CONTEXT_IGNORED_STATUS_TITLE"]
= "Ignoring", ///"%IGNORED_STATUS_TITLE%"
["IQCHAT_CONTEXT_NICK_DISPLAY_TITLE"]
= "Your nickname", ///"%NICK_DISPLAY_TITLE%"
["IQCHAT_CONTEXT_NICK_DISPLAY_MESSAGE"]
= "i love iqchat", ["IQCHAT_CONTEXT_SLIDER_PREFIX_TITLE"] = "Prefix", /// %SLIDER_PREFIX_TITLE%
["IQCHAT_CONTEXT_SLIDER_NICK_COLOR_TITLE"]
= "Nick", /// %SLIDER_NICK_COLOR_TITLE%
["IQCHAT_CONTEXT_SLIDER_MESSAGE_COLOR_TITLE"]
= "Message", /// %SLIDER_MESSAGE_COLOR_TITLE%
["IQCHAT_CONTEXT_SLIDER_IQRANK_TITLE"]
= "Rank", ["IQCHAT_CONTEXT_SLIDER_IQRANK_TITLE_NULLER"] = "Absent", ["IQCHAT_CONTEXT_SLIDER_PREFIX_TITLE_DESCRIPTION"] = "Choosing a prefix", ///
["IQCHAT_CONTEXT_SLIDER_CHAT_NICK_TITLE_DESCRIPTION"]
= "Choosing a nickname color", ///
["IQCHAT_CONTEXT_SLIDER_CHAT_MESSAGE_TITLE_DESCRIPTION"]
= "Chat Color Selection", ///
["IQCHAT_CONTEXT_SLIDER_IQRANK_TITLE_DESCRIPTION"]
= "Rank Selection", ///
["IQCHAT_CONTEXT_DESCRIPTION_PREFIX"]
= "Prefix Setting", ["IQCHAT_CONTEXT_DESCRIPTION_NICK"] = "Setting up a nickname", ["IQCHAT_CONTEXT_DESCRIPTION_CHAT"] = "Setting up a message", ["IQCHAT_CONTEXT_DESCRIPTION_RANK"] = "Setting up the rank", ["IQCHAT_ALERT_TITLE"] = "ALERT", /// %TITLE_ALERT%
["IQCHAT_TITLE_IGNORE_AND_MUTE_MUTED"]
= "LOCK MANAGEMENT", ["IQCHAT_TITLE_IGNORE_AND_MUTE_IGNORED"] = "IGNORING MANAGEMENT", ["IQCHAT_TITLE_IGNORE_TITLES"] = "<b>DO YOU REALLY WANT TO IGNORE\n{0}?</b>", ["IQCHAT_TITLE_IGNORE_TITLES_UNLOCK"] = "<b>DO YOU WANT TO REMOVE THE IGNORING FROM THE PLAYER\n{0}?</b>",
// ... [Code preview truncated due to length. Full source in attached file] ...