Иконка ресурса

FREE ModerControl : 1.0.14 1.0.14

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Linq;
using System.Collections.Generic;
using Newtonsoft.Json;
using Oxide.Core;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("ModerControl", "Nimant", "1.0.14")]
    class ModerControl : RustPlugin
    {
        
		#region Variables
		
		private enum ActionType
        {
			BAN = 1,
			UNBAN = 2,
			MUTE = 3,
			UNMUTE = 4,
			CHECK = 5,
			UNCHECK = 6			
        }
				
		private static string AdminPerm = "modercontrol.admin";
		private static string ShowStatsPerm = "modercontrol.show";
		
		private static bool NeedSave = false;
		private static List<ModerInfo> ModeratorInfo = new List<ModerInfo>();
		
		private class ModerInfo
		{			
			[JsonProperty("Дата приёма модератора")]
            public string StartDt;
			[JsonProperty("Дата снятия модератора")]
            public string StopDt;
			
			[JsonProperty("Причина снятия модератора")]
            public string ReasonClose;
			
			[JsonProperty("Имена модератора")] 
            public List<string> Names = new List<string>();
			[JsonProperty("SteamID модератора")] 
            public List<ulong> SteamIDs = new List<ulong>();			
			[JsonProperty("ВК модератора")] 
            public List<string> VKs = new List<string>();
			
			[JsonProperty("Время последнего входа на сервер")]
            public string LastJoin;
            
            [JsonProperty("Количество выданных мутов (за всё время)")]
            public int AllMutes = 0;
			[JsonProperty("Количество снятых мутов (за всё время)")]
            public int AllUnMutes = 0;
            [JsonProperty("Количество выданных банов (за всё время)")]
            public int AllBans = 0;
			[JsonProperty("Количество снятых банов (за всё время)")]
            public int AllUnBans = 0;
            [JsonProperty("Количество проверок игроков (за всё время)")]
            public int AllChecks = 0;            
            [JsonProperty("Время игры на сервере (за всё время)")]
            public int AllGameTime = 0;
            [JsonProperty("Время AFK на сервере (за всё время)")]
            public int AllAFKTime = 0;
			
			[JsonProperty("Количество выданных мутов (за вайп)")]
            public int WipeMutes = 0;
			[JsonProperty("Количество снятых мутов (за вайп)")]
            public int WipeUnMutes = 0;
            [JsonProperty("Количество выданных банов (за вайп)")]
            public int WipeBans = 0;
			[JsonProperty("Количество снятых банов (за вайп)")]
            public int WipeUnBans = 0;
            [JsonProperty("Количество проверок игроков (за вайп)")]
            public int WipeChecks = 0;            
            [JsonProperty("Время игры на сервере (за вайп)")]
            public int WipeGameTime = 0;
            [JsonProperty("Время AFK на сервере (за вайп)")]
            public int WipeAFKTime = 0;						
            
            [JsonProperty("Список игроков получивших мут (за всё время)")]
            public Dictionary<string, string> AllMutesList = new Dictionary<string, string>();
			[JsonProperty("Список игроков получивших размут (за всё время)")]
            public Dictionary<string, string> AllUnMutesList = new Dictionary<string, string>();
            [JsonProperty("Список забаненых игроков (за всё время)")]
            public Dictionary<string, string> AllBansList = new Dictionary<string, string>();
			[JsonProperty("Список разбаненых игроков (за всё время)")]
            public Dictionary<string, string> AllUnBansList = new Dictionary<string, string>();
            [JsonProperty("Список игроков вызванных на проверку (за всё время)")]
            public Dictionary<string, string> AllChecksList = new Dictionary<string, string>();
			
			[JsonProperty("Список игроков получивших мут (за вайп)")]
            public Dictionary<string, string> WipeMutesList = new Dictionary<string, string>();
			[JsonProperty("Список игроков получивших размут (за вайп)")]
            public Dictionary<string, string> WipeUnMutesList = new Dictionary<string, string>();
            [JsonProperty("Список забаненых игроков (за вайп)")]
            public Dictionary<string, string> WipeBansList = new Dictionary<string, string>();
			[JsonProperty("Список разбаненых игроков (за вайп)")]
            public Dictionary<string, string> WipeUnBansList = new Dictionary<string, string>();
            [JsonProperty("Список игроков вызванных на проверку (за вайп)")]
            public Dictionary<string, string> WipeChecksList = new Dictionary<string, string>();
						
			[JsonProperty("Проводит проверку игрока")]
			public bool OnCheck;
			[JsonProperty("Хотя бы раз был на сервере")]
			public bool FirstIn;
			
			[JsonIgnore]
			public Vector3 LastPos = default(Vector3);
		}
		
		#endregion
		
		#region Hooks
		
		private void Init() 
		{	
			LoadVariables();
			LoadData();			
			permission.RegisterPermission(AdminPerm, this);
			permission.RegisterPermission(ShowStatsPerm, this);
		}
		
		private void OnServerInitialized()
		{						
			var console = ModeratorInfo.FirstOrDefault(x=> x.SteamIDs.Contains(0));
			
			if (console == null)
			{
				var moderInfo = new ModerInfo();													
				string name = "Консоль";
				moderInfo.Names.Add(name);				
				moderInfo.SteamIDs.Add(0);				
				ModeratorInfo.Add(moderInfo);
				SaveData();
			}
			
			// в будущем удалить этот фрагмент
			foreach(var moder in ModeratorInfo.ToList())			
				moder.AllMutesList = new Dictionary<string, string>(); // убираем, что бы уменьшить размер базы			
			SaveData();
			
			timer.Once(5f, RunCheckModers);
		}
		
		private void OnPlayerConnected(BasePlayer player)
        {
			var moder = ModeratorInfo.FirstOrDefault(x=> x.SteamIDs.Contains(player.userID) && string.IsNullOrEmpty(x.StopDt));
			if (moder == null) return;
			
			if (!moder.Names.Contains(player.displayName))
				moder.Names.Add(player.displayName);
			
			moder.LastJoin = null;
			moder.FirstIn = true;
			SaveData();
		}
		
		private void OnPlayerDisconnected(BasePlayer player, string reason)
		{
			var moder = ModeratorInfo.FirstOrDefault(x=> x.SteamIDs.Contains(player.userID) && string.IsNullOrEmpty(x.StopDt));
			if (moder == null) return;
			
			moder.LastJoin = DateTime.Now.ToString("dd.MM.yyyy HH:mm");
			SaveData();
		}
		
		private void OnNewSave(string filename)
		{
			Interface.GetMod().DataFileSystem.WriteObject("Backup_ModerControlData", ModeratorInfo);
			
			foreach(var moder in ModeratorInfo.ToList())
			{
				moder.WipeMutes = 0;				
				moder.WipeUnMutes = 0;				
				moder.WipeBans = 0;				
				moder.WipeUnBans = 0;				
				moder.WipeChecks = 0;            				
				moder.WipeGameTime = 0;				
				moder.WipeAFKTime = 0;						
				moder.WipeMutesList = new Dictionary<string, string>();				
				moder.WipeUnMutesList = new Dictionary<string, string>();				
				moder.WipeBansList = new Dictionary<string, string>();				
				moder.WipeUnBansList = new Dictionary<string, string>();				
				moder.WipeChecksList = new Dictionary<string, string>();
				
				moder.AllMutesList = new Dictionary<string, string>(); // убираем, что бы уменьшить размер базы
			}
			
			SaveData();
		}
		
		private void OnServerSave() 
		{
			if (NeedSave)
			{
				SaveData();		
				NeedSave = false;
			}
		}
		
		private void Unload() => SaveData();
		
		private void OnLogProduced(string type, string text)
		{	
			if (!configData.UseIntDetectMutes) return;
			
			//if (type == "log")
			{
				if (text.Contains("заблокировал чат"))
				{
					try
					{
						var pos = text.IndexOf("/");
						var moderID = (ulong)Convert.ToInt64(text.Substring(text.IndexOf("765611"), pos-text.IndexOf("765611")));
						var playerID = (ulong)Convert.ToInt64(text.Substring(text.IndexOf("765611", pos+1), text.IndexOf("/", pos+1)-text.IndexOf("765611", pos+1)));					
						API_SendResult(moderID, playerID, (int)ActionType.MUTE);										
					}
					catch {}
					return;
				}
				
				if (text.Contains("разблокировал чат"))
				{
					try
					{
						var pos = text.IndexOf("/");
						var moderID = (ulong)Convert.ToInt64(text.Substring(text.IndexOf("765611"), pos-text.IndexOf("765611")));
						var playerID = (ulong)Convert.ToInt64(text.Substring(text.IndexOf("765611", pos+1), text.IndexOf("/", pos+1)-text.IndexOf("765611", pos+1)));
						API_SendResult(moderID, playerID, (int)ActionType.UNMUTE);										
					}
					catch {}
					return;
				}
			}
		}
		
		#endregion
		
		#region Main
		
		private void RunCheckModers()
		{
			bool needSave = false;
			BasePlayer player = null;
			foreach(var moder in ModeratorInfo.Where(x=> string.IsNullOrEmpty(x.StopDt)).ToList())
			{
				player = null;
				foreach(var steamid in moder.SteamIDs)
				{
					player = BasePlayer.FindByID(steamid);
					if (player == null) continue;
				}
				
				if (moder.FirstIn && player == null && string.IsNullOrEmpty(moder.LastJoin) && !moder.SteamIDs.Contains(0))
				{
					moder.LastJoin = DateTime.Now.ToString("dd.MM.yyyy HH:mm");
					needSave = true;
				}				
					
				if (player == null) continue;
				
				moder.WipeGameTime++;
				moder.AllGameTime++;
				
				if (!moder.OnCheck && IsAFK(player, moder.LastPos))
				{
					moder.WipeAFKTime++;
					moder.AllAFKTime++;
				}
					
				moder.LastPos = GetNewPos(player);				
				needSave = true;
			}			
			
			if (needSave)
				SaveData();
			
			timer.Once(60f, RunCheckModers);
		}
		
		private Vector3 GetNewPos(BasePlayer player) => new Vector3((float)Math.Truncate(player.transform.position.x), (float)Math.Truncate(player.transform.position.y), (float)Math.Truncate(player.transform.position.z));		
		
		private bool IsAFK(BasePlayer player, Vector3 lastPos)
		{					
			if (GetNewPos(player) == lastPos && player.inventory.crafting.queue.Count == 0)
				return true;
			
			return false;
		}
		
		private string GetPlayerName(ulong userID)
		{
			var data = permission.GetUserData(userID.ToString());															
			return data.LastSeenNickname.Replace("'","").Replace("<", "˂").Replace(">", "˃");
		}
		
		private void Output(BasePlayer player, string output, string text)
		{
			if (output == "chat")
				SendReply(player, text);
			else
				if (output == "console")
					PrintToConsole(player, text);
				else
					Puts(text);
			
		}
		
		private static bool IsElementExists(int val, int[] mas) {
			foreach (int elem in mas)
				if (elem==val)
					return true;
			return false;
		}
		
		private static string GetStringDays(int days)
		{
			if (IsElementExists(days, (new int[] {1,21})))
				return days.ToString()+" день";
			else if (IsElementExists(days, (new int[] {2,3,4,22,23,24})))
				return days.ToString()+" дня";
			else return days.ToString()+" дней";						
		}
		
		private static string GetStringHours(int hours)
		{
			if (IsElementExists(hours, (new int[] {1,21})))
				return hours.ToString()+" час";
			else if (IsElementExists(hours, (new int[] {2,3,4,22,23,24})))
				return hours.ToString()+" часа";
			else return hours.ToString()+" часов";						
		}
		
		private static string GetStringMinutes(int minutes)
		{
			if (IsElementExists(minutes, (new int[] {1,21,31,41,51})))
				return minutes.ToString()+" минута";
			else if (IsElementExists(minutes, (new int[] {2,3,4,22,23,24,32,33,34,42,43,44,52,53,54})))
				return minutes.ToString()+" минуты";
			else return minutes.ToString()+" минут";						
		}
		
		private static string GetStringSeconds(int seconds)
		{
			if (IsElementExists(seconds, (new int[] {1,21,31,41,51})))
				return seconds.ToString()+" секунда";
			else if (IsElementExists(seconds, (new int[] {2,3,4,22,23,24,32,33,34,42,43,44,52,53,54})))
				return seconds.ToString()+" секунды";
			else return seconds.ToString()+" секунд";						
		}
		
		private static bool IsVkID(string vk)
		{
			if (string.IsNullOrEmpty(vk))
				return false;
			
			foreach (var ch in vk)			
				if ("0123456789".IndexOf(ch) < 0)
					return false;
			
			return true;
		}
		
		private string GetNormDuration(long time)
        {
            TimeSpan elapsedTime = TimeSpan.FromSeconds(time);
            int hours = elapsedTime.Hours;
            int minutes = elapsedTime.Minutes;
            int seconds = elapsedTime.Seconds;
            int days = Mathf.FloorToInt((float)elapsedTime.Days);
            string s = "";
			int count = 0;

            if (days > 0) 
			{	
				s += GetStringDays(days) + ", ";
				if (++count==2) return s.Trim(' ',',');
			}	
            if (hours > 0) 
			{					
				s += GetStringHours(hours) + ", ";
				if (++count==2) return s.Trim(' ',',');
			}	
            if (minutes > 0) 
			{
				s += GetStringMinutes(minutes) + ", ";
				if (++count==2) return s.Trim(' ',',');
			}	
            if (seconds > 0)
			{
				s += GetStringSeconds(seconds) + ", ";
				if (++count==2) return s.Trim(' ',',');
			}	            					
			
            return s.Trim(' ',',');
        }					
		
		private void ShowModerStat(BasePlayer player, ModerInfo moder, string output)
		{
			string result = " <color=#aae9f2>*</color> СТАТИСТИКА РАБОТЫ МОДЕРАТОРА <color=#aae9f2>*</color> \n";
			
			/*var names = "";
			foreach(var name in moder.Names) names += "<color=#aae9f2>"+name+"</color>"+", ";				
			names = names.TrimEnd(',',' ');*/
			var names = "<color=#aae9f2>"+GetLastName(moder.SteamIDs[moder.SteamIDs.Count()-1], moder.Names)+"</color>";
			
			//bool isManyNames = moder.Names.Count() > 1;
			bool isManyNames = false;
			
			var vkIDs = "";
			foreach(var vk in moder.VKs) vkIDs += "<color=#aae9f2>"+vk+"</color>"+", ";
			vkIDs = vkIDs.TrimEnd(',',' ');
			vkIDs = !string.IsNullOrEmpty(vkIDs) ? vkIDs : "не указан";
			
			var steams = "";
			foreach(var steam in moder.SteamIDs) steams += "<color=#aae9f2>"+steam+"</color>"+", ";				
			steams = steams.TrimEnd(',',' ');
			
			bool isConsole = steams == "<color=#aae9f2>0</color>";

			var online = moder.FirstIn ? (string.IsNullOrEmpty(moder.LastJoin) ? "на сервере" : moder.LastJoin) : "еще ни разу не заходил";
			
			result += $@"{isManyNames ? "Имена" : "Имя"} модератора: {names}" + "\n";
			if (!isConsole)
			{
				result += $"SteamID модератора: {steams}\n";
				result += !isConsole ? $"VkID модератора: {vkIDs}\n" : "";
				result += $"Дата назначения модератором: <color=#aae9f2>{moder.StartDt}</color>\n";
				
				if (!string.IsNullOrEmpty(moder.StopDt))
				{
					result += $"Дата снятия с модерирования: <color=#aae9f2>{moder.StopDt}</color>\n";				
					if (!string.IsNullOrEmpty(moder.ReasonClose))
						result += $"Причина снятия с модерирования: <color=#aae9f2>{moder.ReasonClose}</color>\n";
				}
				
				result += $"Последний раз заходил: <color=#aae9f2>{online}</color>\n";
				result += $"Время игры на сервере: <color=#aae9f2>{GetNormDuration(moder.WipeGameTime*60)}</color>\n";
				result += $"Время AFK на сервере: <color=#aae9f2>{GetNormDuration(moder.WipeAFKTime*60)}</color>\n";
			}			
			result += $"Выданных мутов: <color=#aae9f2>{moder.WipeMutes}</color>\n";
			result += $"Снятых мутов: <color=#aae9f2>{moder.WipeUnMutes}</color>\n";
			result += $"Выданных банов: <color=#aae9f2>{moder.WipeBans}</color>\n";
			
			if (isConsole)
				result += $"Снятых банов: <color=#aae9f2>{moder.WipeUnBans}</color>";
			else
			{
				result += $"Снятых банов: <color=#aae9f2>{moder.WipeUnBans}</color>\n";
				result += $"Проведённых проверок: <color=#aae9f2>{moder.WipeChecks}</color>\n";			
				result += $@"Сейчас проводит проверку: <color=#aae9f2>{moder.OnCheck ? "да" : "нет"}</color>";						
			}						

			Output(player, output, result);
		}
		
        private string GetLastName(ulong userID, List<string> Names)
		{			
			return GetPlayerName(userID);
			//return Names.Count > 0 ? Names[Names.Count()-1] : null;
		}				
		
		private bool IsOnlyChatModer(ulong userID)
		{
			var result = false;
			foreach(var group in configData.ModerGroups.Where(x=> permission.UserHasGroup(userID.ToString(), x)).ToList())
			{
				if (group.ToLower().Contains("chat"))
					result = true;
				else
					return false;
			}			
			return result;
		}

		#endregion
		
		#region Commands
		
		[ConsoleCommand("moder.add")]
        private void CmdAddMC(ConsoleSystem.Arg args)
        {
			var player = args.Player();
			
            if (player != null && !player.IsAdmin && !permission.UserHasPermission(player.UserIDString, AdminPerm))
            {
                args.ReplyWith("Недостаточно прав.");
                return;
            }
			
			if (args?.Args == null || args?.Args?.Length <= 1)
			{
				args.ReplyWith("Использование: moder.add <SteamID> <group> [VkID]");
                return;
			}						
			
			ulong steamid = 0;			
			if (!UInt64.TryParse(args.Args[0], out steamid))
			{
				args.ReplyWith("Ошибка ввода SteamID.Использование: moder.add <SteamID> <group> [VkID]");
				return;
			}
			
			if (ModeratorInfo.Exists(x=> x.SteamIDs.Contains(steamid) && string.IsNullOrEmpty(x.StopDt)))
			{
				args.ReplyWith("Указанный игрок уже является модератором.");
				return;
			}
			
			var group = args.Args[1];
			
			if (!permission.GroupExists(group))
			{
				args.ReplyWith("Указанная модераторская группа не существует.");
				return;
			}
			
			if (configData.ModerGroups.Where(x=> x == group).Count() == 0)
			{
				args.ReplyWith("Указанная модераторская группа не находится в списке разрешенных.");
				return;
			}
			
			var vkID = args.Args.Length > 2 ? args.Args[2] : "";
			
			if (!string.IsNullOrEmpty(vkID) && !IsVkID(vkID))
			{
				args.ReplyWith("Указан некорректный Vk ID.");
				return;
			}
			
			var moderInfo = new ModerInfo();
			
			moderInfo.StartDt = DateTime.Now.ToString("dd.MM.yyyy HH:mm");			                        
						
			string name = GetPlayerName(steamid);						
						
			if (!string.IsNullOrEmpty(name))
				moderInfo.Names.Add(name);
			
            moderInfo.SteamIDs.Add(steamid);
			
			if (!string.IsNullOrEmpty(vkID))
				moderInfo.VKs.Add(vkID);
                        
            ModeratorInfo.Add(moderInfo);
			SaveData();
			
			permission.AddUserGroup(steamid.ToString(), group);
			
			args.ReplyWith("Игрок успешно добавлен в модераторы.");
			
			var moder = BasePlayer.FindByID(steamid);
			
			if (moder != null)			
				SendReply(moder, "Вы были назначены модератором сервера.");
		}	
		
		[ConsoleCommand("moder.edit")]
        private void CmdEditMC(ConsoleSystem.Arg args)
        {
			var player = args.Player();
			
            if (player != null && !player.IsAdmin && !permission.UserHasPermission(player.UserIDString, AdminPerm))
            {
                args.ReplyWith("Недостаточно прав.");
                return;
            }
			
			if (args?.Args == null || args?.Args?.Length <= 1)
			{
				args.ReplyWith("Использование: moder.edit <SteamID> <новый SteamID | новая group | новый VkID>");
                return;
			}						
			
			ulong steamid = 0;			
			if (!UInt64.TryParse(args.Args[0], out steamid))
			{
				args.ReplyWith("Ошибка ввода SteamID.Использование: moder.edit <SteamID> <новый SteamID | новая group | новый VkID>");
				return;
			}
			
			if (!ModeratorInfo.Exists(x=> x.SteamIDs.Contains(steamid) && string.IsNullOrEmpty(x.StopDt)))
			{
				args.ReplyWith("Указанный игрок не является модератором.");
				return;
			}
			
			var steamOrGroup = args.Args[1];						
			ulong newSteamid = 0;
			string newGroup = null;
			
			var moderInfo = ModeratorInfo.FirstOrDefault(x=> x.SteamIDs.Contains(steamid) && string.IsNullOrEmpty(x.StopDt));
			
			if (steamOrGroup.IsSteamId())
			{							
				if (!UInt64.TryParse(steamOrGroup, out newSteamid))
				{
					args.ReplyWith("Ошибка ввода нового SteamID.Использование: moder.edit <SteamID> <новый SteamID | новая group | новый VkID>");
					return;
				}								
				
				foreach(var group in configData.ModerGroups.Where(x=> permission.UserHasGroup(steamid.ToString(), x)))				
					permission.AddUserGroup(newSteamid.ToString(), group);				
				
				if (!moderInfo.SteamIDs.Contains(newSteamid))
					moderInfo.SteamIDs.Add(newSteamid);
				
				string name = GetPlayerName(newSteamid);						
						
				if (!string.IsNullOrEmpty(name) && !moderInfo.Names.Contains(name))
					moderInfo.Names.Add(name);
				
				SaveData();								
				
				var moder = BasePlayer.FindByID(newSteamid);
			
				if (moder != null)			
					SendReply(moder, "Вы были назначены модератором сервера.");
			}
			else
				if (IsVkID(steamOrGroup))
				{
					if (!moderInfo.VKs.Contains(steamOrGroup))
						moderInfo.VKs.Add(steamOrGroup);
					
					SaveData();	
				}
				else
				{
					newGroup = steamOrGroup;
					
					if (!permission.GroupExists(newGroup))
					{
						args.ReplyWith("Указанная модераторская группа не существует.");
						return;
					}
					
					if (!configData.ModerGroups.Contains(newGroup))
					{
						args.ReplyWith("Указанная модераторская группа не находится в списке разрешенных.");
						return;
					}
					
					foreach(var userID in moderInfo.SteamIDs)
						foreach(var group in configData.ModerGroups.Where(x=> permission.UserHasGroup(userID.ToString(), x)).ToList())
							permission.RemoveUserGroup(userID.ToString(), group);
							
					foreach(var userID in moderInfo.SteamIDs)
						permission.AddUserGroup(userID.ToString(), newGroup);
				}
			
			args.ReplyWith("Изменения по модератору успешно применены.");
		}	
		
		[ConsoleCommand("moder.remove")]
        private void CmdRemoveMC(ConsoleSystem.Arg args)
        {
			var player = args.Player();
			
            if (player != null && !player.IsAdmin && !permission.UserHasPermission(player.UserIDString, AdminPerm))
            {
                args.ReplyWith("Недостаточно прав.");
                return;
            }
			
			if (args?.Args == null || args?.Args?.Length < 1)
			{
				args.ReplyWith("Использование: moder.remove <SteamID> <причина снятия>");
                return;
			}						
			
			ulong steamid = 0;			
			if (!UInt64.TryParse(args.Args[0], out steamid))
			{
				args.ReplyWith("Ошибка ввода SteamID.Использование: moder.remove <SteamID> <причина снятия>");
				return;
			}
			
			if (!ModeratorInfo.Exists(x=> x.SteamIDs.Contains(steamid) && string.IsNullOrEmpty(x.StopDt)))
			{
				args.ReplyWith("Указанный игрок не является модератором.");
				return;
			}
			
			string reason = "";
			
			if (args.Args.Length > 1)
				for(int ii=1;ii<args.Args.Length;ii++) reason += args.Args[ii] + " ";
			
			var moderInfo = ModeratorInfo.FirstOrDefault(x=> x.SteamIDs.Contains(steamid) && string.IsNullOrEmpty(x.StopDt));
			
			moderInfo.StopDt = DateTime.Now.ToString("dd.MM.yyyy HH:mm");			                        
			moderInfo.ReasonClose = reason.TrimEnd(' ');
			
			SaveData();
			
			foreach(var userID in moderInfo.SteamIDs)
				foreach(var group in configData.ModerGroups.Where(x=> permission.UserHasGroup(userID.ToString(), x)).ToList())				
					permission.RemoveUserGroup(userID.ToString(), group);
					
			args.ReplyWith("Модератор успешно удалён.");
			
			foreach(var userID in moderInfo.SteamIDs)
			{
				var moder = BasePlayer.FindByID(userID);
				
				if (moder != null)			
					SendReply(moder, "C вас были сняты полномочия модератора.");
			}
		}
		
		[ChatCommand("mstat")]
        private void CmdMStat(BasePlayer player, string command, string[] args)
        {
			var moderInfo = ModeratorInfo.FirstOrDefault(x=> x.SteamIDs.Contains(player.userID) && string.IsNullOrEmpty(x.StopDt));
			var canSeeAllStat = player.IsAdmin || permission.UserHasPermission(player.UserIDString, AdminPerm) || permission.UserHasPermission(player.UserIDString, ShowStatsPerm);
			
            if (!canSeeAllStat)
            {
                SendReply(player, "Недостаточно прав.");
                return;
            }
			
			if (args?.Length == 0)
			{
				if (moderInfo != null)				
					ShowModerStat(player, moderInfo, "chat");
				else
					SendReply(player, "Вы не модератор, по вам нет статистики.");
				
				return;
			}
			
			if (!(player.IsAdmin || permission.UserHasPermission(player.UserIDString, AdminPerm)))
			{
				SendReply(player, "У вас нет прав просматривать чужую статистику.");
                return;
			}
			
			ulong steamid = 0;
			string name = args[0];
			if (!((name.Contains("7656") && UInt64.TryParse(name, out steamid)) || name == "0"))
			{
				var moders = ModeratorInfo.ToList();
				var foundModers = new List<ModerInfo>();
				var manyModers = "";
				
				/*foreach(var moder in moders)			
					foreach(var name_ in moder.Names)					
						if (name_.ToLower().Contains(name.ToLower()))
						{
							foundModers.Add(moder);
							manyModers += $" * {name_}\n";							
						}*/
						
				foreach(var moder in moders)	
				{				
					var name_ = GetLastName(moder.SteamIDs[moder.SteamIDs.Count()-1], moder.Names);
					if (!string.IsNullOrEmpty(name_) && name_.ToLower().Contains(name.ToLower()))
					{
						foundModers.Add(moder);
						manyModers += $" * {name_}\n";							
					}		
				}
				
				if (foundModers.Count == 0)
				{
					SendReply(player, "Указанный модератор не найден.");
					return;
				}
				
				if (foundModers.Count > 1)
				{
					SendReply(player, "Уточните поиск, найдено несколько похожих модераторов:");																				
					SendReply(player, manyModers.TrimEnd('\n'));						
					return;
				}
				
				ShowModerStat(player, foundModers[0], "chat");				
				return;
			}
			
			var otherModerInfo = ModeratorInfo.FirstOrDefault(x=> x.SteamIDs.Contains(steamid) && string.IsNullOrEmpty(x.StopDt));
			
			if (otherModerInfo == null)
			{
				SendReply(player, "Указанный модератор не найден.");
				return;
			}
			
			ShowModerStat(player, otherModerInfo, "chat");
		}
		
		[ChatCommand("mlist")]
        private void CmdMList(BasePlayer player, string command, string[] args)
        {						
			//var moderInfo = ModeratorInfo.FirstOrDefault(x=> x.SteamIDs.Contains(player.userID) && string.IsNullOrEmpty(x.StopDt));
            if (!player.IsAdmin && !permission.UserHasPermission(player.UserIDString, AdminPerm))
            {
                SendReply(player, "Недостаточно прав.");
                return;
            }

			var moders = ModeratorInfo.Where(x=> !x.SteamIDs.Contains(0) && string.IsNullOrEmpty(x.StopDt) && !IsOnlyChatModer(x.SteamIDs[x.SteamIDs.Count()-1]));
				
			if (moders.Count() > 0)
			{
				string result = "";
				result += "СПИСОК МОДЕРАТОРОВ СЕРВЕРА:\n";	
				foreach(var moder in moders.OrderBy(x=> x.FirstIn).ThenBy(x=> x.LastJoin))
				{					
					/*var names = "";
					foreach(var name in moder.Names) names += "<color=#aae9f2>"+name+"</color>"+ ", ";				
					names = names.TrimEnd(',',' ');*/
					var names = "<color=#aae9f2>"+GetLastName(moder.SteamIDs[moder.SteamIDs.Count()-1], moder.Names)+"</color>";									
					
					var steams = "";
					foreach(var steam in moder.SteamIDs) steams += "<color=#aae9f2>"+steam+"</color>"+ ", ";				
					steams = steams.TrimEnd(',',' ');
					
					if (steams == "<color=#aae9f2>0</color>") continue;
					
					var online = moder.FirstIn ? (string.IsNullOrEmpty(moder.LastJoin) ? "на сервере" : moder.LastJoin) : "еще ни разу не заходил";
										
					result += $" * {names}: {online}\n";	
				}
				SendReply(player, result.TrimEnd('\n'));				
			}
			else
				SendReply(player, "На сервере еще нет ни одного модератора.");	
		}
		
		[ChatCommand("clist")]
        private void CmdCList(BasePlayer player, string command, string[] args)
        {						
			//var moderInfo = ModeratorInfo.FirstOrDefault(x=> x.SteamIDs.Contains(player.userID) && string.IsNullOrEmpty(x.StopDt));
            if (!player.IsAdmin && !permission.UserHasPermission(player.UserIDString, AdminPerm))
            {
                SendReply(player, "Недостаточно прав.");
                return;
            }

			var moders = ModeratorInfo.Where(x=> !x.SteamIDs.Contains(0) && string.IsNullOrEmpty(x.StopDt) && IsOnlyChatModer(x.SteamIDs[x.SteamIDs.Count()-1]));
				
			if (moders.Count() > 0)
			{
				string result = "";
				result += "СПИСОК ЧАТ-МОДЕРАТОРОВ СЕРВЕРА:\n";	
				foreach(var moder in moders.OrderBy(x=> x.FirstIn).ThenBy(x=> x.LastJoin))
				{					
					/*var names = "";
					foreach(var name in moder.Names) names += "<color=#aae9f2>"+name+"</color>"+ ", ";				
					names = names.TrimEnd(',',' ');*/
					var names = "<color=#aae9f2>"+GetLastName(moder.SteamIDs[moder.SteamIDs.Count()-1], moder.Names)+"</color>";									
					
					var steams = "";
					foreach(var steam in moder.SteamIDs) steams += "<color=#aae9f2>"+steam+"</color>"+ ", ";				
					steams = steams.TrimEnd(',',' ');
					
					if (steams == "<color=#aae9f2>0</color>") continue;
					
					var online = moder.FirstIn ? (string.IsNullOrEmpty(moder.LastJoin) ? "на сервере" : moder.LastJoin) : "еще ни разу не заходил";
										
					result += $" * {names}: {online}\n";	
				}
				SendReply(player, result.TrimEnd('\n'));				
			}
			else
				SendReply(player, "На сервере еще нет ни одного чат-модератора.");	
		}
		
		[ChatCommand("mt")]
        private void CmdMT(BasePlayer player, string command, string[] args)
		{
			if (args?.Length == 0)
				CmdMStat(player, command, args);
			else
				if (args?.Length == 1 && args[0].ToLower() == "list")
					CmdMList(player, command, args);
				else
					CmdMStat(player, command, args);			
		}
		
		// перенесенные из VkReports
		private bool HasModerPerm(BasePlayer player, bool isChatModers = false)
        {
			if (player == null) 
				return false;
			
			if (!isChatModers)
				return ModeratorInfo.Exists(x=> x.SteamIDs[x.SteamIDs.Count()-1] == player.userID && !x.SteamIDs.Contains(0) && string.IsNullOrEmpty(x.StopDt) && !IsOnlyChatModer(x.SteamIDs[x.SteamIDs.Count()-1]));
			
			if (isChatModers)
				return ModeratorInfo.Exists(x=> x.SteamIDs[x.SteamIDs.Count()-1] == player.userID && !x.SteamIDs.Contains(0) && string.IsNullOrEmpty(x.StopDt) && IsOnlyChatModer(x.SteamIDs[x.SteamIDs.Count()-1]));
			
			return false;
        }
		
		private bool ModersOnline(bool isChatModers = false)
        {
            foreach (BasePlayer player in BasePlayer.activePlayerList)
                if (HasModerPerm(player, isChatModers))
                    return true;
				
            return false;
        } 	
		
		[ChatCommand("moders")]
        private void OnCommandModers(BasePlayer sender, string command, string[] args)
        {
			if (!sender.IsAdmin && !HasModerPerm(sender, false))
			{
				sender.ChatMessage("Вам не разрешено просматривать данную информацию");
				return;
			}
			
            if (!ModersOnline(false))
            { 
				SendReply(sender, "В настоящее время нет модераторов в онлайне."); 
				return; 
			}

            var msg = "<color=#aae9f2> Модераторы в сети:</color>\n";
            foreach (BasePlayer player in BasePlayer.activePlayerList)
                if (HasModerPerm(player, false))
                    msg += " * "+player.displayName+"\n";
            
			SendReply(sender, msg);
        }
		
		[ChatCommand("cmoders")]
        private void OnCommandCModers(BasePlayer sender, string command, string[] args)
        {
			if (!sender.IsAdmin && !HasModerPerm(sender, true) && !HasModerPerm(sender, false))
			{
				sender.ChatMessage("Вам не разрешено просматривать данную информацию");
				return;
			}
			
            if (!ModersOnline(true))
            { 
				SendReply(sender, "В настоящее время нет чат-модераторов в онлайне."); 
				return; 
			}

            var msg = "<color=#aae9f2> Чат-Модераторы в сети:</color>\n";
            foreach (BasePlayer player in BasePlayer.activePlayerList)
                if (HasModerPerm(player, true))
                    msg += " * "+player.displayName+"\n";
            
			SendReply(sender, msg);
        }
		// end
		
		#endregion
		
		#region API
		
		private List<ulong> API_GetModerSteamIDs(string moderVK)
		{			
			if (string.IsNullOrEmpty(moderVK)) 
				return null;
			
			var moderInfo = ModeratorInfo.FirstOrDefault(x=> x.VKs.Contains(moderVK) && string.IsNullOrEmpty(x.StopDt));
			
			if (moderInfo == null)
				return null;
			
			return moderInfo.SteamIDs;
		}
		
		private void API_SendResult(ulong moderID, ulong targetID, int actionType)
		{
			if (!Enum.IsDefined(typeof(ActionType), actionType))
			{
				PrintWarning($"API_AddResults: неизвестный тип операции '{actionType}'");
				return;
			}
			
			ModerInfo moderInfo = null;
															
			if (moderID >= 0)
				moderInfo = ModeratorInfo.FirstOrDefault(x=> x.SteamIDs.Contains(moderID) && string.IsNullOrEmpty(x.StopDt));
			
			if (moderInfo == null)
			{
				PrintWarning($"API_AddResults: незарегистрированный модератор '{moderID}' совершил операцию '{actionType}' над игроком '{targetID}'");
				return;
			}
			
			var name = GetPlayerName(targetID);
			name = !string.IsNullOrEmpty(name) ? name : "N|A";
			var infoDt = DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss");
			var infoMsg = $"{name} ({targetID})";
			
			switch(actionType)
			{
				case (int)ActionType.BAN: 
				{
					moderInfo.AllBans++;
					moderInfo.WipeBans++;
										
					moderInfo.AllBansList.Add(infoDt, infoMsg);
					moderInfo.WipeBansList.Add(infoDt, infoMsg);
					
					break;
				}
				case (int)ActionType.UNBAN:
				{
					moderInfo.AllUnBans++;
					moderInfo.WipeUnBans++;
					
					moderInfo.AllUnBansList.Add(infoDt, infoMsg);
					moderInfo.WipeUnBansList.Add(infoDt, infoMsg);			

					break;					
				}
				case (int)ActionType.MUTE:
				{
					moderInfo.AllMutes++;
					moderInfo.WipeMutes++;
					
					// moderInfo.AllMutesList.Add(infoDt, infoMsg); не добавляем, что бы уменьшить размер базы
					moderInfo.WipeMutesList.Add(infoDt, infoMsg);					
					
					break;
				}
				case (int)ActionType.UNMUTE:
				{
					moderInfo.AllUnMutes++;
					moderInfo.WipeUnMutes++;
					
					moderInfo.AllUnMutesList.Add(infoDt, infoMsg);
					moderInfo.WipeUnMutesList.Add(infoDt, infoMsg);					
					
					break;
				}
				case (int)ActionType.CHECK:
				{
					moderInfo.AllChecks++;
					moderInfo.WipeChecks++;
					
					moderInfo.AllChecksList.Add(infoDt, infoMsg);
					moderInfo.WipeChecksList.Add(infoDt, infoMsg);
					
					moderInfo.OnCheck = true;
					
					break;
				}
				case (int)ActionType.UNCHECK:
				{
					moderInfo.OnCheck = false;
					
					break;
				}
			}
			
			NeedSave = true;			
			//SaveData(); сохранение переложено на хук OnServerSave и Unload для уменьшения лагов
		}
		
		#endregion
		
		#region Config        				
		
        private static ConfigData configData;
		
        private class ConfigData
        {            
			[JsonProperty(PropertyName = "Список групп модераторов")]
			public List<string> ModerGroups;			
			[JsonProperty(PropertyName = "Разрешать использовать встроенную систему определения мутов")]
			public bool UseIntDetectMutes;
        }
		
        private void LoadVariables() => configData = Config.ReadObject<ConfigData>();        
		
        protected override void LoadDefaultConfig()
        {
            configData = new ConfigData
            {
                ModerGroups = new List<string>()
				{
					"moderator"
				},
				UseIntDetectMutes = true
            };
            SaveConfig(configData);
			timer.Once(0.1f, ()=>SaveConfig(configData));
        }        
		
        private void SaveConfig(ConfigData config) => Config.WriteObject(config, true);
		
        #endregion
		
		#region Data
		
		private void LoadData() 
		{
			ModeratorInfo = Interface.GetMod().DataFileSystem.ReadObject<List<ModerInfo>>("ModerControlData");
			
			var needSave = false;
			foreach (var item in ModeratorInfo)
			{
				if (item.VKs == null)
				{
					item.VKs = new List<string>();
					needSave = true;
				}
			}
			
			if (needSave) SaveData();
		}
		
		private void SaveData() => Interface.GetMod().DataFileSystem.WriteObject("ModerControlData", ModeratorInfo);		
		
		#endregion
		
    }
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху