Advertisement
qekaqeka

server

Dec 14th, 2019
2,742
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "serv.h"
  2. #include "ui_serv.h"
  3. #include <QHostAddress>
  4. #include <QLabel>
  5. #include <QNetworkInterface>
  6. #include <QClipboard>
  7.  
  8. serv::serv(QWidget *parent) :
  9.     QWidget(parent),
  10.     ui(new Ui::serv)
  11. {
  12.     ui->setupUi(this);
  13.     _serv = new QTcpServer(this);
  14.     connect(_serv,SIGNAL(newConnection()) ,this,SLOT(newCon()));
  15.     ui->pushButton_3->setEnabled(false);
  16.     ui->listWidget->addItem("Напишите /help для подсказки");
  17. }
  18. //---------------------------------
  19.     static QVector<QString> bannedNames;
  20.     static QVector<QTcpSocket*> sok ;
  21.     static QVector<QTcpSocket*> banned;
  22.     static QVector<QString> names;
  23. //-------------------------------------
  24. serv::~serv()
  25. {
  26.     delete ui;
  27. }
  28. //------------------------------------------------------------------------------------------------
  29. void serv::newCon() {
  30.     ui->pushButton->setEnabled(true);
  31.     QTcpSocket*  _soke = _serv->nextPendingConnection();
  32.  
  33.     QByteArray arr1;
  34.     QDataStream _key(&arr1,QIODevice::WriteOnly);
  35.     QString key = shifKey(getKey());
  36.  
  37.     _key << 0 << (quint8)1 << key;
  38.     _key.device()->seek(0);
  39.     _key << int(arr1.size() - sizeof(quint8) - sizeof(int));
  40.     _soke->write(arr1);
  41.     for(QTcpSocket* ban:banned)
  42.     {
  43.         if(ban == _soke)
  44.         {
  45.         _soke->write(f_message(3,"Вы забанены."));
  46.         return;
  47.         }
  48.     }
  49.     sok.push_back(_soke);
  50.  
  51.     connect(_soke,SIGNAL(readyRead()),this,SLOT(readyR()));
  52.     connect(_soke,SIGNAL(disconnected()),this,SLOT(disCon()));
  53. }
  54. void serv::disCon(){
  55.     auto i = sok.begin();
  56.     auto _i = names.begin();
  57.     int a = 0;
  58.     QTcpSocket* soke = static_cast<QTcpSocket*>(sender());
  59.     for(QTcpSocket* _sok:sok) {
  60.         if(soke == _sok) {sok.erase(i+a);
  61.             ui->listWidget->addItem(names[a] + " отключился.");
  62.             names.erase(_i+a) ;break;}
  63.         a++;
  64.        }
  65.     if(sok.size() == 0)
  66.         ui->pushButton->setEnabled(false);
  67.  
  68. }
  69.  
  70.  
  71. //-----------------------------------------------------------------------------------------------------------
  72. void serv::readyR()
  73. {
  74.  
  75.     QTcpSocket* _sock = static_cast<QTcpSocket*>(sender());
  76.  
  77.  
  78.     QDataStream mes(_sock);
  79.  
  80.     if(_size == 0) {
  81.     if(_sock->bytesAvailable() < (int)sizeof(int))
  82.      return;
  83.     else{
  84.      mes >> _size;
  85.  
  86.     }
  87.     }
  88.  
  89.   if(command == 0 ){
  90.   if(_sock->bytesAvailable() < (int)sizeof(quint8))
  91.       return;
  92.   else{
  93.       mes >> command;
  94.   }
  95.   }
  96.   if(_sock->bytesAvailable() < _size && !messageAccept)
  97.         return;
  98.   else if (!messageAccept){
  99.         mes >> messageInp;
  100.         _size = 0;
  101.         messageAccept = true;
  102.     }
  103.   QByteArray arr1;
  104.   QDataStream _key(&arr1,QIODevice::WriteOnly);
  105.  
  106.  
  107.  
  108.  
  109.   if (messageAccept && command == 2) {
  110.       ui->listWidget->addItem(deShif(messageInp));
  111.       command = 0;
  112.       messageInp.clear();
  113.     for(int i=0;i < sok.size();i++)
  114.     {
  115.         if(sok[i] == _sock)
  116.              continue;
  117.         sok[i]->write(f_message(2,deShif(messageInp)));
  118.         messageAccept = false;
  119.  
  120.     }
  121.  
  122.  
  123. }
  124.     if (messageAccept && command == 1)
  125.     {
  126.         names.push_back(deShif(messageInp));
  127.         for(int i=0;i < sok.size();i++)
  128.         {
  129.                 if(sok[i] == _sock)
  130.                 {
  131.                     continue;
  132.                 }
  133.             sok[i]->write(f_message(2,deShif(messageInp) + " подключился."));
  134.  
  135.         }
  136.         command = 0;
  137.         ui->listWidget->addItem(deShif(messageInp) + " подключился.");
  138.         messageInp.clear();
  139.         messageAccept = false;
  140.     }
  141.  
  142. }
  143. //--------------------------------------------------------------------
  144. void serv::help(QTcpSocket* soket = nullptr)
  145. {
  146.     QString information = "/unban<имя> - разбанить \n\
  147.            /ban<имя> - забанить \n\
  148.            /kick<имя> - кикнуть \n\
  149.            /list - список пользователей \n\
  150.            /copyip - скопировать IPv4 адресс \n\
  151.            /help - помощь";
  152.     if(soket == nullptr)
  153.     {
  154.         ui->listWidget->addItem(information);
  155.     }
  156.     else
  157.         soket->write(f_message(2,information));    
  158.     return;
  159. }
  160. //==========================================================================
  161. QString serv::ban(QString _txt)
  162. {
  163.     QString _message;
  164.     bool userFindet = false;
  165.     for(int i=0;i < sok.size();i++)
  166.     {
  167.         if(_txt.mid(6,_txt.size()-6) == names[i])
  168.         {
  169.             banned.push_back(sok[i]);
  170.             bannedNames.push_back(names[i]);
  171.             sok[i]->write(f_message(3,"Вас забанили"));
  172.             _message = names[i] + " забанен.";
  173.            ui->listWidget->addItem(_message);
  174.            userFindet = true;
  175.         }
  176.     }
  177.     if(userFindet)
  178.         noCommand = false;
  179.     else
  180.     {
  181.         ui->listWidget->addItem("Пользователь не найден.");
  182.         return "error";
  183.     }
  184.     return _message;
  185. }
  186. //===============================================================================
  187. QString serv::kick(QString _txt)
  188. {
  189.     QString _message;
  190.     bool userFindet = false;
  191.     for(int i=0;i++;)
  192.     {
  193.         if(_txt.mid(7,_txt.size()-7) == names[i])
  194.         {
  195.                 sok[i]->write(f_message(3,"Вас кикнули"));
  196.                 _message = names[i] + " кикнут.";
  197.                 ui->listWidget->addItem(_message);
  198.                 userFindet = true;
  199.         }
  200.     }
  201.     if(userFindet)
  202.         noCommand = false;
  203.     else
  204.     {
  205.         ui->listWidget->addItem("Пользователь не найден.");
  206.         return "error";
  207.     }
  208.     return _message;
  209. }
  210. //====================================================================================
  211. QString serv::unban(QString _txt)
  212. {
  213.     QString _message;
  214.     bool userFindet = false;
  215.            for(int i=0;i++;)
  216.            {
  217.  
  218.                if(_txt.mid(8,_txt.size()-8) == bannedNames[i])
  219.                {
  220.                    auto iter = banned.begin();
  221.                    banned.erase(iter + i);
  222.                    auto iter2 = bannedNames.begin();
  223.                    bannedNames.erase(iter2 + i);
  224.                    _message = names[i] + " разбанен.";
  225.                   ui->listWidget->addItem(_message);
  226.                   userFindet = true;
  227.                }
  228.            }
  229.            if(userFindet)
  230.                noCommand = false;
  231.            else
  232.            {
  233.                ui->listWidget->addItem("Пользователь не найден.");
  234.                return "error";
  235.            }
  236.  
  237.    return _message;
  238. }
  239. void serv::list(QTcpSocket* soket = nullptr)
  240. {
  241.     QString listUsers = "Список пользователей:\n";
  242.     for(QString name : names)
  243.         listUsers.push_back(name + "\n");
  244.     if(soket == nullptr)
  245.     {
  246.     ui->listWidget->addItem(listUsers);
  247.    
  248.     return;
  249.     }
  250.     else
  251.         soket->write(f_message(2,listUsers));
  252. }
  253. void serv::on_pushButton_clicked()
  254. {
  255.  
  256.     noCommand = true;
  257.     QString _txt = ui->textEdit->toPlainText();
  258.     QString _message = myName + ": " + _txt;
  259.  
  260.     if(_txt == "/help")
  261.         help();
  262.  
  263.     else if(_txt == "/copyip")
  264.     {
  265.         if(!_ip.isNull())
  266.         {
  267.         QClipboard *clip = QApplication::clipboard();
  268.         clip->setText(_ip.toString());
  269.         ui->listWidget->addItem("Скопировано!");
  270.         return;
  271.         }
  272.         else
  273.         {
  274.             ui->listWidget->addItem("Ошибка!");
  275.             return;
  276.         }
  277.     }
  278.     else if (_txt.mid(0,4) == "/ban")
  279.     {
  280.         _message = ban(_txt);
  281.         if(_message == "error")
  282.             return;
  283.     }
  284.  
  285.     else if (_txt.mid(0,5) == "/kick")
  286.     {
  287.         _message = kick(_txt);
  288.         if(_message == "error")
  289.             return;
  290.  
  291.     }
  292.     else if(_txt == "/list")
  293.     {
  294.         ui->listWidget->addItem("Список пользователей:");
  295.         for(QString name : names)
  296.             ui->listWidget->addItem(name);
  297.         return;
  298.     }
  299.     else if(_txt.mid(0,6) == "/unban")
  300.     {
  301.         _message = unban(_txt);
  302.         if(_message == "error")
  303.             return;
  304.     }
  305.  
  306.  
  307.     if(shif(_message) == _message)
  308.         return;
  309.     if(_message == myName + ": ")
  310.         return;
  311.      ui->textEdit->clear();
  312.      QString message = _message;
  313.      bool norm = true;
  314.      if(_message.size() > 30)
  315.          message.clear();
  316.      for(int i=0;i<_message.size()/30 && _message.size() > 30;i++,norm = true)
  317.      {
  318.         if((_message.size() - message.size() + i) < 30)
  319.         {
  320.             message.push_back(_message.mid(i*30,_message.size() - (i * 30)));
  321.             break;
  322.         }
  323.         for(int a=0;a<_message.mid(i,30).size();a++)
  324.         {
  325.             if(_message.mid(i*30,30)[a] == "\n")
  326.                 norm = false;
  327.         }
  328.         if(norm)
  329.         {
  330.             message.push_back(_message.mid(i*30,30) + "\n");
  331.         }
  332.      }
  333.     for(QTcpSocket* _socket:sok)
  334.     {
  335.         _socket->write(f_message(2,message));
  336.     }
  337.     if(noCommand);
  338.     ui->listWidget->addItem(message);
  339. }
  340.  
  341. void serv::on_pushButton_2_clicked()
  342. {
  343.     if(!(ui->lineEdit->text().isEmpty()))
  344. {
  345.         if(shif(ui->lineEdit->text()) == ui->lineEdit->text())
  346.             return;
  347.  
  348.  
  349.         const QHostAddress &localhost = QHostAddress(QHostAddress::LocalHost);
  350.         for (const QHostAddress &address: QNetworkInterface::allAddresses())
  351.         {
  352.             if (address.protocol() == QAbstractSocket::IPv4Protocol && address != localhost)
  353.             {
  354.                     _ip = address; break;
  355.             }
  356.         }
  357.  
  358.             _serv->listen();
  359.             ui->listWidget->addItem( "Порт: " + QString::number(_serv->serverPort()) + "\nIP4: " + _ip.toString()   );
  360.             myName = ui->lineEdit->text();
  361.             ui->pushButton_3->setEnabled(true);
  362.             ui->pushButton_2->setEnabled(false);
  363.             ui->lineEdit->setEnabled(false);
  364. }
  365.     else
  366. {
  367.         QMessageBox::critical(nullptr,"Ошибка","Укажите имя");
  368.         return;
  369. }
  370. }
  371.  
  372. void serv::on_pushButton_3_clicked()
  373. {
  374.     ui->pushButton_3->setEnabled(false);
  375.     ui->pushButton_2->setEnabled(true);
  376.     ui->lineEdit->setEnabled(true);
  377.     _serv->close();
  378.     for(QTcpSocket *_soke:sok)
  379.     _soke->write(f_message(3,"Сервер отключён."));
  380.     sok.clear();
  381.     names.clear();
  382.  
  383. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement