Skip to content

Commit

Permalink
2.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
terminator-97 committed Jul 12, 2020
1 parent a5cda4a commit 00e41cf
Show file tree
Hide file tree
Showing 14 changed files with 142 additions and 98 deletions.
49 changes: 24 additions & 25 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,31 @@

**SCPUtils Plugin**<br />

Welcome to SCPUtils, this plugin has many features such as welcome messages, decontamination messages, autorestart when only 1 player is present in game and punishements for the ones that quit / suicide as SCP, temporarily badges, custom nicknames and colors, you can allow specific scps to specific roles to speak to humans using V and much more <br /><br />
Database will get created inside Exiled/SCPUtils folder.<br /><br />
Welcome to SCPUtils, overtime i implemented many features so i decided to rework the documentation.

This is the list of SCPUtils features with a brief description, i recomend to read configs:

- **Welcome Message:** You can set in server config a welcome broadcast that every player join will see.
- **Decontamination Message:** A broadcast that all players will see when decontamination starts
- **Auto-Restart:** Having only one player in server may cause round stuck forever, with this plugin you can avoid it!
- **Advanced SCP Suicide / Quit punishements:** If a SCP suicide or leave the server you can punish him, with warns, kicks or bans, depending on settings you use and DC/Suicide percentage player has (configurable also for tutorial role)
- **Temporarily badges:** Sometimes may be useful to give a player a temporarily role for event winners and donators (or anything else you want), with this plugin it's easy, see commands list.
- **Custom nicknames:** Admins with permission can set any nickname to any player in server using admin console, users with permission can set their own nickname using a simple command on User's console.
- **Nickname Blacklist:** You can prevent players joining with blacklisted nicknames and preventing them to change nicknames to restricted ones, users with bypassnickname permission bypass this limit!
- **Badge colors:** Admins can assign a color to every person, users with permissions can assign any color to themselves if it's not in restricted list!
- **Permanently show/hide badges:** Users with permission can permanently show or hide badge using a simple command (in user console)
- **SCPSpeak features:** Playing with permissions you can decide which badge (even default one) can speak with that SCP like 939 using V!
- **Playtime statistics:** You can see each user playtime day per day or total playtime using a simple command!
- **ASNs Bans:** You can ban specific ASNs to avoid ban evaders and cheaters, you can whitelist legit users to bypass the ASNs bans using a simple command, to add an ASN to blacklist add it inside server config setting.

**Database will get created inside Exiled/SCPUtils folder.**<br /><br />
**You must add LiteDB.dll into Plugins/dependencies folder or plugin won't work**<br /><br />
**Required minimum Exiled version: 2.0.0**

**Currently plugin is in beta phase, documentation is not complete**

### Configs:

Just check configs inside the the file.
You can see settings and edit them inside Exiled/port-config.yml file(example Exiled/7777-config.yml)

**Admin commands**

Expand All @@ -25,6 +41,8 @@ Just check configs inside the the file.
| scputils_set_badge | <player / id / userid> <badge name> <duration in minutes> | scputils.handlebadges | Add a temp player badge |
| scputils_revoke_badge | <player / id / userid> | scputils.handlebadges | Revoke a badge given to a player |
| scputils_play_time | <player / id / userid> <range days> | scputils.playtime | Show recent player activity withing the specified days |
| scputils_whitelist_asn | <id / userid> | scputils.whitelist | Add player to ASN whitelist |
| scputils_unwhitelist_asn | <id / userid> | scputils.whitelist | Removes player to ASN whitelist |

**Console commands**

Expand Down Expand Up @@ -62,27 +80,8 @@ Console commands must be executed like .scputils_help in game console (press ò

**Config Example**

To edit your configs you must go into EXILED folder and edit port-config.yml file (example 7777-config.yml), bellow you can see a sample config<br />
To edit your configs you must go into EXILED folder and edit port-config.yml file (example 7777-config.yml), and edit them<br />

```
scputils_welcome_message: WELCOME TO MY SERVER!
scputils_scp_079_tesla_event_wait: 3
scputils_auto_ban_threshold: 35
scputils_restricted_role_colors:
- red
- magenta
- pink
- cyan
- lime
- deep_pink
- crimson
- carmine
scputils_banned_names:
- Admin
- Nickname1
- Nickname2
- Nickname3
```

<br />To edit permissions you must go into Plugins/Exiled Permissions folder and edit permissions.yml file, bellow you can see a sample config<br />

Expand Down Expand Up @@ -118,4 +117,4 @@ Note: you must add every group in permissionsm don't forget default one<br /><br

Data stored on database is intended only for internal use, sharing it is a violation of SCP:SL EULA and will cause your server delist.<br /><br />

Thanks to iopietro for his advices<br />
Thanks to iopietro for his advices<br />
72 changes: 67 additions & 5 deletions SCPUtils/Commands/Commands.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using Exiled.Events.EventArgs;
using Exiled.Permissions.Extensions;
using EXILED;
using System;
using System.Collections.Generic;
using System.Linq;
Expand All @@ -20,7 +18,7 @@ public void OnRaCommand(SendingRemoteAdminCommandEventArgs ev)
ev.IsAllowed = false;

ev.Sender.RemoteAdminMessage($"SCPUtils info:\n" +
$"Avaible commands: scputils_help, scputils_player_info, scputils_player_list, scputils_player_reset_preferences, scputils_player_reset, scputils_set_color, scputils_set_name, scputils_set_badge, scputils_revoke_badge", true);
$"Avaible commands: scputils_help, scputils_player_info, scputils_player_list, scputils_player_reset_preferences, scputils_player_reset, scputils_set_color, scputils_set_name, scputils_set_badge, scputils_revoke_badge, scputils_play_time, scputils_whitelist_asn, scputils_unwhitelist_asn", true);
break;
}

