Ver código fonte

add_mode: Pass memberlist pointer if possible

Bryan Drewery 10 anos atrás
pai
commit
280eed1586

+ 5 - 5
src/mod/irc.mod/chan.cc

@@ -447,7 +447,7 @@ static void priority_do(struct chanset_t * chan, bool opsonly, int action, bool
             if ((action == PRIO_DEOP) && !chan_sentdeop(m)) {
             if ((action == PRIO_DEOP) && !chan_sentdeop(m)) {
               ++actions;
               ++actions;
               ++sent;
               ++sent;
-              add_mode(chan, '-', 'o', m->nick);
+              add_mode(chan, '-', 'o', m);
               if (!floodless && (actions >= ct || (n == 1 && sent > 20))) {
               if (!floodless && (actions >= ct || (n == 1 && sent > 20))) {
                 if (flush)
                 if (flush)
                   flush_mode(chan, QUICK);
                   flush_mode(chan, QUICK);
@@ -893,7 +893,7 @@ static void refresh_ban_kick(struct chanset_t* chan, memberlist *m, const char *
     for (maskrec* b = cycle ? chan->bans : global_bans; b; b = b->next) {
     for (maskrec* b = cycle ? chan->bans : global_bans; b; b = b->next) {
       if (wild_match(b->mask, user) || match_cidr(b->mask, user)) {
       if (wild_match(b->mask, user) || match_cidr(b->mask, user)) {
         if (role == 1 && chan_hasop(m))
         if (role == 1 && chan_hasop(m))
-  	  add_mode(chan, '-', 'o', m->nick);	/* Guess it can't hurt.	*/
+          add_mode(chan, '-', 'o', m);	/* Guess it can't hurt.	*/
 	check_exemptlist(chan, user);
 	check_exemptlist(chan, user);
 	do_mask(chan, chan->channel.ban, b->mask, 'b');
 	do_mask(chan, chan->channel.ban, b->mask, 'b');
 	b->lastactive = now;
 	b->lastactive = now;
@@ -1221,7 +1221,7 @@ static void check_this_member(struct chanset_t *chan, char *nick, struct flag_re
       (chk_deop(*fr, chan) ||
       (chk_deop(*fr, chan) ||
        (!loading && userlist && chan_bitch(chan) && !chk_op(*fr, chan)) ) ) {
        (!loading && userlist && chan_bitch(chan) && !chk_op(*fr, chan)) ) ) {
     /* if (target_priority(chan, m, 1)) */
     /* if (target_priority(chan, m, 1)) */
-      add_mode(chan, '-', 'o', m->nick);
+      add_mode(chan, '-', 'o', m);
   } else if (!chan_hasop(m) && dovoice(chan) && m->user && !u_pass_match(m->user, "-") && chk_autoop(*fr, chan)) {
   } else if (!chan_hasop(m) && dovoice(chan) && m->user && !u_pass_match(m->user, "-") && chk_autoop(*fr, chan)) {
     do_op(m, chan, 1, 0);
     do_op(m, chan, 1, 0);
   }
   }
@@ -1229,11 +1229,11 @@ static void check_this_member(struct chanset_t *chan, char *nick, struct flag_re
     if (chan_hasvoice(m) && !chan_hasop(m)) {
     if (chan_hasvoice(m) && !chan_hasop(m)) {
       /* devoice +q users .. */
       /* devoice +q users .. */
       if (chk_devoice(*fr) || (channel_voicebitch(chan) && !chk_voice(*fr, chan)))
       if (chk_devoice(*fr) || (channel_voicebitch(chan) && !chk_voice(*fr, chan)))
-        add_mode(chan, '-', 'v', m->nick);
+        add_mode(chan, '-', 'v', m);
     } else if (!chan_hasvoice(m) && !chan_hasop(m)) {
     } else if (!chan_hasvoice(m) && !chan_hasop(m)) {
       /* voice +v users */
       /* voice +v users */
       if (chk_voice(*fr, chan)) {
       if (chk_voice(*fr, chan)) {
-        add_mode(chan, '+', 'v', m->nick);
+        add_mode(chan, '+', 'v', m);
         if (m->flags & EVOICE)
         if (m->flags & EVOICE)
           m->flags &= ~EVOICE;
           m->flags &= ~EVOICE;
       }
       }

+ 5 - 5
src/mod/irc.mod/cmdsirc.cc

@@ -305,8 +305,8 @@ static void cmd_kickban(int idx, char *par)
       dprintf(idx, "%s is permanently exempted!\n", nick);
       dprintf(idx, "%s is permanently exempted!\n", nick);
       return;
       return;
     }
     }
-    if (m->flags & CHANOP)
-      add_mode(chan, '-', 'o', m->nick);
+    if (chan_hasop(m))
+      add_mode(chan, '-', 'o', m);
     check_exemptlist(chan, s);
     check_exemptlist(chan, s);
     switch (bantype) {
     switch (bantype) {
       case '@':
       case '@':
@@ -396,7 +396,7 @@ static void cmd_voice(int idx, char *par)
       dprintf(idx, "%s is not on %s.\n", nick, chan->dname);
       dprintf(idx, "%s is not on %s.\n", nick, chan->dname);
       return;
       return;
     }
     }
-    add_mode(chan, '+', 'v', nick);
+    add_mode(chan, '+', 'v', m);
     dprintf(idx, "Gave voice to %s on %s\n", nick, chan->dname);
     dprintf(idx, "Gave voice to %s on %s\n", nick, chan->dname);
     next:;
     next:;
     if (!all)
     if (!all)
@@ -459,7 +459,7 @@ static void cmd_devoice(int idx, char *par)
     return;
     return;
   }
   }
 
 
-  add_mode(chan, '-', 'v', nick);
+  add_mode(chan, '-', 'v', m);
   dprintf(idx, "Devoiced %s on %s\n", nick, chan->dname);
   dprintf(idx, "Devoiced %s on %s\n", nick, chan->dname);
   next:;
   next:;
   if (!all)
   if (!all)
@@ -1041,7 +1041,7 @@ static void cmd_deop(int idx, char *par)
       if (all) goto next;  
       if (all) goto next;  
       return;
       return;
     }
     }
-    add_mode(chan, '-', 'o', nick);
+    add_mode(chan, '-', 'o', m);
     dprintf(idx, "Deopped %s on %s.\n", nick, chan->dname);
     dprintf(idx, "Deopped %s on %s.\n", nick, chan->dname);
     next:;
     next:;
     if (!all)
     if (!all)

+ 4 - 4
src/mod/irc.mod/irc.cc

@@ -212,7 +212,7 @@ void set_devoice(struct chanset_t *chan, memberlist* m) {
 const char* punish_flooder(struct chanset_t* chan, memberlist* m, const char *reason) {
 const char* punish_flooder(struct chanset_t* chan, memberlist* m, const char *reason) {
   if (channel_voice(chan) && chan->voice_moderate) {
   if (channel_voice(chan) && chan->voice_moderate) {
     if (!chan_sentdevoice(m)) {
     if (!chan_sentdevoice(m)) {
-      add_mode(chan, '-', 'v', m->nick);
+      add_mode(chan, '-', 'v', m);
       m->flags |= SENTDEVOICE;
       m->flags |= SENTDEVOICE;
       set_devoice(chan, m);
       set_devoice(chan, m);
       return "devoicing";
       return "devoicing";
@@ -1598,11 +1598,11 @@ check_expired_chanstuff(struct chanset_t *chan)
                      (!channel_voice(chan) && !privchan(fr, chan, PRIV_VOICE) && chk_voice(fr, chan))
                      (!channel_voice(chan) && !privchan(fr, chan, PRIV_VOICE) && chk_voice(fr, chan))
                     )
                     )
                    ) {
                    ) {
-                  add_mode(chan, '+', 'v', m->nick);
+                  add_mode(chan, '+', 'v', m);
                 }
                 }
               }
               }
             } else if (!m->user && channel_voice(chan) && !channel_voicebitch(chan) && voice_ok(m, chan)) {
             } else if (!m->user && channel_voice(chan) && !channel_voicebitch(chan) && voice_ok(m, chan)) {
-              add_mode(chan, '+', 'v', m->nick);
+              add_mode(chan, '+', 'v', m);
             }
             }
           }
           }
         }
         }
@@ -1697,7 +1697,7 @@ flush_modes()
         }
         }
         if (chan_sentvoice(m)) {
         if (chan_sentvoice(m)) {
           m->flags &= ~SENTVOICE;
           m->flags &= ~SENTVOICE;
-          add_mode(chan, '+', 'v', m->nick);
+          add_mode(chan, '+', 'v', m);
         }
         }
       }
       }
     }
     }

+ 12 - 3
src/mod/irc.mod/irc.h

@@ -119,9 +119,18 @@ void join_chan(struct chanset_t* chan, int idx = DP_MODE);
 
 
 int check_bind_authc(char *, Auth *, char *, char *);
 int check_bind_authc(char *, Auth *, char *, char *);
 void notice_invite(struct chanset_t *, char *, char *, char *, bool);
 void notice_invite(struct chanset_t *, char *, char *, char *, bool);
-void real_add_mode(struct chanset_t *, const char, const char, const char *, bool);
-#define add_mode(chan, pls, mode, nick) real_add_mode(chan, pls, mode, nick, 0)
-#define add_cookie(chan, nick) real_add_mode(chan, '+', 'o', nick, 1)
+void real_add_mode(struct chanset_t *, const char, const char, const char *, bool, memberlist *);
+inline void add_mode(struct chanset_t *chan, const char plus, const char mode,
+    const char *op)
+{
+  real_add_mode(chan, plus, mode, op, 0, NULL);
+}
+inline void add_mode(struct chanset_t *chan, const char plus, const char mode,
+    memberlist *m)
+{
+  real_add_mode(chan, plus, mode, m->nick, 0, m);
+}
+#define add_cookie(chan, member) real_add_mode(chan, '+', 'o', member->nick, 1, member)
 /* Check if I am a chanop. Returns boolean 1 or 0.
 /* Check if I am a chanop. Returns boolean 1 or 0.
  */
  */
 inline bool me_op(const struct chanset_t *chan)
 inline bool me_op(const struct chanset_t *chan)

