]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - src/channel.c
Add channel::exemptchanops, and make +cCDTNG support it.
[irc/rqf/shadowircd.git] / src / channel.c
index 1809ec0a394c660f80a6f13d221dbedb54684407..89c271bae8307539d607a229f09db8dda225b638 100644 (file)
@@ -175,11 +175,18 @@ find_channel_membership(struct Channel *chptr, struct Client *client_p)
 const char *
 find_channel_status(struct membership *msptr, int combine)
 {
-       static char buffer[3];
+       static char buffer[5];
        char *p;
 
        p = buffer;
 
+       if(is_owner(msptr))
+       {
+               if(!combine)
+                       return "!";
+               *p++ = '!';
+       }
+
        if(is_chanop(msptr))
        {
                if(!combine)
@@ -187,6 +194,13 @@ find_channel_status(struct membership *msptr, int combine)
                *p++ = '@';
        }
 
+       if(is_halfop(msptr))
+       {
+               if(!combine)
+                       return "%";
+               *p++ = '%';
+       }
+
        if(is_voiced(msptr))
                *p++ = '+';
 
@@ -205,9 +219,10 @@ find_channel_status(struct membership *msptr, int combine)
 int
 is_halfop(struct membership *msptr)
 {
-       /* will do something other than return 0 when owner is implemented */
        if(!ConfigChannel.use_halfop)
                return 0;
+       if(is_chmode_h(msptr))
+               return 1;
        else
                return 0;
 }
@@ -223,9 +238,10 @@ is_halfop(struct membership *msptr)
 int
 is_owner(struct membership *msptr)
 {
-       /* will do something other than return 0 when owner is implemented */
        if(!ConfigChannel.use_owner)
                return 0;
+       if(is_chmode_a(msptr))
+               return 1;
        else
                return 0;
 }
@@ -1013,9 +1029,7 @@ find_nonickchange_channel(struct Client *client_p)
        {
                msptr = ptr->data;
                chptr = msptr->chptr;
-               if (is_any_op(msptr))
-                       continue;               
-               if (chptr->mode.mode & MODE_NONICK)
+               if (chptr->mode.mode & MODE_NONICK && (!ConfigChannel.exempt_cmode_N || !is_any_op(msptr)))
                        return chptr;
        }
        return NULL;
@@ -1652,7 +1666,8 @@ void user_join(struct Client * client_p, struct Client * source_p, const char *
                }
 
                /* check it begins with # or &, and local chans are disabled */
-               else if(!IsChannelName(name))
+                else if(!IsChannelName(name) ||
+                        ( !ConfigChannel.use_local_channels && name[0] == '&'))
                {
                        sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL,
                                           form_str(ERR_NOSUCHCHANNEL), name);