]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/irc-mode.c
IRC_NICK(): Code cleanup, new function Change_Nick()
[ngircd-alex.git] / src / ngircd / irc-mode.c
index 7380c6eb5c70308b030097aadf58a9ab3bc933e4..ce4044d0bf7b154401e10096af47abed1911550b 100644 (file)
@@ -215,6 +215,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
                /* Validate modes */
                x[0] = '\0';
                switch (*mode_ptr) {
+               case 'b': /* Block private msgs */
                case 'C': /* Only messages from clients sharing a channel */
                case 'i': /* Invisible */
                case 's': /* Server messages */
@@ -257,6 +258,15 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
                                                        ERR_NOPRIVILEGES_MSG,
                                                        Client_ID(Origin));
                        break;
+               case 'q': /* KICK-protected user */
+                       if (!set || Client_Type(Client) == CLIENT_SERVER
+                           || Client_OperByMe(Origin))
+                               x[0] = 'q';
+                       else
+                               ok = IRC_WriteStrClient(Origin,
+                                                       ERR_NOPRIVILEGES_MSG,
+                                                       Client_ID(Origin));
+                       break;
                case 'r': /* Restricted (only settable) */
                        if (set || Client_Type(Client) == CLIENT_SERVER)
                                x[0] = 'r';
@@ -278,9 +288,15 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
                                ok = IRC_WriteStrClient(Origin,
                                                        ERR_RESTRICTED_MSG,
                                                        Client_ID(Origin));
-                       else
+                       else if (!set || Conf_CloakHostModeX[0]
+                                || Client_Type(Client) == CLIENT_SERVER
+                                || Client_OperByMe(Client)) {
                                x[0] = 'x';
                                send_RPL_HOSTHIDDEN_MSG = true;
+                       } else
+                               ok = IRC_WriteStrClient(Origin,
+                                                       ERR_NOPRIVILEGES_MSG,
+                                                       Client_ID(Origin));
                        break;
                default:
                        if (Client_Type(Client) != CLIENT_SERVER) {
@@ -560,9 +576,11 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
                                goto chan_exit;
                        }
                case 'i': /* Invite only */
+               case 'V': /* Invite disallow */
                case 'M': /* Only identified nicks can write */
                case 'm': /* Moderated */
                case 'n': /* Only members can write */
+               case 'Q': /* No kicks */
                case 't': /* Topic locked */
                        if(is_oper || is_machine || is_owner ||
                           is_admin || is_op || is_halfop)
@@ -691,9 +709,9 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
                /* --- Channel user modes --- */
                case 'q': /* Owner */
                case 'a': /* Channel admin */
-                       if(!is_oper && !is_machine && !is_owner) {
+                       if(!is_oper && !is_machine && !is_owner && !is_admin) {
                                connected = IRC_WriteStrClient(Origin,
-                                       ERR_CHANOPRIVSNEEDED_MSG,
+                                       ERR_CHANOPPRIVTOOLOW_MSG,
                                        Client_ID(Origin),
                                        Channel_Name(Channel));
                                goto chan_exit;