]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - modules/core/m_join.c
Applied svn diff from ratbox3 r21458:21470
[irc/rqf/shadowircd.git] / modules / core / m_join.c
index 23f0fef77e93b4c51e107d20500b323cc77ab08c..911439beb7bd6ff01950ed917369b593b57edb9d 100644 (file)
@@ -55,7 +55,7 @@ struct Message join_msgtab = {
 
 struct Message sjoin_msgtab = {
        "SJOIN", 0, 0, 0, MFLG_SLOW,
-       {mg_unreg, mg_ignore, mg_ignore, {ms_sjoin, 0}, mg_ignore, mg_ignore}
+       {mg_unreg, mg_ignore, mg_ignore, {ms_sjoin, 4}, mg_ignore, mg_ignore}
 };
 
 mapi_clist_av1 join_clist[] = { &join_msgtab, &sjoin_msgtab, NULL };
@@ -75,7 +75,7 @@ static void set_final_mode(struct Mode *mode, struct Mode *oldmode);
 static void remove_our_modes(struct Channel *chptr, struct Client *source_p);
 
 static void remove_ban_list(struct Channel *chptr, struct Client *source_p,
-                           rb_dlink_list * list, char c, int cap, int mems);
+                           rb_dlink_list * list, char c, int mems);
 
 static char modebuf[MODEBUFLEN];
 static char parabuf[MODEBUFLEN];
@@ -528,7 +528,7 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
        int keep_new_modes = 1;
        int fl;
        int isnew;
-       int mlen_nick, mlen_uid;
+       int mlen_uid;
        int len_nick;
        int len_uid;
        int len;
@@ -564,48 +564,6 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
        {
                switch (*(s++))
                {
-               case 'i':
-                       mode.mode |= MODE_INVITEONLY;
-                       break;
-               case 'n':
-                       mode.mode |= MODE_NOPRIVMSGS;
-                       break;
-               case 'p':
-                       mode.mode |= MODE_PRIVATE;
-                       break;
-               case 's':
-                       mode.mode |= MODE_SECRET;
-                       break;
-               case 'm':
-                       mode.mode |= MODE_MODERATED;
-                       break;
-               case 't':
-                       mode.mode |= MODE_TOPICLIMIT;
-                       break;
-               case 'r':
-                       mode.mode |= MODE_REGONLY;
-                       break;
-               case 'L':
-                       mode.mode |= MODE_EXLIMIT;
-                       break;
-               case 'P':
-                       mode.mode |= MODE_PERMANENT;
-                       break;
-               case 'c':
-                       mode.mode |= MODE_NOCOLOR;
-                       break;
-               case 'g':
-                       mode.mode |= MODE_FREEINVITE;
-                       break;
-               case 'z':
-                       mode.mode |= MODE_OPMODERATE;
-                       break;
-               case 'F':
-                       mode.mode |= MODE_FREETARGET;
-                       break;
-               case 'Q':
-                       mode.mode |= MODE_DISFORWARD;
-                       break;
                case 'f':
                        rb_strlcpy(mode.forward, parv[4 + args], sizeof(mode.forward));
                        args++;
@@ -632,6 +590,11 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
                        if(parc < 5 + args)
                                return 0;
                        break;
+               default:
+                       if(chmode_flags[(int) *s] != 0)
+                       {
+                               mode.mode |= chmode_flags[(int) *s];
+                       }
                }
        }
 
@@ -697,10 +660,6 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
                        struct membership *msptr;
                        struct Client *who;
                        int l = rb_dlink_list_length(&chptr->members);
-                       int b = rb_dlink_list_length(&chptr->banlist) +
-                               rb_dlink_list_length(&chptr->exceptlist) +
-                               rb_dlink_list_length(&chptr->invexlist) +
-                               rb_dlink_list_length(&chptr->quietlist);
 
                        RB_DLINK_FOREACH_SAFE(ptr, next_ptr, chptr->locmembers.head)
                        {
@@ -723,14 +682,6 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
                                if((chptr = get_or_create_channel(source_p, parv[2], &isnew)) == NULL)
                                        return 0;               /* oops! */
 
-                               /* If the source does not do TS6,
-                                * nontimestamped bans have been sent to it,
-                                * but we have just lost those here. Let's
-                                * warn the channel about this. Because
-                                * of the kicks, any users on the channel
-                                * will be at client_p. -- jilles */
-                               if (!has_id(source_p) && b > 0)
-                                       sendto_one(client_p, ":%s NOTICE %s :*** Notice -- possible ban desync on %s, please remove any bans just added by servers", get_id(&me, client_p), parv[2], parv[2]);
                                oldmode = &chptr->mode;
                        }
                }
@@ -777,6 +728,20 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
                {
                        del_invite(chptr, ptr->data);
                }
