Guest User

Untitled

a guest
Oct 17th, 2017
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 16.08 KB | None | 0 0
  1. sing System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading;
  8. using static Pigeon_Server.Library;
  9.  
  10. namespace Pigeon_Server
  11. {
  12. static class Lobby
  13. {
  14. public static List<Server> Servers = new List<Server>();
  15. public static List<User> Users = new List<User>();
  16.  
  17. public static string UsersPath = Environment.CurrentDirectory + @"/Users.txt";
  18. public static FileStream fs;
  19.  
  20. [STAThread]
  21. ///<summary> Главная функция </summary>
  22. static void Main(string[] args)
  23. {
  24. try
  25. {
  26. ColorMessage(Logo, ConsoleColor.Cyan);
  27. Console.Title = "Pigeon Server v." + version;
  28.  
  29. Users = LoadDatabase();
  30.  
  31. //for (int i = 0; i < Environment.ProcessorCount; i++)
  32. //{
  33. Thread Listener = new Thread(new ThreadStart(Receiver));
  34. Listener.Start();
  35. //}
  36.  
  37. ColorMessage("Чат запущен на порте " + Port, ConsoleColor.Green);
  38.  
  39. AddServer("Montece", "7");
  40. AddServer("NON_Montece", "7");
  41.  
  42. while (true)
  43. {
  44. Console.Write("Pigeon> ");
  45. CheckCommand(Console.ReadLine());
  46. }
  47. }
  48. catch (Exception e)
  49. {
  50. ColorMessage("Что-то пошло не так: " + e.Message, ConsoleColor.Red);
  51. Console.WriteLine("Нажмите ENTER чтобы выйти...");
  52. Console.ReadLine();
  53. }
  54. }
  55.  
  56. ///<summary> Команды консоли </summary>
  57. static void CheckCommand(string command)
  58. {
  59. try
  60. {
  61. //Простые команды
  62. switch (command)
  63. {
  64. case "exit":
  65. Environment.Exit(0);
  66. break;
  67. case "stop":
  68. Environment.Exit(0);
  69. break;
  70. case "close":
  71. Environment.Exit(0);
  72. break;
  73. case "clear":
  74. Console.Clear();
  75. ColorMessage(Logo, ConsoleColor.Cyan);
  76. break;
  77. case "song":
  78. new Thread(MissionImpossible).Start();
  79. break;
  80. case "info":
  81. Console.WriteLine("Версия чата: {0}", version);
  82. Console.WriteLine("Доступно пакетов: {0}", Net.Udp.Available);
  83. Console.WriteLine("Заблокирован ли сокет: {0}", Net.Udp.Client.Blocking ? "Да" : "Нет");
  84. Console.WriteLine("Есть ли фрагментация датаграмм: {0}", Net.Udp.DontFragment ? "Нет" : "Да");
  85. Console.WriteLine("Доступны ли широковещательные пакеты: {0}", Net.Udp.EnableBroadcast ? "Да" : "Нет");
  86. Console.WriteLine("Дескриптор ОС: {0}", Net.Udp.Client.Handle);
  87. Console.WriteLine("Доступна ли многоадресная рассылка: {0}", Net.Udp.MulticastLoopback ? "Да" : "Нет");
  88. Console.WriteLine("Тип протокола: {0}", Net.Udp.Client.ProtocolType);
  89. Console.WriteLine("Размер буфера: {0}", Net.Udp.Client.ReceiveBufferSize);
  90. Console.WriteLine("Тип сокета: {0}", Net.Udp.Client.SocketType);
  91. Console.WriteLine("ТТЛ: {0}", Net.Udp.Ttl);
  92. Console.WriteLine("Оперативная память лобби: {0} мб", Process.GetCurrentProcess().WorkingSet64 / 1000000);
  93. break;
  94. case "servers":
  95. if (Servers.Count == 0) ColorMessage("Нет доступных серверов.", ConsoleColor.Red);
  96. foreach (Server serv in Servers)
  97. {
  98. bool HasPassword = false;
  99. if (serv.Password != "") HasPassword = true;
  100. Console.Write("Сервер \"" + serv.Title + "\", " + (HasPassword ? "есть пароль" : "нет пароля") + Environment.NewLine);
  101. }
  102. break;
  103. case "database":
  104. if (Users != null)
  105. foreach (User user in Users)
  106. {
  107. Console.WriteLine(user.Login + " " + new string('*', user.Password.Length));
  108. }
  109. break;
  110. //Составные команды
  111. default:
  112. if (command.Contains("createuser"))
  113. {
  114. //createuser ЛОГИН ПАРОЛЬ
  115. command = command.Substring(11);
  116. string login = command.Substring(0, command.IndexOf(' '));
  117. string password = command.Substring(command.IndexOf(" ") + 1);
  118.  
  119. if (AddUser(login, password))
  120. {
  121. ColorMessage("Пользователь " + login + " был успешно добавлен в базу данных!", ConsoleColor.Green);
  122. }
  123. else ColorMessage("Такой пользователь уже существует!", ConsoleColor.Red);
  124. }
  125. else
  126. if (command.Contains("createserver"))
  127. {
  128. //createuser ЛОГИН ПАРОЛЬ
  129. command = command.Substring(13);
  130. string title = "";
  131. string password = "";
  132.  
  133. if (command.Contains(' '))
  134. {
  135. title = command.Substring(0, command.IndexOf(' '));
  136. password = command.Substring(command.IndexOf(" ") +
  137. 1);
  138. }
  139. else
  140. {
  141. title = command;
  142. password = "";
  143. }
  144. Server serv = new Server(title, password);
  145.  
  146. if (!CheckServer(serv))
  147. {
  148. Servers.Add(serv);
  149. ColorMessage("Сервер " + title + " был успешно добавлен в базу данных!", ConsoleColor.Green);
  150. }
  151. else ColorMessage("Сервер с таким названием уже существует!", ConsoleColor.Red);
  152.  
  153. }
  154. else
  155. if (command.Contains("clearserver "))
  156. {
  157. //clearserver СЕРВЕР
  158. command = command.Substring(12);
  159.  
  160. Server serv = GetServer(command);
  161.  
  162. if (serv != null)
  163. {
  164. serv.ClearMessages();
  165. ColorMessage("На сервере " + command + " история сообщений была успешно удалена!", ConsoleColor.Green);
  166. }
  167. else ColorMessage("История сообщений не была очищена!", ConsoleColor.Red);
  168.  
  169. }
  170. else
  171. {
  172. ColorMessage("Неизвестная команда!", ConsoleColor.Red);
  173. }
  174. break;
  175.  
  176. }
  177. }
  178.  
  179. catch (Exception e)
  180. {
  181. ColorMessage("Что-то пошло не так: " + e.Message, ConsoleColor.Red);
  182. }
  183. }
  184.  
  185. ///<summary> Отправка цветного сообщения в консоль </summary>
  186. public static void ColorMessage(string text, ConsoleColor color)
  187. {
  188. ConsoleColor oldColor = Console.ForegroundColor;
  189. Console.ForegroundColor = color;
  190. Console.WriteLine(text);
  191. Console.ForegroundColor = oldColor;
  192. }
  193.  
  194. ///<summary> Мелодия в консоли </summary>
  195. static void MissionImpossible()
  196. {
  197. Console.Beep(784, 150);
  198. Thread.Sleep(300);
  199. Console.Beep(784, 150);
  200. Thread.Sleep(300);
  201. Console.Beep(932, 150);
  202. Thread.Sleep(150);
  203. Console.Beep(1047, 150);
  204. Thread.Sleep(150);
  205. Console.Beep(784, 150);
  206. Thread.Sleep(300);
  207. Console.Beep(784, 150);
  208. Thread.Sleep(300);
  209. Console.Beep(699, 150);
  210. Thread.Sleep(150);
  211. Console.Beep(740, 150);
  212. Thread.Sleep(150);
  213. Console.Beep(784, 150);
  214. Thread.Sleep(300);
  215. Console.Beep(784, 150);
  216. Thread.Sleep(300);
  217. Console.Beep(932, 150);
  218. Thread.Sleep(150);
  219. Console.Beep(1047, 150);
  220. Thread.Sleep(150);
  221. Console.Beep(784, 150);
  222. Thread.Sleep(300);
  223. Console.Beep(784, 150);
  224. Thread.Sleep(300);
  225. Console.Beep(699, 150);
  226. Thread.Sleep(150);
  227. Console.Beep(740, 150);
  228. Thread.Sleep(150);
  229. Console.Beep(932, 150);
  230. Console.Beep(784, 150);
  231. Console.Beep(587, 1200);
  232. Thread.Sleep(75);
  233. Console.Beep(932, 150);
  234. Console.Beep(784, 150);
  235. Console.Beep(554, 1200);
  236. Thread.Sleep(75);
  237. Console.Beep(932, 150);
  238. Console.Beep(784, 150);
  239. Console.Beep(523, 1200);
  240. Thread.Sleep(150);
  241. Console.Beep(466, 150);
  242. Console.Beep(523, 150);
  243. }
  244.  
  245. ///<summary> Добавление нового сервера </summary>
  246. static void AddServer(string Title, string password = "")
  247. {
  248. Server Serv = new Server(Title, password);
  249. Servers.Add(Serv);
  250. }
  251.  
  252. ///<summary> Прослушиватель UDP </summary>
  253. static void Receiver()
  254. {
  255. //try
  256. //{
  257. bool Enabled = true;
  258. List<byte> Voice = new List<byte>();
  259.  
  260. while (Enabled)
  261. {
  262. Thread.Sleep(0);
  263.  
  264. List<byte> data = Net.Udp.Receive(ref Net.End).ToList();
  265. byte Length = data[0];
  266.  
  267. string Message = "";
  268.  
  269. data.RemoveAt(0);
  270.  
  271. Voice.Clear();
  272. if (Length == 0)
  273. {
  274. Message = Encoding.UTF8.GetString(data.ToArray());
  275. }
  276. else
  277. {
  278. if (Length < data.Count)
  279. {
  280. Message = Encoding.UTF8.GetString(data.GetRange(0, Length).ToArray());
  281. Voice.AddRange(data.GetRange(Length + 1, data.Count - Length - 2));
  282. }
  283. }
  284.  
  285. //ColorMessage("Принято: " + Message, ConsoleColor.Yellow);
  286.  
  287. if (Message.Contains(CommandChar))
  288. {
  289. #region Голос
  290. //|voice|SERVERTITLE|USER|
  291. if (Message.Contains("voice"))
  292. {
  293. //|voice|SERVERTITLE|USER|
  294. Message = Message.Substring(7);
  295. //SERVERTITLE|USER|
  296. string title = Message.Substring(0, Message.IndexOf(CommandChar));
  297. Message = Message.Substring(Message.IndexOf(CommandChar) + 1);
  298. foreach (User user in GetServer(title).NowOnServer)
  299. {
  300. if (user.IsOnServer && user.Login != Message)
  301. {
  302. Net.Send(CommandChar + "voice" + CommandChar, Voice.ToArray(), user.IP);
  303.  
  304. }
  305. }
  306. }
  307. #endregion
  308. #region Авторизация
  309. //|auth|ЛОГИН|ПАРОЛЬ
  310. if (Message.Contains("auth"))
  311. {
  312. Message = Message.Substring(6);
  313. string login =
  314. Message.Substring(0, Message.IndexOf(CommandChar.ToString()));
  315. string password = Message.Substring(Message.IndexOf(CommandChar.ToString()) + 1);
  316.  
  317. User ThisUser = new User { Login = login, Password = password };
  318. if (CheckUser(ThisUser, true))
  319. {
  320. foreach (User user in Users)
  321. {
  322. if (user.Login == ThisUser.Login)
  323. {
  324. if (!user.IsOnServer)
  325. {
  326. Net.Send("true");
  327. user.IP = Net.End;
  328. }
  329. else Net.Send("false");
  330. break;
  331. }
  332. }
  333. }
  334. else Net.Send("false");
  335. }
  336. #endregion
  337. #region Подсоединение к серверу
  338. //|connect|ИМЯСЕРВЕРА|ЛОГИН
  339. if (Message.Contains("connect"))
  340. {
  341. Message = Message.Substring(9);
  342. string server = Message.Substring(0, Message.IndexOf(CommandChar.ToString()));
  343. string login = Message.Substring(Message.IndexOf(CommandChar.ToString()) + 1);
  344. Server serv = GetServer(server);
  345. User user = GetUser(login);
  346. if (!user.IsOnServer)
  347. {
  348. Net.Send(CommandChar + "connect" + CommandChar + "true");
  349. Users[Users.IndexOf(user)].IsOnServer = true;
  350. user.IsOnServer = true;
  351. //User us = new User { Login = login, IP = Net.End, IsOnServer = true };
  352. serv.NowOnServer.Add(user);
  353. serv.OnConnect(user.Login);
  354. }
  355. else
  356. {
  357. Net.Send(CommandChar + "connect" + CommandChar + "false");
  358. }
  359. }
  360. #endregion
  361. #region История
  362. //|history|SERVERTITLE
  363. if (Message.Contains("history"))
  364. {
  365. Message = Message.Substring(9);
  366. Server serv = GetServer(Message);
  367. Net.Send(serv.GetMessages());
  368. }
  369. #endregion
  370. #region Регистрация
  371. //|register|ЛОГИН|ПАРОЛЬ
  372. if (Message.Contains("register"))
  373. {
  374. Message = Message.Substring(10);
  375. string login = Message.Substring(0, Message.IndexOf(CommandChar.ToString()));
  376. string password = Message.Substring(Message.IndexOf(CommandChar.ToString()) + 1);
  377. User ThisUser = new User { Login = login, Password = password };
  378.  
  379. if (!CheckUser(ThisUser))
  380. {
  381. Users.Add(ThisUser);
  382. ColorMessage("Пользователь " + ThisUser.Login + " был успешно добавлен в базу данных! ", ConsoleColor.Green);
  383. SaveDatabase();
  384. Net.Send("true");
  385. }
  386. else Net.Send("false");
  387. }
  388. #endregion
  389. #region Текст
  390. //|text|SERVERTITLE|ЛОГИН|ТЕКСТ
  391. if (Message.Contains("text"))
  392. {
  393. Message = Message.Substring(6);
  394. string Title = Message.Substring(0, Message.IndexOf(CommandChar));
  395.  
  396. Message = Message.Substring(Message.IndexOf(CommandChar) + 1);
  397. string Login = Message.Substring(0, Message.IndexOf(CommandChar));
  398.  
  399. Message = Message.Substring(Message.IndexOf(CommandChar) + 1);
  400. Console.WriteLine("Новое сообщение от {0}: {1}", Net.End.Address, Message);
  401. GetServer(Title).OnNewMessage(Message, MessageType.User, GetUser(Login));
  402. }
  403.  
  404. #endregion
  405. #region Онлайн
  406. //|isonline|USERNAME|BOOLEAN
  407. if (Message.Contains("isonline"))
  408. {
  409. Message = Message.Substring(10);
  410. string Name = Message.Substring(0, Message.IndexOf(CommandChar));
  411. Message = Message.Substring(Message.IndexOf(CommandChar) + 1);
  412. User user = GetUser(Name);
  413.  
  414. foreach (Server serv in Servers)
  415. {
  416. if (serv.NowOnServer.Contains(user))
  417. {
  418. serv.NowOnServer[serv.NowOnServer.IndexOf(user)].IsOnServer = bool.Parse(Message);
  419. Users[Users.IndexOf(user)].IsOnServer = bool.Parse(Message);
  420. break;
  421. }
  422. }
  423. }
  424. #endregion
  425. #region Обновление
  426. //|version|ВЕРСИЯ
  427. if (Message.Contains("version"))
  428. {
  429. Message = Message.Substring(9);
  430. string version = Message;
  431.  
  432. if (version != Library.version) Net.Send("false");
  433. else Net.Send("true");
  434. }
  435. #endregion
  436. #region Получение серверов
  437. //|servers|
  438. if (Message == CommandChar + "servers" + CommandChar)
  439. {
  440. string str = "";
  441. foreach (Server serv in Servers)
  442. {
  443. str += serv.Title + CommandChar;
  444. }
  445. Net.Send(str);
  446. }
  447. #endregion
  448. #region Скачивание
  449. //|update|
  450. if (Message.Contains("update")) Net.SendFile();
  451. #endregion
  452. }
  453. }
  454. //}
  455. //catch (Exception e)
  456. //{
  457. // ColorMessage("Что-то пошло не так: " + e.Message, ConsoleColor.Red);
  458. //}
  459. }
  460.  
  461. ///<summary> Возвращает пользователя от его имени </summary>
  462. static User GetUser(string Name)
  463. {
  464. foreach (User user in Users)
  465. {
  466. if (user.Login == Name) return user;
  467. }
  468. return null;
  469. }
  470.  
  471. ///<summary> Возвращает сервер от его имени </summary>
  472. static Server GetServer(string title)
  473. {
  474. foreach (Server serv in Servers)
  475. {
  476. if (serv.Title == title) return serv;
  477. }
  478. return null;
  479. }
  480.  
  481. ///<summary> Проверка существования пользователя </summary>
  482. static bool CheckUser(User ThisUser, bool UsePassword = false)
  483. {
  484. if (UsePassword)
  485. {
  486. foreach (User user in Users)
  487. {
  488. if (user.Login == ThisUser.Login && user.Password == ThisUser.Password) return true;
  489. }
  490. }
  491. else
  492. {
  493. foreach (User user in Users)
  494. {
  495. if (user.Login == ThisUser.Login) return true;
  496. }
  497. }
  498.  
  499. return false;
  500. }
  501.  
  502. ///<summary> Проверка существования сервера </summary>
  503. static bool CheckServer(Server ThisServer, bool UsePassword = false)
  504. {
  505. if (UsePassword)
  506. {
  507. foreach (Server serv in Servers)
  508. {
  509. if (serv.Title == ThisServer.Title && serv.Password == ThisServer.Password) return true;
  510. }
  511. }
  512. else
  513. {
  514. foreach (Server serv in Servers)
  515. {
  516. if (serv.Title == ThisServer.Title) return true;
  517. }
  518. }
  519.  
  520. return false;
  521. }
  522.  
  523. ///<summary> Добавляет нового пользователя </summary>
  524. static bool AddUser(string Login, string Password)
  525. {
  526. if (Users == null) Users = new List<User>();
  527.  
  528. User ThisUser = new User { Login = Login, Password = Password };
  529. if (!CheckUser(ThisUser))
  530. {
  531. Users.Add(ThisUser);
  532. SaveDatabase();
  533. return true;
  534. }
  535. else return false;
  536. }
  537.  
  538. ///<summary> Загрузка пользователей </summary>
  539. static List<User> LoadDatabase()
  540. {
  541. try
  542. {
  543. List<User> Users = new List<User>();
  544.  
  545. fs = new FileStream(UsersPath, FileMode.OpenOrCreate, FileAccess.Read);
  546.  
  547. byte[] data = new byte[fs.Length];
  548. fs.Read(data, 0, data.Length);
  549. string alllines = Encoding.UTF8.GetString(data);
  550. List<string> lines = new List<string>();
  551. lines = alllines.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None).ToList();
  552.  
  553. foreach (string line in lines)
  554. {
  555. if (line.Contains(CommandChar.ToString()))
  556. {
  557. Users.Add(new User { Login = line.Substring(0, line.IndexOf(CommandChar)), Password = line.Substring(line.IndexOf(CommandChar) + 1) });
  558. }
  559. }
  560.  
  561. ColorMessage("База данных пользователей успешно инициализирована! (" + lines.Count +" символов)", ConsoleColor.Green);
  562. fs.Close();
  563. return Users;
  564. }
  565. catch (Exception e)
  566. {
  567. ColorMessage("Что-то пошло не так: " + e.Message, ConsoleColor.Red);
  568. return null;
  569. }
  570. }
  571.  
  572. ///<summary> Сохранение пользователей </summary>
  573. static void SaveDatabase()
  574. {
  575. try
  576. {
  577. string temp = "";
  578. foreach (User user in Users)
  579. {
  580. temp += user.Login + CommandChar + user.Password + Environment.NewLine;
  581. }
  582.  
  583. fs = new FileStream(UsersPath, FileMode.OpenOrCreate, FileAccess.Write);
  584.  
  585. byte[] data = Encoding.UTF8.GetBytes(temp);
  586. fs.Write(data, 0, data.Length);
  587. fs.Close();
  588. }
  589. catch (Exception e)
  590. {
  591. ColorMessage("Что-то пошло не так: " + e.Message, ConsoleColor.Red);
  592. }
  593. }
  594.  
  595. ///<summary> Вывод текущего времени </summary>
  596. public static void GetTime()
  597. {
  598. ColorMessage("[" + DateTimeOffset.Now.Hour + ":" + DateTimeOffset.Now.Minute + ":" + DateTimeOffset.Now.Second + ":" + DateTimeOffset.Now.Millisecond + "] ", ConsoleColor.Yellow);
  599. }
  600. }
  601. }
Add Comment
Please, Sign In to add comment