X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Firc-mode.c;h=8da4a65aefed06ed1f41f0b0de43c9fc348201cd;hb=e01e8f1cb6812ac24821fa540fd6ce4e61ccbc12;hp=71c9f796e952d592b28603c354012826b9dceeff;hpb=33a165721b79bf896a1895e79fa0809fd6f71174;p=ngircd.git diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c index 71c9f796..8da4a65a 100644 --- a/src/ngircd/irc-mode.c +++ b/src/ngircd/irc-mode.c @@ -256,6 +256,14 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) ERR_RESTRICTED_MSG, Client_ID(Origin)); break; + case 'R': /* Registered (not [un]settable by clients) */ + if (Client_Type(Client) == CLIENT_SERVER) + x[0] = 'R'; + else + ok = IRC_WriteStrClient(Origin, + ERR_NICKREGISTER_MSG, + Client_ID(Origin)); + break; case 'x': /* Cloak hostname */ if (Client_HasMode(Client, 'r')) ok = IRC_WriteStrClient(Origin, @@ -500,6 +508,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) switch (*mode_ptr) { /* --- Channel modes --- */ case 'i': /* Invite only */ + case 'M': /* Only identified nicks can write */ case 'm': /* Moderated */ case 'n': /* Only members can write */ case 'R': /* Registered users only */ @@ -662,6 +671,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) /* --- Channel lists --- */ case 'I': /* Invite lists */ case 'b': /* Ban lists */ + case 'e': /* Channel exception lists */ if (Mode_Limit_Reached(Client, mode_arg_count++)) goto chan_exit; if (arg_arg > mode_arg) { @@ -683,10 +693,17 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel) Req->argv[arg_arg][0] = '\0'; arg_arg++; } else { - if (*mode_ptr == 'I') + switch (*mode_ptr) { + case 'I': Channel_ShowInvites(Origin, Channel); - else + break; + case 'b': Channel_ShowBans(Origin, Channel); + break; + case 'e': + Channel_ShowExcepts(Origin, Channel); + break; + } } break; default: @@ -836,7 +853,7 @@ IRC_AWAY( CLIENT *Client, REQUEST *Req ) /** * Add entries to channel invite, ban and exception lists. * - * @param what Can be 'I' for invite or 'b' for ban list. + * @param what Can be 'I' for invite, 'b' for ban, and 'e' for exception list. * @param Prefix The originator of the command. * @param Client The sender of the command. * @param Channel The channel of which the list should be modified. @@ -848,14 +865,18 @@ Add_To_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, const char *Pattern) { const char *mask; - struct list_head *list; + struct list_head *list = NULL; + long int current_count; assert(Client != NULL); assert(Channel != NULL); assert(Pattern != NULL); - assert(what == 'I' || what == 'b'); + assert(what == 'I' || what == 'b' || what == 'e'); mask = Lists_MakeMask(Pattern); + current_count = Lists_Count(Channel_GetListInvites(Channel)) + + Lists_Count(Channel_GetListExcepts(Channel)) + + Lists_Count(Channel_GetListBans(Channel)); switch(what) { case 'I': @@ -864,12 +885,15 @@ Add_To_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, case 'b': list = Channel_GetListBans(Channel); break; + case 'e': + list = Channel_GetListExcepts(Channel); + break; } if (Lists_CheckDupeMask(list, mask)) return CONNECTED; if (Client_Type(Client) == CLIENT_USER && - Lists_Count(list) >= MAX_HNDL_CHANNEL_LISTS) + current_count >= MAX_HNDL_CHANNEL_LISTS) return IRC_WriteStrClient(Client, ERR_LISTFULL_MSG, Client_ID(Client), Channel_Name(Channel), mask, @@ -884,6 +908,10 @@ Add_To_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, if (!Channel_AddBan(Channel, mask)) return CONNECTED; break; + case 'e': + if (!Channel_AddExcept(Channel, mask)) + return CONNECTED; + break; } return Send_ListChange(true, what, Prefix, Client, Channel, mask); } @@ -892,7 +920,7 @@ Add_To_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, /** * Delete entries from channel invite, ban and exeption lists. * - * @param what Can be 'I' for invite or 'b' for ban list. + * @param what Can be 'I' for invite, 'b' for ban, and 'e' for exception list. * @param Prefix The originator of the command. * @param Client The sender of the command. * @param Channel The channel of which the list should be modified. @@ -904,12 +932,12 @@ Del_From_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, const char *Pattern) { const char *mask; - struct list_head *list; + struct list_head *list = NULL; assert(Client != NULL); assert(Channel != NULL); assert(Pattern != NULL); - assert(what == 'I' || what == 'b'); + assert(what == 'I' || what == 'b' || what == 'e'); mask = Lists_MakeMask(Pattern); @@ -920,6 +948,9 @@ Del_From_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, case 'b': list = Channel_GetListBans(Channel); break; + case 'e': + list = Channel_GetListExcepts(Channel); + break; } if (!Lists_CheckDupeMask(list, mask)) @@ -931,7 +962,7 @@ Del_From_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel, /** - * Send information about changed channel ban/invite lists to clients. + * Send information about changed channel invite/ban/exception lists to clients. * * @param IsAdd true if the list item has been added, false otherwise. * @param ModeChar The mode to use (e. g. 'b' or 'I')