qekaqeka

server

Dec 14th, 2019
359
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. }
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×