Logo
~Sockets~
~Examples~
~Contact~


ServidorSAM.cpp

Go 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 
Page, code, and content Copyright (C) 2005 by Anders Hedström
Generated on Mon Aug 29 20:21:47 2005 for C++ Sockets by  doxygen 1.4.4