Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Collections;
- using System.Linq;
- using System.Text;
- using System.IO;
- using System.Net;
- using System.Net.Sockets;
- using System.Threading;
- using LuaInterface;
- namespace WhisperServer
- {
- public static class Program
- {
- static Socket sv = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- static IPEndPoint ep = new IPEndPoint(IPAddress.Any, 9647);
- static Hashtable users = new Hashtable();
- static List<string> queue = new List<string>();
- static string motd = "";
- static bool newmotd = false;
- static bool closing = false;
- static bool newusers = false;
- static Thread lst;
- static Thread msg;
- static LuaEngine luaEngine = new LuaEngine();
- #region Troll quotes
- static string[] trollquotes = new string[] { "I'm a troll and I cannot post my own messages!",
- "I am gay!", "I love everyone!",
- "I deserve what I got, no doubt about it!",
- "I love being punished!",
- "Ban me!",
- "Kick me!",
- "I feel that I'm better off restricted from normal user privaleges!",
- "I love being denied freedom of speech! I owe you one!",
- "My righteous ranker deserves a medal!",
- "I made a wrong choice. I'm glad I was restrained.",
- "I wish to express my utter remorse for my actions!",
- "I am a fat kid with no life!",
- "My IQ is smaller than my dick, and that's BEYOND microscopic!",
- "I love Justin Bieber!",
- "I don't deserve internet!" };
- #endregion
- #region Help text
- static string help =
- "======COMMAND LIST======\n" +
- "/me: Posts a third-person message. - Noob and higher - Syntax: /me <message>\n" +
- "/users: Retrieves a complete list of all connected users. - All ranks - No parameters\n" +
- "/msg: Sends a private message to a use. - All ranks - Syntax: /msg <username> <message>\n" +
- "/getrank: Gets the rank title of a specified user. - All ranks - Syntax: /getrank <username>\n" +
- "/stalk: Gets the IP address of a specified user. - All ranks - Syntax: /stalk <username>\n" +
- "/mute: Prevents a user from posting messages. - Mod and higher - Syntax: /mute <username>\n" +
- "/unmute: Enables a muted user to speak again. - Mod and higher - Syntax: /unmute <username>\n" +
- "/kick: Forcibly ejects a user from the server. - VIP and higher - Syntax: /kick <username>\n" +
- "/ban: Kicks a user and prevents them from coming back. - Mod and higher - Syntax: /ban <username>\n" +
- "/unban: Enables a banned user to join the server once more. - Mod and higher - Syntax: /unban <username>\n" +
- "/topic: Sets the server topic. - Host only - Syntax: /topic <message>\n" +
- "There are also a few secret commands that you must find yourself. ;)";
- #endregion
- static void Main(string[] args)
- {
- Console.Title = "Whisper Dedicated Server v1.6 Alpha";
- Info("Please note: In order to accept non-LAN connections, you will need to forward TCP port 9647 on your router.");
- Info("Starting server.");
- sv.Bind(ep);
- sv.Listen(5);
- lst = new Thread(new ThreadStart(Listener));
- lst.Start();
- msg = new Thread(new ThreadStart(MsgHandler));
- msg.Start();
- motd = GetMOTD();
- Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress);
- if (File.Exists("init.lua"))
- {
- Info("Starting init.lua.");
- Thread luaThread = new Thread(new ThreadStart(LuaThread));
- luaThread.Start();
- }
- Info("Ready!");
- while (true)
- {
- string cm = Console.ReadLine();
- if (cm == "")
- {
- continue;
- }
- ServerCommand com = new ServerCommand(cm);
- switch (com.CommandName.ToLower())
- {
- case "stop":
- closing = true;
- break;
- case "say":
- ServerCommand c2 = new ServerCommand(com.CommandString, 0);
- queue.Add("[SERVER] " + c2.Parameters[0]);
- break;
- case "topic":
- #region Topic
- ServerCommand c3 = new ServerCommand(com.CommandString, 0);
- motd = c3.Parameters[0];
- SaveMOTD(motd);
- newmotd = true;
- #endregion
- break;
- case "users":
- #region Userlist
- if (users.Count > 0)
- {
- string people = "";
- foreach (DictionaryEntry c in users)
- {
- people += ((Client)c.Value).name + ", ";
- }
- people = Split(people, 0, people.Length - 2);
- Info("User list: " + people);
- }
- else
- {
- Info("There are no users currently connected.");
- }
- #endregion
- break;
- case "clear":
- Console.Clear();
- Info("Console cleared.");
- break;
- case "kick":
- #region Kick
- if (com.Parameters.Count == 1)
- {
- if (users.ContainsKey(com.Parameters[0]))
- {
- ((Client)(users[com.Parameters[0]])).state = PenaltyState.Kicked;
- try
- {
- byte[] kickmsg = CreatePacket(ServerPacketType.Kicked, "");
- ((Client)(users[com.Parameters[0]])).sock.Send(kickmsg);
- DisconnectUser(((Client)(users[com.Parameters[0]])));
- users.Remove(com.Parameters[0]);
- newusers = true;
- queue.Add("[INFO] The console has kicked " + com.Parameters[0] + " from the server.");
- }
- catch
- {
- ((Client)(users[com.Parameters[0]])).error = true;
- }
- }
- else
- {
- Error("No user with the name \"" + com.Parameters[0] + "\" exists.");
- }
- }
- else
- {
- Error("Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
- }
- #endregion
- break;
- case "ban":
- #region Ban
- if (com.Parameters.Count == 1)
- {
- if (users.ContainsKey(com.Parameters[0]))
- {
- ((Client)(users[com.Parameters[0]])).state = PenaltyState.Banned;
- try
- {
- byte[] kickmsg = CreatePacket(ServerPacketType.Banned, "");
- ((Client)(users[com.Parameters[0]])).sock.Send(kickmsg);
- Ban b = new Ban();
- b.UserName = com.Parameters[0];
- b.IP = ((IPEndPoint)(((Client)(users[com.Parameters[0]])).sock.RemoteEndPoint)).Address;
- DisconnectUser(((Client)(users[com.Parameters[0]])));
- try
- {
- List<Ban> current = GetBanlist();
- StreamWriter writer = new StreamWriter("banned.txt");
- if (current != null)
- {
- foreach (Ban ban in current)
- {
- writer.WriteLine(ban.UserName + "|" + ban.IP.ToString());
- }
- }
- writer.WriteLine(b.UserName + "|" + b.IP.ToString());
- writer.Close();
- queue.Add("[INFO] The console has banned " + com.Parameters[0] + " from the server.");
- users.Remove(com.Parameters[0]);
- newusers = true;
- }
- catch
- {
- Error("A problem occured when trying to log a ban issued for " + com.Parameters[0] + ". The targeted user may still be able to reconnect.");
- }
- }
- catch
- {
- ((Client)(users[com.Parameters[0]])).error = true;
- }
- }
- else
- {
- Error("No user with the name \"" + com.Parameters[0] + "\" exists.");
- }
- }
- else
- {
- Error("Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
- }
- #endregion
- break;
- case "unban":
- #region Unban
- if (com.Parameters.Count == 1)
- {
- try
- {
- List<Ban> current = GetBanlist();
- List<string> names = new List<string>();
- int ind = 0;
- if (current != null)
- {
- for (int i = 0; i < current.Count; i++)
- {
- if (current[i].UserName == com.Parameters[0])
- {
- ind = i;
- }
- names.Add(current[i].UserName);
- }
- if (names.Contains(com.Parameters[0]))
- {
- current.RemoveAt(ind);
- StreamWriter writer = new StreamWriter("banned.txt");
- foreach (Ban b in current)
- {
- writer.WriteLine(b.UserName + "|" + b.IP.ToString());
- }
- writer.Close();
- queue.Add("[INFO] The console has unbanned " + com.Parameters[0] + ".");
- }
- else
- {
- Error("There is no banned user named " + com.Parameters[0] + ".");
- }
- }
- else
- {
- Error("There is no existing ban list.");
- }
- }
- catch
- {
- Error("A problem occured when trying to remove a ban issued to" + com.Parameters[0] + ". The targeted user may still be banned.");
- }
- }
- else
- {
- Error("Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
- }
- #endregion
- break;
- case "rank":
- #region Rank
- if (com.Parameters.Count == 2)
- {
- if (users.ContainsKey(com.Parameters[0]))
- {
- byte r;
- if (Byte.TryParse(com.Parameters[1], out r))
- {
- if (r == (byte)Rank.Troll || r == (byte)Rank.Noob || r == (byte)Rank.User || r == (byte)Rank.VIP || r == (byte)Rank.Mod || r == (byte)Rank.Host)
- {
- ((Client)(users[com.Parameters[0]])).rank = (Rank)r;
- queue.Add("[INFO] The console has ranked " + com.Parameters[0] + " as a " + ((Client)(users[com.Parameters[0]])).rank.ToString() + ".");
- if (((Client)(users[com.Parameters[0]])).rank == Rank.Troll)
- {
- ((Client)(users[com.Parameters[0]])).trolltimer = 3;
- }
- newusers = true;
- List<UserSpec> current = GetUserSpeclist();
- List<string> ips = new List<string>();
- int ind = -1;
- if (current != null)
- {
- for (int i = 0; i < current.Count; i++)
- {
- if (current[i].IP.ToString() == ((IPEndPoint)(((Client)(users[com.Parameters[0]])).sock.RemoteEndPoint)).Address.ToString())
- {
- ind = i;
- }
- ips.Add(current[i].IP.ToString());
- }
- }
- if (current != null && ind > -1)
- {
- current[ind].r = ((Client)(users[com.Parameters[0]])).rank;
- }
- else
- {
- UserSpec tmp = new UserSpec();
- tmp.IP = ((IPEndPoint)(((Client)(users[com.Parameters[0]])).sock.RemoteEndPoint)).Address;
- tmp.r = ((Client)(users[com.Parameters[0]])).rank;
- if (current == null)
- {
- current = new List<UserSpec>();
- }
- current.Add(tmp);
- }
- try
- {
- StreamWriter writer = new StreamWriter("users.txt");
- foreach (UserSpec spec in current)
- {
- writer.WriteLine(spec.IP.ToString() + "|" + ((byte)spec.r).ToString());
- }
- writer.Close();
- }
- catch (Exception ex)
- {
- Error("A problem occured when trying to save the rank status for " + com.Parameters[0] + ". " + ex.ToString());
- }
- finally
- {
- }
- newusers = true;
- }
- else
- {
- Error("Invalid rank. Rank numbers are numbered by the power of 2 (i.e. 1, 2, 4, 8, 16, etc.)");
- }
- }
- else
- {
- Error("Invalid rank. Rank numbers are numbered by the power of 2 (i.e. 1, 2, 4, 8, 16, etc.)");
- }
- }
- else
- {
- Error("No user with the name \"" + com.Parameters[0] + "\" exists.");
- }
- }
- else
- {
- Error("Invalid parameter count '" + com.Parameters.Count + "'. This command takes 2 parameters.");
- }
- #endregion
- break;
- case "mute":
- #region Mute
- if (com.Parameters.Count == 1)
- {
- if (users.ContainsKey(com.Parameters[0]))
- {
- if ((byte)((Client)(users[com.Parameters[0]])).rank < (byte)Rank.VIP)
- {
- ((Client)(users[com.Parameters[0]])).state = PenaltyState.Muted;
- queue.Add("[INFO] The console has muted " + com.Parameters[0] + ".");
- }
- else
- {
- Error("You may not mute moderators or the host.");
- }
- }
- else
- {
- Error("No user with the name \"" + com.Parameters[0] + "\" exists.");
- }
- }
- else
- {
- Error("Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
- }
- #endregion
- break;
- case "unmute":
- #region Unmute
- if (com.Parameters.Count == 1)
- {
- if (users.ContainsKey(com.Parameters[0]))
- {
- if ((byte)((Client)(users[com.Parameters[0]])).rank < (byte)Rank.VIP)
- {
- ((Client)(users[com.Parameters[0]])).state = PenaltyState.None;
- queue.Add("[INFO] The console has unmuted " + com.Parameters[0] + ".");
- }
- else
- {
- Error("Moderators and the host cannot be muted anyway, so what are you playing at?!");
- }
- }
- else
- {
- Error("No user with the name \"" + com.Parameters[0] + "\" exists.");
- }
- }
- else
- {
- Error("Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
- }
- #endregion
- break;
- case "msg":
- #region Private message
- if (com.Parameters.Count > 1)
- {
- if (users.ContainsKey(com.Parameters[0]))
- {
- ServerCommand com2 = new ServerCommand(com.CommandString, 1);
- SendMessage((Client)(users[com.Parameters[0]]), "[MSG] " + "Server Console: " + com2.Parameters[0]);
- Console.WriteLine("[TO " + com.Parameters[0] + "]: " + com2.Parameters[0]);
- }
- else
- {
- Error("No user with the name \"" + com.Parameters[0] + "\" exists.");
- }
- }
- else
- {
- Error("Invalid parameter count '" + com.Parameters.Count + "'. This command takes 2 parameters.");
- }
- #endregion
- break;
- default:
- Error("Invalid command.");
- break;
- }
- }
- }
- static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
- {
- Warning("Ctrl+C is blocked in this application to prevent crashing.");
- Thread.Sleep(1000);
- e.Cancel = true;
- }
- static void Info(string message)
- {
- Console.WriteLine("[INFO] " + message);
- }
- static void Error(string message)
- {
- Console.WriteLine("[ERROR] " + message);
- }
- static void Warning(string message)
- {
- Console.WriteLine("[WARNING] " + message);
- }
- static void Chat(string message)
- {
- Console.WriteLine("[CHAT] " + message);
- }
- static void LuaMessage(string message)
- {
- Console.WriteLine("[LUA] " + message);
- }
- static void Listener()
- {
- while (true)
- {
- if (sv.Poll(-1, SelectMode.SelectRead))
- {
- Thread a = new Thread(new ParameterizedThreadStart(Accepter));
- a.Start(sv.Accept());
- }
- }
- }
- static void LuaThread()
- {
- try
- {
- luaEngine.Engine.DoFile("init.lua");
- }
- catch (LuaException ex)
- {
- LuaMessage(ex.Message);
- }
- }
- static void MsgHandler()
- {
- while (true)
- {
- while (!closing && queue.Count == 0 && !newusers && !newmotd)
- {
- Thread.Sleep(1);
- }
- if (closing)
- {
- Info("Shutting down server.");
- try
- {
- if (users.Count > 0)
- {
- foreach (DictionaryEntry c in users)
- {
- try
- {
- ((Client)c.Value).sock.Send(CreatePacket(ServerPacketType.Shutdown, ""));
- DisconnectUser(((Client)c.Value));
- }
- catch
- {
- Error("Couldn't disconnect user " + ((Client)c.Value).name + ".");
- }
- finally
- {
- }
- }
- users.Clear();
- Thread.Sleep(1000);
- }
- }
- catch
- {
- Error("A problem occured when trying to disconnect all users. The affected may receive a \"Lost connection\" error because of this.");
- Console.WriteLine("Press any key to exit.");
- Console.ReadKey();
- }
- finally
- {
- }
- Environment.Exit(0);
- }
- if (queue.Count > 0)
- {
- Hashtable u2 = users;
- try
- {
- foreach (DictionaryEntry c in users)
- {
- try
- {
- foreach (string s in queue)
- {
- ((Client)c.Value).sock.Send(CreatePacket(ServerPacketType.ChatPost, s.TrimEnd()));
- }
- }
- catch (Exception e)
- {
- Error("Server error occured with user " + ((Client)c.Value).name + ". " + e.Message);
- Info("Disconnecting user " + ((Client)c.Value).name + " from server.");
- queue.Add("[INFO] " + ((Client)c.Value).name + " has been disconnected due to an internal server error.");
- DisconnectUser(((Client)c.Value));
- u2.Remove(((Client)c.Value).name);
- newusers = true;
- }
- finally {
- }
- }
- }
- catch
- {
- }
- finally
- {
- }
- foreach (string s in queue)
- {
- Chat(s);
- }
- queue.Clear();
- users = u2;
- }
- if (newusers)
- {
- Hashtable u2 = users;
- newusers = false;
- string temp = "";
- if (users.Count > 0)
- {
- foreach (DictionaryEntry c in users)
- {
- temp += GetRankSymbol(((Client)c.Value).rank) + ((Client)c.Value).name;
- temp += " ";
- }
- temp = Split(temp, 0, temp.Length - 1);
- }
- byte[] u = CreatePacket(ServerPacketType.UserList, temp);
- foreach (DictionaryEntry c in users)
- {
- try
- {
- ((Client)c.Value).sock.Send(u);
- }
- catch (Exception e)
- {
- Error("Server error occured with user " + ((Client)c.Value).name + ". " + e.Message);
- Info("Disconnecting user " + ((Client)c.Value).name + " from server.");
- queue.Add("[INFO] " + ((Client)c.Value).name + " has been disconnected due to an internal server error.");
- DisconnectUser(((Client)c.Value));
- u2.Remove(((Client)c.Value).name);
- newusers = true;
- }
- finally
- {
- }
- }
- users = u2;
- }
- if (newmotd)
- {
- Hashtable u2 = users;
- newmotd = false;
- foreach (DictionaryEntry c in users)
- {
- try
- {
- byte[] m = CreatePacket(ServerPacketType.MOTD, motd);
- ((Client)c.Value).sock.Send(m);
- }
- catch (Exception e)
- {
- Error("Server error occured with user " + ((Client)c.Value).name + ". " + e.Message);
- Info("Disconnecting user " + ((Client)c.Value).name + " from server.");
- queue.Add("[INFO] " + ((Client)c.Value).name + " has been disconnected due to an internal server error.");
- DisconnectUser(((Client)c.Value));
- u2.Remove(((Client)c.Value).name);
- newusers = true;
- }
- finally
- {
- }
- }
- users = u2;
- Info("The topic has been changed to \"" + motd + "\".");
- }
- }
- }
- static void Accepter(object socket)
- {
- Socket sock = (Socket)socket;
- Client c = new Client();
- IPAddress sockip = ((IPEndPoint)sock.RemoteEndPoint).Address;
- string error = "";
- try
- {
- bool invalid = false;
- byte[] req1 = CreatePacket(ServerPacketType.RequestUsername, " ");
- sock.Send(req1);
- if (sock.Poll(5000000, SelectMode.SelectRead))
- {
- if (sock.Available > 0)
- {
- int len = 0;
- byte[] data = new byte[sock.Available];
- sock.Receive(data);
- MemoryStream ns = new MemoryStream(data);
- if (ns.Length > 4)
- {
- while (ns.Position < ns.Length)
- {
- byte[] l = new byte[4];
- ns.Read(l, 0, 4);
- len = BitConverter.ToInt32(l, 0);
- byte[] dat = new byte[len + 4];
- ns.Position -= 4;
- ns.Read(dat, 0, len + 4);
- ClientPacket cp = ClientPacket.Parse(dat);
- if (cp != null)
- {
- if (cp.PacketType == ClientPacketType.Username)
- {
- if (cp.Data.Length > 0)
- {
- c.name = cp.Data;
- }
- else
- {
- invalid = true;
- error = "Empty username";
- }
- }
- else
- {
- invalid = true;
- error = "Wrong packet signature: " + cp.PacketType.ToString();
- }
- }
- else
- {
- invalid = true;
- error = "Corrupt packet";
- }
- }
- }
- else
- {
- invalid = true;
- error = "Corrupt packet";
- }
- ns.Close();
- }
- else
- {
- invalid = true;
- error = "No data available";
- }
- // Check if this user is banned?
- if (!invalid)
- {
- List<Ban> banlist = GetBanlist();
- if (banlist != null)
- {
- foreach (Ban b in banlist)
- {
- if (sockip.ToString() == b.IP.ToString() || c.name == b.UserName)
- {
- // The 6 lines of code sure to piss anybody off
- byte[] rejban = CreatePacket(ServerPacketType.Rejected, "[ERROR] Rejected: You are banned from this server!");
- sock.Send(rejban);
- invalid = true;
- error = "Banned user";
- break;
- }
- }
- }
- }
- //Check user rank
- if (!invalid)
- {
- List<UserSpec> userlist = GetUserSpeclist();
- if (userlist != null)
- {
- foreach (UserSpec spec in userlist)
- {
- if (sockip.ToString() == spec.IP.ToString())
- {
- c.rank = spec.r;
- break;
- }
- }
- }
- c.sock = sock;
- if (sockip.ToString() == "127.0.0.1" || sockip.ToString() == "192.168.1.1")
- {
- c.rank = Rank.Host;
- }
- string nn = c.name;
- while (users.ContainsKey(nn))
- {
- nn += "_";
- }
- c.name = nn;
- c.sock.Send(CreatePacket(ServerPacketType.Accepted, ""));
- users.Add(c.name, c);
- newusers = true;
- Thread ct = new Thread(new ParameterizedThreadStart(ClientThread));
- ct.Start(c);
- c.sock.Send(CreatePacket(ServerPacketType.MOTD, motd));
- queue.Add("[INFO] " + c.name + " has joined the server.");
- }
- }
- else
- {
- invalid = true;
- error = "Userame request not answered after 5 seconds";
- }
- if (invalid)
- {
- Warning(sockip.ToString() + " failed to connect to the server. (" + error + ")");
- sock.Shutdown(SocketShutdown.Both);
- sock.Close();
- }
- }
- catch (Exception ex)
- {
- Error(sockip.ToString() + " could not be connected to the server. Exception: " + ex.Message);
- sock.Shutdown(SocketShutdown.Both);
- sock.Close();
- }
- }
- static void ClientThread(object cl)
- {
- Client c = (Client)cl;
- bool lolz = true;
- while (true)
- {
- try
- {
- bool invalid = false;
- if (c.sock.Poll(-1, SelectMode.SelectRead))
- {
- if (c.sock.Available > 0)
- {
- IPAddress cip = ((IPEndPoint)(c.sock.RemoteEndPoint)).Address;
- int len = 0;
- byte[] data = new byte[c.sock.Available];
- c.sock.Receive(data);
- MemoryStream ns = new MemoryStream(data);
- if (ns.Length > 4)
- {
- while (ns.Position < ns.Length)
- {
- if (invalid)
- {
- break;
- }
- byte[] l = new byte[4];
- ns.Read(l, 0, 4);
- len = BitConverter.ToInt32(l, 0);
- byte[] dat = new byte[len + 4];
- ns.Position -= 4;
- ns.Read(dat, 0, len + 4);
- ClientPacket cp = ClientPacket.Parse(dat);
- if (cp != null)
- {
- //Process packet here
- switch (cp.PacketType)
- {
- case ClientPacketType.ChatPost:
- ChatCommand com = new ChatCommand(cp.Data);
- if (!com.Invalid)
- {
- switch (com.CommandName.ToLower())
- {
- case "me":
- #region /me
- if (c.rank != Rank.Troll)
- {
- ChatCommand c2 = new ChatCommand(cp.Data, 0);
- queue.Add(c.name + " " + c2.Parameters[0]);
- }
- else
- {
- SendMessage(c, "[ERROR] You are a troll!");
- }
- #endregion
- break;
- case "kick":
- #region Kick
- if ((byte)c.rank > 4)
- {
- if (com.Parameters.Count == 1)
- {
- if (users.ContainsKey(com.Parameters[0]))
- {
- if ((byte)((Client)(users[com.Parameters[0]])).rank < 16)
- {
- ((Client)(users[com.Parameters[0]])).state = PenaltyState.Kicked;
- try
- {
- byte[] kickmsg = CreatePacket(ServerPacketType.Kicked, "");
- ((Client)(users[com.Parameters[0]])).sock.Send(kickmsg);
- DisconnectUser(((Client)(users[com.Parameters[0]])));
- users.Remove(com.Parameters[0]);
- newusers = true;
- queue.Add("[INFO] " + c.name + " has kicked " + com.Parameters[0] + " from the server.");
- }
- catch
- {
- ((Client)(users[com.Parameters[0]])).error = true;
- }
- }
- else
- {
- SendMessage(c, "[ERROR] You can't kick a mod or host.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Your current rank does not allow you to kick users.");
- }
- #endregion
- break;
- case "ban":
- #region Ban
- if ((byte)c.rank > (byte)Rank.VIP)
- {
- if (com.Parameters.Count == 1)
- {
- if (users.ContainsKey(com.Parameters[0]))
- {
- if (c.name != com.Parameters[0])
- {
- ((Client)(users[com.Parameters[0]])).state = PenaltyState.Banned;
- try
- {
- byte[] kickmsg = CreatePacket(ServerPacketType.Banned, "");
- ((Client)(users[com.Parameters[0]])).sock.Send(kickmsg);
- Ban b = new Ban();
- b.UserName = com.Parameters[0];
- b.IP = ((IPEndPoint)(((Client)(users[com.Parameters[0]])).sock.RemoteEndPoint)).Address;
- DisconnectUser(((Client)(users[com.Parameters[0]])));
- try
- {
- List<Ban> current = GetBanlist();
- StreamWriter writer = new StreamWriter("banned.txt");
- if (current != null)
- {
- foreach (Ban ban in current)
- {
- writer.WriteLine(ban.UserName + "|" + ban.IP.ToString());
- }
- }
- writer.WriteLine(b.UserName + "|" + b.IP.ToString());
- writer.Close();
- queue.Add("[INFO] " + c.name + " has banned " + com.Parameters[0] + " from the server.");
- users.Remove(com.Parameters[0]);
- newusers = true;
- }
- catch
- {
- SendMessage(c, "[ERROR] A problem occured when trying to log the ban. The targeted user may still be able to reconnect.");
- Error("A problem occured when trying to log a ban issued by " + c.name + " for " + com.Parameters[0] + ". The targeted user may still be able to reconnect.");
- }
- }
- catch
- {
- ((Client)(users[com.Parameters[0]])).error = true;
- }
- }
- else
- {
- SendMessage(c, "[ERROR] You can't ban yourself!");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Your current rank does not allow you to ban users.");
- }
- #endregion
- break;
- case "mute":
- #region Mute
- if ((byte)c.rank > (byte)Rank.VIP)
- {
- if (com.Parameters.Count == 1)
- {
- if (users.ContainsKey(com.Parameters[0]))
- {
- if ((byte)((Client)(users[com.Parameters[0]])).rank < (byte)Rank.VIP)
- {
- ((Client)(users[com.Parameters[0]])).state = PenaltyState.Muted;
- queue.Add("[INFO] " + c.name + " has muted " + com.Parameters[0] + ".");
- }
- else
- {
- SendMessage(c, "[ERROR] You may not mute moderators or the host.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Your current rank does not allow you to mute users.");
- }
- #endregion
- break;
- case "unmute":
- #region Unmute
- if ((byte)c.rank > (byte)Rank.VIP)
- {
- if (com.Parameters.Count == 1)
- {
- if (users.ContainsKey(com.Parameters[0]))
- {
- if ((byte)((Client)(users[com.Parameters[0]])).rank < (byte)Rank.VIP)
- {
- ((Client)(users[com.Parameters[0]])).state = PenaltyState.None;
- queue.Add("[INFO] " + c.name + " has unmuted " + com.Parameters[0] + ".");
- }
- else
- {
- SendMessage(c, "[ERROR] Moderators and the host cannot be muted anyway, so what are you playing at?!");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Your current rank does not allow you to unmute users.");
- }
- #endregion
- break;
- case "unban":
- #region Unban
- if ((byte)c.rank > (byte)Rank.VIP)
- {
- if (com.Parameters.Count == 1)
- {
- try
- {
- List<Ban> current = GetBanlist();
- List<string> names = new List<string>();
- int ind = 0;
- if (current != null)
- {
- for (int i = 0; i < current.Count; i++)
- {
- if (current[i].UserName == com.Parameters[0])
- {
- ind = i;
- }
- names.Add(current[i].UserName);
- }
- if (names.Contains(com.Parameters[0]))
- {
- current.RemoveAt(ind);
- StreamWriter writer = new StreamWriter("banned.txt");
- foreach (Ban b in current)
- {
- writer.WriteLine(b.UserName + "|" + b.IP.ToString());
- }
- writer.Close();
- queue.Add("[INFO] " + c.name + " has unbanned " + com.Parameters[0] + ".");
- }
- else
- {
- SendMessage(c, "[ERROR] There is no banned user named " + com.Parameters[0] + ".");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] There is no existing ban list.");
- }
- }
- catch
- {
- SendMessage(c, "[ERROR] A problem occured when trying to remove the ban. The targeted user may still be banned.");
- Error("A problem occured when trying to remove a ban issued to" + com.Parameters[0] + ". The targeted user may still be banned.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Your current rank does not allow you to unban users.");
- }
- #endregion
- break;
- case "getrank":
- #region Getrank
- if (com.Parameters.Count == 1)
- {
- if (users.ContainsKey(com.Parameters[0]))
- {
- SendMessage(c, "[INFO] " + ((Client)(users[com.Parameters[0]])).name + " is a " + ((Client)(users[com.Parameters[0]])).rank.ToString() + ".");
- }
- else
- {
- SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
- }
- #endregion
- break;
- case "rank":
- #region Rank
- if ((byte)c.rank > (byte)Rank.VIP)
- {
- if (com.Parameters.Count == 2)
- {
- if (users.ContainsKey(com.Parameters[0]))
- {
- if ((byte)((Client)(users[com.Parameters[0]])).rank >= (byte)Rank.Mod && c.rank != Rank.Host)
- {
- SendMessage(c, "[ERROR] You cannot change the ranks of moderators or the host.");
- break;
- }
- byte r;
- if (Byte.TryParse(com.Parameters[1], out r))
- {
- if (r == (byte)Rank.Troll || r == (byte)Rank.Noob || r == (byte)Rank.User || r == (byte)Rank.VIP || r == (byte)Rank.Mod)
- {
- ((Client)(users[com.Parameters[0]])).rank = (Rank)r;
- queue.Add("[INFO] " + c.name + " has ranked " + com.Parameters[0] + " as a " + ((Client)(users[com.Parameters[0]])).rank.ToString() + ".");
- if (((Client)(users[com.Parameters[0]])).rank == Rank.Troll)
- {
- ((Client)(users[com.Parameters[0]])).trolltimer = 3;
- }
- newusers = true;
- List<UserSpec> current = GetUserSpeclist();
- List<string> ips = new List<string>();
- int ind = -1;
- for (int i = 0; i < current.Count; i++)
- {
- if (current[i].IP == ((IPEndPoint)(((Client)(users[com.Parameters[0]])).sock.RemoteEndPoint)).Address)
- {
- ind = i;
- }
- ips.Add(current[i].IP.ToString());
- }
- if (ips.Contains(cip.ToString()))
- {
- current[ind].r = ((Client)(users[com.Parameters[0]])).rank;
- }
- else
- {
- UserSpec tmp = new UserSpec();
- tmp.IP = ((IPEndPoint)(((Client)(users[com.Parameters[0]])).sock.RemoteEndPoint)).Address;
- tmp.r = ((Client)(users[com.Parameters[0]])).rank;
- current.Add(tmp);
- }
- try
- {
- StreamWriter writer = new StreamWriter("users.txt");
- foreach (UserSpec spec in current)
- {
- writer.WriteLine(spec.IP.ToString() + "|" + ((byte)spec.r).ToString());
- }
- writer.Close();
- }
- catch (Exception ex)
- {
- SendMessage(c, "[ERROR] A problem occured when trying to save the user's rank status. Their rank may be lost when they reconnect.");
- Error("A problem occured when trying to save the rank status for " + com.Parameters[0] + ". " + ex.ToString());
- }
- finally
- {
- }
- newusers = true;
- }
- else
- {
- SendMessage(c, "[ERROR] Invalid rank. Rank numbers are numbered by the power of 2 (i.e. 1, 2, 4, 8, 16, etc.)");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Invalid rank. Rank numbers are numbered by the power of 2 (i.e. 1, 2, 4, 8, 16, etc.)");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 2 parameters.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Your current rank does not allow you to rank users.");
- }
- #endregion
- break;
- case "topic":
- #region Topic
- if (c.rank == Rank.Host)
- {
- ChatCommand c2 = new ChatCommand(cp.Data, 0);
- motd = c2.Parameters[0];
- SaveMOTD(motd);
- newmotd = true;
- }
- else
- {
- SendMessage(c, "[ERROR] Only the host can change the topic.");
- }
- #endregion
- break;
- case "users":
- #region Userlist
- if (users.Count > 0)
- {
- string people = "";
- foreach (DictionaryEntry c2 in users)
- {
- people += ((Client)c2.Value).name + ", ";
- }
- people = Split(people, 0, people.Length - 2);
- SendMessage(c, "User list: " + people);
- }
- else
- {
- SendMessage(c, "[INFO] There are no users currently connected.");
- }
- #endregion
- break;
- case "stalk":
- #region Getrank
- if (com.Parameters.Count == 1)
- {
- if (users.ContainsKey(com.Parameters[0]))
- {
- SendMessage(c, "[INFO] " + ((Client)(users[com.Parameters[0]])).name + "'s IP address is " + ((IPEndPoint)(((Client)(users[com.Parameters[0]])).sock.RemoteEndPoint)).Address.ToString() + ".");
- }
- else
- {
- SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
- }
- #endregion
- break;
- case "msg":
- #region Private message
- if (com.Parameters.Count > 1)
- {
- ChatCommand com2 = new ChatCommand(com.CommandString, 1);
- if (users.ContainsKey(com.Parameters[0]))
- {
- SendMessage((Client)(users[com.Parameters[0]]), "[MSG] " + c.name + ": " + com2.Parameters[0]);
- SendMessage(c, "[TO " + com.Parameters[0] + "]: " + com2.Parameters[0]);
- }
- else
- {
- SendMessage(c, "[ERROR] No user with the name \"" + com2.Parameters[0] + "\" exists.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 2 parameters.");
- }
- #endregion
- break;
- case "lolol":
- #region Lolol
- if ((byte)c.rank > 8)
- {
- if (lolz)
- {
- queue.Add("[INFO] LOL");
- queue.Add("[INFO] LOLOL");
- queue.Add("[INFO] LOLOLOL");
- queue.Add("[INFO] LOLOLOLOL");
- queue.Add("[INFO] LOLOLOLOLOL");
- queue.Add("[INFO] LOLOLOLOL");
- queue.Add("[INFO] LOLOLOL");
- queue.Add("[INFO] LOLOL");
- queue.Add("[INFO] LOL");
- queue.Add("[INFO] LOLOL");
- queue.Add("[INFO] LOLOLOL");
- queue.Add("[INFO] LOLOLOLOL");
- queue.Add("[INFO] LOLOLOLOLOL");
- queue.Add("[INFO] LOLOLOLOL");
- queue.Add("[INFO] LOLOLOL");
- queue.Add("[INFO] LOLOL");
- queue.Add("[INFO] LOL");
- queue.Add("[INFO] LOLOL");
- queue.Add("[INFO] LOLOLOL");
- queue.Add("[INFO] LOLOLOLOL");
- queue.Add("[INFO] LOLOLOLOLOL");
- queue.Add("[INFO] LOLOLOLOL");
- queue.Add("[INFO] LOLOLOL");
- queue.Add("[INFO] LOLOL");
- queue.Add("[INFO] LOL");
- lolz = false;
- }
- else
- {
- SendMessage(c, "[ERROR] No more lolz for you!");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Only the mods and hosts can lolol.");
- }
- #endregion
- break;
- case "help":
- #region Help
- if (com.Parameters.Count == 0)
- {
- SendMessage(c, help);
- }
- else
- {
- SendMessage(c, "[ERROR] The help command requires no parameters.");
- }
- break;
- default:
- SendMessage(c, "[ERROR] I dunno what that command is.");
- #endregion
- break;
- case "puppetzombie":
- #region Zombie message
- if ((byte)c.rank > (byte)Rank.VIP)
- {
- if (com.Parameters.Count > 1)
- {
- ChatCommand com2 = new ChatCommand(com.CommandString, 1);
- queue.Add(com.Parameters[0] + ": " + com2.Parameters[0]);
- }
- else
- {
- SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 2 parameters.");
- }
- }
- else
- {
- SendMessage(c, "[ERROR] Only mods and higher can do this.");
- }
- #endregion
- break;
- }
- }
- else
- {
- if (c.rank != Rank.Troll)
- {
- if (c.state == PenaltyState.None)
- {
- queue.Add(c.name + ": " + cp.Data);
- try
- {
- luaEngine.AddMessage(c.name, cp.Data);
- }
- catch (LuaException ex)
- {
- LuaMessage(ex.Message);
- }
- }
- }
- else
- {
- if (c.trolltimer > 0)
- {
- Random r = new Random();
- queue.Add(c.name + ": " + trollquotes[r.Next(0, trollquotes.Length)]);
- c.trolltimer--;
- }
- }
- }
- break;
- case ClientPacketType.Leaving:
- string tempn = c.name;
- DisconnectUser(c);
- users.Remove(c.name);
- newusers = true;
- invalid = true;
- if (users.Count > 0)
- {
- queue.Add(tempn + " left the server.");
- }
- else
- {
- Info(tempn + " left the server.");
- }
- break;
- default:
- break;
- }
- }
- else
- {
- invalid = true;
- }
- }
- }
- else
- {
- invalid = true;
- }
- ns.Close();
- }
- else
- {
- if (c.error || c.state == PenaltyState.Kicked || c.state == PenaltyState.Banned)
- {
- users.Remove(c.name);
- break;
- }
- }
- }
- }
- catch
- {
- c.error = true;
- }
- }
- }
- static void DisconnectUser(Client c)
- {
- try
- {
- c.sock.Send(new byte[0]);
- c.sock.Shutdown(SocketShutdown.Both);
- c.sock.Close();
- }
- catch
- {
- }
- finally
- {
- }
- }
- static void SendMessage(Client c, string message)
- {
- byte[] m = CreatePacket(ServerPacketType.ChatPost, message);
- c.sock.Send(m);
- }
- static byte[] CreatePacket(ServerPacketType type, string info)
- {
- byte[] a = new byte[] { (byte)type };
- byte[] b = Encoding.ASCII.GetBytes(info);
- byte[] c = info.Length > 0 ? a.Concat(b).ToArray() : a;
- byte[] d = BitConverter.GetBytes(c.Length);
- d = d.Concat(c).ToArray();
- return d;
- }
- static List<Ban> GetBanlist()
- {
- if (File.Exists("banned.txt"))
- {
- List<Ban> list = new List<Ban>();
- StreamReader sr = new StreamReader("banned.txt");
- string raw = sr.ReadToEnd();
- sr.Close();
- string[] sl = raw.Split('\n');
- foreach (string s in sl)
- {
- int ind = s.LastIndexOf("|");
- if (ind > -1)
- {
- string n = Split(s, 0, ind);
- IPAddress ip;
- string s2 = s.Replace("\r", "").Replace("\n", "");
- if (!IPAddress.TryParse(Split(s2, ind + 1, s2.Length), out ip))
- {
- continue;
- }
- else
- {
- Ban b = new Ban();
- b.UserName = n;
- b.IP = ip;
- list.Add(b);
- }
- }
- }
- return list;
- }
- else
- {
- return null;
- }
- }
- static List<UserSpec> GetUserSpeclist()
- {
- if (File.Exists("users.txt"))
- {
- List<UserSpec> list = new List<UserSpec>();
- StreamReader sr = new StreamReader("users.txt");
- string raw = sr.ReadToEnd();
- sr.Close();
- string[] sl = raw.Split('\n');
- foreach (string s in sl)
- {
- int ind = s.LastIndexOf("|");
- if (ind > -1)
- {
- byte rank;
- IPAddress ip;
- if (!IPAddress.TryParse(Split(s, 0, ind), out ip) || !Byte.TryParse(Split(s, ind + 1, s.Length), out rank))
- {
- continue;
- }
- else
- {
- UserSpec b = new UserSpec();
- if (rank > 0 && rank < 33)
- {
- b.r = (Rank)rank;
- }
- else
- {
- b.r = (Rank)4;
- }
- b.IP = ip;
- list.Add(b);
- }
- }
- }
- return list;
- }
- else
- {
- return null;
- }
- }
- static string GetMOTD()
- {
- if (File.Exists("motd.txt"))
- {
- try
- {
- StreamReader sr = new StreamReader("motd.txt");
- string t = sr.ReadToEnd();
- sr.Close();
- return t;
- }
- catch
- {
- return "No Topic";
- }
- }
- else
- {
- return "No Topic";
- }
- }
- static bool SaveMOTD(string str)
- {
- try
- {
- StreamWriter sr = new StreamWriter("motd.txt");
- sr.Write(str);
- sr.Close();
- return true;
- }
- catch
- {
- return false;
- }
- }
- static string GetRankSymbol(Rank rank)
- {
- switch (rank)
- {
- case Rank.Troll:
- return "#";
- case Rank.Noob:
- return "?";
- case Rank.User:
- return "";
- case Rank.VIP:
- return "+";
- case Rank.Mod:
- return "$";
- case Rank.Host:
- return "@";
- default:
- return "";
- }
- }
- public static string Split(string parent, int start, int end)
- {
- return parent.Substring(start, end - start);
- }
- //Lua functions
- public static int GetUserCount()
- {
- return users.Count;
- }
- public static string GetRank(string name)
- {
- if (users.ContainsKey(name))
- {
- return ((Client)users[name]).rank.ToString();
- }
- else
- {
- return "Invalid";
- }
- }
- public static void SetTopic(string topic)
- {
- motd = topic;
- newmotd = true;
- }
- public static string GetTopic()
- {
- return motd;
- }
- public static bool Kick(string user)
- {
- if (users.ContainsKey(user))
- {
- ((Client)(users[user])).state = PenaltyState.Kicked;
- try
- {
- byte[] kickmsg = CreatePacket(ServerPacketType.Kicked, "");
- ((Client)(users[user])).sock.Send(kickmsg);
- DisconnectUser(((Client)(users[user])));
- users.Remove(user);
- newusers = true;
- queue.Add("[INFO] " + user + " has been kicked from the server.");
- return true;
- }
- catch
- {
- ((Client)(users[user])).error = true;
- return false;
- }
- }
- else
- {
- return false;
- }
- }
- public static bool Ban(string user)
- {
- #region Ban
- if (users.ContainsKey(user))
- {
- ((Client)(users[user])).state = PenaltyState.Banned;
- try
- {
- byte[] kickmsg = CreatePacket(ServerPacketType.Banned, "");
- ((Client)(users[user])).sock.Send(kickmsg);
- Ban b = new Ban();
- b.UserName = user;
- b.IP = ((IPEndPoint)(((Client)(users[user])).sock.RemoteEndPoint)).Address;
- DisconnectUser(((Client)(users[user])));
- try
- {
- List<Ban> current = GetBanlist();
- StreamWriter writer = new StreamWriter("banned.txt");
- if (current != null)
- {
- foreach (Ban ban in current)
- {
- writer.WriteLine(ban.UserName + "|" + ban.IP.ToString());
- }
- }
- writer.WriteLine(b.UserName + "|" + b.IP.ToString());
- writer.Close();
- queue.Add("[INFO] " + user + "has been banned from the server.");
- users.Remove(user);
- newusers = true;
- return true;
- }
- catch
- {
- Error("A problem occured when trying to log a ban issued for " + user + ". The targeted user may still be able to reconnect.");
- return false;
- }
- }
- catch
- {
- ((Client)(users[user])).error = true;
- return false;
- }
- }
- else
- {
- return false;
- }
- #endregion
- }
- public static bool UserExists(string name)
- {
- return (users.ContainsKey(name));
- }
- public static void PostMessage(string msg)
- {
- queue.Add(msg);
- }
- public static void PostConsoleMessage(string msg)
- {
- Console.WriteLine("[LUA] " + msg);
- }
- public static void Sleep(int time)
- {
- Thread.Sleep(time);
- }
- }
- public enum Rank
- {
- Troll = 1,
- Noob = 2,
- User = 4,
- VIP = 8,
- Mod = 16,
- Host = 32
- }
- public enum ServerPacketType : byte
- {
- ChatPost = 0,
- Accepted = 1,
- Rejected = 2,
- Kicked = 3,
- Banned = 4,
- Shutdown = 5,
- MOTD = 6,
- UserList = 7,
- Muted = 8,
- Unmuted = 9,
- RequestPassword = 10,
- RequestUsername = 11
- }
- public enum ClientPacketType : byte
- {
- ChatPost = 0,
- Username = 1,
- Password = 2,
- Leaving = 3
- }
- public enum PenaltyState
- {
- None = 0,
- Muted = 1,
- Kicked = 2,
- Banned = 3
- }
- public class Client
- {
- public Socket sock;
- public PenaltyState state = PenaltyState.None;
- public bool error = false;
- public string name;
- public Rank rank;
- public int trolltimer = 3;
- }
- public class Ban
- {
- public string UserName;
- public IPAddress IP;
- }
- public class UserSpec
- {
- public IPAddress IP;
- public Rank r;
- }
- public class ChatCommand
- {
- string cmd;
- string name;
- List<string> pmts;
- public bool Invalid = false;
- public ChatCommand(string command)
- {
- if (!command.StartsWith("/"))
- {
- Invalid = true;
- }
- else
- {
- cmd = command;
- List<string> pts = command.Split(' ').ToList();
- name = pts[0].Substring(1);
- pts.RemoveAt(0);
- pmts = pts;
- }
- }
- public ChatCommand(string command, int combineStart)
- {
- if (!command.StartsWith("/"))
- {
- Invalid = true;
- }
- else
- {
- cmd = command;
- List<string> pts = command.Split(' ').ToList();
- name = pts[0].Substring(1);
- pts.RemoveAt(0);
- string last = "";
- for (int i = pts.Count - 1; i >= combineStart; i--)
- {
- last = pts[i] + " " + last;
- }
- last = last.Substring(0, last.Length - 1);
- pts.Clear();
- pts.Add(last);
- pmts = pts;
- }
- }
- public List<string> Parameters
- {
- get { return pmts; }
- }
- public string CommandName
- {
- get { return name; }
- }
- public string CommandString
- {
- get { return cmd; }
- }
- }
- public class ServerCommand
- {
- string cmd;
- string name;
- List<string> pmts;
- public ServerCommand(string command)
- {
- cmd = command;
- List<string> pts = command.Split(' ').ToList();
- name = pts[0];
- pts.RemoveAt(0);
- pmts = pts;
- }
- public ServerCommand(string command, int combineStart)
- {
- cmd = command;
- List<string> pts = command.Split(' ').ToList();
- name = pts[0];
- pts.RemoveAt(0);
- string last = "";
- for (int i = pts.Count - 1; i >= combineStart; i--)
- {
- last = pts[i] + " " + last;
- }
- last = last.Substring(0, last.Length - 1);
- pts.Clear();
- pts.Add(last);
- pmts = pts;
- }
- public List<string> Parameters
- {
- get { return pmts; }
- }
- public string CommandName
- {
- get { return name; }
- }
- public string CommandString
- {
- get { return cmd; }
- }
- }
- public class ClientPacket
- {
- static int ln = 0;
- static ClientPacketType type = ClientPacketType.Leaving;
- static string data = "";
- public static ClientPacket Parse(byte[] buffer)
- {
- if (buffer.Length > 4)
- {
- MemoryStream ms = new MemoryStream(buffer);
- byte[] a = new byte[4];
- ms.Read(a, 0, 4);
- ln = BitConverter.ToInt32(a, 0);
- byte[] b = new byte[1];
- ms.Read(b, 0, 1);
- byte bb = b[0];
- if (bb < 4)
- {
- type = (ClientPacketType)bb;
- }
- else
- {
- return null;
- }
- if (buffer.Length > 5)
- {
- byte[] c = new byte[buffer.Length - 5];
- ms.Read(c, 0, c.Length);
- data = Encoding.ASCII.GetString(c);
- }
- ClientPacket packet = new ClientPacket();
- packet.Length = ln;
- packet.PacketType = type;
- packet.Data = data;
- return packet;
- }
- else
- {
- return null;
- }
- }
- public int Length
- {
- get { return ln; }
- set { ln = value; }
- }
- public ClientPacketType PacketType
- {
- get { return type; }
- set { type = value; }
- }
- public string Data
- {
- get { return data; }
- set { data = value; }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement