]> jfr.im git - solanum.git/blobdiff - modules/core/m_join.c
m_info: Correct description of general::client_exit like in example confs.
[solanum.git] / modules / core / m_join.c
index f5edea2302f1755fe9c3502dfb1d2c077617aa4f..bba9eaf141ced267857c408ad721fb5be08f2a3b 100644 (file)
@@ -41,6 +41,7 @@
 #include "modules.h"
 #include "packet.h"
 #include "chmode.h"
+#include "ratelimit.h"
 
 static int m_join(struct Client *, struct Client *, int, const char **);
 static int ms_join(struct Client *, struct Client *, int, const char **);
@@ -92,7 +93,7 @@ check_forward(struct Client *source_p, struct Channel *chptr,
             char *key, int *err)
 {
        int depth = 0, i;
-       char *next = NULL;
+       const char *next = NULL;
 
        /* The caller (m_join) is only interested in the reason
         * for the original channel.
@@ -106,6 +107,8 @@ check_forward(struct Client *source_p, struct Channel *chptr,
 
        while (depth < 16)
        {
+               if (next == NULL)
+                       return NULL;
                chptr = find_channel(next);
                /* Can only forward to existing channels */
                if (chptr == NULL)
@@ -122,8 +125,6 @@ check_forward(struct Client *source_p, struct Channel *chptr,
                i = can_join(source_p, chptr, key, &next);
                if (i == 0)
                        return chptr;
-               if (next == NULL)
-                       return NULL;
                depth++;
        }
 
@@ -255,8 +256,10 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
 
                        if(moduledata.approved != 0)
                        {
+#ifdef XXX_NOTYET
                                sendto_one(source_p, form_str(moduledata.approved),
                                           me.name, source_p->name, name);
+#endif
                                continue;
                        }
 
@@ -301,9 +304,10 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
                         * see extensions/chm_operonly.c for other comments on this
                         * -- dwr
                         */
+#ifdef XXX_NOTYET
                        if(i != ERR_CUSTOM)
                                sendto_one(source_p, form_str(i), me.name, source_p->name, name);
-
+#endif
                        continue;
                }
                else if(chptr != chptr2)
@@ -325,6 +329,9 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
                }
                chptr->join_count++;
 
+               /* credit user for join */
+               credit_client_join(source_p);
+
                /* we send the user their join here, because we could have to
                 * send a mode out next.
                 */
@@ -363,7 +370,8 @@ m_join(struct Client *client_p, struct Client *source_p, int parc, const char *p
 
                        sendto_one(source_p, form_str(RPL_TOPICWHOTIME),
                                   me.name, source_p->name, chptr->chname,
-                                  chptr->topic_info, chptr->topic_time);
+                                  chptr->topic_info,
+                                  (unsigned long)chptr->topic_time);
                }
 
                channel_member_names(chptr, source_p, 1);
@@ -393,7 +401,6 @@ ms_join(struct Client *client_p, struct Client *source_p, int parc, const char *
        time_t newts;
        int isnew;
        int keep_our_modes = YES;
-       int keep_new_modes = YES;
        rb_dlink_node *ptr, *next_ptr;
 
        /* special case for join 0 */
@@ -455,8 +462,6 @@ ms_join(struct Client *client_p, struct Client *source_p, int parc, const char *
                keep_our_modes = NO;
                chptr->channelts = newts;
        }
-       else
-               keep_new_modes = NO;
 
        /* Lost the TS, other side wins, so remove modes on this side */
        if(!keep_our_modes)
@@ -1267,7 +1272,8 @@ remove_ban_list(struct Channel *chptr, struct Client *source_p,
                banptr = ptr->data;
 
                /* trailing space, and the mode letter itself */
-               plen = strlen(banptr->banstr) + 2;
+               plen = strlen(banptr->banstr) +
+                       (banptr->forward ? strlen(banptr->forward) + 1 : 0) + 2;
 
                if(count >= MAXMODEPARAMS || (cur_len + plen) > BUFSIZE - 4)
                {
@@ -1285,7 +1291,10 @@ remove_ban_list(struct Channel *chptr, struct Client *source_p,
 
                *mbuf++ = c;
                cur_len += plen;
-               pbuf += rb_sprintf(pbuf, "%s ", banptr->banstr);
+               if (banptr->forward)
+                       pbuf += rb_sprintf(pbuf, "%s$%s ", banptr->banstr, banptr->forward);
+               else
+                       pbuf += rb_sprintf(pbuf, "%s ", banptr->banstr);
                count++;
 
                free_ban(banptr);