/* pckt_vprs.c * * copyright (c) 2000-2003 SeaD * see GPL for copying info * */ #include #include "echat.h" #include "pckt_vpak.h" int pars_vhead(void) { char ch; register int n, m; if (config->packet_qchat) for (ch = packet[0], m = 1, n = 0; m < MSG_SIZE;) packet[n++] = packet[m++]; else { if (config->packet_xor) { if (*packet != PACKET_VYPRESSXOR) { #ifdef DEBUG fprintf(debug_file, "error: Invalid packet type %c\n", *packet); fflush(debug_file); #endif /* DEBUG */ return -1; } } else { if (*packet != PACKET_VYPRESS) { #ifdef DEBUG fprintf(debug_file, "error: Invalid packet type %c\n", *packet); fflush(debug_file); #endif /* DEBUG */ return -1; } } ch = packet[HEADER_LEN]; for (m = HEADER_LEN+1, n = 0; m < MSG_SIZE;) packet[n++] = packet[m++]; } return ((int) ch); } void pars_vherewho(void) { strncpy(status->nick, packet, NICK_MAXLEN); send_hereim(); status_ok(PARS_SHERE); } void pars_vhereim(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_vchat(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_vnick(void) { strncpy(status->channel, packet, NICK_MAXLEN); strncpy(status->nick, pars_word(), NICK_MAXLEN); if (!config->packet_qchat) { pars_word(); status->gender = pars_number(); } 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_vjoin(void) { strncpy(status->nick, packet, NICK_MAXLEN); strncpy(status->channel, pars_word(), CHANNEL_MAXLEN); pars_word(); status->mode = pars_number(); if (!config->packet_qchat) status->gender = pars_number(); chnl_join(); } void pars_vleave(void) { strncpy(status->nick, packet, NICK_MAXLEN); strncpy(status->channel, pars_word(), CHANNEL_MAXLEN); if (!config->packet_qchat) { pars_word(); status->gender = pars_number(); } chnl_leave(); } void pars_vmesg(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_vmass(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_vmesgack(void) { status->mode = pars_number(); if (strncmp(config->nick, packet, NICK_MAXLEN)) return; strncpy(status->nick, pars_word(), NICK_MAXLEN); if (config->packet_qchat) { snprintf(message, MSG_SIZE, PARS_MESGACK, time_get(), status->nick); write_log(config->log_mesg); write_str(status->room->name, COL_MESG); } else { 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_vexec(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_vexecack(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_vme(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_vtopicnew(void) { if (config->packet_qchat) { strncpy(status->chnl[0].topic, packet, STR_SIZE); snprintf(message, MSG_SIZE, PARS_QTOPIC, time_get()); #ifdef TCP write_tcp(status->room->name); #endif /* TCP */ if (config->verbose) { write_log(config->log_main); write_str(status->room->name, COL_SYSTEM); } snprintf(message, MSG_SIZE, "%s\n", status->chnl[0].topic); #ifdef TCP write_tcp(status->room->name); #endif /* TCP */ if (config->verbose) { write_log(config->log_main); write_str(status->room->name, COL_SYSTEM); } } else { 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_vtopic(void) { if (strncmp(config->nick, packet, NICK_MAXLEN)) return; if (config->packet_qchat) { if (!strncmp(status->chnl[0].topic, pars_word(), STR_SIZE)) return; strncpy(status->chnl[0].topic, packet, STR_SIZE); snprintf(message, MSG_SIZE, PARS_QTOPICC, time_get()); #ifdef TCP write_tcp(status->room->name); #endif /* TCP */ write_log(config->log_main); write_str(status->room->name, COL_SYSTEM); snprintf(message, MSG_SIZE, "%s\n", status->chnl[0].topic); #ifdef TCP write_tcp(status->room->name); #endif /* TCP */ write_log(config->log_main); write_str(status->room->name, COL_SYSTEM); } else { 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_vmode(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); } if (!config->packet_qchat) { 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_vinfo(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_vinform(void) { char host[STR_SIZE]; char user[STR_SIZE]; char addr[STR_SIZE]; char chnlslist[STR_SIZE]; char answer[STR_SIZE]; if (config->packet_qchat) { 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(answer, pars_word(), STR_SIZE); strncpy(chnlslist, pars_word(), STR_SIZE); snprintf(message, MSG_SIZE, PARS_QINFOUH, user, host, addr, answer); write_log(config->log_main); write_str(status->room->name, COL_SYSTEM); chnlslist[strlen(chnlslist)-1] = '\0'; *answer = '\0'; } else { 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_vbeep(void) { switch (pars_number()) { case MSG_VBEEPBEEP: if (strncmp(config->nick, packet, NICK_MAXLEN)) break; strncpy(status->nick, pars_word(), NICK_MAXLEN); if (user_ignore()) break; 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(); } break; case MSG_VBEEPACK: if (strncmp(config->nick, packet, NICK_MAXLEN)) break; if (!config->packet_qchat) { 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); break; default: #ifdef DEBUG fprintf(debug_file, "error: Unknown beep type.\n"); fflush(debug_file); #endif /* DEBUG */ break; } } void pars_vbeepreq(void) { /* FIXME: who needs this??? */ status_ok(PARS_SBEEPREQ); } void pars_vprivat(void) { int privat; privat = pars_number(); 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; switch (privat) { case MSG_VPRIVATJOIN: if (!config->packet_qchat) { pars_word(); status->gender = pars_number(); } chat_join(); break; case MSG_VPRIVATLEAVE: if (!config->packet_qchat) { pars_word(); status->gender = pars_number(); } chat_leave(); break; case MSG_VPRIVATCHAT: chat_rejoin(); snprintf(message, MSG_SIZE, "<%s> %s\n", status->nick, pars_word()); write_log(config->log_priv); write_str(status->channel, COL_CHAT); if ((!config->my_only || !strncmp(status->room->name, status->channel, CHANNEL_MAXLEN)) && (config->mode == MOD_NORMAL)) beep_chat(); break; case MSG_VPRIVATME: chat_rejoin(); snprintf(message, MSG_SIZE, " * %s %s\n", status->nick, pars_word()); write_log(config->log_priv); write_str(status->channel, COL_CHAT); if ((!config->my_only || !strncmp(status->room->name, status->channel, CHANNEL_MAXLEN)) && (config->mode == MOD_NORMAL)) beep_chat(); break; default: #ifdef DEBUG fprintf(debug_file, "error: Unknown private type.\n"); fflush(debug_file); #endif /* DEBUG */ break; } } void pars_vhere(void) { if (config->mode == MOD_OFF) return; 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; send_herewe(); } void pars_vherewe(void) { if (strncmp(config->nick, packet, NICK_MAXLEN)) return; strncpy(status->channel, pars_word(), CHANNEL_MAXLEN); strncpy(status->nick, pars_word(), NICK_MAXLEN); pars_word(); snprintf(message, MSG_SIZE, PARS_HERE, time_get(), status->nick, (pars_number() ? PARS_HEREACT : PARS_HERENAC)); write_log(config->log_main); write_str(status->channel, COL_SYSTEM); } void pars_vactive(void) { strncpy(status->nick, packet, NICK_MAXLEN); pars_word(); status->active = pars_number(); user_active(); } void pars_vuserchnls(void) { if (config->mode == MOD_OFF) return; strncpy(status->nick, packet, NICK_MAXLEN); send_userchnlslist(); } void pars_vuserchnlslist(void) { if (strncmp(config->nick, packet, NICK_MAXLEN)) return; strncpy(config->channel, pars_word(), CHANNEL_MAXLEN); chnl_parse(); } void pars_vmessage(void) { switch (pars_vhead()) { case MSG_VHEREWHO: pars_vherewho(); break; case MSG_VHEREIM: pars_vhereim(); break; case MSG_VCHAT: pars_vchat(); break; case MSG_VNICK: pars_vnick(); break; case MSG_VJOIN: pars_vjoin(); break; case MSG_VLEAVE: pars_vleave(); break; case MSG_VMESG: pars_vmesg(); break; case MSG_VMASS: pars_vmass(); break; case MSG_VMESGACK: pars_vmesgack(); break; case MSG_VEXEC: pars_vexec(); break; case MSG_VEXECACK: pars_vexecack(); break; case MSG_VME: pars_vme(); break; case MSG_VTOPICNEW: pars_vtopicnew(); break; case MSG_VTOPIC: pars_vtopic(); break; case MSG_VMODE: pars_vmode(); break; case MSG_VINFO: pars_vinfo(); break; case MSG_VINFORM: pars_vinform(); break; case MSG_VBEEP: pars_vbeep(); break; case MSG_VBEEPREQ: pars_vbeepreq(); break; case MSG_VPRIVAT: pars_vprivat(); break; case MSG_VHERE: pars_vhere(); break; case MSG_VHEREWE: pars_vherewe(); break; case MSG_VACTIVE: pars_vactive(); break; case MSG_VUSERCHNLS: pars_vuserchnls(); break; case MSG_VUSERCHNLSLIST: pars_vuserchnlslist(); break; #ifdef DEBUG default: fprintf(debug_file, "error: Unknown message type.\n"); fflush(debug_file); #endif /* DEBUG */ } }