Advertisement
Guest User

Untitled

a guest
Mar 6th, 2019
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 25.31 KB | None | 0 0
  1. --program--
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Windows.Forms;
  5.  
  6. namespace ChatServer
  7. {
  8. static class Program
  9. {
  10. /// <summary>
  11. /// The main entry point for the application.
  12. /// </summary>
  13. [STAThread]
  14. static void Main()
  15. {
  16. Application.EnableVisualStyles();
  17. Application.SetCompatibleTextRenderingDefault(false);
  18. Application.Run(new Form1());
  19. }
  20. }
  21. }
  22.  
  23. --ChatServer--
  24. using System;
  25. using System.Collections.Generic;
  26. using System.Text;
  27. using System.Net;
  28. using System.Net.Sockets;
  29. using System.IO;
  30. using System.Threading;
  31. using System.Collections;
  32. using System.Windows.Forms;
  33.  
  34. namespace ChatServer
  35. {
  36. //AdminTools, and Server options. v
  37. public static class Options
  38. {
  39. //lets you set how many users can be connected at once.
  40. public static int maxConnections = 100;
  41. //all the accepted charicters that can be in a nickname
  42. public static string acceptedNicknameCharicters =@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_\[]{}^";
  43. //self explainitory
  44. public static int maxCharictersInNickname = 10;
  45.  
  46. }
  47. public static class AdminTools
  48. {
  49. //you can disconnect a user with this.
  50. public static void disconnectUser(string Nick, string reason)
  51. {
  52. string nickToKill = Nick;
  53. foreach (var c in Lists.getConnectionByNick)
  54. {
  55. if (c.Key.ToLower() == Nick.ToLower())
  56. {
  57. nickToKill = c.Key;
  58. }
  59. }
  60. if (Lists.getConnectionByNick.ContainsKey(nickToKill))
  61. {
  62. ChatServer.SendAdminMessage(reason);
  63. Lists.getConnectionByNick[nickToKill].CloseConnection();
  64. }
  65. }
  66. //mute users with this
  67. public static void muteUser(string nick, string adminNick)
  68. {
  69. string nIck = nick;
  70. foreach (var c in Lists.getConnectionByNick)
  71. {
  72. if (c.Key.ToLower() == nick.ToLower())
  73. {
  74. nIck = c.Key;
  75. }
  76. }
  77. if (Lists.mutedUsers.ContainsKey(nIck))
  78. {
  79. ChatServer.SendAdminMessage(nIck + " has been muted by "+adminNick);
  80. Lists.mutedUsers[nIck] = true;
  81. }
  82. else
  83. {
  84. if (ChatServer.htUsers.ContainsKey(nIck))
  85. {
  86. ChatServer.SendAdminMessage(nIck + " has been muted by " + adminNick);
  87. Lists.mutedUsers.Add(nIck, true);
  88. }
  89. }
  90. }
  91. //unmute users with this
  92. public static void unMuteUser(string nick, string adminNick)
  93. {
  94. string nIck = nick;
  95. foreach (var c in Lists.getConnectionByNick)
  96. {
  97. if (c.Key.ToLower() == nick.ToLower())
  98. {
  99. nIck = c.Key;
  100. }
  101. }
  102. if (Lists.mutedUsers.ContainsKey(nIck))
  103. {
  104. ChatServer.SendAdminMessage(nIck + " has been unmuted by " + adminNick);
  105. Lists.mutedUsers.Remove(nIck);
  106. }
  107. else
  108. {
  109. Lists.getConnectionByNick[adminNick].sendMessageToUser("---The Nickname Isnt Muted");
  110. }
  111. }
  112. //just another version of SendAdminMessage
  113. public static void sendNotice(string message)
  114. {
  115. ChatServer.SendAdminMessage(message);
  116. }
  117. //send a notice to only one user.
  118. public static void sendPrivateNotice(string nickToNotice, string message)
  119. {
  120. if (Lists.getConnectionByNick.ContainsKey(nickToNotice))
  121. Lists.getConnectionByNick[nickToNotice].sendMessageToUser("---<private notice> " + message);
  122. }
  123. //mimic any nickname on the network (or a non existant one)
  124. public static void mimicUser(string nickToMimic, string message)
  125. {
  126. string[] args = { };
  127. ChatServer.OnCommand(Lists.MessageType.Message, "Administrator", "<" + nickToMimic + "> " + message, args);
  128. }
  129. //msg all online admins
  130. public static void msgAllOnlineAdmins(string message)
  131. {
  132. foreach (var a in Lists.OnlineAdmins)
  133. {
  134. a.Value.sendMessageToUser("---Notice To Admins: " + message);
  135. }
  136. }
  137. //temparaily add an admin
  138. public static void addTempAdmin(string username, string password)
  139. {
  140. Lists.Admins.Add(username, password);
  141. }
  142. //temaraily delete an admins permissions.
  143. public static void tempDelAdmin(string username)
  144. {
  145. string adminNick = "";
  146. string adminUser = username;
  147. foreach (var a in Lists.OnlineAdmins)
  148. {
  149. if (a.Value.currUserAdmin == adminUser)
  150. {
  151. adminNick = a.Value.currUser;
  152. }
  153. }
  154. Lists.Admins.Remove(adminUser);
  155. Lists.OnlineAdmins.Remove(adminNick);
  156. }
  157. }
  158. //AdminTools, and Server options. ^
  159.  
  160. #region ConnectionStuff
  161. public class StatusChangedEventArgs : EventArgs
  162. {
  163. private string EventMsg;
  164. public string EventMessage
  165. {
  166. get
  167. {
  168. return EventMsg;
  169. }
  170. set
  171. {
  172. EventMsg = value;
  173. }
  174. }
  175. public StatusChangedEventArgs(string strEventMsg)
  176. {
  177. EventMsg = strEventMsg;
  178. }
  179. }
  180. public delegate void StatusChangedEventHandler(object sender, StatusChangedEventArgs e);
  181. public static class Lists
  182. {
  183. public static Dictionary<string, Connection> getConnectionByNick = new Dictionary<string, Connection>();
  184. public static Dictionary<Connection, string> getNickByConnection = new Dictionary<Connection, string>();
  185. public static Dictionary<string, bool> mutedUsers = new Dictionary<string, bool>();
  186. public static void addConnection(string nickname, Connection connect)
  187. {
  188. getConnectionByNick.Add(nickname, connect);
  189. getNickByConnection.Add(connect, nickname);
  190. }
  191. public static void removeConnection(Connection connect)
  192. {
  193. try
  194. {
  195. getConnectionByNick.Remove(getNickByConnection[connect]);
  196. getNickByConnection.Remove(connect);
  197. }
  198. catch { }
  199. }
  200. public enum MessageType { Action, Message, PrivateMessage, AdminAction, Notice }
  201. public static Dictionary<string, string> Admins = new Dictionary<string, string>();
  202. public static Dictionary<string, Connection> OnlineAdmins = new Dictionary<string, Connection>();
  203. }
  204. class ChatServer
  205. {
  206. public static Hashtable htUsers = new Hashtable(Options.maxConnections);
  207. public static Hashtable htConnections = new Hashtable(Options.maxConnections);
  208. private IPAddress ipAddress;
  209. private TcpClient tcpClient;
  210. public static event StatusChangedEventHandler StatusChanged;
  211. private static StatusChangedEventArgs e;
  212. public ChatServer(IPAddress address)
  213. {
  214. ipAddress = address;
  215. }
  216. private Thread thrListener;
  217. private TcpListener tlsClient;
  218. bool ServRunning = false;
  219. public static void AddUser(TcpClient tcpUser, string strUsername, Connection connect)
  220. {
  221. SendAdminMessage(strUsername + " connected.");
  222. ChatServer.htUsers.Add(strUsername, tcpUser);
  223. ChatServer.htConnections.Add(tcpUser, strUsername);
  224. Lists.addConnection(strUsername, connect);
  225. }
  226. public static void RemoveUser(TcpClient tcpUser)
  227. {
  228. if (htConnections[tcpUser] != null)
  229. {
  230. string nick = (string)htConnections[tcpUser];
  231. htUsers.Remove(htConnections[tcpUser]);
  232. htConnections.Remove(tcpUser);
  233. foreach (var c in Lists.getConnectionByNick)
  234. {
  235. if (c.Value.tcpClient == tcpUser)
  236. {
  237. Lists.removeConnection(c.Value);
  238. break;
  239. }
  240. }
  241. SendAdminMessage(nick+" disconnected.");
  242. }
  243. }
  244. public static void OnStatusChanged(StatusChangedEventArgs e)
  245. {
  246. StatusChangedEventHandler statusHandler = StatusChanged;
  247. if (statusHandler != null)
  248. {
  249. statusHandler(null, e);
  250. }
  251. }
  252. public static void SendAdminMessage(string Message)
  253. {
  254. StreamWriter swSenderSender;
  255. e = new StatusChangedEventArgs("--- " + Message);
  256. OnStatusChanged(e);
  257. TcpClient[] tcpClients = new TcpClient[ChatServer.htUsers.Count];
  258. ChatServer.htUsers.Values.CopyTo(tcpClients, 0);
  259. for (int i = 0; i < tcpClients.Length; i++)
  260. {
  261. try
  262. {
  263. if (Message.Trim() == "" || tcpClients[i] == null)
  264. {
  265. continue;
  266. }
  267. swSenderSender = new StreamWriter(tcpClients[i].GetStream());
  268. swSenderSender.WriteLine("--- " + Message);
  269. swSenderSender.Flush();
  270. swSenderSender = null;
  271. }
  272. catch
  273. {
  274. RemoveUser(tcpClients[i]);
  275. }
  276. }
  277. }
  278. private static bool isMuted(string nickname)
  279. {
  280. if (Lists.mutedUsers.ContainsKey(nickname))
  281. {
  282. if (Lists.mutedUsers[nickname] == true)
  283. {
  284. if (htUsers.ContainsKey(nickname))
  285. {
  286. return true;
  287. }
  288. else
  289. {
  290. Lists.mutedUsers.Remove(nickname);
  291. return false;
  292. }
  293. }
  294. else
  295. {
  296. return false;
  297. }
  298. }
  299. else
  300. {
  301. return false;
  302. }
  303. }
  304. private static void SendMessage(string From, string Message)
  305. {
  306. if (isMuted(From))
  307. {
  308. if (Lists.getConnectionByNick.ContainsKey(From))
  309. {
  310. Lists.getConnectionByNick[From].sendMessageToUser("You are muted, so you cannot talk.");
  311. e = new StatusChangedEventArgs("Muted user> " + Message);
  312. OnStatusChanged(e);
  313. AdminTools.msgAllOnlineAdmins("Muted user> " + Message);
  314. }
  315. }
  316. else
  317. {
  318. StreamWriter swSenderSender;
  319. e = new StatusChangedEventArgs(Message);
  320. OnStatusChanged(e);
  321. TcpClient[] tcpClients = new TcpClient[ChatServer.htUsers.Count];
  322. ChatServer.htUsers.Values.CopyTo(tcpClients, 0);
  323. for (int i = 0; i < tcpClients.Length; i++)
  324. {
  325. try
  326. {
  327. if (Message.Trim() == "" || tcpClients[i] == null)
  328. {
  329. continue;
  330. }
  331. swSenderSender = new StreamWriter(tcpClients[i].GetStream());
  332. swSenderSender.WriteLine(Message);
  333. swSenderSender.Flush();
  334. swSenderSender = null;
  335. }
  336. catch
  337. {
  338. RemoveUser(tcpClients[i]);
  339. }
  340. }
  341. }
  342. }
  343. public static void OnCommand(Lists.MessageType messageType, string nick, string message, string[] args)
  344. {
  345. if (messageType == Lists.MessageType.Message)
  346. {
  347. if (Lists.OnlineAdmins.ContainsKey(nick))
  348. SendMessage(nick, "<" + nick + " (Admin)> " + message);
  349. else
  350. SendMessage(nick, "<" + nick + "> " + message);
  351. }
  352. else if (messageType == Lists.MessageType.Action)
  353. {
  354. SendMessage(nick, "* " + nick + " " + message);
  355. }
  356. else if (messageType == Lists.MessageType.AdminAction)
  357. {
  358. if(Lists.Admins.ContainsKey(args[0]))
  359. {
  360. if (Lists.Admins[args[0]] == args[1])
  361. {
  362. if (Lists.OnlineAdmins.ContainsKey(nick)){}
  363. else
  364. {
  365. Lists.getConnectionByNick[nick].sendMessageToUser("---You have successfully logged in as "+args[0]);
  366. SendAdminMessage("Room Admin " + args[0] + " now online (" + nick + ")");
  367. Lists.OnlineAdmins.Add(nick, Lists.getConnectionByNick[nick]);
  368. Lists.getConnectionByNick[nick].currUserAdmin = args[0];
  369. }
  370. AdminAction(nick, message, args);
  371. return;
  372. }
  373. }
  374. Lists.getConnectionByNick[nick].sendMessageToUser("---Login Incorrect");
  375. AdminTools.msgAllOnlineAdmins("Failed Administrative Login by " + nick + " using user '" + args[0] + "'.");
  376. }
  377. else if (messageType == Lists.MessageType.Notice)
  378. {
  379. SendMessage(nick, "* " + nick + ": " + message+" *");
  380. }
  381. }
  382. private static void AdminAction(string adminNick, string action, string[] args)
  383. {
  384. List<string> splitArray = new List<string>(action.Split(new char[] { ' ' }));
  385. string command = splitArray[0].ToUpper();
  386. splitArray.RemoveAt(0);
  387. if (command == "KILL")
  388. {
  389. string nick = splitArray[0];
  390. splitArray.RemoveAt(0);
  391. string reason = String.Join(" ",splitArray.ToArray());
  392. AdminTools.disconnectUser(nick, "User "+nick+" has been Disconnected by "+adminNick+" ("+reason+").");
  393. }
  394. else if (command == "MUTE")
  395. {
  396. string nick = splitArray[0];
  397. splitArray.RemoveAt(0);
  398. string reason = String.Join(" ", splitArray.ToArray());
  399. AdminTools.muteUser(nick, adminNick);
  400. }
  401. else if (command == "UNMUTE")
  402. {
  403. string nick = splitArray[0];
  404. splitArray.RemoveAt(0);
  405. string reason = String.Join(" ", splitArray.ToArray());
  406. AdminTools.unMuteUser(nick, adminNick);
  407. }
  408. }
  409. public void StartListening()
  410. {
  411. IPAddress ipaLocal = ipAddress;
  412. tlsClient = new TcpListener(1986);
  413. tlsClient.Start();
  414. Lists.Admins.Add("Admin", "123987");
  415. Lists.Admins.Add("user2", "password");
  416. Lists.Admins.Add("user3", "password");
  417. ServRunning = true;
  418. thrListener = new Thread(KeepListening);
  419. thrListener.Start();
  420. }
  421. private void KeepListening()
  422. {
  423. while (ServRunning == true)
  424. {
  425. tcpClient = tlsClient.AcceptTcpClient();
  426. Connection newConnection = new Connection(tcpClient);
  427. }
  428. }
  429. }
  430. public class Connection
  431. {
  432. public TcpClient tcpClient;
  433. private Thread thrSender;
  434. private StreamReader srReceiver;
  435. private StreamWriter swSender;
  436. public string currUser;
  437. public string currUserAdmin;
  438. private bool hasConnectedYet = false;
  439. private string strResponse;
  440. public Connection(TcpClient tcpCon)
  441. {
  442. tcpClient = tcpCon;
  443. thrSender = new Thread(AcceptClient);
  444. thrSender.Start();
  445. }
  446. public void CloseConnection()
  447. {
  448. if (hasConnectedYet)
  449. {
  450. if (Lists.OnlineAdmins.ContainsKey(currUser))
  451. {
  452. Lists.OnlineAdmins.Remove(currUser);
  453. ChatServer.SendAdminMessage("Room Admin " + currUser + " Left and Logged Out");
  454. }
  455. ChatServer.RemoveUser(tcpClient);
  456. }
  457. tcpClient.Close();
  458. srReceiver.Close();
  459. swSender.Close();
  460. thrSender.Abort();
  461. }
  462. private bool isValidNickname(string nick)
  463. {
  464. string AcceptedCharicters = Options.acceptedNicknameCharicters;
  465. bool isValid = true;
  466. char[] array = nick.ToCharArray();
  467. foreach (char c in array)
  468. {
  469. if (AcceptedCharicters.Contains(c.ToString())) { }
  470. else
  471. {
  472. isValid = false;
  473. }
  474. }
  475. return isValid;
  476. }
  477. public void sendMessageToUser(string rawMessage)
  478. {
  479. swSender.WriteLine(rawMessage);
  480. swSender.Flush();
  481. }
  482. private void AcceptClient()
  483. {
  484. srReceiver = new System.IO.StreamReader(tcpClient.GetStream());
  485. swSender = new System.IO.StreamWriter(tcpClient.GetStream());
  486. currUser = srReceiver.ReadLine();
  487. if (currUser != "")
  488. {
  489. if (ChatServer.htUsers.Contains(currUser) == true)
  490. {
  491. swSender.WriteLine("0|This nickname is in use.");
  492. swSender.Flush();
  493. CloseConnection();
  494. return;
  495. }
  496. else if (currUser.ToLower() == "administrator" || currUser.ToLower() == "server" || currUser.ToLower() == "console" || currUser.ToLower() == "owner" || currUser.ToLower() == "admin")
  497. {
  498. swSender.WriteLine("0|This nickname is unavailable.");
  499. swSender.Flush();
  500. CloseConnection();
  501. return;
  502. }
  503. else if (isValidNickname(currUser) == false)
  504. {
  505. swSender.WriteLine("0|This nickname contains invalid characters.");
  506. swSender.Flush();
  507. CloseConnection();
  508. return;
  509. }
  510. else if (currUser.Length > Options.maxCharictersInNickname)
  511. {
  512. swSender.WriteLine("0|This nickname has too many characters.");
  513. swSender.Flush();
  514. CloseConnection();
  515. return;
  516. }
  517. else
  518. {
  519. hasConnectedYet = true;
  520. ChatServer.AddUser(tcpClient, currUser, this);
  521. swSender.WriteLine("1");
  522. swSender.Flush();
  523. swSender.WriteLine("Welcome To The Network. Make Sure You Don't Spam");
  524. swSender.WriteLine("--- You Have Successfully Connected ---");
  525. swSender.Flush();
  526. }
  527. }
  528. else
  529. {
  530. CloseConnection();
  531. return;
  532. }
  533.  
  534. try
  535. {
  536. while ((strResponse = srReceiver.ReadLine()) != "")
  537. {
  538. if (strResponse == null)
  539. {
  540. CloseConnection();
  541. }
  542. else
  543. {
  544. ProcessMessage(strResponse);
  545. }
  546. }
  547. }
  548. catch
  549. {
  550. CloseConnection();
  551. }
  552. }
  553. private void ProcessMessage(string rawMessage)
  554. {
  555. List<string> splitArray = new List<string>(rawMessage.Split(new char[] { ':' }));
  556. string command = splitArray[0];
  557. splitArray.RemoveAt(0);
  558. string message = String.Join(":", splitArray.ToArray());
  559. splitArray = new List<string>(command.Split(new char[] { ' ' }));
  560. command = splitArray[0];
  561. splitArray.RemoveAt(0);
  562. string[] commandArgs = splitArray.ToArray();
  563.  
  564. if (command == "MSG")
  565. {
  566. ChatServer.OnCommand(Lists.MessageType.Message, currUser, message, commandArgs);
  567. }
  568. else if (command == "ACTION")
  569. {
  570. ChatServer.OnCommand(Lists.MessageType.Action, currUser, message, commandArgs);
  571. }
  572. else if (command == "ADMIN")
  573. {
  574. ChatServer.OnCommand(Lists.MessageType.AdminAction, currUser, message, commandArgs);
  575. }
  576. else if (command == "NOTICE")
  577. {
  578. ChatServer.OnCommand(Lists.MessageType.Notice, currUser, message, commandArgs);
  579. }
  580. }
  581. }
  582. #endregion
  583. }
  584.  
  585. --Form1--
  586. using System;
  587. using System.Collections.Generic;
  588. using System.ComponentModel;
  589. using System.Data;
  590. using System.Drawing;
  591. using System.Text;
  592. using System.Windows.Forms;
  593. using System.Threading;
  594. using System.Net;
  595. using System.Net.Sockets;
  596. using System.IO;
  597.  
  598. namespace ChatServer
  599. {
  600. public partial class Form1 : Form
  601. {
  602. private delegate void UpdateStatusCallback(string strMessage);
  603. public Form1()
  604. {
  605. InitializeComponent();
  606. this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
  607. }
  608. void Form1_FormClosing(object sender, FormClosingEventArgs e)
  609. {
  610. Environment.Exit(0);
  611. }
  612. private void btnListen_Click(object sender, EventArgs e)
  613. {
  614. IPAddress ipAddr = IPAddress.Parse(txtIp.Text);
  615. ChatServer mainServer = new ChatServer(ipAddr);
  616. ChatServer.StatusChanged += new StatusChangedEventHandler(mainServer_StatusChanged);
  617. mainServer.StartListening();
  618. btnListen.Enabled = false;
  619. txtIp.Enabled = false;
  620. Name1.Start();
  621. MessageBox.Show("Note, Default Administrative Username and password is. Username: Admin, Password: 123987", "Default Admin Username/Pass");
  622. }
  623. public void mainServer_StatusChanged(object sender, StatusChangedEventArgs e)
  624. {
  625. this.Invoke(new UpdateStatusCallback(this.UpdateStatus), new object[] { e.EventMessage });
  626. }
  627. private void UpdateStatus(string strMessage)
  628. {
  629. txtLog.AppendText(strMessage + "\r\n");
  630. }
  631.  
  632. private void Form1_Load(object sender, EventArgs e)
  633. {
  634. this.Text = "Chat Server";
  635. }
  636.  
  637. private void button1_Click(object sender, EventArgs e)
  638. {
  639. ChatServer.SendAdminMessage(textBox1.Text);
  640. textBox1.Clear();
  641. textBox1.Text = "Message here";
  642. }
  643.  
  644. private void button2_Click(object sender, EventArgs e)
  645. {
  646. AdminTools.tempDelAdmin(textBox2.Text);
  647. textBox2.Clear();
  648. textBox2.Text = "Admin Nick Here";
  649. }
  650.  
  651. private void button3_Click(object sender, EventArgs e)
  652. {
  653. AdminTools.muteUser(textBox3.Text, "Server");
  654. textBox3.Clear();textBox3.Text = "Nick here";
  655. }
  656.  
  657. private void button4_Click(object sender, EventArgs e)
  658. {
  659. AdminTools.unMuteUser(textBox4.Text, "Server");
  660. textBox4.Clear();textBox4.Text = "Nick here";
  661. }
  662.  
  663. private void button5_Click(object sender, EventArgs e)
  664. {
  665. AdminTools.disconnectUser(textBox5.Text,null);
  666. textBox5.Clear();textBox5.Text = "Nick here";
  667. }
  668.  
  669. private void button6_Click(object sender, EventArgs e)
  670. {
  671. AdminTools.mimicUser(textBox6.Text, textBox7.Text);
  672. textBox6.Clear();textBox7.Clear();textBox6.Text = "Nick";textBox7.Text = "Message";
  673. }
  674.  
  675. private void button7_Click(object sender, EventArgs e)
  676. {
  677. AdminTools.addTempAdmin(textBox8.Text, textBox9.Text);
  678. textBox8.Clear();textBox9.Clear();textBox8.Text = ""; textBox9.Text = "";
  679. }
  680.  
  681. private void Name1_Tick(object sender, EventArgs e)
  682. {
  683. this.Text = "Running...";
  684. Name2.Start();
  685. Name1.Stop();
  686. }
  687.  
  688. private void Name2_Tick(object sender, EventArgs e)
  689. {
  690. this.Text = "Services Hosted By: " + txtIp.Text;
  691. Name3.Start();
  692. Name2.Stop();
  693. }
  694.  
  695. private void Name3_Tick(object sender, EventArgs e)
  696. {
  697. this.Text = "Running..." + txtIp.Text;
  698. Name1.Start();
  699. Name3.Stop();
  700. }
  701.  
  702. }
  703. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement