Advertisement
Guest User

Untitled

a guest
Jul 7th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 57.78 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.  
  11. namespace WhisperServer
  12. {
  13.     class Program
  14.     {
  15.         static Socket sv = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  16.         static IPEndPoint ep = new IPEndPoint(IPAddress.Any, 9647);        
  17.         static Hashtable users = new Hashtable();
  18.         static List<string> queue = new List<string>();
  19.         static string motd = "";
  20.         static bool newmotd = false;
  21.         static bool closing = false;
  22.         static bool newusers = false;
  23.         static Thread lst;
  24.         static Thread msg;        
  25.         static void Main(string[] args)
  26.         {            
  27.             Info("Starting server.");
  28.             sv.Bind(ep);
  29.             sv.Listen(5);
  30.             lst = new Thread(new ThreadStart(Listener));
  31.             lst.Start();
  32.             msg = new Thread(new ThreadStart(MsgHandler));
  33.             msg.Start();
  34.             motd = GetMOTD();
  35.             Info("Ready!");
  36.             while (true)
  37.             {
  38.                 ServerCommand com = new ServerCommand(Console.ReadLine());
  39.                 switch (com.CommandName.ToLower())
  40.                 {
  41.                     case "stop":
  42.                         closing = true;
  43.                         break;
  44.                     case "say":
  45.                         ServerCommand c2 = new ServerCommand(com.CommandString, 0);
  46.                         queue.Add("[CONSOLE] " + c2.Parameters[0]);
  47.                         Chat("[CONSOLE] " + c2.Parameters[0]);
  48.                         break;
  49.                     case "topic":
  50.                         #region Topic
  51.                             ServerCommand c3 = new ServerCommand(com.CommandString, 0);
  52.                             motd = c3.Parameters[0];
  53.                             SaveMOTD(motd);
  54.                             newmotd = true;                        
  55.                         #endregion
  56.                         break;
  57.                     case "users":
  58.                         #region Userlist
  59.                         if (users.Count > 0)
  60.                         {
  61.                             string people = "";
  62.                             foreach (Client c in users)
  63.                             {
  64.                                 people += c.name + ", ";
  65.                             }
  66.                             people = Split(people, 0, people.Length - 3);
  67.                             Info("User list: " + people);
  68.                         }
  69.                         else
  70.                         {
  71.                             Info("There are no users currently connected.");
  72.                         }
  73.                         #endregion
  74.                         break;
  75.                     default:
  76.                         Error("Invalid command.");
  77.                         break;
  78.                 }
  79.             }
  80.         }
  81.         static void Info(string message)
  82.         {
  83.             Console.WriteLine("[INFO] " + message);
  84.         }
  85.         static void Error(string message)
  86.         {
  87.             Console.WriteLine("[ERROR] " + message);
  88.         }
  89.         static void Warning(string message)
  90.         {
  91.             Console.WriteLine("[WARNING] " + message);
  92.         }
  93.         static void Chat(string message)
  94.         {
  95.             Console.WriteLine("[CHAT] " + message);
  96.         }
  97.         static void Listener()
  98.         {
  99.             while (true)
  100.             {
  101.                 if (sv.Poll(-1, SelectMode.SelectRead))
  102.                 {
  103.                     Thread a = new Thread(new ParameterizedThreadStart(Accepter));
  104.                     a.Start(sv.Accept());
  105.                 }
  106.             }
  107.         }
  108.         static void MsgHandler()
  109.         {
  110.             while (true)
  111.             {
  112.                 while (!closing && queue.Count == 0 && !newusers && !newmotd)
  113.                 {
  114.                     Thread.Sleep(1);
  115.                 }
  116.                 if (closing)
  117.                 {
  118.                     Info("Shutting down server.");
  119.                     Thread.Sleep(1000);
  120.                     if (users.Count > 0)
  121.                     {
  122.                         foreach (Client c in users)
  123.                         {
  124.                             try
  125.                             {                                
  126.                                 byte[] packet = CreatePacket(ServerPacketType.Shutdown, "");
  127.                                 c.sock.Send(packet);
  128.                                 DisconnectUser(c);
  129.                             }
  130.                             catch
  131.                             {
  132.                                 Error("Couldn't disconnect user " + c.name + ".");
  133.                             }
  134.                             finally
  135.                             {
  136.                             }
  137.                         }
  138.                         users.Clear();
  139.                     }
  140.                     Environment.Exit(0);
  141.                 }
  142.                 if (queue.Count > 0)
  143.                 {
  144.                     foreach (Client c in users)
  145.                     {
  146.                         try
  147.                         {
  148.                             foreach (string s in queue)
  149.                             {                                
  150.                                 byte[] m = CreatePacket(ServerPacketType.ChatPost, s);
  151.                                 c.sock.Send(m);
  152.                                 Chat(s);
  153.                             }
  154.                         }
  155.                         catch (Exception e)
  156.                         {
  157.                             Error("Server error occured with user " + c.name + ". Exception data: " + e);
  158.                             Info("Disconnecting user " + c.name + " from server.");
  159.                             queue.Add("[INFO] " + c.name + " has been disconnected due to an internal server error.");
  160.                             DisconnectUser(c);
  161.                             users.Remove(c.name);
  162.                             newusers = true;
  163.                         }
  164.                         finally
  165.                         {
  166.                         }
  167.                     }
  168.                     queue.Clear();
  169.                 }
  170.                 if (newusers)
  171.                 {
  172.                     newusers = false;
  173.                     string temp = "";
  174.                     foreach (Client c in users)
  175.                     {
  176.                         temp += GetRankSymbol(c.rank) + c.name;
  177.                         temp += " ";
  178.                     }
  179.                     temp = Split(temp, 0, temp.Length - 2);
  180.                     byte[] u = CreatePacket(ServerPacketType.UserList, temp);
  181.                     foreach (Client c in users)
  182.                     {
  183.                         try
  184.                         {
  185.                             c.sock.Send(u);
  186.                         }
  187.                         catch (Exception e)
  188.                         {
  189.                             Error("Server error occured with user " + c.name + ". Exception data: " + e);
  190.                             Info("Disconnecting user " + c.name + " from server.");
  191.                             queue.Add("[INFO] " + c.name + " has been disconnected due to an internal server error.");                            
  192.                             DisconnectUser(c);
  193.                             users.Remove(c.name);
  194.                             newusers = true;
  195.                         }
  196.                         finally
  197.                         {
  198.                         }
  199.                     }                    
  200.                 }
  201.                 if (newmotd)
  202.                 {
  203.                     newmotd = false;
  204.                     foreach (Client c in users)
  205.                     {
  206.                         try
  207.                         {
  208.                                 byte[] m = CreatePacket(ServerPacketType.MOTD, motd);
  209.                                 c.sock.Send(m);                                
  210.                         }
  211.                         catch (Exception e)
  212.                         {
  213.                             Error("Server error occured with user " + c.name + ". Exception data: " + e);
  214.                             Info("Disconnecting user " + c.name + " from server.");
  215.                             queue.Add("[INFO] " + c.name + " has been disconnected due to an internal server error.");
  216.                             DisconnectUser(c);
  217.                             users.Remove(c.name);
  218.                             newusers = true;
  219.                         }
  220.                         finally
  221.                         {
  222.                         }
  223.                        
  224.                     }
  225.                     Info("The topic has been changed to \"" + motd + "\".");
  226.                 }
  227.  
  228.             }
  229.         }
  230.         static void Accepter(object socket)
  231.         {
  232.             Socket sock = (Socket)socket;
  233.             Client c = new Client();
  234.             IPAddress sockip = ((IPEndPoint)sock.RemoteEndPoint).Address;
  235.             string error = "";
  236.             try
  237.             {
  238.                 bool invalid = false;                
  239.                 byte[] req1 = CreatePacket(ServerPacketType.RequestUsername, " ");
  240.                 sock.Send(req1);
  241.                 if (sock.Poll(5000000, SelectMode.SelectRead))
  242.                 {
  243.                     if (sock.Available > 0)
  244.                     {
  245.                         int len = 0;
  246.                         byte[] data = new byte[sock.Available];
  247.                         sock.Receive(data);
  248.                         MemoryStream ns = new MemoryStream(data);
  249.                         if (ns.Length > 4)
  250.                         {
  251.                             byte[] l = new byte[4];
  252.                             ns.Read(l, 0, 4);
  253.                             len = BitConverter.ToInt32(l, 0);
  254.                             byte[] dat = new byte[len + 4];
  255.                             ns.Position -= 4;
  256.                             ns.Read(dat, 0, len);
  257.                             ClientPacket cp = ClientPacket.Parse(dat);
  258.                             if (cp != null)
  259.                             {
  260.                                 if (cp.PacketType == ClientPacketType.Username && cp.Data.Length > 0)
  261.                                 {
  262.                                     c.name = cp.Data;
  263.                                 }
  264.                                 else
  265.                                 {
  266.                                     invalid = true;
  267.                                     error = "Wrong packet signature";
  268.                                 }
  269.                             }
  270.                             else
  271.                             {
  272.                                 invalid = true;
  273.                                 error = "Corrupt packet";
  274.                             }
  275.                         }
  276.                         else
  277.                         {
  278.                             invalid = true;
  279.                             error = "Corrupt packet";
  280.                         }
  281.                         ns.Close();
  282.                     }
  283.                     else
  284.                     {
  285.                         invalid = true;
  286.                         error = "No data available";
  287.                     }
  288.                     // Check if this user is banned?
  289.                     if (!invalid)
  290.                     {
  291.                         List<Ban> banlist = GetBanlist();
  292.                         if (banlist != null)
  293.                         {
  294.                             foreach (Ban b in banlist)
  295.                             {
  296.                                 if (sockip == b.IP || c.name == b.UserName)
  297.                                 {
  298.                                     // The 6 lines of code sure to piss anybody off                                    
  299.                                     byte[] rejban = CreatePacket(ServerPacketType.Rejected, "[ERROR] Rejected: You are banned from this server!");
  300.                                     sock.Send(rejban);
  301.                                     sock.Shutdown(SocketShutdown.Both);
  302.                                     sock.Close();
  303.                                     invalid = true;
  304.                                     error = "Banned user";
  305.                                     break;
  306.                                 }
  307.                             }
  308.                         }
  309.                     }
  310.                     //Check user rank
  311.                     if (!invalid)
  312.                     {
  313.                         List<UserSpec> userlist = GetUserSpeclist();
  314.                         if (userlist != null)
  315.                         {
  316.                             foreach (UserSpec spec in userlist)
  317.                             {
  318.                                 if (sockip == IPAddress.Parse("127.0.0.1") || sockip == IPAddress.Parse("192.168.1.1"))
  319.                                 {
  320.                                     c.rank = Rank.Host;
  321.                                 }
  322.                                 else if (sockip == spec.IP)
  323.                                 {
  324.                                     c.rank = spec.r;
  325.                                     break;
  326.                                 }
  327.                             }
  328.                         }
  329.                         c.sock = sock;
  330.                         string nn = c.name;
  331.                         while (users.ContainsKey(nn))
  332.                         {
  333.                             nn += "_";
  334.                         }
  335.                         c.name = nn;
  336.                         c.sock.Send(CreatePacket(ServerPacketType.Accepted, ""));
  337.                         users.Add(c.name, c);
  338.                         newusers = true;
  339.                     }
  340.                 }
  341.                 else
  342.                 {
  343.                     invalid = true;
  344.                     error = "Userame request not answered after 5 seconds";
  345.                 }
  346.                 if (invalid)
  347.                 {
  348.                     Warning(sockip.ToString() + " failed to connect to the server. (" + error + ")");
  349.                     sock.Shutdown(SocketShutdown.Both);
  350.                     sock.Close();
  351.  
  352.                 }
  353.             }
  354.             catch (Exception ex)
  355.             {
  356.                 Error(sockip.ToString() + " could not be connected to the server. Exception: " + ex.Message);
  357.                 sock.Shutdown(SocketShutdown.Both);
  358.                 sock.Close();
  359.             }
  360.         }
  361.         static void ClientThread(object cl)
  362.         {
  363.             Client c = (Client)cl;
  364.             while (true)
  365.             {
  366.                 try
  367.                 {
  368.                     bool invalid = false;
  369.                     if (c.sock.Poll(-1, SelectMode.SelectRead))
  370.                     {
  371.                         if (c.sock.Available > 0)
  372.                         {
  373.                             int len = 0;
  374.                             byte[] data = new byte[c.sock.Available];
  375.                             c.sock.Receive(data);
  376.                             MemoryStream ns = new MemoryStream(data);
  377.                             if (ns.Length > 4)
  378.                             {
  379.                                 while (ns.Position < ns.Length)
  380.                                 {
  381.                                     if (invalid)
  382.                                     {
  383.                                         break;
  384.                                     }
  385.                                     byte[] l = new byte[4];
  386.                                     ns.Read(l, 0, 4);
  387.                                     len = BitConverter.ToInt32(l, 0);
  388.                                     byte[] dat = new byte[len + 4];
  389.                                     ns.Position -= 4;
  390.                                     ns.Read(dat, 0, len + 4);
  391.                                     ClientPacket cp = ClientPacket.Parse(dat);
  392.                                     if (cp != null)
  393.                                     {
  394.                                         //Process packet here
  395.                                         switch (cp.PacketType)
  396.                                         {
  397.                                             case ClientPacketType.ChatPost:
  398.                                                 ChatCommand com = new ChatCommand(cp.Data);
  399.                                                 if (!com.Invalid)
  400.                                                 {
  401.                                                     switch (com.CommandName.ToLower())
  402.                                                     {
  403.                                                         case "me":
  404.                                                             #region /me
  405.                                                             if (c.rank != Rank.Troll)
  406.                                                             {
  407.                                                                 ChatCommand c2 = new ChatCommand(cp.Data, 0);
  408.                                                                 queue.Add(c.name + " " + c2.Parameters[0]);
  409.                                                             }
  410.                                                             else
  411.                                                             {
  412.                                                                 SendMessage(c, "[ERROR] You are a troll!");
  413.                                                             }
  414.                                                             #endregion
  415.                                                             break;
  416.                                                         case "kick":
  417.                                                             #region Kick
  418.                                                             if ((byte)c.rank > 4)
  419.                                                             {
  420.                                                                 if (com.Parameters.Count == 1)
  421.                                                                 {
  422.                                                                     if (users.ContainsKey(com.Parameters[0]))
  423.                                                                     {
  424.                                                                         ((Client)(users[com.Parameters[0]])).state = PenaltyState.Kicked;
  425.                                                                         try
  426.                                                                         {
  427.                                                                             byte[] kickmsg = CreatePacket(ServerPacketType.Kicked, "");
  428.                                                                             ((Client)(users[com.Parameters[0]])).sock.Send(kickmsg);
  429.                                                                             DisconnectUser(((Client)(users[com.Parameters[0]])));
  430.                                                                             users.Remove(com.Parameters[0]);
  431.                                                                             newusers = true;
  432.                                                                             queue.Add("[INFO] " + c.name + " has kicked " + com.Parameters[0] + " from the server.");
  433.                                                                         }
  434.                                                                         catch
  435.                                                                         {
  436.                                                                             ((Client)(users[com.Parameters[0]])).error = true;
  437.                                                                         }
  438.                                                                     }
  439.                                                                     else
  440.                                                                     {
  441.                                                                         SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
  442.                                                                     }
  443.                                                                 }
  444.                                                                 else
  445.                                                                 {
  446.                                                                     SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  447.                                                                 }
  448.                                                             }
  449.                                                             else
  450.                                                             {
  451.                                                                 SendMessage(c, "[ERROR] Your current rank does not allow you to kick users.");
  452.                                                             }
  453.                                                             #endregion
  454.                                                             break;
  455.                                                         case "ban":
  456.                                                             #region Ban
  457.                                                             if ((byte)c.rank > (byte)Rank.VIP)
  458.                                                             {
  459.                                                                 if (com.Parameters.Count == 1)
  460.                                                                 {
  461.                                                                     if (users.ContainsKey(com.Parameters[0]))
  462.                                                                     {
  463.                                                                         ((Client)(users[com.Parameters[0]])).state = PenaltyState.Banned;
  464.                                                                         try
  465.                                                                         {
  466.                                                                             byte[] kickmsg = CreatePacket(ServerPacketType.Banned, "");
  467.                                                                             ((Client)(users[com.Parameters[0]])).sock.Send(kickmsg);
  468.                                                                             DisconnectUser(((Client)(users[com.Parameters[0]])));
  469.                                                                             Ban b = new Ban();
  470.                                                                             b.UserName = com.Parameters[0];
  471.                                                                             b.IP = ((IPEndPoint)(((Client)(users[com.Parameters[0]])).sock.RemoteEndPoint)).Address;
  472.                                                                             try
  473.                                                                             {
  474.                                                                                 List<Ban> current = GetBanlist();
  475.                                                                                 StreamWriter writer = new StreamWriter("banned.txt");
  476.                                                                                 if (current != null)
  477.                                                                                 {
  478.                                                                                     foreach (Ban ban in current)
  479.                                                                                     {
  480.                                                                                         writer.WriteLine(ban.UserName + "|" + ban.IP.ToString());
  481.                                                                                     }
  482.                                                                                     writer.WriteLine(b.UserName + "|" + b.IP.ToString());
  483.                                                                                 }
  484.                                                                                 writer.Close();
  485.                                                                             }
  486.                                                                             catch
  487.                                                                             {
  488.                                                                                 SendMessage(c, "[ERROR] A problem occured when trying to log the ban. The targeted user may still be able to reconnect.");
  489.                                                                                 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.");
  490.                                                                             }
  491.                                                                             users.Remove(com.Parameters[0]);
  492.                                                                             newusers = true;
  493.                                                                             queue.Add("[INFO] " + c.name + " has banned " + com.Parameters[0] + " from the server.");
  494.                                                                         }
  495.                                                                         catch
  496.                                                                         {
  497.                                                                             ((Client)(users[com.Parameters[0]])).error = true;
  498.                                                                         }
  499.                                                                     }
  500.                                                                     else
  501.                                                                     {
  502.                                                                         SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
  503.                                                                     }
  504.                                                                 }
  505.                                                                 else
  506.                                                                 {
  507.                                                                     SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  508.                                                                 }
  509.                                                             }
  510.                                                             else
  511.                                                             {
  512.                                                                 SendMessage(c, "[ERROR] Your current rank does not allow you to ban users.");
  513.                                                             }
  514.                                                             #endregion
  515.                                                             break;
  516.                                                         case "mute":
  517.                                                             #region Mute
  518.                                                             if ((byte)c.rank > (byte)Rank.VIP)
  519.                                                             {
  520.                                                                 if (com.Parameters.Count == 1)
  521.                                                                 {
  522.                                                                     if (users.ContainsKey(com.Parameters[0]))
  523.                                                                     {
  524.                                                                         if ((byte)((Client)(users[com.Parameters[0]])).rank < (byte)Rank.VIP)
  525.                                                                         {
  526.                                                                             ((Client)(users[com.Parameters[0]])).state = PenaltyState.Muted;
  527.                                                                             queue.Add("[INFO] " + c.name + " has muted " + com.Parameters[0] + ".");
  528.                                                                         }
  529.                                                                         else
  530.                                                                         {
  531.                                                                             SendMessage(c, "[ERROR] You may not mute moderators or the host.");
  532.                                                                         }
  533.                                                                                                                                              
  534.                                                                     }
  535.                                                                     else
  536.                                                                     {
  537.                                                                         SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
  538.                                                                     }
  539.                                                                 }
  540.                                                                 else
  541.                                                                 {
  542.                                                                     SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  543.                                                                 }
  544.                                                             }
  545.                                                             else
  546.                                                             {
  547.                                                                 SendMessage(c, "[ERROR] Your current rank does not allow you to mute users.");
  548.                                                             }
  549.                                                             #endregion
  550.                                                             break;
  551.                                                         case "unmute":
  552.                                                             #region Unmute
  553.                                                             if ((byte)c.rank > (byte)Rank.VIP)
  554.                                                             {
  555.                                                                 if (com.Parameters.Count == 1)
  556.                                                                 {
  557.                                                                     if (users.ContainsKey(com.Parameters[0]))
  558.                                                                     {
  559.                                                                         if ((byte)((Client)(users[com.Parameters[0]])).rank < (byte)Rank.VIP)
  560.                                                                         {
  561.                                                                             ((Client)(users[com.Parameters[0]])).state = PenaltyState.None;
  562.                                                                             queue.Add("[INFO] " + c.name + " has unmuted " + com.Parameters[0] + ".");
  563.                                                                         }
  564.                                                                         else
  565.                                                                         {
  566.                                                                             SendMessage(c, "[ERROR] Moderators and the host cannot be muted anyway, so what are you playing at?!");
  567.                                                                         }
  568.                                                                     }
  569.                                                                     else
  570.                                                                     {
  571.                                                                         SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
  572.                                                                     }
  573.                                                                 }
  574.                                                                 else
  575.                                                                 {
  576.                                                                     SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  577.                                                                 }
  578.                                                             }
  579.                                                             else
  580.                                                             {
  581.                                                                 SendMessage(c, "[ERROR] Your current rank does not allow you to unmute users.");
  582.                                                             }
  583.                                                             #endregion
  584.                                                             break;
  585.                                                         case "unban":
  586.                                                             #region Unban
  587.                                                             if ((byte)c.rank > (byte)Rank.VIP)
  588.                                                             {
  589.                                                                 if (com.Parameters.Count == 1)
  590.                                                                 {
  591.                                                                             try
  592.                                                                             {
  593.                                                                                 List<Ban> current = GetBanlist();
  594.                                                                                 List<string> names = new List<string>();
  595.                                                                                 int ind = 0;
  596.                                                                                 if (current != null)
  597.                                                                                 {
  598.                                                                                     for (int i = 0; i < current.Count; i++)
  599.                                                                                     {
  600.                                                                                         if (current[i].UserName == com.Parameters[0])
  601.                                                                                         {
  602.                                                                                             ind = i;
  603.                                                                                         }
  604.                                                                                         names.Add(current[i].UserName);
  605.                                                                                     }
  606.                                                                                     if (names.Contains(com.Parameters[0]))
  607.                                                                                     {
  608.                                                                                         current.RemoveAt(ind);
  609.                                                                                         StreamWriter writer = new StreamWriter("banned.txt");
  610.                                                                                         foreach (Ban b in current)
  611.                                                                                         {
  612.                                                                                             writer.WriteLine(b.UserName + "|" + b.IP.ToString());
  613.                                                                                         }
  614.                                                                                         writer.Close();
  615.                                                                                         queue.Add("[INFO] " + c.name + " has unbanned " + com.Parameters[0] + ".");
  616.                                                                                     }
  617.                                                                                     else
  618.                                                                                     {
  619.                                                                                         SendMessage(c, "[ERROR] There is no banned user named " + com.Parameters[0] + ".");
  620.                                                                                     }
  621.                                                                                 }
  622.                                                                                 else
  623.                                                                                 {
  624.                                                                                     SendMessage(c, "[ERROR] There is no existing ban list.");
  625.                                                                                 }
  626.                                                                                
  627.                                                                             }
  628.                                                                             catch
  629.                                                                             {
  630.                                                                                 SendMessage(c, "[ERROR] A problem occured when trying to remove the ban. The targeted user may still be banned.");
  631.                                                                                 Error("A problem occured when trying to remove a ban issued to" + com.Parameters[0] + ". The targeted user may still be banned.");
  632.                                                                             }    
  633.                                                                 }
  634.                                                                 else
  635.                                                                 {
  636.                                                                     SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  637.                                                                 }
  638.                                                             }
  639.                                                             else
  640.                                                             {
  641.                                                                 SendMessage(c, "[ERROR] Your current rank does not allow you to unban users.");
  642.                                                             }
  643.                                                             #endregion
  644.                                                             break;
  645.                                                         case "getrank":
  646.                                                             #region Getrank
  647.                                                             if (com.Parameters.Count == 1)
  648.                                                                 {
  649.                                                                     if (users.ContainsKey(com.Parameters[0]))
  650.                                                                     {
  651.                                                                         SendMessage(c, "[INFO] " + ((Client)(users[com.Parameters[0]])).name + " is a " + ((Client)(users[com.Parameters[0]])).rank.ToString() + ".");
  652.                                                                     }
  653.                                                                     else
  654.                                                                     {
  655.                                                                         SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
  656.                                                                     }
  657.                                                                 }
  658.                                                                 else
  659.                                                                 {
  660.                                                                     SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 1 parameter.");
  661.                                                                 }            
  662.                                                                 #endregion
  663.                                                             break;
  664.                                                         case "rank":
  665.                                                             #region Mute
  666.                                                             if ((byte)c.rank > (byte)Rank.VIP)
  667.                                                             {
  668.                                                                 if (com.Parameters.Count == 2)
  669.                                                                 {
  670.                                                                     if (users.ContainsKey(com.Parameters[0]))
  671.                                                                     {
  672.                                                                         if ((byte)((Client)(users[com.Parameters[0]])).rank < (byte)Rank.Mod)
  673.                                                                         {
  674.                                                                             byte r;
  675.                                                                             if (Byte.TryParse(com.Parameters[1], out r))
  676.                                                                             {
  677.                                                                                 if (r == (byte)Rank.Troll || r == (byte)Rank.Noob || r == (byte)Rank.User || r == (byte)Rank.VIP || r == (byte)Rank.Mod)
  678.                                                                                 {
  679.                                                                                     ((Client)(users[com.Parameters[0]])).rank = (Rank)r;
  680.                                                                                     queue.Add("[INFO] " + c.name + " has ranked " + com.Parameters[0] + " as a " + ((Client)(users[com.Parameters[0]])).rank.ToString() + ".");
  681.                                                                                 }
  682.                                                                                 else
  683.                                                                                 {
  684.                                                                                     SendMessage(c, "[ERROR] Invalid rank. Rank numbers are numbered by the power of 2 (i.e. 1, 2, 4, 8, 16, etc.)");
  685.                                                                                 }
  686.                                                                             }
  687.                                                                             else
  688.                                                                             {
  689.                                                                                 SendMessage(c, "[ERROR] Invalid rank. Rank numbers are numbered by the power of 2 (i.e. 1, 2, 4, 8, 16, etc.)");
  690.                                                                             }
  691.                                                                         }
  692.                                                                         else
  693.                                                                         {
  694.                                                                             SendMessage(c, "[ERROR] You may not change the ranks of moderators or the host.");
  695.                                                                         }
  696.  
  697.                                                                     }
  698.                                                                     else
  699.                                                                     {
  700.                                                                         SendMessage(c, "[ERROR] No user with the name \"" + com.Parameters[0] + "\" exists.");
  701.                                                                     }
  702.                                                                 }
  703.                                                                 else
  704.                                                                 {
  705.                                                                     SendMessage(c, "[ERROR] Invalid parameter count '" + com.Parameters.Count + "'. This command takes 2 parameters.");
  706.                                                                 }
  707.                                                             }
  708.                                                             else
  709.                                                             {
  710.                                                                 SendMessage(c, "[ERROR] Your current rank does not allow you to rank users.");
  711.                                                             }
  712.                                                             #endregion
  713.                                                             break;
  714.                                                         case "topic":
  715.                                                             #region Topic
  716.                                                             if (c.rank == Rank.Host)
  717.                                                             {
  718.                                                                 ChatCommand c2 = new ChatCommand(cp.Data, 0);
  719.                                                                 motd = c2.Parameters[0];
  720.                                                                 SaveMOTD(motd);
  721.                                                                 newmotd = true;
  722.                                                             }
  723.                                                             else
  724.                                                             {
  725.                                                                 SendMessage(c, "[ERROR] Only the host can change the topic.");
  726.                                                             }
  727.                                                             #endregion
  728.                                                             break;
  729.                                                     }
  730.                                                 }
  731.                                                 else
  732.                                                 {
  733.                                                     queue.Add(c.name + ": " + cp.Data);
  734.                                                 }
  735.                                                 break;
  736.                                             case ClientPacketType.Leaving:
  737.                                                 queue.Add(c.name + " left the server.");
  738.                                                 DisconnectUser(c);
  739.                                                 users.Remove(c.name);
  740.                                                 newusers = true;
  741.                                                 invalid = true;
  742.                                                 break;
  743.                                             default:
  744.                                                 break;
  745.                                         }
  746.                                     }
  747.                                     else
  748.                                     {
  749.                                         invalid = true;
  750.                                     }
  751.                                 }
  752.                             }
  753.                             else
  754.                             {
  755.                                 invalid = true;
  756.                             }
  757.                             ns.Close();
  758.                         }
  759.                     }
  760.                 }
  761.                 catch
  762.                 {
  763.                     c.error = true;
  764.                 }
  765.             }
  766.         }
  767.         static void DisconnectUser(Client c)
  768.         {
  769.             c.sock.Shutdown(SocketShutdown.Both);
  770.             c.sock.Close();
  771.         }
  772.         static void SendMessage(Client c, string message)
  773.         {
  774.             byte[] m = CreatePacket(ServerPacketType.ChatPost, message);
  775.             c.sock.Send(m);            
  776.         }
  777.         static byte[] CreatePacket(ServerPacketType type, string info)
  778.         {
  779.             byte[] a = new byte[] { (byte)type };
  780.             byte[] b = Encoding.ASCII.GetBytes(info);
  781.             byte[] c = info.Length > 0 ? a.Concat(b).ToArray() : a;
  782.             MemoryStream ms = new MemoryStream();
  783.             ms.Write(BitConverter.GetBytes(c.Length), 0, 4);
  784.             ms.Write(c, 0, c.Length);
  785.             ms.Position = 0;
  786.             byte[] final = new byte[ms.Length];            
  787.             ms.Read(final, 0, (int)ms.Length);
  788.             return final;
  789.         }
  790.  
  791.         static List<Ban> GetBanlist()
  792.         {
  793.             if (File.Exists("banned.txt"))
  794.             {
  795.                 List<Ban> list = new List<Ban>();
  796.                 StreamReader sr = new StreamReader("banned.txt");
  797.                 string raw = sr.ReadToEnd();
  798.                 sr.Close();
  799.                 string[] sl = raw.Split('\n');
  800.                 foreach (string s in sl)
  801.                 {
  802.                     int ind = s.LastIndexOf("|");
  803.                     if (ind > -1)
  804.                     {
  805.                         string n = Split(s, 0, ind);
  806.                         IPAddress ip;
  807.                         if (!IPAddress.TryParse(Split(s, ind + 1, s.Length), out ip))
  808.                         {
  809.                             continue;
  810.                         }
  811.                         else
  812.                         {
  813.                             Ban b = new Ban();
  814.                             b.UserName = n;
  815.                             b.IP = ip;
  816.                             list.Add(b);
  817.                         }
  818.                     }
  819.                 }
  820.                 return list;
  821.             }
  822.             else
  823.             {
  824.                 return null;
  825.             }
  826.         }
  827.         static List<UserSpec> GetUserSpeclist()
  828.         {
  829.             if (File.Exists("users.txt"))
  830.             {
  831.                 List<UserSpec> list = new List<UserSpec>();
  832.                 StreamReader sr = new StreamReader("users.txt");
  833.                 string raw = sr.ReadToEnd();
  834.                 sr.Close();
  835.                 string[] sl = raw.Split('\n');
  836.                 foreach (string s in sl)
  837.                 {
  838.                     int ind = s.LastIndexOf("|");
  839.                     if (ind > -1)
  840.                     {
  841.                         byte rank;
  842.                         IPAddress ip;
  843.                         if (!IPAddress.TryParse(Split(s, 0, ind), out ip) || !Byte.TryParse(Split(s, ind + 1, s.Length), out rank))
  844.                         {
  845.                             continue;
  846.                         }
  847.                         else
  848.                         {
  849.                             UserSpec b = new UserSpec();
  850.                             if (rank > 0 && rank < 33)
  851.                             {
  852.                                 b.r = (Rank)rank;
  853.                             }
  854.                             else
  855.                             {
  856.                                 b.r = (Rank)4;
  857.                             }
  858.                             b.IP = ip;
  859.                             list.Add(b);
  860.                         }
  861.                     }
  862.                 }
  863.                 return list;
  864.             }
  865.             else
  866.             {
  867.                 return null;
  868.             }
  869.         }
  870.         static string GetMOTD()
  871.         {
  872.             if (File.Exists("motd.txt"))
  873.             {
  874.                 try
  875.                 {
  876.                     StreamReader sr = new StreamReader("motd.txt");
  877.                     string t = sr.ReadToEnd();
  878.                     sr.Close();
  879.                     return t;
  880.                 }
  881.                 catch
  882.                 {
  883.                     return "No Topic";
  884.                 }
  885.             }
  886.             else
  887.             {
  888.                 return "No Topic";
  889.             }
  890.         }
  891.         static bool SaveMOTD(string str)
  892.         {
  893.             try
  894.             {
  895.                 StreamWriter sr = new StreamWriter("motd.txt");
  896.                 sr.Write(str);
  897.                 sr.Close();
  898.                 return true;
  899.             }
  900.             catch
  901.             {
  902.                 return false;
  903.             }
  904.         }
  905.         static string GetRankSymbol(Rank rank)
  906.         {
  907.             switch (rank)
  908.             {
  909.                 case Rank.Troll:
  910.                     return "#";
  911.                 case Rank.Noob:
  912.                     return "?";
  913.                 case Rank.User:
  914.                     return "";
  915.                 case Rank.VIP:
  916.                     return "+";
  917.                 case Rank.Mod:
  918.                     return "$";
  919.                 case Rank.Host:
  920.                     return "@";
  921.                 default:
  922.                     return "";
  923.             }
  924.         }
  925.         public static string Split(string parent, int start, int end)
  926.         {
  927.             return parent.Substring(start, end - start);
  928.         }
  929.     }
  930.     public enum Rank
  931.     {
  932.         Troll = 1,
  933.         Noob = 2,
  934.         User = 4,
  935.         VIP = 8,
  936.         Mod = 16,
  937.         Host = 32
  938.     }
  939.     public enum ServerPacketType : byte
  940.     {
  941.         ChatPost = 0,
  942.         Accepted = 1,
  943.         Rejected = 2,
  944.         Kicked = 3,
  945.         Banned = 4,
  946.         Shutdown = 5,
  947.         MOTD = 6,
  948.         UserList = 7,
  949.         Muted = 8,
  950.         Unmuted = 9,
  951.         RequestPassword = 10,
  952.         RequestUsername = 11
  953.     }
  954.     public enum ClientPacketType : byte
  955.     {
  956.         ChatPost = 0,
  957.         Username = 1,
  958.         Password = 2,
  959.         Leaving = 3
  960.     }
  961.     public enum PenaltyState
  962.     {
  963.         None = 0,
  964.         Muted = 1,
  965.         Kicked = 2,
  966.         Banned = 3
  967.     }
  968.     public class Client
  969.     {
  970.         public Socket sock;
  971.         public PenaltyState state = PenaltyState.None;
  972.         public bool error = false;        
  973.         public string name;
  974.         public Rank rank;
  975.     }
  976.     public struct Ban
  977.     {
  978.         public string UserName;
  979.         public IPAddress IP;
  980.     }
  981.     public struct UserSpec
  982.     {
  983.         public IPAddress IP;
  984.         public Rank r;
  985.     }
  986.     public class ChatCommand
  987.     {
  988.         string cmd;
  989.         string name;
  990.         List<string> pmts;
  991.         public bool Invalid = false;
  992.         public ChatCommand(string command)
  993.         {
  994.             if (!command.StartsWith("/"))
  995.             {
  996.                 Invalid = true;
  997.             }
  998.             else
  999.             {
  1000.                 cmd = command;
  1001.                 List<string> pts = command.Split(' ').ToList();
  1002.                 name = pts[0].Substring(1);
  1003.                 pts.RemoveAt(0);
  1004.                 pmts = pts;
  1005.             }
  1006.         }
  1007.         public ChatCommand(string command, int combineStart)
  1008.         {
  1009.             if (!command.StartsWith("/"))
  1010.             {
  1011.                 Invalid = true;
  1012.             }
  1013.             else
  1014.             {
  1015.                 cmd = command;
  1016.                 List<string> pts = command.Split(' ').ToList();
  1017.                 name = pts[0].Substring(1);
  1018.                 pts.RemoveAt(0);
  1019.                 string last = "";
  1020.                 for (int i = pts.Count - 1; i >= combineStart; i--)
  1021.                 {
  1022.                     last = pts[i] + " " + last;
  1023.                 }
  1024.                 last = last.Substring(0, last.Length - 1);
  1025.                 pts.Clear();
  1026.                 pts.Add(last);
  1027.                 pmts = pts;
  1028.             }
  1029.         }
  1030.         public List<string> Parameters
  1031.         {
  1032.             get { return pmts; }
  1033.         }
  1034.         public string CommandName
  1035.         {
  1036.             get { return name; }
  1037.         }
  1038.         public string CommandString
  1039.         {
  1040.             get { return cmd; }
  1041.         }
  1042.     }
  1043.  
  1044.     public class ServerCommand
  1045.     {
  1046.         string cmd;
  1047.         string name;
  1048.         List<string> pmts;
  1049.         public ServerCommand(string command)
  1050.         {            
  1051.             cmd = command;
  1052.             List<string> pts = command.Split(' ').ToList();
  1053.             name = pts[0];
  1054.             pts.RemoveAt(0);
  1055.             pmts = pts;
  1056.         }
  1057.         public ServerCommand(string command, int combineStart)
  1058.         {            
  1059.             cmd = command;
  1060.             List<string> pts = command.Split(' ').ToList();
  1061.             name = pts[0].Substring(1);
  1062.             pts.RemoveAt(0);
  1063.             string last = "";
  1064.             for (int i = pts.Count - 1; i >= combineStart; i--)
  1065.             {
  1066.                 last = pts[i] + " " + last;
  1067.             }
  1068.             last = last.Substring(0, last.Length - 1);
  1069.             pts.Clear();
  1070.             pts.Add(last);
  1071.             pmts = pts;
  1072.         }
  1073.         public List<string> Parameters
  1074.         {
  1075.             get { return pmts; }
  1076.         }
  1077.         public string CommandName
  1078.         {
  1079.             get { return name; }
  1080.         }
  1081.         public string CommandString
  1082.         {
  1083.             get { return cmd; }
  1084.         }
  1085.     }
  1086.  
  1087.     public class ClientPacket
  1088.     {
  1089.         static int ln = 0;
  1090.         static ClientPacketType type = ClientPacketType.Leaving;
  1091.         static string data = "";
  1092.         public static ClientPacket Parse(byte[] buffer)
  1093.         {
  1094.             if (buffer.Length > 4)
  1095.             {
  1096.                 MemoryStream ms = new MemoryStream(buffer);
  1097.                 byte[] a = new byte[4];
  1098.                 ms.Read(a, 0, 4);
  1099.                 ln = BitConverter.ToInt32(a, 0);
  1100.                 byte[] b = new byte[1];
  1101.                 ms.Read(b, 0, 1);
  1102.                 byte bb = b[0];
  1103.                 if (bb < 4)
  1104.                 {
  1105.                     type = (ClientPacketType)bb;
  1106.                 }
  1107.                 else
  1108.                 {
  1109.                     return null;
  1110.                 }
  1111.                 if (buffer.Length > 5)
  1112.                 {
  1113.                     byte[] c = new byte[buffer.Length - 5];
  1114.                     ms.Read(c, 0, c.Length);
  1115.                     data = Encoding.ASCII.GetString(c);
  1116.                 }
  1117.                 ClientPacket packet = new ClientPacket();
  1118.                 packet.Length = ln;
  1119.                 packet.PacketType = type;
  1120.                 packet.Data = data;
  1121.                 return packet;
  1122.             }
  1123.             else
  1124.             {
  1125.                 return null;
  1126.             }            
  1127.         }
  1128.         public int Length
  1129.         {
  1130.             get { return ln; }
  1131.             set { ln = value; }
  1132.         }
  1133.         public ClientPacketType PacketType
  1134.         {
  1135.             get { return type; }
  1136.             set { type = value; }
  1137.         }
  1138.         public string Data
  1139.         {
  1140.             get { return data; }
  1141.             set { data = value; }
  1142.         }
  1143.     }
  1144.      
  1145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement