X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=blobdiff_plain;f=src%2FIRCParser.c;h=701ad457b54d592ecae6b15c02d9d110916e2a88;hp=fc6b607cbf2e98c8ce3bba734090cf4eec9dcf31;hb=HEAD;hpb=eab681e7f891e8a06ee0690e7989a4dca62406eb diff --git a/src/IRCParser.c b/src/IRCParser.c index fc6b607..701ad45 100644 --- a/src/IRCParser.c +++ b/src/IRCParser.c @@ -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,6 +336,10 @@ 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); @@ -379,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 @@ -475,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); } @@ -550,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)) { @@ -634,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; @@ -641,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, " "); @@ -679,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) { @@ -893,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; } }