![]() |
Main Page | Namespace List | Alphabetical List | Class List | File List | Class Members | File Members
ServidorSAM.cppGo to the documentation of this file.00001 00002 #include <stdio.h> 00003 #include <iostream> 00004 #include <string> 00005 #include <sstream> 00006 #include "ServidorSAM.h" 00007 #include "Parse.h" 00008 00009 using namespace std; 00010 00011 list<Cliente> ServidorSAM::clientes=list<Cliente>(); 00012 list<Canal> ServidorSAM::canales=list<Canal>(); 00013 list<string> ServidorSAM::baneados=list<string>(); 00014 hash_map<string,ServidorSAM*,stringhasher> ServidorSAM::clt_socket=hash_map<string,ServidorSAM*,stringhasher>(); 00015 hash_map<string,int,stringhasher> ServidorSAM::ips=hash_map<string,int,stringhasher>(); 00016 int ServidorSAM::puerto=6667; 00017 string ServidorSAM::estado=""; 00018 string ServidorSAM::pass=""; 00019 string ServidorSAM::ipEscucha=""; 00020 00021 ServidorSAM::ServidorSAM(SocketHandler& h) 00022 :TcpSocket(h),IEventOwner(static_cast<MyEventHandler&>(h)) 00023 { 00024 SetLineProtocol(); 00025 c.canal=ServidorSAM::canales.end(); 00026 static_cast<MyEventHandler&>(Handler()).AddEvent(this,180,0); 00027 } 00028 00029 00030 ServidorSAM::~ServidorSAM() 00031 { 00032 static_cast<MyEventHandler&>(Handler()).ClearEvents(this); 00033 this->SetFlushBeforeClose(); 00034 this->Close(); 00035 } 00036 00037 void ServidorSAM::OnEvent(int id) 00038 { 00039 if(c.act>150) 00040 { 00041 list<Canal>::iterator c1; 00042 list<Cliente>::iterator u1; 00043 00044 c1=c.canal; 00045 for(u1=c1->usuarios.begin();u1!=c1->usuarios.end();u1++) 00046 { 00047 hash_map<string,ServidorSAM*,stringhasher>::iterator m1; 00048 m1=ServidorSAM::clt_socket.find(u1->nick); 00049 if(m1!=ServidorSAM::clt_socket.end()) 00050 m1->second->Send("276:" + c.nick); 00051 } 00052 ServidorSAM::baneados.push_back(c.ip); 00053 Send("955:Demasiada actividad!!"); 00054 SetCloseAndDelete(); 00055 } 00056 else 00057 { 00058 if(c.ping==true) 00059 { 00060 Send("955:Desconectado por falta de respuesta"); 00061 SetCloseAndDelete(); 00062 } 00063 else 00064 if(c.act==0) 00065 { 00066 c.ping=true; 00067 Send("285"); 00068 } 00069 c.act=0; 00070 static_cast<MyEventHandler&>(Handler()).AddEvent(this,180,0); 00071 } 00072 } 00073 00074 void ServidorSAM::OnDelete(void) 00075 { 00076 if(c.nick.length()>0) 00077 { 00078 list<Cliente>::iterator r; 00079 list<Canal>::iterator c1; 00080 hash_map<string,int,stringhasher>::iterator ip=ServidorSAM::ips.find(c.ip); 00081 00082 if(ip!=ServidorSAM::ips.end()) 00083 ip->second--; 00084 00085 r=find(ServidorSAM::clientes.begin(),ServidorSAM::clientes.end(),c.nick); 00086 c1=c.canal; 00087 ServidorSAM::clientes.erase(r); 00088 00089 if(c1!=ServidorSAM::canales.end()) 00090 { 00091 for(r=c1->usuarios.begin();r!=c1->usuarios.end();r++) 00092 { 00093 hash_map<string,ServidorSAM*,stringhasher>::iterator m1; 00094 m1=ServidorSAM::clt_socket.find(r->nick); 00095 if(m1!=ServidorSAM::clt_socket.end()) 00096 m1->second->Send("273:" + c.nick); 00097 } 00098 r=find(c1->usuarios.begin(),c1->usuarios.end(),c.nick); 00099 c1->usuarios.erase(r); 00100 if(c1->usuarios.size()==0) 00101 ServidorSAM::canales.erase(c1); 00102 } 00103 } 00104 00105 hash_map<string,ServidorSAM*,stringhasher>::iterator it=ServidorSAM::clt_socket.find(c.nick); 00106 if(it!=ServidorSAM::clt_socket.end()) 00107 ServidorSAM::clt_socket.erase(it); 00108 static_cast<MyEventHandler&>(Handler()).ClearEvents(this); 00109 } 00110 00111 void ServidorSAM::OnException(void) 00112 { 00113 OnDelete(); 00114 } 00115 00116 void ServidorSAM::OnConnectFailed(void) 00117 { 00118 OnDelete(); 00119 } 00120 00121 void ServidorSAM::OnLine(const std::string& cmd) 00122 { 00123 string a,nick; 00124 Parse par(cmd); 00125 00126 par.setbreak(':'); 00127 a=par.getword(); 00128 00129 c.act++; 00130 if(a=="100") 00131 { 00132 par.getword(); 00133 nick=par.getword(); 00134 00135 if(ServidorSAM::clt_socket.size()>=MAX_USUARIOS) 00136 { 00137 Send("125"); 00138 SetCloseAndDelete(); 00139 return; 00140 } 00141 00142 string ra=GetRemoteAddress(); 00143 hash_map<string,int,stringhasher>::iterator ip=ServidorSAM::ips.find(ra); 00144 00145 if(ip!=ServidorSAM::ips.end()) 00146 { 00147 if(ip->second>=MAX_CON_IP) 00148 { 00149 Send("125"); 00150 SetCloseAndDelete(); 00151 return; 00152 } 00153 else 00154 ip->second++; 00155 } 00156 else 00157 { 00158 ServidorSAM::ips.insert(make_pair(ra,1)); 00159 } 00160 00161 list<string>::iterator r=find(ServidorSAM::baneados.begin(),ServidorSAM::baneados.end(),GetRemoteAddress()); 00162 if(r!=ServidorSAM::baneados.end()) 00163 { 00164 Send("955:Estas baneado por el administrador"); 00165 SetCloseAndDelete(); 00166 }else 00167 if(nick.length()>0) 00168 { 00169 hash_map<string,ServidorSAM*,stringhasher>::iterator r; 00170 int i=0; 00171 string np; 00172 do{ 00173 np=nick; 00174 if(i>0) 00175 { 00176 ostringstream o; 00177 o << i; 00178 np+=o.str(); 00179 } 00180 r=ServidorSAM::clt_socket.find(np); 00181 i++; 00182 }while(r!=ServidorSAM::clt_socket.end()); 00183 nick=np; 00184 00185 string usu,a; 00186 00187 c.nick=nick.substr(0,12); 00188 c.ip=GetRemoteAddress(); 00189 par.getrest(a); 00190 string canal=a.substr(0,40); 00191 c.ping=false; 00192 c.act=0; 00193 ServidorSAM::clientes.push_back(c); 00194 00195 list<Canal>::iterator h; 00196 00197 h=find(ServidorSAM::canales.begin(),ServidorSAM::canales.end(),canal); 00198 if(h==ServidorSAM::canales.end()) 00199 { 00200 Canal canaln; 00201 canaln.nombre=canal; 00202 canaln.usuarios.push_back(c); 00203 ServidorSAM::canales.push_back(canaln); 00204 usu=";" + c.nick + ";"; 00205 c.canal=find(ServidorSAM::canales.begin(),ServidorSAM::canales.end(),canal); 00206 } 00207 else 00208 { 00209 c.canal=h; 00210 h->usuarios.push_back(c); 00211 list<Cliente>::iterator i1; 00212 for(i1=h->usuarios.begin();i1!=h->usuarios.end();i1++) 00213 { 00214 usu+=i1->nick + ";"; 00215 hash_map<string,ServidorSAM*,stringhasher>::iterator it=ServidorSAM::clt_socket.find(i1->nick); 00216 if(it!=ServidorSAM::clt_socket.end()) 00217 it->second->Send("264:" + c.nick); 00218 } 00219 } 00220 Send("202:" + c.nick + ":" + canal + ":" + usu); 00221 ServidorSAM::clt_socket.insert(make_pair(c.nick,this)); 00222 } 00223 else 00224 SetCloseAndDelete(); 00225 } 00226 else 00227 if (a=="123") 00228 { 00229 string tot; 00230 list<Canal>::iterator i1; 00231 00232 for(i1=ServidorSAM::canales.begin();i1!=ServidorSAM::canales.end();i1++) 00233 { 00234 ostringstream o; 00235 o << i1->usuarios.size(); 00236 tot+=";" + i1->nombre + "," + o.str() + ";"; 00237 } 00238 Send("123:" + tot); 00239 } 00240 else 00241 if (a=="418") 00242 { 00243 string palabra=par.getword(),a; 00244 00245 if(palabra.substr(0,5)=="ADMIN") 00246 { 00247 par.setbreak(':'); 00248 a=par.getword(); 00249 if(a==ServidorSAM::pass) 00250 { 00251 Send("413"); 00252 c.adm=1; 00253 } 00254 else 00255 Send("126"); 00256 }else 00257 if(c.adm==1 && palabra.substr(0,4)=="KICK") 00258 { 00259 par.setbreak(':'); 00260 a=par.getword(); 00261 00262 list<Cliente>::iterator r; 00263 00264 for(r=ServidorSAM::clientes.begin();r!=ServidorSAM::clientes.end();r++) 00265 { 00266 if(r->nick==a) 00267 { 00268 par.getrest(a); 00269 hash_map<string,ServidorSAM*,stringhasher>::iterator it=ServidorSAM::clt_socket.find(r->nick); 00270 if(it!=ServidorSAM::clt_socket.end()) 00271 { 00272 it->second->Send("271:"+ a); 00273 it->second->SetCloseAndDelete(); 00274 ServidorSAM::baneados.push_back(r->ip); 00275 } 00276 }else 00277 if(r->canal==c.canal) 00278 { 00279 hash_map<string,ServidorSAM*,stringhasher>::iterator it=ServidorSAM::clt_socket.find(r->nick); 00280 if(it!=ServidorSAM::clt_socket.end()) 00281 it->second->Send("276:" + a); 00282 } 00283 } 00284 }else 00285 if(c.adm==1 && palabra.substr(0, 7)=="MENSAJE") 00286 { 00287 par.setbreak(':'); 00288 a=par.getword(); 00289 if(a=="TODOS") 00290 { 00291 list<Cliente>::iterator r; 00292 par.getrest(a); 00293 00294 for(r=ServidorSAM::clientes.begin();r!=ServidorSAM::clientes.end();r++) 00295 { 00296 hash_map<string,ServidorSAM*,stringhasher>::iterator it=ServidorSAM::clt_socket.find(r->nick); 00297 if(!(it==ServidorSAM::clt_socket.end())) 00298 it->second->Send("270:Administrador:" + a); 00299 } 00300 }else 00301 if(c.adm==1 && a=="HABITACION") 00302 { 00303 list<Cliente>::iterator r; 00304 par.getrest(a); 00305 00306 for(r=ServidorSAM::clientes.begin();r!=ServidorSAM::clientes.end();r++) 00307 { 00308 if(r->canal==c.canal) 00309 { 00310 hash_map<string,ServidorSAM*,stringhasher>::iterator it=ServidorSAM::clt_socket.find(r->nick); 00311 if(it!=ServidorSAM::clt_socket.end()) 00312 it->second->Send("270:Administrador:" + a); 00313 } 00314 } 00315 } 00316 } 00317 }else 00318 if(a=="282") 00319 { 00320 hash_map<string,ServidorSAM*,stringhasher>::iterator m1; 00321 00322 a=par.getword(); 00323 m1=ServidorSAM::clt_socket.find(a); 00324 if(m1!=ServidorSAM::clt_socket.end()) 00325 m1->second->Send("439:" + a + ":"); 00326 }else 00327 if(a=="248") 00328 { 00329 list<Canal>::iterator c1; 00330 00331 c1=c.canal; 00332 if(c1!=ServidorSAM::canales.end()) 00333 { 00334 list<Cliente>::iterator u1; 00335 for(u1=c1->usuarios.begin();u1!=c1->usuarios.end();u1++) 00336 { 00337 string a; 00338 par.getrest(a); 00339 a=a.substr(0,255); 00340 hash_map<string,ServidorSAM*,stringhasher>::iterator m1; 00341 if(u1->nick!=c.nick) 00342 { 00343 m1=ServidorSAM::clt_socket.find(u1->nick); 00344 if(m1!=ServidorSAM::clt_socket.end()) 00345 m1->second->Send("270:" + c.nick + ":" + a); 00346 } 00347 } 00348 } 00349 }else 00350 if(a=="286") 00351 { 00352 c.ping=false; 00353 }else 00354 if(a=="255") 00355 { 00356 list<Canal>::iterator c1; 00357 par.setbreak(':'); 00358 00359 c1=c.canal; 00360 if(c1!=ServidorSAM::canales.end()) 00361 { 00362 list<Cliente>::iterator it; 00363 string usr=par.getword(); 00364 00365 it=find(c1->usuarios.begin(),c1->usuarios.end(),usr); 00366 if(it!=c1->usuarios.end()) 00367 { 00368 string a; 00369 hash_map<string,ServidorSAM*,stringhasher>::iterator m1; 00370 00371 par.getrest(a); 00372 a=a.substr(0,255); 00373 m1=ServidorSAM::clt_socket.find(it->nick); 00374 if(m1!=ServidorSAM::clt_socket.end() && c.nick!=it->nick) 00375 m1->second->Send("256:" + c.nick + ":" + c.canal->nombre + ":" + a); 00376 } 00377 else 00378 Send("281:" + usr + ":"); 00379 } 00380 }else 00381 if(a=="300") 00382 { 00383 list<Cliente>::iterator it; 00384 hash_map<string,ServidorSAM*,stringhasher>::iterator e; 00385 string a; 00386 00387 par.getrest(a); 00388 a=a.substr(0,12); 00389 e=ServidorSAM::clt_socket.find(a); 00390 if(e==ServidorSAM::clt_socket.end()) 00391 { 00392 string viejo=c.nick; 00393 list<Canal>::iterator c1; 00394 00395 c1=c.canal; 00396 if(c1!=ServidorSAM::canales.end()) 00397 { 00398 list<Cliente>::iterator u1; 00399 for(u1=c1->usuarios.begin();u1!=c1->usuarios.end();u1++) 00400 { 00401 00402 hash_map<string,ServidorSAM*,stringhasher>::iterator m1; 00403 m1=ServidorSAM::clt_socket.find(u1->nick); 00404 if(u1->nick==c.nick) 00405 { 00406 u1->nick=a; 00407 if(m1!=ServidorSAM::clt_socket.end()) 00408 { 00409 ServidorSAM::clt_socket.erase(m1); 00410 ServidorSAM::clt_socket.insert(make_pair(a,this)); 00411 } 00412 00413 it=find(ServidorSAM::clientes.begin(),ServidorSAM::clientes.end(),c.nick); 00414 if(it!=ServidorSAM::clientes.end()) 00415 it->nick=a; 00416 c.nick=a; 00417 } 00418 else 00419 { 00420 if(m1!=ServidorSAM::clt_socket.end()) 00421 m1->second->Send("299:" + viejo + ":" + a); 00422 } 00423 } 00424 } 00425 Send("300:" + a); 00426 } 00427 else 00428 Send("301:" + a); 00429 }else 00430 if(a=="262") 00431 { 00432 string a; 00433 00434 par.getrest(a); 00435 a=a.substr(0,40); 00436 if(a==c.canal->nombre) 00437 Send("435"); 00438 else 00439 { 00440 list<Canal>::iterator c1; 00441 00442 c1=c.canal; 00443 if(c1!=ServidorSAM::canales.end()) 00444 { 00445 list<Cliente>::iterator u1; 00446 string usu; 00447 00448 for(u1=c1->usuarios.begin();u1!=c1->usuarios.end();u1++) 00449 { 00450 if(u1->nick!=c.nick) 00451 { 00452 hash_map<string,ServidorSAM*,stringhasher>::iterator m1; 00453 m1=ServidorSAM::clt_socket.find(u1->nick); 00454 if(m1!=ServidorSAM::clt_socket.end()) 00455 m1->second->Send("263:" + c.nick + ":" + a); 00456 } 00457 } 00458 00459 u1=find(c1->usuarios.begin(),c1->usuarios.end(),c.nick); 00460 c1->usuarios.erase(u1); 00461 if(c1->usuarios.size()==0) 00462 ServidorSAM::canales.erase(c1); 00463 00464 u1=find(ServidorSAM::clientes.begin(),ServidorSAM::clientes.end(),c.nick); 00465 c1=find(ServidorSAM::canales.begin(),ServidorSAM::canales.end(),a); 00466 00467 if(c1==ServidorSAM::canales.end()) 00468 { 00469 Canal canaln; 00470 canaln.nombre=a; 00471 canaln.usuarios.push_back(c); 00472 ServidorSAM::canales.push_back(canaln); 00473 usu=";" + c.nick + ";"; 00474 u1->canal=find(ServidorSAM::canales.begin(),ServidorSAM::canales.end(),a); 00475 c.canal=u1->canal; 00476 } 00477 else 00478 { 00479 c1->usuarios.push_back(c); 00480 list<Cliente>::iterator i1; 00481 usu=";"; 00482 for(i1=c1->usuarios.begin();i1!=c1->usuarios.end();i1++) 00483 usu+=i1->nick + ";"; 00484 u1->canal=c1; 00485 c.canal=c1; 00486 } 00487 00488 c1=c.canal; 00489 for(u1=c1->usuarios.begin();u1!=c1->usuarios.end();u1++) 00490 { 00491 if(u1->nick!=c.nick) 00492 { 00493 hash_map<string,ServidorSAM*,stringhasher>::iterator m1; 00494 m1=ServidorSAM::clt_socket.find(u1->nick); 00495 if(m1!=ServidorSAM::clt_socket.end()) 00496 m1->second->Send("264:" + c.nick); 00497 } 00498 } 00499 Send("262:" + a + ":" + usu); 00500 } 00501 } 00502 }else 00503 Send("954:Comando desconocido"); 00504 } 00505 |