139 lines
4.3 KiB
C#
139 lines
4.3 KiB
C#
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using System.IO;
|
||
|
using System.Linq;
|
||
|
using GameNetworkLayer.Shared;
|
||
|
|
||
|
namespace CLre_server.API.MainServer
|
||
|
{
|
||
|
public class Moderator
|
||
|
{
|
||
|
private static Moderator _instance = null;
|
||
|
|
||
|
public static Moderator Instance
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (_instance == null) Init();
|
||
|
return _instance;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal static void Init()
|
||
|
{
|
||
|
if (_instance == null) _instance = new Moderator();
|
||
|
}
|
||
|
|
||
|
private ModerationEngine _moderationEngine;
|
||
|
|
||
|
private Moderator()
|
||
|
{
|
||
|
_moderationEngine = new ModerationEngine();
|
||
|
Server.Instance.PlayerConnect += (sender, args) =>
|
||
|
{
|
||
|
#if DEBUG
|
||
|
Utility.Logging.MetaLog($"Player {args.PlayerId} is connecting, starting ban checker");
|
||
|
#endif
|
||
|
CheckConnectingPlayerAsap(args.PlayerId).Run();
|
||
|
};
|
||
|
}
|
||
|
|
||
|
public bool DisconnectPlayerById(string publicId)
|
||
|
{
|
||
|
int? playerId = _moderationEngine.FindConnectedPlayerById(publicId);
|
||
|
if (playerId.HasValue)
|
||
|
{
|
||
|
UserVerification.Instance.DisconnectPlayer(playerId.Value, NetworkDispatcherCode.GameDataVerificationFail);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public bool DisconnectPlayerByName(string name)
|
||
|
{
|
||
|
int? playerId = _moderationEngine.FindConnectedPlayerByName(name);
|
||
|
if (playerId.HasValue)
|
||
|
{
|
||
|
UserVerification.Instance.DisconnectPlayer(playerId.Value, NetworkDispatcherCode.GameDataVerificationFail);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public bool BanPlayerById(string publicId)
|
||
|
{
|
||
|
List<string> bans = new List<string>(CLre.Config.bans);
|
||
|
if (!bans.Contains(publicId))
|
||
|
{
|
||
|
bans.Add(publicId);
|
||
|
CLre.Config.bans = bans.ToArray();
|
||
|
}
|
||
|
return DisconnectPlayerById(publicId);
|
||
|
}
|
||
|
|
||
|
public bool BanPlayerByName(string name)
|
||
|
{
|
||
|
List<string> bans = new List<string>(CLre.Config.bans);
|
||
|
if (!bans.Contains(name))
|
||
|
{
|
||
|
bans.Add(name);
|
||
|
CLre.Config.bans = bans.ToArray();
|
||
|
}
|
||
|
return DisconnectPlayerByName(name);
|
||
|
}
|
||
|
|
||
|
public bool IsModerator(string name)
|
||
|
{
|
||
|
foreach (string modName in CLre.Config.moderators)
|
||
|
{
|
||
|
if (string.Compare(name, modName, StringComparison.InvariantCultureIgnoreCase) == 0)
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Guid? publicId = _moderationEngine.FindConnectedPlayerGuidByName(name);
|
||
|
if (publicId.HasValue)
|
||
|
{
|
||
|
foreach (string modGuid in CLre.Config.moderators)
|
||
|
{
|
||
|
if (modGuid == publicId.ToString())
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
public IEnumerator CheckConnectingPlayerAsap(int playerId)
|
||
|
{
|
||
|
while (Server.Instance.Players.Length <= playerId)
|
||
|
{
|
||
|
yield return null;
|
||
|
yield return null;
|
||
|
yield return null;
|
||
|
yield return null;
|
||
|
}
|
||
|
var connector = Server.Instance.Players[playerId];
|
||
|
if (CLre.Config.bans.Contains(connector.accountId.displayName)
|
||
|
|| CLre.Config.bans.Contains(connector.accountId.publicId.ToString()))
|
||
|
{
|
||
|
#if DEBUG
|
||
|
Utility.Logging.MetaLog($"Banned player {connector.accountId.displayName} ({connector.accountId.publicId}) tried to connect, kicking");
|
||
|
#endif
|
||
|
UserVerification.Instance.DisconnectPlayer(playerId, NetworkDispatcherCode.GameDataVerificationFail);
|
||
|
}
|
||
|
#if DEBUG
|
||
|
else
|
||
|
{
|
||
|
Utility.Logging.MetaLog($"Player {connector.accountId.displayName} ({connector.accountId.publicId}) is not banned, skipping auto-kick");
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
}
|
||
|
}
|