]> arthur.barton.de Git - ngircd-alex.git/commitdiff
Merge pull request #214 from Flupsy/channel-mode-N
authorAlexander Barton <alex@barton.de>
Sat, 1 Aug 2015 12:24:20 +0000 (14:24 +0200)
committerAlexander Barton <alex@barton.de>
Sat, 1 Aug 2015 12:24:20 +0000 (14:24 +0200)
Channel mode N (users on this channel can't change their nick)

doc/Modes.txt
src/ngircd/irc-login.c
src/ngircd/irc-mode.c
src/ngircd/messages.h

index 07f16eb0489b8a959cddc6cf1205af6027b2310d..2230f36eda26804f10f2c0d6525353db83eb9367 100644 (file)
@@ -56,6 +56,7 @@ users to lists (e.g. "invite list", "ban list"), others have parameters
   m    0.3.0   Channel is moderated, only "voiced" users can send messages.
   M    20      Only registered users (and IRC Ops) can send messages.
   n    0.3.0   Channel doesn't allow messages of users not being members.
+  N     ??      Users can't change their nickname while on this channel.
   O    18      Only IRC operators are allowed to join this channel.
   P    0.5.0   Channel is "persistent".
   Q    20      Nobody can be kicked from the channel.
index 98ac0e7f5e07ead740eed5297eb8b45802b59b8d..35026e5587300d08ebb61f9bf9af3a9f99824475 100644 (file)
@@ -172,6 +172,7 @@ GLOBAL bool
 IRC_NICK( CLIENT *Client, REQUEST *Req )
 {
        CLIENT *intr_c, *target, *c;
+       CHANNEL *chan;
        char *nick, *user, *hostname, *modes, *info;
        int token, hops;
 
@@ -259,6 +260,22 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
                                Client_SetType( Client, CLIENT_GOTNICK );
                } else {
                        /* Nickname change */
+
+                       /* Check that the user isn't on any channels set +N */
+                       if(Client_Type(Client) == CLIENT_USER &&
+                          !Client_HasMode(Client, 'o')) {
+                               chan = Channel_First();
+                               while (chan) {
+                                       if(Channel_IsMemberOf(chan, Client) &&
+                                          Channel_HasMode(chan, 'N'))
+                                               return IRC_WriteErrClient(Client,
+                                                                         ERR_NONICKCHANGE_MSG,
+                                                                         Client_ID(Client),
+                                                                         Channel_Name(chan));
+                                       chan = Channel_Next(chan);
+                               }
+                       }
+
                        Change_Nick(Client, target, Req->argv[0],
                                    Client_Type(Client) == CLIENT_USER ? true : false);
                        IRC_SetPenalty(target, 2);
index 2f9225067a4aa503146c142c811ac224243052ed..99255df14a5433f60b3ad56e35f7e8f802175916 100644 (file)
@@ -580,6 +580,7 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
                case 'M': /* Only identified nicks can write */
                case 'm': /* Moderated */
                case 'n': /* Only members can write */
+               case 'N': /* Can't change nick while on this channel */
                case 'Q': /* No kicks */
                case 't': /* Topic locked */
                        if(is_oper || is_machine || is_owner ||
index 8a7215b42172464a3f77204225292760fb47af5c..4f1632b09270f7a1c8f3d032f13047fed7851350 100644 (file)
 #define ERR_USERONCHANNEL_MSG          "443 %s %s %s :is already on channel"
 #define ERR_SUMMONDISABLED_MSG         "445 %s :SUMMON has been disabled"
 #define ERR_USERSDISABLED_MSG          "446 %s :USERS has been disabled"
+#define ERR_NONICKCHANGE_MSG           "447 %s :Cannot change nickname while on %s(+N)"
 #define ERR_NOTREGISTERED_MSG          "451 %s :Connection not registered"
 #define ERR_NOTREGISTEREDSERVER_MSG    "451 %s :Connection not registered as server link"
 #define ERR_NEEDMOREPARAMS_MSG         "461 %s %s :Syntax error"