+ if(!stricmp(argv[1], "001")) {
+ free(session->nick);
+ session->nick = strdup(argv[2]);
+ client->fully_connected = 1;
+ }
+ if(!stricmp(argv[1], "001") ||
+ !stricmp(argv[1], "002") ||
+ !stricmp(argv[1], "003") ||
+ !stricmp(argv[1], "004") ||
+ !stricmp(argv[1], "005") ||
+ !stricmp(argv[1], "375") ||
+ !stricmp(argv[1], "372") ||
+ !stricmp(argv[1], "376")
+ ) {
+ //save these raw's for recovering the connection later
+ struct IRCLine *recover_line = NULL, *new_line;
+ if(client->recover_header)
+ for(recover_line = client->recover_header; recover_line->next; recover_line = recover_line->next) {};
+ new_line = malloc(sizeof(*new_line));
+ if(new_line) {
+ new_line->line = strdup(line);
+ new_line->next = NULL;
+ if(recover_line)
+ recover_line->next = new_line;
+ else
+ client->recover_header = new_line;
+ }
+ } else if(!stricmp(argv[1], "JOIN")) {
+ struct IRCUser from = ircclient_parse_user(argv[0]);
+ if(!stricmp(from.nick, session->nick)) {
+ struct IRCChannel *lchannel = NULL, *channel = malloc(sizeof(*channel));
+ if(client->channel)
+ for(lchannel = client->channel; lchannel->next; lchannel = lchannel->next) {}
+ channel->name = strdup(argv[2]);
+ channel->next = NULL;
+ channel->prev = lchannel;
+ if(lchannel)
+ lchannel->next = channel;
+ else
+ client->channel = channel;
+ }
+ } else if(!stricmp(argv[1], "PART")) {
+ struct IRCUser from = ircclient_parse_user(argv[0]);
+ if(!stricmp(from.nick, session->nick)) {
+ struct IRCChannel *channel;
+ for(channel = client->channel; channel; channel = channel->next) {
+ if(!stricmp(channel->name, argv[2])) {
+ if(channel->prev)
+ channel->prev->next = channel->next;
+ else
+ client->channel = channel->next;
+ if(channel->next)
+ channel->next->prev = channel->prev;
+ free(channel->name);
+ free(channel);
+ break;
+ }
+ }
+ }
+ } else if(!stricmp(argv[1], "KICK")) {
+ if(!stricmp(argv[3], session->nick)) {
+ struct IRCChannel *channel;
+ for(channel = client->channel; channel; channel = channel->next) {
+ if(!stricmp(channel->name, argv[2])) {
+ if(channel->prev)
+ channel->prev->next = channel->next;
+ else
+ client->channel = channel->next;
+ if(channel->next)
+ channel->next->prev = channel->prev;
+ free(channel->name);
+ free(channel);
+ break;
+ }
+ }
+ }
+ } else if(!stricmp(argv[1], "NICK")) {
+ struct IRCUser from = ircclient_parse_user(argv[0]);
+ if(!stricmp(from.nick, session->nick)) {
+ free(session->nick);
+ session->nick = strdup(argv[2]);
+ }
+ }