C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Configuration;
using Oxide.Core.Libraries;
using Oxide.Core.Plugins;
using UnityEngine;
using Network;
using System.Text.RegularExpressions;
using Oxide.Core.Libraries.Covalence;
namespace Oxide.Plugins {
[Info("ChatManager", "bazuka5801", "1.0.1")]
public class ChatManager : RustPlugin {
private static ChatManager m_Instance;
private const string PERM_MODER = "chatmanager.moderat";
Dictionary<ulong, double> mutes = new Dictionary<ulong, double>();
Dictionary<ulong, PlayerData> players = new Dictionary<ulong, PlayerData>();
private PlayerData defaultData = new PlayerData();
bool globalMute = false;
[PluginReference("Clans")]
Plugin Clans;
void OnServerInitialized() {
m_Instance = this;
lang.RegisterMessages(Messages, this, "en");
Messages = lang.GetMessages("en", this);
LoadConfig();
LoadConfigValues();
LoadData();
timer.Every(1f, () => {
List<ulong> toDelete = new List<ulong>();
toDelete.AddRange(floods.Keys.ToList().Where(flood => --floods[flood] < 0));
toDelete.ForEach(p => floods.Remove(p));
}
);
}
void Unload() {
OnServerSave();
}
Dictionary<ulong, int> floods = new Dictionary<ulong, int>();
bool? OnPlayerChat(ConsoleSystem.Arg arg) {
if (arg.Args.Contains("<size=")) return null;
var sender = arg.Player();
var message = arg.GetString(0, "text").Trim();
int m = 0;
try {
m++;
if (SpamCheck(sender, message) != null) return true;
m++;
if (MuteCheck(sender) != null) return true;
m++;
int floodTime;
if (floods.TryGetValue(sender.userID, out floodTime)) {
floodTime++;
SendReply(sender, string.Format(Messages["floodTimeout"], floodTime));
floods[sender.userID] = floodTime;
return true;
}
else {
floods[sender.userID] = 3;
}
if (Configuration.CapsBlock && !IsModerator(sender)) {
message = RemoveCaps(message);
}
m++;
bool mute;
var censorMessage = CensorBadWords(message, out mute);
if (Configuration.BadWordsBlock & mute) {
Mute(sender, Configuration.MuteBadWordsDefault);
}
m++;
var pData = GetPlayerData(sender);
m++;
var prefix = config.Get(config.prefixes, pData.Prefix).Format;
m++;
var nameColor = config.Get(config.names, pData.NameColor).Format;
m++;
var messageColor = config.Get(config.messages, pData.MessageColor).Format;
m++;
Interface.Oxide.RootLogger.Write(Oxide.Core.Logging.LogType.Info, $"[CHAT] {sender.userID}/{sender.displayName}: {message}");
m++;
var name = Format(nameColor, sender.displayName);
m++;
message = Format(messageColor, message);
m++;
censorMessage = Format(messageColor, censorMessage);
m++;
if (prefix.Length > 0) name = GetClanTag(sender.userID) + $"{prefix} {name}";
else name = GetClanTag(sender.userID) + $"{name}";
m++;
foreach (var player in BasePlayer.activePlayerList) {
SendChat(player, name, GetPlayerData(player).Censor ? censorMessage : message, sender.userID);
}
m++;
return false;
}
catch(Exception ex) {
PrintError($"Ошибка под индексом {m}");
PrintError(ex.Message);
}
return null;
}
void SendChat(BasePlayer player, string name, string message, ulong userId = 0) {
if (message.Contains("<size=")) return;
if (globalMute == true && !IsModerator(player)) {
Reply(player, "MUTE.ALL.ACTIVE");
return;
}
player.SendConsoleCommand("chat.add", userId, string.IsNullOrEmpty(name) ? $"{message}" : $"{name}: {message}");
}
public string CensorBadWords(string input, out bool found) {
found = false;
string temp = input.ToLower();
foreach (var swear in config.badWords) {
var firstIndex = temp.IndexOf(swear.Key);
if (firstIndex >= 0 && swear.Value.All(exception => temp.IndexOf(exception) < 0)) while (firstIndex < input.Length && input[firstIndex] != ' ') {
input = input.Remove(firstIndex, 1);
input = input.Insert(firstIndex, "*");
firstIndex++;
found = true;
}
}
return input;
}
void Mute(BasePlayer player, long time, string reason = "") {
mutes[player.userID] = GrabCurrentTime() + time;
string message = Messages["USER.MUTED.REASON"];
if (string.IsNullOrEmpty(reason)) message = Messages["USER.MUTED"];
BroadcastChat("", string.Format(message, player.displayName, reason, TimeToString(time)));
}
void BroadcastChat(string name, string message, ulong userId = 0, string censormessage = "") {
if (string.IsNullOrEmpty(censormessage)) censormessage = message;
ConsoleNetwork.BroadcastToAllClients("chat.add", userId, string.IsNullOrEmpty(name) ? $"{censormessage}" : $"{name}: {censormessage}");
}
string RemoveCaps(string message) {
var ss = message.Split(' ');
for (int j = 0; j < ss.Length; j++) for (int i = 1; i < ss[j].Length; i++) {
var sym = ss[j][i];
if (char.IsLower(sym)) continue;
ss[j] = ss[j].Remove(i, 1);
ss[j] = ss[j].Insert(i, char.ToLower(sym).ToString());
}
return string.Join(" ", ss);
}
bool? MuteCheck(BasePlayer sender) {
double muteTime;
if (mutes.TryGetValue(sender.userID, out muteTime)) {
var remain = muteTime - GrabCurrentTime();
if (remain >= 0) {
Reply(sender, "YOU.MUTED", TimeToString(remain));
return true;
}
mutes.Remove(sender.userID);
}
return null;
}
public string TimeToString(double time) {
TimeSpan elapsedTime = TimeSpan.FromSeconds(time);
int hours = elapsedTime.Hours;
int minutes = elapsedTime.Minutes;
int seconds = elapsedTime.Seconds;
int days = Mathf.FloorToInt((float)elapsedTime.TotalDays);
string s = "";
if (days > 0) s += $"{days}дн.";
if (hours > 0) s += $"{hours}ч.";
if (minutes > 0) s += $"{minutes}мин.";
if (seconds > 0) s += $"{seconds}сек.";
else s = s.TrimEnd(' ');
return s;
}
bool? SpamCheck(BasePlayer sender, string message) {
if (message.Contains("<size=")) return null;
if (message.Length > 500) {
sender.Kick("CHAT SPAM > 500 CHARS");
return false;
}
if (message.Length > 100) {
SendReply(sender, "Запрещено отправлять столько символов");
return false;
}
return null;
}
#region Clan Helper
string GetClanTag(ulong id) {
string clantag = (string)Clans?.Call("GetClanOf", id);
string togetherstring = "<color=" + Configuration.ClanColor + ">[" + clantag + "]</color> ";
if (clantag != null && !string.IsNullOrEmpty(clantag)) return togetherstring;
return null;
}
#endregion
#region Commands
Dictionary<ulong, ulong> pmHistory = new Dictionary<ulong, ulong>();
[ChatCommand("pm")]
void cmdChatPM(BasePlayer player, string command, string[] args) {
if (args.Length < 2) {
Reply(player, "CMD.PM.HELP");
return;
}
if (args.Contains("<size=")) return;
var argList = args.ToList();
argList.RemoveAt(0);
string message = string.Join(" ", argList.ToArray());
var reciever = BasePlayer.activePlayerList.FirstOrDefault(p => p.displayName.ToLower().Contains(args[0].ToLower()));
if (reciever == null) {
Reply(player, "PLAYER.NOT.FOUND", args[0]);
return;
}
if (GetPlayerData(reciever).BlackList.Contains(player.userID)) {
Reply(player, "PM.YOU.ARE.BLACK.LIST", reciever.displayName);
return;
}
pmHistory[player.userID] = reciever.userID;
pmHistory[reciever.userID] = player.userID;
Reply(player, "PM.SENDER.FORMAT", reciever.displayName, message);
Reply(reciever, "PM.RECEIVER.FORMAT", player.displayName, message);
if (GetPlayerData(reciever).PMSound) {
Effect.server.Run(Configuration.PrivateSoundMessagePath, reciever.GetNetworkPosition());
}
}
[ChatCommand("r")]
void cmdChatR(BasePlayer player, string command, string[] args) {
if (args.Length == 0) {
Reply(player, "CMD.R.HELP");
return;
}
if (args.Contains("<size=")) return;
var argList = args.ToList();
string message = string.Join(" ", argList.ToArray());
ulong recieverUserId;
if (!pmHistory.TryGetValue(player.userID, out recieverUserId)) {
Reply(player, "PM.NO.MESSAGES");
return;
}
var reciever = BasePlayer.activePlayerList.FirstOrDefault(p => p.userID == recieverUserId);
if (reciever == null) {
Reply(player, "PM.PLAYER.LEAVE");
return;
}
if (GetPlayerData(reciever).BlackList.Contains(player.userID)) {
Reply(player, "PM.YOU.ARE.BLACK.LIST", reciever.displayName);
return;
}
Reply(player, "PM.SENDER.FORMAT", reciever.displayName, message);
Reply(reciever, "PM.RECEIVER.FORMAT", player.displayName, message);
if (GetPlayerData(reciever).PMSound) {
Effect.server.Run(Configuration.PrivateSoundMessagePath, reciever.GetNetworkPosition());
}
}
[ChatCommand("mute")]
void cmdChatMute(BasePlayer player, string command, string[] args) {
if (!IsModerator(player)) {
Reply(player, "NO.ACCESS");
return;
}
if (args.Length < 2) {
Reply(player, "CMD.MUTE.HELP");
return;
}
var mutePlayer = BasePlayer.activePlayerList.FirstOrDefault(p => p.displayName.ToLower().Contains(args[0].ToLower()));
if (mutePlayer == null) {
Reply(player, "PLAYER.NOT.FOUND", args[0]);
return;
}
if (mutes.ContainsKey(mutePlayer.userID)) {
Reply(player, "USER.ALREADY.MUTED", mutePlayer.displayName, TimeToString(mutes[mutePlayer.userID]));
return;
}
double time = StringToTime(args[1]);
string reason = "";
if (args.Length > 2) reason = args[2];
Mute(mutePlayer, Convert.ToInt64(time), reason);
}
[ChatCommand("muteall")]
void CmdGlobalMute(BasePlayer player, string command, string[] args) {
if (!IsModerator(player)) {
Reply(player, "NO.ACCESS");
return;
}
if (args.Length == 0) {
Reply(player, "CMD.MUTE.ALL.HELP");
return;
}
if (args[0] == "on") {
globalMute = true;
PublicMessage("MUTE.ALL.ENABLED");
return;
}
else {
globalMute = false;
PublicMessage("MUTE.ALL.DISABLED");
return;
}
}
[ChatCommand("unmute")]
void cmdChatUnMute(BasePlayer player, string command, string[] args) {
if (!IsModerator(player)) {
Reply(player, "NO.ACCESS");
return;
}
if (args.Contains("<size=")) {
SendReply(player, "Отправка сообщений с большим size запрещена!");
}
var mutePlayer = BasePlayer.activePlayerList.FirstOrDefault(p => p.displayName.ToLower().Contains(args[0].ToLower()));
if (mutePlayer == null) {
Reply(player, "PLAYER.NOT.FOUND", args[0]);
return;
}
if (!mutes.ContainsKey(mutePlayer.userID)) {
SendReply(player, "У игрока нет мута");
return;
}
mutes.Remove(mutePlayer.userID);
BroadcastChat("", string.Format(Messages["USER.UNMUTED"], mutePlayer.displayName));
}
public long StringToTime(string time) {
time = time.Replace(" ", "").Replace("d", "d ").Replace("h", "h ").Replace("m", "m ").Replace("s", "s ").TrimEnd(' ');
var arr = time.Split(' ');
long seconds = 0;
foreach (var s in arr) {
var n = s.Substring(s.Length - 1, 1);
var t = s.Remove(s.Length - 1, 1);
int d = int.Parse(t);
switch (n) {
case "s" : seconds += d;
break;
case "m" : seconds += d * 60;
break;
case "h" : seconds += d * 3600;
break;
case "d" : seconds += d * 86400;
break;
}
}
return seconds;
}
bool IsModerator(BasePlayer player) => PermissionService.HasPermission(player.userID, PERM_MODER);
[ChatCommand("chat")]
void cmdChat(BasePlayer player, string command, string[] args) {
if (args.Length == 0) {
Reply(player, "CMD.CHAT.HELP");
return;
}
var playerData = GetPlayerData(player);
switch (args[0]) {
case "censor" : if (args.Length == 1 || (args[1] != "on" && args[1] != "off")) {
Reply(player, "CMD.CHAT.CENSOR.HELP");
return;
}
bool censor = args[1] == "on";
playerData.Censor = censor;
if (censor) {
Reply(player, "CENSOR.ENABLED");
return;
}
else {
Reply(player, "CENSOR.DISABLED");
return;
}
case "ignore" : if (args.Length == 2 && args[1] == "list") {
if (playerData.BlackList.Count == 0) {
Reply(player, "IGNORE.LIST.IS.EMPTY");
return;
}
SendReply(player, Messages["IGNORE.LIST"] + string.Join(", ", playerData.BlackList.Select(p => GetPlayerData(p).Name).ToArray()));
return;
}
if (args.Length < 3 || (args[1] != "add" && args[1] != "remove")) {
Reply(player, "CMD.CHAT.IGNORE.HELP");
return;
}
int mode = args[1] == "add" ? 1 : -1;
var ignorePlayer = BasePlayer.activePlayerList.FirstOrDefault(p => p.displayName.ToLower().Contains(args[2].ToLower()));
if (ignorePlayer == null) {
Reply(player, "PLAYER.NOT.FOUND", args[2]);
return;
}
if (mode == 1) {
if (!playerData.BlackList.Contains(ignorePlayer.userID)) {
playerData.BlackList.Add(ignorePlayer.userID);
Reply(player, "USER.ADD.IGNORE.LIST", ignorePlayer.displayName);
Reply(ignorePlayer, "YOU.ADD.IGNORE.LIST", player.displayName);
return;
}
else {
Reply(player, "USER.IS.IGNORE.LIST", ignorePlayer.displayName);
Reply(ignorePlayer, "YOU.REMOVE.IGNORE.LIST", player.displayName);
return;
}
}
else {
if (playerData.BlackList.Contains(ignorePlayer.userID)) playerData.BlackList.Remove(ignorePlayer.userID);
Reply(player, "USER.REMOVE.IGNORE.LIST", ignorePlayer.displayName);
return;
}
case "sound" : if (args.Length == 1 || (args[1] != "on" && args[1] != "off")) {
Reply(player, "CMD.CHAT.SOUND.HELP");
return;
}
bool pmSound = args[1] == "on";
playerData.PMSound = pmSound;
if (pmSound) {
Reply(player, "SOUND.ENABLED");
return;
}
else {
Reply(player, "SOUND.DISABLED");
return;
}
case "prefix" : var aviablePrefixes = config.prefixes.Where(p => PermissionService.HasPermission(player.userID, p.Perm) && GetPlayerData(player).Prefix != p.Perm).ToList();
if (aviablePrefixes.Count == 0) {
Reply(player, "NO.AVAILABLE.PREFIXS");
return;
}
if (args.Length == 1) {
Reply(player, "CMD.CHAT.PREFIX.HELP", string.Join("\n", aviablePrefixes.Select(p => $"/chat prefix {p.Arg} - {p.Format}").ToArray()));
return;
}
var selectedPrefix = aviablePrefixes.FirstOrDefault(p => p.Arg == args[1]);
if (selectedPrefix == null) {
Reply(player, "PREFIX.NOT.FOUND", args[1]);
return;
}
playerData.Prefix = selectedPrefix.Perm;
Reply(player, "PREFIX.CHANGED", selectedPrefix.Arg);
return;
case "name" : var aviableNameColors = config.names.Where(p => PermissionService.HasPermission(player.userID, p.Perm) && GetPlayerData(player).NameColor != p.Perm).ToList();
if (aviableNameColors.Count == 0) {
Reply(player, "NO.AVAILABLE.COLORS");
return;
}
if (args.Length == 1) {
Reply(player, "CMD.CHAT.NAME.HELP", string.Join("\n", aviableNameColors.Select(p => $"/chat name {Format(p.Format, p.Arg)}").ToArray()));
return;
}
var selectedNameColor = aviableNameColors.FirstOrDefault(p => p.Arg == args[1]);
if (selectedNameColor == null) {
Reply(player, "COLOR.NOT.FOUND", args[1]);
return;
}
playerData.NameColor = selectedNameColor.Perm;
Reply(player, "NAME.COLOR.CHANGED", selectedNameColor.Arg);
return;
case "message" : var aviableMessageColors = config.messages.Where(p => PermissionService.HasPermission(player.userID, p.Perm) && GetPlayerData(player).MessageColor != p.Perm).ToList();
if (aviableMessageColors.Count == 0) {
Reply(player, "NO.AVAILABLE.COLORS");
return;
}
if (args.Length == 1) {
Reply(player, "CMD.CHAT.MESSAGE.HELP", string.Join("\n", aviableMessageColors.Select(p => $"/chat message {Format(p.Format, p.Arg)}").ToArray()));
return;
}
var selectedMessageColor = aviableMessageColors.FirstOrDefault(p => p.Arg == args[1]);
if (selectedMessageColor == null) {
Reply(player, "COLOR.NOT.FOUND", args[1]);
return;
}
playerData.MessageColor = selectedMessageColor.Perm;
Reply(player, "MESSAGE.COLOR.CHANGED", selectedMessageColor.Arg);
return;
}
}
/* [ChatCommand("fake")]
void cmdchatCommand(BasePlayer player, string command, string[] args)
{
if (!IsModerator(player))
{
Reply(player, "NO.ACCESS");
return;
}
if (args.Length > 1)
{
string line = "";
string author = "";
for (int i = 0; i < args.Length; ++i)
{
if (i == 0)
author = args[i];
else
line += " " + args[i];
}
Net.sv.write.Start();
Net.sv.write.PacketID(Message.Type.ConsoleCommand);
Net.sv.write.String("chat.add2 " + (76561197960279927 + (ulong)(UnityEngine.Random.Range(1, 1000))) + " \"" + line.Remove(0, 1) + "\" \"<color=#5af>" + author + "</color>\"");
Net.sv.write.Send(new SendInfo(true));
}
} */
void Reply(BasePlayer player, string langKey, params string[] args) {
if (args.Contains("<size=")) return;
SendReply(player, Format(Messages[langKey], args));
}
void PublicMessage(string langKey) {
rust.BroadcastChat(Format(Messages[langKey]));
}
string Format(string input, params string[] args) {
if (args.Contains("<size=")) return null;
string ret = input;
for (int argIndex = 0; argIndex < args.Length; argIndex++) ret = ret.Replace($"{{{argIndex}}}", args[argIndex]);
return ret;
}
static double GrabCurrentTime() => DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds;
#endregion
#region Data
public class PlayerData {
public string Prefix = "chatmanager.default";
public string NameColor = "chatmanager.default";
public string MessageColor = "chatmanager.default";
public bool Censor = true;
public bool PMSound = true;
public string Name = "";
public List<ulong> BlackList = new List<ulong>();
}
PlayerData GetPlayerData(BasePlayer player) {
var data = GetPlayerData(player.userID);
data.Name = player.displayName;
return data;
}
PlayerData GetPlayerData(ulong userId) {
PlayerData config;
if (players.TryGetValue(userId, out config)) {
if (config.Prefix != "chatmanager.default" && !PermissionService.HasPermission(userId, config.Prefix)) config.Prefix = "chatmanager.default";
if (config.NameColor != "chatmanager.default" && !PermissionService.HasPermission(userId, config.NameColor)) config.NameColor = "chatmanager.default";
if (config.MessageColor != "chatmanager.default" && !PermissionService.HasPermission(userId, config.MessageColor)) config.MessageColor = "chatmanager.default";
return config;
}
config = new PlayerData();
players[userId] = config;
return config;
}
DynamicConfigFile mutes_File = Interface.Oxide.DataFileSystem.GetFile("ChatManager/ChatManager_Mutes");
DynamicConfigFile players_File = Interface.Oxide.DataFileSystem.GetFile("ChatManager/ChatManager_Players");
void LoadData() {
mutes = mutes_File.ReadObject<Dictionary<ulong, double>>();
players = players_File.ReadObject<Dictionary<ulong, PlayerData>>();
}
void OnServerSave() {
mutes_File.WriteObject(mutes);
players_File.WriteObject(players.Where(p => !p.Value.Equals(defaultData)).ToDictionary(p => p.Key, p => p.Value));
}
#endregion
#region Localization
private Dictionary<string, string> Messages = new Dictionary<string, string>() {
{
"CMD.CHAT.HELP", "ДОСТУПНЫЕ КОМАНДЫ:\n/chat censor - цензура в чате\n/chat prefix - доступные префиксы\n/chat name - доступные цвета имени\n/chat message - доступные цвета сообщений\n/chat ignore - черный список\n/chat sound - звук при получении ЛС"
}
, {
"CMD.CHAT.HELP.PERMISSION", "\n/chat admin - режим администратора\n/chat moderator - режим модератора"
}
, {
"CMD.CHAT.PREFIX.HELP", "ДОСТУПНЫЕ ПРЕФИКСЫ:\n{0}"
}
, {
"NO.AVAILABLE.PREFIXS", "У вас нет доступных префиксов"
}
, {
"PREFIX.RESET", "Префикс успешно удален"
}
, {
"PREFIX.NOT.FOUND", "Префикс с названием \"{0}\" не найден"
}
, {
"NO.ACCESS.THIS.PREFIX", "У вас нет доступа к данному префиксу"
}
, {
"PREFIX.CHANGED", "Префикс изменен на {0}"
}
, {
"CMD.CHAT.NAME.HELP", "ДОСТУПНЫЕ ЦВЕТА:\n{0}"
}
, {
"NO.AVAILABLE.COLORS", "У вас нет доступных цветов"
}
, {
"NAME.COLOR.RESET", "Цвет успешно сброшен"
}
, {
"COLOR.NOT.FOUND", "Цвет с названием \"{0}\" не найден"
}
, {
"NO.ACCESS.THIS.COLOR", "У вас нет доступа к данному цвету"
}
, {
"NO.NAME.COLOR.CHANGED", "Вы не можете изменить цвет имени игрока, для начала установите один из доступных префиксов"
}
, {
"NAME.COLOR.CHANGED", "Цвет имени успешно изменен на {0}"
}
, {
"CMD.CHAT.MESSAGE.HELP", "ДОСТУПНЫЕ ЦВЕТА:\n{0}"
}
, {
"NO.MESSAGE.COLOR.CHANGED", "Вы не можете изменить цвет сообщений, для начала установите один из доступных префиксов"
}
, {
"MESSAGE.COLOR.CHANGED", "Цвет чат сообщений успешно изменен на {0}"
}
, {
"CMD.CHAT.SOUND.HELP", "Используйте /chat sound on или /chat sound off чтобы включить или выключить звуковое оповещение при получении ЛС"
}
, {
"SOUND.ENABLED", "Вы включили звуковое оповещение при получении ЛС"
}
, {
"SOUND.DISABLED", "Вы выключили звуковое оповещение при получении ЛС"
}
, {
"CMD.MUTE.HELP", "Используйте /mute \"имя игрока\" <длительность> <причина> чтобы заблокировать чат игроку"
}
, {
"USER.ALREADY.MUTED", "Игрок \"{0}\" уже заблокирован."
}
, {
"TIME.FORMAT.ERROR", "Некорректный формат времени.\nИспользуйте: #d дни #h часы #m минуты #s секунды.\nПример 1 час 30 минут: 1h30m"
}
, {
"USER.MUTED", "Игроку \"{0}\" заблокировали чат.\nДлительность: {2}"
}
, {
"USER.MUTED.REASON", "Игроку \"{0}\" заблокировали чат.\nДлительность: {2}\nПричина: {1}"
}
, {
"USER.MUTED.LOG", "\"{0}\" заблокировал чат \"{1}/{2}\" длительность \"{3}\""
}
, {
"CMD.UNMUTE.HELP", "Используйте /unmute \"имя игрока\" чтобы разблокировать чат игроку"
}
, {
"USER.UNMUTED", "Игроку \"{0}\" разблокировали чат"
}
, {
"USER.UNMUTED.LOG", "\"{0}\" разблокировал чат \"{1}/{2}\""
}
, {
"YOU.MUTED", "Ваш чат заблокирован!\nОсталось: {0}"
}
, {
"CMD.MUTE.ALL.HELP", "Используйте /muteall on или /muteall off чтобы заблокировать или разблокировать общий чат"
}
, {
"MUTE.ALL.ENABLED", "Общий чат заблокирован"
}
, {
"MUTE.ALL.DISABLED", "Общий чат разблокирован"
}
, {
"MUTE.ALL.ACTIVE", "Глобальное отключение чата активно, вы не можете общаться в чате"
}
, {
"FLOOD.PROTECTION", "Защита от флуда, подождите {0}"
}
, {
"CMD.CHAT.IGNORE.HELP", "СПИСОК КОМАНД:\n/chat ignore add \"имя игрока\" - добавить в черный список\n/chat ignore remove \"имя игрока\" - удалить из черного списка\n/chat ignore list - показать черный список"
}
, {
"USER.IS.IGNORE.LIST", "Игрок \"{0}\" уже находится в черном списке"
}
, {
"USER.ADD.IGNORE.LIST", "Вы добавили игрока \"{0}\" в черный список"
}
, {
"YOU.ADD.IGNORE.LIST", "Игрок \"{0}\" добавил вас в черный список"
}
, {
"IGNORE.LIST.IS.EMPTY", "Черный список пуст"
}
, {
"USER.REMOVE.IGNORE.LIST", "Вы удалили игрока \"{0}\" из черного списка"
}
, {
"YOU.REMOVE.IGNORE.LIST", "Игрок \"{0}\" удалил вас из черного списка"
}
, {
"IGNORE.LIST", "ЧЁРНЫЙ СПИСОК:\n"
}
, {
"CMD.PM.HELP", "Используйте /pm \"имя игрока\" \"сообщение\" чтобы отправить ЛС игроку"
}
, {
"PM.SENDER.FORMAT", "<color=#e664a5>ЛС для {0}</color>: {1}"
}
, {
"PM.RECEIVER.FORMAT", "<color=#e664a5>ЛС от {0}</color>: {1}"
}
, {
"PM.NO.MESSAGES", "Вы не получали личных сообщений"
}
, {
"PM.PLAYER.LEAVE", "Игрок с которым вы переписывались вышел с сервера"
}
, {
"PM.YOU.ARE.BLACK.LIST", "Вы не можете отправить ЛС игроку \"{0}\", он добавил вас в черный список"
}
, {
"CMD.R.HELP", "Используйте /r \"сообщение\" чтобы ответить но последнее ЛС"
}
, {
"CMD.CHAT.CENSOR.HELP", "Используйте /chat censor on или /chat censor off чтобы включить или выключить показ нецензурные слов в чате"
}
, {
"CENSOR.ENABLED", "Вы включили цензуру в чате"
}
, {
"CENSOR.DISABLED", "Вы выключили цензуру в чате"
}
, {
"NO.ACCESS", "У вас нет доступа к этой команде"
}
, {
"PLAYER.NOT.FOUND", "Игрок \"{0}\" не найден"
}
, {
"MULTIPLE.PLAYERS.FOUND", "НАЙДЕНО НЕСКОЛЬКО ИГРОКОВ:\n{0}"
}
, {
"floodTimeout", "Слишком быстро отправляете сообщения, попробуйте через {0} сек."
}
}
;
#endregion
#region Configuration
private void GetConfig<T>(ref T variable, params string[] path) {
if (path.Length == 0) return;
if (Config.Get(path) == null) {
Config.Set(path.Concat(new object[] {
variable
}
).ToArray());
PrintWarning($"Added field to config: {string.Join("/", path)}");
}
variable = (T)Convert.ChangeType(Config.Get(path), typeof(T));
}
public static class Configuration {
public static bool CapsBlock = true;
public static bool BadWordsBlock = true;
public static bool PrivateSoundMessage = true;
public static string PrivateSoundMessagePath = "assets/bundled/prefabs/fx/notice/stack.world.fx.prefab";
public static int MuteDefault = 900;
public static int MuteBadWordsDefault = 1800;
public static string ClanColor = "#FFA500";
public static bool UserLink = true;
}
#endregion
#region Loading
protected override void LoadDefaultConfig() => PrintWarning("Создание нового файла конфигурации...");
private void LoadConfigValues() {
GetConfig(ref Configuration.CapsBlock, "Выключить заглавные буквы в чате");
GetConfig(ref Configuration.BadWordsBlock, "Автоматически блокировать чат за нецензурную лексику");
GetConfig(ref Configuration.PrivateSoundMessage, "Воспроизводить звук при получении личного сообщения");
GetConfig(ref Configuration.PrivateSoundMessagePath, "Полный путь к звуковому файлу");
GetConfig(ref Configuration.MuteDefault, "Длительность блокировки чата по умолчанию(в секундах)");
GetConfig(ref Configuration.MuteBadWordsDefault, "Длительность блокировки чата за нецензурную лексику(в секундах)");
GetConfig(ref Configuration.ClanColor, "Цвет тега клана");
GetConfig(ref Configuration.UserLink, "Убирать ссылки с ника");
SaveConfig();
}
public class ChatPrivilege {
[JsonProperty("Привилегия")]
public string Perm;
[JsonProperty("Аргумент")]
public string Arg;
[JsonProperty("Формат")]
public string Format;
}
public class ChatConfig {
[JsonProperty("Префиксы")]
public List<ChatPrivilege> prefixes;
[JsonProperty("Имена")]
public List<ChatPrivilege> names;
[JsonProperty("Сообщения")]
public List<ChatPrivilege> messages;
[JsonProperty("Список начальных букв нецензурных слов или слова целиком | список исключений")]
public Dictionary<string, List<string>> badWords;
public void RegisterPerms() {
PermissionService.RegisterPermissions(prefixes.Select(p => p.Perm).ToList());
PermissionService.RegisterPermissions(names.Select(p => p.Perm).ToList());
PermissionService.RegisterPermissions(messages.Select(p => p.Perm).ToList());
PermissionService.RegisterPermissions(new List<string>() {
PERM_MODER
}
);
}
public ChatPrivilege Get(List<ChatPrivilege> list, string perm) {
return list.FirstOrDefault(p => p.Perm == perm) ?? list.First();
}
}
private DynamicConfigFile configFile = Interface.Oxide.DataFileSystem.GetFile("ChatManager/ChatManager_Config");
private ChatConfig config;
public new void LoadConfig() {
if (!configFile.Exists()) {
configFile.WriteObject(config = new ChatConfig() {
prefixes = new List<ChatPrivilege>() {
new ChatPrivilege() {
Perm = "chatmanager.default", Arg = "default", Format = "",
}
, new ChatPrivilege() {
Perm = "chatmanager.admin", Arg = "admin", Format = "<color=#a5e664>[Админ]</color>",
}
}
, names = new List<ChatPrivilege>() {
new ChatPrivilege() {
Perm = "chatmanager.default", Arg = "default", Format = "<color=#55aaff>{0}</color>",
}
, new ChatPrivilege() {
Perm = "chatmanager.purple", Arg = "purple", Format = "<color=#a5e664>{0}</color>",
}
}
, messages = new List<ChatPrivilege>() {
new ChatPrivilege() {
Perm = "chatmanager.default", Arg = "default", Format = "<color=#ffffff>{0}</color>",
}
}
, badWords = new Dictionary<string, List<string>>() {
{
"ебля", new List<string>()
}
, {
"сука", new List<string>()
}
, {
"пидор", new List<string>()
}
,
}
}
);
}
else {
config = configFile.ReadObject<ChatConfig>();
}
config.RegisterPerms();
}
#endregion
#region PermissionService
public static class PermissionService {
public static Permission permission = Interface.GetMod().GetLibrary<Permission>();
public static bool HasPermission(ulong uid, string permissionName) {
return !string.IsNullOrEmpty(permissionName) && permission.UserHasPermission(uid.ToString(), permissionName);
}
public static void RegisterPermissions(List<string> permissions) {
if (permissions == null) throw new ArgumentNullException("commands");
foreach (var permissionName in permissions.Where(permissionName => !permission.PermissionExists(permissionName))) {
permission.RegisterPermission(permissionName, m_Instance);
}
}
}
#endregion
}
}