using System.Collections.Generic; using System.Linq; using Oxide.Core; using Oxide.Core.Libraries.Covalence; using Oxide.Core.Plugins; using Newtonsoft.Json; using Newtonsoft.Json.Linq; #region Changelogs and ToDo /********************************************************************** * 1.0.0 : Initial release * 1.0.1 : Added Discord support * Added German language file (thx to Autopsie17) * Added Russian language file (thx to Jtedal) * 1.0.2 : Added French Laguage file (thx to Tanki) * Added instantkick (limited to english) * Added Delayed kick system * Added Delayed kick timer * Added Gametip And Chatmsg for the player * Player gets reason in his/her own language if language file is made * **********************************************************************/ #endregion namespace Oxide.Plugins { [Info("Kick Player Names" , "Krungh Crow" , "1.0.2")] [Description("Prevents players logging in with certain names and kicks them")] class KickPlayerNames : CovalencePlugin { [PluginReference] Plugin DiscordMessages; #region Variables const string Bypas_Perm = "kickplayernames.bypas"; bool ActiveTip = false; #endregion #region Configuration void Init() { if (!LoadConfigVariables()) { Puts("Config file issue detected. Please delete file, or check syntax and fix."); return; } permission.RegisterPermission(Bypas_Perm , this); } private ConfigData configData; class ConfigData { [JsonProperty(PropertyName = "Discord Webhook")] public string DisWebhook = ""; [JsonProperty(PropertyName = "Discord log")] public bool DisUseFancy = false; [JsonProperty(PropertyName = "Discord Title")] public string DisTitle = "Login detected with Name Phrase :"; [JsonProperty(PropertyName = "Discord Embed color")] public int EmbedColor = 10181046; [JsonProperty(PropertyName = "Kick instantly")] public bool KickInstantly = false; [JsonProperty(PropertyName = "Kick time after login")] public float KickTime = 30f; [JsonProperty("Blocked name Phrases")] public List Names = new List(); } private bool LoadConfigVariables() { try { configData = Config.ReadObject(); } catch { return false; } SaveConf(); return true; } protected override void LoadDefaultConfig() { Puts("Fresh install detected Creating a new config file."); configData = new ConfigData { Names = new List() { { "admin" }, { "banditcamp" }, { "bandit camp" }, { ".com" }, { ".org" } } }; SaveConf(); } void SaveConf() => Config.WriteObject(configData , true); #endregion #region LanguageAPI protected override void LoadDefaultMessages() { lang.RegisterMessages(new Dictionary { ["KickMessage"] = "Sorry we dont allow the phrase [{0}] you are using in your name.You can rename yourself and you will be welcome to join our server again." , } , this , "en"); lang.RegisterMessages(new Dictionary { ["KickMessage"] = "Sorry we accepteren de term [{0}] niet in je naam.Als je jezelf beter benaamt ben je weer welkom op de server." , } , this , "nl"); lang.RegisterMessages(new Dictionary { ["KickMessage"] = "Entschuldigung, das Wort [{0}] ist in deinem Namen nicht erlaubt. Du kannst deinen Namen ändern und bist herzlich eingeladen, unserem Server wieder beizutreten." } , this , "de"); lang.RegisterMessages(new Dictionary { ["KickMessage"] = "К сожалению, мы запрещаем нашим игрокам использовать слово(-а) [{0}] в никнейме. Пожалуйста, отредактируйте свой ник и тогда вы снова сможете подключиться к нашему серверу." } , this , "ru"); lang.RegisterMessages(new Dictionary { ["KickMessage"] = "Désolé, nous n'autorisons pas l'expression [{0}] que vous utilisez dans votre nom. Changez votre nom et vous serez le bienvenue sur notre serveur." } , this , "fr"); } #endregion #region Hooks object CanUserLogin(string name , string id , string ipAddress) { IPlayer player = players.FindPlayerById(id); if (permission.UserHasPermission(player.Id , Bypas_Perm)) return true; var Blacklist = configData.Names.ToList(); foreach (var BadName in Blacklist) { if (name.ToLower().Contains(BadName)) { Puts($"{name} ({id}) at {ipAddress} is connecting with [{BadName}] phrase in their name"); if (configData.DisUseFancy) SendDiscordFancy(player , BadName); if(configData.KickInstantly == true) return string.Format(lang.GetMessage("KickMessage" , this , player.Id) , BadName);//<-- always english ?? return true; } } return true; } void OnPlayerConnected(BasePlayer player) { if (permission.UserHasPermission(player.UserIDString , Bypas_Perm)) return; var Blacklist = configData.Names.ToList(); foreach (var BadName in Blacklist) { if (player.displayName.ToLower().Contains(BadName)) { string msg = string.Format(lang.GetMessage("KickMessage" , this , player.UserIDString) , BadName); player.ChatMessage($"{msg}"); TIP(player , msg , configData.KickTime); return; } } } void TIP(BasePlayer player , string message , float dur) { if (player == null) return; if (!ActiveTip) { player?.SendConsoleCommand("gametip.hidegametip"); player.SendConsoleCommand("gametip.showgametip" , message); ActiveTip = true; timer.Once(dur , () => { player?.SendConsoleCommand("gametip.hidegametip"); ActiveTip = false; if (player.IsConnected) { player.Kick(message); } }); } else timer.Once(1f , () => { TIP(player , message , dur); }); } #endregion #region Discord void SendDiscordFancy(IPlayer player , string msg) { string WebhookURL = configData.DisWebhook; string EmbedTitle = configData.DisTitle; int Embedcolor = configData.EmbedColor;//Purple is default if (!DiscordMessages || WebhookURL == "") { Puts("Discordmessages not installed or no webhook provided"); return; } object fields = new[] { new { name = $"Player : {player.Name}", value = $"", inline = true }, new { name = $"Steam ID : {player.Id}", value = $"https://steamcommunity.com/profiles/{player.Id}/", inline = false }, new { name = $"Phrase : {msg}", value = $"", inline = false } }; string json = JsonConvert.SerializeObject(fields); DiscordMessages?.Call("API_SendFancyMessage", (string)WebhookURL, (string)EmbedTitle, (int)Embedcolor, json); } #endregion } }