C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CompanionServer;
using ConVar;
using Facepunch;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Oxide.Core;
using Oxide.Core.Libraries;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
namespace Oxide.Plugins {
[Info("IQChat", "TopPlugin.ru", "1.0.0")]
[Description("Самый приятный чат для вашего сервера из ветки IQ")]
class IQChat : RustPlugin {
#region Reference
[PluginReference]
Plugin IQPersonal, IQFakeActive, XDNotifications, IQRankSystem;
#region IQPersonal
public void SetMute(BasePlayer player) => IQPersonal?.CallHook("API_SET_MUTE", player.userID);
public void BadWords(BasePlayer player) => IQPersonal?.CallHook("API_DETECTED_BAD_WORDS", player.userID);
#endregion
#region XDNotifications
private void AddNotify(BasePlayer player, string title, string description, string command = "", string cmdyes = "", string cmdno = "") {
if (!XDNotifications) return;
var Setting = config.ReferenceSetting.XDNotificationsSettings;
Interface.Oxide.CallHook("AddNotify", player, title, description, Setting.Color, Setting.AlertDelete, Setting.SoundEffect, command, cmdyes, cmdno);
}
#endregion
#region IQFakeActive
public bool IsFake(string DisplayName) => (bool)IQFakeActive?.Call("IsFake", DisplayName);
void SyncReservedFinish() {
if (!config.ReferenceSetting.IQFakeActiveSettings.UseIQFakeActive) return;
PrintWarning("IQChat - успешно синхронизирована с IQFakeActive");
PrintWarning("=============SYNC==================");
}
#endregion
#region IQRankSystem
string IQRankGetRank(ulong userID) => (string)(IQRankSystem?.Call("API_GET_RANK_NAME", userID));
string IQRankGetTimeGame(ulong userID) => (string)(IQRankSystem?.Call("API_GET_TIME_GAME", userID));
List<string> IQRankListKey(ulong userID) => (List<string>)(IQRankSystem?.Call("API_RANK_USER_KEYS", userID));
string IQRankGetNameRankKey(string Key) => (string)(IQRankSystem?.Call("API_GET_RANK_NAME", Key));
void IQRankSetRank(ulong userID, string RankKey) => IQRankSystem?.Call("API_SET_ACTIVE_RANK", userID, RankKey);
bool IQRankUserAcces(ulong userID, string RankKey) => (bool)IQRankSystem?.Call("API_GET_RANK_ACCESS", userID, RankKey);
#endregion
#endregion
#region Vars
public Dictionary<BasePlayer, BasePlayer> PMHistory = new Dictionary<BasePlayer, BasePlayer>();
public string PermMuteMenu = "iqchat.muteuse";
class Response {
[JsonProperty("country")]
public string Country {
get;
set;
}
}
public static StringBuilder sb = new StringBuilder();
public string GetLang(string LangKey, string userID = null, params object[] args) {
sb.Clear();
if (args != null) {
sb.AppendFormat(lang.GetMessage(LangKey, this, userID), args);
return sb.ToString();
}
return lang.GetMessage(LangKey, this, userID);
}
#endregion
#region Configuration
private static Configuration config = new Configuration();
private class Configuration {
[JsonProperty("Права для смены ника")]
public string RenamePermission;
[JsonProperty("Настройка префиксов")]
public List<AdvancedFuncion> PrefixList = new List<AdvancedFuncion>();
[JsonProperty("Настройка цветов для ников")]
public List<AdvancedFuncion> NickColorList = new List<AdvancedFuncion>();
[JsonProperty("Настройка цветов для сообщений")]
public List<AdvancedFuncion> MessageColorList = new List<AdvancedFuncion>();
[JsonProperty("Настройка сообщений в чате")]
public MessageSettings MessageSetting;
[JsonProperty("Настройка причин блокировок чата")]
public List<ReasonMuteChat> ReasonListChat = new List<ReasonMuteChat>();
[JsonProperty("Настройка интерфейса")]
public InterfaceSettings InterfaceSetting;
[JsonProperty("Настройка оповещения")]
public AlertSetting AlertSettings;
[JsonProperty("Настройка привилегий")]
public AutoSetups AutoSetupSetting;
[JsonProperty("Настройка Rust+")]
public RustPlus RustPlusSettings;
[JsonProperty("Дополнительная настройка")]
public OtherSettings OtherSetting;
[JsonProperty("Настройка автоответчика")]
public AnswerMessage AnswerMessages = new AnswerMessage();
[JsonProperty("Настройка плагинов поддержки")]
public ReferenceSettings ReferenceSetting = new ReferenceSettings();
internal class AdvancedFuncion {
[JsonProperty("Права")]
public string Permissions;
[JsonProperty("Значение")]
public string Argument;
}
internal class AnswerMessage {
[JsonProperty("Включить автоответчик?(true - да/false - нет)")]
public bool UseAnswer;
[JsonProperty("Настройка сообщений [Ключевое слово] = Ответ")]
public Dictionary<string, string> AnswerMessageList = new Dictionary<string, string>();
}
internal class RustPlus {
[JsonProperty("Использовать Rust+")]
public bool UseRustPlus;
[JsonProperty("Название для уведомления Rust+")]
public string DisplayNameAlert;
}
internal class ReasonMuteChat {
[JsonProperty("Причина мута")]
public string Reason;
[JsonProperty("Время мута")]
public int TimeMute;
}
internal class ReferenceSettings {
[JsonProperty("Настройка XDNotifications")]
public XDNotifications XDNotificationsSettings = new XDNotifications();
[JsonProperty("Настройка IQFakeActive")]
public IQFakeActive IQFakeActiveSettings = new IQFakeActive();
[JsonProperty("Настройка IQRankSystem")]
public IQRankSystem IQRankSystems = new IQRankSystem();
internal class XDNotifications {
[JsonProperty("Включить поддержку XDNotifications(UI уведомления будут заменены на уведомление с XDNotifications)")]
public bool UseXDNotifications;
[JsonProperty("Цвет заднего фона уведомления(HEX)")]
public string Color;
[JsonProperty("Через сколько удалиться уведомление")]
public int AlertDelete;
[JsonProperty("Звуковой эффект")]
public string SoundEffect;
}
internal class IQRankSystem {
[JsonProperty("Использовать поддержку рангов")]
public bool UseRankSystem;
[JsonProperty("Отображать игрокам их отыгранное время рядом с рангом")]
public bool UseTimeStandart;
}
internal class IQFakeActive {
[JsonProperty("Использовать поддержку IQFakeActive")]
public bool UseIQFakeActive;
}
}
internal class AutoSetups {
[JsonProperty("Настройки сброса привилегий")]
public ReturnDefault ReturnDefaultSetting = new ReturnDefault();
[JsonProperty("Автоматической установки префиксов/цвета ника/цвета чата")]
public SetupAuto SetupAutoSetting = new SetupAuto();
internal class ReturnDefault {
[JsonProperty("Сбрасывать автоматически префикс при окончании его прав")]
public bool UseDropPrefix;
[JsonProperty("Сбрасывать автоматически цвет ника при окончании его прав")]
public bool UseDropColorNick;
[JsonProperty("Сбрасывать автоматически цвет чата при окончании его прав")]
public bool UseDropColorChat;
[JsonProperty("При окончании префикса, установится данный префикс")]
public string PrefixDefault;
[JsonProperty("При окончании цвета ника, установится данный цвет")]
public string NickDefault;
[JsonProperty("При окончании цвета сообщения, установится данный цвета")]
public string MessageDefault;
}
internal class SetupAuto {
[JsonProperty("Устанавливать автоматически префикс при получении его прав")]
public bool UseSetupAutoPrefix;
[JsonProperty("Устанавливать автоматически цвет ника при получении его прав")]
public bool UseSetupAutoColorNick;
[JsonProperty("Устанавливать автоматически цвет чата при получении его прав")]
public bool UseSetupAutoColorChat;
}
}
internal class MessageSettings {
[JsonProperty("Включить форматирование сообщений")]
public bool FormatingMessage;
[JsonProperty("Включить личные сообщения")]
public bool PMActivate;
[JsonProperty("Включить игнор ЛС игрокам(/ignore nick)")]
public bool IgnoreUsePM;
[JsonProperty("Включить Анти-Спам")]
public bool AntiSpamActivate;
[JsonProperty("Скрыть из чата выдачу предметов Админу")]
public bool HideAdminGave;
[JsonProperty("Использовать список запрещенных слов?")]
public bool UseBadWords;
[JsonProperty("Включить возможность использовать несколько префиксов сразу")]
public bool MultiPrefix;
[JsonProperty("Переносить мут в командный чат(В случае мута,игрок не сможет писать даже в командный чат)")]
public bool MuteTeamChat;
[JsonProperty("Пермишенс для иммунитета к антиспаму")]
public string PermAdminImmunitetAntispam;
[JsonProperty("Наименование оповещения в чат")]
public string BroadcastTitle;
[JsonProperty("Цвет сообщения оповещения в чат")]
public string BroadcastColor;
[JsonProperty("На какое сообщение заменять плохие слова")]
public string ReplaceBadWord;
[JsonProperty("Звук при при получении личного сообщения")]
public string SoundPM;
[JsonProperty("Время,через которое удалится сообщение с UI от администратора")]
public int TimeDeleteAlertUI;
[JsonProperty("Steam64ID для аватарки в чате")]
public ulong Steam64IDAvatar;
[JsonProperty("Время через которое игрок может отправлять сообщение (АнтиСпам)")]
public int FloodTime;
[JsonProperty("Список плохих слов")]
public List<string> BadWords = new List<string>();
}
internal class InterfaceSettings {
[JsonProperty("Значения для плавного появления")]
public float FadeIn;
[JsonProperty("Основной цвет UI")]
public string MainColor;
[JsonProperty("Дополнительный цвет UI")]
public string TwoMainColor;
[JsonProperty("Цвет кнопок")]
public string ButtonColor;
[JsonProperty("Цвет текста")]
public string LabelColor;
[JsonProperty("Цвет UI уведомления")]
public string AlertColor;
[JsonProperty("Настройка расположения UI уведомления")]
public AlertInterfaceSettings AlertInterfaceSetting;
internal class AlertInterfaceSettings {
[JsonProperty("AnchorMin")]
public string AnchorMin;
[JsonProperty("AnchorMax")]
public string AnchorMax;
[JsonProperty("OffsetMin")]
public string OffsetMin;
[JsonProperty("OffsetMax")]
public string OffsetMax;
}
}
internal class AlertSetting {
[JsonProperty("Включить случайное сообщение зашедшему игроку")]
public bool WelcomeMessageUse;
[JsonProperty("Список сообщений игроку при входе")]
public List<string> WelcomeMessage = new List<string>();
[JsonProperty("Уведомлять о входе игрока в чат")]
public bool ConnectedAlert;
[JsonProperty("Включить случайные уведомления о входе игрока из списка")]
public bool ConnectionAlertRandom;
[JsonProperty("Случайные уведомления о входе игрока({0} - ник игрока, {1} - страна(если включено отображение страны)")]
public List<string> RandomConnectionAlert = new List<string>();
[JsonProperty("Отображать страну зашедшего игрока")]
public bool ConnectedWorld;
[JsonProperty("Уведомлять о выходе игрока в чат из списка")]
public bool DisconnectedAlert;
[JsonProperty("Включить случайные уведомления о входе игрока")]
public bool DisconnectedAlertRandom;
[JsonProperty("Случайные уведомления о входе игрока({0} - ник игрока, {1} - причина выхода(если включена причина)")]
public List<string> RandomDisconnectedAlert = new List<string>();
[JsonProperty("Отображать причину выхода игрока")]
public bool DisconnectedReason;
[JsonProperty("При уведомлении о входе/выходе игрока отображать его аватар напротив ника")]
public bool ConnectedAvatarUse;
[JsonProperty("Включить автоматические сообщения в чат")]
public bool AlertMessage;
[JsonProperty("Настройка отправки автоматических сообщений в чат")]
public List<string> MessageList;
[JsonProperty("Интервал отправки сообщений в чат(Броадкастер)")]
public int MessageListTimer;
}
internal class OtherSettings {
[JsonProperty("Использовать дискорд")]
public bool UseDiscord;
[JsonProperty("Вебхук для логирования чата в дискорд")]
public string WebhooksChatLog;
[JsonProperty("Вебхук для логирования информации о мутах в дискорде")]
public string WebhooksMuteInfo;
}
public static Configuration GetNewConfiguration() {
return new Configuration {
PrefixList = new List<AdvancedFuncion> {
new AdvancedFuncion {
Permissions = "iqchat.default", Argument = "<color=yellow><b>[+]</b></color>",
}
, new AdvancedFuncion {
Permissions = "iqchat.default", Argument = "<color=yellow><b>[ИГРОК]</b></color>",
}
, new AdvancedFuncion {
Permissions = "iqchat.vip", Argument = "<color=yellow><b>[VIP]</b></color>",
}
,
}
, NickColorList = new List<AdvancedFuncion> {
new AdvancedFuncion {
Permissions = "iqchat.default", Argument = "#DBEAEC",
}
, new AdvancedFuncion {
Permissions = "iqchat.default", Argument = "#FFC428",
}
, new AdvancedFuncion {
Permissions = "iqchat.vip", Argument = "#45AAB4",
}
,
}
, MessageColorList = new List<AdvancedFuncion> {
new AdvancedFuncion {
Permissions = "iqchat.default", Argument = "#DBEAEC",
}
, new AdvancedFuncion {
Permissions = "iqchat.default", Argument = "#FFC428",
}
, new AdvancedFuncion {
Permissions = "iqchat.vip", Argument = "#45AAB4",
}
,
}
, AutoSetupSetting = new AutoSetups {
ReturnDefaultSetting = new AutoSetups.ReturnDefault {
UseDropColorChat = true, UseDropColorNick = true, UseDropPrefix = true, PrefixDefault = "", NickDefault = "", MessageDefault = "",
}
, SetupAutoSetting = new AutoSetups.SetupAuto {
UseSetupAutoColorChat = true, UseSetupAutoColorNick = true, UseSetupAutoPrefix = true,
}
}
, RustPlusSettings = new RustPlus {
UseRustPlus = true, DisplayNameAlert = "СУПЕР СЕРВЕР",
}
, MessageSetting = new MessageSettings {
UseBadWords = true, HideAdminGave = true, IgnoreUsePM = true, MuteTeamChat = true, PermAdminImmunitetAntispam = "iqchat.adminspam", BroadcastTitle = "<color=#007FFF><b>[ОПОВЕЩЕНИЕ]</b></color>", BroadcastColor = "#74ade1", ReplaceBadWord = "Ругаюсь матом", Steam64IDAvatar = 0, TimeDeleteAlertUI = 5, PMActivate = true, SoundPM = "assets/bundled/prefabs/fx/notice/stack.world.fx.prefab", AntiSpamActivate = true, FloodTime = 5, FormatingMessage = true, MultiPrefix = true, BadWords = new List<string> {
"хуй", "гей", "говно", "бля", "тварь"
}
}
, ReasonListChat = new List<ReasonMuteChat> {
new ReasonMuteChat {
Reason = "Оскорбление родителей", TimeMute = 1200,
}
, new ReasonMuteChat {
Reason = "Оскорбление игроков", TimeMute = 100
}
}
, RenamePermission = "iqchat.renameuse", AlertSettings = new AlertSetting {
MessageListTimer = 60, WelcomeMessageUse = true, ConnectionAlertRandom = false, DisconnectedAlertRandom = false, RandomConnectionAlert = new List<string> {
"{0} влетел как дурачок из {1}", "{0} залетел на сервер из {1}, соболезнуем", "{0} прыгнул на сервачок"
}
, RandomDisconnectedAlert = new List<string> {
"{0} ушел в мир иной", "{0} вылетел с сервера с причиной {1}", "{0} пошел на другой сервачок"
}
, ConnectedAlert = true, ConnectedWorld = true, DisconnectedAlert = true, DisconnectedReason = true, AlertMessage = true, ConnectedAvatarUse = true, MessageList = new List<string> {
"Автоматическое сообщение #1", "Автоматическое сообщение #2", "Автоматическое сообщение #3", "Автоматическое сообщение #4", "Автоматическое сообщение #5", "Автоматическое сообщение #6",
}
, WelcomeMessage = new List<string> {
"Добро пожаловать на сервер SUPERSERVER\nРады,что выбрал именно нас!", "С возвращением на сервер!\nЖелаем тебе удачи", "Добро пожаловать на сервер\nУ нас самые лучшие плагины",
}
,
}
, InterfaceSetting = new InterfaceSettings {
FadeIn = 0.2f, MainColor = "#000000C0", TwoMainColor = "#762424FF", ButtonColor = "#802A2AFF", LabelColor = "#D1C7BEFF", AlertColor = "#802A2AFF", AlertInterfaceSetting = new InterfaceSettings.AlertInterfaceSettings {
AnchorMin = "0 1", AnchorMax = "0 1", OffsetMin = "0 -90", OffsetMax = "320 -20"
}
}
, OtherSetting = new OtherSettings {
UseDiscord = false, WebhooksChatLog = "", WebhooksMuteInfo = "",
}
, AnswerMessages = new AnswerMessage {
UseAnswer = true, AnswerMessageList = new Dictionary<string, string> {
["вайп"]
= "Вайп будет 27.06", ["wipe"] = "Вайп будет 27.06", ["читер"] = "Нашли читера?Напиши /report и отправь жалобу"
}
}
, ReferenceSetting = new ReferenceSettings {
XDNotificationsSettings = new ReferenceSettings.XDNotifications {
UseXDNotifications = false, AlertDelete = 5, Color = "#762424FF", SoundEffect = "",
}
, IQFakeActiveSettings = new ReferenceSettings.IQFakeActive {
UseIQFakeActive = true,
}
, IQRankSystems = new ReferenceSettings.IQRankSystem {
UseRankSystem = false, UseTimeStandart = true
}
}
}
;
}
}
protected override void LoadConfig() {
base.LoadConfig();
try {
config = Config.ReadObject<Configuration>();
if (config == null) LoadDefaultConfig();
}
catch {
PrintWarning("Ошибка #132" + $"чтения конфигурации 'oxide/config/{Name}', создаём новую конфигурацию!!");
LoadDefaultConfig();
}
NextTick(SaveConfig);
}
void RegisteredPermissions() {
for (int MsgColor = 0; MsgColor < config.MessageColorList.Count; MsgColor++) if (!permission.PermissionExists(config.MessageColorList[MsgColor].Permissions, this)) permission.RegisterPermission(config.MessageColorList[MsgColor].Permissions, this);
for (int NickColorList = 0; NickColorList < config.NickColorList.Count; NickColorList++) if (!permission.PermissionExists(config.NickColorList[NickColorList].Permissions, this)) permission.RegisterPermission(config.NickColorList[NickColorList].Permissions, this);
for (int PrefixList = 0; PrefixList < config.PrefixList.Count; PrefixList++) if (!permission.PermissionExists(config.PrefixList[PrefixList].Permissions, this)) permission.RegisterPermission(config.PrefixList[PrefixList].Permissions, this);
permission.RegisterPermission(config.RenamePermission, this);
permission.RegisterPermission(PermMuteMenu, this);
permission.RegisterPermission(config.MessageSetting.PermAdminImmunitetAntispam, this);
PrintWarning("Permissions - completed");
}
protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
protected override void SaveConfig() => Config.WriteObject(config);
#endregion
#region Data
[JsonProperty("Дата с настройкой чата игрока")]
public Dictionary<ulong, SettingUser> ChatSettingUser = new Dictionary<ulong, SettingUser>();
[JsonProperty("Дата с Административной настройкой")]
public AdminSettings AdminSetting = new AdminSettings();
public class SettingUser {
public string ChatPrefix;
public List<string> MultiPrefix = new List<string>();
public string NickColor;
public string MessageColor;
public double MuteChatTime;
public double MuteVoiceTime;
public List<ulong> IgnoredUsers = new List<ulong>();
}
public class AdminSettings {
public bool MuteChatAll;
public bool MuteVoiceAll;
public Dictionary<ulong, string> RenameList = new Dictionary<ulong, string>();
}
void ReadData() {
ChatSettingUser = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, SettingUser>>("IQChat/IQUser");
AdminSetting = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<AdminSettings>("IQChat/AdminSetting");
}
void WriteData() {
Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQChat/IQUser", ChatSettingUser);
Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQChat/AdminSetting", AdminSetting);
}
void RegisteredDataUser(BasePlayer player) {
if (!ChatSettingUser.ContainsKey(player.userID)) ChatSettingUser.Add(player.userID, new SettingUser {
ChatPrefix = config.AutoSetupSetting.ReturnDefaultSetting.PrefixDefault, NickColor = config.AutoSetupSetting.ReturnDefaultSetting.NickDefault, MessageColor = config.AutoSetupSetting.ReturnDefaultSetting.MessageDefault, MuteChatTime = 0, MuteVoiceTime = 0, MultiPrefix = new List<string> {
}
, IgnoredUsers = new List<ulong> {
}
,
}
);
}
#endregion
#region Hooks
private bool OnPlayerChat(BasePlayer player, string message, Chat.ChatChannel channel) {
if (Interface.Oxide.CallHook("CanChatMessage", player, message) != null) return false;
SeparatorChat(channel, player, message);
return false;
}
private object OnServerMessage(string message, string name) {
if (config.MessageSetting.HideAdminGave) if (message.Contains("gave") && name == "SERVER") return true;
return null;
}
void OnUserPermissionGranted(string id, string permName) => AutoSetupData(id, permName);
private void OnUserGroupAdded(string id, string groupName) {
var PermissionsGroup = permission.GetGroupPermissions(groupName);
if (PermissionsGroup == null) return;
foreach (var permName in PermissionsGroup) AutoSetupData(id, permName);
}
void OnUserPermissionRevoked(string id, string permName) => AutoReturnDefaultData(id, permName);
void OnUserGroupRemoved(string id, string groupName) {
var PermissionsGroup = permission.GetGroupPermissions(groupName);
if (PermissionsGroup == null) return;
foreach (var permName in PermissionsGroup) AutoReturnDefaultData(id, permName);
}
object OnPlayerVoice(BasePlayer player, Byte[] data) {
var DataPlayer = ChatSettingUser[player.userID];
bool IsMuted = DataPlayer.MuteVoiceTime > CurrentTime() ? true : false;
if (IsMuted) return false;
return null;
}
private void OnServerInitialized() {
PrintWarning("\n-----------------------------\n" + " Author - https://topplugin.ru/\n" + " VK - https://vk.com/rustnastroika\n" + " Discord - https://discord.com/invite/5DPTsRmd3G\n" + "-----------------------------");
ReadData();
foreach (var p in BasePlayer.activePlayerList) RegisteredDataUser(p);
RegisteredPermissions();
WriteData();
BroadcastAuto();
}
void OnPlayerConnected(BasePlayer player) {
RegisteredDataUser(player);
var Alert = config.AlertSettings;
if (Alert.ConnectedAlert) {
string Avatar = Alert.ConnectedAvatarUse ? player.UserIDString : "";
string Message = string.Empty;
if (config.AlertSettings.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 (Alert.ConnectionAlertRandom) {
sb.Clear();
int RandomIndex = UnityEngine.Random.Range(0, Alert.RandomConnectionAlert.Count);
Message = sb.AppendFormat(Alert.RandomConnectionAlert[RandomIndex], player.displayName, country).ToString();
}
else Message = GetLang("WELCOME_PLAYER_WORLD", player.UserIDString, player.displayName, country);
ReplyBroadcast(Message, "", Avatar);
}
, this);
}
else {
if (Alert.ConnectionAlertRandom) {
sb.Clear();
int RandomIndex = UnityEngine.Random.Range(0, Alert.RandomConnectionAlert.Count);
Message = sb.AppendFormat(Alert.RandomConnectionAlert[RandomIndex], player.displayName).ToString();
}
else Message = GetLang("WELCOME_PLAYER", player.UserIDString, player.displayName);
ReplyBroadcast(Message);
}
}
if (Alert.WelcomeMessageUse) {
int RandomMessage = UnityEngine.Random.Range(0, Alert.WelcomeMessage.Count);
string WelcomeMessage = Alert.WelcomeMessage[RandomMessage];
ReplySystem(Chat.ChatChannel.Global, player, WelcomeMessage);
}
}
void Unload() => WriteData();
void OnPlayerDisconnected(BasePlayer player, string reason) {
var Alert = config.AlertSettings;
if (Alert.DisconnectedAlert) {
string Avatar = Alert.ConnectedAvatarUse ? player.UserIDString : "";
string Message = string.Empty;
if (Alert.DisconnectedAlertRandom) {
sb.Clear();
int RandomIndex = UnityEngine.Random.Range(0, Alert.RandomDisconnectedAlert.Count);
Message = sb.AppendFormat(Alert.RandomDisconnectedAlert[RandomIndex], player.displayName, reason).ToString();
}
else Message = config.AlertSettings.DisconnectedReason ? GetLang("LEAVE_PLAYER_REASON", player.UserIDString, player.displayName, reason) : GetLang("LEAVE_PLAYER", player.UserIDString, player.displayName);
ReplyBroadcast(Message, "", Avatar);
}
}
#endregion
#region DiscordFunc
#region FancyDiscord
public class FancyMessage {
public string content {
get;
set;
}
public bool tts {
get;
set;
}
public Embeds[] embeds {
get;
set;
}
public class Embeds {
public string title {
get;
set;
}
public int color {
get;
set;
}
public List<Fields> fields {
get;
set;
}
public Footer footer {
get;
set;
}
public Authors author {
get;
set;
}
public Embeds(string title, int color, List<Fields> fields, Authors author, Footer footer) {
this.title = title;
this.color = color;
this.fields = fields;
this.author = author;
this.footer = footer;
}
}
public FancyMessage(string content, bool tts, Embeds[] embeds) {
this.content = content;
this.tts = tts;
this.embeds = embeds;
}
public string toJSON() => JsonConvert.SerializeObject(this);
}
public class Footer {
public string text {
get;
set;
}
public string icon_url {
get;
set;
}
public string proxy_icon_url {
get;
set;
}
public Footer(string text, string icon_url, string proxy_icon_url) {
this.text = text;
this.icon_url = icon_url;
this.proxy_icon_url = proxy_icon_url;
}
}
public class Authors {
public string name {
get;
set;
}
public string url {
get;
set;
}
public string icon_url {
get;
set;
}
public string proxy_icon_url {
get;
set;
}
public Authors(string name, string url, string icon_url, string proxy_icon_url) {
this.name = name;
this.url = url;
this.icon_url = icon_url;
this.proxy_icon_url = proxy_icon_url;
}
}
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;
}
}
private void Request(string url, string payload, Action<int> callback = null) {
Dictionary<string, string> header = new Dictionary<string, string>();
header.Add("Content-Type", "application/json");
webrequest.Enqueue(url, payload, (code, response) => {
if (code != 200 && code != 204) {
if (response != null) {
try {
JObject json = JObject.Parse(response);
if (code == 429) {
float seconds = float.Parse(Math.Ceiling((double)(int)json["retry_after"] / 1000).ToString());
}
else {
PrintWarning($" Discord rejected that payload! Responded with \"{json["message"].ToString()}\" Code: {code}");
}
}
catch {
PrintWarning($"Failed to get a valid response from discord! Error: \"{response}\" Code: {code}");
}
}
else {
PrintWarning($"Discord didn't respond (down?) Code: {code}");
}
}
try {
callback?.Invoke(code);
}
catch (Exception ex) {
}
}
, this, RequestMethod.POST, header);
}
#endregion
void DiscordSendMessage(string key, string WebHooks, ulong userID = 0, params object[] args) {
if (!config.OtherSetting.UseDiscord) return;
if (String.IsNullOrWhiteSpace(WebHooks)) return;
List<Fields> fields = new List<Fields> {
new Fields("IQChat", key, true),
}
;
FancyMessage newMessage = new FancyMessage(null, false, new FancyMessage.Embeds[1] {
new FancyMessage.Embeds(null, 635133, fields, new Authors("IQChat", "https://vk.com/mir_inc", "https://i.imgur.com/ILk3uJc.png", null), new Footer("Author: Mercury[vk.com/mir_inc]", "https://i.imgur.com/ILk3uJc.png", null))
}
);
Request($"{WebHooks}", newMessage.toJSON());
}
#endregion
#region Func
public bool IsMutedUser(ulong userID) {
var DataPlayer = ChatSettingUser[userID];
return DataPlayer.MuteChatTime > CurrentTime() ? true : false;
}
private void SeparatorChat(Chat.ChatChannel channel, BasePlayer player, string Message) {
var DataPlayer = ChatSettingUser[player.userID];
if (IsMutedUser(player.userID)) {
ReplySystem(Chat.ChatChannel.Global, player, GetLang("FUNC_MESSAGE_ISMUTED_TRUE", player.UserIDString, FormatTime(TimeSpan.FromSeconds(DataPlayer.MuteChatTime - CurrentTime()))));
return;
}
var RankSettings = config.ReferenceSetting.IQRankSystems;
var MessageSettings = config.MessageSetting;
string OutMessage = Message;
string PrefxiPlayer = "";
string MessageSeparator = "";
string ColorNickPlayer = DataPlayer.NickColor;
string ColorMessagePlayer = DataPlayer.MessageColor;
string DisplayName = AdminSetting.RenameList.ContainsKey(player.userID) ? AdminSetting.RenameList[player.userID] : player.displayName;
if (MessageSettings.FormatingMessage) OutMessage = $"{Message.ToLower().Substring(0, 1).ToUpper()}{Message.Remove(0, 1).ToLower()}";
if (MessageSettings.UseBadWords) foreach (var DetectedMessage in OutMessage.Split(' ')) if (MessageSettings.BadWords.Contains(DetectedMessage.ToLower())) {
OutMessage = OutMessage.Replace(DetectedMessage, MessageSettings.ReplaceBadWord);
BadWords(player);
}
if (MessageSettings.MultiPrefix) {
if (DataPlayer.MultiPrefix != null) for (int i = 0; i < DataPlayer.MultiPrefix.Count; i++) PrefxiPlayer += DataPlayer.MultiPrefix[i];
}
else PrefxiPlayer = DataPlayer.ChatPrefix;
string ModifiedNick = string.IsNullOrWhiteSpace(ColorNickPlayer) ? player.IsAdmin ? $"<color=#a8fc55>{DisplayName}</color>" : $"<color=#54aafe>{DisplayName}</color>" : $"<color={ColorNickPlayer}>{DisplayName}</color>";
string ModifiedMessage = string.IsNullOrWhiteSpace(ColorMessagePlayer) ? OutMessage : $"<color={ColorMessagePlayer}>{OutMessage}</color>";
string ModifiedChannel = channel == Chat.ChatChannel.Team ? "<color=#a5e664>[Team]</color>" : "";
string Rank = string.Empty;
string RankTime = string.Empty;
if (IQRankSystem) if (RankSettings.UseRankSystem) {
if (RankSettings.UseTimeStandart) RankTime = $"{IQRankGetTimeGame(player.userID)}";
Rank = $"{IQRankGetRank(player.userID)}";
}
MessageSeparator = !String.IsNullOrWhiteSpace(Rank) && !String.IsNullOrWhiteSpace(RankTime) ? $"{ModifiedChannel} [{RankTime}] [{Rank}] {PrefxiPlayer} {ModifiedNick}: {ModifiedMessage}" : !String.IsNullOrWhiteSpace(RankTime) ? $"{ModifiedChannel} [{RankTime}] {PrefxiPlayer} {ModifiedNick}: {ModifiedMessage}" : !String.IsNullOrWhiteSpace(Rank) ? $"{ModifiedChannel} [{Rank}] {PrefxiPlayer} {ModifiedNick}: {ModifiedMessage}" : $"{ModifiedChannel} {PrefxiPlayer} {ModifiedNick}: {ModifiedMessage}";
if (config.RustPlusSettings.UseRustPlus) if (channel == Chat.ChatChannel.Team) {
RelationshipManager.PlayerTeam Team = RelationshipManager.ServerInstance.FindTeam(player.currentTeam);
if (Team == null) return;
Util.BroadcastTeamChat(player.Team, player.userID, player.displayName, OutMessage, DataPlayer.MessageColor);
}
ReplyChat(channel, player, MessageSeparator);
AnwserMessage(player, MessageSeparator.ToLower());
Puts($"{player}: {OutMessage}");
Log($"СООБЩЕНИЕ В ЧАТ : {player}: {ModifiedChannel} {OutMessage}");
DiscordSendMessage(GetLang("DISCORD_SEND_LOG_CHAT", player.UserIDString, player.displayName, player.UserIDString, OutMessage, Message), config.OtherSetting.WebhooksChatLog, player.userID);
RCon.Broadcast(RCon.LogType.Chat, new Chat.ChatEntry {
Message = $"{player.displayName} : {OutMessage}", UserId = player.UserIDString, Username = player.displayName, Channel = channel, Time = (DateTime.UtcNow.Hour * 3600) + (DateTime.UtcNow.Minute * 60),
}
);
}
public void AutoSetupData(string id, string perm) {
var AutoSetup = config.AutoSetupSetting.SetupAutoSetting;
if (String.IsNullOrWhiteSpace(id)) return;
if (String.IsNullOrWhiteSpace(perm)) return;
ulong userID;
if (!ulong.TryParse(id, out userID)) return;
if (!ChatSettingUser.ContainsKey(userID)) return;
var DataPlayer = ChatSettingUser[userID];
var Prefix = config.PrefixList.FirstOrDefault(x => x.Permissions == perm);
var ColorChat = config.MessageColorList.FirstOrDefault(x => x.Permissions == perm);
var ColorNick = config.NickColorList.FirstOrDefault(x => x.Permissions == perm);
if (AutoSetup.UseSetupAutoPrefix) if (Prefix != null) {
if (!config.MessageSetting.MultiPrefix) DataPlayer.ChatPrefix = Prefix.Argument;
else DataPlayer.MultiPrefix.Add(Prefix.Argument);
BasePlayer player = BasePlayer.FindByID(userID);
if (player != null) ReplySystem(Chat.ChatChannel.Global, player, GetLang("PREFIX_SETUP", player.UserIDString, Prefix.Argument));
}
if (AutoSetup.UseSetupAutoColorChat) if (ColorChat != null) {
DataPlayer.MessageColor = ColorChat.Argument;
BasePlayer player = BasePlayer.FindByID(userID);
if (player != null) ReplySystem(Chat.ChatChannel.Global, player, GetLang("COLOR_CHAT_SETUP", player.UserIDString, ColorChat.Argument));
}
if (AutoSetup.UseSetupAutoColorNick) if (ColorNick != null) {
DataPlayer.NickColor = ColorNick.Argument;
BasePlayer player = BasePlayer.FindByID(userID);
if (player != null) ReplySystem(Chat.ChatChannel.Global, player, GetLang("COLOR_NICK_SETUP", player.UserIDString, ColorNick.Argument));
}
}
public void AutoReturnDefaultData(string id, string perm) {
var AutoReturn = config.AutoSetupSetting.ReturnDefaultSetting;
if (String.IsNullOrWhiteSpace(id)) return;
if (String.IsNullOrWhiteSpace(perm)) return;
ulong userID;
if (!ulong.TryParse(id, out userID)) return;
if (!userID.IsSteamId()) return;
if (!ChatSettingUser.ContainsKey(userID)) return;
var DataPlayer = ChatSettingUser[userID];
var Prefix = config.PrefixList.FirstOrDefault(x => x.Permissions == perm);
var ColorChat = config.MessageColorList.FirstOrDefault(x => x.Permissions == perm);
var ColorNick = config.NickColorList.FirstOrDefault(x => x.Permissions == perm);
if (AutoReturn.UseDropPrefix) if (Prefix != null) {
if (config.MessageSetting.MultiPrefix) {
if (DataPlayer.MultiPrefix.Contains(Prefix.Argument)) {
DataPlayer.MultiPrefix.Remove(Prefix.Argument);
BasePlayer player = BasePlayer.FindByID(userID);
if (player != null) ReplySystem(Chat.ChatChannel.Global, player, GetLang("PREFIX_RETURNRED", player.UserIDString, Prefix.Argument));
}
}
else if (DataPlayer.ChatPrefix == Prefix.Argument) {
DataPlayer.ChatPrefix = AutoReturn.PrefixDefault;
BasePlayer player = BasePlayer.FindByID(userID);
if (player != null) ReplySystem(Chat.ChatChannel.Global, player, GetLang("PREFIX_RETURNRED", player.UserIDString, Prefix.Argument));
}
}
if (AutoReturn.UseDropColorChat) if (ColorChat != null) if (DataPlayer.MessageColor == ColorChat.Argument) {
DataPlayer.MessageColor = AutoReturn.MessageDefault;
BasePlayer player = BasePlayer.FindByID(userID);
if (player != null) ReplySystem(Chat.ChatChannel.Global, player, GetLang("COLOR_CHAT_RETURNRED", player.UserIDString, ColorChat.Argument));
}
if (AutoReturn.UseDropColorNick) if (ColorNick != null) if (DataPlayer.NickColor == ColorNick.Argument) {
DataPlayer.NickColor = AutoReturn.NickDefault;
BasePlayer player = BasePlayer.FindByID(userID);
if (player != null) ReplySystem(Chat.ChatChannel.Global, player, GetLang("COLOR_NICK_RETURNRED", player.UserIDString, ColorNick.Argument));
}
}
public void AnwserMessage(BasePlayer player, string Message) {
var Anwser = config.AnswerMessages;
if (!Anwser.UseAnswer) return;
foreach (var Anwsers in Anwser.AnswerMessageList) if (Message.Contains(Anwsers.Key.ToLower())) ReplySystem(Chat.ChatChannel.Global, player, Anwsers.Value);
}
public void BroadcastAuto() {
var Alert = config.AlertSettings;
if (Alert.AlertMessage) {
timer.Every(Alert.MessageListTimer, () => {
var RandomMsg = Alert.MessageList[UnityEngine.Random.Range(0, Alert.MessageList.Count)];
ReplyBroadcast(RandomMsg);
}
);
}
}
public void MutePlayer(BasePlayer player, string Format, int ReasonIndex, string ResonCustom = "", string TimeCustom = "", BasePlayer Initiator = null) {
var cfg = config.ReasonListChat[ReasonIndex];
string Reason = string.IsNullOrEmpty(ResonCustom) ? cfg.Reason : ResonCustom;
float TimeMute = string.IsNullOrEmpty(TimeCustom) ? cfg.TimeMute : Convert.ToInt32(TimeCustom);
string DisplayInititator = Initiator == null ? "Администратор" : Initiator.displayName;
ulong UserIdInitiator = Initiator == null ? 0 : Initiator.userID;
switch (Format) {
case "mutechat" : {
ChatSettingUser[player.userID].MuteChatTime = TimeMute + CurrentTime();
ReplyBroadcast(GetLang("FUNC_MESSAGE_MUTE_CHAT", player.UserIDString, DisplayInititator, player.displayName, FormatTime(TimeSpan.FromSeconds(TimeMute)), Reason));
if (Initiator != null) SetMute(Initiator);
// ... [Code preview truncated due to length. Full source in attached file] ...