-
- /* an Ziel-Client forwarden ... */
- IRC_WriteStrClientPrefix( target, from, "INVITE %s %s", Req->argv[0], Req->argv[1] );
-
- if( Client_Conn( target ) > NONE )
- {
- /* lokaler Ziel-Client, Status-Code melden */
- if( ! IRC_WriteStrClientPrefix( from, target, RPL_INVITING_MSG, Client_ID( from ), Req->argv[0], Req->argv[1] )) return DISCONNECTED;
+
+ LogDebug("User \"%s\" invites \"%s\" to \"%s\" ...", Client_Mask(from),
+ Req->argv[0], Req->argv[1]);
+
+ /*
+ * RFC 2812 states:
+ * 'There is no requirement that the channel [..] must exist or be a
+ * valid channel'. The problem with this is that this allows the
+ * "channel" to contain spaces, in which case we must prefix its name
+ * with a colon to make it clear that it is only a single argument.
+ */
+ colon_if_necessary = strchr(Req->argv[1], ' ') ? ":":"";
+ /* Inform target client */
+ IRC_WriteStrClientPrefix(target, from, "INVITE %s %s%s", Req->argv[0],
+ colon_if_necessary, Req->argv[1]);
+
+ if (Client_Conn(target) > NONE) {
+ /* The target user is local, so we have to send the status code */
+ if (!IRC_WriteStrClientPrefix(from, target, RPL_INVITING_MSG,
+ Client_ID(from), Req->argv[0],
+ colon_if_necessary, Req->argv[1]))
+ return DISCONNECTED;
+
+ if (Client_HasMode(target, 'a') &&
+ !IRC_WriteStrClient(from, RPL_AWAY_MSG, Client_ID(from),
+ Client_ID(target), Client_Away(target)))
+ return DISCONNECTED;