C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using CompanionServer;
using Object = System.Object;
using Oxide.Game.Rust.Cui;
using System.Text.RegularExpressions;
using System.Text;
using Newtonsoft.Json;
using ConVar;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using Pool = Facepunch.Pool;
using Oxide.Core.Libraries;
using System.IO;
using Oxide.Core;
using System;
using Newtonsoft.Json.Linq;
using UnityEngine.Networking;
namespace Oxide.Plugins {
[Info("IQChat", "Mercury", "2.72.60")]
[Description("The most pleasant chat for your server from the IQ system")]
class IQChat : RustPlugin {
private void DrawUI_IQChat_Update_Check_Box(BasePlayer player, ElementsSettingsType Type, String OffsetMin, String OffsetMax, Boolean StatusCheckBox) {
String Interface = InterfaceBuilder.GetInterface("UI_Chat_Context_CheckBox");
User Info = UserInformation[player.userID];
if (Info == null || Interface == null) return;
String Name = $"{Type}";
Interface = Interface.Replace("%NAME_CHECK_BOX%", Name);
Interface = Interface.Replace("%COLOR%", !StatusCheckBox ? "0.4716981 0.4716981 0.4716981 1" : "0.6040971 0.4198113 1 1");
Interface = Interface.Replace("%OFFSET_MIN%", OffsetMin);
Interface = Interface.Replace("%OFFSET_MAX%", OffsetMax);
Interface = Interface.Replace("%COMMAND_TURNED%", $"newui.cmd checkbox.controller {Type}");
CuiHelper.DestroyUi(player, Name);
CuiHelper.AddUi(player, Interface);
}
private List<String> ConvertStringToList(String input) {
String pattern = @"[,\.\;\:\s]+";
return Regex.Split(input, pattern) .Select(item => item.Trim()) .Where(item => !string.IsNullOrEmpty(item)) .Take(10) .ToList();
}
String API_GET_DEFAULT_PREFIX() => config.ControllerConnect.SetupDefaults.PrefixDefault;
[ChatCommand("hunmute")]
void HideUnMute(BasePlayer Moderator, string cmd, string[] arg) {
if (!IsModerator(Moderator)) return;
if (arg == null || arg.Length != 1 || arg.Length > 1) {
ReplySystem(Moderator, LanguageEn ? "Invalid syntax, please use : hunmute Steam64ID/Nick" : "Неверный синтаксис,используйте : hunmute Steam64ID/Ник");
return;
}
string NameOrID = arg[0];
BasePlayer target = GetPlayerNickOrID(NameOrID);
if (target == null) {
UInt64 Steam64ID = 0;
if (UInt64.TryParse(NameOrID, out Steam64ID)) {
if (UserInformation.ContainsKey(Steam64ID)) {
User Info = UserInformation[Steam64ID];
if (Info == null) return;
if (!Info.MuteInfo.IsMute(MuteType.Chat)) {
ReplySystem(Moderator, LanguageEn ? "The player does not have a chat lock" : "У игрока нет блокировки чата");
return;
}
if (!Moderator.IsAdmin && Moderator.userID == Steam64ID) {
ReplySystem(Moderator, GetLang("FUNC_MESSAGE_UNMUTE_YOURSELF", Moderator.UserIDString));
return;
}
Info.MuteInfo.UnMute(MuteType.Chat);
ReplySystem(Moderator, LanguageEn ? "You have unblocked the offline chat to the player" : "Вы разблокировали чат offline игроку");
return;
}
else {
ReplySystem(Moderator, LanguageEn ? "This player is not on the server" : "Такого игрока нет на сервере");
return;
}
}
else {
ReplySystem(Moderator, LanguageEn ? "This player is not on the server" : "Такого игрока нет на сервере");
return;
}
}
UnmutePlayer(target, MuteType.Chat, Moderator, true, true);
}
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);
}
[ChatCommand("unmute")]
void UnMuteCustomChat(BasePlayer Moderator, string cmd, string[] arg) {
if (!IsModerator(Moderator)) return;
if (arg == null || arg.Length != 1 || arg.Length > 1) {
ReplySystem(Moderator, LanguageEn ? "Invalid syntax, please use : unmute Steam64ID" : "Неверный синтаксис,используйте : unmute Steam64ID");
return;
}
string NameOrID = arg[0];
if (IsFakeUser(NameOrID)) {
List<FakePlayer> playerList = GetCombinedPlayerList();
if (playerList != null) {
FakePlayer fakeUser = playerList.FirstOrDefault(x => x.userId.Equals(NameOrID) || x.displayName.ToLower().Contains(NameOrID.ToLower()));
if (fakeUser != null) UnmutePlayer(null, MuteType.Chat, Moderator, false, true, fakeUser.userId);
}
return;
}
BasePlayer target = GetPlayerNickOrID(NameOrID);
if (target == null) {
UInt64 Steam64ID = 0;
if (UInt64.TryParse(NameOrID, out Steam64ID)) {
if (UserInformation.ContainsKey(Steam64ID)) {
User Info = UserInformation[Steam64ID];
if (Info == null) return;
if (!Info.MuteInfo.IsMute(MuteType.Chat)) {
ReplySystem(Moderator, LanguageEn ? "The player does not have a chat lock" : "У игрока нет блокировки чата");
return;
}
if (!Moderator.IsAdmin && Moderator.userID == Steam64ID) {
ReplySystem(Moderator, GetLang("FUNC_MESSAGE_UNMUTE_YOURSELF", Moderator.UserIDString));
return;
}
Info.MuteInfo.UnMute(MuteType.Chat);
ReplySystem(Moderator, LanguageEn ? "You have unblocked the offline chat to the player" : "Вы разблокировали чат offline игроку");
return;
}
else {
ReplySystem(Moderator, LanguageEn ? "This player is not on the server" : "Такого игрока нет на сервере");
return;
}
}
else {
ReplySystem(Moderator, LanguageEn ? "This player is not on the server" : "Такого игрока нет на сервере");
return;
}
}
UnmutePlayer(target, MuteType.Chat, Moderator, false, true);
}
private void DrawUI_IQChat_Mute_Alert_Reasons(BasePlayer player, BasePlayer Target, String Reason, Int32 Y, MuteType Type, UInt64 IDFake = 0) {
String Interface = InterfaceBuilder.GetInterface("UI_Chat_Mute_Alert_DropList_Reason");
if (Interface == null) return;
Interface = Interface.Replace("%OFFSET_MIN%", $"-147.5 {85.42 - (Y * 40)}");
Interface = Interface.Replace("%OFFSET_MAX%", $"147.5 {120.42 - (Y * 40)}");
Interface = Interface.Replace("%REASON%", Reason);
Interface = Interface.Replace("%COMMAND_REASON%", $"newui.cmd action.mute.ignore ignore.and.mute.controller {SelectedAction.Mute} confirm.yes {((IsReadyIQFakeActive() && Target == null && IDFake != 0) ? IDFake : Target.userID)} {Type} {Y}");
CuiHelper.AddUi(player, Interface);
}
public void BroadcastAuto() {
Configuration.ControllerAlert.Alert Broadcast = config.ControllerAlertSetting.AlertSetting;
if (Broadcast.AlertMessage) {
Int32 IndexBroadkastNow = 0;
String RandomMsg = String.Empty;
timer.Every(Broadcast.MessageListTimer, () => {
if (Broadcast.AlertMessageType) {
foreach (BasePlayer p in BasePlayer.activePlayerList) {
List<String> MessageList = GetMesagesList(p, Broadcast.MessageList.LanguageMessages);
if (MessageList.Count == 0) continue;
if (IndexBroadkastNow >= MessageList.Count) IndexBroadkastNow = 0;
RandomMsg = MessageList[IndexBroadkastNow];
ReplySystem(p, RandomMsg);
}
IndexBroadkastNow++;
}
else {
foreach (BasePlayer p in BasePlayer.activePlayerList) {
String templateText = GetMessages(p, Broadcast.MessageList.LanguageMessages);
if(String.IsNullOrWhiteSpace(templateText)) continue;
ReplySystem(p, templateText);
}
}
}
);
}
}
[ChatCommand("adminalert")]
private void AdminAlertChatCommand(BasePlayer Sender, String cmd, String[] args) {
if (!permission.UserHasPermission(Sender.UserIDString, PermissionAlert)) return;
Alert(Sender, args, true);
}
[ChatCommand("chat")]
private void ChatCommandOpenedUI(BasePlayer player) {
if (_interface == null) {
PrintWarning(LanguageEn ? "We generate the interface, wait for a message about successful generation" : "Генерируем интерфейс, ожидайте сообщения об успешной генерации");
return;
}
if (player == null) return;
Configuration.ControllerParameters ControllerParameters = config.ControllerParameter;
if (!LocalBase.ContainsKey(player)) LocalBase.Add(player, new InformationOpenedUI {
}
);
LocalBase[player].ElementsPrefix = ControllerParameters.Prefixes.Prefixes.OrderByDescending(arg => arg.Argument.Length).Where(p => permission.UserHasPermission(player.UserIDString, p.Permissions) && !p.IsBlockSelected).ToList();
LocalBase[player].ElementsNick = ControllerParameters.NickColorList.Where(n => permission.UserHasPermission(player.UserIDString, n.Permissions) && !n.IsBlockSelected).ToList();
LocalBase[player].ElementsChat = ControllerParameters.MessageColorList.Where(m => permission.UserHasPermission(player.UserIDString, m.Permissions) && !m.IsBlockSelected).ToList();
if (IQRankSystem && config.ReferenceSetting.IQRankSystems.UseRankSystem) {
List<Configuration.ControllerParameters.AdvancedFuncion> RankList = new List<Configuration.ControllerParameters.AdvancedFuncion>();
foreach (String Rank in IQRankListKey(player)) RankList.Add(new Configuration.ControllerParameters.AdvancedFuncion {
Argument = Rank, Permissions = String.Empty
}
);
LocalBase[player].ElementsRanks = RankList;
}
DrawUI_IQChat_Context(player);
}
void API_ALERT_PLAYER(BasePlayer player, String Message, String CustomPrefix = null, String CustomAvatar = null, String CustomHex = null) => ReplySystem(player, Message, CustomPrefix, CustomAvatar, CustomHex);
public class FakePlayer {
public Boolean isMuted;
[JsonProperty("userId")]
public String userId;
[JsonProperty("displayName")]
public String displayName;
}
[ChatCommand("mutevoice")]
void MuteVoiceCustomChat(BasePlayer Moderator, string cmd, string[] arg) {
if (!IsModerator(Moderator)) return;
if (arg == null || arg.Length != 3 || arg.Length > 3) {
ReplySystem(Moderator, LanguageEn ? "Invalid syntax, use : mutevoice Steam64ID/Nick Reason Time(seconds)" : "Неверный синтаксис, используйте : mutevoice Steam64ID/Ник Причина Время(секунды)");
return;
}
string NameOrID = arg[0];
string Reason = arg[1];
Int32 TimeMute = 0;
if (!Int32.TryParse(arg[2], out TimeMute)) {
ReplySystem(Moderator, LanguageEn ? "Enter time in numbers!" : "Введите время цифрами!");
return;
}
if (IsFakeUser(NameOrID)) {
List<FakePlayer> playerList = GetCombinedPlayerList();
if (playerList != null) {
FakePlayer fakeUser = playerList.FirstOrDefault(x => x.userId.Equals(NameOrID) || x.displayName.ToLower().Contains(NameOrID.ToLower()));
if (fakeUser != null) MutePlayer(null, MuteType.Voice, 0, Moderator, Reason, TimeMute, false, true, fakeUser.userId);
}
return;
}
BasePlayer target = GetPlayerNickOrID(NameOrID);
if (target == null) {
UInt64 Steam64ID = 0;
if (UInt64.TryParse(NameOrID, out Steam64ID)) {
if (UserInformation.ContainsKey(Steam64ID)) {
User Info = UserInformation[Steam64ID];
if (Info == null) return;
if (Info.MuteInfo.IsMute(MuteType.Voice)) {
ReplySystem(Moderator, LanguageEn ? "The player already has a voice lock" : "Игрок уже имеет блокировку голосового чата");
return;
}
Info.MuteInfo.SetMute(MuteType.Voice, TimeMute);
ReplySystem(Moderator, LanguageEn ? "Voice blocking issued to offline player" : "Блокировка глосового чата выдана offline-игроку");
return;
}
else {
ReplySystem(Moderator, LanguageEn ? "This player is not on the server" : "Такого игрока нет на сервере");
return;
}
}
else {
ReplySystem(Moderator, LanguageEn ? "This player is not on the server" : "Такого игрока нет на сервере");
return;
}
}
MutePlayer(target, MuteType.Voice, 0, Moderator, Reason, TimeMute, false, true);
}
void IQRankSetRank(BasePlayer player, string RankKey) => IQRankSystem?.Call("API_SET_ACTIVE_RANK", player.userID.Get(), RankKey);
void OnUserGroupAdded(string id, string groupName) {
String[] PermissionsGroup = permission.GetGroupPermissions(groupName);
if (PermissionsGroup == null) return;
foreach (String permName in PermissionsGroup) SetupParametres(id, permName);
}
private void DrawUI_IQChat_DropList(BasePlayer player, String OffsetMin, String OffsetMax, String Title, TakeElementUser ElementType) {
String Interface = InterfaceBuilder.GetInterface("UI_Chat_DropList");
if (Interface == null) return;
Interface = Interface.Replace("%TITLE%", Title);
Interface = Interface.Replace("%OFFSET_MIN%", OffsetMin);
Interface = Interface.Replace("%OFFSET_MAX%", OffsetMax);
Interface = Interface.Replace("%BUTTON_DROP_LIST_CMD%", $"newui.cmd droplist.controller open {ElementType}");
CuiHelper.AddUi(player, Interface);
}
public class Fields {
public string name {
get;
set;
}
public string value {
get;
set;
}
public bool inline {
get;
set;
}
public Fields(string name, string value, bool inline) {
this.name = name;
this.value = value;
this.inline = inline;
}
}
/// <summary>
/// - Исправление после обновления игры
/// TODO: https://codefling.com/files/support/19272-add-a-rename-command-with-permission/
/// TODO: https://codefling.com/files/support/14625-assigning-permissions-to-groups/
/// TODO: clan.enabled "True" (поддержка кланов)
/// TODO: Добавить отображение канала-чата в консоли лога чата [IQChat] Player : bla bla
/// TODO: Добавить возможность отключения переводчика (по команде прст)
/// Обновление
/// </summary>
[PluginReference]
Plugin ImageLibrary, IQStaff, IQFakeActive, IQRankSystem, XLevels, Clans, XPrison, TranslationAPI, RustApp, SkillTree, PlayerRanks;
Boolean API_CHECK_VOICE_CHAT(UInt64 ID) {
if (!UserInformation.ContainsKey(ID)) return false;
return UserInformation[ID].MuteInfo.IsMute(MuteType.Voice);
}
private void RustApp_NotifyUnMute(UInt64 targetID, MuteType muteType, BasePlayer moderator) {
if (!RustApp) return;
String messageNotify = LanguageEn ? $"Moderator {(moderator == null ? "Server" : $" {
moderator.userID
}
")} has unblocked the player's {(muteType == MuteType.Chat ? "text" : "voice")} chat {targetID}" : $"Модератор {(moderator == null ? "Server" : $" {
moderator.userID
}
")} разблокировал {(muteType == MuteType.Chat ? "текстовый" : "голосовой")} чат игроку {targetID}";
RustApp.Call("RA_CreateAlert", this, messageNotify, null, null);
}
String API_GET_CHAT_COLOR(UInt64 ID) {
if (!UserInformation.ContainsKey(ID)) return String.Empty;
return UserInformation[ID].Info.ColorMessage;
}
[ConsoleCommand("rename")]
private void ConsoleCommandRename(ConsoleSystem.Arg args) {
BasePlayer Renamer = args.Player();
if (Renamer == null) {
PrintWarning(LanguageEn ? "You can only use this command while on the server" : "Вы можете использовать эту команду только находясь на сервере");
return;
}
if (!permission.UserHasPermission(Renamer.UserIDString, PermissionRename)) return;
GeneralInformation General = GeneralInfo;
if (General == null) return;
if (args.Args.Length == 0 || args == null) {
ReplySystem(Renamer, lang.GetMessage("COMMAND_RENAME_NOTARG", this, Renamer.UserIDString));
return;
}
String Name = args.Args[0];
UInt64 ID = Renamer.userID;
if (args.Args.Length == 2 && args.Args[1] != null && !String.IsNullOrWhiteSpace(args.Args[1])) if (!UInt64.TryParse(args.Args[1], out ID)) {
ReplySystem(Renamer, lang.GetMessage("COMMAND_RENAME_NOT_ID", this, Renamer.UserIDString));
return;
}
if (General.RenameList.ContainsKey(Renamer.userID)) {
General.RenameList[Renamer.userID].RenameNick = Name;
General.RenameList[Renamer.userID].RenameID = ID;
}
else General.RenameList.Add(Renamer.userID, new GeneralInformation.RenameInfo {
RenameNick = Name, RenameID = ID
}
);
ReplySystem(Renamer, GetLang("COMMAND_RENAME_SUCCES", Renamer.UserIDString, Name, ID));
RenameUpdate(Renamer, Name);
}
[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;
}
User InfoSender = UserInformation[Sender.userID];
if(config.ControllerMutes.mutedPM) if (InfoSender.MuteInfo.IsMute(MuteType.Chat)) {
ReplySystem(Sender, GetLang("IQCHAT_FUNCED_NO_SEND_CHAT_MUTED", Sender.UserIDString, FormatTime(InfoSender.MuteInfo.GetTime(MuteType.Chat), Sender.UserIDString)));
return;
}
String NameUser = arg[0];
if (IsReadyIQFakeActive() && IsFakeUser(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) || TargetUser == Sender) {
ReplySystem(Sender, GetLang("COMMAND_PM_NOT_USER", Sender.UserIDString));
return;
}
User InfoTarget = UserInformation[TargetUser.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();
Message = RemoveLinkText(Message);
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;
if (TranslationAPI && config.ReferenceSetting.translationApiSettings.useTranslationApi && config.ReferenceSetting.translationApiSettings.translatePmChat) ReplyTranslationPM(Sender, TargetUser, Message, DisplayNameSender, TargetDisplayName);
else {
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());
Interface.Oxide.CallHook("OnSendedPersonalMessage", Sender, TargetUser, Message);
RustApp_HandlerPM(Sender.UserIDString, TargetUser.UserIDString, Message);
Log(LanguageEn ? $"PRIVATE MESSAGES : {DisplayNameSender}({Sender.userID}) sent a message to the player - {TargetDisplayName}({TargetUser.userID})\nMESSAGE : {Message}" : $"ЛИЧНЫЕ СООБЩЕНИЯ : {DisplayNameSender}({Sender.userID}) отправил сообщение игроку - {TargetDisplayName}({TargetUser.userID})\nСООБЩЕНИЕ : {Message}");
DiscordLoggPM(Sender, TargetUser, Message);
if (!config.disableRconBroadcast) {
Chat.Record(new Chat.ChatEntry {
Message = LanguageEn ? $"PRIVATE MESSAGES : {DisplayNameSender}({Sender.userID}) -> {TargetDisplayName}({TargetUser.userID}) : MESSAGE : {Message}" : $"ЛИЧНЫЕ СООБЩЕНИЯ : {DisplayNameSender}({Sender.userID}) -> {TargetDisplayName}({TargetUser.userID}) : СООБЩЕНИЕ : {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 : {DisplayNameSender}({Sender.userID}) -> {TargetDisplayName}({TargetUser.userID}) : MESSAGE : {Message}" : $"ЛИЧНЫЕ СООБЩЕНИЯ : {DisplayNameSender}({Sender.userID}) -> {TargetDisplayName}({TargetUser.userID}) : СООБЩЕНИЕ : {Message}");
}
private List<FakePlayer> GetCombinedPlayerList() {
if (!IsReadyIQFakeActive()) return null;
JObject jsonData = IQFakeActive.Call<JObject>("GetListPlayers");
if (!jsonData.TryGetValue("players", out JToken playersToken)) return null;
List<FakePlayer> playerList = playersToken.ToObject<List<FakePlayer>>();
return playerList.Where(p => !permission.UserHasPermission(p.userId, PermissionIgnoreMute)).ToList();
}
private void AddHistoryMessage(BasePlayer player, String Message) {
if (!LastMessagesChat.ContainsKey(player)) LastMessagesChat.Add(player, new List<String> {
Message
}
);
else LastMessagesChat[player].Add(Message);
}
private const String PermissionUseCmdMsg = "iqchat.cmsg";
public String GetMessages(BasePlayer player, Dictionary<String, List<String>> LanguageMessages) {
String LangPlayer = _.lang.GetLanguage(player.UserIDString);
if (LanguageMessages.ContainsKey(LangPlayer)) return LanguageMessages[LangPlayer].GetRandom();
else if (LanguageMessages.ContainsKey("en")) return LanguageMessages["en"].GetRandom();
else return LanguageMessages.FirstOrDefault().Value.GetRandom();
}
private void DiscordLoggPM(BasePlayer Sender, BasePlayer Reciepter, String MessageLogged) {
Configuration.OtherSettings.General PMChat = config.OtherSetting.LogsPMChat;
if (PMChat == null || !PMChat.UseLogged || String.IsNullOrWhiteSpace(PMChat.Webhooks)) return;
if (Sender == null || Reciepter == null) return;
GeneralInformation.RenameInfo SenderRename = GeneralInfo.GetInfoRename(Sender.userID);
GeneralInformation.RenameInfo ReciepterRename = GeneralInfo.GetInfoRename(Reciepter.userID);
UInt64 UserIDSender = SenderRename != null ? SenderRename.RenameID == 0 ? Sender.userID : SenderRename.RenameID : Sender.userID;
UInt64 UserIDReciepter = ReciepterRename != null ? ReciepterRename.RenameID == 0 ? Reciepter.userID : ReciepterRename.RenameID : Reciepter.userID;
String SenderName = SenderRename != null ? ReciepterRename.RenameNick ?? Sender.displayName : Sender.displayName;
String ReciepterName = ReciepterRename != null ? ReciepterRename.RenameNick ?? Reciepter.displayName : Reciepter.displayName;
List<Fields> fields = new List<Fields> {
new Fields(LanguageEn ? "Sender" : "Отправитель", $"{SenderName}({UserIDSender})", true), new Fields(LanguageEn ? "Recipient" : "Получатель", $"{ReciepterName}({UserIDReciepter})", true), new Fields(LanguageEn ? "Message" : "Сообщение", MessageLogged, false),
}
;
FancyMessage newMessage = new FancyMessage(null, false, new FancyMessage.Embeds[1] {
new FancyMessage.Embeds(null, 16608621, fields, new Authors("IQChat PM-History", null, "https://i.postimg.cc/SshGgy52/xiwsg5m.png", null), null)
}
);
Request($"{PMChat.Webhooks}", newMessage.toJSON());
}
void ReplyBroadcast(String CustomPrefix = null, String CustomAvatar = null, Boolean AdminAlert = false, String LangKey = "", params object[] args) {
foreach (BasePlayer p in !AdminAlert ? BasePlayer.activePlayerList.Where(p => UserInformation[p.userID].Settings.TurnBroadcast) : BasePlayer.activePlayerList) ReplySystem(p, GetLang(LangKey, p.UserIDString, args), CustomPrefix, CustomAvatar);
}
public Dictionary<UInt64, FlooderInfo> Flooders = new Dictionary<UInt64, FlooderInfo>();
private void ReplyTranslationPM(BasePlayer Sender, BasePlayer TargetUser, String Message, String DisplayNameSender, String TargetDisplayName) {
if (!String.IsNullOrWhiteSpace(config.ReferenceSetting.translationApiSettings.codeLanguagePrimary)) {
Action<String> callback = translation => {
ReplySystem(TargetUser, GetLang("COMMAND_PM_SEND_MSG", TargetUser.UserIDString, DisplayNameSender, !permission.UserHasPermission(TargetUser.UserIDString, PermissionTranslationIgnore) ? translation : Message));
ReplySystem(Sender, GetLang("COMMAND_PM_SUCCESS", Sender.UserIDString, Message, TargetDisplayName));
}
;
TranslationAPI.Call("Translate", Message, config.ReferenceSetting.translationApiSettings.codeLanguagePrimary, "auto", callback);
}
else {
String codeResult = lang.GetLanguage(TargetUser.UserIDString);
saveTranslate.TryAdd(codeResult, new TranslationState());
Action<String> callback = translation => {
saveTranslate[codeResult].IsProcessed = true;
saveTranslate[codeResult].Translation = translation;
saveTranslate[codeResult].DoTranslation = Message;
ReplySystem(TargetUser, GetLang("COMMAND_PM_SEND_MSG", TargetUser.UserIDString, DisplayNameSender, !permission.UserHasPermission(TargetUser.UserIDString, PermissionTranslationIgnore) ? translation : Message));
ReplySystem(Sender, GetLang("COMMAND_PM_SUCCESS", Sender.UserIDString, Message, TargetDisplayName));
}
;
if (lang.GetLanguage(Sender.UserIDString) == codeResult) {
ReplySystem(TargetUser, GetLang("COMMAND_PM_SEND_MSG", TargetUser.UserIDString, DisplayNameSender, Message));
ReplySystem(Sender, GetLang("COMMAND_PM_SUCCESS", Sender.UserIDString, Message, TargetDisplayName));
}
else if (saveTranslate[codeResult].IsProcessed && !string.IsNullOrWhiteSpace(saveTranslate[codeResult].Translation) && Message == saveTranslate[codeResult].DoTranslation) {
ReplySystem(TargetUser, GetLang("COMMAND_PM_SEND_MSG", TargetUser.UserIDString, DisplayNameSender, saveTranslate[codeResult].Translation));
ReplySystem(Sender, GetLang("COMMAND_PM_SUCCESS", Sender.UserIDString, Message, TargetDisplayName));
}
else TranslationAPI.Call("Translate", Message, codeResult, "auto", callback);
}
}
private static InterfaceBuilder _interface;
[ConsoleCommand("adminalert")]
private void AdminAlertConsoleCommand(ConsoleSystem.Arg args) {
BasePlayer Sender = args.Player();
if (Sender != null) if (!permission.UserHasPermission(Sender.UserIDString, PermissionAlert)) return;
Alert(Sender, args.Args, true);
}
Boolean API_CHECK_MUTE_CHAT(UInt64 ID) {
if (!UserInformation.ContainsKey(ID)) return false;
return UserInformation[ID].MuteInfo.IsMute(MuteType.Chat);
}
private String JoinStringList(List<String> inputList) => String.Join(", ", inputList);
private void SaveLogChat(BasePlayer player, Chat.ChatChannel Channel, String MessageLogged) {
String channel = Channel == Chat.ChatChannel.Global ? (LanguageEn ? "Global" : "Глобальный чат") : Channel == Chat.ChatChannel.Local ? (LanguageEn ? "Local" : "Локальный чат") : Channel == Chat.ChatChannel.Cards ? (LanguageEn ? "Poker" : "Покерный чат") : (LanguageEn ? "Team" : "Командный чат");
String messageResult = $"[{DateTime.Now:HH:mm:ss}] [{channel}] {player.displayName} ({player.userID}) : {MessageLogged}";
if (Channel == Chat.ChatChannel.Team) lastLogsTeamChat.Add(messageResult);
else lastLogsGlobalChat.Add(messageResult);
}
private void DiscordLoggMuted(BasePlayer Target, MuteType Type, String Reason = null, String TimeBlocked = null, BasePlayer Moderator = null) {
Configuration.OtherSettings.General MuteChat = config.OtherSetting.LogsMuted;
if (!MuteChat.UseLogged || String.IsNullOrWhiteSpace(MuteChat.Webhooks)) return;
Configuration.ControllerMute.LoggedFuncion ControllerMuted = config.ControllerMutes.LoggedMute;
String ActionReason = String.Empty;
GeneralInformation.RenameInfo RenameSender = GeneralInfo.GetInfoRename(Target.userID);
UInt64 UserIDModeration = 0;
String NickModeration = GetLang("IQCHAT_FUNCED_ALERT_TITLE_SERVER", Target.UserIDString);
if (Moderator != null) {
GeneralInformation.RenameInfo RenameModerator = GeneralInfo.GetInfoRename(Moderator.userID);
UserIDModeration = RenameModerator != null ? RenameModerator.RenameID == 0 ? Moderator.userID : RenameModerator.RenameID : Moderator.userID;
NickModeration = RenameModerator != null ? $"{RenameModerator.RenameNick ?? Moderator.displayName}" : Moderator.displayName;
}
String NickTarget = RenameSender != null ? $"{RenameSender.RenameNick ?? Target.displayName}" : Target.displayName;
UInt64 UserIDTarget = RenameSender != null ? RenameSender.RenameID == 0 ? Target.userID : RenameSender.RenameID : Target.userID;
List<Fields> fields;
switch (Type) {
case MuteType.Chat : {
if (Reason != null) ActionReason = LanguageEn ? "Mute chat" : "Блокировка чата";
else ActionReason = LanguageEn ? "Unmute chat" : "Разблокировка чата";
break;
}
case MuteType.Voice : {
if (Reason != null) ActionReason = LanguageEn ? "Mute voice" : "Блокировка голоса";
else ActionReason = LanguageEn ? "Unmute voice" : "Разблокировка голоса";
break;
}
default : break;
}
Int32 Color = 0;
if (Reason != null) {
fields = new List<Fields> {
new Fields(LanguageEn ? "Nickname of the moderator" : "Ник модератора", NickModeration, true), new Fields(LanguageEn ? "Steam64ID Moderator" : "Steam64ID модератора", $"{UserIDModeration}", true), new Fields(LanguageEn ? "Action" : "Действие", ActionReason, false), new Fields(LanguageEn ? "Reason" : "Причина", Reason, false), new Fields(LanguageEn ? "Time" : "Время", TimeBlocked, false), new Fields(LanguageEn ? "Nick blocked" : "Ник заблокированного", NickTarget, true), new Fields(LanguageEn ? "Steam64ID blocked" : "Steam64ID заблокированного", $"{UserIDTarget}", true),
}
;
if (ControllerMuted.UseHistoryMessage) {
String Messages = GetLastMessage(Target, ControllerMuted.CountHistoryMessage);
if (Messages != null && !String.IsNullOrWhiteSpace(Messages)) fields.Insert(fields.Count, new Fields(LanguageEn ? $"The latter {ControllerMuted.CountHistoryMessage} messages" : $"Последние {ControllerMuted.CountHistoryMessage} сообщений", Messages, false));
}
Color = 14357781;
}
else {
fields = new List<Fields> {
new Fields(LanguageEn ? "Nickname of the moderator" : "Ник модератора", NickModeration, true), new Fields(LanguageEn ? "Steam64ID moderator" : "Steam64ID модератора", $"{UserIDModeration}", true), new Fields(LanguageEn ? "Action" : "Действие", ActionReason, false), new Fields(LanguageEn ? "Nick blocked" : "Ник заблокированного", NickTarget, true), new Fields(LanguageEn ? "Steam64ID blocked" : "Steam64ID заблокированного", $"{UserIDTarget}", true),
}
;
Color = 1432346;
}
FancyMessage newMessage = new FancyMessage(null, false, new FancyMessage.Embeds[1] {
new FancyMessage.Embeds(null, Color, fields, new Authors("IQChat Mute-History", null, "https://i.postimg.cc/SshGgy52/xiwsg5m.png", null), null)
}
);
Request($"{MuteChat.Webhooks}", newMessage.toJSON());
}
[ChatCommand("hmute")]
void HideMute(BasePlayer Moderator, string cmd, string[] arg) {
if (!IsModerator(Moderator)) return;
if (arg == null || arg.Length != 3 || arg.Length > 3) {
ReplySystem(Moderator, LanguageEn ? "Invalid syntax, use : hmute Steam64ID/Nick Reason Time(seconds)" : "Неверный синтаксис,используйте : hmute Steam64ID/Ник Причина Время(секунды)");
return;
}
string NameOrID = arg[0];
string Reason = arg[1];
Int32 TimeMute = 0;
if (!Int32.TryParse(arg[2], out TimeMute)) {
ReplySystem(Moderator, LanguageEn ? "Enter the time in numbers!" : "Введите время цифрами!");
return;
}
BasePlayer target = GetPlayerNickOrID(NameOrID);
if (target == null) {
UInt64 Steam64ID = 0;
if (UInt64.TryParse(NameOrID, out Steam64ID)) {
if (UserInformation.ContainsKey(Steam64ID)) {
User Info = UserInformation[Steam64ID];
if (Info == null) return;
if (Info.MuteInfo.IsMute(MuteType.Chat)) {
ReplySystem(Moderator, LanguageEn ? "The player already has a chat lock" : "Игрок уже имеет блокировку чата");
return;
}
Info.MuteInfo.SetMute(MuteType.Chat, TimeMute);
ReplySystem(Moderator, LanguageEn ? "Chat blocking issued to offline player" : "Блокировка чата выдана offline-игроку");
return;
}
else {
ReplySystem(Moderator, LanguageEn ? "This player is not on the server" : "Такого игрока нет на сервере");
return;
}
}
else {
ReplySystem(Moderator, LanguageEn ? "This player is not on the server" : "Такого игрока нет на сервере");
return;
}
}
MutePlayer(target, MuteType.Chat, 0, Moderator, Reason, TimeMute, true, true);
}
private void SendDiscordLogChats() {
Configuration.OtherSettings.General TeamChat = config.OtherSetting.LogsChat.TeamChatSettings;
if (TeamChat.UseLogged && !String.IsNullOrWhiteSpace(TeamChat.Webhooks) && lastLogsTeamChat.Count > 0) {
List<String> logsToSend = Pool.Get<List<String>>();
Int32 count = Math.Min(10, lastLogsTeamChat.Count);
for (Int32 i = 0; i < count; i++) logsToSend.Add(lastLogsTeamChat[i]);
String resultLogs = String.Join("\n", logsToSend);
FancyMessage newMessage = new FancyMessage(resultLogs, false, null);
Request($"{TeamChat.Webhooks}", newMessage.toJSON());
lastLogsTeamChat.RemoveRange(0, count);
Pool.FreeUnmanaged(ref logsToSend);
}
Configuration.OtherSettings.General GlobalChat = config.OtherSetting.LogsChat.GlobalChatSettings;
if (GlobalChat.UseLogged && !String.IsNullOrWhiteSpace(GlobalChat.Webhooks) && lastLogsGlobalChat.Count > 0) {
List<String> logsToSend = Pool.Get<List<String>>();
Int32 count = Math.Min(10, lastLogsGlobalChat.Count);
for (Int32 i = 0; i < count; i++) logsToSend.Add(lastLogsGlobalChat[i]);
String resultLogs = String.Join("\n", logsToSend);
FancyMessage newMessage = new FancyMessage(resultLogs, false, null);
Request($"{GlobalChat.Webhooks}", newMessage.toJSON());
lastLogsGlobalChat.RemoveRange(0, count);
Pool.FreeUnmanaged(ref logsToSend);
}
}
private object OnServerMessage(String message, String name) {
if (config.ControllerMessages.TurnedFunc.HideAdminGave) if (message.Contains("gave") && name == "SERVER") return true;
return null;
}
private const String PermissionHideConnection = "iqchat.hideconnection";
public class TranslationState {
public Boolean IsProcessed {
get;
set;
}
public String Translation {
get;
set;
}
public String DoTranslation {
get;
set;
}
}
[ChatCommand("alertuip")]
private void AlertUIPChatCommand(BasePlayer Sender, String cmd, String[] args) {
if (!permission.UserHasPermission(Sender.UserIDString, PermissionAlert)) return;
if (args == null || args.Length == 0) {
ReplySystem(Sender, LanguageEn ? "You didn't specify a player!" : "Вы не указали игрока!");
return;
}
BasePlayer Recipient = BasePlayer.Find(args[0]);
if (Recipient == null) {
ReplySystem(Sender, LanguageEn ? "The player is not on the server!" : "Игрока нет на сервере!");
return;
}
AlertUI(Sender, Recipient, args.Skip(1).ToArray());
}
private const String PermissionAlert = "iqchat.alertuse";
String IQRankGetTimeGame(BasePlayer player) => (string)(IQRankSystem?.Call("API_GET_TIME_GAME", player.userID.Get()));
public void AnwserMessage(BasePlayer player, String Message) {
Configuration.AnswerMessage Anwser = config.AnswerMessages;
if (!Anwser.UseAnswer) return;
foreach (KeyValuePair<String, Configuration.LanguageController> Anwsers in Anwser.AnswerMessageList) if (Message.Contains(Anwsers.Key.ToLower())) {
String templateText = GetMessages(player, Anwsers.Value.LanguageMessages);
if(String.IsNullOrWhiteSpace(templateText)) continue;
ReplySystem(player, templateText);
}
}
private void DrawUI_IQChat_Sliders(BasePlayer player, String Name, String OffsetMin, String OffsetMax, TakeElementUser ElementType) {
String Interface = InterfaceBuilder.GetInterface("UI_Chat_Slider");
if (Interface == null) return;
Interface = Interface.Replace("%OFFSET_MIN%", OffsetMin);
Interface = Interface.Replace("%OFFSET_MAX%", OffsetMax);
Interface = Interface.Replace("%NAME%", Name);
Interface = Interface.Replace("%COMMAND_LEFT_SLIDE%", $"newui.cmd slider.controller {ElementType} -");
Interface = Interface.Replace("%COMMAND_RIGHT_SLIDE%", $"newui.cmd slider.controller {ElementType} +");
CuiHelper.DestroyUi(player, Name);
CuiHelper.AddUi(player, Interface);
DrawUI_IQChat_Slider_Update_Argument(player, ElementType);
}
String API_GET_DEFAULT_MESSAGE_COLOR() => config.ControllerConnect.SetupDefaults.MessageDefault;
private void DrawUI_IQChat_Mute_And_Ignore_Player_Panel(BasePlayer player, SelectedAction Action, Int32 Page = 0, String SearchName = null) {
String Interface = InterfaceBuilder.GetInterface("UI_Chat_Mute_And_Ignore_Panel_Content");
if (Interface == null) return;
CuiHelper.DestroyUi(player, "MuteIgnorePanelContent");
CuiHelper.AddUi(player, Interface);
if (IsReadyIQFakeActive()) {
List<FakePlayer> filteredPlayers = GetFilteredPlayers(SearchName);
DrawUI_IQChat_Mute_And_Ignore_Pages(player, HasMorePages(filteredPlayers, Page), Action, Page);
DrawUI_IQChat_Mute_And_Ignore_Player(player, Action, null, GetPageOfPlayers(filteredPlayers, Page));
}
else {
IOrderedEnumerable<BasePlayer> playerList = GetPlayerList(SearchName, Action);
DrawUI_IQChat_Mute_And_Ignore_Pages(player, HasMorePages(playerList, Page), Action, Page);
DrawUI_IQChat_Mute_And_Ignore_Player(player, Action, playerList.Skip(18 * Page).Take(18));
}
}
private void DrawUI_IQChat_Update_MuteVoice_All(BasePlayer player) {
if (!permission.UserHasPermission(player.UserIDString, PermissionMutedAdmin)) return;
String InterfaceAdministratorVoice = InterfaceBuilder.GetInterface("UI_Chat_Administation_AllVoce");
if (InterfaceAdministratorVoice == null) return;
InterfaceAdministratorVoice = InterfaceAdministratorVoice.Replace("%TEXT_MUTE_ALLVOICE%", GetLang(!GeneralInfo.TurnMuteAllVoice ? "IQCHAT_BUTTON_MODERATION_MUTE_ALL_VOICE" : "IQCHAT_BUTTON_MODERATION_UNMUTE_ALL_VOICE", player.UserIDString));
InterfaceAdministratorVoice = InterfaceAdministratorVoice.Replace("%COMMAND_MUTE_ALLVOICE%", $"newui.cmd action.mute.ignore mute.controller {SelectedAction.Mute} mute.all.voice");
CuiHelper.DestroyUi(player, "ModeratorMuteAllVoi
// ... [Code preview truncated due to length. Full source in attached file] ...