Advertisement
Guest User

Untitled

a guest
Jul 8th, 2017
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 107.97 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections;
  4. using System.Linq;
  5. using System.Text;
  6. using System.IO;
  7. using System.Net;
  8. using System.Net.Sockets;
  9. using System.Threading;
  10. using LuaInterface;
  11.  
  12. namespace WhisperServer
  13. {
  14.     public static class Program
  15.     {
  16.         static Socket sv = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  17.         static IPEndPoint ep = new IPEndPoint(IPAddress.Any, 9647);        
  18.         static Hashtable users = new Hashtable();
  19.         static List<string> queue = new List<string>();
  20.         static string motd = "";
  21.         static bool newmotd = false;
  22.         static bool closing = false;
  23.         static bool newusers = false;
  24.         static Thread lst;
  25.         static Thread msg;
  26.         static LuaEngine luaEngine = new LuaEngine();
  27.         #region Troll quotes
  28.         static string[] trollquotes = new string[] { "I'm a troll and I cannot post my own messages!",
  29.             "I am gay!", "I love everyone!",
  30.             "I deserve what I got, no doubt about it!",
  31.             "I love being punished!",
  32.             "Ban me!",
  33.             "Kick me!",
  34.             "I feel that I'm better off restricted from normal user privaleges!",
  35.             "I love being denied freedom of speech! I owe you one!",
  36.             "My righteous ranker deserves a medal!",
  37.             "I made a wrong choice. I'm glad I was restrained.",
  38.             "I wish to express my utter remorse for my actions!",
  39.             "I am a fat kid with no life!",
  40.             "My IQ is smaller than my dick, and that's BEYOND microscopic!",
  41.             "I love Justin Bieber!",
  42.             "I don't deserve internet!" };
  43.         #endregion
  44.         #region Help text
  45.         static string help =
  46. "======COMMAND LIST======\n" +
  47. "/me: Posts a third-person message. - Noob and higher - Syntax: /me <message>\n" +
  48. "/users: Retrieves a complete list of all connected users. - All ranks - No parameters\n" +
  49. "/msg: Sends a private message to a use. - All ranks - Syntax: /msg <username> <message>\n" +
  50. "/getrank: Gets the rank title of a specified user. - All ranks - Syntax: /getrank <username>\n" +
  51. "/stalk: Gets the IP address of a specified user. - All ranks - Syntax: /stalk <username>\n" +
  52. "/mute: Prevents a user from posting messages. - Mod and higher - Syntax: /mute <username>\n" +
  53. "/unmute: Enables a muted user to speak again. - Mod and higher - Syntax: /unmute <username>\n" +
  54. "/kick: Forcibly ejects a user from the server. - VIP and higher - Syntax: /kick <username>\n" +
  55. "/ban: Kicks a user and prevents them from coming back. - Mod and higher - Syntax: /ban <username>\n" +
  56. "/unban: Enables a banned user to join the server once more. - Mod and higher - Syntax: /unban <username>\n" +
  57. "/topic: Sets the server topic. - Host only - Syntax: /topic <message>\n" +
  58. "There are also a few secret commands that you must find yourself. ;)";
  59.         #endregion
  60.         static void Main(string[] args)
  61.         {
  62.             Console.Title = "Whisper Dedicated Server v1.6 Alpha";
  63.             Info("Please note: In order to accept non-LAN connections, you will need to forward TCP port 9647 on your router.");
  64.             Info("Starting server.");
  65.             sv.Bind(ep);
  66.             sv.Listen(5);
  67.             lst = new Thread(new ThreadStart(Listener));
  68.             lst.Start();
  69.             msg = new Thread(new ThreadStart(MsgHandler));
  70.             msg.Start();
  71.             motd = GetMOTD();
  72.             Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress);
  73.             if (File.Exists("init.lua"))
  74.             {
  75.                 Info("Starting init.lua.");
  76.                 Thread luaThread = new Thread(new ThreadStart(LuaThread));
  77.                 luaThread.Start();                
  78.             }
  79.             Info("Ready!");            
  80.             while (true)
  81.             {
  82.                 string cm = Console.ReadLine();
  83.                 if (cm == "")
  84.                 {
  85.                     continue;
  86.                 }
  87.                 ServerCommand com = new ServerCommand(cm);                
  88.                     switch (com.CommandName.ToLower())
  89.                     {
  90.                         case "stop":
  91.                             closing = true;
  92.                             break;
  93.                         case "say":
  94.                             ServerCommand c2 = new ServerCommand(com.CommandString, 0);
  95.                             queue.Add("[SERVER] " + c2.Parameters[0]);
  96.                             break;
  97.                         case "topic":
  98.                             #region Topic
  99.                             ServerCommand c3 = new ServerCommand(com.CommandString, 0);
  100.                             motd = c3.Parameters[0];
  101.                             SaveMOTD(motd);
  102.                             newmotd = true;
  103.                             #endregion
  104.                             break;
  105.                         case "users":
  106.                             #region Userlist
  107.                             if (users.Count > 0)
  108.                             {
  109.                                 string people = "";
  110.                                 foreach (DictionaryEntry c in users)
  111.                                 {
  112.                                     people += ((Client)c.Value).name + ", ";
  113.                                 }
  114.                                 people = Split(people, 0, people.Length - 2);
  115.                                 Info("User list: " + people);
  116.                             }
  117.                             else
  118.                             {
  119.                                 Info("There are no users currently connected.");
  120.                             }
  121.                             #endregion
  122.                             break;
  123.                         case "clear":
  124.                             Console.Clear();
  125.                             Info("Console cleared.");
  126.                             break;
  127.                         case "kick":
  128.                             #region Kick
  129.                                 if (com.Parameters.Count == 1)
  130.                                 {
  131.                                     if (users.ContainsKey(com.Parameters[0]))
  132.                                     {
  133.                                        
  134.                                             ((Client)(users[com.Parameters[0]])).state = PenaltyState.Kicked;
  135.                                             try
  136.                                             {
  137.                                                 byte[] kickmsg = CreatePacket(ServerPacketType.Kicked, "");
  138.                                                 ((Client)(users[com.Parameters[0]])).sock.Send(kickmsg);
  139.                                                 DisconnectUser(((Client)(users[com.Parameters[0]])));
  140.                                                 users.Remove(com.Parameters[0]);                                                
  141.                                                 newusers = true;
  142.                                                 queue.Add("[INFO] The console has kicked " + com.Parameters[0] + " from the server.");
  143.                                             }
  144.                                             catch
  145.                                             {
  146.                                                 ((Client)(users[com.Parameters[0]])).error = true;
  147.                                             }
  148.                                        
  149.                                     }
  150.                                     else
  151.                                     {
  152.                                         Error("No user with the name \"" + com.Parameters[0] + "\" exists.");
  153.                                     }
  154.                                 }
  155.                                 else
  156.                                 {
  157.                                     Error("Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  158.                                 }                            
  159.                             #endregion
  160.                             break;
  161.                         case "ban":
  162.                             #region Ban
  163.                                 if (com.Parameters.Count == 1)
  164.                                 {
  165.                                     if (users.ContainsKey(com.Parameters[0]))
  166.                                     {                                        
  167.                                             ((Client)(users[com.Parameters[0]])).state = PenaltyState.Banned;
  168.                                             try
  169.                                             {
  170.                                                 byte[] kickmsg = CreatePacket(ServerPacketType.Banned, "");
  171.                                                 ((Client)(users[com.Parameters[0]])).sock.Send(kickmsg);
  172.                                                 Ban b = new Ban();
  173.                                                 b.UserName = com.Parameters[0];
  174.                                                 b.IP = ((IPEndPoint)(((Client)(users[com.Parameters[0]])).sock.RemoteEndPoint)).Address;
  175.                                                 DisconnectUser(((Client)(users[com.Parameters[0]])));
  176.                                                 try
  177.                                                 {
  178.                                                     List<Ban> current = GetBanlist();
  179.                                                     StreamWriter writer = new StreamWriter("banned.txt");
  180.                                                     if (current != null)
  181.                                                     {
  182.                                                         foreach (Ban ban in current)
  183.                                                         {
  184.                                                             writer.WriteLine(ban.UserName + "|" + ban.IP.ToString());
  185.                                                         }
  186.                                                     }
  187.                                                     writer.WriteLine(b.UserName + "|" + b.IP.ToString());
  188.                                                     writer.Close();
  189.                                                     queue.Add("[INFO] The console has banned " + com.Parameters[0] + " from the server.");
  190.                                                     users.Remove(com.Parameters[0]);
  191.                                                     newusers = true;
  192.                                                 }
  193.                                                 catch
  194.                                                 {                                                    
  195.                                                     Error("A problem occured when trying to log a ban issued for " + com.Parameters[0] + ". The targeted user may still be able to reconnect.");
  196.                                                 }
  197.                                             }
  198.                                             catch
  199.                                             {
  200.                                                 ((Client)(users[com.Parameters[0]])).error = true;
  201.                                             }                                      
  202.                                     }
  203.                                     else
  204.                                     {
  205.                                         Error("No user with the name \"" + com.Parameters[0] + "\" exists.");
  206.                                     }
  207.                                 }
  208.                                 else
  209.                                 {
  210.                                     Error("Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  211.                                 }                            
  212.                             #endregion
  213.                             break;
  214.                         case "unban":
  215.                             #region Unban
  216.                                 if (com.Parameters.Count == 1)
  217.                                 {
  218.                                     try
  219.                                     {
  220.                                         List<Ban> current = GetBanlist();
  221.                                         List<string> names = new List<string>();
  222.                                         int ind = 0;
  223.                                         if (current != null)
  224.                                         {
  225.                                             for (int i = 0; i < current.Count; i++)
  226.                                             {
  227.                                                 if (current[i].UserName == com.Parameters[0])
  228.                                                 {
  229.                                                     ind = i;
  230.                                                 }
  231.                                                 names.Add(current[i].UserName);
  232.                                             }
  233.                                             if (names.Contains(com.Parameters[0]))
  234.                                             {
  235.                                                 current.RemoveAt(ind);
  236.                                                 StreamWriter writer = new StreamWriter("banned.txt");
  237.                                                 foreach (Ban b in current)
  238.                                                 {
  239.                                                     writer.WriteLine(b.UserName + "|" + b.IP.ToString());
  240.                                                 }
  241.                                                 writer.Close();
  242.                                                 queue.Add("[INFO] The console has unbanned " + com.Parameters[0] + ".");
  243.                                             }
  244.                                             else
  245.                                             {
  246.                                                 Error("There is no banned user named " + com.Parameters[0] + ".");
  247.                                             }
  248.                                         }
  249.                                         else
  250.                                         {
  251.                                             Error("There is no existing ban list.");
  252.                                         }
  253.  
  254.                                     }
  255.                                     catch
  256.                                     {                                        
  257.                                         Error("A problem occured when trying to remove a ban issued to" + com.Parameters[0] + ". The targeted user may still be banned.");
  258.                                     }
  259.                                 }
  260.                                 else
  261.                                 {
  262.                                     Error("Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  263.                                 }
  264.                            
  265.                             #endregion
  266.                             break;
  267.                         case "rank":
  268.                             #region Rank
  269.                                 if (com.Parameters.Count == 2)
  270.                                 {
  271.                                     if (users.ContainsKey(com.Parameters[0]))
  272.                                     {
  273.                                             byte r;
  274.                                             if (Byte.TryParse(com.Parameters[1], out r))
  275.                                             {
  276.                                                 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)
  277.                                                 {
  278.                                                     ((Client)(users[com.Parameters[0]])).rank = (Rank)r;
  279.                                                     queue.Add("[INFO] The console has ranked " + com.Parameters[0] + " as a " + ((Client)(users[com.Parameters[0]])).rank.ToString() + ".");
  280.                                                     if (((Client)(users[com.Parameters[0]])).rank == Rank.Troll)
  281.                                                     {
  282.                                                         ((Client)(users[com.Parameters[0]])).trolltimer = 3;
  283.                                                     }
  284.                                                     newusers = true;
  285.                                                     List<UserSpec> current = GetUserSpeclist();
  286.                                                     List<string> ips = new List<string>();                                                    
  287.                                                     int ind = -1;
  288.                                                     if (current != null)
  289.                                                     {
  290.                                                         for (int i = 0; i < current.Count; i++)
  291.                                                         {
  292.                                                             if (current[i].IP.ToString() == ((IPEndPoint)(((Client)(users[com.Parameters[0]])).sock.RemoteEndPoint)).Address.ToString())
  293.                                                             {
  294.                                                                 ind = i;
  295.                                                             }
  296.                                                             ips.Add(current[i].IP.ToString());
  297.                                                         }                                                        
  298.                                                     }
  299.                                                     if (current != null && ind > -1)
  300.                                                     {
  301.                                                         current[ind].r = ((Client)(users[com.Parameters[0]])).rank;
  302.                                                     }
  303.                                                     else
  304.                                                     {
  305.                                                         UserSpec tmp = new UserSpec();
  306.                                                         tmp.IP = ((IPEndPoint)(((Client)(users[com.Parameters[0]])).sock.RemoteEndPoint)).Address;
  307.                                                         tmp.r = ((Client)(users[com.Parameters[0]])).rank;
  308.                                                         if (current == null)
  309.                                                         {
  310.                                                             current = new List<UserSpec>();
  311.                                                         }
  312.                                                         current.Add(tmp);
  313.                                                     }
  314.                                                     try
  315.                                                     {
  316.                                                         StreamWriter writer = new StreamWriter("users.txt");                                                        
  317.                                                             foreach (UserSpec spec in current)
  318.                                                             {
  319.                                                                 writer.WriteLine(spec.IP.ToString() + "|" + ((byte)spec.r).ToString());
  320.                                                             }                                                        
  321.                                                         writer.Close();
  322.                                                     }
  323.                                                     catch (Exception ex)
  324.                                                     {                                                        
  325.                                                         Error("A problem occured when trying to save the rank status for " + com.Parameters[0] + ". " + ex.ToString());
  326.                                                     }
  327.                                                     finally
  328.                                                     {
  329.                                                     }
  330.                                                     newusers = true;
  331.                                                 }
  332.                                                 else
  333.                                                 {
  334.                                                     Error("Invalid rank. Rank numbers are numbered by the power of 2 (i.e. 1, 2, 4, 8, 16, etc.)");
  335.                                                 }
  336.                                             }
  337.                                             else
  338.                                             {
  339.                                                 Error("Invalid rank. Rank numbers are numbered by the power of 2 (i.e. 1, 2, 4, 8, 16, etc.)");
  340.                                             }                                        
  341.  
  342.                                     }
  343.                                     else
  344.                                     {
  345.                                         Error("No user with the name \"" + com.Parameters[0] + "\" exists.");
  346.                                     }
  347.                                 }
  348.                                 else
  349.                                 {
  350.                                     Error("Invalid parameter count '" + com.Parameters.Count + "'. This command takes 2 parameters.");
  351.                                 }                            
  352.                             #endregion
  353.                             break;
  354.                         case "mute":
  355.                             #region Mute
  356.                                 if (com.Parameters.Count == 1)
  357.                                 {
  358.                                     if (users.ContainsKey(com.Parameters[0]))
  359.                                     {
  360.                                         if ((byte)((Client)(users[com.Parameters[0]])).rank < (byte)Rank.VIP)
  361.                                         {
  362.                                             ((Client)(users[com.Parameters[0]])).state = PenaltyState.Muted;
  363.                                             queue.Add("[INFO] The console has muted " + com.Parameters[0] + ".");
  364.                                         }
  365.                                         else
  366.                                         {
  367.                                             Error("You may not mute moderators or the host.");
  368.                                         }
  369.  
  370.                                     }
  371.                                     else
  372.                                     {
  373.                                         Error("No user with the name \"" + com.Parameters[0] + "\" exists.");
  374.                                     }
  375.                                 }
  376.                                 else
  377.                                 {
  378.                                     Error("Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  379.                                 }                            
  380.                             #endregion
  381.                             break;
  382.                         case "unmute":
  383.                             #region Unmute
  384.                                 if (com.Parameters.Count == 1)
  385.                                 {
  386.                                     if (users.ContainsKey(com.Parameters[0]))
  387.                                     {
  388.                                         if ((byte)((Client)(users[com.Parameters[0]])).rank < (byte)Rank.VIP)
  389.                                         {
  390.                                             ((Client)(users[com.Parameters[0]])).state = PenaltyState.None;
  391.                                             queue.Add("[INFO] The console has unmuted " + com.Parameters[0] + ".");
  392.                                         }
  393.                                         else
  394.                                         {
  395.                                             Error("Moderators and the host cannot be muted anyway, so what are you playing at?!");
  396.                                         }
  397.                                     }
  398.                                     else
  399.                                     {
  400.                                         Error("No user with the name \"" + com.Parameters[0] + "\" exists.");
  401.                                     }
  402.                                 }
  403.                                 else
  404.                                 {
  405.                                     Error("Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  406.                                 }                            
  407.                             #endregion
  408.                             break;
  409.                         case "msg":
  410.                             #region Private message
  411.                             if (com.Parameters.Count > 1)
  412.                             {                                
  413.                                 if (users.ContainsKey(com.Parameters[0]))
  414.                                 {
  415.                                     ServerCommand com2 = new ServerCommand(com.CommandString, 1);
  416.                                     SendMessage((Client)(users[com.Parameters[0]]), "[MSG] " + "Server Console: " + com2.Parameters[0]);
  417.                                     Console.WriteLine("[TO " + com.Parameters[0] + "]: " + com2.Parameters[0]);
  418.                                 }
  419.                                 else
  420.                                 {
  421.                                     Error("No user with the name \"" + com.Parameters[0] + "\" exists.");
  422.                                 }
  423.                             }
  424.                             else
  425.                             {
  426.                                 Error("Invalid parameter count '" + com.Parameters.Count + "'. This command takes 2 parameters.");
  427.                             }
  428.                             #endregion
  429.                             break;
  430.                         default:
  431.                             Error("Invalid command.");
  432.                             break;
  433.                     }
  434.                
  435.             }
  436.         }
  437.  
  438.         static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
  439.         {
  440.             Warning("Ctrl+C is blocked in this application to prevent crashing.");
  441.             Thread.Sleep(1000);
  442.             e.Cancel = true;
  443.         }
  444.          
  445.         static void Info(string message)
  446.         {
  447.             Console.WriteLine("[INFO] " + message);
  448.         }
  449.         static void Error(string message)
  450.         {
  451.             Console.WriteLine("[ERROR] " + message);
  452.         }
  453.         static void Warning(string message)
  454.         {
  455.             Console.WriteLine("[WARNING] " + message);
  456.         }
  457.         static void Chat(string message)
  458.         {
  459.             Console.WriteLine("[CHAT] " + message);
  460.         }
  461.         static void LuaMessage(string message)
  462.         {
  463.             Console.WriteLine("[LUA] " + message);
  464.         }
  465.         static void Listener()
  466.         {
  467.             while (true)
  468.             {
  469.                 if (sv.Poll(-1, SelectMode.SelectRead))
  470.                 {
  471.                     Thread a = new Thread(new ParameterizedThreadStart(Accepter));
  472.                     a.Start(sv.Accept());
  473.                 }
  474.             }
  475.         }
  476.         static void LuaThread()
  477.         {
  478.             try
  479.             {
  480.                 luaEngine.Engine.DoFile("init.lua");
  481.             }
  482.             catch (LuaException ex)
  483.             {
  484.                 LuaMessage(ex.Message);
  485.             }
  486.         }
  487.         static void MsgHandler()
  488.         {
  489.             while (true)
  490.             {
  491.                 while (!closing && queue.Count == 0 && !newusers && !newmotd)
  492.                 {
  493.                     Thread.Sleep(1);
  494.                 }
  495.                 if (closing)
  496.                 {
  497.                     Info("Shutting down server.");
  498.                     try
  499.                     {
  500.                         if (users.Count > 0)
  501.                         {
  502.                             foreach (DictionaryEntry c in users)
  503.                             {
  504.                                 try
  505.                                 {
  506.                                     ((Client)c.Value).sock.Send(CreatePacket(ServerPacketType.Shutdown, ""));
  507.                                     DisconnectUser(((Client)c.Value));
  508.                                 }
  509.                                 catch
  510.                                 {
  511.                                     Error("Couldn't disconnect user " + ((Client)c.Value).name + ".");
  512.                                 }
  513.                                 finally
  514.                                 {
  515.                                 }
  516.                             }
  517.                             users.Clear();
  518.                             Thread.Sleep(1000);
  519.                         }
  520.                     }
  521.                     catch
  522.                     {
  523.                         Error("A problem occured when trying to disconnect all users. The affected may receive a \"Lost connection\" error because of this.");
  524.                         Console.WriteLine("Press any key to exit.");
  525.                         Console.ReadKey();
  526.                     }
  527.                     finally
  528.                     {
  529.                     }
  530.                     Environment.Exit(0);
  531.                 }
  532.                 if (queue.Count > 0)
  533.                 {
  534.                     Hashtable u2 = users;
  535.                     try
  536.                     {
  537.                         foreach (DictionaryEntry c in users)
  538.                         {
  539.                             try
  540.                             {
  541.                                 foreach (string s in queue)
  542.                                 {
  543.                                     ((Client)c.Value).sock.Send(CreatePacket(ServerPacketType.ChatPost, s.TrimEnd()));
  544.                                 }
  545.                             }
  546.                             catch (Exception e)
  547.                             {
  548.                                 Error("Server error occured with user " + ((Client)c.Value).name + ". " + e.Message);
  549.                                 Info("Disconnecting user " + ((Client)c.Value).name + " from server.");
  550.                                 queue.Add("[INFO] " + ((Client)c.Value).name + " has been disconnected due to an internal server error.");
  551.                                 DisconnectUser(((Client)c.Value));
  552.                                 u2.Remove(((Client)c.Value).name);
  553.                                 newusers = true;
  554.                             }
  555.                             finally                            {
  556.                                
  557.                             }
  558.                         }
  559.                     }
  560.                     catch
  561.                     {                        
  562.                     }
  563.                     finally
  564.                     {
  565.                     }                    
  566.                     foreach (string s in queue)
  567.                     {                        
  568.                         Chat(s);
  569.                     }
  570.                     queue.Clear();
  571.                     users = u2;
  572.                 }
  573.                 if (newusers)
  574.                 {
  575.                     Hashtable u2 = users;
  576.                     newusers = false;
  577.                     string temp = "";
  578.                     if (users.Count > 0)
  579.                     {
  580.                         foreach (DictionaryEntry c in users)
  581.                         {
  582.                             temp += GetRankSymbol(((Client)c.Value).rank) + ((Client)c.Value).name;
  583.                             temp += " ";
  584.                         }
  585.                         temp = Split(temp, 0, temp.Length - 1);
  586.                     }
  587.                     byte[] u = CreatePacket(ServerPacketType.UserList, temp);
  588.                     foreach (DictionaryEntry c in users)
  589.                     {
  590.                         try
  591.                         {
  592.                             ((Client)c.Value).sock.Send(u);
  593.                         }
  594.                         catch (Exception e)
  595.                         {
  596.                             Error("Server error occured with user " + ((Client)c.Value).name + ". " + e.Message);
  597.                             Info("Disconnecting user " + ((Client)c.Value).name + " from server.");
  598.                             queue.Add("[INFO] " + ((Client)c.Value).name + " has been disconnected due to an internal server error.");
  599.                             DisconnectUser(((Client)c.Value));
  600.                             u2.Remove(((Client)c.Value).name);
  601.                             newusers = true;
  602.                         }
  603.                         finally
  604.                         {                            
  605.                         }
  606.                     }
  607.                     users = u2;
  608.                 }
  609.                 if (newmotd)
  610.                 {
  611.                     Hashtable u2 = users;
  612.                     newmotd = false;                    
  613.                         foreach (DictionaryEntry c in users)
  614.                         {
  615.                             try
  616.                             {
  617.                                 byte[] m = CreatePacket(ServerPacketType.MOTD, motd);
  618.                                 ((Client)c.Value).sock.Send(m);
  619.                             }
  620.                             catch (Exception e)
  621.                             {
  622.                                 Error("Server error occured with user " + ((Client)c.Value).name + ". " + e.Message);
  623.                                 Info("Disconnecting user " + ((Client)c.Value).name + " from server.");
  624.                                 queue.Add("[INFO] " + ((Client)c.Value).name + " has been disconnected due to an internal server error.");
  625.                                 DisconnectUser(((Client)c.Value));
  626.                                 u2.Remove(((Client)c.Value).name);
  627.                                 newusers = true;
  628.                             }
  629.                             finally
  630.                             {
  631.                                
  632.                             }
  633.                         }
  634.                         users = u2;
  635.                     Info("The topic has been changed to \"" + motd + "\".");
  636.                 }
  637.  
  638.             }
  639.         }
  640.         static void Accepter(object socket)
  641.         {
  642.             Socket sock = (Socket)socket;
  643.             Client c = new Client();
  644.             IPAddress sockip = ((IPEndPoint)sock.RemoteEndPoint).Address;
  645.             string error = "";
  646.             try
  647.             {
  648.                 bool invalid = false;                
  649.                 byte[] req1 = CreatePacket(ServerPacketType.RequestUsername, " ");
  650.                 sock.Send(req1);
  651.                 if (sock.Poll(5000000, SelectMode.SelectRead))
  652.                 {
  653.                         if (sock.Available > 0)
  654.                         {
  655.                             int len = 0;
  656.                             byte[] data = new byte[sock.Available];
  657.                             sock.Receive(data);
  658.                             MemoryStream ns = new MemoryStream(data);
  659.                             if (ns.Length > 4)
  660.                             {
  661.                                 while (ns.Position < ns.Length)
  662.                                 {                                    
  663.                                     byte[] l = new byte[4];
  664.                                     ns.Read(l, 0, 4);
  665.                                     len = BitConverter.ToInt32(l, 0);
  666.                                     byte[] dat = new byte[len + 4];
  667.                                     ns.Position -= 4;
  668.                                     ns.Read(dat, 0, len + 4);
  669.                                     ClientPacket cp = ClientPacket.Parse(dat);
  670.                                     if (cp != null)
  671.                                     {
  672.                                         if (cp.PacketType == ClientPacketType.Username)
  673.                                         {
  674.                                             if (cp.Data.Length > 0)
  675.                                             {
  676.                                                 c.name = cp.Data;
  677.                                             }
  678.                                             else
  679.                                             {
  680.                                                 invalid = true;
  681.                                                 error = "Empty username";
  682.                                             }
  683.                                         }
  684.                                         else
  685.                                         {
  686.                                             invalid = true;
  687.                                             error = "Wrong packet signature: " + cp.PacketType.ToString();
  688.                                         }
  689.                                     }
  690.                                     else
  691.                                     {
  692.                                         invalid = true;
  693.                                         error = "Corrupt packet";
  694.                                     }
  695.                                 }
  696.                         }
  697.                         else
  698.                         {
  699.                             invalid = true;
  700.                             error = "Corrupt packet";
  701.                         }
  702.                         ns.Close();
  703.                     }
  704.                     else
  705.                     {
  706.                         invalid = true;
  707.                         error = "No data available";
  708.                     }
  709.                     // Check if this user is banned?
  710.                     if (!invalid)
  711.                     {
  712.                         List<Ban> banlist = GetBanlist();
  713.                         if (banlist != null)
  714.                         {
  715.                             foreach (Ban b in banlist)
  716.                             {
  717.                                 if (sockip.ToString() == b.IP.ToString() || c.name == b.UserName)
  718.                                 {
  719.                                     // The 6 lines of code sure to piss anybody off                                    
  720.                                     byte[] rejban = CreatePacket(ServerPacketType.Rejected, "[ERROR] Rejected: You are banned from this server!");
  721.                                     sock.Send(rejban);                                    
  722.                                     invalid = true;
  723.                                     error = "Banned user";
  724.                                     break;
  725.                                 }
  726.                             }
  727.                         }
  728.                     }
  729.                     //Check user rank
  730.                     if (!invalid)
  731.                     {
  732.                         List<UserSpec> userlist = GetUserSpeclist();
  733.                         if (userlist != null)
  734.                         {
  735.                             foreach (UserSpec spec in userlist)
  736.                             {
  737.                                 if (sockip.ToString() == spec.IP.ToString())
  738.                                 {
  739.                                     c.rank = spec.r;
  740.                                     break;
  741.                                 }
  742.                             }
  743.                         }                        
  744.                         c.sock = sock;
  745.                         if (sockip.ToString() == "127.0.0.1" || sockip.ToString() == "192.168.1.1")
  746.                         {
  747.                             c.rank = Rank.Host;
  748.                         }
  749.                         string nn = c.name;
  750.                         while (users.ContainsKey(nn))
  751.                         {
  752.                             nn += "_";
  753.                         }
  754.                         c.name = nn;
  755.                         c.sock.Send(CreatePacket(ServerPacketType.Accepted, ""));                        
  756.                         users.Add(c.name, c);
  757.                         newusers = true;
  758.                         Thread ct = new Thread(new ParameterizedThreadStart(ClientThread));
  759.                         ct.Start(c);
  760.                         c.sock.Send(CreatePacket(ServerPacketType.MOTD, motd));
  761.                         queue.Add("[INFO] " + c.name + " has joined the server.");
  762.                     }
  763.                 }
  764.                 else
  765.                 {
  766.                     invalid = true;
  767.                     error = "Userame request not answered after 5 seconds";
  768.                 }
  769.                 if (invalid)
  770.                 {
  771.                     Warning(sockip.ToString() + " failed to connect to the server. (" + error + ")");
  772.                     sock.Shutdown(SocketShutdown.Both);
  773.                     sock.Close();
  774.  
  775.                 }
  776.             }
  777.             catch (Exception ex)
  778.             {
  779.                 Error(sockip.ToString() + " could not be connected to the server. Exception: " + ex.Message);
  780.                 sock.Shutdown(SocketShutdown.Both);
  781.                 sock.Close();
  782.             }
  783.         }
  784.         static void ClientThread(object cl)
  785.         {
  786.             Client c = (Client)cl;            
  787.             bool lolz = true;
  788.             while (true)
  789.             {
  790.                 try
  791.                 {
  792.                     bool invalid = false;
  793.                     if (c.sock.Poll(-1, SelectMode.SelectRead))
  794.                     {
  795.                         if (c.sock.Available > 0)
  796.                         {
  797.                             IPAddress cip = ((IPEndPoint)(c.sock.RemoteEndPoint)).Address;
  798.                             int len = 0;
  799.                             byte[] data = new byte[c.sock.Available];
  800.                             c.sock.Receive(data);
  801.                             MemoryStream ns = new MemoryStream(data);
  802.                             if (ns.Length > 4)
  803.                             {
  804.                                 while (ns.Position < ns.Length)
  805.                                 {
  806.                                     if (invalid)
  807.                                     {
  808.                                         break;
  809.                                     }
  810.                                     byte[] l = new byte[4];
  811.                                     ns.Read(l, 0, 4);
  812.                                     len = BitConverter.ToInt32(l, 0);
  813.                                     byte[] dat = new byte[len + 4];
  814.                                     ns.Position -= 4;
  815.                                     ns.Read(dat, 0, len + 4);
  816.                                     ClientPacket cp = ClientPacket.Parse(dat);
  817.                                     if (cp != null)
  818.                                     {
  819.                                         //Process packet here
  820.                                         switch (cp.PacketType)
  821.                                         {
  822.                                             case ClientPacketType.ChatPost:
  823.                                                 ChatCommand com = new ChatCommand(cp.Data);
  824.                                                 if (!com.Invalid)
  825.                                                 {
  826.                                                     switch (com.CommandName.ToLower())
  827.                                                     {
  828.                                                         case "me":
  829.                                                             #region /me
  830.                                                             if (c.rank != Rank.Troll)
  831.                                                             {
  832.                                                                 ChatCommand c2 = new ChatCommand(cp.Data, 0);
  833.                                                                 queue.Add(c.name + " " + c2.Parameters[0]);
  834.                                                             }
  835.                                                             else
  836.                                                             {
  837.                                                                 SendMessage(c, "[ERROR] You are a troll!");
  838.                                                             }
  839.                                                             #endregion
  840.                                                             break;
  841.                                                         case "kick":
  842.                                                             #region Kick
  843.                                                             if ((byte)c.rank > 4)
  844.                                                             {
  845.                                                                 if (com.Parameters.Count == 1)
  846.                                                                 {
  847.                                                                     if (users.ContainsKey(com.Parameters[0]))
  848.                                                                     {
  849.                                                                         if ((byte)((Client)(users[com.Parameters[0]])).rank < 16)
  850.                                                                         {
  851.                                                                             ((Client)(users[com.Parameters[0]])).state = PenaltyState.Kicked;
  852.                                                                             try
  853.                                                                             {
  854.                                                                                 byte[] kickmsg = CreatePacket(ServerPacketType.Kicked, "");
  855.                                                                                 ((Client)(users[com.Parameters[0]])).sock.Send(kickmsg);
  856.                                                                                 DisconnectUser(((Client)(users[com.Parameters[0]])));
  857.                                                                                 users.Remove(com.Parameters[0]);
  858.                                                                                 newusers = true;
  859.                                                                                 queue.Add("[INFO] " + c.name + " has kicked " + com.Parameters[0] + " from the server.");
  860.                                                                             }
  861.                                                                             catch
  862.                                                                             {
  863.                                                                                 ((Client)(users[com.Parameters[0]])).error = true;
  864.                                                                             }
  865.                                                                         }
  866.                                                                         else
  867.                                                                         {
  868.                                                                             SendMessage(c, "[ERROR] You can't kick a mod or host.");
  869.                                                                         }
  870.                                                                     }
  871.                                                                     else
  872.                                                                     {
  873.                                                                         SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
  874.                                                                     }
  875.                                                                 }
  876.                                                                 else
  877.                                                                 {
  878.                                                                     SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  879.                                                                 }
  880.                                                             }
  881.                                                             else
  882.                                                             {
  883.                                                                 SendMessage(c, "[ERROR] Your current rank does not allow you to kick users.");
  884.                                                             }
  885.                                                             #endregion
  886.                                                             break;
  887.                                                         case "ban":
  888.                                                             #region Ban
  889.                                                             if ((byte)c.rank > (byte)Rank.VIP)
  890.                                                             {
  891.                                                                 if (com.Parameters.Count == 1)
  892.                                                                 {
  893.                                                                     if (users.ContainsKey(com.Parameters[0]))
  894.                                                                     {
  895.                                                                         if (c.name != com.Parameters[0])
  896.                                                                         {
  897.                                                                             ((Client)(users[com.Parameters[0]])).state = PenaltyState.Banned;
  898.                                                                             try
  899.                                                                             {
  900.                                                                                 byte[] kickmsg = CreatePacket(ServerPacketType.Banned, "");
  901.                                                                                 ((Client)(users[com.Parameters[0]])).sock.Send(kickmsg);                                                                                
  902.                                                                                 Ban b = new Ban();
  903.                                                                                 b.UserName = com.Parameters[0];
  904.                                                                                 b.IP = ((IPEndPoint)(((Client)(users[com.Parameters[0]])).sock.RemoteEndPoint)).Address;
  905.                                                                                 DisconnectUser(((Client)(users[com.Parameters[0]])));
  906.                                                                                 try
  907.                                                                                 {
  908.                                                                                     List<Ban> current = GetBanlist();
  909.                                                                                     StreamWriter writer = new StreamWriter("banned.txt");
  910.                                                                                     if (current != null)
  911.                                                                                     {
  912.                                                                                         foreach (Ban ban in current)
  913.                                                                                         {
  914.                                                                                             writer.WriteLine(ban.UserName + "|" + ban.IP.ToString());
  915.                                                                                         }
  916.                                                                                     }
  917.                                                                                     writer.WriteLine(b.UserName + "|" + b.IP.ToString());
  918.                                                                                     writer.Close();
  919.                                                                                     queue.Add("[INFO] " + c.name + " has banned " + com.Parameters[0] + " from the server.");
  920.                                                                                     users.Remove(com.Parameters[0]);
  921.                                                                                     newusers = true;
  922.                                                                                 }
  923.                                                                                 catch
  924.                                                                                 {
  925.                                                                                     SendMessage(c, "[ERROR] A problem occured when trying to log the ban. The targeted user may still be able to reconnect.");
  926.                                                                                     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.");
  927.                                                                                 }
  928.                                                                             }
  929.                                                                             catch
  930.                                                                             {
  931.                                                                                 ((Client)(users[com.Parameters[0]])).error = true;
  932.                                                                             }
  933.                                                                         }
  934.                                                                         else
  935.                                                                         {
  936.                                                                             SendMessage(c, "[ERROR] You can't ban yourself!");
  937.                                                                         }
  938.                                                                     }
  939.                                                                     else
  940.                                                                     {
  941.                                                                         SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
  942.                                                                     }
  943.                                                                 }
  944.                                                                 else
  945.                                                                 {
  946.                                                                     SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  947.                                                                 }
  948.                                                             }
  949.                                                             else
  950.                                                             {
  951.                                                                 SendMessage(c, "[ERROR] Your current rank does not allow you to ban users.");
  952.                                                             }
  953.                                                             #endregion
  954.                                                             break;
  955.                                                         case "mute":
  956.                                                             #region Mute
  957.                                                             if ((byte)c.rank > (byte)Rank.VIP)
  958.                                                             {
  959.                                                                 if (com.Parameters.Count == 1)
  960.                                                                 {
  961.                                                                     if (users.ContainsKey(com.Parameters[0]))
  962.                                                                     {
  963.                                                                         if ((byte)((Client)(users[com.Parameters[0]])).rank < (byte)Rank.VIP)
  964.                                                                         {
  965.                                                                             ((Client)(users[com.Parameters[0]])).state = PenaltyState.Muted;
  966.                                                                             queue.Add("[INFO] " + c.name + " has muted " + com.Parameters[0] + ".");
  967.                                                                         }
  968.                                                                         else
  969.                                                                         {
  970.                                                                             SendMessage(c, "[ERROR] You may not mute moderators or the host.");
  971.                                                                         }
  972.  
  973.                                                                     }
  974.                                                                     else
  975.                                                                     {
  976.                                                                         SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
  977.                                                                     }
  978.                                                                 }
  979.                                                                 else
  980.                                                                 {
  981.                                                                     SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  982.                                                                 }
  983.                                                             }
  984.                                                             else
  985.                                                             {
  986.                                                                 SendMessage(c, "[ERROR] Your current rank does not allow you to mute users.");
  987.                                                             }
  988.                                                             #endregion
  989.                                                             break;
  990.                                                         case "unmute":
  991.                                                             #region Unmute
  992.                                                             if ((byte)c.rank > (byte)Rank.VIP)
  993.                                                             {
  994.                                                                 if (com.Parameters.Count == 1)
  995.                                                                 {
  996.                                                                     if (users.ContainsKey(com.Parameters[0]))
  997.                                                                     {
  998.                                                                         if ((byte)((Client)(users[com.Parameters[0]])).rank < (byte)Rank.VIP)
  999.                                                                         {
  1000.                                                                             ((Client)(users[com.Parameters[0]])).state = PenaltyState.None;
  1001.                                                                             queue.Add("[INFO] " + c.name + " has unmuted " + com.Parameters[0] + ".");
  1002.                                                                         }
  1003.                                                                         else
  1004.                                                                         {
  1005.                                                                             SendMessage(c, "[ERROR] Moderators and the host cannot be muted anyway, so what are you playing at?!");
  1006.                                                                         }
  1007.                                                                     }
  1008.                                                                     else
  1009.                                                                     {
  1010.                                                                         SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
  1011.                                                                     }
  1012.                                                                 }
  1013.                                                                 else
  1014.                                                                 {
  1015.                                                                     SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  1016.                                                                 }
  1017.                                                             }
  1018.                                                             else
  1019.                                                             {
  1020.                                                                 SendMessage(c, "[ERROR] Your current rank does not allow you to unmute users.");
  1021.                                                             }
  1022.                                                             #endregion
  1023.                                                             break;
  1024.                                                         case "unban":
  1025.                                                             #region Unban
  1026.                                                             if ((byte)c.rank > (byte)Rank.VIP)
  1027.                                                             {
  1028.                                                                 if (com.Parameters.Count == 1)
  1029.                                                                 {
  1030.                                                                     try
  1031.                                                                     {
  1032.                                                                         List<Ban> current = GetBanlist();
  1033.                                                                         List<string> names = new List<string>();
  1034.                                                                         int ind = 0;
  1035.                                                                         if (current != null)
  1036.                                                                         {
  1037.                                                                             for (int i = 0; i < current.Count; i++)
  1038.                                                                             {
  1039.                                                                                 if (current[i].UserName == com.Parameters[0])
  1040.                                                                                 {
  1041.                                                                                     ind = i;
  1042.                                                                                 }
  1043.                                                                                 names.Add(current[i].UserName);
  1044.                                                                             }
  1045.                                                                             if (names.Contains(com.Parameters[0]))
  1046.                                                                             {
  1047.                                                                                 current.RemoveAt(ind);
  1048.                                                                                 StreamWriter writer = new StreamWriter("banned.txt");
  1049.                                                                                 foreach (Ban b in current)
  1050.                                                                                 {
  1051.                                                                                     writer.WriteLine(b.UserName + "|" + b.IP.ToString());
  1052.                                                                                 }
  1053.                                                                                 writer.Close();
  1054.                                                                                 queue.Add("[INFO] " + c.name + " has unbanned " + com.Parameters[0] + ".");
  1055.                                                                             }
  1056.                                                                             else
  1057.                                                                             {
  1058.                                                                                 SendMessage(c, "[ERROR] There is no banned user named " + com.Parameters[0] + ".");
  1059.                                                                             }
  1060.                                                                         }
  1061.                                                                         else
  1062.                                                                         {
  1063.                                                                             SendMessage(c, "[ERROR] There is no existing ban list.");
  1064.                                                                         }
  1065.  
  1066.                                                                     }
  1067.                                                                     catch
  1068.                                                                     {
  1069.                                                                         SendMessage(c, "[ERROR] A problem occured when trying to remove the ban. The targeted user may still be banned.");
  1070.                                                                         Error("A problem occured when trying to remove a ban issued to" + com.Parameters[0] + ". The targeted user may still be banned.");
  1071.                                                                     }
  1072.                                                                 }
  1073.                                                                 else
  1074.                                                                 {
  1075.                                                                     SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  1076.                                                                 }
  1077.                                                             }
  1078.                                                             else
  1079.                                                             {
  1080.                                                                 SendMessage(c, "[ERROR] Your current rank does not allow you to unban users.");
  1081.                                                             }
  1082.                                                             #endregion
  1083.                                                             break;
  1084.                                                         case "getrank":
  1085.                                                             #region Getrank
  1086.                                                             if (com.Parameters.Count == 1)
  1087.                                                             {
  1088.                                                                 if (users.ContainsKey(com.Parameters[0]))
  1089.                                                                 {
  1090.                                                                     SendMessage(c, "[INFO] " + ((Client)(users[com.Parameters[0]])).name + " is a " + ((Client)(users[com.Parameters[0]])).rank.ToString() + ".");
  1091.                                                                 }
  1092.                                                                 else
  1093.                                                                 {
  1094.                                                                     SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
  1095.                                                                 }
  1096.                                                             }
  1097.                                                             else
  1098.                                                             {
  1099.                                                                 SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  1100.                                                             }
  1101.                                                             #endregion
  1102.                                                             break;
  1103.                                                         case "rank":
  1104.                                                             #region Rank
  1105.                                                             if ((byte)c.rank > (byte)Rank.VIP)
  1106.                                                             {
  1107.                                                                 if (com.Parameters.Count == 2)
  1108.                                                                 {
  1109.                                                                     if (users.ContainsKey(com.Parameters[0]))
  1110.                                                                     {
  1111.                                                                             if ((byte)((Client)(users[com.Parameters[0]])).rank >= (byte)Rank.Mod && c.rank != Rank.Host)
  1112.                                                                             {
  1113.                                                                                 SendMessage(c, "[ERROR] You cannot change the ranks of moderators or the host.");
  1114.                                                                                 break;
  1115.                                                                             }
  1116.                                                                             byte r;
  1117.                                                                             if (Byte.TryParse(com.Parameters[1], out r))
  1118.                                                                             {
  1119.                                                                                 if (r == (byte)Rank.Troll || r == (byte)Rank.Noob || r == (byte)Rank.User || r == (byte)Rank.VIP || r == (byte)Rank.Mod)
  1120.                                                                                 {
  1121.                                                                                     ((Client)(users[com.Parameters[0]])).rank = (Rank)r;
  1122.                                                                                     queue.Add("[INFO] " + c.name + " has ranked " + com.Parameters[0] + " as a " + ((Client)(users[com.Parameters[0]])).rank.ToString() + ".");
  1123.                                                                                     if (((Client)(users[com.Parameters[0]])).rank == Rank.Troll)
  1124.                                                                                     {
  1125.                                                                                         ((Client)(users[com.Parameters[0]])).trolltimer = 3;
  1126.                                                                                     }
  1127.                                                                                     newusers = true;
  1128.                                                                                     List<UserSpec> current = GetUserSpeclist();
  1129.                                                                                     List<string> ips = new List<string>();
  1130.                                                                                     int ind = -1;
  1131.                                                                                     for (int i = 0; i < current.Count; i++)
  1132.                                                                                     {
  1133.                                                                                         if (current[i].IP == ((IPEndPoint)(((Client)(users[com.Parameters[0]])).sock.RemoteEndPoint)).Address)
  1134.                                                                                         {
  1135.                                                                                             ind = i;
  1136.                                                                                         }
  1137.                                                                                         ips.Add(current[i].IP.ToString());
  1138.                                                                                     }
  1139.                                                                                     if (ips.Contains(cip.ToString()))
  1140.                                                                                     {
  1141.                                                                                         current[ind].r = ((Client)(users[com.Parameters[0]])).rank;
  1142.                                                                                     }
  1143.                                                                                     else
  1144.                                                                                     {
  1145.                                                                                         UserSpec tmp = new UserSpec();
  1146.                                                                                         tmp.IP = ((IPEndPoint)(((Client)(users[com.Parameters[0]])).sock.RemoteEndPoint)).Address;
  1147.                                                                                         tmp.r = ((Client)(users[com.Parameters[0]])).rank;
  1148.                                                                                         current.Add(tmp);
  1149.                                                                                     }
  1150.                                                                                     try
  1151.                                                                                     {
  1152.                                                                                         StreamWriter writer = new StreamWriter("users.txt");
  1153.                                                                                         foreach (UserSpec spec in current)
  1154.                                                                                         {
  1155.                                                                                             writer.WriteLine(spec.IP.ToString() + "|" + ((byte)spec.r).ToString());
  1156.                                                                                         }
  1157.                                                                                         writer.Close();
  1158.                                                                                     }
  1159.                                                                                     catch (Exception ex)
  1160.                                                                                     {
  1161.                                                                                         SendMessage(c, "[ERROR] A problem occured when trying to save the user's rank status. Their rank may be lost when they reconnect.");
  1162.                                                                                         Error("A problem occured when trying to save the rank status for " + com.Parameters[0] + ". " + ex.ToString());
  1163.                                                                                     }
  1164.                                                                                     finally
  1165.                                                                                     {
  1166.                                                                                     }
  1167.                                                                                     newusers = true;
  1168.                                                                                 }
  1169.                                                                                 else
  1170.                                                                                 {
  1171.                                                                                     SendMessage(c, "[ERROR] Invalid rank. Rank numbers are numbered by the power of 2 (i.e. 1, 2, 4, 8, 16, etc.)");
  1172.                                                                                 }
  1173.                                                                             }
  1174.                                                                             else
  1175.                                                                             {
  1176.                                                                                 SendMessage(c, "[ERROR] Invalid rank. Rank numbers are numbered by the power of 2 (i.e. 1, 2, 4, 8, 16, etc.)");
  1177.                                                                             }                                                                      
  1178.  
  1179.                                                                     }
  1180.                                                                     else
  1181.                                                                     {
  1182.                                                                         SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
  1183.                                                                     }
  1184.                                                                 }
  1185.                                                                 else
  1186.                                                                 {
  1187.                                                                     SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 2 parameters.");
  1188.                                                                 }
  1189.                                                             }
  1190.                                                             else
  1191.                                                             {
  1192.                                                                 SendMessage(c, "[ERROR] Your current rank does not allow you to rank users.");
  1193.                                                             }
  1194.                                                             #endregion
  1195.                                                             break;
  1196.                                                         case "topic":
  1197.                                                             #region Topic
  1198.                                                             if (c.rank == Rank.Host)
  1199.                                                             {
  1200.                                                                 ChatCommand c2 = new ChatCommand(cp.Data, 0);
  1201.                                                                 motd = c2.Parameters[0];
  1202.                                                                 SaveMOTD(motd);
  1203.                                                                 newmotd = true;
  1204.                                                             }
  1205.                                                             else
  1206.                                                             {
  1207.                                                                 SendMessage(c, "[ERROR] Only the host can change the topic.");
  1208.                                                             }
  1209.                                                             #endregion
  1210.                                                             break;
  1211.                                                         case "users":
  1212.                                                             #region Userlist
  1213.                                                             if (users.Count > 0)
  1214.                                                             {
  1215.                                                                 string people = "";
  1216.                                                                 foreach (DictionaryEntry c2 in users)
  1217.                                                                 {
  1218.                                                                     people += ((Client)c2.Value).name + ", ";
  1219.                                                                 }
  1220.                                                                 people = Split(people, 0, people.Length - 2);
  1221.                                                                 SendMessage(c, "User list: " + people);
  1222.                                                             }
  1223.                                                             else
  1224.                                                             {
  1225.                                                                 SendMessage(c, "[INFO] There are no users currently connected.");
  1226.                                                             }
  1227.                                                             #endregion
  1228.                                                             break;
  1229.                                                         case "stalk":
  1230.                                                             #region Getrank
  1231.                                                             if (com.Parameters.Count == 1)
  1232.                                                             {
  1233.                                                                 if (users.ContainsKey(com.Parameters[0]))
  1234.                                                                 {
  1235.                                                                     SendMessage(c, "[INFO] " + ((Client)(users[com.Parameters[0]])).name + "'s IP address is " + ((IPEndPoint)(((Client)(users[com.Parameters[0]])).sock.RemoteEndPoint)).Address.ToString() + ".");
  1236.                                                                 }
  1237.                                                                 else
  1238.                                                                 {
  1239.                                                                     SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
  1240.                                                                 }
  1241.                                                             }
  1242.                                                             else
  1243.                                                             {
  1244.                                                                 SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  1245.                                                             }
  1246.                                                             #endregion
  1247.                                                             break;
  1248.                                                         case "msg":
  1249.                                                             #region Private message
  1250.                                                             if (com.Parameters.Count > 1)
  1251.                                                             {
  1252.                                                                 ChatCommand com2 = new ChatCommand(com.CommandString, 1);
  1253.                                                                 if (users.ContainsKey(com.Parameters[0]))
  1254.                                                                 {
  1255.                                                                    
  1256.                                                                     SendMessage((Client)(users[com.Parameters[0]]), "[MSG] " + c.name + ": " + com2.Parameters[0]);
  1257.                                                                     SendMessage(c, "[TO " + com.Parameters[0] + "]: " + com2.Parameters[0]);
  1258.                                                                 }
  1259.                                                                 else
  1260.                                                                 {
  1261.                                                                     SendMessage(c, "[ERROR] No user with the name \"" + com2.Parameters[0] + "\" exists.");
  1262.                                                                 }
  1263.                                                             }
  1264.                                                             else
  1265.                                                             {
  1266.                                                                 SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 2 parameters.");
  1267.                                                             }
  1268.                                                             #endregion
  1269.                                                             break;
  1270.                                                         case "lolol":
  1271.                                                             #region Lolol
  1272.                                                             if ((byte)c.rank > 8)
  1273.                                                             {
  1274.                                                                 if (lolz)
  1275.                                                                 {
  1276.                                                                     queue.Add("[INFO] LOL");
  1277.                                                                     queue.Add("[INFO] LOLOL");
  1278.                                                                     queue.Add("[INFO] LOLOLOL");
  1279.                                                                     queue.Add("[INFO] LOLOLOLOL");
  1280.                                                                     queue.Add("[INFO] LOLOLOLOLOL");
  1281.                                                                     queue.Add("[INFO] LOLOLOLOL");
  1282.                                                                     queue.Add("[INFO] LOLOLOL");
  1283.                                                                     queue.Add("[INFO] LOLOL");
  1284.                                                                     queue.Add("[INFO] LOL");
  1285.                                                                     queue.Add("[INFO] LOLOL");
  1286.                                                                     queue.Add("[INFO] LOLOLOL");
  1287.                                                                     queue.Add("[INFO] LOLOLOLOL");
  1288.                                                                     queue.Add("[INFO] LOLOLOLOLOL");
  1289.                                                                     queue.Add("[INFO] LOLOLOLOL");
  1290.                                                                     queue.Add("[INFO] LOLOLOL");
  1291.                                                                     queue.Add("[INFO] LOLOL");
  1292.                                                                     queue.Add("[INFO] LOL");
  1293.                                                                     queue.Add("[INFO] LOLOL");
  1294.                                                                     queue.Add("[INFO] LOLOLOL");
  1295.                                                                     queue.Add("[INFO] LOLOLOLOL");
  1296.                                                                     queue.Add("[INFO] LOLOLOLOLOL");
  1297.                                                                     queue.Add("[INFO] LOLOLOLOL");
  1298.                                                                     queue.Add("[INFO] LOLOLOL");
  1299.                                                                     queue.Add("[INFO] LOLOL");
  1300.                                                                     queue.Add("[INFO] LOL");
  1301.                                                                     lolz = false;
  1302.                                                                 }
  1303.                                                                 else
  1304.                                                                 {
  1305.                                                                     SendMessage(c, "[ERROR] No more lolz for you!");
  1306.                                                                 }
  1307.                                                             }
  1308.                                                             else
  1309.                                                             {
  1310.                                                                 SendMessage(c, "[ERROR] Only the mods and hosts can lolol.");
  1311.                                                             }
  1312.                                                             #endregion
  1313.                                                             break;
  1314.                                                         case "help":
  1315.                                                             #region Help
  1316.                                                             if (com.Parameters.Count == 0)
  1317.                                                             {
  1318.                                                                 SendMessage(c, help);
  1319.                                                             }
  1320.                                                             else
  1321.                                                             {
  1322.                                                                 SendMessage(c, "[ERROR] The help command requires no parameters.");
  1323.                                                             }
  1324.                                                             break;
  1325.                                                         default:
  1326.                                                             SendMessage(c, "[ERROR] I dunno what that command is.");
  1327.                                                             #endregion
  1328.                                                             break;
  1329.                                                         case "puppetzombie":
  1330.                                                             #region Zombie message
  1331.                                                             if ((byte)c.rank > (byte)Rank.VIP)
  1332.                                                             {
  1333.                                                                 if (com.Parameters.Count > 1)
  1334.                                                                 {
  1335.                                                                     ChatCommand com2 = new ChatCommand(com.CommandString, 1);
  1336.                                                                     queue.Add(com.Parameters[0] + ": " + com2.Parameters[0]);                                                                  
  1337.                                                                 }
  1338.                                                                 else
  1339.                                                                 {
  1340.                                                                     SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 2 parameters.");
  1341.                                                                 }
  1342.                                                             }
  1343.                                                             else
  1344.                                                             {
  1345.                                                                 SendMessage(c, "[ERROR] Only mods and higher can do this.");
  1346.                                                             }
  1347.                                                             #endregion
  1348.                                                             break;
  1349.                                                     }
  1350.                                                 }
  1351.                                                 else
  1352.                                                 {
  1353.                                                     if (c.rank != Rank.Troll)
  1354.                                                     {
  1355.                                                         if (c.state == PenaltyState.None)
  1356.                                                         {
  1357.                                                             queue.Add(c.name + ": " + cp.Data);
  1358.                                                             try
  1359.                                                             {
  1360.                                                                 luaEngine.AddMessage(c.name, cp.Data);
  1361.                                                             }
  1362.                                                             catch (LuaException ex)
  1363.                                                             {
  1364.                                                                 LuaMessage(ex.Message);
  1365.                                                             }
  1366.                                                         }
  1367.                                                     }
  1368.                                                     else
  1369.                                                     {
  1370.                                                         if (c.trolltimer > 0)
  1371.                                                         {
  1372.                                                             Random r = new Random();
  1373.                                                             queue.Add(c.name + ": " + trollquotes[r.Next(0, trollquotes.Length)]);
  1374.                                                             c.trolltimer--;
  1375.                                                         }
  1376.                                                     }
  1377.                                                 }
  1378.                                                 break;
  1379.                                             case ClientPacketType.Leaving:
  1380.                                                 string tempn = c.name;
  1381.  
  1382.                                                 DisconnectUser(c);
  1383.                                                 users.Remove(c.name);
  1384.                                                 newusers = true;
  1385.                                                 invalid = true;
  1386.                                                 if (users.Count > 0)
  1387.                                                 {
  1388.                                                     queue.Add(tempn + " left the server.");
  1389.                                                 }
  1390.                                                 else
  1391.                                                 {
  1392.                                                     Info(tempn + " left the server.");
  1393.                                                 }
  1394.                                                 break;
  1395.                                             default:
  1396.                                                 break;
  1397.                                         }
  1398.                                     }
  1399.                                     else
  1400.                                     {
  1401.                                         invalid = true;
  1402.                                     }
  1403.                                 }
  1404.                             }
  1405.                             else
  1406.                             {
  1407.                                 invalid = true;
  1408.                             }
  1409.                             ns.Close();
  1410.                         }
  1411.                         else
  1412.                         {
  1413.                             if (c.error || c.state == PenaltyState.Kicked || c.state == PenaltyState.Banned)
  1414.                             {
  1415.                                 users.Remove(c.name);
  1416.                                 break;
  1417.                             }
  1418.                         }
  1419.                     }
  1420.                 }
  1421.                 catch
  1422.                 {
  1423.                     c.error = true;
  1424.                 }
  1425.             }
  1426.         }
  1427.         static void DisconnectUser(Client c)
  1428.         {
  1429.             try
  1430.             {
  1431.                 c.sock.Send(new byte[0]);
  1432.                 c.sock.Shutdown(SocketShutdown.Both);
  1433.                 c.sock.Close();
  1434.             }
  1435.             catch
  1436.             {
  1437.             }
  1438.             finally
  1439.             {
  1440.             }              
  1441.         }
  1442.         static void SendMessage(Client c, string message)
  1443.         {
  1444.             byte[] m = CreatePacket(ServerPacketType.ChatPost, message);
  1445.             c.sock.Send(m);            
  1446.         }
  1447.         static byte[] CreatePacket(ServerPacketType type, string info)
  1448.         {
  1449.             byte[] a = new byte[] { (byte)type };
  1450.             byte[] b = Encoding.ASCII.GetBytes(info);
  1451.             byte[] c = info.Length > 0 ? a.Concat(b).ToArray() : a;
  1452.             byte[] d = BitConverter.GetBytes(c.Length);
  1453.             d = d.Concat(c).ToArray();          
  1454.             return d;
  1455.         }
  1456.  
  1457.         static List<Ban> GetBanlist()
  1458.         {
  1459.             if (File.Exists("banned.txt"))
  1460.             {
  1461.                 List<Ban> list = new List<Ban>();
  1462.                 StreamReader sr = new StreamReader("banned.txt");
  1463.                 string raw = sr.ReadToEnd();
  1464.                 sr.Close();
  1465.                 string[] sl = raw.Split('\n');
  1466.                 foreach (string s in sl)
  1467.                 {
  1468.                     int ind = s.LastIndexOf("|");
  1469.                     if (ind > -1)
  1470.                     {
  1471.                         string n = Split(s, 0, ind);
  1472.                         IPAddress ip;
  1473.                         string s2 = s.Replace("\r", "").Replace("\n", "");
  1474.                         if (!IPAddress.TryParse(Split(s2, ind + 1, s2.Length), out ip))
  1475.                         {
  1476.                             continue;
  1477.                         }
  1478.                         else
  1479.                         {
  1480.                             Ban b = new Ban();
  1481.                             b.UserName = n;
  1482.                             b.IP = ip;
  1483.                             list.Add(b);
  1484.                         }
  1485.                     }
  1486.                 }
  1487.                 return list;
  1488.             }
  1489.             else
  1490.             {
  1491.                 return null;
  1492.             }
  1493.         }
  1494.         static List<UserSpec> GetUserSpeclist()
  1495.         {
  1496.             if (File.Exists("users.txt"))
  1497.             {
  1498.                 List<UserSpec> list = new List<UserSpec>();
  1499.                 StreamReader sr = new StreamReader("users.txt");
  1500.                 string raw = sr.ReadToEnd();
  1501.                 sr.Close();
  1502.                 string[] sl = raw.Split('\n');
  1503.                 foreach (string s in sl)
  1504.                 {
  1505.                     int ind = s.LastIndexOf("|");
  1506.                     if (ind > -1)
  1507.                     {
  1508.                         byte rank;
  1509.                         IPAddress ip;
  1510.                         if (!IPAddress.TryParse(Split(s, 0, ind), out ip) || !Byte.TryParse(Split(s, ind + 1, s.Length), out rank))
  1511.                         {
  1512.                             continue;
  1513.                         }
  1514.                         else
  1515.                         {
  1516.                             UserSpec b = new UserSpec();
  1517.                             if (rank > 0 && rank < 33)
  1518.                             {
  1519.                                 b.r = (Rank)rank;
  1520.                             }
  1521.                             else
  1522.                             {
  1523.                                 b.r = (Rank)4;
  1524.                             }
  1525.                             b.IP = ip;
  1526.                             list.Add(b);
  1527.                         }
  1528.                     }
  1529.                 }
  1530.                 return list;
  1531.             }
  1532.             else
  1533.             {
  1534.                 return null;
  1535.             }
  1536.         }
  1537.        
  1538.         static string GetMOTD()
  1539.         {
  1540.             if (File.Exists("motd.txt"))
  1541.             {
  1542.                 try
  1543.                 {
  1544.                     StreamReader sr = new StreamReader("motd.txt");
  1545.                     string t = sr.ReadToEnd();
  1546.                     sr.Close();
  1547.                     return t;
  1548.                 }
  1549.                 catch
  1550.                 {
  1551.                     return "No Topic";
  1552.                 }
  1553.             }
  1554.             else
  1555.             {
  1556.                 return "No Topic";
  1557.             }
  1558.         }
  1559.         static bool SaveMOTD(string str)
  1560.         {
  1561.             try
  1562.             {
  1563.                 StreamWriter sr = new StreamWriter("motd.txt");
  1564.                 sr.Write(str);
  1565.                 sr.Close();
  1566.                 return true;
  1567.             }
  1568.             catch
  1569.             {
  1570.                 return false;
  1571.             }
  1572.         }
  1573.         static string GetRankSymbol(Rank rank)
  1574.         {
  1575.             switch (rank)
  1576.             {
  1577.                 case Rank.Troll:
  1578.                     return "#";
  1579.                 case Rank.Noob:
  1580.                     return "?";
  1581.                 case Rank.User:
  1582.                     return "";
  1583.                 case Rank.VIP:
  1584.                     return "+";
  1585.                 case Rank.Mod:
  1586.                     return "$";
  1587.                 case Rank.Host:
  1588.                     return "@";
  1589.                 default:
  1590.                     return "";
  1591.             }
  1592.         }
  1593.         public static string Split(string parent, int start, int end)
  1594.         {
  1595.             return parent.Substring(start, end - start);
  1596.         }
  1597.  
  1598.         //Lua functions
  1599.         public static int GetUserCount()
  1600.         {
  1601.             return users.Count;
  1602.         }
  1603.         public static string GetRank(string name)
  1604.         {
  1605.             if (users.ContainsKey(name))
  1606.             {
  1607.                 return ((Client)users[name]).rank.ToString();
  1608.             }
  1609.             else
  1610.             {
  1611.                 return "Invalid";
  1612.             }
  1613.         }
  1614.         public static void SetTopic(string topic)
  1615.         {
  1616.             motd = topic;
  1617.             newmotd = true;
  1618.         }
  1619.         public static string GetTopic()
  1620.         {
  1621.             return motd;
  1622.         }
  1623.         public static bool Kick(string user)
  1624.         {
  1625.             if (users.ContainsKey(user))
  1626.             {
  1627.                 ((Client)(users[user])).state = PenaltyState.Kicked;
  1628.                 try
  1629.                 {
  1630.                     byte[] kickmsg = CreatePacket(ServerPacketType.Kicked, "");
  1631.                     ((Client)(users[user])).sock.Send(kickmsg);
  1632.                     DisconnectUser(((Client)(users[user])));
  1633.                     users.Remove(user);
  1634.                     newusers = true;
  1635.                     queue.Add("[INFO] " + user + " has been kicked from the server.");
  1636.                     return true;
  1637.                 }
  1638.                 catch
  1639.                 {
  1640.                     ((Client)(users[user])).error = true;
  1641.                     return false;                
  1642.                 }                
  1643.             }
  1644.             else
  1645.             {
  1646.                 return false;
  1647.             }
  1648.         }
  1649.         public static bool Ban(string user)
  1650.         {
  1651.             #region Ban            
  1652.                 if (users.ContainsKey(user))
  1653.                 {
  1654.                     ((Client)(users[user])).state = PenaltyState.Banned;
  1655.                     try
  1656.                     {
  1657.                         byte[] kickmsg = CreatePacket(ServerPacketType.Banned, "");
  1658.                         ((Client)(users[user])).sock.Send(kickmsg);
  1659.                         Ban b = new Ban();
  1660.                         b.UserName = user;
  1661.                         b.IP = ((IPEndPoint)(((Client)(users[user])).sock.RemoteEndPoint)).Address;
  1662.                         DisconnectUser(((Client)(users[user])));
  1663.                         try
  1664.                         {
  1665.                             List<Ban> current = GetBanlist();
  1666.                             StreamWriter writer = new StreamWriter("banned.txt");
  1667.                             if (current != null)
  1668.                             {
  1669.                                 foreach (Ban ban in current)
  1670.                                 {
  1671.                                     writer.WriteLine(ban.UserName + "|" + ban.IP.ToString());
  1672.                                 }
  1673.                             }
  1674.                             writer.WriteLine(b.UserName + "|" + b.IP.ToString());
  1675.                             writer.Close();
  1676.                             queue.Add("[INFO] " + user + "has been banned from the server.");
  1677.                             users.Remove(user);
  1678.                             newusers = true;
  1679.                             return true;
  1680.                         }
  1681.                         catch
  1682.                         {
  1683.                             Error("A problem occured when trying to log a ban issued for " + user + ". The targeted user may still be able to reconnect.");
  1684.                             return false;
  1685.                         }
  1686.                     }
  1687.                     catch
  1688.                     {
  1689.                         ((Client)(users[user])).error = true;
  1690.                         return false;
  1691.                     }
  1692.                 }
  1693.                 else
  1694.                 {
  1695.                     return false;
  1696.                 }            
  1697.             #endregion
  1698.         }
  1699.         public static bool UserExists(string name)
  1700.         {
  1701.             return (users.ContainsKey(name));            
  1702.         }
  1703.         public static void PostMessage(string msg)
  1704.         {
  1705.             queue.Add(msg);
  1706.         }
  1707.         public static void PostConsoleMessage(string msg)
  1708.         {
  1709.             Console.WriteLine("[LUA] " + msg);
  1710.         }
  1711.         public static void Sleep(int time)
  1712.         {
  1713.             Thread.Sleep(time);
  1714.         }
  1715.     }
  1716.     public enum Rank
  1717.     {
  1718.         Troll = 1,
  1719.         Noob = 2,
  1720.         User = 4,
  1721.         VIP = 8,
  1722.         Mod = 16,
  1723.         Host = 32
  1724.     }
  1725.     public enum ServerPacketType : byte
  1726.     {
  1727.         ChatPost = 0,
  1728.         Accepted = 1,
  1729.         Rejected = 2,
  1730.         Kicked = 3,
  1731.         Banned = 4,
  1732.         Shutdown = 5,
  1733.         MOTD = 6,
  1734.         UserList = 7,
  1735.         Muted = 8,
  1736.         Unmuted = 9,
  1737.         RequestPassword = 10,
  1738.         RequestUsername = 11
  1739.     }
  1740.     public enum ClientPacketType : byte
  1741.     {
  1742.         ChatPost = 0,
  1743.         Username = 1,
  1744.         Password = 2,
  1745.         Leaving = 3
  1746.     }
  1747.     public enum PenaltyState
  1748.     {
  1749.         None = 0,
  1750.         Muted = 1,
  1751.         Kicked = 2,
  1752.         Banned = 3
  1753.     }
  1754.     public class Client
  1755.     {
  1756.         public Socket sock;
  1757.         public PenaltyState state = PenaltyState.None;
  1758.         public bool error = false;        
  1759.         public string name;
  1760.         public Rank rank;
  1761.         public int trolltimer = 3;
  1762.     }
  1763.     public class Ban
  1764.     {
  1765.         public string UserName;
  1766.         public IPAddress IP;
  1767.     }
  1768.     public class UserSpec
  1769.     {
  1770.         public IPAddress IP;
  1771.         public Rank r;
  1772.     }
  1773.     public class ChatCommand
  1774.     {
  1775.         string cmd;
  1776.         string name;
  1777.         List<string> pmts;
  1778.         public bool Invalid = false;
  1779.         public ChatCommand(string command)
  1780.         {
  1781.             if (!command.StartsWith("/"))
  1782.             {
  1783.                 Invalid = true;
  1784.             }
  1785.             else
  1786.             {
  1787.                 cmd = command;
  1788.                 List<string> pts = command.Split(' ').ToList();
  1789.                 name = pts[0].Substring(1);
  1790.                 pts.RemoveAt(0);
  1791.                 pmts = pts;
  1792.             }
  1793.         }
  1794.         public ChatCommand(string command, int combineStart)
  1795.         {
  1796.             if (!command.StartsWith("/"))
  1797.             {
  1798.                 Invalid = true;
  1799.             }
  1800.             else
  1801.             {
  1802.                 cmd = command;
  1803.                 List<string> pts = command.Split(' ').ToList();
  1804.                 name = pts[0].Substring(1);
  1805.                 pts.RemoveAt(0);
  1806.                 string last = "";
  1807.                 for (int i = pts.Count - 1; i >= combineStart; i--)
  1808.                 {
  1809.                     last = pts[i] + " " + last;
  1810.                 }
  1811.                 last = last.Substring(0, last.Length - 1);
  1812.                 pts.Clear();
  1813.                 pts.Add(last);
  1814.                 pmts = pts;
  1815.             }
  1816.         }
  1817.         public List<string> Parameters
  1818.         {
  1819.             get { return pmts; }
  1820.         }
  1821.         public string CommandName
  1822.         {
  1823.             get { return name; }
  1824.         }
  1825.         public string CommandString
  1826.         {
  1827.             get { return cmd; }
  1828.         }
  1829.     }
  1830.     public class ServerCommand
  1831.     {
  1832.         string cmd;
  1833.         string name;
  1834.         List<string> pmts;
  1835.         public ServerCommand(string command)
  1836.         {            
  1837.             cmd = command;
  1838.             List<string> pts = command.Split(' ').ToList();
  1839.             name = pts[0];
  1840.             pts.RemoveAt(0);
  1841.             pmts = pts;
  1842.         }
  1843.         public ServerCommand(string command, int combineStart)
  1844.         {            
  1845.             cmd = command;
  1846.             List<string> pts = command.Split(' ').ToList();
  1847.             name = pts[0];
  1848.             pts.RemoveAt(0);
  1849.             string last = "";
  1850.             for (int i = pts.Count - 1; i >= combineStart; i--)
  1851.             {
  1852.                 last = pts[i] + " " + last;
  1853.             }
  1854.             last = last.Substring(0, last.Length - 1);
  1855.             pts.Clear();
  1856.             pts.Add(last);
  1857.             pmts = pts;
  1858.         }
  1859.         public List<string> Parameters
  1860.         {
  1861.             get { return pmts; }
  1862.         }
  1863.         public string CommandName
  1864.         {
  1865.             get { return name; }
  1866.         }
  1867.         public string CommandString
  1868.         {
  1869.             get { return cmd; }
  1870.         }
  1871.     }
  1872.     public class ClientPacket
  1873.     {
  1874.         static int ln = 0;
  1875.         static ClientPacketType type = ClientPacketType.Leaving;
  1876.         static string data = "";
  1877.         public static ClientPacket Parse(byte[] buffer)
  1878.         {
  1879.             if (buffer.Length > 4)
  1880.             {
  1881.                 MemoryStream ms = new MemoryStream(buffer);
  1882.                 byte[] a = new byte[4];
  1883.                 ms.Read(a, 0, 4);
  1884.                 ln = BitConverter.ToInt32(a, 0);
  1885.                 byte[] b = new byte[1];
  1886.                 ms.Read(b, 0, 1);
  1887.                 byte bb = b[0];
  1888.                 if (bb < 4)
  1889.                 {
  1890.                     type = (ClientPacketType)bb;
  1891.                 }
  1892.                 else
  1893.                 {
  1894.                     return null;
  1895.                 }
  1896.                 if (buffer.Length > 5)
  1897.                 {
  1898.                     byte[] c = new byte[buffer.Length - 5];
  1899.                     ms.Read(c, 0, c.Length);
  1900.                     data = Encoding.ASCII.GetString(c);
  1901.                 }
  1902.                 ClientPacket packet = new ClientPacket();
  1903.                 packet.Length = ln;
  1904.                 packet.PacketType = type;
  1905.                 packet.Data = data;
  1906.                 return packet;
  1907.             }
  1908.             else
  1909.             {
  1910.                 return null;
  1911.             }            
  1912.         }
  1913.         public int Length
  1914.         {
  1915.             get { return ln; }
  1916.             set { ln = value; }
  1917.         }
  1918.         public ClientPacketType PacketType
  1919.         {
  1920.             get { return type; }
  1921.             set { type = value; }
  1922.         }
  1923.         public string Data
  1924.         {
  1925.             get { return data; }
  1926.             set { data = value; }
  1927.         }
  1928.     }
  1929.      
  1930. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement