Jelajahi Sumber

* Fixed cmd_stick/cmd_unstick not making leaf bots set/unset the masks in channels. (#41)
* Rewrote/combined all of share_stick_*() into share_stick_mask()
* Added check_this_mask()


svn: 2038

Bryan Drewery 21 tahun lalu
induk
melakukan
228acfca05

+ 1 - 0
doc/UPDATES

@@ -95,6 +95,7 @@ Lines prefixxed with '-' were disabled before release and are not finishsed, or
 * Fixed msgs being logged when the msg has triggered an ignore for flooding. (#23)
 * Fixed msgs being logged when the msg has triggered an ignore for flooding. (#23)
 * botcmd * wasn't correctly being restricted to +n (#35)
 * botcmd * wasn't correctly being restricted to +n (#35)
 * Fixed cmd_mns_(ban|exempt|invite) to remove the proper ban if a number is used (#38)
 * Fixed cmd_mns_(ban|exempt|invite) to remove the proper ban if a number is used (#38)
+* Fixed cmd_stick/cmd_unstick not making leaf bots set/unset the masks in channels. (#41)
 
 
 1.2.2
 1.2.2
 * Don't sanity check flags for users on DCC CHAT if they are on the bot via .botcmd.
 * Don't sanity check flags for users on DCC CHAT if they are on the bot via .botcmd.

+ 4 - 4
src/mod/channels.mod/channels.h

@@ -40,7 +40,7 @@ void set_handle_laston(char *, struct userrec *, time_t);
 int u_delmask(char type, struct chanset_t *c, char *who, int doit);
 int u_delmask(char type, struct chanset_t *c, char *who, int doit);
 bool u_addmask(char type, struct chanset_t *, char *, char *, char *, time_t, int);
 bool u_addmask(char type, struct chanset_t *, char *, char *, char *, time_t, int);
 int u_sticky_mask(maskrec *, char *);
 int u_sticky_mask(maskrec *, char *);
-int u_setsticky_mask(struct chanset_t *, maskrec *, char *, bool, const char *);
+int u_setsticky_mask(struct chanset_t *, maskrec *, char *, bool, const char);
 int SplitList(char *, const char *, int *, const char ***);
 int SplitList(char *, const char *, int *, const char ***);
 int channel_modify(char *, struct chanset_t *, int, char **);
 int channel_modify(char *, struct chanset_t *, int, char **);
 int channel_add(char *, char *, char *);
 int channel_add(char *, char *, char *);
@@ -66,7 +66,7 @@ extern char		glob_chanset[], cfg_glob_chanset[];
 #define ischaninvite(chan, user) ismodeline((chan)->channel.invite, user)
 #define ischaninvite(chan, user) ismodeline((chan)->channel.invite, user)
 #define ischanmask(type, chan, user) ismodeline(type == 'b' ? (chan)->channel.ban : type == 'e' ? (chan)->channel.exempt : (chan)->channel.invite, user)
 #define ischanmask(type, chan, user) ismodeline(type == 'b' ? (chan)->channel.ban : type == 'e' ? (chan)->channel.exempt : (chan)->channel.invite, user)
 
 
-#define u_setsticky_ban(chan, host, sticky)     u_setsticky_mask(chan, ((struct chanset_t *)chan) ? ((struct chanset_t *)chan)->bans : global_bans, host, sticky, "s")
-#define u_setsticky_exempt(chan, host, sticky)  u_setsticky_mask(chan, ((struct chanset_t *)chan) ? ((struct chanset_t *)chan)->exempts : global_exempts, host, sticky, "se")
-#define u_setsticky_invite(chan, host, sticky)  u_setsticky_mask(chan, ((struct chanset_t *)chan) ? ((struct chanset_t *)chan)->invites : global_invites, host, sticky, "sInv")
+#define u_setsticky_ban(chan, host, sticky)     u_setsticky_mask(chan, ((struct chanset_t *)chan) ? ((struct chanset_t *)chan)->bans : global_bans, host, sticky, 'b')
+#define u_setsticky_exempt(chan, host, sticky)  u_setsticky_mask(chan, ((struct chanset_t *)chan) ? ((struct chanset_t *)chan)->exempts : global_exempts, host, sticky, 'e')
+#define u_setsticky_invite(chan, host, sticky)  u_setsticky_mask(chan, ((struct chanset_t *)chan) ? ((struct chanset_t *)chan)->invites : global_invites, host, sticky, 'I')
 #endif				/* _EGG_MOD_CHANNELS_CHANNELS_H */
 #endif				/* _EGG_MOD_CHANNELS_CHANNELS_H */

+ 2 - 2
src/mod/channels.mod/userchan.c

@@ -142,7 +142,7 @@ int u_sticky_mask(maskrec *u, char *uhost)
 
 
 /* Set sticky attribute for a mask.
 /* Set sticky attribute for a mask.
  */
  */
-int u_setsticky_mask(struct chanset_t *chan, maskrec *u, char *uhost, bool sticky, const char *botcmd)
+int u_setsticky_mask(struct chanset_t *chan, maskrec *u, char *uhost, bool sticky, const char type)
 {
 {
   int j;
   int j;
 
 
@@ -166,7 +166,7 @@ int u_setsticky_mask(struct chanset_t *chan, maskrec *u, char *uhost, bool stick
 	strcpy(uhost, u->mask);
 	strcpy(uhost, u->mask);
 
 
       if (!noshare)
       if (!noshare)
-        shareout("%s %s %d %s\n", botcmd, uhost, sticky, (chan) ? chan->dname : "");
+        shareout("ms %c %s %d %s\n", type, uhost, sticky, (chan) ? chan->dname : "");
       return 1;
       return 1;
     }
     }
 
 

+ 10 - 0
src/mod/irc.mod/chan.c

@@ -804,6 +804,16 @@ static void resetmasks(struct chanset_t *chan, masklist *m, maskrec *mrec, maskr
   }
   }
 }
 }
 
 
+void check_this_mask(const char type, struct chanset_t *chan, char *mask, bool sticky)
+{
+  if (type == 'b')
+    check_this_ban(chan, mask, sticky);
+  else if (type == 'e')
+    check_this_exempt(chan, mask, sticky);
+  else if (type == 'I')
+    check_this_invite(chan, mask, sticky);
+}
+
 void check_this_ban(struct chanset_t *chan, char *banmask, bool sticky)
 void check_this_ban(struct chanset_t *chan, char *banmask, bool sticky)
 {
 {
   if (!me_op(chan))
   if (!me_op(chan))

+ 1 - 0
src/mod/irc.mod/irc.h

@@ -100,6 +100,7 @@ void real_add_mode(struct chanset_t *, const char, const char, const char *, boo
 #define add_mode(chan, pls, mode, nick) real_add_mode(chan, pls, mode, nick, 0)
 #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)
 #define add_cookie(chan, nick) real_add_mode(chan, '+', 'o', nick, 1)
 bool me_op(struct chanset_t *);
 bool me_op(struct chanset_t *);
+void check_this_mask(const char, struct chanset_t *, char *, bool);
 void check_this_ban(struct chanset_t *, char *, bool);
 void check_this_ban(struct chanset_t *, char *, bool);
 void check_this_exempt(struct chanset_t *, char *, bool);
 void check_this_exempt(struct chanset_t *, char *, bool);
 void check_this_invite(struct chanset_t *, char *, bool);
 void check_this_invite(struct chanset_t *, char *, bool);

+ 27 - 107
src/mod/share.mod/share.c

@@ -253,116 +253,47 @@ check_delay()
  */
  */
 
 
 static void
 static void
-share_stick_ban(int idx, char *par)
+share_stick_mask(int idx, char *par)
 {
 {
   if (dcc[idx].status & STAT_SHARE) {
   if (dcc[idx].status & STAT_SHARE) {
+    char *types = newsplit(&par);
+    const char type = types[0];
+    const char *str_type = (type == 'b' ? "ban" : type == 'e' ? "exempt" : "invite");
     char *host = NULL, *val = NULL;
     char *host = NULL, *val = NULL;
-    bool yn;
+    bool yn = 0;
+    struct chanset_t *chan = NULL;
+    maskrec *channel_list = NULL;
 
 
     host = newsplit(&par);
     host = newsplit(&par);
     val = newsplit(&par);
     val = newsplit(&par);
     yn = atoi(val);
     yn = atoi(val);
     noshare = 1;
     noshare = 1;
-    if (!par[0]) {              /* Global ban */
-      struct chanset_t *chan = NULL;
-
-      if (u_setsticky_ban(NULL, host, yn) > 0) {
-        if (conf.bot->hub)
-          putlog(LOG_CMDS, "@", "%s: %s %s", dcc[idx].nick, (yn) ? "stick" : "unstick", host);
-        shareout_but(idx, "s %s %d\n", host, yn);
-      }
-      if (!conf.bot->hub)
-        for (chan = chanset; chan != NULL; chan = chan->next)
-          check_this_ban(chan, host, yn);
-    } else {
-      struct chanset_t *chan = findchan_by_dname(par);
-      struct chanuserrec *cr;
-
-      if ((chan != NULL) && (cr = get_chanrec(dcc[idx].user, par)))
-        if (u_setsticky_ban(chan, host, yn) > 0) {
-          if (conf.bot->hub)
-            putlog(LOG_CMDS, "@", "%s: %s %s %s", dcc[idx].nick, (yn) ? "stick" : "unstick", host, par);
-          shareout_but(idx, "s %s %d %s\n", host, yn, chan->dname);
-          noshare = 0;
-          return;
-        }
-      if (chan && !conf.bot->hub)
-        check_this_ban(chan, host, yn);
-      putlog(LOG_CMDS, "@", "Rejecting invalid sticky ban: %s on %s%s", host, par, yn ? "" : " (unstick)");
-    }
-    noshare = 0;
-  }
-}
 
 
-/* Same as share_stick_ban, only for exempts.
- */
-static void
-share_stick_exempt(int idx, char *par)
-{
-  if (dcc[idx].status & STAT_SHARE) {
-    char *host = NULL, *val = NULL;
-    bool yn;
+    if (!par[0]) {              /* Global ban */
+      channel_list = (type == 'b' ? global_bans : type == 'e' ? global_exempts : global_invites);
 
 
-    host = newsplit(&par);
-    val = newsplit(&par);
-    yn = atoi(val);
-    noshare = 1;
-    if (!par[0]) {              /* Global exempt */
-      if (u_setsticky_exempt(NULL, host, yn) > 0) {
+      if (u_setsticky_mask(NULL, channel_list, host, yn, type) > 0) {
         if (conf.bot->hub)
         if (conf.bot->hub)
-          putlog(LOG_CMDS, "@", "%s: %s %s", dcc[idx].nick, (yn) ? "stick" : "unstick", host);
-        shareout_but(idx, "se %s %d\n", host, yn);
+          putlog(LOG_CMDS, "@", "%s: %s %s %s", dcc[idx].nick, (yn) ? "stick" : "unstick", str_type, host);
+        else
+          for (chan = chanset; chan ; chan = chan->next)
+            check_this_mask(type, chan, host, yn);
+        shareout_but(idx, "ms %c %s %d\n", type, host, yn);
       }
       }
     } else {
     } else {
-      struct chanset_t *chan = findchan_by_dname(par);
-      struct chanuserrec *cr = NULL;
-
-      if ((chan != NULL) && (cr = get_chanrec(dcc[idx].user, par)))
-        if (u_setsticky_exempt(chan, host, yn) > 0) {
+      if ((chan = findchan_by_dname(par))) {
+          channel_list = (type == 'b' ? chan->bans : type == 'e' ? chan->exempts : chan->invites);
+        if (u_setsticky_mask(chan, channel_list, host, yn, type) > 0) {
           if (conf.bot->hub)
           if (conf.bot->hub)
-            putlog(LOG_CMDS, "@", "%s: stick %s %c %s", dcc[idx].nick, host, yn ? 'y' : 'n', par);
-          shareout_but(idx, "se %s %d %s\n", host, yn, chan->dname);
+            putlog(LOG_CMDS, "@", "%s: %s %s %s %s", dcc[idx].nick, (yn) ? "stick" : "unstick", str_type, host, par);
+          else
+            check_this_mask(type, chan, host, yn);
+          shareout_but(idx, "ms %c %s %d %s\n", type, host, yn, chan->dname);
           noshare = 0;
           noshare = 0;
           return;
           return;
         }
         }
-      putlog(LOG_CMDS, "@", "Rejecting invalid sticky exempt: %s on %s, %c", host, par, yn ? 'y' : 'n');
-    }
-    noshare = 0;
-  }
-}
-
-/* Same as share_stick_ban, only for invites.
- */
-static void
-share_stick_invite(int idx, char *par)
-{
-  if (dcc[idx].status & STAT_SHARE) {
-    char *host = NULL, *val = NULL;
-    bool yn;
-
-    host = newsplit(&par);
-    val = newsplit(&par);
-    yn = atoi(val);
-    noshare = 1;
-    if (!par[0]) {              /* Global invite */
-      if (u_setsticky_invite(NULL, host, yn) > 0) {
-        if (conf.bot->hub)
-          putlog(LOG_CMDS, "@", "%s: %s %s", dcc[idx].nick, (yn) ? "stick" : "unstick", host);
-        shareout_but(idx, "sInv %s %d\n", host, yn);
       }
       }
-    } else {
-      struct chanset_t *chan = findchan_by_dname(par);
-      struct chanuserrec *cr = NULL;
-
-      if ((chan != NULL) && (cr = get_chanrec(dcc[idx].user, par)))
-        if (u_setsticky_invite(chan, host, yn) > 0) {
-          if (conf.bot->hub)
-            putlog(LOG_CMDS, "@", "%s: %s %s %s", dcc[idx].nick, (yn) ? "stick" : "unstick", host, par);
-          shareout_but(idx, "sInv %s %d %s\n", host, yn, chan->dname);
-          noshare = 0;
-          return;
-        }
-      putlog(LOG_CMDS, "@", "Rejecting invalid sticky invite: %s on %s%s", host, par, yn ? "" : " (unstick)");
+      putlog(LOG_CMDS, "@", "Rejecting invalid sticky %s: %s on %s%s", host, par, yn ? "" : " (unstick)", str_type);
     }
     }
     noshare = 0;
     noshare = 0;
   }
   }
@@ -787,12 +718,8 @@ static void share_pls_mask(int idx, char *par)
     if (conf.bot->hub)
     if (conf.bot->hub)
       putlog(LOG_CMDS, "@", "%s: global %s %s (%s:%s)", dcc[idx].nick, str_type, mask, from, par);
       putlog(LOG_CMDS, "@", "%s: global %s %s (%s:%s)", dcc[idx].nick, str_type, mask, from, par);
     else {
     else {
-      void (*check_this_mask) (struct chanset_t *, char *, bool) = NULL;
-
-      check_this_mask = (type == 'b' ? check_this_ban : type == 'e' ? check_this_exempt : check_this_invite);
-
       for (struct chanset_t *chan = chanset; chan != NULL; chan = chan->next)
       for (struct chanset_t *chan = chanset; chan != NULL; chan = chan->next)
-        check_this_mask(chan, mask, stick);
+        check_this_mask(type, chan, mask, stick);
     }
     }
   }
   }
 }
 }
@@ -832,13 +759,8 @@ static void share_pls_maskchan(int idx, char *par)
       expire_time += now;
       expire_time += now;
     u_addmask(type, chan, mask, from, par, expire_time, flags);
     u_addmask(type, chan, mask, from, par, expire_time, flags);
     noshare = 0;
     noshare = 0;
-    if (!conf.bot->hub) {
-      void (*check_this_mask) (struct chanset_t *, char *, bool) = NULL;
-
-      check_this_mask = (type == 'b' ? check_this_ban : type == 'e' ? check_this_exempt : check_this_invite);
-
-      check_this_mask(chan, mask, stick);
-    }
+    if (!conf.bot->hub)
+      check_this_mask(type, chan, mask, stick);
   }
   }
 }
 }
 
 
@@ -1071,10 +993,8 @@ static botcmd_t C_share[] = {
   {"e", share_end, 0},
   {"e", share_end, 0},
   {"h", share_chhand, 0},
   {"h", share_chhand, 0},
   {"k", share_killuser, 0},
   {"k", share_killuser, 0},
+  {"ms", share_stick_mask, 0},
   {"n", share_newuser, 0},
   {"n", share_newuser, 0},
-  {"s", share_stick_ban, 0},
-  {"se", share_stick_exempt, 0},
-  {"sInv", share_stick_invite, 0},
   {"u?", share_userfileq, 0},
   {"u?", share_userfileq, 0},
   {"un", share_ufno, HUB},
   {"un", share_ufno, HUB},
   {"us", share_ufsend, 0},
   {"us", share_ufsend, 0},