Implement invitation announcements (RPL_ISSUEDINVITE).
[ircu2.10.12-pk.git] / ircd / m_invite.c
index 7b0b493ae56c8b026963324917cba7dc0e3735e5..d36e1df2d25099d393db2726a581e98ff005ae53 100644 (file)
@@ -85,6 +85,7 @@
 #include "client.h"
 #include "hash.h"
 #include "ircd.h"
+#include "ircd_features.h"
 #include "ircd_reply.h"
 #include "ircd_string.h"
 #include "list.h"
@@ -146,24 +147,7 @@ int m_invite(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
     return 0;
 
   if (!(chptr = FindChannel(parv[2]))) {
-    if (IsModelessChannel(parv[2]) || IsLocalChannel(parv[2])) {
-      send_reply(sptr, ERR_NOTONCHANNEL, parv[2]);
-      return 0;
-    }
-
-    /* Do not disallow to invite to non-existant #channels, otherwise they
-       would simply first be created, causing only MORE bandwidth usage. */
-
-    if (check_target_limit(sptr, acptr, cli_name(acptr), 0))
-      return 0;
-
-    send_reply(sptr, RPL_INVITING, cli_name(acptr), parv[2]);
-
-    if (cli_user(acptr)->away)
-      send_reply(sptr, RPL_AWAY, cli_name(acptr), cli_user(acptr)->away);
-
-    sendcmdto_one(sptr, CMD_INVITE, acptr, "%s :%s", cli_name(acptr), parv[2]);
-
+    send_reply(sptr, ERR_NOTONCHANNEL, parv[2]);
     return 0;
   }
 
@@ -195,8 +179,20 @@ int m_invite(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
   if (MyConnect(acptr))
     add_invite(acptr, chptr);
 
-  if (!IsLocalChannel(chptr->chname))
-    sendcmdto_one(sptr, CMD_INVITE, acptr, "%s :%H", cli_name(acptr), chptr);
+  if (!IsLocalChannel(chptr->chname) || MyConnect(acptr)) {
+    if (feature_bool(FEAT_ANNOUNCE_INVITES)) {
+      sendcmdto_channel_butserv_butone(&me, get_error_numeric(RPL_ISSUEDINVITE)->str,
+                                       NULL, chptr, sptr, SKIP_NONOPS, 
+                                       "%C %C :%C has been invited by %C",
+                                       acptr, sptr, acptr, sptr);
+      sendcmdto_channel_servers_butone(sptr, NULL, TOK_INVITE, chptr, sptr, 0,
+                                       "%s :%H", cli_name(acptr), chptr);
+      if (MyConnect(acptr))
+        sendcmdto_one(sptr, CMD_INVITE, acptr, "%s :%H", cli_name(acptr), chptr);
+    }
+    else
+      sendcmdto_one(sptr, CMD_INVITE, acptr, "%s :%H", cli_name(acptr), chptr);
+  }
 
   return 0;
 }
@@ -236,7 +232,7 @@ int ms_invite(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
     protocol_violation(sptr,"Too few arguments to invite");
     return need_more_params(sptr,"INVITE");
   }
-  if ('#' != *parv[2]) {
+  if (!IsGlobalChannel(parv[2])) {
     /*
      * should not be sent
      */
@@ -246,6 +242,17 @@ int ms_invite(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
     send_reply(sptr, ERR_NOSUCHNICK, parv[1]);
     return 0;
   }
+  if (feature_bool(FEAT_ANNOUNCE_INVITES)) {
+    sendcmdto_channel_butserv_butone(&me, get_error_numeric(RPL_ISSUEDINVITE)->str,
+                                     NULL, chptr, sptr, SKIP_NONOPS, 
+                                     "%C %C :%C has been invited by %C",
+                                     acptr, sptr, acptr, sptr);
+    sendcmdto_channel_servers_butone(sptr, NULL, TOK_INVITE, chptr, sptr, 0,
+                                     "%s :%H", cli_name(acptr), chptr);
+    if (MyConnect(acptr))
+      sendcmdto_one(sptr, CMD_INVITE, acptr, "%s :%H", cli_name(acptr), chptr);
+    return 0;
+  }
   if (!MyUser(acptr)) {
     /*
      * just relay the message
@@ -266,7 +273,7 @@ int ms_invite(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
     return 0;
   }
 
-  if (!find_channel_member(sptr, chptr)) {
+  if (!IsChannelService(sptr) && !find_channel_member(sptr, chptr)) {
     send_reply(sptr, ERR_NOTONCHANNEL, chptr->chname);
     return 0;
   }