Expand Down Expand Up @@ -57,6 +55,7 @@ public void OnRaCommand(SendingRemoteAdminCommandEventArgs ev)
$"Temporarily Badge: [ {databasePlayer.BadgeName} ]\n" +
$"Badge Expire: [ {databasePlayer.BadgeExpire} ]\n" +
$"Hide Badge: [ {databasePlayer.HideBadge} ]\n" +
$"Asn Whitelisted: [ {databasePlayer.ASNWhitelisted} ]\n" +
$"Total Playtime: [ { new TimeSpan(0, 0, databasePlayer.PlayTimeRecords.Values.Sum()).ToString() } ]");
}
else ev.Sender.RemoteAdminMessage("You need a higher administration level to use this command!", false);
Expand Down Expand Up @@ -278,7 +277,8 @@ public void OnRaCommand(SendingRemoteAdminCommandEventArgs ev)
string name = ev.Arguments[1];
databasePlayer.CustomNickName = name;
Database.LiteDatabase.GetCollection<Player>().Update(databasePlayer);
ev.Sender.RemoteAdminMessage("Success, changes will take effect next round!", false);
ev.Sender.RemoteAdminMessage("Success, choice has been saved!", false);
if (target != null) target.ReferenceHub.nicknameSync.DisplayName = ev.Arguments[1].ToString();

}
else ev.Sender.RemoteAdminMessage("You need a higher administration level to use this command!", false);
Expand Down Expand Up @@ -357,11 +357,73 @@ public void OnRaCommand(SendingRemoteAdminCommandEventArgs ev)
Database.LiteDatabase.GetCollection<Player>().Update(databasePlayer);
if (player != null) player.SetRank(null, null);
ev.Sender.RemoteAdminMessage("Badge revoked!", false);

}
else ev.Sender.RemoteAdminMessage("You need a higher administration level to use this command!", false);
break;
}

case "scputils_whitelist_asn":
{
ev.IsAllowed = false;

var commandSender = Exiled.API.Features.Player.Get(ev.Sender.Nickname);

if (ev.Arguments.Count < 1)
{
ev.Sender.RemoteAdminMessage("Usage: scputils_whitelist_asn <player name/id>", false);
break;
}

if (IsAllowed(ev.Sender.Nickname, "scputils.whitelist"))
{
var player = Exiled.API.Features.Player.Get(ev.Arguments[0]);
var databasePlayer = ev.Arguments[0].GetDatabasePlayer();
if (databasePlayer == null)
{
ev.Sender.RemoteAdminMessage("Player not found on Database or Player is loading data!", false);
break;
}

databasePlayer.ASNWhitelisted = true;
Database.LiteDatabase.GetCollection<Player>().Update(databasePlayer);
ev.Sender.RemoteAdminMessage("Player has been successfully whitelisted!", false);

}
else ev.Sender.RemoteAdminMessage("You need a higher administration level to use this command!", false);
break;
}

case "scputils_unwhitelist_asn":
{
ev.IsAllowed = false;

var commandSender = Exiled.API.Features.Player.Get(ev.Sender.Nickname);

if (ev.Arguments.Count < 1)
{
ev.Sender.RemoteAdminMessage("Usage: scputils_unwhitelist_asn <player name/id>", false);
break;
}

if (IsAllowed(ev.Sender.Nickname, "scputils.whitelist"))
{
var player = Exiled.API.Features.Player.Get(ev.Arguments[0]);
var databasePlayer = ev.Arguments[0].GetDatabasePlayer();
if (databasePlayer == null)
{
ev.Sender.RemoteAdminMessage("Player not found on Database or Player is loading data!", false);
break;
}

databasePlayer.ASNWhitelisted = false;
Database.LiteDatabase.GetCollection<Player>().Update(databasePlayer);
ev.Sender.RemoteAdminMessage("Player has been successfully removed from whitelist!", false);

}
else ev.Sender.RemoteAdminMessage("You need a higher administration level to use this command!", false);
break;
}

}
}

