/* pckt_vprs.c * * copyright (c) 2000-2003 SeaD * see GPL for copying info * */ #include #include "echat.h" #include "pckt_ppak.h" void pars_pwelcome(void) { strncpy(status->nick, packet, NICK_MAXLEN); pars_word(); status->mode = pars_number(); /* ??? */ status->gender = pars_number(); /* ??? */ status->gender = pars_number(); /* ??? */ chnl_join(); } void pars_pbye(void) { strncpy(status->nick, packet, NICK_MAXLEN); strncpy(status->channel, pars_word(), CHANNEL_MAXLEN); pars_word(); status->gender = pars_number(); chnl_leave(); } void pars_pjoin(void) { strncpy(status->nick, packet, NICK_MAXLEN); strncpy(status->channel, pars_word(), CHANNEL_MAXLEN); pars_word(); status->mode = pars_number(); status->gender = pars_number(); chnl_join(); } void pars_pleave(void) { strncpy(status->nick, packet, NICK_MAXLEN); strncpy(status->channel, pars_word(), CHANNEL_MAXLEN); pars_word(); status->gender = pars_number(); chnl_leave(); } void pars_pherewho(void) { strncpy(status->nick, packet, NICK_MAXLEN); send_hereim(); status_ok(PARS_SHERE); } void pars_phereim(void) { if (strncmp(config->nick, packet, NICK_MAXLEN)) return; strncpy(status->nick, pars_word(), NICK_MAXLEN); pars_word(); status->mode = pars_number(); status->active = pars_number(); user_add(); } void pars_phere(void) { strncpy(status->nick, packet, NICK_MAXLEN); strncpy(status->channel, pars_word(), CHANNEL_MAXLEN); if (strncmp(status->chnl[0].name, status->channel, CHANNEL_MAXLEN) && !chnl_getnum()) return; if (config->mode != MOD_OFF) send_herewe(); } void pars_pchat(void) { strncpy(status->channel, packet, CHANNEL_MAXLEN); strncpy(status->nick, pars_word(), NICK_MAXLEN); if (user_ignore()) return; if (strncmp(status->chnl[0].name, status->channel, CHANNEL_MAXLEN) && !chnl_getnum()) return; snprintf(message, MSG_SIZE, "<%s> %s\n", status->nick, pars_word()); #ifdef TCP write_tcp(status->channel); #endif /* TCP */ write_log(config->log_main); if (!strncmp(config->nick, status->nick, NICK_MAXLEN)) write_str(status->channel, COL_MY); else write_str(status->channel, COL_CHAT); if ((!config->my_only || !strncmp(status->room->name, status->channel, CHANNEL_MAXLEN)) && (config->mode == MOD_NORMAL)) beep_chat(); } void pars_pme(void) { strncpy(status->channel, packet, CHANNEL_MAXLEN); strncpy(status->nick, pars_word(), NICK_MAXLEN); if (user_ignore()) return; if (strncmp(status->chnl[0].name, status->channel, CHANNEL_MAXLEN) && !chnl_getnum()) return; snprintf(message, MSG_SIZE, " * %s %s\n", status->nick, pars_word()); #ifdef TCP write_tcp(status->channel); #endif /* TCP */ write_log(config->log_main); if (!strncmp(config->nick, status->nick, NICK_MAXLEN)) write_str(status->channel, COL_MY); else write_str(status->channel, COL_CHAT); if ((!config->my_only || !strncmp(status->room->name, status->channel, CHANNEL_MAXLEN)) && (config->mode == MOD_NORMAL)) beep_chat(); } void pars_pmesg(void) { register int n; strncpy(status->nick, packet, NICK_MAXLEN); if (user_ignore()) return; if (strncmp(config->nick, pars_word(), NICK_MAXLEN)) return; pars_word(); for (n = 0; packet[n] != MSG_SPLIT; n++) if (packet[n] == '\r') packet[n] = ' '; snprintf(message, MSG_SIZE, PARS_MESG, time_get(), status->nick); write_log(config->log_mesg); write_str(status->room->name, COL_MESG); snprintf(message, MSG_SIZE, "%s\n", packet); write_log(config->log_mesg); write_str(status->room->name, COL_MESG); if (config->mode != MOD_OFF) send_mesgack(); if ((config->mode == MOD_NORMAL) || (config->mode == MOD_DND) || ((config->mode == MOD_AWAY) && user_favorite())) beep_mesg(); } void pars_pmass(void) { register int n; if (config->mode == MOD_OFF) return; strncpy(status->nick, packet, NICK_MAXLEN); if (user_ignore()) return; if (strncmp(config->nick, pars_word(), NICK_MAXLEN)) return; pars_word(); for (n = 0; packet[n] != MSG_SPLIT; n++) if (packet[n] == '\r') packet[n] = ' '; snprintf(message, MSG_SIZE, PARS_MASS, time_get(), status->nick); write_log(config->log_mesg); write_str(status->chnl[0].name, COL_MESG); snprintf(message, MSG_SIZE, "%s\n", packet); write_log(config->log_mesg); write_str(status->chnl[0].name, COL_MESG); send_mesgack(); if (config->mode == MOD_NORMAL) beep_mesg(); } void pars_pmesgack(void) { status->mode = pars_number(); if (strncmp(config->nick, packet, NICK_MAXLEN)) return; strncpy(status->nick, pars_word(), NICK_MAXLEN); pars_word(); status->gender = pars_number(); if (*packet == '\0') { snprintf(message, MSG_SIZE, PARS_MESGACK, time_get(), status->nick); write_log(config->log_mesg); write_str(status->room->name, COL_MESG); } else { snprintf(message, MSG_SIZE, PARS_MESGANS, time_get(), status->nick); write_log(config->log_mesg); write_str(status->room->name, COL_MESG); snprintf(message, MSG_SIZE, "%s\n", packet); write_log(config->log_mesg); write_str(status->room->name, COL_MESG); } } void pars_ptopic(void) { strncpy(status->channel, pars_word(), CHANNEL_MAXLEN); if (!strncmp(status->room->topic, pars_word(), STR_SIZE)) return; strncpy(status->chnl[chnl_getnum()].topic, packet, STR_SIZE); snprintf(message, MSG_SIZE, PARS_TOPICC, time_get(), status->channel); #ifdef TCP write_tcp(status->channel); #endif /* TCP */ write_log(config->log_main); write_str(status->channel, COL_SYSTEM); snprintf(message, MSG_SIZE, "%s\n", status->chnl[chnl_getnum()].topic); #ifdef TCP write_tcp(status->channel); #endif /* TCP */ write_log(config->log_main); write_str(status->channel, COL_SYSTEM); refresh_room(); screen_show(); refresh_input(); string_show(); } void pars_ptopicnew(void) { strncpy(status->channel, packet, CHANNEL_MAXLEN); if (strncmp(status->chnl[0].name, status->channel, CHANNEL_MAXLEN) && !chnl_getnum()) return; strncpy(status->chnl[chnl_getnum()].topic, pars_word(), STR_SIZE); snprintf(message, MSG_SIZE, PARS_TOPIC, time_get(), status->channel); #ifdef TCP write_tcp(status->channel); #endif /* TCP */ if (config->verbose) { write_log(config->log_main); write_str(status->channel, COL_SYSTEM); } snprintf(message, MSG_SIZE, "%s\n", status->chnl[chnl_getnum()].topic); #ifdef TCP write_tcp(status->channel); #endif /* TCP */ if (config->verbose) { write_log(config->log_main); write_str(status->channel, COL_SYSTEM); } refresh_room(); screen_show(); refresh_input(); string_show(); if ((!config->my_only || !strncmp(status->room->name, status->channel, CHANNEL_MAXLEN)) && (config->mode == MOD_NORMAL)) beep_system(); } void pars_pprivjoin(void) { strncpy(status->nick, packet, NICK_MAXLEN); if (user_ignore()) return; strncpy(status->channel, packet, NICK_MAXLEN); if (!strncmp(config->nick, status->nick, NICK_MAXLEN)) strncpy(status->channel, pars_word(), NICK_MAXLEN); else if (strncmp(config->nick, pars_word(), NICK_MAXLEN)) return; } void pars_pprivjoinack(void) { strncpy(status->nick, packet, NICK_MAXLEN); if (user_ignore()) return; strncpy(status->channel, packet, NICK_MAXLEN); if (!strncmp(config->nick, status->nick, NICK_MAXLEN)) strncpy(status->channel, pars_word(), NICK_MAXLEN); else if (strncmp(config->nick, pars_word(), NICK_MAXLEN)) return; } void pars_pprivleave(void) { strncpy(status->nick, packet, NICK_MAXLEN); if (user_ignore()) return; strncpy(status->channel, packet, NICK_MAXLEN); if (!strncmp(config->nick, status->nick, NICK_MAXLEN)) strncpy(status->channel, pars_word(), NICK_MAXLEN); else if (strncmp(config->nick, pars_word(), NICK_MAXLEN)) return; } void pars_pnick(void) { strncpy(status->channel, packet, NICK_MAXLEN); strncpy(status->nick, pars_word(), NICK_MAXLEN); user_nick(); chat_nick(); if (user_ignore()) return; snprintf(message, MSG_SIZE, PARS_NICK, time_get(), status->channel, status->nick); #ifdef TCP write_tcp(status->chnl[0].name); #endif /* TCP */ if (!user_ignore() && config->verbose) { write_log(config->log_main); write_str(status->chnl[0].name, COL_SYSTEM); } refresh_room(); screen_show(); refresh_input(); string_show(); if ((!config->my_only || !strncmp(status->room->name, status->channel, CHANNEL_MAXLEN)) && (config->mode == MOD_NORMAL)) beep_system(); } void pars_pmodenormal(void) { strncpy(status->nick, packet, NICK_MAXLEN); snprintf(message, MSG_SIZE, PARS_MODE, time_get(), status->nick); pars_word(); switch ((status->mode = pars_number())) { case MOD_NORMAL: strncat(message, PARS_MODENORMAL, STR_SIZE); break; case MOD_DND: strncat(message, PARS_MODEDND, STR_SIZE); break; case MOD_AWAY: strncat(message, PARS_MODEAWAY, STR_SIZE); break; case MOD_OFF: strncat(message, PARS_MODEOFF, STR_SIZE); break; } #ifdef TCP write_tcp(status->chnl[0].name); #endif /* TCP */ if (!user_ignore() && config->verbose) { write_log(config->log_main); write_str(status->chnl[0].name, COL_SYSTEM); } status->gender = pars_number(); if (status->mode != MOD_NORMAL) { snprintf(message, MSG_SIZE, "%s\n", packet); #ifdef TCP write_tcp(status->chnl[0].name); #endif /* TCP */ if (!user_ignore() && config->verbose) { write_log(config->log_main); write_str(status->chnl[0].name, COL_SYSTEM); } } user_mode(); if (!user_ignore() && (!config->my_only || !strncmp(status->room->name, status->channel, CHANNEL_MAXLEN)) && (config->mode == MOD_NORMAL)) beep_system(); } void pars_pmodednd(void) { strncpy(status->nick, packet, NICK_MAXLEN); snprintf(message, MSG_SIZE, PARS_MODE, time_get(), status->nick); user_mode(); if (!user_ignore() && (!config->my_only || !strncmp(status->room->name, status->channel, CHANNEL_MAXLEN)) && (config->mode == MOD_NORMAL)) beep_system(); } void pars_pmodeaway(void) { strncpy(status->nick, packet, NICK_MAXLEN); snprintf(message, MSG_SIZE, PARS_MODE, time_get(), status->nick); user_mode(); if (!user_ignore() && (!config->my_only || !strncmp(status->room->name, status->channel, CHANNEL_MAXLEN)) && (config->mode == MOD_NORMAL)) beep_system(); } void pars_pmodeoff(void) { strncpy(status->nick, packet, NICK_MAXLEN); snprintf(message, MSG_SIZE, PARS_MODE, time_get(), status->nick); user_mode(); if (!user_ignore() && (!config->my_only || !strncmp(status->room->name, status->channel, CHANNEL_MAXLEN)) && (config->mode == MOD_NORMAL)) beep_system(); } void pars_pmodegame(void) { strncpy(status->nick, packet, NICK_MAXLEN); snprintf(message, MSG_SIZE, PARS_MODE, time_get(), status->nick); user_mode(); if (!user_ignore() && (!config->my_only || !strncmp(status->room->name, status->channel, CHANNEL_MAXLEN)) && (config->mode == MOD_NORMAL)) beep_system(); } void pars_pactive(void) { strncpy(status->nick, packet, NICK_MAXLEN); pars_word(); status->active = pars_number(); user_active(); } void pars_pinfo(void) { if (strncmp(config->nick, packet, NICK_MAXLEN)) return; strncpy(status->nick, pars_word(), NICK_MAXLEN); if (user_ignore()) return; if (config->verbose) { snprintf(message, MSG_SIZE, PARS_INFO, time_get(), status->nick); write_log(config->log_main); write_str(status->chnl[0].name, COL_SYSTEM); if ((!config->my_only || !strncmp(status->room->name, status->channel, CHANNEL_MAXLEN)) && (config->mode == MOD_NORMAL)) beep_system(); } send_inform(); } void pars_pinform(void) { char host[STR_SIZE]; char user[STR_SIZE]; char addr[STR_SIZE]; char chnlslist[STR_SIZE]; char answer[STR_SIZE]; if (strncmp(config->nick, packet, NICK_MAXLEN)) return; snprintf(message, MSG_SIZE, PARS_INFORM, time_get(), pars_word()); write_log(config->log_main); write_str(status->room->name, COL_SYSTEM); strncpy(host, pars_word(), STR_SIZE); strncpy(user, pars_word(), STR_SIZE); strncpy(addr, pars_word(), STR_SIZE); strncpy(chnlslist, pars_word(), STR_SIZE); strncpy(answer, pars_word(), STR_SIZE); snprintf(message, MSG_SIZE, PARS_INFOUH, user, host, addr); write_log(config->log_main); write_str(status->room->name, COL_SYSTEM); chnlslist[strlen(chnlslist)-1] = '\0'; if (strncmp(status->chnl[0].name, chnlslist, CHANNEL_MAXLEN)) { snprintf(message, MSG_SIZE, PARS_INFOCH, chnlslist); write_log(config->log_main); write_str(status->room->name, COL_SYSTEM); } if (*answer != '\0') { snprintf(message, MSG_SIZE, "%s\n", answer); write_log(config->log_main); write_str(status->room->name, COL_SYSTEM); } } void pars_pbeep(void) { if (strncmp(config->nick, packet, NICK_MAXLEN)) return; strncpy(status->nick, pars_word(), NICK_MAXLEN); if (user_ignore()) return; snprintf(message, MSG_SIZE, PARS_BEEP, time_get(), status->nick); if (config->verbose) { write_log(config->log_main); write_str(status->room->name, COL_MESG); } if ((config->mode == MOD_NORMAL) || (config->mode == MOD_DND) || ((config->mode == MOD_AWAY) && user_favorite())) { send_beepack(); beep_beep(); } } void pars_pbeepack(void) { if (strncmp(config->nick, packet, NICK_MAXLEN)) return; strncpy(status->nick, pars_word(), NICK_MAXLEN); status->gender = pars_number(); snprintf(message, MSG_SIZE, PARS_BEEPACK, time_get(), status->nick); write_log(config->log_main); write_str(status->room->name, COL_MESG); } void pars_pexec(void) { strncpy(status->nick, packet, NICK_MAXLEN); if (user_ignore()) return; if (strncmp(config->nick, pars_word(), NICK_MAXLEN)) return; snprintf(message, MSG_SIZE, PARS_EXEC, time_get(), status->nick); write_log(config->log_main); write_str(status->room->name, COL_ERROR); snprintf(message, MSG_SIZE, "%s\n", pars_word()); write_log(config->log_main); write_str(status->room->name, COL_ERROR); if (config->mode != MOD_OFF) send_execack(); } void pars_pexecack(void) { if (strncmp(config->nick, packet, NICK_MAXLEN)) return; strncpy(status->nick, pars_word(), NICK_MAXLEN); snprintf(message, MSG_SIZE, PARS_EXECACK, time_get(), status->nick); write_log(config->log_main); write_str(status->chnl[0].name, COL_SYSTEM); snprintf(message, MSG_SIZE, "%s\n", pars_word()); write_log(config->log_main); write_str(status->chnl[0].name, COL_SYSTEM); } void pars_pchnls(void) { strncpy(status->nick, packet, NICK_MAXLEN); if (config->mode != MOD_OFF) send_userchnlslist(); } void pars_pchnlslist(void) { if (strncmp(config->nick, packet, NICK_MAXLEN)) return; strncpy(config->channel, pars_word(), CHANNEL_MAXLEN); chnl_parse(); } void pars_pmessage(void) { switch (pars_number()) { case MSG_PWELCOME: pars_pwelcome(); break; case MSG_PBYE: pars_pbye(); break; case MSG_PJOIN: pars_pjoin(); break; case MSG_PLEAVE: pars_pleave(); break; case MSG_PHEREWHO: pars_pherewho(); break; case MSG_PHEREIM: pars_phereim(); break; case MSG_PHERE: pars_phere(); break; case MSG_PCHAT: pars_pchat(); break; case MSG_PME: pars_pme(); break; case MSG_PMESG: pars_pmesg(); break; case MSG_PMASS: pars_pmass(); break; case MSG_PMESGACK: pars_pmesgack(); break; case MSG_PTOPIC: pars_ptopic(); break; case MSG_PTOPICNEW: pars_ptopicnew(); break; case MSG_PPRIVJOIN: pars_pprivjoin(); break; case MSG_PPRIVJOINACK: pars_pprivjoinack(); break; case MSG_PPRIVLEAVE: pars_pprivleave(); break; case MSG_PNICK: pars_pnick(); break; case MSG_PACTIVE: pars_pactive(); break; case MSG_PMODENORMAL: pars_pmodenormal(); break; case MSG_PMODEDND: pars_pmodednd(); break; case MSG_PMODEAWAY: pars_pmodeaway(); break; case MSG_PMODEOFF: pars_pmodeoff(); break; case MSG_PMODEGAME: pars_pmodegame(); break; case MSG_PINFO: pars_pinfo(); break; case MSG_PINFORM: pars_pinform(); break; case MSG_PBEEP: pars_pbeep(); break; case MSG_PBEEPACK: pars_pbeepack(); break; case MSG_PEXEC: pars_pexec(); break; case MSG_PEXECACK: pars_pexecack(); break; case MSG_PCHNLS: pars_pchnls(); break; case MSG_PCHNLSLIST: pars_pchnlslist(); break; #ifdef DEBUG default: fprintf(debug_file, "error: Unknown message type.\n"); fflush(debug_file); #endif /* DEBUG */ } }