+ } 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]);
+ }