Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | File Members

ParserIn.cpp

Go to the documentation of this file.
00001 #include "ParserOut.h"
00002 #include "Connessione.h"
00003 #include "ChannelGui.h"
00004 #include "QueryGui.h"
00005 
00006 ParserIn::ParserIn(Connessione* connection):connessione(connection)
00007 {
00008        status = connessione->GetStatus();
00009 }
00010 
00011 ParserIn::~ParserIn(){}
00012 
00013 void ParserIn::getMessage(wxString strIn)
00014 {   
00015     wxStringTokenizer tkz(strIn, ' ');
00016     wxString temp, nick;
00017     strIn = tkz.GetNextToken();
00018     nick = strIn.BeforeLast('!');
00019     temp = tkz.GetNextToken();
00020     
00021     if(!nick.IsEmpty())                                  //nick!ident@host = hostmask
00022         {                                                                 
00023         nick = nick.Remove(0,1);
00024         
00025         if(!temp.CmpNoCase("JOIN") )                     //hostmask JOIN (:)#channel
00026         {
00027             temp = tkz.GetNextToken();
00028             if(temp.GetChar(0) == ':')  temp = temp.Remove(0,1);  
00029             if(!nick.CmpNoCase(mynick))                   //io entro in un nuovo canale
00030             {
00031                 connessione->CreateChannel(temp);
00032                 ChannelGui *t = static_cast<ChannelGui*>(connessione->GetTerminal(temp));
00033                 t->SetTitle(temp);
00034             }    
00035    
00036             else if(connessione->TerminalExists(temp))     //un utente entra in un canale
00037             {
00038                ChannelGui *t = static_cast<ChannelGui*>(connessione->GetTerminal(temp));
00039                t->addUser(nick);  
00040             }
00041             else status->receiveMsg(nick+" JOIN "+temp);
00042         }
00043 
00044         else if(!temp.CmpNoCase("PRIVMSG") )      //hostmask PRIVMSG #canale\utente :messaggio
00045         {
00046             temp = tkz.GetNextToken();
00047             TerminalGui *t;
00048             if(!temp.CmpNoCase(mynick))                //io sono la destinazione->msg privato
00049             {
00050                 if(!(connessione->TerminalExists(nick))) connessione->CreateQuery(nick);
00051                 t =  connessione->GetTerminal(nick);
00052             }
00053             else                                           //messaggio su un canale    
00054             { 
00055                 if(connessione->TerminalExists(temp)) t = connessione->GetTerminal(temp);
00056                 else t = status;
00057             }
00058             t->receiveMsg("<"+nick+"> ",STYLE_ITALIC);
00059             t->receiveMsg(tkz.GetString().Remove(0,1).Append("\n")); 
00060         }
00061         
00062         else if(!temp.CmpNoCase("KICK") )        //hostmask KICK #canale utente :motivo 
00063         {
00064             temp = tkz.GetNextToken();
00065             ChannelGui *t;
00066             wxString temp2 = tkz.GetNextToken();
00067             
00068             if(!(connessione->TerminalExists(temp)))
00069             {
00070                     status->receiveMsg(nick+" kick "+temp2+" "+temp+" "+tkz.GetString());
00071                     return;
00072             }
00073             else  t = static_cast<ChannelGui*>(connessione->GetTerminal(temp));
00074             
00075             if(!temp2.CmpNoCase(mynick))                   //ahimè, sono stato kickato
00076             {
00077                   status->receiveMsg(nick+" ti ha kickato dal canale "+temp+" "+tkz.GetString()+"\n", STYLE_RED);
00078                   connessione->DeleteTerminal(temp);
00079             }
00080             
00081             else                                          //kick di un altro utente
00082             {
00083                 t->receiveMsg(nick+" ha kickato "+temp2+" "+tkz.GetString()+"\n", STYLE_RED);
00084                 t->removeUser(temp2);
00085             }
00086         }      
00087         
00088         else if(!temp.CmpNoCase("PART") )          //hostmask PART #canale
00089         {
00090             temp = tkz.GetNextToken();
00091             ChannelGui *t;
00092                         
00093             if(!(connessione->TerminalExists(temp)))
00094             {
00095                  status->receiveMsg(nick+" part "+temp+" "+tkz.GetString()+"\n"); 
00096                  return;
00097             }
00098   
00099             else  t = static_cast<ChannelGui*>(connessione->GetTerminal(temp));
00100             t->receiveMsg(nick+" è uscito dal canale\n", STYLE_BLUE);
00101             t->removeUser(nick);
00102         }
00103         //hostmask QUIT :motivo 
00104         else if(!temp.CmpNoCase("QUIT") ) connessione->UserQuit(nick, ("("+tkz.GetString().Remove(0,1)+")\n") );
00105          
00106         else if(!temp.CmpNoCase("TOPIC") )           //hostmask TOPIC #canale :nuovo topic
00107         {
00108             temp = tkz.GetNextToken();
00109             ChannelGui *t;
00110 
00111             if((connessione->TerminalExists(temp)))
00112             {
00113                  t = static_cast<ChannelGui*>(connessione->GetTerminal(temp));
00114                  t->receiveMsg(nick+":", STYLE_BLUE);
00115                  t->setTopic(tkz.GetString().Remove(0,1)+"\n");
00116             }
00117             
00118             else status->receiveMsg(temp+" "+tkz.GetString()+"\n");
00119         }
00120          
00121         else if(!temp.CmpNoCase("NICK") )            //hostmask NICK nuovo nick
00122         {
00123              temp = tkz.GetNextToken();
00124              if(temp.GetChar(0) == ':') temp = temp.Remove(0,1);
00125              if(!nick.CmpNoCase(mynick)) mynick=temp;
00126              connessione->UserChNick(nick, temp);
00127         }
00128         
00129         else if(!temp.CmpNoCase("MODE") )         //hostmask MODE #canale +/- (modes) (params)
00130         {
00131              ChannelGui *t;
00132              bool set=false;
00133              int i=0,len;
00134              char p;
00135              
00136              temp = tkz.GetNextToken();
00137              if( (connessione->TerminalExists(temp)) )
00138              {
00139                   t = static_cast<ChannelGui *> (connessione->GetTerminal(temp));
00140                   temp = tkz.GetNextToken();
00141                   t->receiveMsg(nick+" mode " + temp + " " + tkz.GetString()+"\n", STYLE_RED);
00142                   len = temp.Len();
00143                   while(i<len)
00144                   {
00145                        p = temp.GetChar(i++);
00146                        switch(p)
00147                        {
00148                             case '+':
00149                                 set=true;
00150                                 break;
00151                             case '-':
00152                                 set=false;
00153                                 break;
00154                             case 'O':
00155                                 if(set) t->opUser(tkz.GetNextToken());
00156                                 else t->deopUser(tkz.GetNextToken());
00157                                 break;
00158                             case 'o':
00159                                 if(set) t->opUser(tkz.GetNextToken());
00160                                 else t->deopUser(tkz.GetNextToken());
00161                                 break;
00162                             case 'v':
00163                                 if(set) t->voiceUser(tkz.GetNextToken());
00164                                 else t->devoiceUser(tkz.GetNextToken());
00165                                 break;
00166                             case 'h':
00167                                 if(set) t->halfopUser(tkz.GetNextToken());
00168                                 else t->dehalfopUser(tkz.GetNextToken());
00169                                 break;
00170                             case 'k':
00171                                 if(set) tkz.GetNextToken();
00172                                 break;
00173                             case 'l':
00174                                 if(set) tkz.GetNextToken();
00175                                 break;
00176                             case 'b':
00177                                 tkz.GetNextToken();
00178                                 break;
00179                             case 'e':
00180                                 tkz.GetNextToken();
00181                                 break;
00182                             case 'I':
00183                                 tkz.GetNextToken();
00184                                 break;
00185                        }  //switch
00186                   }       //while
00187                   t->setModes(temp);
00188              }            //terminalexists
00189              else status->receiveMsg(nick+" mode "+temp+" "+tkz.GetString()+"\n");  
00190         
00191         }               //mode
00192         else status->receiveMsg(strIn+" "+temp+" "+tkz.GetString()+"\n");
00193    
00194     }
00195     else if( !temp.Cmp("372") ) status->receiveMsg(tkz.GetString()+"\n");  //motd
00196 
00197     else if( !temp.Cmp("353") )                                           //namelist
00198     {
00199          tkz.GetNextToken();
00200          tkz.GetNextToken();
00201          temp = tkz.GetNextToken();
00202          ChannelGui *t;
00203          if( (connessione->TerminalExists(temp)) )
00204          {
00205               t = static_cast<ChannelGui *>(connessione->GetTerminal(temp));
00206               if(t->IsActive()) status->receiveMsg(temp+" "+tkz.GetString()+"\n");
00207               else t->setNickList(tkz.GetString().Remove(0,1));
00208          }      
00209          else status->receiveMsg(temp+" "+tkz.GetString()+"\n");
00210     }
00211     
00212     else if( !temp.Cmp("366") )                         // end of names list
00213     {
00214          tkz.GetNextToken();
00215          temp = tkz.GetNextToken();
00216          ChannelGui *t;
00217          if( (connessione->TerminalExists(temp)) )
00218          {
00219               t = static_cast<ChannelGui *>(connessione->GetTerminal(temp));
00220               t->SetActive();
00221          }
00222     } 
00223                
00224     else if( (!temp.Cmp("375")) || (!temp.Cmp("376")) ) status->receiveMsg(tkz.GetString()+"\n");
00225 
00226     else if( !temp.Cmp("332") )                                 //topic
00227     {
00228          tkz.GetNextToken();
00229          temp = tkz.GetNextToken();
00230          ChannelGui *t;
00231          if( (connessione->TerminalExists(temp)) )
00232          {
00233               t = static_cast<ChannelGui *>(connessione->GetTerminal(temp));
00234               t->setTopic(tkz.GetString().Remove(0,1)+"\n");
00235          }
00236          else status->receiveMsg(temp+" "+tkz.GetString());
00237     }
00238     
00239     else if( !temp.Cmp("333") )                            //chi ha impostato il topic
00240     {
00241          tkz.GetNextToken();
00242          temp = tkz.GetNextToken();
00243          ChannelGui *t;
00244          if( (connessione->TerminalExists(temp)) )
00245          {
00246               t = static_cast<ChannelGui *>(connessione->GetTerminal(temp));
00247               t->receiveMsg("Il topic è stato impostato da " +tkz.GetNextToken() + "\n", STYLE_BLUE);
00248          }
00249          else status->receiveMsg(temp+" "+tkz.GetString());
00250     } 
00251     // welcome, deve contenere la mia hostmask, posso estrarre il mio nick
00252     else if( !temp.Cmp("001") )  mynick = tkz.GetString().BeforeLast('!').AfterLast(' ');
00253     
00254     else if(!strIn.CmpNoCase("PING")) connessione->sendCommand("PONG "+temp);
00255    
00256     else status->receiveMsg(temp+" "+tkz.GetString()+"\n");
00257 }

Generated on Thu Dec 2 16:51:42 2004 for Quirck by  doxygen 1.3.9.1