mirror of
https://github.com/SoDOff-Project/sodoff-mmo.git
synced 2025-10-11 16:28:50 -07:00
Moved a few things around and abstracted moderative operations to their own methods.
This commit is contained in:
parent
599ddc3dc2
commit
1671468fc0
@ -4,12 +4,12 @@ using System;
|
|||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
using System.Xml.Linq;
|
||||||
|
|
||||||
namespace sodoffmmo.Core;
|
namespace sodoffmmo.Core;
|
||||||
public class Client {
|
public class Client {
|
||||||
static int id;
|
static int id;
|
||||||
static object lck = new();
|
static object lck = new();
|
||||||
protected static List<Client> clients = new();
|
|
||||||
|
|
||||||
public int ClientID { get; private set; }
|
public int ClientID { get; private set; }
|
||||||
public PlayerData PlayerData { get; set; } = new();
|
public PlayerData PlayerData { get; set; } = new();
|
||||||
@ -28,16 +28,9 @@ public class Client {
|
|||||||
socket = clientSocket;
|
socket = clientSocket;
|
||||||
lock (lck) {
|
lock (lck) {
|
||||||
ClientID = ++id;
|
ClientID = ++id;
|
||||||
clients.Add(this);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int TotalClientCount => clients.Count;
|
|
||||||
|
|
||||||
public static Client[] GetAllClients() {
|
|
||||||
return clients.ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task Receive() {
|
public async Task Receive() {
|
||||||
byte[] buffer = new byte[2048];
|
byte[] buffer = new byte[2048];
|
||||||
int len = await socket.ReceiveAsync(buffer, SocketFlags.None);
|
int len = await socket.ReceiveAsync(buffer, SocketFlags.None);
|
||||||
@ -72,7 +65,7 @@ public class Client {
|
|||||||
PlayerData.IsValid = false;
|
PlayerData.IsValid = false;
|
||||||
|
|
||||||
if (Room != null) {
|
if (Room != null) {
|
||||||
if (Room is not BanRoom) Console.WriteLine($"Leave room: {Room.Name} (id={Room.Id}, size={Room.ClientsCount}) IID: {ClientID}");
|
Console.WriteLine($"Leave room: {Room.Name} (id={Room.Id}, size={Room.ClientsCount}) IID: {ClientID}");
|
||||||
Room.RemoveClient(this);
|
Room.RemoveClient(this);
|
||||||
|
|
||||||
NetworkObject data = new();
|
NetworkObject data = new();
|
||||||
@ -85,7 +78,7 @@ public class Client {
|
|||||||
Room = room;
|
Room = room;
|
||||||
|
|
||||||
if (Room != null) {
|
if (Room != null) {
|
||||||
if (Room is not BanRoom) Console.WriteLine($"Join room: {Room.Name} RoomID (id={Room.Id}, size={Room.ClientsCount}) IID: {ClientID}");
|
Console.WriteLine($"Join room: {Room.Name} RoomID (id={Room.Id}, size={Room.ClientsCount}) IID: {ClientID}");
|
||||||
Room.AddClient(this);
|
Room.AddClient(this);
|
||||||
|
|
||||||
Send(Room.SubscribeRoom());
|
Send(Room.SubscribeRoom());
|
||||||
@ -110,9 +103,6 @@ public class Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void Disconnect() {
|
public void Disconnect() {
|
||||||
lock (lck) {
|
|
||||||
clients.Remove(this);
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
socket.Shutdown(SocketShutdown.Both);
|
socket.Shutdown(SocketShutdown.Both);
|
||||||
} finally {
|
} finally {
|
||||||
@ -130,11 +120,6 @@ public class Client {
|
|||||||
scheduledDisconnect = true;
|
scheduledDisconnect = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Ban() {
|
|
||||||
Banned = true;
|
|
||||||
SetRoom(PunishmentManager.BanRoom);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Connected {
|
public bool Connected {
|
||||||
get {
|
get {
|
||||||
return socket.Connected && !scheduledDisconnect;
|
return socket.Connected && !scheduledDisconnect;
|
||||||
|
63
src/Management/BanRoom.cs
Normal file
63
src/Management/BanRoom.cs
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
using sodoffmmo.Core;
|
||||||
|
using sodoffmmo.Data;
|
||||||
|
|
||||||
|
namespace sodoffmmo.Management;
|
||||||
|
public class BanRoom : Room {
|
||||||
|
public BanRoom(string name) : base(name, name) {}
|
||||||
|
|
||||||
|
public void UpdateClient(Client client) {
|
||||||
|
client.Send(RespondJoinRoom());
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Send(NetworkPacket packet, Client? skip = null) {
|
||||||
|
// Do nothing.
|
||||||
|
}
|
||||||
|
|
||||||
|
public override NetworkPacket RespondJoinRoom() {
|
||||||
|
NetworkObject obj = new();
|
||||||
|
NetworkArray roomInfo = new();
|
||||||
|
roomInfo.Add(Id);
|
||||||
|
roomInfo.Add(Name); // Room Name
|
||||||
|
roomInfo.Add(Group); // Group Name
|
||||||
|
roomInfo.Add(true); // is game
|
||||||
|
roomInfo.Add(false); // is hidden
|
||||||
|
roomInfo.Add(false); // is password protected
|
||||||
|
roomInfo.Add((short)0); // player count
|
||||||
|
roomInfo.Add((short)1); // max player count
|
||||||
|
roomInfo.Add(new NetworkArray()); // empty roomvars
|
||||||
|
roomInfo.Add((short)0); // spectator count
|
||||||
|
roomInfo.Add((short)0); // max spectator count
|
||||||
|
|
||||||
|
obj.Add("r", roomInfo);
|
||||||
|
obj.Add("ul", new NetworkArray()); // Empty userlist.
|
||||||
|
|
||||||
|
NetworkPacket packet = NetworkObject.WrapObject(0, 4, obj).Serialize();
|
||||||
|
packet.Compress();
|
||||||
|
|
||||||
|
return packet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override NetworkPacket SubscribeRoom() {
|
||||||
|
NetworkObject obj = new();
|
||||||
|
NetworkArray list = new();
|
||||||
|
|
||||||
|
NetworkArray r1 = new();
|
||||||
|
r1.Add(Id);
|
||||||
|
r1.Add(Name); // Room Name
|
||||||
|
r1.Add(Group); // Group Name
|
||||||
|
r1.Add(true);
|
||||||
|
r1.Add(false);
|
||||||
|
r1.Add(false);
|
||||||
|
r1.Add((short)0); // player count
|
||||||
|
r1.Add((short)1); // max player count
|
||||||
|
r1.Add(new NetworkArray());
|
||||||
|
r1.Add((short)0);
|
||||||
|
r1.Add((short)0);
|
||||||
|
|
||||||
|
list.Add(r1);
|
||||||
|
|
||||||
|
obj.Add("rl", list);
|
||||||
|
obj.Add("g", Group);
|
||||||
|
return NetworkObject.WrapObject(0, 15, obj).Serialize();
|
||||||
|
}
|
||||||
|
}
|
@ -13,53 +13,21 @@ class BanCommand : IManagementCommand {
|
|||||||
string name = string.Join(' ', arguments);
|
string name = string.Join(' ', arguments);
|
||||||
Client? target = client.Room.Clients.FirstOrDefault(x => x.PlayerData.DiplayName == name); // Find in this room.
|
Client? target = client.Room.Clients.FirstOrDefault(x => x.PlayerData.DiplayName == name); // Find in this room.
|
||||||
if (target == null) { // Search all clients in case the offender left the room.
|
if (target == null) { // Search all clients in case the offender left the room.
|
||||||
target = Client.GetAllClients().FirstOrDefault(x => x.PlayerData.DiplayName == name);
|
target = Server.GetAllClients().FirstOrDefault(x => x.PlayerData.DiplayName == name);
|
||||||
if (target == null) { // If the target is still null, call it a failure.
|
if (target == null) { // If the target is still null, call it a failure.
|
||||||
client.Send(Utils.BuildServerSideMessage($"Ban: user {name} not found", "Server"));
|
client.Send(Utils.BuildServerSideMessage($"Ban: user {name} not found", "Server"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target.Banned) {
|
if (target.Ban()) {
|
||||||
client.Send(Utils.BuildServerSideMessage($"Ban: {name} is already banned", "Server"));
|
if (target?.PlayerData.VikingId == null) {
|
||||||
} else {
|
|
||||||
target.Ban();
|
|
||||||
client.Send(Utils.BuildServerSideMessage($"Ban: {name} has been banned", "Server"));
|
client.Send(Utils.BuildServerSideMessage($"Ban: {name} has been banned", "Server"));
|
||||||
if (target.PlayerData.VikingId != null) {
|
|
||||||
PunishmentManager.BannedList.Add((int)target.PlayerData.VikingId, target.PlayerData.DiplayName);
|
|
||||||
PunishmentManager.SaveMutedBanned();
|
|
||||||
} else {
|
} else {
|
||||||
client.Send(Utils.BuildServerSideMessage($"Ban: This user is not authenticated. They have been merely kicked instead.", "Server"));
|
client.Send(Utils.BuildServerSideMessage($"Ban: {name}'s session has been banned (they are not authenticated)", "Server"));
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
}
|
client.Send(Utils.BuildServerSideMessage($"Ban: {name} is already banned", "Server"));
|
||||||
}
|
|
||||||
|
|
||||||
[ManagementCommand("unban", Role.Moderator)]
|
|
||||||
class UnbanCommand : IManagementCommand {
|
|
||||||
public void Handle(Client client, string[] arguments) {
|
|
||||||
if (arguments.Length < 1) {
|
|
||||||
client.Send(Utils.BuildServerSideMessage("Unban: Invalid number of arguments", "Server"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
string name = string.Join(' ', arguments);
|
|
||||||
int? id = null;
|
|
||||||
if (PunishmentManager.BannedList.ContainsValue(name)) // Find in list in case they're offline.
|
|
||||||
id = PunishmentManager.BannedList.FirstOrDefault(p => p.Value == name).Key;
|
|
||||||
|
|
||||||
if (id == null) { // Failure
|
|
||||||
client.Send(Utils.BuildServerSideMessage($"Unban: User named \"{name}\" is not banned", "Server"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Client? target = PunishmentManager.BanRoom.Clients.FirstOrDefault(x => x.PlayerData.VikingId == id || x.PlayerData.DiplayName == name); // Find in ban room.
|
|
||||||
|
|
||||||
client.Send(Utils.BuildServerSideMessage($"Unban: {name} has been unbanned", "Server"));
|
|
||||||
PunishmentManager.BannedList.Remove((int)id);
|
|
||||||
PunishmentManager.SaveMutedBanned();
|
|
||||||
if (target != null) {
|
|
||||||
target.Banned = false;
|
|
||||||
target.Disconnect(); // Client will handle relogging.
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -13,60 +13,18 @@ class MuteCommand : IManagementCommand {
|
|||||||
string name = string.Join(' ', arguments);
|
string name = string.Join(' ', arguments);
|
||||||
Client? target = client.Room.Clients.FirstOrDefault(x => x.PlayerData.DiplayName == name); // Find in this room.
|
Client? target = client.Room.Clients.FirstOrDefault(x => x.PlayerData.DiplayName == name); // Find in this room.
|
||||||
if (target == null) { // Search all clients in case the offender left the room.
|
if (target == null) { // Search all clients in case the offender left the room.
|
||||||
target = Client.GetAllClients().FirstOrDefault(x => x.PlayerData.DiplayName == name);
|
target = Server.GetAllClients().FirstOrDefault(x => x.PlayerData.DiplayName == name);
|
||||||
if (target == null) { // Failure
|
if (target == null) { // Failure
|
||||||
client.Send(Utils.BuildServerSideMessage($"Mute: user {name} not found", "Server"));
|
client.Send(Utils.BuildServerSideMessage($"Mute: user {name} not found", "Server"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target.PlayerData.VikingId != null) {
|
if (target.Mute()) {
|
||||||
if (PunishmentManager.MutedList.ContainsKey((int)target.PlayerData.VikingId)) {
|
client.Send(Utils.BuildServerSideMessage($"Mute: {name} has been muted", "Server"));
|
||||||
|
} else {
|
||||||
client.Send(Utils.BuildServerSideMessage($"Mute: {name} is already muted", "Server"));
|
client.Send(Utils.BuildServerSideMessage($"Mute: {name} is already muted", "Server"));
|
||||||
} else {
|
|
||||||
target.Muted = true;
|
|
||||||
client.Send(Utils.BuildServerSideMessage($"Mute: {name} has been muted", "Server"));
|
|
||||||
PunishmentManager.MutedList.Add((int)target.PlayerData.VikingId, target.PlayerData.DiplayName);
|
|
||||||
PunishmentManager.SaveMutedBanned();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
target.Muted = true;
|
|
||||||
client.Send(Utils.BuildServerSideMessage($"Mute: {name} has been muted", "Server"));
|
|
||||||
client.Send(Utils.BuildServerSideMessage($"Mute: This user is not authenticated. Their mute will not be permanent!", "Server"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[ManagementCommand("unmute", Role.Moderator)]
|
|
||||||
class UnmuteCommand : IManagementCommand {
|
|
||||||
public void Handle(Client client, string[] arguments) {
|
|
||||||
if (arguments.Length < 1) {
|
|
||||||
client.Send(Utils.BuildServerSideMessage("Unmute: Invalid number of arguments", "Server"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
string name = string.Join(' ', arguments);
|
|
||||||
int? id = null;
|
|
||||||
if (PunishmentManager.MutedList.ContainsValue(name)) id = PunishmentManager.MutedList.FirstOrDefault(p => p.Value == name).Key; // Find in list in case they're offline.
|
|
||||||
Client? target = client.Room.Clients.FirstOrDefault(x => x.PlayerData.VikingId == id || x.PlayerData.DiplayName == name); // Find in this room.
|
|
||||||
if (target == null) { // Search all clients in case the target left the room.
|
|
||||||
target = Client.GetAllClients().FirstOrDefault(x => x.PlayerData.DiplayName == name);
|
|
||||||
if (target == null && id == null) { // Failure
|
|
||||||
client.Send(Utils.BuildServerSideMessage($"Unmute: user {name} not found", "Server"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target?.Muted == false || (id != null && !PunishmentManager.MutedList.ContainsKey((int)id))) {
|
|
||||||
client.Send(Utils.BuildServerSideMessage($"Unmute: {name} is not muted", "Server"));
|
|
||||||
} else {
|
|
||||||
if (target != null) {
|
|
||||||
target.Muted = false;
|
|
||||||
}
|
|
||||||
client.Send(Utils.BuildServerSideMessage($"Unmute: {name} has been unmuted", "Server"));
|
|
||||||
if (id != null) {
|
|
||||||
PunishmentManager.MutedList.Remove((int)id);
|
|
||||||
PunishmentManager.SaveMutedBanned();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (target?.PlayerData.VikingId == null) client.Send(Utils.BuildServerSideMessage($"Mute: Their mute will not be persistent since they are not authenticated", "Server"));
|
||||||
}
|
}
|
||||||
}
|
}
|
31
src/Management/Commands/UnbanCommand.cs
Normal file
31
src/Management/Commands/UnbanCommand.cs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
using sodoffmmo.Attributes;
|
||||||
|
using sodoffmmo.Core;
|
||||||
|
|
||||||
|
namespace sodoffmmo.Management.Commands;
|
||||||
|
|
||||||
|
[ManagementCommand("unban", Role.Moderator)]
|
||||||
|
class UnbanCommand : IManagementCommand {
|
||||||
|
public void Handle(Client client, string[] arguments) {
|
||||||
|
if (arguments.Length < 1) {
|
||||||
|
client.Send(Utils.BuildServerSideMessage("Unban: Invalid number of arguments", "Server"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
string name = string.Join(' ', arguments);
|
||||||
|
int? id = null;
|
||||||
|
if (PunishmentManager.BannedList.ContainsValue(name)) // Find in list in case they're offline.
|
||||||
|
id = PunishmentManager.BannedList.FirstOrDefault(p => p.Value == name).Key;
|
||||||
|
|
||||||
|
if (id == null) { // Failure
|
||||||
|
client.Send(Utils.BuildServerSideMessage($"Unban: User named \"{name}\" is not banned", "Server"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Client? target = PunishmentManager.BanRoom.Clients.FirstOrDefault(x => x.PlayerData.VikingId == id || x.PlayerData.DiplayName == name); // Find in ban room.
|
||||||
|
|
||||||
|
if (target.Unban(id)) {
|
||||||
|
client.Send(Utils.BuildServerSideMessage($"Unban: {name} has been unbanned", "Server"));
|
||||||
|
} else {
|
||||||
|
client.Send(Utils.BuildServerSideMessage($"Unban: {name} is not banned", "Server"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
31
src/Management/Commands/UnmuteCommand.cs
Normal file
31
src/Management/Commands/UnmuteCommand.cs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
using sodoffmmo.Attributes;
|
||||||
|
using sodoffmmo.Core;
|
||||||
|
|
||||||
|
namespace sodoffmmo.Management.Commands;
|
||||||
|
|
||||||
|
[ManagementCommand("unmute", Role.Moderator)]
|
||||||
|
class UnmuteCommand : IManagementCommand {
|
||||||
|
public void Handle(Client client, string[] arguments) {
|
||||||
|
if (arguments.Length < 1) {
|
||||||
|
client.Send(Utils.BuildServerSideMessage("Unmute: Invalid number of arguments", "Server"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
string name = string.Join(' ', arguments);
|
||||||
|
int? id = null;
|
||||||
|
if (PunishmentManager.MutedList.ContainsValue(name)) id = PunishmentManager.MutedList.FirstOrDefault(p => p.Value == name).Key; // Find in list in case they're offline.
|
||||||
|
Client? target = client.Room.Clients.FirstOrDefault(x => x.PlayerData.VikingId == id || x.PlayerData.DiplayName == name); // Find in this room.
|
||||||
|
if (target == null) { // Search all clients in case the target left the room.
|
||||||
|
target = Server.GetAllClients().FirstOrDefault(x => x.PlayerData.DiplayName == name);
|
||||||
|
if (target == null && id == null) { // Failure
|
||||||
|
client.Send(Utils.BuildServerSideMessage($"Unmute: user {name} not found", "Server"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target.Unmute(id)) {
|
||||||
|
client.Send(Utils.BuildServerSideMessage($"Unmute: {name} has been unmuted", "Server"));
|
||||||
|
} else {
|
||||||
|
client.Send(Utils.BuildServerSideMessage($"Unmute: {name} is not muted", "Server"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,10 +1,9 @@
|
|||||||
using sodoffmmo.Core;
|
using sodoffmmo.Core;
|
||||||
using sodoffmmo.Data;
|
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
|
||||||
namespace sodoffmmo.Management;
|
namespace sodoffmmo.Management;
|
||||||
|
|
||||||
public class PunishmentManager {
|
public static class PunishmentManager {
|
||||||
// VikingId, Reason (nullable)
|
// VikingId, Reason (nullable)
|
||||||
public static readonly Dictionary<int, string?> MutedList;
|
public static readonly Dictionary<int, string?> MutedList;
|
||||||
public static readonly Dictionary<int, string?> BannedList;
|
public static readonly Dictionary<int, string?> BannedList;
|
||||||
@ -35,69 +34,97 @@ public class PunishmentManager {
|
|||||||
WriteIndented = true
|
WriteIndented = true
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Mute a user.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="target">User to mute - can be null, but id should be set in that case.</param>
|
||||||
|
/// <param name="id">Optional vikingid of the user to mute.</param>
|
||||||
|
/// <returns>False if already muted, otherwise true.</returns>
|
||||||
|
public static bool Mute(this Client? target, int? id = null) {
|
||||||
|
if (target != null) {
|
||||||
|
id ??= target.PlayerData.VikingId;
|
||||||
|
if (target.Muted && id == null) return false;
|
||||||
|
target.Muted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id != null) {
|
||||||
|
if (MutedList.ContainsKey((int)id)) return false;
|
||||||
|
MutedList.Add((int)id, target?.PlayerData.DiplayName);
|
||||||
|
SaveMutedBanned();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unmute a user.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="target">User to unmute - can be null, but id should be set in that case.</param>
|
||||||
|
/// <param name="id">Optional vikingid of the user to unmute.</param>
|
||||||
|
/// <returns>False if the user isn't muted, otherwise true.</returns>
|
||||||
|
public static bool Unmute(this Client? target, int? id=null) {
|
||||||
|
if (target != null) {
|
||||||
|
if (!target.Muted) return false;
|
||||||
|
target.Muted = false;
|
||||||
|
id ??= target.PlayerData.VikingId;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id != null) {
|
||||||
|
if (!MutedList.Remove((int)id)) return false;
|
||||||
|
SaveMutedBanned();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ban a user.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="target">User to ban - can be null, but id should be set in that case.</param>
|
||||||
|
/// <param name="id">Optional vikingid of the user to ban.</param>
|
||||||
|
/// <returns>False if already banned, otherwise true.</returns>
|
||||||
|
public static bool Ban(this Client? target, int? id=null) {
|
||||||
|
if (target != null) {
|
||||||
|
if (target.Banned) return false;
|
||||||
|
target.Banned = true;
|
||||||
|
target.SetRoom(BanRoom);
|
||||||
|
id ??= target.PlayerData.VikingId;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id != null) {
|
||||||
|
if (BannedList.ContainsKey((int)id)) return false;
|
||||||
|
BannedList.Add((int)id, target?.PlayerData.DiplayName);
|
||||||
|
SaveMutedBanned();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unban a user.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="target">User to unban - can be null, but id should be set in that case.</param>
|
||||||
|
/// <param name="id">Optional vikingid of the user to unban.</param>
|
||||||
|
/// <returns>False if the user isn't banned, otherwise true.</returns>
|
||||||
|
public static bool Unban(this Client? target, int? id=null) {
|
||||||
|
if (target != null) {
|
||||||
|
if (!target.Banned) return false;
|
||||||
|
target.Banned = false;
|
||||||
|
target.Disconnect(); // Client will handle relogging.
|
||||||
|
id ??= target.PlayerData.VikingId;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id != null) {
|
||||||
|
if (!BannedList.Remove((int)id)) return false;
|
||||||
|
SaveMutedBanned();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal sealed class MutedBannedData {
|
internal sealed class MutedBannedData {
|
||||||
public Dictionary<int, string?>? MutedList { get; set; }
|
public Dictionary<int, string?>? MutedList { get; set; }
|
||||||
public Dictionary<int, string?>? BannedList { get; set; }
|
public Dictionary<int, string?>? BannedList { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class BanRoom : Room {
|
|
||||||
public BanRoom(string name) : base(name, name) {}
|
|
||||||
|
|
||||||
public void UpdateClient(Client client) {
|
|
||||||
client.Send(RespondJoinRoom());
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Send(NetworkPacket packet, Client? skip = null) {
|
|
||||||
// Do nothing.
|
|
||||||
}
|
|
||||||
|
|
||||||
public override NetworkPacket RespondJoinRoom() {
|
|
||||||
NetworkObject obj = new();
|
|
||||||
NetworkArray roomInfo = new();
|
|
||||||
roomInfo.Add(Id);
|
|
||||||
roomInfo.Add(Name); // Room Name
|
|
||||||
roomInfo.Add(Group); // Group Name
|
|
||||||
roomInfo.Add(true); // is game
|
|
||||||
roomInfo.Add(false); // is hidden
|
|
||||||
roomInfo.Add(false); // is password protected
|
|
||||||
roomInfo.Add((short)0); // player count
|
|
||||||
roomInfo.Add((short)1); // max player count
|
|
||||||
roomInfo.Add(new NetworkArray()); // empty roomvars
|
|
||||||
roomInfo.Add((short)0); // spectator count
|
|
||||||
roomInfo.Add((short)0); // max spectator count
|
|
||||||
|
|
||||||
obj.Add("r", roomInfo);
|
|
||||||
obj.Add("ul", new NetworkArray()); // Empty userlist.
|
|
||||||
|
|
||||||
NetworkPacket packet = NetworkObject.WrapObject(0, 4, obj).Serialize();
|
|
||||||
packet.Compress();
|
|
||||||
|
|
||||||
return packet;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override NetworkPacket SubscribeRoom() {
|
|
||||||
NetworkObject obj = new();
|
|
||||||
NetworkArray list = new();
|
|
||||||
|
|
||||||
NetworkArray r1 = new();
|
|
||||||
r1.Add(Id);
|
|
||||||
r1.Add(Name); // Room Name
|
|
||||||
r1.Add(Group); // Group Name
|
|
||||||
r1.Add(true);
|
|
||||||
r1.Add(false);
|
|
||||||
r1.Add(false);
|
|
||||||
r1.Add((short)0); // player count
|
|
||||||
r1.Add((short)1); // max player count
|
|
||||||
r1.Add(new NetworkArray());
|
|
||||||
r1.Add((short)0);
|
|
||||||
r1.Add((short)0);
|
|
||||||
|
|
||||||
list.Add(r1);
|
|
||||||
|
|
||||||
obj.Add("rl", list);
|
|
||||||
obj.Add("g", Group);
|
|
||||||
return NetworkObject.WrapObject(0, 15, obj).Serialize();
|
|
||||||
}
|
|
||||||
}
|
|
@ -7,18 +7,26 @@ using System.Net.Sockets;
|
|||||||
|
|
||||||
namespace sodoffmmo;
|
namespace sodoffmmo;
|
||||||
public class Server {
|
public class Server {
|
||||||
|
static object lck = new();
|
||||||
|
static readonly List<Client> clients = new();
|
||||||
|
|
||||||
readonly int port;
|
readonly int port;
|
||||||
readonly IPAddress ipAddress;
|
readonly IPAddress ipAddress;
|
||||||
readonly bool IPv6AndIPv4;
|
readonly bool IPv6AndIPv4;
|
||||||
ModuleManager moduleManager = new();
|
ModuleManager moduleManager = new();
|
||||||
|
|
||||||
|
public static int TotalClientCount => clients.Count;
|
||||||
|
|
||||||
public Server(IPAddress ipAdress, int port, bool IPv6AndIPv4) {
|
public Server(IPAddress ipAdress, int port, bool IPv6AndIPv4) {
|
||||||
this.ipAddress = ipAdress;
|
this.ipAddress = ipAdress;
|
||||||
this.port = port;
|
this.port = port;
|
||||||
this.IPv6AndIPv4 = IPv6AndIPv4;
|
this.IPv6AndIPv4 = IPv6AndIPv4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Client[] GetAllClients() {
|
||||||
|
return clients.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
public async Task Run() {
|
public async Task Run() {
|
||||||
moduleManager.RegisterModules();
|
moduleManager.RegisterModules();
|
||||||
ManagementCommandProcessor.Initialize();
|
ManagementCommandProcessor.Initialize();
|
||||||
@ -47,6 +55,7 @@ public class Server {
|
|||||||
|
|
||||||
private async Task HandleClient(Socket handler) {
|
private async Task HandleClient(Socket handler) {
|
||||||
Client client = new(handler);
|
Client client = new(handler);
|
||||||
|
lock (lck) clients.Add(client);
|
||||||
try {
|
try {
|
||||||
while (client.Connected) {
|
while (client.Connected) {
|
||||||
await client.Receive();
|
await client.Receive();
|
||||||
@ -60,6 +69,7 @@ public class Server {
|
|||||||
try {
|
try {
|
||||||
client.SetRoom(null);
|
client.SetRoom(null);
|
||||||
} catch (Exception) { }
|
} catch (Exception) { }
|
||||||
|
lock (lck) clients.Remove(client);
|
||||||
client.Disconnect();
|
client.Disconnect();
|
||||||
Console.WriteLine("Socket disconnected IID: " + client.ClientID);
|
Console.WriteLine("Socket disconnected IID: " + client.ClientID);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user