- /* Valider Client? */
- if(( Client_Type( Client ) != CLIENT_USER ) && ( Client_Type( Client ) != CLIENT_SERVER )) return IRC_WriteStrClient( Client, ERR_NOTREGISTERED_MSG, Client_ID( Client ));
-
- /* Falsche Anzahl Parameter? */
- if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
-
- if( Client_Type( Client ) == CLIENT_SERVER ) from = Client_Search( Req->prefix );
- else from = Client;
- if( ! from ) return IRC_WriteStrClient( Client, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->prefix );
-
- /* User suchen */
- target = Client_Search( Req->argv[0] );
- if( ! target ) return IRC_WriteStrClient( from, ERR_NOSUCHNICK_MSG, Client_ID( Client ), Req->argv[0] );
-
- chan = Channel_Search( Req->argv[1] );
-
- if( chan )
- {
- /* Der Channel existiert bereits; ist der User Mitglied? */
- if( ! Channel_IsMemberOf( chan, from )) return IRC_WriteStrClient( from, ERR_NOTONCHANNEL_MSG, Client_ID( Client ), Req->argv[1] );
-
- /* Ist der Channel "invite-only"? */
- if( strchr( Channel_Modes( chan ), 'i' ))
- {
- /* Ja. Der User muss Channel-Operator sein! */
- if( ! strchr( Channel_UserModes( chan, from ), 'o' )) return IRC_WriteStrClient( from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID( from ), Channel_Name( chan ));
- remember = TRUE;
+ if (Req->argc != 2)
+ return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
+ Client_ID(Client), Req->command);
+
+ if (Client_Type(Client) == CLIENT_SERVER)
+ from = Client_Search(Req->prefix);
+ else
+ from = Client;
+ if (!from)
+ return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
+ Client_ID(Client), Req->prefix);
+
+ /* Search user */
+ target = Client_Search(Req->argv[0]);
+ if (!target || (Client_Type(target) != CLIENT_USER))
+ return IRC_WriteStrClient(from, ERR_NOSUCHNICK_MSG,
+ Client_ID(Client), Req->argv[0]);
+
+ chan = Channel_Search(Req->argv[1]);
+ if (chan) {
+ /* Channel exists. Is the user a valid member of the channel? */
+ if (!Channel_IsMemberOf(chan, from))
+ return IRC_WriteStrClient(from, ERR_NOTONCHANNEL_MSG, Client_ID(Client), Req->argv[1]);
+
+ /* Is the channel "invite-disallow"? */
+ if (strchr(Channel_Modes(chan), 'V'))
+ return IRC_WriteStrClient(from, ERR_NOINVITE_MSG,
+ Client_ID(from), Channel_Name(chan));
+
+ /* Is the channel "invite-only"? */
+ if (strchr(Channel_Modes(chan), 'i')) {
+ /* Yes. The user must be channel owner/admin/operator/halfop! */
+ if (!strchr(Channel_UserModes(chan, from), 'q') &&
+ !strchr(Channel_UserModes(chan, from), 'a') &&
+ !strchr(Channel_UserModes(chan, from), 'o') &&
+ !strchr(Channel_UserModes(chan, from), 'h'))
+ return IRC_WriteStrClient(from, ERR_CHANOPRIVSNEEDED_MSG,
+ Client_ID(from), Channel_Name(chan));
+ remember = true;