]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/cmd_invite.cpp
Swap around ERROR and SNONOTICE in SendError() so that the server doesnt try and...
[user/henk/code/inspircd.git] / src / cmd_invite.cpp
index 19330783edb038a48f5e8122566ea3f9465c98dc..9c2c2644212818ddefe7406de7c4c70e056707d6 100644 (file)
@@ -1 +1,111 @@
-/*       +------------------------------------+\r *       | Inspire Internet Relay Chat Daemon |\r *       +------------------------------------+\r *\r *  InspIRCd: (C) 2002-2007 InspIRCd Development Team\r * See: http://www.inspircd.org/wiki/index.php/Credits\r *\r * This program is free but copyrighted software; see\r *            the file COPYING for details.\r *\r * ---------------------------------------------------\r */\r\r#include "inspircd.h"\r#include "configreader.h"\r#include "users.h"\r#include "modules.h"\r#include "commands/cmd_invite.h"\r\rextern "C" DllExport command_t* init_command(InspIRCd* Instance)\r{\r      return new cmd_invite(Instance);\r}\r\r/** Handle /INVITE\r */\rCmdResult cmd_invite::Handle (const char** parameters, int pcnt, userrec *user)\r{\r   int MOD_RESULT = 0;\r\r   if (pcnt == 2)\r {\r              userrec* u = ServerInstance->FindNick(parameters[0]);\r          chanrec* c = ServerInstance->FindChan(parameters[1]);\r\r         if ((!c) || (!u))\r              {\r                      if (!c)\r                        {\r                              user->WriteServ("401 %s %s :No such nick/channel",user->nick, parameters[1]);\r                  }\r                      else\r                   {\r                              user->WriteServ("401 %s %s :No such nick/channel",user->nick, parameters[0]);\r                  }\r\r                     return CMD_FAILURE;\r            }\r\r             if ((c->modes[CM_INVITEONLY]) && (IS_LOCAL(user)))\r             {\r                      if (c->GetStatus(user) < STATUS_HOP)\r                   {\r                              user->WriteServ("482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, c->name);\r                                return CMD_FAILURE;\r                    }\r              }\r\r             if (c->HasUser(u))\r             {\r                      user->WriteServ("443 %s %s %s :is already on channel",user->nick,u->nick,c->name);\r                     return CMD_FAILURE;\r            }\r\r             if ((IS_LOCAL(user)) && (!c->HasUser(user)))\r           {\r                      user->WriteServ("442 %s %s :You're not on that channel!",user->nick, c->name);\r                 return CMD_FAILURE;\r            }\r\r             FOREACH_RESULT(I_OnUserPreInvite,OnUserPreInvite(user,u,c));\r\r          if (MOD_RESULT == 1)\r           {\r                      return CMD_FAILURE;\r            }\r\r             u->InviteTo(c->name);\r          u->WriteFrom(user,"INVITE %s :%s",u->nick,c->name);\r            user->WriteServ("341 %s %s %s",user->nick,u->nick,c->name);\r            if (ServerInstance->Config->AnnounceInvites)\r                   c->WriteChannelWithServ(ServerInstance->Config->ServerName, "NOTICE %s :*** %s invited %s into the channel", c->name, user->nick, u->nick);\r            FOREACH_MOD(I_OnUserInvite,OnUserInvite(user,u,c));\r    }\r      else\r   {\r              // pinched from ircu - invite with not enough parameters shows channels\r                // youve been invited to but haven't joined yet.\r               InvitedList* il = user->GetInviteList();\r               for (InvitedList::iterator i = il->begin(); i != il->end(); i++)\r               {\r                      user->WriteServ("346 %s :%s",user->nick,i->c_str());\r           }\r              user->WriteServ("347 %s :End of INVITE list",user->nick);\r      }\r      return CMD_SUCCESS;\r}\r\r
\ No newline at end of file
+/*       +------------------------------------+
+ *       | Inspire Internet Relay Chat Daemon |
+ *       +------------------------------------+
+ *
+ *  InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * See: http://www.inspircd.org/wiki/index.php/Credits
+ *
+ * This program is free but copyrighted software; see
+ *            the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+#include "inspircd.h"
+#include "commands/cmd_invite.h"
+
+extern "C" DllExport command_t* init_command(InspIRCd* Instance)
+{
+       return new cmd_invite(Instance);
+}
+
+/** Handle /INVITE
+ */
+CmdResult cmd_invite::Handle (const char** parameters, int pcnt, userrec *user)
+{
+       int MOD_RESULT = 0;
+
+       if (pcnt == 2)
+       {
+               userrec* u = ServerInstance->FindNick(parameters[0]);
+               chanrec* c = ServerInstance->FindChan(parameters[1]);
+
+               if ((!c) || (!u))
+               {
+                       if (!c)
+                       {
+                               user->WriteServ("401 %s %s :No such nick/channel",user->nick, parameters[1]);
+                       }
+                       else
+                       {
+                               user->WriteServ("401 %s %s :No such nick/channel",user->nick, parameters[0]);
+                       }
+
+                       return CMD_FAILURE;
+               }
+
+               if ((c->IsModeSet('i')) && (IS_LOCAL(user)))
+               {
+                       if (c->GetStatus(user) < STATUS_HOP)
+                       {
+                               user->WriteServ("482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, c->name);
+                               return CMD_FAILURE;
+                       }
+               }
+
+               if (c->HasUser(u))
+               {
+                       user->WriteServ("443 %s %s %s :is already on channel",user->nick,u->nick,c->name);
+                       return CMD_FAILURE;
+               }
+
+               if ((IS_LOCAL(user)) && (!c->HasUser(user)))
+               {
+                       user->WriteServ("442 %s %s :You're not on that channel!",user->nick, c->name);
+                       return CMD_FAILURE;
+               }
+
+               FOREACH_RESULT(I_OnUserPreInvite,OnUserPreInvite(user,u,c));
+
+               if (MOD_RESULT == 1)
+               {
+                       return CMD_FAILURE;
+               }
+
+               u->InviteTo(c->name);
+               u->WriteFrom(user,"INVITE %s :%s",u->nick,c->name);
+               user->WriteServ("341 %s %s %s",user->nick,u->nick,c->name);
+               switch (ServerInstance->Config->AnnounceInvites)
+               {
+                       case ServerConfig::INVITE_ANNOUNCE_ALL:
+                               c->WriteChannelWithServ(ServerInstance->Config->ServerName, "NOTICE %s :*** %s invited %s into the channel", c->name, user->nick, u->nick);
+                       break;
+                       case ServerConfig::INVITE_ANNOUNCE_OPS:
+                               c->WriteAllExceptSender(user, true, '@', "NOTICE %s :*** %s invited %s into the channel", c->name, user->nick, u->nick);
+                       break;
+                       case ServerConfig::INVITE_ANNOUNCE_DYNAMIC:
+                               if (c->IsModeSet('i'))
+                                       c->WriteAllExceptSender(user, true, '@', "NOTICE %s :*** %s invited %s into the channel", c->name, user->nick, u->nick);
+                               else
+                                       c->WriteChannelWithServ(ServerInstance->Config->ServerName, "NOTICE %s :*** %s invited %s into the channel", c->name, user->nick, u->nick);
+                       break;
+                       default:
+                               /* Nobody */
+                       break;
+               }
+               FOREACH_MOD(I_OnUserInvite,OnUserInvite(user,u,c));
+       }
+       else
+       {
+               // pinched from ircu - invite with not enough parameters shows channels
+               // youve been invited to but haven't joined yet.
+               InvitedList* il = user->GetInviteList();
+               for (InvitedList::iterator i = il->begin(); i != il->end(); i++)
+               {
+                       user->WriteServ("346 %s :%s",user->nick,i->c_str());
+               }
+               user->WriteServ("347 %s :End of INVITE list",user->nick);
+       }
+       return CMD_SUCCESS;
+}
+