X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=blobdiff_plain;f=src%2FIRCParser.c;h=701ad457b54d592ecae6b15c02d9d110916e2a88;hp=c8cd526a5b37dae8ca0f6f9c72f231ae18aa74a3;hb=HEAD;hpb=854e38b76f6ca963c0def2dd0e71153a56f2930c diff --git a/src/IRCParser.c b/src/IRCParser.c index c8cd526..701ad45 100644 --- a/src/IRCParser.c +++ b/src/IRCParser.c @@ -1,4 +1,4 @@ -/* IRCParser.c - NeonServ v5.5 +/* IRCParser.c - NeonServ v5.6 * Copyright (C) 2011-2012 Philipp Kreil (pk910) * * This program is free software: you can redistribute it and/or modify @@ -30,6 +30,8 @@ #include "bots.h" #include "timeq.h" #include "ConfigParser.h" +#include "statistics.h" +#include "log.h" struct irc_cmd *irc_commands = NULL; //static struct UserNode *registering_users = NULL; @@ -58,9 +60,9 @@ void parse_line(struct ClientSocket *client, char *line) { int argc = 0; char *argv[MAXNUMPARAMS]; #ifdef HAVE_THREADS - putlog(LOGLEVEL_RAW, "[%d recv %lu] %s\n", getCurrentThreadID(), (unsigned long) strlen(line), line); + printf_log("main", LOG_IRCRAW, "[%d recv %lu] %s\n", getCurrentThreadID(), (unsigned long) strlen(line), line); #else - putlog(LOGLEVEL_RAW, "[recv %lu] %s\n", (unsigned long) strlen(line), line); + printf_log("main", LOG_IRCRAW, "[recv %lu] %s\n", (unsigned long) strlen(line), line); #endif if(line[0] == ':') line++; @@ -90,7 +92,7 @@ static void register_irc_function(char *command, irc_cmd_t *func) { struct irc_cmd *irc_cmd = malloc(sizeof(*irc_cmd)); if (!irc_cmd) { - perror("malloc() failed"); + printf_log("main", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__); return; } irc_cmd->cmd = command; @@ -111,7 +113,7 @@ static void parse_raw(struct ClientSocket *client, char *from, char *cmd, char * if(!irc_cmd) { event_raw(client, from, cmd, argv, argc); } else if(!ret) { - fprintf(stderr,"PARSE ERROR: %s\n", cmd); + printf_log("main", LOG_WARNING | LOG_IRCRAW, "PARSE ERROR: %s %s %s\n", (from ? from : "*"), cmd, merge_argv(argv, 0, argc)); } } @@ -334,14 +336,20 @@ static IRC_CMD(raw_join) { event_registered(user, from); user->flags &= ~USERFLAG_WAS_REGISTERING; + if(user->last_who > REWHO_TIMEOUT) + user->last_who -= REWHO_TIMEOUT; + + event_join(chanuser); } else if(!(chan->flags & CHANFLAG_RECEIVED_USERLIST)) { if(client->user != user) { //bots are allowed to add themselves DESYNCHRONIZE(cache_sync); return 1; //ignore join } - chanuser = addChanUser(chan, user); - chanuser->visCount = 1; + if(!(chanuser = getChanUser(user, chan))) { + chanuser = addChanUser(chan, user); + } + chanuser->visCount++; chan->botcount++; if(isModeSet(chan->modes, 'D')) //if the bot joins a channel it could also be invisible @@ -377,8 +385,8 @@ static IRC_CMD(raw_join) { } if(chanuser->visCount > chan->botcount) { + printf_log("main", LOG_WARNING, "visCount (%d) bigger than botcount (%d) on channel %s (user %s).", chanuser->visCount, chan->botcount, chan->name, user->nick); chanuser->visCount = chan->botcount; - //TODO: Trigger WARNING } //if multiple bots see the user, it can't be invisible @@ -402,11 +410,24 @@ static IRC_CMD(raw_part) { decrease_viscount_butone(chan, chanuser); chan->botcount--; } + if(chanuser->flags & CHANUSERFLAG_PARTING) + chanuser->old_visCount--; chanuser->visCount--; if(chanuser->visCount == 0) { delChanUser(chanuser, 0); //not free, yet! event_part(chanuser, 0, (argc > 1 ? argv[1] : NULL)); freeChanUser(chanuser); + } else if(!(chanuser->flags & CHANUSERFLAG_PARTING)) { + chanuser->flags |= CHANUSERFLAG_PARTING; + chanuser->old_visCount = chanuser->visCount; + } else if(chanuser->old_visCount == 0) { + int visCount = chanuser->visCount; + delChanUser(chanuser, 0); //not free, yet! + event_part(chanuser, 0, (argc > 1 ? argv[1] : NULL)); + freeChanUser(chanuser); + chanuser = addChanUser(chan, user); + chanuser->visCount = visCount; + event_join(chanuser); } //check if channel is still present @@ -460,7 +481,8 @@ static IRC_CMD(raw_kick) { chanuser->visCount--; if(chanuser->visCount == 0) { delChanUser(chanuser, 0); //not free, yet! - event_kick(user, chanuser, argv[2]); + if(user) + event_kick(user, chanuser, argv[2]); freeChanUser(chanuser); } @@ -535,6 +557,7 @@ static IRC_CMD(raw_quit) { if(user->channel == NULL) { if(isBot(user)) { //ASSERT + DESYNCHRONIZE(cache_sync); return 0; } if((user->flags & USERFLAG_WAS_REGISTERING)) { @@ -619,6 +642,7 @@ static IRC_CMD(raw_privmsg) { if(from == NULL || argc < 2) return 0; struct UserNode *user = getUserByMask(from); if(user == NULL) { + if(stricmplen(from, "***!", 4) == 0) return 1; /* ZNC Playback */ user = createTempUserMask(from); if(!user) return 0; user->flags |= USERFLAG_ISTMPUSER; @@ -626,8 +650,7 @@ static IRC_CMD(raw_privmsg) { if(argv[0][0] == '#') { //Channel message struct ChanNode *chan = getChanByName(argv[0]); if(chan && client == get_first_prefered_bot_in_channel(chan)) { - if(statistics_enabled) - statistics_privmsg++; + statistics_privmsg++; if(argv[1][0] == '\001') { char *cmd = &argv[1][1]; char *text = strstr(cmd, " "); @@ -664,6 +687,7 @@ static IRC_CMD(raw_privmsg) { } static IRC_CMD(raw_notice) { + if(from == NULL && argc && !stricmp(argv[0], "AUTH")) return 1; //NOTICE AUTH is NOT a parse error ;) if(from == NULL || argc < 2) return 0; struct UserNode *user = getUserByMask(from); if(user == NULL) { @@ -878,7 +902,7 @@ static void raw_005_network(struct ClientSocket *client, char *value) { if(bot == client) continue; if(!bot->network_name) continue; if(stricmp(bot->network_name, value)) { - putlog(LOGLEVEL_ERROR, "WARNING: Network name '%s' (%s) differs from '%s' (%s)! Connecting to multiple IRC-Networks with one instance is NOT supported!\n", client->network_name, client->nick, bot->network_name, bot->nick); + printf_log("main", LOG_ERROR, "WARNING: Network name '%s' (%s) differs from '%s' (%s)! Connecting to multiple IRC-Networks with one instance is NOT supported!\n", client->network_name, client->nick, bot->network_name, bot->nick); break; } }