added "channel master bot" system to prevent event duplicates
authorpk910 <philipp@zoelle1.de>
Thu, 11 Aug 2011 22:40:42 +0000 (00:40 +0200)
committerpk910 <philipp@zoelle1.de>
Thu, 11 Aug 2011 22:40:42 +0000 (00:40 +0200)
ChanNode.c
ChanNode.h
IRCParser.c

index a1c2e1ff390cf952f8bb20db2ed49c1c0ee27bca..372e8be5770bc2b7fe251b5bcb514772d45a6fe4 100644 (file)
@@ -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) {
index 8d1ed34e6aeee1f6b1bda8774059b6e7ae250013..04da48b681adc29aa4f9ba5fad10ac7b63246d0b 100644 (file)
@@ -11,7 +11,7 @@ struct ChanNode {
     char topic[TOPICLEN+1];
     struct ChanUser *user;
     char flags;
-    
+    struct UserNode *chanbot;
     struct ChanNode *next;
 };
 
index 669b09d5046468adec1d9f1a2ad6e6367f9243ca..3c996645f4efb5a01cb0bd25504dbf889c050f1d 100644 (file)
@@ -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);
     }