Procházet zdrojové kódy

Move global role to chanset_t.role

Bryan Drewery před 12 roky
rodič
revize
4880133149

+ 3 - 0
src/chan.h

@@ -263,6 +263,9 @@ struct chanset_t {
 
   // List of bots for each role
   bd::HashTable<short, bd::Array<bd::String> > *role_bots;
+
+  // My role bitmask
+  int role;
 };
 
 /* behavior modes for the channel */

+ 8 - 2
src/cmds.c

@@ -2108,6 +2108,7 @@ static void cmd_suicide(int idx, char *par)
 static void cmd_debug(int idx, char *par)
 {
   char *cmd = NULL;
+  struct chanset_t* chan = NULL;
 
   if (!par[0]) 
     putlog(LOG_CMDS, "*", "#%s# debug", dcc[idx].nick);
@@ -2118,8 +2119,13 @@ static void cmd_debug(int idx, char *par)
     dprintf(idx, "Timesync: %li (%li)\n", (long) (now + timesync), (long)timesync);
   if (!cmd || (cmd && !strcmp(cmd, "now")))
     dprintf(idx, "Now: %li\n", (long)now);
-  if (!cmd || (cmd && !strcmp(cmd, "role")))
-    dprintf(idx, "Role: %d\n", role);
+  if (!cmd || (cmd && !strcmp(cmd, "role"))) {
+    for (chan = chanset; chan; chan = chan->next) {
+      if (chan->role) {
+        dprintf(idx, "Role: %20s: %d\n", chan->dname, chan->role);
+      }
+    }
+  }
   if (!cmd || (cmd && !strcmp(cmd, "net")))
     tell_netdebug(idx);
   if (!cmd || (cmd && !strcmp(cmd, "dns")))

+ 4 - 5
src/flags.c

@@ -37,7 +37,6 @@
 #include "chanprog.h"
 
 flag_t FLAG[128];
-int role;
 
 struct rolecount role_counts[] = {
   {"voice",	ROLE_VOICE,	1},
@@ -505,7 +504,7 @@ doresolv(const struct chanset_t *chan)
   if (!chan)
     return 0;
 
-  if (role & ROLE_RESOLV)
+  if (chan->role & ROLE_RESOLV)
     return 1;
 
   struct flag_record fr = { FR_GLOBAL | FR_CHAN | FR_BOT, 0, 0, 0 };
@@ -522,7 +521,7 @@ dovoice(const struct chanset_t *chan)
   if (!chan)
     return 0;
 
-  if (role & ROLE_VOICE)
+  if (chan->role & ROLE_VOICE)
     return 1;
 
   struct flag_record fr = { FR_GLOBAL | FR_CHAN | FR_BOT, 0, 0, 0 };
@@ -536,7 +535,7 @@ dovoice(const struct chanset_t *chan)
 int
 doflood(const struct chanset_t *chan)
 {
-  if (role & ROLE_FLOOD)
+  if (chan->role & ROLE_FLOOD)
     return 1;
 
   struct flag_record fr = { FR_GLOBAL | FR_CHAN | FR_BOT, 0, 0, 0 };
@@ -555,7 +554,7 @@ dolimit(const struct chanset_t *chan)
   if (!chan)
     return 0;
 
-  if (role & ROLE_LIMIT)
+  if (chan->role & ROLE_LIMIT)
     return 1;
 
   struct flag_record fr = { FR_GLOBAL | FR_CHAN | FR_BOT, 0, 0, 0 };

+ 0 - 1
src/flags.h

@@ -16,7 +16,6 @@
 typedef uint64_t flag_t;
 
 extern flag_t FLAG[128];
-extern int role;
 
 struct flag_record {
   flag_t match;

+ 7 - 0
src/mod/channels.mod/channels.c

@@ -292,7 +292,14 @@ static void got_down(char *botnick, char *code, char *par)
 
 static void got_role(char *botnick, char *code, char *par)
 {
+  struct chanset_t* chan = NULL;
+  int role;
+
   role = atoi(newsplit(&par));
+
+  for (chan = chanset; chan; chan = chan->next) {
+    chan->role = role;
+  }
   putlog(LOG_DEBUG, "@", "Got role index %d", role);
 }
 

+ 3 - 3
src/mod/irc.mod/chan.c

@@ -892,12 +892,12 @@ static void refresh_ban_kick(struct chanset_t* chan, memberlist *m, const char *
   for (int cycle = 0; cycle < 2; cycle++) {
     for (register maskrec* b = cycle ? chan->bans : global_bans; b; b = b->next) {
       if (wild_match(b->mask, user) || match_cidr(b->mask, user)) {
-        if ((role & ROLE_DEOP) && chan_hasop(m))
+        if ((chan->role & ROLE_DEOP) && chan_hasop(m))
   	  add_mode(chan, '-', 'o', m->nick);	/* Guess it can't hurt.	*/
 	check_exemptlist(chan, user);
 	do_mask(chan, chan->channel.ban, b->mask, 'b');
 	b->lastactive = now;
-        if (role & ROLE_KICK) {
+        if (chan->role & ROLE_KICK) {
           char c[512] = "";		/* The ban comment.	*/
 
           if (b->desc && b->desc[0] != '@')
@@ -3004,7 +3004,7 @@ static int gotkick(char *from, char *origmsg)
     if (mv->user) {
       // Revenge kick clients that kick our bots
       if (chan->revenge && !mv->is_me && m && m != mv && mv->user->bot && !(m->user && m->user->bot)) {
-        if ((role & ROLE_REVENGE) && !chan_sentkick(m) && me_op(chan)) {
+        if ((chan->role & ROLE_REVENGE) && !chan_sentkick(m) && me_op(chan)) {
           m->flags |= SENTKICK;
           dprintf(DP_MODE_NEXT, "KICK %s %s :%s%s\r\n", chan->name, m->nick, kickprefix, response(RES_REVENGE));
         } else {

+ 1 - 1
src/mod/irc.mod/irc.c

@@ -1619,7 +1619,7 @@ check_expired_chanstuff(struct chanset_t *chan)
       request_op(chan);
     }
 
-    if (role & ROLE_CHANMODE) {
+    if (chan->role & ROLE_CHANMODE) {
       recheck_channel_modes(chan);
     }
   }

+ 8 - 8
src/mod/irc.mod/mode.c

@@ -678,7 +678,7 @@ got_deop(struct chanset_t *chan, memberlist *m, memberlist *mv, char *isserver)
            */
           (reversing && (!chan_bitch(chan) || chk_op(victim, chan))) ||
           /* Reop bots to avoid them needing to ask */
-          ((role & ROLE_PROTECT) && mv->user && mv->user->bot && chk_op(victim, chan))
+          ((chan->role & ROLE_PROTECT) && mv->user && mv->user->bot && chk_op(victim, chan))
         )
        ) {
       /* Then we'll bless the victim */
@@ -716,7 +716,7 @@ got_deop(struct chanset_t *chan, memberlist *m, memberlist *mv, char *isserver)
   } else {
     // Revenge kick clients that deop our bots
     if (chan->revenge && m && m != mv && mv->user && mv->user->bot && !(m->user && m->user->bot)) {
-      if ((role & ROLE_REVENGE) && !chan_sentkick(m) && me_op(chan)) {
+      if ((chan->role & ROLE_REVENGE) && !chan_sentkick(m) && me_op(chan)) {
         m->flags |= SENTKICK;
         dprintf(DP_MODE_NEXT, "KICK %s %s :%s%s\r\n", chan->name, m->nick, kickprefix, response(RES_REVENGE));
       } else {
@@ -763,7 +763,7 @@ got_ban(struct chanset_t *chan, memberlist *m, char *mask, char *isserver)
 
   // Revenge kick clients that ban our bots
   if (chan->revenge && m && matched_bot && !(m->user && m->user->bot)) {
-    if ((role & ROLE_REVENGE) && !chan_sentkick(m)) {
+    if ((chan->role & ROLE_REVENGE) && !chan_sentkick(m)) {
       m->flags |= SENTKICK;
       dprintf(DP_MODE_NEXT, "KICK %s %s :%s%s\r\n", chan->name, m->nick, kickprefix, response(RES_REVENGE));
     } else {
@@ -1137,10 +1137,10 @@ gotmode(char *from, char *msg)
       if (me_op(chan)) {
         char tmp[1024] = "";
 
-        if (!isserver[0] && role && (!u || (u && !u->bot))) {
+        if (!isserver[0] && chan->role && (!u || (u && !u->bot))) {
           if (m && deops >= 3) {
             if (chan->mdop) {
-              if ((role & ROLE_PROTECT) && !chan_sentkick(m)) {
+              if ((chan->role & ROLE_PROTECT) && !chan_sentkick(m)) {
                 m->flags |= SENTKICK;
                 const size_t len = simple_snprintf(tmp, sizeof(tmp), "KICK %s %s :%s%s\r\n", chan->name, m->nick, kickprefix, response(RES_MASSDEOP));
                 dprintf_real(DP_MODE_NEXT, tmp, len, sizeof(tmp));
@@ -1160,7 +1160,7 @@ gotmode(char *from, char *msg)
           if (ops >= 3) {
             if (chan->mop) {
               if (m && !chan_sentkick(m)) {
-                if ((role & ROLE_PROTECT)) {
+                if ((chan->role & ROLE_PROTECT)) {
                   m->flags |= SENTKICK;
                   const size_t len = simple_snprintf(tmp, sizeof(tmp), "KICK %s %s :%s%s\r\n", chan->name, m->nick, kickprefix, response(RES_MANUALOP));
                   dprintf_real(DP_MODE_NEXT, tmp, len, sizeof(tmp));
@@ -1260,7 +1260,7 @@ gotmode(char *from, char *msg)
           /* manop */
 	  if (chan->manop && u && !u->bot) {
 
-	    if (m && (role & ROLE_PROTECT)) {
+	    if (m && (chan->role & ROLE_PROTECT)) {
 	      /* Kick opper */
 	      if (!chan_sentkick(m)) {
 		const size_t len = simple_snprintf(tmp, sizeof(tmp), "KICK %s %s :%s%s\r\n", chan->name, m->nick, kickprefix, response(RES_MANUALOP));
@@ -1271,7 +1271,7 @@ gotmode(char *from, char *msg)
 	      deflag_user(u, DEFLAG_EVENT_MANUALOP, tmp, chan);
 	    }
 
-	    if (role & ROLE_KICK) {
+	    if (chan->role & ROLE_KICK) {
 	      for (i = 0; i < modecnt; i++) {
 		if (msign == '+' && mmode == 'o' && !match_my_nick(mparam)) {
 		  mv = ismember(chan, mparam);