Guest User

Untitled

a guest
Mar 1st, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 50.65 KB | None | 0 0
  1. import java.net.*; //Импортируем необходимые библиотеки
  2. import java.io.*;
  3. import javax.sound.midi.*;
  4.  
  5. // ServerInfo - специальный класс, хранящий информацю о сервере и некоторые его переменные
  6. class ServerInfo
  7.  {//настройки сервера, можно (и иногда нужно) изменять перед запуском
  8.   String password="5982"; //Пароль сервера, нужен чтобы стать админом
  9.   int soundStatus=1; //Указывает, используется ли звук. 1 - да, 0 - нет.
  10.   int members=300; //Указывает, сколько максимум людей может бытьна сервере
  11.   int port=2902; //Указываем порт, используемый сервером
  12.   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"; // Примечания, вывоимые подключившымся пользователям
  13.   boolean visualClientOnly=true; //Указывает на то, что сервер работает ТОЛЬКО с графическим клиентом
  14.   boolean consoleProtocol=true; // Ведется ли протокол сервера
  15.  
  16.   //служебные переменные сервера, изменять нельзя
  17.   ServerSocket server; //Объект сервера
  18.   Socket agent; //Объект агента, используется в качестве посредника
  19.   Midi sound; // Объект работы со звуком
  20.   String ipBanned=""; //Строка-список забаненных IP
  21.   String namesUsed=""; //Cтрока, хранящая уже использованные имена
  22.   WorkWithClient[] work = new WorkWithClient[members]; // Массив классов-клиентов, каждый элемент массива отвечает за свое подкючение
  23.   Thread[] threads = new Thread[members]; // Массив потоков. Каждому потоку будем передавать соответствующий элемент массива work? это позволит подключатся к серверу сразу нескольким людям
  24.   int i=0; //переменная хранит количество подключившихся к серверу клиентов
  25.   }
  26.  
  27.  
  28. class ZiSServerMainClass // Это - собственный класс сервера + главный класс, в нем мы и будем присоеденять пользователей к нашему серверу
  29. {public static void main (String[] args) throws IOException //главный метод
  30.   {ServerInfo nfo = new ServerInfo(); // Создаем объект ServerInfo
  31.  
  32.    for (int i=0; i<args.length; i++)
  33.     {if(args[i].indexOf("prt:")!=-1)
  34.       {int port=2902;
  35.        String portString="";
  36.        for (int j=4; j<args[i].length(); j++)
  37.         portString=portString+args[i].charAt(j);
  38.         try
  39.          {port = Integer.parseInt(portString);
  40.          }
  41.         catch (NumberFormatException numberFormatException)
  42.          {
  43.          }
  44.        nfo.port=port;
  45.       }
  46.      if(args[i].indexOf("sund")!=-1)
  47.       {if(args[i].charAt(4)=='+')
  48.         nfo.soundStatus=1;
  49.        else
  50.         nfo.soundStatus=0;
  51.       }
  52.      if(args[i].indexOf("cons")!=-1)
  53.       {nfo.consoleProtocol=args[i].charAt(4)=='+';
  54.       }
  55.     }
  56.  
  57.       try
  58.     {nfo.server = new ServerSocket(nfo.port); //Говорим, что наш сервер использует указанный порт
  59.     }
  60.    catch (IOException ex)
  61.     {System.out.println("Net ERROR: Port "+nfo.port+", used by the server was already reserved by another program. Restart the server using another port.");
  62.      System.exit(0);
  63.     }
  64.  
  65.    System.out.println("Server starting... Done!");// Здесь и далее выводим на экран сервера всякую разную информацию.
  66.    System.out.println( "Server port: "+nfo.port+"\nServer type: ZiS Chat (ZSCP 1.1:TCP/IPv.4)\n\n");
  67.    System.out.println("~~~~~(Z)iS (i)s (S)imple~~~~~\n\nServer ready to work!\n");
  68.  
  69.    try
  70.     {nfo.sound = new Midi(nfo.soundStatus); // Включаем поддержку звука
  71.      if (nfo.soundStatus!=0)
  72.       nfo.sound.alarm(0); //Сигнализируем о старте сервера
  73.     }
  74.    catch (Exception ex)
  75.     {System.out.println("Audio ERROR: There is no audio device at this computer, audio signals support is disabled.");
  76.      nfo.soundStatus=0;
  77.     }
  78.  
  79.    while (true) // пускаем цикл ожидания клиента пока их меньше указанного количества человек
  80.     if (nfo.i<nfo.members)
  81.      {nfo.agent = nfo.server.accept(); //ждем следующего присоеденившегося клиента
  82.       nfo.i++; //прибавляем к счетчику клиентов еденицу
  83.       try
  84.        {nfo.work[nfo.i] = new WorkWithClient(nfo.agent, nfo.i, nfo); // создаем i-тый элемент массива клиентов work (массив описан выше)
  85.         nfo.threads[nfo.i] = new Thread(nfo.work[nfo.i]);//передаем i-тому элемену массива потоков ноашего нового клиента, когда мы запустим этот поток, действия с нашим клиентом будут в отдельном потоке
  86.         nfo.threads[nfo.i].start(); //собственно, запускаем поток, работающий с нашим овым клиентом
  87.        }
  88.       catch (Exception ex)
  89.        {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());
  90.         System.exit(0);
  91.        }
  92.      }
  93.   }
  94. } // закрываеем все методы и класс
  95.  
  96.  
  97. class WorkWithClient implements Runnable // В этом классе описаны методы работы с клиентом; implements Runnable прописано для многопоточности, чтобы много людей работали одновременно
  98. {Socket agent; // Здесь оисаны поля класса; agent - класс клиента
  99.  DataInputStream is; // входящий поток
  100.  DataOutputStream os; // выходящий поток
  101.  String agentText, agentName, agentWriteUs; //Строки, с лева на право: служебная, хранит то, что мы пишем в окне клиента; хранит имя клиентаж хранит то, что написал клиент
  102.  int agentID; // хранит порядковый номер, под которым клиент присоеденился
  103.  ServerInfo nfo; // хранит ссылку на информацию о сервере
  104.  boolean adminStatus=false; //флаг, является ли пользователь администратором сервера, по умолчанию - не является
  105.  boolean listenerStatus=false; //флаг, показывает надо ли отправлять данному пользоователю реплики других людей, по умолчанию - надо отправлять
  106.  boolean banned=false; //флаг, показывает забанен ли данный пользователь,по умолчанию - не забанен
  107.  boolean visualClient; //флаг, показывает, используется ли графический клиент !!! в данный момент не актуален
  108.  final String goodName="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890 '-_"; //строчка для проверки правильности имени
  109.  
  110.   public WorkWithClient(Socket agent, int agentID, ServerInfo nfo) throws IOException //конструктор класса
  111.   {this.agent=agent; //присваиваем полям класса то, что передал нам метод сервера, ожидающий клиентов когда регестрировал данного клиента
  112.    this.agentID=agentID;
  113.    this.nfo=nfo;
  114.    visualClient=nfo.visualClientOnly;
  115.    os =new DataOutputStream(agent.getOutputStream());
  116.    is = new DataInputStream(agent.getInputStream());
  117.   }
  118.  
  119.  public void run() // этот метод содержит собственно диалог с клиентом, метод начинает выполнятся сразу же после конструктора
  120.   { try
  121.      {agentText = nfo.specialInfo;
  122.       writeText();
  123.       if (nfo.ipBanned.indexOf(agent.getLocalAddress().toString())!=-1)
  124.         {agentText="\r\n\r\n Ваш IP "+agent.getLocalAddress().toString()+" ЗАБАНЕН! Вы не сможите присоединиться!\r\n";
  125.          writeText();
  126.          is.close();
  127.          os.close();
  128.         }
  129.      }
  130.     catch (Exception ex)
  131.      {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());
  132.       try
  133.        {nfo.work[agentID].listenerStatus=false;
  134.         nfo.threads[agentID].join();
  135.        }
  136.       catch (InterruptedException ex1)
  137.        {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());
  138.         System.exit(0);
  139.        }
  140.      }
  141.  
  142.     try
  143.      {agentText = "\r\n\r\nВведите свое имя, используйте только символы: A-z; 0-9.\r\n"; //спрашиваем у клиента его имя, чтобы в чате было видно кто пишет
  144.       writeText();
  145.       readText();
  146.       boolean chek=chekName(agentWriteUs);
  147.       while(!chek)
  148.        {agentText = "Имя введено неверно или уже используеться. Введите другое имя, пожалуйста.\r\n";
  149.         if(!agentWriteUs.isEmpty())
  150.          writeText();
  151.         readText();
  152.         chek=chekName(agentWriteUs);
  153.        }
  154.       agentName=agentWriteUs;
  155.       nfo.namesUsed=nfo.namesUsed+agentName;
  156.       System.out.println("User "+agentName+" connected to server. User ID: "+agentID+" "+agent.getLocalAddress());
  157.       if (nfo.soundStatus!=0)
  158.        nfo.sound.agentConnect();
  159.       agentText = "\r\nВы успешно подключились, приятного общения!\r\n\r\n";
  160.       writeText();
  161.       sayText("{System information}: Пользователь "+agentName+" (ID "+agentID+") присоединился!\r\n");
  162.       listenerStatus=true;
  163.      }
  164.     catch (Exception ex)
  165.      {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());
  166.       try
  167.        {nfo.work[agentID].listenerStatus=false;
  168.         nfo.threads[agentID].join();
  169.        }
  170.       catch (InterruptedException ex1)
  171.        {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());
  172.         System.exit(0);
  173.        }
  174.      }
  175.  
  176.     while (true)
  177.      try
  178.       {readText(); // модуль чата, после того как узнали имя клиента он считывает то, что написал клиент и если это не команда консолли (команда консоли имеет вид /бла-бла-бла), то выводит этот текст друим пользователям на экран
  179.        if (agentWriteUs==null||agentWriteUs.isEmpty()) agentWriteUs=" ";
  180.        if (agentWriteUs.charAt(0)=='/')
  181.          userConsole(agentWriteUs);
  182.         else
  183.          if(listenerStatus || adminStatus)
  184.           sayText("["+agentName+"]: "+agentWriteUs+"\r\n");
  185.       }
  186.      catch (Exception ex)
  187.      {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());
  188.       nfo.work[agentID].listenerStatus=false;
  189.       try
  190.        {os.close();
  191.         is.close();
  192.         nfo.threads[agentID].join();
  193.        }
  194.       catch (Exception ex1)
  195.        {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());
  196.         System.exit(0);
  197.        }
  198.      }
  199.  }
  200. // Здесь идут методы, которые мы использовали когда читали имя и когда делали сам чат (9 строчек выше)
  201.  
  202.  public void writeText()  // этот метод выводет на экран данному пользователю содержание строки agentText (смотри поля класса)
  203.   {try
  204.     {os.writeUTF(agentText);
  205.     }
  206.    catch (Exception ex)
  207.      {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());
  208.       nfo.work[agentID].listenerStatus=false;
  209.       try
  210.        {nfo.threads[agentID].join();
  211.        }
  212.       catch (InterruptedException ex1)
  213.        {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());
  214.         System.exit(0);
  215.        }
  216.      }
  217.    agentText="";
  218.   }
  219.  
  220.  public void readText()  // этот метод читает то, что пишет пользователь и сохраняет это в строку agentWriteUs
  221.   {agentWriteUs="";
  222.    try
  223.     {agentWriteUs = is.readUTF();
  224.     }
  225.    catch (Exception ex)
  226.      {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());
  227.       nfo.work[agentID].listenerStatus=false;
  228.       try
  229.        {nfo.threads[agentID].join();
  230.        }
  231.       catch (InterruptedException ex1)
  232.        {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());
  233.         System.exit(0);
  234.        }
  235.      }
  236.   }
  237.  
  238.  public void sayText(String say) // этот метотд выводит всем пользователям на экран ту строку, которую ему передали (т.е. строку Say) если пользователь не забанен
  239.   {if (!say.isEmpty()&&!say.equals("["+agentName+"]:  \r\n")&&!banned)
  240.     for (int i=1; i<=nfo.i; i++)
  241.      if (nfo.work[i].listenerStatus&&!(say.charAt(0)=='{'&&agentID==i))
  242.       {nfo.work[i].agentText=say;
  243.        nfo.work[i].writeText();
  244.       }
  245.   }
  246.  
  247.  public boolean chekName(String name)  //этод метод проверяет имя на правильность
  248.   {boolean res=!name.isEmpty();
  249.    nameUsedRefresh();
  250.    for (int i=0; i<name.length(); i++)
  251.     if (goodName.indexOf(name.charAt(i))==-1)
  252.      res=false;
  253.    if(nfo.namesUsed.indexOf(name)!=-1)
  254.     res=false;
  255.    if(name.length()>15)
  256.     res=false;
  257.    return res;
  258.   }
  259.  
  260.  public void nameUsedRefresh()
  261.   {nfo.namesUsed="";
  262.    for (int i=1; i<nfo.i; i++)
  263.     nfo.namesUsed=nfo.namesUsed+nfo.work[i].agentName;
  264.   }
  265.  
  266.  public void nameUsedRefresh(int id)
  267.   {nfo.namesUsed="";
  268.    nfo.work[id].agentName="";
  269.    for (int i=1; i<nfo.i; i++)
  270.     nfo.namesUsed=nfo.namesUsed+nfo.work[i].agentName;
  271.   }
  272.  
  273.  public void userConsole(String cmd) //этот метод содержит консоль - маленький набор команд, который пользователи могут отдать серверу со своего клиента
  274.          // команды консоли имеют вид /бла-бла... они не печатаются на экранах других пользователей, любую строчку которая насинается с "/" сервер считает командой консоли
  275.   {if (!adminStatus&nfo.consoleProtocol)
  276.     System.out.println("User "+agentName+" (ID: "+agentID+") trying to use a console command:"+cmd); // эта строчка выводит на экран сервера ту команду консоли, которую написал пользователь
  277.  
  278.    boolean bad=true; // это флаг, который поможет определить существует ли такая команда консоли, которую ввел пользователь
  279.  
  280.    if (banned&!(cmd.equalsIgnoreCase("/exit")||cmd.equalsIgnoreCase("/unlisten")||cmd.equalsIgnoreCase("/listen")||cmd.equalsIgnoreCase("/ilisten")||cmd.equalsIgnoreCase("/ibanned")||cmd.equalsIgnoreCase("/ping")))
  281.     cmd="/#";//Для забаненных
  282.  
  283.    // Пользовательская консоль
  284.    if (cmd.equalsIgnoreCase("/g_adm_"+nfo.password)) // эта команда консоли дает тому кто ее ввел статус администратора
  285.    {adminStatus = true; // собственно, программно дает статус
  286.     sayText("{Sustem information}: Пользователь "+agentName+" получил права администратора сервера от Server Console.\r\n");//сообщет остальным что этот пользователь - админ
  287.     agentName=agentName+"_(adm)";
  288.     agentText="{Server Console}: Ваш статус изменен на \"Администратор сервера\".\r\n"; //Сообщаем об удачнам использовании команды
  289.     writeText();
  290.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  291.    }
  292.  
  293.     if (cmd.equalsIgnoreCase("/unlisten")) // это команда консоли, которая делает так, что данный пользователь не получает сообщений
  294.    {listenerStatus = false; // собственно, программно делает это
  295.     sayText("{Sustem information}: Пользователь "+agentName+" изменил статус на \"Занят\".\r\n");//сообщет остальным что этот пользователь не прослушивает чат
  296.     agentText="{Server Console}: Статус обновлен.\r\n"; //Сообщаем об удачнам использовании команды
  297.     writeText();
  298.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  299.    }
  300.  
  301.    if (cmd.equalsIgnoreCase("/listen")) // это команда консоли, которая делает так, что данный пользователь получает сообщений
  302.    {listenerStatus = true; // собственно, программно делает это
  303.     sayText("{Sustem information}: Пользователь "+agentName+" изменил статус на \"Готов общаться\".\r\n");//сообщет остальным что этот пользователь прослушивает чат
  304.     agentText="{Server Console}: Статус обновлен.\r\n"; //Сообщаем об удачнам использовании команды
  305.     writeText();
  306.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  307.    }
  308.  
  309.    if (cmd.indexOf("/changenameto ")!=-1) // это команда консоли, которая изменяет имя
  310.    {agentText="";
  311.     for(int i=14; i<cmd.length(); i++)
  312.      agentText=agentText+cmd.charAt(i);
  313.     nameUsedRefresh();
  314.     if(!chekName(agentText)&&!adminStatus)
  315.      agentText=agentName;
  316.     nfo.namesUsed=nfo.namesUsed+agentText;
  317.     if (adminStatus)
  318.      agentText=agentText+"_(adm)";
  319.     sayText("{Sustem information}: "+agentName+" изменил имя на \""+agentText+"\"\r\n");//сообщет остальным кто и как сменил имя
  320.     System.out.print(agentName+" change name to "+agentText+"\n"); //сообщаем на сервер
  321.     agentName=agentText;
  322.     agentText="{Server Console}: Имя было изменено!\r\n"; //Сообщаем об удачнам использовании команды
  323.     nameUsedRefresh();
  324.     writeText();
  325.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  326.    }
  327.  
  328.    if (cmd.equalsIgnoreCase("/exit")||cmd.equalsIgnoreCase("/quit")||cmd.equalsIgnoreCase("/end")) // это команда консоли, которая завершает соединение с данным пользователем
  329.    {listenerStatus = true; //обеспечиваем возможность отправить сообщение
  330.     sayText("{Sustem information}: Пользователь "+agentName+" покинул чат.\r\n");//сообщет остальным что этот пользователь ушел
  331.     listenerStatus = false; // убирает возможность прослушивать чат
  332.     agentText="\r\n{Server Console}: Вы были отсоеденены т.к. использовали команду консоли "+cmd+". Удачного дня!"; //Сообщаем об отсоединении
  333.     writeText();
  334.     nameUsedRefresh(agentID);
  335.     try
  336.      {is.close();//Закрываем потоки
  337.       os.close();
  338.      }
  339.     catch (Exception ex)
  340.      {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());
  341.       try
  342.        {nfo.work[agentID].listenerStatus=false;
  343.         nfo.threads[agentID].join();
  344.        }
  345.       catch (InterruptedException ex1)
  346.        {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());
  347.         System.exit(0);
  348.        }
  349.      }
  350.     System.out.print("ID "+agentID+" disconnected.\n");
  351.     try
  352.      {if (nfo.soundStatus!=0)
  353.        nfo.sound.agentDisconnect();
  354.      }
  355.     catch (Exception ex)
  356.      {
  357.      }
  358.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  359.     try
  360.      {nfo.threads[agentID].join();
  361.      }
  362.     catch (InterruptedException ex)
  363.      {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());
  364.       System.exit(0);
  365.      }
  366.    }
  367.  
  368.    if (cmd.equalsIgnoreCase("/wholistentochat")||cmd.equalsIgnoreCase("/wltc")) // эта команда покажет кто в чате
  369.    {int total=0;
  370.     agentText="\r\nЧат прослушивают:\r\n";
  371.     writeText();
  372.     for(int i=1; i<=nfo.i; i++)
  373.      if (nfo.work[i].listenerStatus)
  374.       {agentText=nfo.work[i].agentName+" ID: "+nfo.work[i].agentID;
  375.        if (i==agentID) agentText=agentText+"          (это Вы)";
  376.        writeText();
  377.        total++;
  378.       }
  379.     agentText="\r\n________________\r\nВсего: "+total+"\r\n";
  380.     writeText();
  381.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  382.    }
  383.  
  384.    if (cmd.equalsIgnoreCase("/ibanned")) // эта команда консоли покажет, не забанен ли пользователь
  385.    {agentText="{Server Console}: Ваш бан-статус: "+banned+"\r\n";
  386.     writeText();
  387.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  388.    }
  389.  
  390.    if (cmd.equalsIgnoreCase("/ilisten")) // эта команда консоли покажет, прослушивает ли пользователь чат
  391.    {agentText="{Server Console}: Ваш статус слушателя чата: "+listenerStatus+"\r\n";
  392.     writeText();
  393.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  394.    }
  395.  
  396.    if (cmd.equalsIgnoreCase("/ping")) // эта команда консоли покажет, работает ли сервер
  397.    {agentText="{Server Console}: Сервер работает!\r\nВаш IP и порт: "+agent.getLocalSocketAddress().toString()+"\r\n";
  398.     writeText();
  399.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  400.    }
  401.  
  402.    if (cmd.equalsIgnoreCase("/dice")||cmd.equalsIgnoreCase("/roll")) // эта команда выдаст случайное число от 1 до 6
  403.    {int dice=(int)(1+Math.random()*6);
  404.     if (adminStatus&&dice<5) // Эта строчка даст милость рандома админу
  405.      dice=5;
  406.     agentText="\r\n{DICE}: "+agentName+" бросил кубик и получил число: "+dice+"\r\n";
  407.     sayText(agentText);
  408.     writeText();
  409.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  410.    }
  411.  
  412.    if (cmd.equalsIgnoreCase("/bigdice")||cmd.equalsIgnoreCase("/bigroll")) // эта команда выдаст случайное число от 1 до 100
  413.    {int dice=(int)(1+Math.random()*100);
  414.     while  (adminStatus&&dice<80) // Эта строчка даст милость рандома админу
  415.      dice=dice+5;
  416.     agentText="\r\n{Random}: "+agentName+" получил случайное число: "+dice+"\r\n";
  417.     sayText(agentText);
  418.     writeText();
  419.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  420.    }
  421.  
  422.    if (cmd.equalsIgnoreCase("/russianrollet")||cmd.equalsIgnoreCase("/rr")) // эта команда сыграет в русскую рулетку =)
  423.    {int dice=(int)(Math.random()*2);
  424.     if(adminStatus) //Благодаря этим строчкам админ не проиграет никогда
  425.      dice=1;
  426.     if (dice==0)
  427.      {listenerStatus = true; //обеспечиваем возможность отправить сообщение
  428.       sayText("{Russian rullet}: Пользовател "+agentName+" проиграл и был отсоединен от чата.\r\n");//сообщет остальным что этот пользователь ушел
  429.       listenerStatus = false; // убирает возможность прослушивать чат
  430.       agentText="\r\n{Server Console}: Вы отсоеденины т.к. проигрвли в Русскую рулетку. Не повторяйте в реальной жизни!"; //Сообщаем об отсоединении
  431.       writeText();
  432.       System.out.print("User"+agentName+" (ID: "+agentID+") disconnected.\n");
  433.       nameUsedRefresh(agentID);
  434.       try
  435.        {if (nfo.soundStatus!=0)
  436.          nfo.sound.agentDisconnect();
  437.        }
  438.       catch (Exception ex)
  439.        {
  440.        }
  441.       try
  442.        {is.close();//Закрываем потоки
  443.         os.close();
  444.        }
  445.       catch (Exception ex)
  446.        {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());
  447.         try
  448.          {nfo.threads[agentID].join();
  449.          }
  450.         catch (InterruptedException ex1)
  451.          {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());
  452.           System.exit(0);
  453.          }
  454.        }
  455.      }
  456.     else
  457.      {agentText="\r\n{Russian rullet}: Пользователю "+agentName+" попался холостой патрон.\r\n"; // Если пользователь выжил - сообщаем об этом
  458.       sayText(agentText);
  459.       writeText();
  460.      }
  461.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  462.    }
  463.  
  464.    if (cmd.equalsIgnoreCase("/help") || cmd.equalsIgnoreCase("/h") || cmd.equalsIgnoreCase("/info")|| cmd.equalsIgnoreCase("/?")) // это команда консоли, которая выводит справку о других командах
  465.    {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"; //Сообщаем сами команды и описания
  466.     writeText();
  467.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  468.    }
  469.  
  470.    // Дополнительные команды, доступные администраторам
  471.    if (cmd.equalsIgnoreCase("/sysexit")&&adminStatus) // эта команда консоли завершает работу сервера, быстро и без предупржедния. Доступна только администраторам сервера
  472.    {System.exit(0); //собственно, завершение работы сервера. Так же мы делали когда нажимали на крестик в окнах
  473.    }
  474.  
  475.    if (cmd.equalsIgnoreCase("/f")&&adminStatus) // эта команда консоли выводит флаг на экран сервера
  476.    {System.out.print("FLAG\n");
  477.     try
  478.      {if (nfo.soundStatus!=0)
  479.        nfo.sound.alarm(0);
  480.      }
  481.     catch (Exception ex)
  482.      {
  483.      }
  484.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  485.    }
  486.  
  487.    if (cmd.indexOf("/note")!=-1&&adminStatus) // эта команда консоли выводит заметку на экран сервера
  488.    {System.out.print(agentName+": "+cmd+"\n");
  489.     try
  490.      {if (nfo.soundStatus!=0)
  491.        nfo.sound.alarm(0);
  492.      }
  493.     catch (Exception ex)
  494.      {
  495.      }
  496.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  497.    }
  498.  
  499.    if (cmd.equalsIgnoreCase("/serverstop")&&adminStatus) // эта команда консоли останавливает сервер
  500.    {System.out.print(agentName+" (ID "+agentID+") stoped server.\n");
  501.     agentID=-1;
  502.     try
  503.      {if (nfo.soundStatus!=0)
  504.        nfo.sound.serverStop();
  505.      }
  506.     catch (Exception ex)
  507.      {
  508.      }
  509.     sayText("\r\n{Sustem information}: "+agentName+" остановил работу сервера чата.\r\n\r\nПопытайтесь присоединиться позже, извините за неудобства.\r\n");//сообщет остальным кто остановил сервер
  510.     System.exit(0);
  511.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  512.    }
  513.  
  514.    if (cmd.indexOf("/ban")!=-1&&adminStatus) // эта команда консоли банит другого пользователя
  515.    {String banName="";
  516.     for (int i=5; i<cmd.length(); i++)
  517.      banName=banName+cmd.charAt(i);
  518.     boolean noban=true;
  519.     for (int i=1; i<=nfo.i; i++)
  520.      if (nfo.work[i].agentName.equalsIgnoreCase(banName))
  521.       {noban=false;
  522.        String say="\r\n\r\nВы были забанены пользователем  "+agentName+". Теперь вы НЕ можите писать в чат и использовать некоторые команды консоли. Ждите разблокировки.\r\n" ;
  523.        nfo.work[i].agentText=say;
  524.        nfo.work[i].writeText();
  525.        nfo.work[i].banned=true;
  526.        sayText("{System information}: "+banName+" был забанен пользователем "+agentName+".\r\n");
  527.        System.out.print(banName+" was banned by "+agentName+"\n");
  528.       }
  529.     if (noban) {agentText="{Server Console}: Пользователя с именем "+banName+" не существует!\r\n";
  530.     writeText();}
  531.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  532.    }
  533.  
  534.    if (cmd.indexOf("/unban")!=-1&&adminStatus) // эта команда консоли разбанивает другого пользователя
  535.    {String banName="";
  536.     for (int i=7; i<cmd.length(); i++)
  537.      banName=banName+cmd.charAt(i);
  538.     boolean noban=true;
  539.     for (int i=1; i<=nfo.i; i++)
  540.      if (nfo.work[i].agentName.equalsIgnoreCase(banName))
  541.       {noban=false;
  542.        String say="\r\n\r\nВы были разбанены пользоватлем "+agentName+", теперь вы можете полноценно общаться!\r\n" ;
  543.        nfo.work[i].agentText=say;
  544.        nfo.work[i].writeText();
  545.        nfo.work[i].banned=false;
  546.        sayText("{System information}: "+banName+" был разбанен пользователем "+agentName+".\r\n");
  547.        System.out.print(banName+" was UNbanned by "+agentName+"\n");
  548.       }
  549.     if (noban) {agentText="{Server Console}: Пользователя с именем "+banName+" не существует!\r\n";
  550.     writeText();}
  551.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  552.    }
  553.  
  554.    if (cmd.indexOf("/kick")!=-1&&adminStatus) // эта команда консоли выкидывает другого пользователя из чата
  555.    {String banName="";
  556.     for (int i=6; i<cmd.length(); i++)
  557.      banName=banName+cmd.charAt(i);
  558.     boolean noban=true;
  559.     for (int i=1; i<=nfo.i; i++)
  560.      if (nfo.work[i].agentName.equalsIgnoreCase(banName))
  561.       {noban=false;
  562.        String say="{System information}:  Вы были кикнуты пользователем "+agentName+"  из-за нарушения правил пользования чатом.\r\n" ;
  563.        nfo.work[i].agentText=say;
  564.        nfo.work[i].writeText();
  565.        nfo.work[i].listenerStatus=false;
  566.        nameUsedRefresh(i);
  567.        try
  568.         {nfo.work[i].is.close();
  569.          nfo.work[i].os.close();
  570.         }
  571.        catch (Exception ex)
  572.         {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());
  573.          try
  574.           {nfo.threads[agentID].join();
  575.           }
  576.          catch (InterruptedException ex1)
  577.           {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());
  578.            System.exit(0);
  579.           }
  580.         }
  581.        sayText("{System information}: "+banName+" был кикнут пользователем "+agentName+".\r\n");
  582.        try
  583.         {if (nfo.soundStatus!=0)
  584.            nfo.sound.agentDisconnect();
  585.         }
  586.        catch (Exception ex)
  587.         {
  588.         }
  589.        System.out.print(banName+" was kicked by "+agentName+"\n");
  590.       }
  591.     if (noban) {agentText="{Server Console}: Пользователя с именем "+banName+" не существует!\r\n";
  592.     writeText();}
  593.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  594.    }
  595.  
  596.    if (cmd.equalsIgnoreCase("/soundon")&&adminStatus) // эта команда консоли включает звук
  597.    {nfo.soundStatus=1;
  598.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  599.    }
  600.  
  601.    if (cmd.equalsIgnoreCase("/soundoff")&&adminStatus) // эта команда консоли выключает звук
  602.    {nfo.soundStatus=0;
  603.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  604.    }
  605.  
  606.    if (cmd.equalsIgnoreCase("/isound")&&adminStatus) // эта команда показывает, включен ли звук
  607.    {String status;
  608.     if (nfo.soundStatus==1) status="on"; else status="off";
  609.     agentText="{Server Console}: Sound on server is "+status+".\r\n";
  610.     writeText();
  611.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  612.    }
  613.  
  614.    if (cmd.indexOf("/s_adm")!=-1&&adminStatus) // эта команда консоли даст права админа другому пользователю
  615.    {String banName="";
  616.     for (int i=7; i<cmd.length(); i++)
  617.      banName=banName+cmd.charAt(i);
  618.     boolean noban=true;
  619.     for (int i=1; i<=nfo.i; i++)
  620.      if (nfo.work[i].agentName.equalsIgnoreCase(banName))
  621.       {noban=false;
  622.        String say="\r\n{Server Console}: Вам предоставлены права администратора сервера. (by "+agentName+ ")\r\n" ;
  623.        nfo.work[i].agentText=say;
  624.        nfo.work[i].writeText();
  625.        nfo.work[i].adminStatus=true;
  626.        int t=nfo.work[i].agentID;
  627.        nfo.work[i].agentID=agentID;
  628.        sayText("{Sustem information}: Пользователь "+banName+" получил права администратора сервера от  ["+agentName+"].\r\n");
  629.        nfo.work[i].agentName=banName+"_(adm)";
  630.        nfo.work[i].agentID=t;
  631.       }
  632.     if (noban) {agentText="{Server Console}: Пользователя с именем "+banName+" не существует!\r\n";
  633.     writeText();}
  634.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  635.    }
  636.  
  637.    if (cmd.equalsIgnoreCase("/bp")&&adminStatus) // эта команда очень-очень-очень усложнит пароль сервера
  638.    {nfo.password="";
  639.     for (int i=0; i<25; i++)
  640.      nfo.password=nfo.password+(int)(1+Math.random()*10000);
  641.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  642.    }
  643.  
  644.    if (cmd.indexOf("/ipban")!=-1&&adminStatus) // эта команда консоли банит пользователя по ИП-адресу
  645.    {String banName="";
  646.     for (int i=7; i<cmd.length(); i++)
  647.      banName=banName+cmd.charAt(i);
  648.     boolean noban=true;
  649.     for (int i=1; i<=nfo.i; i++)
  650.      if (nfo.work[i].agentName.equalsIgnoreCase(banName))
  651.       {noban=false;
  652.        String say="{System information}:  Вы были кикнуты пользователем "+agentName+"  Ваш IP "+nfo.work[i].agent.getLocalAddress().toString()+" ЗАБАНЕН!\r\n" ;
  653.        nfo.work[i].agentText=say;
  654.        nfo.work[i].writeText();
  655.        nfo.ipBanned=nfo.ipBanned+nfo.work[i].agent.getLocalAddress().toString()+" ";
  656.        nfo.work[i].listenerStatus=false;
  657.        nameUsedRefresh(i);
  658.        try
  659.         {nfo.work[i].is.close();
  660.          nfo.work[i].os.close();
  661.         }
  662.       catch (Exception ex)
  663.        {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());
  664.         try
  665.          {nfo.threads[agentID].join();
  666.          }
  667.         catch (InterruptedException ex1)
  668.          {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());
  669.           System.exit(0);
  670.          }
  671.        }
  672.        sayText("{System information}: "+banName+" был кикнут и забанен по IP пользователем "+agentName+".\r\n");
  673.        try
  674.         {if (nfo.soundStatus!=0)
  675.           nfo.sound.agentDisconnect();
  676.         }
  677.        catch (Exception ex)
  678.         {
  679.         }
  680.        System.out.print(banName+" was kicked and IPbanned by "+agentName+"\n");
  681.       }
  682.     if (noban) {agentText="{Server Console}: Пользователя с именем "+banName+" не существует!\r\n";
  683.     writeText();}
  684.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  685.    }
  686.  
  687.    if (cmd.equalsIgnoreCase("/ipwhobanned")&&adminStatus) // эта команда консоли покажет забаненные IP
  688.    {agentText="\r\n";
  689.     for (int i=0; i<nfo.ipBanned.length(); i++)
  690.     {if (nfo.ipBanned.charAt(i)==' ')
  691.       agentText=agentText+"\r\n";
  692.      else
  693.       if(nfo.ipBanned.charAt(i)!='/')
  694.        agentText=agentText+nfo.ipBanned.charAt(i);
  695.     }
  696.     if (nfo.ipBanned.isEmpty())
  697.      agentText="\r\n{Server Console}: Никакие IP не забанены!";
  698.     agentText=agentText+"\r\n";
  699.     writeText();
  700.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  701.    }
  702.  
  703.    if (cmd.equalsIgnoreCase("/oblivion")&&adminStatus) // эта команда очистит список забаненных IP
  704.    {nfo.ipBanned="";
  705.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  706.    }
  707.  
  708.    // Самое интересное =) "Недокументированные" служебные возможности и "пасхалки"
  709.  
  710.    if (cmd.indexOf("/aLArM")!=-1) // эта команда будит всех в радиусе 5 метров от сервера (при наличии колонок)
  711.    {int i=cmd.length()-6;
  712.     if (i>5) i=5;
  713.     try
  714.      {if (nfo.soundStatus!=0)
  715.        nfo.sound.alarm(i);
  716.      }
  717.     catch (Exception ex)
  718.      {
  719.      }
  720.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  721.    }
  722.  
  723.    if (cmd.equals("/interesting!SerVerStoPSoUNd")) // эта команда консоли немного пошутит над админом
  724.    {try
  725.      {if (nfo.soundStatus!=0)
  726.        nfo.sound.serverStop();
  727.      }
  728.     catch (Exception ex)
  729.      {
  730.      }
  731.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  732.    }
  733.  
  734.    if (cmd.equalsIgnoreCase("/mirror")) // эта команда укажет на самую красивую =)))
  735.    {agentText="\r\n{ZiS creator}: "+agentName+" прекраснее всех на свете! Я ГАРАНТИРУЮ это!\r\n";
  736.     sayText(agentText);
  737.     writeText();
  738.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  739.    }
  740.  
  741.    if (cmd.equalsIgnoreCase("/poem")) // эта команда консоли выведет стих My hearts in the highlands
  742.    {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";
  743.     writeText();
  744.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  745.    }
  746.  
  747.    if (cmd.equalsIgnoreCase("/what is the sense of life?")||cmd.equalsIgnoreCase("/the answer to life, the universe, and everything")) // эта команда консоли виведет шутку, понятную избраннннннным =))
  748.    {agentText="42\r\n";
  749.     writeText();
  750.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  751.    }
  752.  
  753.    // Служебные команды протокола ZSCP
  754.  
  755.    if (cmd.equalsIgnoreCase("/cu")) // эта команда консоли укажет, что пользователь использует ГРАФИЧЕСКИЙ клиент
  756.    {visualClient=true;
  757.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  758.    }
  759.  
  760.    if (cmd.equalsIgnoreCase("/#")) // для забаненный
  761.    {agentText="{Server Console}: Вы забанены и не можете использовать эту команду консоли!";
  762.     writeText();
  763.     bad=false; // отмечает, что если пользователь ввел эту команду, то она верна
  764.    }
  765.  
  766.  
  767.    //____________________________
  768.    if (bad) {agentText="{Server Console}: Такой команды не существует илу у вас нет прав на ее использование!\r\n";
  769.     writeText();} // эта строчка выведет польователю что ккоманда которую он ввел - неверна (понятно, только если она на самом деле неверна)
  770.   }
  771. }
  772.  
  773. class Midi //Класс, обеспечивающий поддержку звука
  774.  {Synthesizer synthesizer; //Необходимые переменные
  775.   Soundbank soundbank;
  776.   Instrument[] instruments;
  777.   MidiChannel[] channels;
  778.   Patch patch;
  779.   int sS;
  780.  
  781.   public Midi(int soundStatus)
  782.    { // получаем доступ к используемому по умолчанию синтезатору
  783.     try
  784.      {synthesizer = MidiSystem.getSynthesizer();
  785.       synthesizer.open();
  786.      }
  787.     catch (MidiUnavailableException midiUnavailableException)
  788.      {soundStatus=0;
  789.      }
  790.     // получаем ссылку на используемый по умолчанию звуковой банк
  791.     soundbank = synthesizer.getDefaultSoundbank();
  792.     // получить масив доступных инструментов
  793.     instruments = soundbank.getInstruments();
  794.     // получаем доступ к каналам синтезатора
  795.     channels = synthesizer.getChannels();
  796.     // получаем обьект для заданого инструмента
  797.     patch = instruments[10].getPatch();
  798.     // связываем 0-ой инструмент со 0-ым канатом синтезатора
  799.     channels[0].programChange(patch.getBank(), patch.getProgram());
  800.     // указываем на паеременную, в которой указано, используем ли мы звук
  801.      sS = soundStatus;
  802.    }
  803.  
  804.   public void alarm(int i)  //метод звука будильника и вообще универсального звукового уведомления
  805.    {for (int j=0; j<=i*3; j++)
  806.      {channels[0].noteOn(120,500*sS);
  807.       try
  808.        {Thread.sleep(500 * sS);
  809.        }
  810.       catch (InterruptedException ex1)
  811.        {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());
  812.         System.exit(0);
  813.        }
  814.       channels[0].allNotesOff();
  815.      }
  816.     channels[0].allSoundOff();
  817.    }
  818.  
  819.   public void agentConnect()  // метод звука подключения
  820.    {channels[0].noteOn(80,500*sS);
  821.     try
  822.      {Thread.sleep(1000 * sS);
  823.      }
  824.     catch (InterruptedException ex1)
  825.      {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());
  826.       System.exit(0);
  827.      }
  828.     channels[0].allNotesOff();
  829.    }
  830.  
  831.   public void agentDisconnect()  // метоод звука отключения
  832.    {channels[0].noteOn(60,500*sS);
  833.     try
  834.      {Thread.sleep(1000 * sS);
  835.      }
  836.     catch (InterruptedException ex1)
  837.      {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());
  838.       System.exit(0);
  839.      }
  840.     channels[0].allNotesOff();
  841.    }
  842.  
  843.   public void serverStop()  //метод звука остановки сервера
  844.    {int note=120;
  845.     for (int j=0; j<=7; j++)
  846.      {channels[0].noteOn(note,500*sS);
  847.       try
  848.        {Thread.sleep(500 * sS);
  849.        }
  850.       catch (InterruptedException ex1)
  851.        {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());
  852.         System.exit(0);
  853.        }
  854.       channels[0].allNotesOff();
  855.       note=note-10;
  856.      }
  857.     channels[0].allSoundOff();
  858.    }
  859.  }
Add Comment
Please, Sign In to add comment