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)); |