+ 13 - 14
src/mod/irc.mod/mode.cc

@@ -104,9 +104,9 @@ do_op(memberlist *m, struct chanset_t *chan, bool delay, bool force)
   }
   }
 
 
   if (channel_fastop(chan) || channel_take(chan) || cookies_disabled) {
   if (channel_fastop(chan) || channel_take(chan) || cookies_disabled) {
-    add_mode(chan, '+', 'o', m->nick);
+    add_mode(chan, '+', 'o', m);
   } else if (!connect_bursting) {
   } else if (!connect_bursting) {
-    add_cookie(chan, m->nick);
+    add_cookie(chan, m);
   }
   }
   return 1;
   return 1;
 }
 }
@@ -332,15 +332,14 @@ flush_mode(struct chanset_t *chan, int pri)
 /* Queue a channel mode change
 /* Queue a channel mode change
  */
  */
 void
 void
-real_add_mode(struct chanset_t *chan, const char plus, const char mode, const char *op, bool cookie)
+real_add_mode(struct chanset_t *chan, const char plus, const char mode, const char *op, bool cookie, memberlist *mx)
 {
 {
   if (!me_op(chan))
   if (!me_op(chan))
     return;
     return;
 
 
-  memberlist *mx = NULL;
-
   if (mode == 'o' || mode == 'v') {
   if (mode == 'o' || mode == 'v') {
-    mx = ismember(chan, op);
+    if (!mx)
+      mx = ismember(chan, op);
     if (!mx)
     if (!mx)
       return;
       return;
     if (plus == '-' && mode == 'o') {
     if (plus == '-' && mode == 'o') {
@@ -599,7 +598,7 @@ got_op(struct chanset_t *chan, memberlist *m, memberlist *mv)
         m->flags |= SENTDEOP;
         m->flags |= SENTDEOP;
 #endif
 #endif
       if (num == 5) {
       if (num == 5) {
-        add_mode(chan, '-', 'o', m->nick);
+        add_mode(chan, '-', 'o', m);
       } else if (bitch && num == 6) {
       } else if (bitch && num == 6) {
         len = simple_snprintf(outbuf, sizeof(outbuf), "KICK %s %s :%s\r\n", chan->name, mv->nick, response(RES_BITCHOPPED));
         len = simple_snprintf(outbuf, sizeof(outbuf), "KICK %s %s :%s\r\n", chan->name, mv->nick, response(RES_BITCHOPPED));
         mv->flags |= SENTKICK;
         mv->flags |= SENTKICK;
@@ -607,7 +606,7 @@ got_op(struct chanset_t *chan, memberlist *m, memberlist *mv)
         len = simple_snprintf(outbuf, sizeof(outbuf), "KICK %s %s :%s\r\n", chan->name, m->nick, response(RES_BITCHOP));
         len = simple_snprintf(outbuf, sizeof(outbuf), "KICK %s %s :%s\r\n", chan->name, m->nick, response(RES_BITCHOP));
         m->flags |= SENTKICK;
         m->flags |= SENTKICK;
       } else
       } else
-        add_mode(chan, '-', 'o', mv->nick);
+        add_mode(chan, '-', 'o', mv);
 
 
       if (len)
       if (len)
         dprintf_real(DP_MODE_NEXT, outbuf, len, sizeof(outbuf));
         dprintf_real(DP_MODE_NEXT, outbuf, len, sizeof(outbuf));
@@ -615,13 +614,13 @@ got_op(struct chanset_t *chan, memberlist *m, memberlist *mv)
 
 
 
 
   } else if (reversing && !me_opped)
   } else if (reversing && !me_opped)
-    add_mode(chan, '-', 'o', mv->nick);
+    add_mode(chan, '-', 'o', mv);
 
 
   /* server op */
   /* server op */
   if (!m && meop && !me_opped) {
   if (!m && meop && !me_opped) {
     if (chk_deop(victim, chan) || (chan_bitch(chan) && !chk_op(victim, chan))) {
     if (chk_deop(victim, chan) || (chan_bitch(chan) && !chk_op(victim, chan))) {
       mv->flags |= FAKEOP;
       mv->flags |= FAKEOP;
-      add_mode(chan, '-', 'o', mv->nick);
+      add_mode(chan, '-', 'o', mv);
     } 
     } 
   }
   }
   mv->flags |= WASOP;
   mv->flags |= WASOP;
@@ -1487,9 +1486,9 @@ gotmode(char *from, char *msg)
                 mv->flags |= CHANVOICE;
                 mv->flags |= CHANVOICE;
                 if (channel_active(chan) && dovoice(chan)) {
                 if (channel_active(chan) && dovoice(chan)) {
                   if (dv || chk_devoice(victim) || (channel_voicebitch(chan) && !chk_voice(victim, chan))) {
                   if (dv || chk_devoice(victim) || (channel_voicebitch(chan) && !chk_voice(victim, chan))) {
-                    add_mode(chan, '-', 'v', mparam);
+                    add_mode(chan, '-', 'v', mv);
                   } else if (reversing) {
                   } else if (reversing) {
-                    add_mode(chan, '-', 'v', mparam);
+                    add_mode(chan, '-', 'v', mv);
                   }
                   }
                 }
                 }
               } else if (msign == '-') {
               } else if (msign == '-') {
@@ -1498,9 +1497,9 @@ gotmode(char *from, char *msg)
                 if (channel_active(chan) && dovoice(chan) && !chan_hasop(mv)) {
                 if (channel_active(chan) && dovoice(chan) && !chan_hasop(mv)) {
                   /* revoice +v users */
                   /* revoice +v users */
                   if (chk_voice(victim, chan)) {
                   if (chk_voice(victim, chan)) {
-                    add_mode(chan, '+', 'v', mparam);
+                    add_mode(chan, '+', 'v', mv);
                   } else if (reversing) {
                   } else if (reversing) {
-                    add_mode(chan, '+', 'v', mparam);
+                    add_mode(chan, '+', 'v', mv);
                     /* if they arent +v|v and VOICER is m+ then EVOICE them */
                     /* if they arent +v|v and VOICER is m+ then EVOICE them */
                   } else {
                   } else {
                     if (!match_my_nick(nick) && channel_voice(chan) &&
                     if (!match_my_nick(nick) && channel_voice(chan) &&