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())
00022 {
00023 nick = nick.Remove(0,1);
00024
00025 if(!temp.CmpNoCase("JOIN") )
00026 {
00027 temp = tkz.GetNextToken();
00028 if(temp.GetChar(0) == ':') temp = temp.Remove(0,1);
00029 if(!nick.CmpNoCase(mynick))
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))
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") )
00045 {
00046 temp = tkz.GetNextToken();
00047 TerminalGui *t;
00048 if(!temp.CmpNoCase(mynick))
00049 {
00050 if(!(connessione->TerminalExists(nick))) connessione->CreateQuery(nick);
00051 t = connessione->GetTerminal(nick);
00052 }
00053 else
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") )
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))
00076 {
00077 status->receiveMsg(nick+" ti ha kickato dal canale "+temp+" "+tkz.GetString()+"\n", STYLE_RED);
00078 connessione->DeleteTerminal(temp);
00079 }
00080
00081 else
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") )
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
00104 else if(!temp.CmpNoCase("QUIT") ) connessione->UserQuit(nick, ("("+tkz.GetString().Remove(0,1)+")\n") );
00105
00106 else if(!temp.CmpNoCase("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") )
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") )
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 }
00186 }
00187 t->setModes(temp);
00188 }
00189 else status->receiveMsg(nick+" mode "+temp+" "+tkz.GetString()+"\n");
00190
00191 }
00192 else status->receiveMsg(strIn+" "+temp+" "+tkz.GetString()+"\n");
00193
00194 }
00195 else if( !temp.Cmp("372") ) status->receiveMsg(tkz.GetString()+"\n");
00196
00197 else if( !temp.Cmp("353") )
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") )
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") )
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") )
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
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 }