added "channel master bot" system to prevent event duplicates
[NeonServV5.git] / IRCParser.c
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);
     }