- /* Validate modes */
- switch( *mode_ptr )
- {
- /* Channel modes */
- case 'i':
- /* Invite-Only */
- if( modeok ) x[0] = 'i';
- else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
- break;
- case 'm':
- /* Moderated */
- if( modeok ) x[0] = 'm';
- else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
- break;
- case 'n':
- /* kein Schreiben in den Channel von aussen */
- if( modeok ) x[0] = 'n';
+ /* Channel modes */
+ case 'i':
+ /* Invite-Only */
+ if( modeok ) x[0] = 'i';
+ else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
+ break;
+ case 'm':
+ /* Moderated */
+ if( modeok ) x[0] = 'm';
+ else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
+ break;
+ case 'n':
+ /* kein Schreiben in den Channel von aussen */
+ if( modeok ) x[0] = 'n';
+ else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
+ break;
+ case 't':
+ /* Topic Lock */
+ if( modeok ) x[0] = 't';
+ else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
+ break;
+ case 'P':
+ /* Persistent channel */
+ if( modeok )
+ {
+ if( set && ( ! Client_OperByMe( Client )))
+ {
+ /* Only IRC operators are allowed to set P mode */
+ ok = IRC_WriteStrClient( Origin, ERR_NOPRIVILEGES_MSG, Client_ID( Origin ));
+ }
+ else x[0] = 'P';
+ }
+ else ok = IRC_WriteStrClient( Origin, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( Origin ), Channel_Name( Channel ));
+ break;
+
+ /* Channel user modes */
+ case 'o':
+ /* Channel operator */
+ case 'v':
+ /* Voice */
+ if( arg_arg > mode_arg )
+ {
+ if( modeok )
+ {
+ client = Client_Search( Req->argv[arg_arg] );
+ if( client ) x[0] = *mode_ptr;
+ else ok = IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[arg_arg] );
+ }