-/* 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
#include "bots.h"
#include "timeq.h"
#include "ConfigParser.h"
+#include "statistics.h"
struct irc_cmd *irc_commands = NULL;
//static struct UserNode *registering_users = NULL;
chan = addChannel(argv[0]);
chanuser = addChanUser(chan, user);
chanuser->visCount = 1;
+ chan->botcount = 1;
get_userlist_with_invisible(chan, 0, got_channel_userlist, chanuser);
putsock(client, "MODE %s", chan->name);
putsock(client, "MODE %s +b", chan->name);
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
chanuser->flags |= CHANUSERFLAG_INVISIBLE;
if(isModeSet(chan->modes, 'D')) //if the bot joins a channel it could also be invisible
chanuser->flags |= CHANUSERFLAG_INVISIBLE;
increase_viscount_butone(chan, chanuser);
+ chan->botcount++;
}
event_join(chanuser);
chanuser = getChanUser(user, chan);
chanuser->visCount++;
- if(isBot(user) && client->user == user)
+ if(isBot(user) && client->user == user) {
increase_viscount_butone(chan, chanuser);
+ chan->botcount++;
+ }
+
+ if(chanuser->visCount > chan->botcount) {
+ chanuser->visCount = chan->botcount;
+ //TODO: Trigger WARNING
+ }
//if multiple bots see the user, it can't be invisible
chanuser->flags &= ~CHANUSERFLAG_INVISIBLE;
DESYNCHRONIZE(cache_sync);
return 0;
}
- if(isBot(user) && user == client->user)
+ if(isBot(user) && user == client->user) {
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
DESYNCHRONIZE(cache_sync);
return 0;
}
- if(isBot(target) && target == client->user)
+ if(isBot(target) && target == client->user) {
decrease_viscount_butone(chan, chanuser);
+ chan->botcount--;
+ }
chanuser->visCount--;
if(chanuser->visCount == 0) {
delChanUser(chanuser, 0); //not free, yet!
for(chanuser = getUserChannels(user, NULL); chanuser; chanuser = next_chanuser) {
next_chanuser = getUserChannels(user, chanuser);
decrease_viscount_butone(chanuser->chan, chanuser);
+ chanuser->chan->botcount--;
chanuser->visCount--;
if(chanuser->visCount <= 0) {
delChanUser(chanuser, 0); //not free, yet!
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, " ");