From be360908b0934781ca58dca1a831fe96dd116ddc Mon Sep 17 00:00:00 2001 From: pk910 Date: Fri, 12 Aug 2011 00:40:42 +0200 Subject: [PATCH] added "channel master bot" system to prevent event duplicates --- ChanNode.c | 6 +++++- ChanNode.h | 2 +- IRCParser.c | 23 +++++++++++++---------- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/ChanNode.c b/ChanNode.c index a1c2e1f..372e8be 100644 --- a/ChanNode.c +++ b/ChanNode.c @@ -78,6 +78,7 @@ struct ChanNode* addChannel(const char *name) { } strcpy(chan->name, name); chan->user = NULL; + chan->chanbot = NULL; chan->topic[0] = 0; chan->flags = 0; chan->next = chanList[chanListIndex]; @@ -116,7 +117,10 @@ void delChannel(struct ChanNode* chan, int freeChan) { void checkChannelVisibility(struct ChanNode* chan) { struct ChanUser *chanuser, *next; for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) { - if(chanuser->user->flags & USERFLAG_ISBOT) return; + if(chanuser->user->flags & USERFLAG_ISBOT) { + chan->chanbot = chanuser->user; + return; + } } //free the channel... for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = next) { diff --git a/ChanNode.h b/ChanNode.h index 8d1ed34..04da48b 100644 --- a/ChanNode.h +++ b/ChanNode.h @@ -11,7 +11,7 @@ struct ChanNode { char topic[TOPICLEN+1]; struct ChanUser *user; char flags; - + struct UserNode *chanbot; struct ChanNode *next; }; diff --git a/IRCParser.c b/IRCParser.c index 669b09d..3c99664 100644 --- a/IRCParser.c +++ b/IRCParser.c @@ -101,13 +101,15 @@ static IRC_CMD(raw_001) { static IRC_CMD(raw_join) { if(from == NULL || argc < 1) return 0; struct UserNode *user = getUserByMask(from); + struct ChanNode *chan = getChanByName(argv[0]); + if(!chan && !(user->flags & USERFLAG_ISBOT)) return 0; if(user == NULL) { user = addUserMask(from); } - struct ChanNode *chan = getChanByName(argv[0]); if(chan == NULL) { chan = addChannel(argv[0]); //request member list + chan->chanbot = user; struct ChanUser *chanuser = addChanUser(chan, user); //it must be a bot get_userlist(chan, got_channel_userlist, chanuser); } else if(!isUserOnChan(user, chan) && (chan->flags & CHANFLAG_RECEIVED_USERLIST)) { @@ -128,7 +130,7 @@ static IRC_CMD(raw_part) { delChanUser(chanuser, 0); //we need to free the chanuser manually! event_part(chanuser, argv[1]); free(chanuser); - if(user->flags & USERFLAG_ISBOT) { + if(chan->chanbot == user) { //check if theres another bot in the channel - otherwise free it checkChannelVisibility(chan); } @@ -206,6 +208,7 @@ static IRC_CMD(raw_topic) { struct UserNode *user = getUserByMask(from); struct ChanNode *chan = getChanByName(argv[0]); if(chan == NULL) return 0; + if(chan->chanbot != client->user) return 1; //just ignore it to prevent event duplicates if(user == NULL) { user = createTempUser(from); user->flags |= USERFLAG_ISTMPUSER; @@ -221,19 +224,19 @@ static IRC_CMD(raw_topic) { static IRC_CMD(raw_privmsg) { if(from == NULL || argc < 2) return 0; struct UserNode *user = getUserByMask(from); - struct ChanNode *chan = getChanByName(argv[0]); - if(chan == NULL) return 0; if(user == NULL) { user = createTempUser(from); user->flags |= USERFLAG_ISTMPUSER; } - //TEST - struct ChanUser *chanuser; - putsock(client, "PRIVMSG %s :[PRIVMSG] Users on this Channel:", chan->name); - for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) { - putsock(client, "PRIVMSG %s : %s!%s@%s [%s] rights: %d", chan->name, chanuser->user->nick, chanuser->user->ident, chanuser->user->host, ((chanuser->user->flags & USERFLAG_ISAUTHED) ? chanuser->user->auth : "*"), chanuser->flags); + if(argv[0][0] == '#') { //Channel message + struct ChanNode *chan = getChanByName(argv[0]); + if(chan && chan->chanbot == client->user) + event_chanmsg(user, chan, argv[1]); + } else { + struct UserNode *target = getUserByNick(argv[0]); + if(target) + event_privmsg(user, target, argv[1]); } - //END TEST if(user->flags & USERFLAG_ISTMPUSER) { free(user); } -- 2.20.1