]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/cmd_invite.cpp
Set EOL to WINDOWS-style always for Visual Studio files.
[user/henk/code/inspircd.git] / src / cmd_invite.cpp
1 /*       +------------------------------------+\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