+
+               if(rb_dlink_list_length(&chptr->banlist) > 0)
+                       remove_ban_list(chptr, fakesource_p, &chptr->banlist, 'b', ALL_MEMBERS);
+               if(rb_dlink_list_length(&chptr->exceptlist) > 0)
+                       remove_ban_list(chptr, fakesource_p, &chptr->exceptlist,
+                                       'e', ONLY_CHANOPS);
+               if(rb_dlink_list_length(&chptr->invexlist) > 0)
+                       remove_ban_list(chptr, fakesource_p, &chptr->invexlist,
+                                       'I', ONLY_CHANOPS);
+               if(rb_dlink_list_length(&chptr->quietlist) > 0)
+                       remove_ban_list(chptr, fakesource_p, &chptr->quietlist,
+                                       'q', ALL_MEMBERS);
+               chptr->bants++;
+
                sendto_channel_local(ALL_MEMBERS, chptr,
                                     ":%s NOTICE %s :*** Notice -- TS for %s changed from %ld to %ld",
                                     me.name, chptr->chname, chptr->chname,
@@ -982,30 +947,6 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
 
        sendto_server(client_p->from, NULL, CAP_TS6, NOCAPS, "%s", buf_uid);
 
-       /* if the source does TS6 we have to remove our bans.  Its now safe
-        * to issue -b's to the non-ts6 servers, as the sjoin we've just
-        * sent will kill any ops they have.
-        */
-       if(!keep_our_modes && source_p->id[0] != '\0')
-       {
-               if(rb_dlink_list_length(&chptr->banlist) > 0)
-                       remove_ban_list(chptr, fakesource_p, &chptr->banlist, 'b', NOCAPS, ALL_MEMBERS);
-
-               if(rb_dlink_list_length(&chptr->exceptlist) > 0)
-                       remove_ban_list(chptr, fakesource_p, &chptr->exceptlist,
-                                       'e', CAP_EX, ONLY_CHANOPS);
-
-               if(rb_dlink_list_length(&chptr->invexlist) > 0)
-                       remove_ban_list(chptr, fakesource_p, &chptr->invexlist,
-                                       'I', CAP_IE, ONLY_CHANOPS);
-
-               if(rb_dlink_list_length(&chptr->quietlist) > 0)
-                       remove_ban_list(chptr, fakesource_p, &chptr->quietlist,
-                                       'q', NOCAPS, ALL_MEMBERS);
-
-               chptr->bants++;
-       }
-
        return 0;
 }
 
@@ -1083,30 +1024,30 @@ set_final_mode(struct Mode *mode, struct Mode *oldmode)
        int i;
 
        /* ok, first get a list of modes we need to add */
-       for (i = 0; chmode_flags[i].letter; i++)
+       for (i = 0; i < 256; i++)
        {
-               if((mode->mode & chmode_flags[i].mode) && !(oldmode->mode & chmode_flags[i].mode))
+               if((mode->mode & chmode_flags[i]) && !(oldmode->mode & chmode_flags[i]))
                {
                        if(dir != MODE_ADD)
                        {
                                *mbuf++ = '+';
                                dir = MODE_ADD;
                        }
-                       *mbuf++ = chmode_flags[i].letter;
+                       *mbuf++ = i;
                }
        }
 
        /* now the ones we need to remove. */
-       for (i = 0; chmode_flags[i].letter; i++)
+       for (i = 0; i < 256; i++)
        {
-               if((oldmode->mode & chmode_flags[i].mode) && !(mode->mode & chmode_flags[i].mode))
+               if((oldmode->mode & chmode_flags[i]) && !(mode->mode & chmode_flags[i]))
                {
                        if(dir != MODE_DEL)
                        {
                                *mbuf++ = '-';
                                dir = MODE_DEL;
                        }
-                       *mbuf++ = chmode_flags[i].letter;
+                       *mbuf++ = i;
                }
        }
 
@@ -1298,11 +1239,10 @@ remove_our_modes(struct Channel *chptr, struct Client *source_p)
  * inputs      - channel, source, list to remove, char of mode, caps needed
  * outputs     -
  * side effects - given list is removed, with modes issued to local clients
- *               and non-TS6 servers.
  */
 static void
 remove_ban_list(struct Channel *chptr, struct Client *source_p,
-               rb_dlink_list * list, char c, int cap, int mems)
+               rb_dlink_list * list, char c, int mems)
 {
        static char lmodebuf[BUFSIZE];
        static char lparabuf[BUFSIZE];
@@ -1332,11 +1272,6 @@ remove_ban_list(struct Channel *chptr, struct Client *source_p,
                        *(pbuf - 1) = '\0';
 
                        sendto_channel_local(mems, chptr, "%s %s", lmodebuf, lparabuf);
-                       /* Tricky tricky. If we changed source_p to &me
-                        * in ms_sjoin(), this still won't send stuff
-                        * where it should not be sent, because the
-                        * real source_p does TS6 -- jilles */
-                       sendto_server(source_p, chptr, cap, CAP_TS6, "%s %s", lmodebuf, lparabuf);
 
                        cur_len = mlen;
                        mbuf = lmodebuf + mlen;
@@ -1355,7 +1290,6 @@ remove_ban_list(struct Channel *chptr, struct Client *source_p,
        *mbuf = '\0';
        *(pbuf - 1) = '\0';
        sendto_channel_local(mems, chptr, "%s %s", lmodebuf, lparabuf);
-       sendto_server(source_p, chptr, cap, CAP_TS6, "%s %s", lmodebuf, lparabuf);
 
        list->head = list->tail = NULL;
        list->length = 0;