Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- sing System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using static Pigeon_Server.Library;
- namespace Pigeon_Server
- {
- static class Lobby
- {
- public static List<Server> Servers = new List<Server>();
- public static List<User> Users = new List<User>();
- public static string UsersPath = Environment.CurrentDirectory + @"/Users.txt";
- public static FileStream fs;
- [STAThread]
- ///<summary> Главная функция </summary>
- static void Main(string[] args)
- {
- try
- {
- ColorMessage(Logo, ConsoleColor.Cyan);
- Console.Title = "Pigeon Server v." + version;
- Users = LoadDatabase();
- //for (int i = 0; i < Environment.ProcessorCount; i++)
- //{
- Thread Listener = new Thread(new ThreadStart(Receiver));
- Listener.Start();
- //}
- ColorMessage("Чат запущен на порте " + Port, ConsoleColor.Green);
- AddServer("Montece", "7");
- AddServer("NON_Montece", "7");
- while (true)
- {
- Console.Write("Pigeon> ");
- CheckCommand(Console.ReadLine());
- }
- }
- catch (Exception e)
- {
- ColorMessage("Что-то пошло не так: " + e.Message, ConsoleColor.Red);
- Console.WriteLine("Нажмите ENTER чтобы выйти...");
- Console.ReadLine();
- }
- }
- ///<summary> Команды консоли </summary>
- static void CheckCommand(string command)
- {
- try
- {
- //Простые команды
- switch (command)
- {
- case "exit":
- Environment.Exit(0);
- break;
- case "stop":
- Environment.Exit(0);
- break;
- case "close":
- Environment.Exit(0);
- break;
- case "clear":
- Console.Clear();
- ColorMessage(Logo, ConsoleColor.Cyan);
- break;
- case "song":
- new Thread(MissionImpossible).Start();
- break;
- case "info":
- Console.WriteLine("Версия чата: {0}", version);
- Console.WriteLine("Доступно пакетов: {0}", Net.Udp.Available);
- Console.WriteLine("Заблокирован ли сокет: {0}", Net.Udp.Client.Blocking ? "Да" : "Нет");
- Console.WriteLine("Есть ли фрагментация датаграмм: {0}", Net.Udp.DontFragment ? "Нет" : "Да");
- Console.WriteLine("Доступны ли широковещательные пакеты: {0}", Net.Udp.EnableBroadcast ? "Да" : "Нет");
- Console.WriteLine("Дескриптор ОС: {0}", Net.Udp.Client.Handle);
- Console.WriteLine("Доступна ли многоадресная рассылка: {0}", Net.Udp.MulticastLoopback ? "Да" : "Нет");
- Console.WriteLine("Тип протокола: {0}", Net.Udp.Client.ProtocolType);
- Console.WriteLine("Размер буфера: {0}", Net.Udp.Client.ReceiveBufferSize);
- Console.WriteLine("Тип сокета: {0}", Net.Udp.Client.SocketType);
- Console.WriteLine("ТТЛ: {0}", Net.Udp.Ttl);
- Console.WriteLine("Оперативная память лобби: {0} мб", Process.GetCurrentProcess().WorkingSet64 / 1000000);
- break;
- case "servers":
- if (Servers.Count == 0) ColorMessage("Нет доступных серверов.", ConsoleColor.Red);
- foreach (Server serv in Servers)
- {
- bool HasPassword = false;
- if (serv.Password != "") HasPassword = true;
- Console.Write("Сервер \"" + serv.Title + "\", " + (HasPassword ? "есть пароль" : "нет пароля") + Environment.NewLine);
- }
- break;
- case "database":
- if (Users != null)
- foreach (User user in Users)
- {
- Console.WriteLine(user.Login + " " + new string('*', user.Password.Length));
- }
- break;
- //Составные команды
- default:
- if (command.Contains("createuser"))
- {
- //createuser ЛОГИН ПАРОЛЬ
- command = command.Substring(11);
- string login = command.Substring(0, command.IndexOf(' '));
- string password = command.Substring(command.IndexOf(" ") + 1);
- if (AddUser(login, password))
- {
- ColorMessage("Пользователь " + login + " был успешно добавлен в базу данных!", ConsoleColor.Green);
- }
- else ColorMessage("Такой пользователь уже существует!", ConsoleColor.Red);
- }
- else
- if (command.Contains("createserver"))
- {
- //createuser ЛОГИН ПАРОЛЬ
- command = command.Substring(13);
- string title = "";
- string password = "";
- if (command.Contains(' '))
- {
- title = command.Substring(0, command.IndexOf(' '));
- password = command.Substring(command.IndexOf(" ") +
- 1);
- }
- else
- {
- title = command;
- password = "";
- }
- Server serv = new Server(title, password);
- if (!CheckServer(serv))
- {
- Servers.Add(serv);
- ColorMessage("Сервер " + title + " был успешно добавлен в базу данных!", ConsoleColor.Green);
- }
- else ColorMessage("Сервер с таким названием уже существует!", ConsoleColor.Red);
- }
- else
- if (command.Contains("clearserver "))
- {
- //clearserver СЕРВЕР
- command = command.Substring(12);
- Server serv = GetServer(command);
- if (serv != null)
- {
- serv.ClearMessages();
- ColorMessage("На сервере " + command + " история сообщений была успешно удалена!", ConsoleColor.Green);
- }
- else ColorMessage("История сообщений не была очищена!", ConsoleColor.Red);
- }
- else
- {
- ColorMessage("Неизвестная команда!", ConsoleColor.Red);
- }
- break;
- }
- }
- catch (Exception e)
- {
- ColorMessage("Что-то пошло не так: " + e.Message, ConsoleColor.Red);
- }
- }
- ///<summary> Отправка цветного сообщения в консоль </summary>
- public static void ColorMessage(string text, ConsoleColor color)
- {
- ConsoleColor oldColor = Console.ForegroundColor;
- Console.ForegroundColor = color;
- Console.WriteLine(text);
- Console.ForegroundColor = oldColor;
- }
- ///<summary> Мелодия в консоли </summary>
- static void MissionImpossible()
- {
- Console.Beep(784, 150);
- Thread.Sleep(300);
- Console.Beep(784, 150);
- Thread.Sleep(300);
- Console.Beep(932, 150);
- Thread.Sleep(150);
- Console.Beep(1047, 150);
- Thread.Sleep(150);
- Console.Beep(784, 150);
- Thread.Sleep(300);
- Console.Beep(784, 150);
- Thread.Sleep(300);
- Console.Beep(699, 150);
- Thread.Sleep(150);
- Console.Beep(740, 150);
- Thread.Sleep(150);
- Console.Beep(784, 150);
- Thread.Sleep(300);
- Console.Beep(784, 150);
- Thread.Sleep(300);
- Console.Beep(932, 150);
- Thread.Sleep(150);
- Console.Beep(1047, 150);
- Thread.Sleep(150);
- Console.Beep(784, 150);
- Thread.Sleep(300);
- Console.Beep(784, 150);
- Thread.Sleep(300);
- Console.Beep(699, 150);
- Thread.Sleep(150);
- Console.Beep(740, 150);
- Thread.Sleep(150);
- Console.Beep(932, 150);
- Console.Beep(784, 150);
- Console.Beep(587, 1200);
- Thread.Sleep(75);
- Console.Beep(932, 150);
- Console.Beep(784, 150);
- Console.Beep(554, 1200);
- Thread.Sleep(75);
- Console.Beep(932, 150);
- Console.Beep(784, 150);
- Console.Beep(523, 1200);
- Thread.Sleep(150);
- Console.Beep(466, 150);
- Console.Beep(523, 150);
- }
- ///<summary> Добавление нового сервера </summary>
- static void AddServer(string Title, string password = "")
- {
- Server Serv = new Server(Title, password);
- Servers.Add(Serv);
- }
- ///<summary> Прослушиватель UDP </summary>
- static void Receiver()
- {
- //try
- //{
- bool Enabled = true;
- List<byte> Voice = new List<byte>();
- while (Enabled)
- {
- Thread.Sleep(0);
- List<byte> data = Net.Udp.Receive(ref Net.End).ToList();
- byte Length = data[0];
- string Message = "";
- data.RemoveAt(0);
- Voice.Clear();
- if (Length == 0)
- {
- Message = Encoding.UTF8.GetString(data.ToArray());
- }
- else
- {
- if (Length < data.Count)
- {
- Message = Encoding.UTF8.GetString(data.GetRange(0, Length).ToArray());
- Voice.AddRange(data.GetRange(Length + 1, data.Count - Length - 2));
- }
- }
- //ColorMessage("Принято: " + Message, ConsoleColor.Yellow);
- if (Message.Contains(CommandChar))
- {
- #region Голос
- //|voice|SERVERTITLE|USER|
- if (Message.Contains("voice"))
- {
- //|voice|SERVERTITLE|USER|
- Message = Message.Substring(7);
- //SERVERTITLE|USER|
- string title = Message.Substring(0, Message.IndexOf(CommandChar));
- Message = Message.Substring(Message.IndexOf(CommandChar) + 1);
- foreach (User user in GetServer(title).NowOnServer)
- {
- if (user.IsOnServer && user.Login != Message)
- {
- Net.Send(CommandChar + "voice" + CommandChar, Voice.ToArray(), user.IP);
- }
- }
- }
- #endregion
- #region Авторизация
- //|auth|ЛОГИН|ПАРОЛЬ
- if (Message.Contains("auth"))
- {
- Message = Message.Substring(6);
- string login =
- Message.Substring(0, Message.IndexOf(CommandChar.ToString()));
- string password = Message.Substring(Message.IndexOf(CommandChar.ToString()) + 1);
- User ThisUser = new User { Login = login, Password = password };
- if (CheckUser(ThisUser, true))
- {
- foreach (User user in Users)
- {
- if (user.Login == ThisUser.Login)
- {
- if (!user.IsOnServer)
- {
- Net.Send("true");
- user.IP = Net.End;
- }
- else Net.Send("false");
- break;
- }
- }
- }
- else Net.Send("false");
- }
- #endregion
- #region Подсоединение к серверу
- //|connect|ИМЯСЕРВЕРА|ЛОГИН
- if (Message.Contains("connect"))
- {
- Message = Message.Substring(9);
- string server = Message.Substring(0, Message.IndexOf(CommandChar.ToString()));
- string login = Message.Substring(Message.IndexOf(CommandChar.ToString()) + 1);
- Server serv = GetServer(server);
- User user = GetUser(login);
- if (!user.IsOnServer)
- {
- Net.Send(CommandChar + "connect" + CommandChar + "true");
- Users[Users.IndexOf(user)].IsOnServer = true;
- user.IsOnServer = true;
- //User us = new User { Login = login, IP = Net.End, IsOnServer = true };
- serv.NowOnServer.Add(user);
- serv.OnConnect(user.Login);
- }
- else
- {
- Net.Send(CommandChar + "connect" + CommandChar + "false");
- }
- }
- #endregion
- #region История
- //|history|SERVERTITLE
- if (Message.Contains("history"))
- {
- Message = Message.Substring(9);
- Server serv = GetServer(Message);
- Net.Send(serv.GetMessages());
- }
- #endregion
- #region Регистрация
- //|register|ЛОГИН|ПАРОЛЬ
- if (Message.Contains("register"))
- {
- Message = Message.Substring(10);
- string login = Message.Substring(0, Message.IndexOf(CommandChar.ToString()));
- string password = Message.Substring(Message.IndexOf(CommandChar.ToString()) + 1);
- User ThisUser = new User { Login = login, Password = password };
- if (!CheckUser(ThisUser))
- {
- Users.Add(ThisUser);
- ColorMessage("Пользователь " + ThisUser.Login + " был успешно добавлен в базу данных! ", ConsoleColor.Green);
- SaveDatabase();
- Net.Send("true");
- }
- else Net.Send("false");
- }
- #endregion
- #region Текст
- //|text|SERVERTITLE|ЛОГИН|ТЕКСТ
- if (Message.Contains("text"))
- {
- Message = Message.Substring(6);
- string Title = Message.Substring(0, Message.IndexOf(CommandChar));
- Message = Message.Substring(Message.IndexOf(CommandChar) + 1);
- string Login = Message.Substring(0, Message.IndexOf(CommandChar));
- Message = Message.Substring(Message.IndexOf(CommandChar) + 1);
- Console.WriteLine("Новое сообщение от {0}: {1}", Net.End.Address, Message);
- GetServer(Title).OnNewMessage(Message, MessageType.User, GetUser(Login));
- }
- #endregion
- #region Онлайн
- //|isonline|USERNAME|BOOLEAN
- if (Message.Contains("isonline"))
- {
- Message = Message.Substring(10);
- string Name = Message.Substring(0, Message.IndexOf(CommandChar));
- Message = Message.Substring(Message.IndexOf(CommandChar) + 1);
- User user = GetUser(Name);
- foreach (Server serv in Servers)
- {
- if (serv.NowOnServer.Contains(user))
- {
- serv.NowOnServer[serv.NowOnServer.IndexOf(user)].IsOnServer = bool.Parse(Message);
- Users[Users.IndexOf(user)].IsOnServer = bool.Parse(Message);
- break;
- }
- }
- }
- #endregion
- #region Обновление
- //|version|ВЕРСИЯ
- if (Message.Contains("version"))
- {
- Message = Message.Substring(9);
- string version = Message;
- if (version != Library.version) Net.Send("false");
- else Net.Send("true");
- }
- #endregion
- #region Получение серверов
- //|servers|
- if (Message == CommandChar + "servers" + CommandChar)
- {
- string str = "";
- foreach (Server serv in Servers)
- {
- str += serv.Title + CommandChar;
- }
- Net.Send(str);
- }
- #endregion
- #region Скачивание
- //|update|
- if (Message.Contains("update")) Net.SendFile();
- #endregion
- }
- }
- //}
- //catch (Exception e)
- //{
- // ColorMessage("Что-то пошло не так: " + e.Message, ConsoleColor.Red);
- //}
- }
- ///<summary> Возвращает пользователя от его имени </summary>
- static User GetUser(string Name)
- {
- foreach (User user in Users)
- {
- if (user.Login == Name) return user;
- }
- return null;
- }
- ///<summary> Возвращает сервер от его имени </summary>
- static Server GetServer(string title)
- {
- foreach (Server serv in Servers)
- {
- if (serv.Title == title) return serv;
- }
- return null;
- }
- ///<summary> Проверка существования пользователя </summary>
- static bool CheckUser(User ThisUser, bool UsePassword = false)
- {
- if (UsePassword)
- {
- foreach (User user in Users)
- {
- if (user.Login == ThisUser.Login && user.Password == ThisUser.Password) return true;
- }
- }
- else
- {
- foreach (User user in Users)
- {
- if (user.Login == ThisUser.Login) return true;
- }
- }
- return false;
- }
- ///<summary> Проверка существования сервера </summary>
- static bool CheckServer(Server ThisServer, bool UsePassword = false)
- {
- if (UsePassword)
- {
- foreach (Server serv in Servers)
- {
- if (serv.Title == ThisServer.Title && serv.Password == ThisServer.Password) return true;
- }
- }
- else
- {
- foreach (Server serv in Servers)
- {
- if (serv.Title == ThisServer.Title) return true;
- }
- }
- return false;
- }
- ///<summary> Добавляет нового пользователя </summary>
- static bool AddUser(string Login, string Password)
- {
- if (Users == null) Users = new List<User>();
- User ThisUser = new User { Login = Login, Password = Password };
- if (!CheckUser(ThisUser))
- {
- Users.Add(ThisUser);
- SaveDatabase();
- return true;
- }
- else return false;
- }
- ///<summary> Загрузка пользователей </summary>
- static List<User> LoadDatabase()
- {
- try
- {
- List<User> Users = new List<User>();
- fs = new FileStream(UsersPath, FileMode.OpenOrCreate, FileAccess.Read);
- byte[] data = new byte[fs.Length];
- fs.Read(data, 0, data.Length);
- string alllines = Encoding.UTF8.GetString(data);
- List<string> lines = new List<string>();
- lines = alllines.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None).ToList();
- foreach (string line in lines)
- {
- if (line.Contains(CommandChar.ToString()))
- {
- Users.Add(new User { Login = line.Substring(0, line.IndexOf(CommandChar)), Password = line.Substring(line.IndexOf(CommandChar) + 1) });
- }
- }
- ColorMessage("База данных пользователей успешно инициализирована! (" + lines.Count +" символов)", ConsoleColor.Green);
- fs.Close();
- return Users;
- }
- catch (Exception e)
- {
- ColorMessage("Что-то пошло не так: " + e.Message, ConsoleColor.Red);
- return null;
- }
- }
- ///<summary> Сохранение пользователей </summary>
- static void SaveDatabase()
- {
- try
- {
- string temp = "";
- foreach (User user in Users)
- {
- temp += user.Login + CommandChar + user.Password + Environment.NewLine;
- }
- fs = new FileStream(UsersPath, FileMode.OpenOrCreate, FileAccess.Write);
- byte[] data = Encoding.UTF8.GetBytes(temp);
- fs.Write(data, 0, data.Length);
- fs.Close();
- }
- catch (Exception e)
- {
- ColorMessage("Что-то пошло не так: " + e.Message, ConsoleColor.Red);
- }
- }
- ///<summary> Вывод текущего времени </summary>
- public static void GetTime()
- {
- ColorMessage("[" + DateTimeOffset.Now.Hour + ":" + DateTimeOffset.Now.Minute + ":" + DateTimeOffset.Now.Second + ":" + DateTimeOffset.Now.Millisecond + "] ", ConsoleColor.Yellow);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement