+ 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_WriteErrClient(from, ERR_NOTONCHANNEL_MSG,
+ Client_ID(Client),
+ Req->argv[1]);
+
+ /* Is the channel "invite-disallow"? */
+ if (Channel_HasMode(chan, 'V'))
+ return IRC_WriteErrClient(from, ERR_NOINVITE_MSG,
+ Client_ID(from),
+ Channel_Name(chan));
+
+ /* Is the channel "invite-only"? */
+ if (Channel_HasMode(chan, 'i')) {
+ /* Yes. The user issuing the INVITE command must be
+ * channel owner/admin/operator/halfop! */
+ if (!Channel_UserHasMode(chan, from, 'q') &&
+ !Channel_UserHasMode(chan, from, 'a') &&
+ !Channel_UserHasMode(chan, from, 'o') &&
+ !Channel_UserHasMode(chan, from, 'h'))
+ return IRC_WriteErrClient(from,
+ ERR_CHANOPRIVSNEEDED_MSG,
+ Client_ID(from),
+ Channel_Name(chan));
+ remember = true;
+ }
+
+ /* Is the target user already member of the channel? */
+ if (Channel_IsMemberOf(chan, target))
+ return IRC_WriteErrClient(from, ERR_USERONCHANNEL_MSG,
+ Client_ID(from),
+ Req->argv[0], Req->argv[1]);
+
+ /* If the target user is banned on that channel: remember invite */
+ if (Lists_Check(Channel_GetListBans(chan), target))
+ remember = true;
+
+ if (remember) {
+ /* We must remember this invite */
+ if (!Channel_AddInvite(chan, Client_MaskCloaked(target),
+ true))
+ return CONNECTED;
+ }