Expand Down
1 change: 1 addition & 0 deletions SCPUtils/Commands/ConsoleCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ public void OnConsoleCommand(SendingConsoleCommandEventArgs ev)
ev.ReturnMessage = "Your nickname has been changed, changes will take effect next round, use scputils_change_nickname None to remove the nickname";
string nickname = ev.Arguments[0];
ev.Player.GetDatabasePlayer().CustomNickName = nickname;
ev.Player.ReferenceHub.nicknameSync.DisplayName = nickname;
}
}
else
Expand Down
10 changes: 8 additions & 2 deletions SCPUtils/Configs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,10 +106,16 @@ public class Configs : IConfig
public float AutoKickThreshold { get; private set; } = 15.5f;

[Description("Which colors are restricted on .scputils_change_color command?")]
public List<string> RestrictedRoleColors { get; private set; } = new List<string>() { "Color1","Color2" };
public List<string> RestrictedRoleColors { get; private set; } = new List<string>() { "Color1", "Color2" };

[Description("Which nicknames are restricted on .scputils_change_nickname command?")]
public static List<string> BannedNickNames { get; private set; } = new List<string>() { "@everyone", "@here", "Admin", "Nicko || Rin" };
public static List<string> BannedNickNames { get; private set; } = new List<string>() { "@everyone", "@here", "Admin" };

[Description("Which ASNs should be blacklisted? Players to connect from blacklisted ASN should be whitelisted via scputils_whitelist_asn command (50889 is geforce now ASN)")]
public List<string> ASNBlacklist { get; private set; } = new List<string>() { "50889" };

[Description("Which message non-whitelisted players should get while connecting from blacklisted ASN?")]
public string AsnKickMessage { get; private set; } = "The ASN you are connecting from is blacklisted from this server, please contact server staff to request to being whitelisted";


public void ConfigValidator()
Expand Down
3 changes: 2 additions & 1 deletion SCPUtils/Database/Database.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ public static void AddPlayer(Exiled.API.Features.Player player)
BadgeName = "",
BadgeExpire = DateTime.MinValue,
HideBadge = false,
PlayTimeRecords = null
PlayTimeRecords = null,
ASNWhitelisted = false
});
Log.Info("Trying to add ID: " + player.UserId.Split('@')[0] + " Discriminator: " + player.UserId.Split('@')[1] + " to Database");
}
Expand Down
1 change: 1 addition & 0 deletions SCPUtils/Database/Player.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public class Player
public DateTime BadgeExpire { get; set; }
public Dictionary<string, int> PlayTimeRecords { get; set; } = new Dictionary<string, int>();

public bool ASNWhitelisted { get; set; }

public float SuicidePercentage => (float)ScpSuicideCount == 0 ? 0 : ((float)ScpSuicideCount / (float)TotalScpGamesPlayed) * 100;

Expand Down
14 changes: 8 additions & 6 deletions SCPUtils/Functions/EventHandlers.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using Exiled.API.Features;
using Exiled.Events.EventArgs;
using Exiled.Permissions.Extensions;
using EXILED;
using MEC;
using System;

Expand Down Expand Up @@ -56,21 +55,24 @@ internal void OnPlayerJoin(JoinedEventArgs ev)
Database.AddPlayer(ev.Player);
}

Log.Debug(ev.Player.ReferenceHub.nicknameSync.DisplayName);
var databasePlayer = ev.Player.GetDatabasePlayer();
if (Database.PlayerData.ContainsKey(ev.Player)) return;
Database.PlayerData.Add(ev.Player, databasePlayer);
databasePlayer.LastSeen = DateTime.Now;
databasePlayer.Name = ev.Player.Nickname;
if (databasePlayer.FirstJoin == DateTime.MinValue) databasePlayer.FirstJoin = DateTime.Now;
if (pluginInstance.Config.WelcomeEnabled) ev.Player.Broadcast(pluginInstance.Config.WelcomeMessageDuration, pluginInstance.Config.WelcomeMessage, Broadcast.BroadcastFlags.Normal);
pluginInstance.Functions.PostLoadPlayer(ev.Player);
if (!string.IsNullOrEmpty(databasePlayer.CustomNickName) && databasePlayer.CustomNickName != "None") ev.Player.ReferenceHub.nicknameSync.DisplayName = databasePlayer.CustomNickName;
if (pluginInstance.Config.AutoKickBannedNames && pluginInstance.Functions.CheckNickname(ev.Player.Nickname) && !ev.Player.CheckPermission("scputils.bypassnickrestriction")) ev.Player.Kick("Auto-Kick: " + pluginInstance.Config.AutoKickBannedNameMessage, "SCPUtils");
else if (pluginInstance.Config.ASNBlacklist.Contains(ev.Player.ReferenceHub.characterClassManager.Asn) && !databasePlayer.ASNWhitelisted) ev.Player.Kick($"Auto-Kick: {pluginInstance.Config.AsnKickMessage}", "SCPUtils");
else pluginInstance.Functions.PostLoadPlayer(ev.Player);
Log.Debug(ev.Player.ReferenceHub.nicknameSync.DisplayName);

