+ if (the_args[0])
+ strlcat(the_modes, the_args, sizeof(the_modes));
+
+ return IRC_WriteStrClient(Origin, RPL_CHANNELMODEIS_MSG,
+ Client_ID(Origin), Channel_Name(Channel), the_modes);
+}
+
+
+static bool
+Channel_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel )
+{
+ /* Handle channel and channel-user modes */
+
+ char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2], argadd[CLIENT_PASS_LEN], *mode_ptr;
+ bool ok, set, modeok = true, skiponce, use_servermode = false;
+ int mode_arg, arg_arg;
+ CLIENT *client;
+ long l;
+ size_t len;
+
+ /* Mode request: let's answer it :-) */
+ if (Req->argc <= 1)
+ return Channel_Mode_Answer_Request(Origin, Channel);
+
+ /* Is the user allowed to change modes? */
+ if (Client_Type(Client) == CLIENT_USER) {
+ /* Is the originating user on that channel? */
+ if (!Channel_IsMemberOf(Channel, Origin))
+ return IRC_WriteStrClient(Origin, ERR_NOTONCHANNEL_MSG,
+ Client_ID(Origin), Channel_Name(Channel));
+ modeok = false;
+ /* channel operator? */
+ if (strchr(Channel_UserModes(Channel, Origin), 'o'))
+ modeok = true;
+ else if(Conf_OperCanMode) {
+ /* IRC-Operators can use MODE as well */
+ if (Client_OperByMe(Origin)) {
+ modeok = true;
+ if (Conf_OperServerMode)
+ use_servermode = true; /* Change Origin to Server */
+ }
+ }
+ }
+
+ mode_arg = 1;
+ mode_ptr = Req->argv[mode_arg];
+ if (Req->argc > mode_arg + 1)
+ arg_arg = mode_arg + 1;