QTfrontend/netconnectedclient.cpp
changeset 569 4e41c9e9e4d1
parent 468 8403d6884707
child 570 f674e8e5bf28
equal deleted inserted replaced
568:d0690b7aa808 569:4e41c9e9e4d1
    55 }
    55 }
    56 
    56 
    57 void HWConnectedClient::ParseLine(const QByteArray & line)
    57 void HWConnectedClient::ParseLine(const QByteArray & line)
    58 {
    58 {
    59   QString msg = QString::fromUtf8 (line.data(), line.size());
    59   QString msg = QString::fromUtf8 (line.data(), line.size());
    60 
       
    61   QStringList lst = msg.split(delimeter);
    60   QStringList lst = msg.split(delimeter);
    62   if(!lst.size()) return;
    61   if(!lst.size())
       
    62   {
       
    63     qWarning("Net: Bad message");
       
    64     return;
       
    65   }
    63   if (lst[0] == "NICK") {
    66   if (lst[0] == "NICK") {
    64     if(lst.size()<2) return;
    67     if(lst.size() < 2)
       
    68     {
       
    69       qWarning("Net: Bad 'NICK' message");
       
    70 	  return;
       
    71     }
    65     if(m_hwserver->haveNick(lst[1])) {
    72     if(m_hwserver->haveNick(lst[1])) {
    66       RawSendNet(QString("ERRONEUSNICKNAME"));
    73       RawSendNet(QString("ERRONEUSNICKNAME"));
    67       throw ShouldDisconnectException();
    74       throw ShouldDisconnectException();
    68     }
    75     }
    69 
    76 
    75     else {
    82     else {
    76       RawSendNet(QString("SLAVE"));
    83       RawSendNet(QString("SLAVE"));
    77       // send teams
    84       // send teams
    78       QList<QStringList> team_conf=m_hwserver->getTeamsConfig();
    85       QList<QStringList> team_conf=m_hwserver->getTeamsConfig();
    79       for(QList<QStringList>::iterator tmit=team_conf.begin(); tmit!=team_conf.end(); ++tmit) {
    86       for(QList<QStringList>::iterator tmit=team_conf.begin(); tmit!=team_conf.end(); ++tmit) {
    80 	RawSendNet(QString("ADDTEAM:")+delimeter+tmit->join(QString(delimeter)));
    87 	    RawSendNet(QString("ADDTEAM:")+delimeter+tmit->join(QString(delimeter)));
    81       }
    88       }
    82       // send config
    89       // send config
    83       QMap<QString, QStringList> conf=m_hwserver->getGameCfg();
    90       QMap<QString, QStringList> conf=m_hwserver->getGameCfg();
    84       for(QMap<QString, QStringList>::iterator it=conf.begin(); it!=conf.end(); ++it) {
    91       for(QMap<QString, QStringList>::iterator it=conf.begin(); it!=conf.end(); ++it) {
    85 	RawSendNet(QString("CONFIG_PARAM")+delimeter+it.key()+delimeter+it.value().join(QString(delimeter)));
    92 	    RawSendNet(QString("CONFIG_PARAM")+delimeter+it.key()+delimeter+it.value().join(QString(delimeter)));
    86       }
    93       }
    87     }
    94     }
    88     m_hwserver->sendNicks(this);
    95     m_hwserver->sendNicks(this);
    89     m_hwserver->sendOthers(this, QString("JOINED")+delimeter+client_nick);
    96     m_hwserver->sendOthers(this, QString("JOINED")+delimeter+client_nick);
    90     return;
    97     return;
    91   }
    98   }
       
    99 
    92   if(client_nick=="") return;
   100   if(client_nick=="") return;
    93 
   101 
    94   if (lst[0]=="START:") {
   102   if (lst[0]=="START:") {
    95     readyToStart=true;
   103     readyToStart=true;
    96     if(m_hwserver->shouldStart(this)) {
   104     if(m_hwserver->shouldStart(this)) {
   100     }
   108     }
   101     return;
   109     return;
   102   }
   110   }
   103 
   111 
   104   if(lst[0]=="HHNUM") {
   112   if(lst[0]=="HHNUM") {
   105     if(!m_hwserver->isChiefClient(this) || lst.size()<4) return; // error or permission denied :)
   113     if(!m_hwserver->isChiefClient(this) || lst.size()<4)
       
   114     {
       
   115       qWarning("Net: Bad 'HHNUM' message");
       
   116 	  return; // error or permission denied :)
       
   117 	}
   106     const QString confstr=lst[0]+"+"+lst[1]+"+"+lst[2];
   118     const QString confstr=lst[0]+"+"+lst[1]+"+"+lst[2];
   107     QMap<QString, QStringList>::iterator it=m_hwserver->m_gameCfg.find(confstr);
   119     QMap<QString, QStringList>::iterator it=m_hwserver->m_gameCfg.find(confstr);
   108     int oldTeamHHNum = it==m_hwserver->m_gameCfg.end() ? 0 : it.value()[0].toUInt();
   120     int oldTeamHHNum = it==m_hwserver->m_gameCfg.end() ? 0 : it.value()[0].toUInt();
   109     int newTeamHHNum = lst[3].toUInt();
   121     int newTeamHHNum = lst[3].toUInt();
   110     m_hwserver->hhnum+=newTeamHHNum-oldTeamHHNum;
   122     m_hwserver->hhnum+=newTeamHHNum-oldTeamHHNum;
   111     // create CONFIG_PARAM to save HHNUM at server from lst
   123     // create CONFIG_PARAM to save HHNUM at server from lst
   112     lst=QStringList("CONFIG_PARAM") << confstr << lst[3];
   124     lst=QStringList("CONFIG_PARAM") << confstr << lst[3];
   113   }
   125   }
   114 
   126 
   115   if(lst[0]=="CONFIG_PARAM") {
   127   if(lst[0]=="CONFIG_PARAM") {
   116     if(!m_hwserver->isChiefClient(this) || lst.size()<3) return; // error or permission denied :)
   128     if(!m_hwserver->isChiefClient(this) || lst.size()<3)
       
   129     {
       
   130       qWarning("Net: Bad 'CONFIG_PARAM' message");
       
   131 	  return; // error or permission denied :)
       
   132 	}
   117     else m_hwserver->m_gameCfg[lst[1]]=lst.mid(2);
   133     else m_hwserver->m_gameCfg[lst[1]]=lst.mid(2);
   118   }
   134   }
   119 
   135 
   120   if(lst[0]=="ADDTEAM:") {
   136   if(lst[0]=="ADDTEAM:") {
   121     if(lst.size()<14) return;
   137     if(lst.size() < 14)
       
   138     {
       
   139       qWarning("Net: Bad 'ADDTEAM' message");
       
   140 	  return;
       
   141     }
   122     lst.pop_front();
   142     lst.pop_front();
   123     
   143 
   124     // add team ID
   144     // add team ID
   125     static unsigned int netTeamID=0;
   145     static unsigned int netTeamID=0;
   126     lst.insert(1, QString::number(++netTeamID));
   146     lst.insert(1, QString::number(++netTeamID));
   127 
   147 
   128     // hedgehogs num count
   148     // hedgehogs num count
   129     int maxAdd=18-m_hwserver->hhnum;
   149     int maxAdd=18-m_hwserver->hhnum;
   130     if (maxAdd<=0) return; // reject command
   150     if (maxAdd<=0)
       
   151     {
       
   152 	  qWarning("Net: 'ADDTEAM' message: rejecting");
       
   153 	  return; // reject command
       
   154     }
   131     int toAdd=maxAdd<4 ? maxAdd : 4;
   155     int toAdd=maxAdd<4 ? maxAdd : 4;
   132     m_hwserver->hhnum+=toAdd;
   156     m_hwserver->hhnum+=toAdd;
   133     // hedgehogs num config
   157     // hedgehogs num config
   134     QString hhnumCfg=QString("CONFIG_PARAM%1HHNUM+%2+%3%1%4").arg(delimeter).arg(lst[0])\
   158     QString hhnumCfg=QString("CONFIG_PARAM%1HHNUM+%2+%3%1%4").arg(delimeter).arg(lst[0])\
   135       .arg(netTeamID)\
   159       .arg(netTeamID)\
   136       .arg(toAdd);
   160       .arg(toAdd);
   137     
   161 
   138     // creating color config for new team
   162     // creating color config for new team
   139     QString colorCfg=QString("CONFIG_PARAM%1TEAM_COLOR+%2+%3%1%4").arg(delimeter).arg(lst[0])\
   163     QString colorCfg=QString("CONFIG_PARAM%1TEAM_COLOR+%2+%3%1%4").arg(delimeter).arg(lst[0])\
   140       .arg(netTeamID)\
   164       .arg(netTeamID)\
   141       .arg(lst.takeAt(2));
   165       .arg(lst.takeAt(2));
   142 
   166 
   150     m_hwserver->sendAll(hhnumCfg);
   174     m_hwserver->sendAll(hhnumCfg);
   151     return;
   175     return;
   152   }
   176   }
   153 
   177 
   154   if(lst[0]=="REMOVETEAM:") {
   178   if(lst[0]=="REMOVETEAM:") {
   155     if(lst.size()<2) return;
   179     if(lst.size() < 2)
   156     
   180     {
   157     for(QMap<QString, QStringList>::iterator it=m_hwserver->m_gameCfg.begin(); it!=m_hwserver->m_gameCfg.end(); ++it) {
   181       qWarning("Net: Bad 'REMOVETEAM' message");
       
   182 	  return;
       
   183     }
       
   184 
       
   185     for(QMap<QString, QStringList>::iterator it=m_hwserver->m_gameCfg.begin(); it!=m_hwserver->m_gameCfg.end(); ++it)
       
   186     {
   158       QStringList hhTmpList=it.key().split('+');
   187       QStringList hhTmpList=it.key().split('+');
   159       if(hhTmpList[0] == "HHNUM") {
   188       if(hhTmpList[0] == "HHNUM")
   160 	if(hhTmpList[1]==lst[1]) {
   189       {
   161 	  m_hwserver->hhnum-=it.value()[0].toUInt();
   190         if(hhTmpList[1]==lst[1])
   162 	  break;
   191         {
   163 	}
   192 		  m_hwserver->hhnum-=it.value()[0].toUInt();
       
   193 		  break;
       
   194         }
   164       }
   195       }
   165     }
   196     }
   166 
   197 
   167     unsigned int netID=removeTeam(lst[1]);
   198     unsigned int netID=removeTeam(lst[1]);
   168     m_hwserver->sendOthers(this, QString("REMOVETEAM:")+delimeter+lst[1]+delimeter+QString::number(netID));
   199     m_hwserver->sendOthers(this, QString("REMOVETEAM:")+delimeter+lst[1]+delimeter+QString::number(netID));