Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.net.*; //Импортируем необходимые библиотеки
- import java.io.*;
- import javax.sound.midi.*;
- // ServerInfo - специальный класс, хранящий информацю о сервере и некоторые его переменные
- class ServerInfo
- {//настройки сервера, можно (и иногда нужно) изменять перед запуском
- String password="5982"; //Пароль сервера, нужен чтобы стать админом
- int soundStatus=1; //Указывает, используется ли звук. 1 - да, 0 - нет.
- int members=300; //Указывает, сколько максимум людей может бытьна сервере
- int port=2902; //Указываем порт, используемый сервером
- String specialInfo="Вы присоеденились к серверу ZiS (v 2.1 beta)!\r\n~~~~~(Z)iS (i)s (S)imple~~~~~\r\n_______________________________________________________________________________\r\nИспользуемый порт: "+port+"\r\nТип сервера и используемый протокол: Чат ZiS (ZSCPv.1.2:TCP/IPv.4)\r\n_______________________________________________________________________________\r\n"; // Примечания, вывоимые подключившымся пользователям
- boolean visualClientOnly=true; //Указывает на то, что сервер работает ТОЛЬКО с графическим клиентом
- boolean consoleProtocol=true; // Ведется ли протокол сервера
- //служебные переменные сервера, изменять нельзя
- ServerSocket server; //Объект сервера
- Socket agent; //Объект агента, используется в качестве посредника
- Midi sound; // Объект работы со звуком
- String ipBanned=""; //Строка-список забаненных IP
- String namesUsed=""; //Cтрока, хранящая уже использованные имена
- WorkWithClient[] work = new WorkWithClient[members]; // Массив классов-клиентов, каждый элемент массива отвечает за свое подкючение
- Thread[] threads = new Thread[members]; // Массив потоков. Каждому потоку будем передавать соответствующий элемент массива work? это позволит подключатся к серверу сразу нескольким людям
- int i=0; //переменная хранит количество подключившихся к серверу клиентов
- }
- class ZiSServerMainClass // Это - собственный класс сервера + главный класс, в нем мы и будем присоеденять пользователей к нашему серверу
- {public static void main (String[] args) throws IOException //главный метод
- {ServerInfo nfo = new ServerInfo(); // Создаем объект ServerInfo
- for (int i=0; i<args.length; i++)
- {if(args[i].indexOf("prt:")!=-1)
- {int port=2902;
- String portString="";
- for (int j=4; j<args[i].length(); j++)
- portString=portString+args[i].charAt(j);
- try
- {port = Integer.parseInt(portString);
- }
- catch (NumberFormatException numberFormatException)
- {
- }
- nfo.port=port;
- }
- if(args[i].indexOf("sund")!=-1)
- {if(args[i].charAt(4)=='+')
- nfo.soundStatus=1;
- else
- nfo.soundStatus=0;
- }
- if(args[i].indexOf("cons")!=-1)
- {nfo.consoleProtocol=args[i].charAt(4)=='+';
- }
- }
- try
- {nfo.server = new ServerSocket(nfo.port); //Говорим, что наш сервер использует указанный порт
- }
- catch (IOException ex)
- {System.out.println("Net ERROR: Port "+nfo.port+", used by the server was already reserved by another program. Restart the server using another port.");
- System.exit(0);
- }
- System.out.println("Server starting... Done!");// Здесь и далее выводим на экран сервера всякую разную информацию.
- System.out.println( "Server port: "+nfo.port+"\nServer type: ZiS Chat (ZSCP 1.1:TCP/IPv.4)\n\n");
- System.out.println("~~~~~(Z)iS (i)s (S)imple~~~~~\n\nServer ready to work!\n");
- try
- {nfo.sound = new Midi(nfo.soundStatus); // Включаем поддержку звука
- if (nfo.soundStatus!=0)
- nfo.sound.alarm(0); //Сигнализируем о старте сервера
- }
- catch (Exception ex)
- {System.out.println("Audio ERROR: There is no audio device at this computer, audio signals support is disabled.");
- nfo.soundStatus=0;
- }
- while (true) // пускаем цикл ожидания клиента пока их меньше указанного количества человек
- if (nfo.i<nfo.members)
- {nfo.agent = nfo.server.accept(); //ждем следующего присоеденившегося клиента
- nfo.i++; //прибавляем к счетчику клиентов еденицу
- try
- {nfo.work[nfo.i] = new WorkWithClient(nfo.agent, nfo.i, nfo); // создаем i-тый элемент массива клиентов work (массив описан выше)
- nfo.threads[nfo.i] = new Thread(nfo.work[nfo.i]);//передаем i-тому элемену массива потоков ноашего нового клиента, когда мы запустим этот поток, действия с нашим клиентом будут в отдельном потоке
- nfo.threads[nfo.i].start(); //собственно, запускаем поток, работающий с нашим овым клиентом
- }
- catch (Exception ex)
- {System.out.println("Thread ERROR: An unknown error was occurred with one of the threads. Program execution will be stopped.\r\nDebug information:"+ex.getMessage());
- System.exit(0);
- }
- }
- }
- } // закрываеем все методы и класс
- class WorkWithClient implements Runnable // В этом классе описаны методы работы с клиентом; implements Runnable прописано для многопоточности, чтобы много людей работали одновременно
- {Socket agent; // Здесь оисаны поля класса; agent - класс клиента
- DataInputStream is; // входящий поток
- DataOutputStream os; // выходящий поток
- String agentText, agentName, agentWriteUs; //Строки, с лева на право: служебная, хранит то, что мы пишем в окне клиента; хранит имя клиентаж хранит то, что написал клиент
- int agentID; // хранит порядковый номер, под которым клиент присоеденился
- ServerInfo nfo; // хранит ссылку на информацию о сервере
- boolean adminStatus=false; //флаг, является ли пользователь администратором сервера, по умолчанию - не является
- boolean listenerStatus=false; //флаг, показывает надо ли отправлять данному пользоователю реплики других людей, по умолчанию - надо отправлять
- boolean banned=false; //флаг, показывает забанен ли данный пользователь,по умолчанию - не забанен
- boolean visualClient; //флаг, показывает, используется ли графический клиент !!! в данный момент не актуален
- final String goodName="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890 '-_"; //строчка для проверки правильности имени
- public WorkWithClient(Socket agent, int agentID, ServerInfo nfo) throws IOException //конструктор класса
- {this.agent=agent; //присваиваем полям класса то, что передал нам метод сервера, ожидающий клиентов когда регестрировал данного клиента
- this.agentID=agentID;
- this.nfo=nfo;
- visualClient=nfo.visualClientOnly;
- os =new DataOutputStream(agent.getOutputStream());
- is = new DataInputStream(agent.getInputStream());
- }
- public void run() // этот метод содержит собственно диалог с клиентом, метод начинает выполнятся сразу же после конструктора
- { try
- {agentText = nfo.specialInfo;
- writeText();
- if (nfo.ipBanned.indexOf(agent.getLocalAddress().toString())!=-1)
- {agentText="\r\n\r\n Ваш IP "+agent.getLocalAddress().toString()+" ЗАБАНЕН! Вы не сможите присоединиться!\r\n";
- writeText();
- is.close();
- os.close();
- }
- }
- catch (Exception ex)
- {System.out.println("IO ERROR: An unknown error occurred while working with a client ID "+agentID+". Connection with this client will be aborted. \r\nDebug information:"+ex.getMessage());
- try
- {nfo.work[agentID].listenerStatus=false;
- nfo.threads[agentID].join();
- }
- catch (InterruptedException ex1)
- {System.out.println("Thread ERROR: An unknown error was occurred with one of the threads. Program execution will be stopped.\r\nDebug information:"+ex1.getMessage());
- System.exit(0);
- }
- }
- try
- {agentText = "\r\n\r\nВведите свое имя, используйте только символы: A-z; 0-9.\r\n"; //спрашиваем у клиента его имя, чтобы в чате было видно кто пишет
- writeText();
- readText();
- boolean chek=chekName(agentWriteUs);
- while(!chek)
- {agentText = "Имя введено неверно или уже используеться. Введите другое имя, пожалуйста.\r\n";
- if(!agentWriteUs.isEmpty())
- writeText();
- readText();
- chek=chekName(agentWriteUs);
- }
- agentName=agentWriteUs;
- nfo.namesUsed=nfo.namesUsed+agentName;
- System.out.println("User "+agentName+" connected to server. User ID: "+agentID+" "+agent.getLocalAddress());
- if (nfo.soundStatus!=0)
- nfo.sound.agentConnect();
- agentText = "\r\nВы успешно подключились, приятного общения!\r\n\r\n";
- writeText();
- sayText("{System information}: Пользователь "+agentName+" (ID "+agentID+") присоединился!\r\n");
- listenerStatus=true;
- }
- catch (Exception ex)
- {System.out.println("IO ERROR: An unknown error occurred while working with a client ID "+agentID+". Connection with this client will be aborted. \r\nDebug information:"+ex.getMessage());
- try
- {nfo.work[agentID].listenerStatus=false;
- nfo.threads[agentID].join();
- }
- catch (InterruptedException ex1)
- {System.out.println("Thread ERROR: An unknown error was occurred with one of the threads. Program execution will be stopped.\r\nDebug information:"+ex1.getMessage());
- System.exit(0);
- }
- }
- while (true)
- try
- {readText(); // модуль чата, после того как узнали имя клиента он считывает то, что написал клиент и если это не команда консолли (команда консоли имеет вид /бла-бла-бла), то выводит этот текст друим пользователям на экран
- if (agentWriteUs==null||agentWriteUs.isEmpty()) agentWriteUs=" ";
- if (agentWriteUs.charAt(0)=='/')
- userConsole(agentWriteUs);
- else
- if(listenerStatus || adminStatus)
- sayText("["+agentName+"]: "+agentWriteUs+"\r\n");
- }
- catch (Exception ex)
- {System.out.println("IO ERROR: An unknown error occurred while working with a client ID "+agentID+". Connection with this client will be aborted. \r\nDebug information:"+ex.getMessage());
- nfo.work[agentID].listenerStatus=false;
- try
- {os.close();
- is.close();
- nfo.threads[agentID].join();
- }
- catch (Exception ex1)
- {System.out.println("Thread ERROR: An unknown error was occurred with one of the threads. Program execution will be stopped.\r\nDebug information:"+ex1.getMessage());
- System.exit(0);
- }
- }
- }
- // Здесь идут методы, которые мы использовали когда читали имя и когда делали сам чат (9 строчек выше)
- public void writeText() // этот метод выводет на экран данному пользователю содержание строки agentText (смотри поля класса)
- {try
- {os.writeUTF(agentText);
- }
- catch (Exception ex)
- {System.out.println("IO ERROR: An unknown error occurred while working with a client ID "+agentID+". Connection with this client will be aborted. \r\nDebug information:"+ex.getMessage());
- nfo.work[agentID].listenerStatus=false;
- try
- {nfo.threads[agentID].join();
- }
- catch (InterruptedException ex1)
- {System.out.println("Thread ERROR: An unknown error was occurred with one of the threads. Program execution will be stopped.\r\nDebug information:"+ex1.getMessage());
- System.exit(0);
- }
- }
- agentText="";
- }
- public void readText() // этот метод читает то, что пишет пользователь и сохраняет это в строку agentWriteUs
- {agentWriteUs="";
- try
- {agentWriteUs = is.readUTF();
- }
- catch (Exception ex)
- {System.out.println("IO ERROR: An unknown error occurred while working with a client ID "+agentID+". Connection with this client will be aborted. \r\nDebug information:"+ex.getMessage());
- nfo.work[agentID].listenerStatus=false;
- try
- {nfo.threads[agentID].join();
- }
- catch (InterruptedException ex1)
- {System.out.println("Thread ERROR: An unknown error was occurred with one of the threads. Program execution will be stopped.\r\nDebug information:"+ex1.getMessage());
- System.exit(0);
- }
- }
- }
- public void sayText(String say) // этот метотд выводит всем пользователям на экран ту строку, которую ему передали (т.е. строку Say) если пользователь не забанен
- {if (!say.isEmpty()&&!say.equals("["+agentName+"]: \r\n")&&!banned)
- for (int i=1; i<=nfo.i; i++)
- if (nfo.work[i].listenerStatus&&!(say.charAt(0)=='{'&&agentID==i))
- {nfo.work[i].agentText=say;
- nfo.work[i].writeText();
- }
- }
- public boolean chekName(String name) //этод метод проверяет имя на правильность
- {boolean res=!name.isEmpty();
- nameUsedRefresh();
- for (int i=0; i<name.length(); i++)
- if (goodName.indexOf(name.charAt(i))==-1)
- res=false;
- if(nfo.namesUsed.indexOf(name)!=-1)
- res=false;
- if(name.length()>15)
- res=false;
- return res;
- }
- public void nameUsedRefresh()
- {nfo.namesUsed="";
- for (int i=1; i<nfo.i; i++)
- nfo.namesUsed=nfo.namesUsed+nfo.work[i].agentName;
- }
- public void nameUsedRefresh(int id)
- {nfo.namesUsed="";
- nfo.work[id].agentName="";
- for (int i=1; i<nfo.i; i++)
- nfo.namesUsed=nfo.namesUsed+nfo.work[i].agentName;
- }
- public void userConsole(String cmd) //этот метод содержит консоль - маленький набор команд, который пользователи могут отдать серверу со своего клиента
- // команды консоли имеют вид /бла-бла... они не печатаются на экранах других пользователей, любую строчку которая насинается с "/" сервер считает командой консоли
- {if (!adminStatus&nfo.consoleProtocol)
- System.out.println("User "+agentName+" (ID: "+agentID+") trying to use a console command:"+cmd); // эта строчка выводит на экран сервера ту команду консоли, которую написал пользователь
- boolean bad=true; // это флаг, который поможет определить существует ли такая команда консоли, которую ввел пользователь
- if (banned&!(cmd.equalsIgnoreCase("/exit")||cmd.equalsIgnoreCase("/unlisten")||cmd.equalsIgnoreCase("/listen")||cmd.equalsIgnoreCase("/ilisten")||cmd.equalsIgnoreCase("/ibanned")||cmd.equalsIgnoreCase("/ping")))
- cmd="/#";//Для забаненных
- // Пользовательская консоль
- if (cmd.equalsIgnoreCase("/g_adm_"+nfo.password)) // эта команда консоли дает тому кто ее ввел статус администратора
- {adminStatus = true; // собственно, программно дает статус
- sayText("{Sustem information}: Пользователь "+agentName+" получил права администратора сервера от Server Console.\r\n");//сообщет остальным что этот пользователь - админ
- agentName=agentName+"_(adm)";
- agentText="{Server Console}: Ваш статус изменен на \"Администратор сервера\".\r\n"; //Сообщаем об удачнам использовании команды
- writeText();
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/unlisten")) // это команда консоли, которая делает так, что данный пользователь не получает сообщений
- {listenerStatus = false; // собственно, программно делает это
- sayText("{Sustem information}: Пользователь "+agentName+" изменил статус на \"Занят\".\r\n");//сообщет остальным что этот пользователь не прослушивает чат
- agentText="{Server Console}: Статус обновлен.\r\n"; //Сообщаем об удачнам использовании команды
- writeText();
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/listen")) // это команда консоли, которая делает так, что данный пользователь получает сообщений
- {listenerStatus = true; // собственно, программно делает это
- sayText("{Sustem information}: Пользователь "+agentName+" изменил статус на \"Готов общаться\".\r\n");//сообщет остальным что этот пользователь прослушивает чат
- agentText="{Server Console}: Статус обновлен.\r\n"; //Сообщаем об удачнам использовании команды
- writeText();
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.indexOf("/changenameto ")!=-1) // это команда консоли, которая изменяет имя
- {agentText="";
- for(int i=14; i<cmd.length(); i++)
- agentText=agentText+cmd.charAt(i);
- nameUsedRefresh();
- if(!chekName(agentText)&&!adminStatus)
- agentText=agentName;
- nfo.namesUsed=nfo.namesUsed+agentText;
- if (adminStatus)
- agentText=agentText+"_(adm)";
- sayText("{Sustem information}: "+agentName+" изменил имя на \""+agentText+"\"\r\n");//сообщет остальным кто и как сменил имя
- System.out.print(agentName+" change name to "+agentText+"\n"); //сообщаем на сервер
- agentName=agentText;
- agentText="{Server Console}: Имя было изменено!\r\n"; //Сообщаем об удачнам использовании команды
- nameUsedRefresh();
- writeText();
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/exit")||cmd.equalsIgnoreCase("/quit")||cmd.equalsIgnoreCase("/end")) // это команда консоли, которая завершает соединение с данным пользователем
- {listenerStatus = true; //обеспечиваем возможность отправить сообщение
- sayText("{Sustem information}: Пользователь "+agentName+" покинул чат.\r\n");//сообщет остальным что этот пользователь ушел
- listenerStatus = false; // убирает возможность прослушивать чат
- agentText="\r\n{Server Console}: Вы были отсоеденены т.к. использовали команду консоли "+cmd+". Удачного дня!"; //Сообщаем об отсоединении
- writeText();
- nameUsedRefresh(agentID);
- try
- {is.close();//Закрываем потоки
- os.close();
- }
- catch (Exception ex)
- {System.out.println("IO ERROR: An unknown error occurred while working with a client ID "+agentID+". Connection with this client will be aborted. \r\nDebug information:"+ex.getMessage());
- try
- {nfo.work[agentID].listenerStatus=false;
- nfo.threads[agentID].join();
- }
- catch (InterruptedException ex1)
- {System.out.println("Thread ERROR: An unknown error was occurred with one of the threads. Program execution will be stopped.\r\nDebug information:"+ex1.getMessage());
- System.exit(0);
- }
- }
- System.out.print("ID "+agentID+" disconnected.\n");
- try
- {if (nfo.soundStatus!=0)
- nfo.sound.agentDisconnect();
- }
- catch (Exception ex)
- {
- }
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- try
- {nfo.threads[agentID].join();
- }
- catch (InterruptedException ex)
- {System.out.println("Thread ERROR: An unknown error was occurred with one of the threads. Program execution will be stopped.\r\nDebug information:"+ex.getMessage());
- System.exit(0);
- }
- }
- if (cmd.equalsIgnoreCase("/wholistentochat")||cmd.equalsIgnoreCase("/wltc")) // эта команда покажет кто в чате
- {int total=0;
- agentText="\r\nЧат прослушивают:\r\n";
- writeText();
- for(int i=1; i<=nfo.i; i++)
- if (nfo.work[i].listenerStatus)
- {agentText=nfo.work[i].agentName+" ID: "+nfo.work[i].agentID;
- if (i==agentID) agentText=agentText+" (это Вы)";
- writeText();
- total++;
- }
- agentText="\r\n________________\r\nВсего: "+total+"\r\n";
- writeText();
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/ibanned")) // эта команда консоли покажет, не забанен ли пользователь
- {agentText="{Server Console}: Ваш бан-статус: "+banned+"\r\n";
- writeText();
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/ilisten")) // эта команда консоли покажет, прослушивает ли пользователь чат
- {agentText="{Server Console}: Ваш статус слушателя чата: "+listenerStatus+"\r\n";
- writeText();
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/ping")) // эта команда консоли покажет, работает ли сервер
- {agentText="{Server Console}: Сервер работает!\r\nВаш IP и порт: "+agent.getLocalSocketAddress().toString()+"\r\n";
- writeText();
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/dice")||cmd.equalsIgnoreCase("/roll")) // эта команда выдаст случайное число от 1 до 6
- {int dice=(int)(1+Math.random()*6);
- if (adminStatus&&dice<5) // Эта строчка даст милость рандома админу
- dice=5;
- agentText="\r\n{DICE}: "+agentName+" бросил кубик и получил число: "+dice+"\r\n";
- sayText(agentText);
- writeText();
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/bigdice")||cmd.equalsIgnoreCase("/bigroll")) // эта команда выдаст случайное число от 1 до 100
- {int dice=(int)(1+Math.random()*100);
- while (adminStatus&&dice<80) // Эта строчка даст милость рандома админу
- dice=dice+5;
- agentText="\r\n{Random}: "+agentName+" получил случайное число: "+dice+"\r\n";
- sayText(agentText);
- writeText();
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/russianrollet")||cmd.equalsIgnoreCase("/rr")) // эта команда сыграет в русскую рулетку =)
- {int dice=(int)(Math.random()*2);
- if(adminStatus) //Благодаря этим строчкам админ не проиграет никогда
- dice=1;
- if (dice==0)
- {listenerStatus = true; //обеспечиваем возможность отправить сообщение
- sayText("{Russian rullet}: Пользовател "+agentName+" проиграл и был отсоединен от чата.\r\n");//сообщет остальным что этот пользователь ушел
- listenerStatus = false; // убирает возможность прослушивать чат
- agentText="\r\n{Server Console}: Вы отсоеденины т.к. проигрвли в Русскую рулетку. Не повторяйте в реальной жизни!"; //Сообщаем об отсоединении
- writeText();
- System.out.print("User"+agentName+" (ID: "+agentID+") disconnected.\n");
- nameUsedRefresh(agentID);
- try
- {if (nfo.soundStatus!=0)
- nfo.sound.agentDisconnect();
- }
- catch (Exception ex)
- {
- }
- try
- {is.close();//Закрываем потоки
- os.close();
- }
- catch (Exception ex)
- {System.out.println("IO ERROR: An unknown error occurred while working with a client ID "+agentID+". Connection with this client will be aborted. \r\nDebug information:"+ex.getMessage());
- try
- {nfo.threads[agentID].join();
- }
- catch (InterruptedException ex1)
- {System.out.println("Thread ERROR: An unknown error was occurred with one of the threads. Program execution will be stopped.\r\nDebug information:"+ex1.getMessage());
- System.exit(0);
- }
- }
- }
- else
- {agentText="\r\n{Russian rullet}: Пользователю "+agentName+" попался холостой патрон.\r\n"; // Если пользователь выжил - сообщаем об этом
- sayText(agentText);
- writeText();
- }
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/help") || cmd.equalsIgnoreCase("/h") || cmd.equalsIgnoreCase("/info")|| cmd.equalsIgnoreCase("/?")) // это команда консоли, которая выводит справку о других командах
- {agentText="\r\n_______________________________________________________________________________\r\n Пользовательские команды консоли\r\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\r\n |\r\n/help or /h or /info | Вывести пользовательские команды консоли.\r\n/g_adm_<пароль сервера> | Получить права администратора.\r\n/listen | Установить статус \"Готов общаться\".\r\n/unlisten | Установить статус \"Занят\".\r\n/changenameto <new name> | Изменить имя.\r\n/exit | Покинуть чат.\r\n/wholistentochat or /wltc | Вывести ники пользователей.\r\n/ilisten | Вывести/обновить ваш статус.\r\n/ibanned | Вывести ваш бан-статус.\r\n/ping | Проверить соединение.\r\n/dice or /roll | Бросить кубик (случайное целое от 1 до 6)\r\n/bigdice or /bigroll | Вывести случайное целое от 1 до 100.\r\n/russianrollet or /rr | Сыграть в Русскую рулетку =).\r\n____________________________|__________________________________________________\r\n\r\n"; //Сообщаем сами команды и описания
- writeText();
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- // Дополнительные команды, доступные администраторам
- if (cmd.equalsIgnoreCase("/sysexit")&&adminStatus) // эта команда консоли завершает работу сервера, быстро и без предупржедния. Доступна только администраторам сервера
- {System.exit(0); //собственно, завершение работы сервера. Так же мы делали когда нажимали на крестик в окнах
- }
- if (cmd.equalsIgnoreCase("/f")&&adminStatus) // эта команда консоли выводит флаг на экран сервера
- {System.out.print("FLAG\n");
- try
- {if (nfo.soundStatus!=0)
- nfo.sound.alarm(0);
- }
- catch (Exception ex)
- {
- }
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.indexOf("/note")!=-1&&adminStatus) // эта команда консоли выводит заметку на экран сервера
- {System.out.print(agentName+": "+cmd+"\n");
- try
- {if (nfo.soundStatus!=0)
- nfo.sound.alarm(0);
- }
- catch (Exception ex)
- {
- }
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/serverstop")&&adminStatus) // эта команда консоли останавливает сервер
- {System.out.print(agentName+" (ID "+agentID+") stoped server.\n");
- agentID=-1;
- try
- {if (nfo.soundStatus!=0)
- nfo.sound.serverStop();
- }
- catch (Exception ex)
- {
- }
- sayText("\r\n{Sustem information}: "+agentName+" остановил работу сервера чата.\r\n\r\nПопытайтесь присоединиться позже, извините за неудобства.\r\n");//сообщет остальным кто остановил сервер
- System.exit(0);
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.indexOf("/ban")!=-1&&adminStatus) // эта команда консоли банит другого пользователя
- {String banName="";
- for (int i=5; i<cmd.length(); i++)
- banName=banName+cmd.charAt(i);
- boolean noban=true;
- for (int i=1; i<=nfo.i; i++)
- if (nfo.work[i].agentName.equalsIgnoreCase(banName))
- {noban=false;
- String say="\r\n\r\nВы были забанены пользователем "+agentName+". Теперь вы НЕ можите писать в чат и использовать некоторые команды консоли. Ждите разблокировки.\r\n" ;
- nfo.work[i].agentText=say;
- nfo.work[i].writeText();
- nfo.work[i].banned=true;
- sayText("{System information}: "+banName+" был забанен пользователем "+agentName+".\r\n");
- System.out.print(banName+" was banned by "+agentName+"\n");
- }
- if (noban) {agentText="{Server Console}: Пользователя с именем "+banName+" не существует!\r\n";
- writeText();}
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.indexOf("/unban")!=-1&&adminStatus) // эта команда консоли разбанивает другого пользователя
- {String banName="";
- for (int i=7; i<cmd.length(); i++)
- banName=banName+cmd.charAt(i);
- boolean noban=true;
- for (int i=1; i<=nfo.i; i++)
- if (nfo.work[i].agentName.equalsIgnoreCase(banName))
- {noban=false;
- String say="\r\n\r\nВы были разбанены пользоватлем "+agentName+", теперь вы можете полноценно общаться!\r\n" ;
- nfo.work[i].agentText=say;
- nfo.work[i].writeText();
- nfo.work[i].banned=false;
- sayText("{System information}: "+banName+" был разбанен пользователем "+agentName+".\r\n");
- System.out.print(banName+" was UNbanned by "+agentName+"\n");
- }
- if (noban) {agentText="{Server Console}: Пользователя с именем "+banName+" не существует!\r\n";
- writeText();}
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.indexOf("/kick")!=-1&&adminStatus) // эта команда консоли выкидывает другого пользователя из чата
- {String banName="";
- for (int i=6; i<cmd.length(); i++)
- banName=banName+cmd.charAt(i);
- boolean noban=true;
- for (int i=1; i<=nfo.i; i++)
- if (nfo.work[i].agentName.equalsIgnoreCase(banName))
- {noban=false;
- String say="{System information}: Вы были кикнуты пользователем "+agentName+" из-за нарушения правил пользования чатом.\r\n" ;
- nfo.work[i].agentText=say;
- nfo.work[i].writeText();
- nfo.work[i].listenerStatus=false;
- nameUsedRefresh(i);
- try
- {nfo.work[i].is.close();
- nfo.work[i].os.close();
- }
- catch (Exception ex)
- {System.out.println("IO ERROR: An unknown error occurred while working with a client ID "+agentID+". Connection with this client will be aborted. \r\nDebug information:"+ex.getMessage());
- try
- {nfo.threads[agentID].join();
- }
- catch (InterruptedException ex1)
- {System.out.println("Thread ERROR: An unknown error was occurred with one of the threads. Program execution will be stopped.\r\nDebug information:"+ex1.getMessage());
- System.exit(0);
- }
- }
- sayText("{System information}: "+banName+" был кикнут пользователем "+agentName+".\r\n");
- try
- {if (nfo.soundStatus!=0)
- nfo.sound.agentDisconnect();
- }
- catch (Exception ex)
- {
- }
- System.out.print(banName+" was kicked by "+agentName+"\n");
- }
- if (noban) {agentText="{Server Console}: Пользователя с именем "+banName+" не существует!\r\n";
- writeText();}
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/soundon")&&adminStatus) // эта команда консоли включает звук
- {nfo.soundStatus=1;
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/soundoff")&&adminStatus) // эта команда консоли выключает звук
- {nfo.soundStatus=0;
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/isound")&&adminStatus) // эта команда показывает, включен ли звук
- {String status;
- if (nfo.soundStatus==1) status="on"; else status="off";
- agentText="{Server Console}: Sound on server is "+status+".\r\n";
- writeText();
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.indexOf("/s_adm")!=-1&&adminStatus) // эта команда консоли даст права админа другому пользователю
- {String banName="";
- for (int i=7; i<cmd.length(); i++)
- banName=banName+cmd.charAt(i);
- boolean noban=true;
- for (int i=1; i<=nfo.i; i++)
- if (nfo.work[i].agentName.equalsIgnoreCase(banName))
- {noban=false;
- String say="\r\n{Server Console}: Вам предоставлены права администратора сервера. (by "+agentName+ ")\r\n" ;
- nfo.work[i].agentText=say;
- nfo.work[i].writeText();
- nfo.work[i].adminStatus=true;
- int t=nfo.work[i].agentID;
- nfo.work[i].agentID=agentID;
- sayText("{Sustem information}: Пользователь "+banName+" получил права администратора сервера от ["+agentName+"].\r\n");
- nfo.work[i].agentName=banName+"_(adm)";
- nfo.work[i].agentID=t;
- }
- if (noban) {agentText="{Server Console}: Пользователя с именем "+banName+" не существует!\r\n";
- writeText();}
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/bp")&&adminStatus) // эта команда очень-очень-очень усложнит пароль сервера
- {nfo.password="";
- for (int i=0; i<25; i++)
- nfo.password=nfo.password+(int)(1+Math.random()*10000);
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.indexOf("/ipban")!=-1&&adminStatus) // эта команда консоли банит пользователя по ИП-адресу
- {String banName="";
- for (int i=7; i<cmd.length(); i++)
- banName=banName+cmd.charAt(i);
- boolean noban=true;
- for (int i=1; i<=nfo.i; i++)
- if (nfo.work[i].agentName.equalsIgnoreCase(banName))
- {noban=false;
- String say="{System information}: Вы были кикнуты пользователем "+agentName+" Ваш IP "+nfo.work[i].agent.getLocalAddress().toString()+" ЗАБАНЕН!\r\n" ;
- nfo.work[i].agentText=say;
- nfo.work[i].writeText();
- nfo.ipBanned=nfo.ipBanned+nfo.work[i].agent.getLocalAddress().toString()+" ";
- nfo.work[i].listenerStatus=false;
- nameUsedRefresh(i);
- try
- {nfo.work[i].is.close();
- nfo.work[i].os.close();
- }
- catch (Exception ex)
- {System.out.println("IO ERROR: An unknown error occurred while working with a client ID "+agentID+". Connection with this client will be aborted. \r\nDebug information:"+ex.getMessage());
- try
- {nfo.threads[agentID].join();
- }
- catch (InterruptedException ex1)
- {System.out.println("Thread ERROR: An unknown error was occurred with one of the threads. Program execution will be stopped.\r\nDebug information:"+ex1.getMessage());
- System.exit(0);
- }
- }
- sayText("{System information}: "+banName+" был кикнут и забанен по IP пользователем "+agentName+".\r\n");
- try
- {if (nfo.soundStatus!=0)
- nfo.sound.agentDisconnect();
- }
- catch (Exception ex)
- {
- }
- System.out.print(banName+" was kicked and IPbanned by "+agentName+"\n");
- }
- if (noban) {agentText="{Server Console}: Пользователя с именем "+banName+" не существует!\r\n";
- writeText();}
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/ipwhobanned")&&adminStatus) // эта команда консоли покажет забаненные IP
- {agentText="\r\n";
- for (int i=0; i<nfo.ipBanned.length(); i++)
- {if (nfo.ipBanned.charAt(i)==' ')
- agentText=agentText+"\r\n";
- else
- if(nfo.ipBanned.charAt(i)!='/')
- agentText=agentText+nfo.ipBanned.charAt(i);
- }
- if (nfo.ipBanned.isEmpty())
- agentText="\r\n{Server Console}: Никакие IP не забанены!";
- agentText=agentText+"\r\n";
- writeText();
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/oblivion")&&adminStatus) // эта команда очистит список забаненных IP
- {nfo.ipBanned="";
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- // Самое интересное =) "Недокументированные" служебные возможности и "пасхалки"
- if (cmd.indexOf("/aLArM")!=-1) // эта команда будит всех в радиусе 5 метров от сервера (при наличии колонок)
- {int i=cmd.length()-6;
- if (i>5) i=5;
- try
- {if (nfo.soundStatus!=0)
- nfo.sound.alarm(i);
- }
- catch (Exception ex)
- {
- }
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equals("/interesting!SerVerStoPSoUNd")) // эта команда консоли немного пошутит над админом
- {try
- {if (nfo.soundStatus!=0)
- nfo.sound.serverStop();
- }
- catch (Exception ex)
- {
- }
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/mirror")) // эта команда укажет на самую красивую =)))
- {agentText="\r\n{ZiS creator}: "+agentName+" прекраснее всех на свете! Я ГАРАНТИРУЮ это!\r\n";
- sayText(agentText);
- writeText();
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/poem")) // эта команда консоли выведет стих My hearts in the highlands
- {agentText="\r\n My heart's in the Highlands, my heart is not here,\r\n My heart's in the Highlands a-chasing the deer -\r\n A-chasing the wild deer, and following the roe;\r\n My heart's in the Highlands, wherever I go.\r\n\r\n Farewell to the Highlands, farewell to the North\r\n The birth place of Valour, the country of Worth;\r\n Wherever I wander, wherever I rove,\r\n The hills of the Highlands for ever I love.\r\n\r\n Farewell to the mountains high cover'd with snow;\r\n Farewell to the straths and green valleys below;\r\n Farewell to the forrests and wild-hanging woods;\r\n Farwell to the torrents and loud-pouring floods.\r\n\r\n My heart's in the Highlands, my heart is not here,\r\n My heart's in the Highlands a-chasing the deer\r\n Chasing the wild deer, and following the roe;\r\n My heart's in the Highlands, whereever I go.\r\n";
- writeText();
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/what is the sense of life?")||cmd.equalsIgnoreCase("/the answer to life, the universe, and everything")) // эта команда консоли виведет шутку, понятную избраннннннным =))
- {agentText="42\r\n";
- writeText();
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- // Служебные команды протокола ZSCP
- if (cmd.equalsIgnoreCase("/cu")) // эта команда консоли укажет, что пользователь использует ГРАФИЧЕСКИЙ клиент
- {visualClient=true;
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- if (cmd.equalsIgnoreCase("/#")) // для забаненный
- {agentText="{Server Console}: Вы забанены и не можете использовать эту команду консоли!";
- writeText();
- bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
- }
- //____________________________
- if (bad) {agentText="{Server Console}: Такой команды не существует илу у вас нет прав на ее использование!\r\n";
- writeText();} // эта строчка выведет польователю что ккоманда которую он ввел - неверна (понятно, только если она на самом деле неверна)
- }
- }
- class Midi //Класс, обеспечивающий поддержку звука
- {Synthesizer synthesizer; //Необходимые переменные
- Soundbank soundbank;
- Instrument[] instruments;
- MidiChannel[] channels;
- Patch patch;
- int sS;
- public Midi(int soundStatus)
- { // получаем доступ к используемому по умолчанию синтезатору
- try
- {synthesizer = MidiSystem.getSynthesizer();
- synthesizer.open();
- }
- catch (MidiUnavailableException midiUnavailableException)
- {soundStatus=0;
- }
- // получаем ссылку на используемый по умолчанию звуковой банк
- soundbank = synthesizer.getDefaultSoundbank();
- // получить масив доступных инструментов
- instruments = soundbank.getInstruments();
- // получаем доступ к каналам синтезатора
- channels = synthesizer.getChannels();
- // получаем обьект для заданого инструмента
- patch = instruments[10].getPatch();
- // связываем 0-ой инструмент со 0-ым канатом синтезатора
- channels[0].programChange(patch.getBank(), patch.getProgram());
- // указываем на паеременную, в которой указано, используем ли мы звук
- sS = soundStatus;
- }
- public void alarm(int i) //метод звука будильника и вообще универсального звукового уведомления
- {for (int j=0; j<=i*3; j++)
- {channels[0].noteOn(120,500*sS);
- try
- {Thread.sleep(500 * sS);
- }
- catch (InterruptedException ex1)
- {System.out.println("Thread ERROR: An unknown error was occurred with one of the threads. Program execution will be stopped.\r\nDebug information:"+ex1.getMessage());
- System.exit(0);
- }
- channels[0].allNotesOff();
- }
- channels[0].allSoundOff();
- }
- public void agentConnect() // метод звука подключения
- {channels[0].noteOn(80,500*sS);
- try
- {Thread.sleep(1000 * sS);
- }
- catch (InterruptedException ex1)
- {System.out.println("Thread ERROR: An unknown error was occurred with one of the threads. Program execution will be stopped.\r\nDebug information:"+ex1.getMessage());
- System.exit(0);
- }
- channels[0].allNotesOff();
- }
- public void agentDisconnect() // метоод звука отключения
- {channels[0].noteOn(60,500*sS);
- try
- {Thread.sleep(1000 * sS);
- }
- catch (InterruptedException ex1)
- {System.out.println("Thread ERROR: An unknown error was occurred with one of the threads. Program execution will be stopped.\r\nDebug information:"+ex1.getMessage());
- System.exit(0);
- }
- channels[0].allNotesOff();
- }
- public void serverStop() //метод звука остановки сервера
- {int note=120;
- for (int j=0; j<=7; j++)
- {channels[0].noteOn(note,500*sS);
- try
- {Thread.sleep(500 * sS);
- }
- catch (InterruptedException ex1)
- {System.out.println("Thread ERROR: An unknown error was occurred with one of the threads. Program execution will be stopped.\r\nDebug information:"+ex1.getMessage());
- System.exit(0);
- }
- channels[0].allNotesOff();
- note=note-10;
- }
- channels[0].allSoundOff();
- }
- }
Add Comment
Please, Sign In to add comment