]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - modules/core/m_join.c
Add chmode +D, which blocks CTCP ACTION.
[irc/rqf/shadowircd.git] / modules / core / m_join.c
index b72f8303e75be2c892cdc473121276685f0bac6b..c01aba7791bc42182a780852464e906cd461ab21 100644 (file)
@@ -125,7 +125,6 @@ check_forward(struct Client *source_p, struct Channel *chptr,
 
 /*
  * m_join
- *      parv[0] = sender prefix
  *      parv[1] = channel
  *      parv[2] = channel password (key)
  */
@@ -142,7 +141,6 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
        char *p = NULL, *p2 = NULL;
        char *chanlist;
        char *mykey;
-       int successful_join_count = 0;  /* Number of channels successfully joined */
 
        jbuf[0] = '\0';
 
@@ -273,14 +271,9 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
                {
                        sendto_one(source_p, form_str(ERR_TOOMANYCHANNELS),
                                   me.name, source_p->name, name);
-                       if(successful_join_count)
-                               source_p->localClient->last_join_time = rb_current_time();
                        return 0;
                }
 
-               if(flags == 0)  /* if channel doesn't exist, don't penalize */
-                       successful_join_count++;
-
                if(chptr == NULL)       /* If I already have a chptr, no point doing this */
                {
                        chptr = get_or_create_channel(source_p, name, NULL);
@@ -289,15 +282,10 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
                        {
                                sendto_one(source_p, form_str(ERR_UNAVAILRESOURCE),
                                           me.name, source_p->name, name);
-                               if(successful_join_count > 0)
-                                       successful_join_count--;
                                continue;
                        }
                }
 
-               if(!IsOper(source_p) && !IsExemptSpambot(source_p))
-                       check_spambot_warning(source_p, name);
-
                /* can_join checks for +i key, bans etc */
                if((i = can_join(source_p, chptr, key)))
                {
@@ -311,14 +299,16 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
                                if(i != ERR_CUSTOM)
                                        sendto_one(source_p, form_str(i), me.name, source_p->name, name);
 
-                               if(successful_join_count > 0)
-                                       successful_join_count--;
                                continue;
                        }
 
                        sendto_one_numeric(source_p, ERR_LINKCHANNEL, form_str(ERR_LINKCHANNEL), name, chptr->chname);
                }
 
+               if(flags == 0 &&
+                               !IsOper(source_p) && !IsExemptSpambot(source_p))
+                       check_spambot_warning(source_p, name);
+
                /* add the user to the channel */
                add_user_to_channel(chptr, source_p, flags);
                if (chptr->mode.join_num &&
@@ -374,9 +364,6 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
 
                channel_member_names(chptr, source_p, 1);
 
-               if(successful_join_count)
-                       source_p->localClient->last_join_time = rb_current_time();
-
                hook_info.client = source_p;
                hook_info.chptr = chptr;
                hook_info.key = key;
@@ -388,7 +375,6 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
 
 /*
  * ms_join
- *      parv[0] = sender prefix
  *      parv[1] = channel TS
  *      parv[2] = channel
  *      parv[3] = "+", formerly channel modes but now unused
@@ -766,9 +752,6 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
        else
                modes = empty_modes;
 
-       /* working on the presumption eventually itll be more efficient to
-        * build a TS6 buffer without checking its needed..
-        */
        mlen_uid = rb_sprintf(buf_uid, ":%s SJOIN %ld %s %s :",
                              use_id(source_p), (long) chptr->channelts, parv[2], modes);
        ptr_uid = buf_uid + mlen_uid;
@@ -961,8 +944,6 @@ ms_sjoin(struct Client *client_p, struct Client *source_p, int parc, const char
  * output      - NONE
  * side effects        - Use has decided to join 0. This is legacy
  *               from the days when channels were numbers not names. *sigh*
- *               There is a bunch of evilness necessary here due to
- *               anti spambot code.
  */
 static void
 do_join_0(struct Client *client_p, struct Client *source_p)
@@ -977,12 +958,12 @@ do_join_0(struct Client *client_p, struct Client *source_p)
 
        sendto_server(client_p, NULL, CAP_TS6, NOCAPS, ":%s JOIN 0", use_id(source_p));
 
-       if(source_p->user->channel.head && MyConnect(source_p) &&
-          !IsOper(source_p) && !IsExemptSpambot(source_p))
-               check_spambot_warning(source_p, NULL);
-
        while((ptr = source_p->user->channel.head))
        {
+               if(MyConnect(source_p) &&
+                  !IsOper(source_p) && !IsExemptSpambot(source_p))
+                       check_spambot_warning(source_p, NULL);
+
                msptr = ptr->data;
                chptr = msptr->chptr;
                sendto_channel_local(ALL_MEMBERS, chptr, ":%s!%s@%s PART %s",
@@ -995,27 +976,36 @@ do_join_0(struct Client *client_p, struct Client *source_p)
 static int
 check_channel_name_loc(struct Client *source_p, const char *name)
 {
+       const char *p;
+
        s_assert(name != NULL);
        if(EmptyString(name))
                return 0;
 
        if(ConfigFileEntry.disable_fake_channels && !IsOper(source_p))
        {
-               for(; *name; ++name)
+               for(p = name; *p; ++p)
                {
-                       if(!IsChanChar(*name) || IsFakeChanChar(*name))
+                       if(!IsChanChar(*p) || IsFakeChanChar(*p))
                                return 0;
                }
        }
        else
        {
-               for(; *name; ++name)
+               for(p = name; *p; ++p)
                {
-                       if(!IsChanChar(*name))
+                       if(!IsChanChar(*p))
                                return 0;
                }
        }
 
+       if(ConfigChannel.only_ascii_channels)
+       {
+               for(p = name; *p; ++p)
+                       if(*p < 33 || *p > 126)
+                               return 0;
+       }
+
        return 1;
 }