]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - src/channel.c
[svn] Merge old trunk r2065,r2067:
[irc/rqf/shadowircd.git] / src / channel.c
index 51f554860d613f26f588db63b6af439b78449de7..5bcf29e2a40b8855776e679241cafe5db0d495b2 100644 (file)
@@ -21,7 +21,7 @@
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
  *  USA
  *
- *  $Id: channel.c 3131 2007-01-21 15:36:31Z jilles $
+ *  $Id: channel.c 3432 2007-04-26 23:01:16Z jilles $
  */
 
 #include "stdinc.h"
@@ -716,13 +716,14 @@ is_quieted(struct Channel *chptr, struct Client *who, struct membership *msptr,
 int
 can_join(struct Client *source_p, struct Channel *chptr, char *key)
 {
-       dlink_node *lp;
+       dlink_node *invite = NULL;
        dlink_node *ptr;
        struct Ban *invex = NULL;
        char src_host[NICKLEN + USERLEN + HOSTLEN + 6];
        char src_iphost[NICKLEN + USERLEN + HOSTLEN + 6];
        char src_althost[NICKLEN + USERLEN + HOSTLEN + 6];
        int use_althost = 0;
+       int i = 0;
        hook_data_channel moduledata;
 
        s_assert(source_p->localClient != NULL);
@@ -751,12 +752,12 @@ can_join(struct Client *source_p, struct Channel *chptr, char *key)
 
        if(chptr->mode.mode & MODE_INVITEONLY)
        {
-               DLINK_FOREACH(lp, source_p->user->invited.head)
+               DLINK_FOREACH(invite, source_p->user->invited.head)
                {
-                       if(lp->data == chptr)
+                       if(invite->data == chptr)
                                break;
                }
-               if(lp == NULL)
+               if(invite == NULL)
                {
                        if(!ConfigChannel.use_invex)
                                return (ERR_INVITEONLYCHAN);
@@ -780,18 +781,28 @@ can_join(struct Client *source_p, struct Channel *chptr, char *key)
 
        if(chptr->mode.limit &&
           dlink_list_length(&chptr->members) >= (unsigned long) chptr->mode.limit)
-               return (ERR_CHANNELISFULL);
-
+               i = ERR_CHANNELISFULL;
        if(chptr->mode.mode & MODE_REGONLY && EmptyString(source_p->user->suser))
-               return ERR_NEEDREGGEDNICK;
-
+               i = ERR_NEEDREGGEDNICK;
        /* join throttling stuff --nenolod */
-       if(chptr->mode.join_num > 0 && chptr->mode.join_time > 0)
+       else if(chptr->mode.join_num > 0 && chptr->mode.join_time > 0)
        {
                if ((CurrentTime - chptr->join_delta <= 
                        chptr->mode.join_time) && (chptr->join_count >=
                        chptr->mode.join_num))
-                       return ERR_THROTTLE;
+                       i = ERR_THROTTLE;
+       }
+
+       /* allow /invite to override +l/+r/+j also -- jilles */
+       if (i != 0 && invite == NULL)
+       {
+               DLINK_FOREACH(invite, source_p->user->invited.head)
+               {
+                       if(invite->data == chptr)
+                               break;
+               }
+               if (invite == NULL)
+                       return i;
        }
 
        moduledata.client = source_p;
@@ -922,12 +933,12 @@ check_spambot_warning(struct Client *source_p, const char *name)
                                sendto_realops_snomask(SNO_BOTS, L_ALL,
                                                     "User %s (%s@%s) trying to join %s is a possible spambot",
                                                     source_p->name,
-                                                    source_p->username, source_p->host, name);
+                                                    source_p->username, source_p->orighost, name);
                        else
                                sendto_realops_snomask(SNO_BOTS, L_ALL,
                                                     "User %s (%s@%s) is a possible spambot",
                                                     source_p->name,
-                                                    source_p->username, source_p->host);
+                                                    source_p->username, source_p->orighost);
                        source_p->localClient->oper_warn_count_down = OPER_SPAM_COUNTDOWN;
                }
        }
@@ -1099,9 +1110,8 @@ static const struct mode_letter
  *
  * inputs       - pointer to channel
  *              - pointer to client
- * output       - NONE
- * side effects - write the "simple" list of channel modes for channel
- * chptr onto buffer mbuf with the parameters in pbuf.
+ * output       - string with simple modes
+ * side effects - result from previous calls overwritten
  *
  * Stolen from ShadowIRCd 4 --nenolod
  */
@@ -1126,38 +1136,39 @@ channel_modes(struct Channel *chptr, struct Client *client_p)
        {
                *mbuf++ = 'l';
 
-               if(IsMember(client_p, chptr) || IsServer(client_p) || IsMe(client_p))
-                       pbuf += ircsprintf(pbuf, "%d ", chptr->mode.limit);
+               if(!IsClient(client_p) || IsMember(client_p, chptr))
+                       pbuf += ircsprintf(pbuf, " %d", chptr->mode.limit);
        }
 
        if(*chptr->mode.key)
        {
                *mbuf++ = 'k';
 
-               if(*pbuf || IsMember(client_p, chptr) || IsServer(client_p) || IsMe(client_p))
-                       pbuf += ircsprintf(pbuf, "%s ", chptr->mode.key);
+               if(pbuf > buf2 || !IsClient(client_p) || IsMember(client_p, chptr))
+                       pbuf += ircsprintf(pbuf, " %s", chptr->mode.key);
        }
 
        if(chptr->mode.join_num)
        {
                *mbuf++ = 'j';
 
-               if(*pbuf || IsMember(client_p, chptr) || IsServer(client_p) || IsMe(client_p))
-                       pbuf += ircsprintf(pbuf, "%d:%d ", chptr->mode.join_num,
+               if(pbuf > buf2 || !IsClient(client_p) || IsMember(client_p, chptr))
+                       pbuf += ircsprintf(pbuf, " %d:%d", chptr->mode.join_num,
                                           chptr->mode.join_time);
        }
 
-       if(*chptr->mode.forward && (ConfigChannel.use_forward || IsServer(client_p) || IsMe(client_p)))
+       if(*chptr->mode.forward && (ConfigChannel.use_forward || !IsClient(client_p)))
        {
                *mbuf++ = 'f';
 
-               if(*pbuf || IsMember(client_p, chptr) || IsServer(client_p) || IsMe(client_p))
-                       pbuf += ircsprintf(pbuf, "%s ", chptr->mode.forward);
+               if(pbuf > buf2 || !IsClient(client_p) || IsMember(client_p, chptr))
+                       pbuf += ircsprintf(pbuf, " %s", chptr->mode.forward);
        }
 
        *mbuf = '\0';
 
-       ircsprintf(final, "%s %s", buf1, buf2);
+       strlcpy(final, buf1, sizeof final);
+       strlcat(final, buf2, sizeof final);
        return final;
 }