- else ok = IRC_WriteStrClient( Origin, ERR_NEEDMOREPARAMS_MSG, Client_ID( Origin ), Req->command );
- break;
-
- case 'P': /* Persistent channel */
- if (modeok) {
- /* Only IRC operators are allowed to
- * set the 'P' channel mode! */
- if (set && ! (Client_OperByMe(Client)
- || Client_Type(Client) == CLIENT_SERVER)) {
- ok = IRC_WriteStrClient(Origin,
- ERR_NOPRIVILEGES_MSG,
- Client_ID(Origin));
- } else
- x[0] = 'P';
- } else
- ok = IRC_WriteStrClient(Origin,
+ Req->argv[arg_arg][0] = '\0';
+ arg_arg++;
+ } else {
+ connected = IRC_WriteStrClient(Origin,
+ ERR_NEEDMOREPARAMS_MSG,
+ Client_ID(Origin), Req->command);
+ goto chan_exit;
+ }
+ break;
+ case 'O': /* IRC operators only */
+ if (set) {
+ /* Only IRC operators are allowed to
+ * set the 'O' channel mode! */
+ if(is_oper || is_machine)
+ x[0] = 'O';
+ else
+ connected = IRC_WriteStrClient(Origin,
+ ERR_NOPRIVILEGES_MSG,
+ Client_ID(Origin));
+ } else if(is_oper || is_machine || is_owner ||
+ is_admin || is_op)
+ x[0] = 'O';
+ else
+ connected = IRC_WriteStrClient(Origin,
+ ERR_CHANOPRIVSNEEDED_MSG,
+ Client_ID(Origin),
+ Channel_Name(Channel));
+ break;
+ case 'P': /* Persistent channel */
+ if (set) {
+ /* Only IRC operators are allowed to
+ * set the 'P' channel mode! */
+ if(is_oper || is_machine)
+ x[0] = 'P';
+ else
+ connected = IRC_WriteStrClient(Origin,
+ ERR_NOPRIVILEGES_MSG,
+ Client_ID(Origin));
+ } else if(is_oper || is_machine || is_owner ||
+ is_admin || is_op)
+ x[0] = 'P';
+ else
+ connected = IRC_WriteStrClient(Origin,
+ ERR_CHANOPRIVSNEEDED_MSG,
+ Client_ID(Origin),
+ Channel_Name(Channel));
+ break;
+ /* --- Channel user modes --- */
+ case 'q': /* Owner */
+ case 'a': /* Channel admin */
+ if(!is_oper && !is_machine && !is_owner && !is_admin) {
+ connected = IRC_WriteStrClient(Origin,
+ ERR_CHANOPPRIVTOOLOW_MSG,
+ Client_ID(Origin),
+ Channel_Name(Channel));
+ goto chan_exit;
+ }
+ case 'o': /* Channel operator */
+ if(!is_oper && !is_machine && !is_owner &&
+ !is_admin && !is_op) {
+ connected = IRC_WriteStrClient(Origin,
+ ERR_CHANOPRIVSNEEDED_MSG,
+ Client_ID(Origin),
+ Channel_Name(Channel));
+ goto chan_exit;
+ }
+ case 'h': /* Half Op */
+ if(!is_oper && !is_machine && !is_owner &&
+ !is_admin && !is_op) {
+ connected = IRC_WriteStrClient(Origin,
+ ERR_CHANOPRIVSNEEDED_MSG,
+ Client_ID(Origin),
+ Channel_Name(Channel));
+ goto chan_exit;
+ }
+ case 'v': /* Voice */
+ if (arg_arg > mode_arg) {
+ if (is_oper || is_machine || is_owner ||
+ is_admin || is_op || is_halfop) {
+ client = Client_Search(Req->argv[arg_arg]);
+ if (client)
+ x[0] = *mode_ptr;
+ else
+ connected = IRC_WriteStrClient(Origin,
+ ERR_NOSUCHNICK_MSG,
+ Client_ID(Origin),
+ Req->argv[arg_arg]);
+ } else {
+ connected = IRC_WriteStrClient(Origin,