Timing.CallDelayed(3f, () =>
{
if (pluginInstance.Config.AutoKickBannedNames && pluginInstance.Functions.CheckNickname(ev.Player.Nickname) && !ev.Player.CheckPermission("scputils.bypassnickrestriction")) ev.Player.Kick("Auto-Kick: " + pluginInstance.Config.AutoKickBannedNameMessage, "SCPUtils");
});
}



internal void OnPlayerSpawn(SpawningEventArgs ev)
{
if (ev.Player.Team == Team.SCP) ev.Player.GetDatabasePlayer().TotalScpGamesPlayed++;
Expand Down
1 change: 0 additions & 1 deletion SCPUtils/Functions/Extensions.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using EXILED;
using System.Collections.Generic;
using System;

Expand Down
21 changes: 11 additions & 10 deletions SCPUtils/Functions/Functions.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
using EXILED;
using MEC;
using MEC;
using RemoteAdmin;
using System.Collections.Generic;
using System;
using System.Text.RegularExpressions;
using Exiled.API.Features;

using Exiled.Permissions.Extensions;

namespace SCPUtils
{
Expand Down Expand Up @@ -79,8 +78,8 @@ public void OnQuitOrSuicide(Exiled.API.Features.Player player)
{
var suicidePercentage = player.GetDatabasePlayer().SuicidePercentage;
AutoWarnPlayer(player);
if (pluginInstance.Config.EnableSCPSuicideAutoBan && suicidePercentage >= pluginInstance.Config.AutoBanThreshold && player.GetDatabasePlayer().ScpSuicideCount > pluginInstance.Config.ScpSuicideTollerance) AutoBanPlayer(player);
else if (pluginInstance.Config.AutoKickOnSCPSuicide && suicidePercentage >= pluginInstance.Config.AutoKickThreshold && suicidePercentage < pluginInstance.Config.AutoBanThreshold && player.GetDatabasePlayer().ScpSuicideCount > pluginInstance.Config.ScpSuicideTollerance) AutoKickPlayer(player);
if (pluginInstance.Config.EnableSCPSuicideAutoBan && suicidePercentage >= pluginInstance.Config.AutoBanThreshold && player.GetDatabasePlayer().TotalScpGamesPlayed > pluginInstance.Config.ScpSuicideTollerance) AutoBanPlayer(player);
else if (pluginInstance.Config.AutoKickOnSCPSuicide && suicidePercentage >= pluginInstance.Config.AutoKickThreshold && suicidePercentage < pluginInstance.Config.AutoBanThreshold && player.GetDatabasePlayer().TotalScpGamesPlayed > pluginInstance.Config.ScpSuicideTollerance) AutoKickPlayer(player);
}

public void PostLoadPlayer(Exiled.API.Features.Player player)
Expand All @@ -106,31 +105,33 @@ public void PostLoadPlayer(Exiled.API.Features.Player player)

if (!string.IsNullOrEmpty(databasePlayer.ColorPreference) && databasePlayer.ColorPreference != "None")
{
Timing.CallDelayed(1.25f, () =>
Timing.CallDelayed(1.15f, () =>
{
player.RankColor = databasePlayer.ColorPreference;
});
}

if (databasePlayer.HideBadge == true)
{
Timing.CallDelayed(1.5f, () =>
Timing.CallDelayed(1.25f, () =>
{
player.BadgeHidden = true;
});
}


}

public bool CheckNickname(string name)
{
foreach (var nickname in Configs.BannedNickNames)
{
name = Regex.Replace(name, "[^a-zA-Z0-9]", "").ToLower();
name = Regex.Replace(name, "[^a-zA-Z0-9]", "").ToLower();
string pattern = Regex.Replace(nickname.ToLower(), "[^a-zA-Z0-9]", "");
if (Regex.Match(name, pattern).Success) return true;
if (Regex.Match(name, pattern).Success) return true;
}
return false;
}
}

}
}
22 changes: 0 additions & 22 deletions SCPUtils/Patches/HarmonyNickname.cs

This file was deleted.

Loading

0 comments on commit 00e41cf

Please sign in to comment.