X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcoremods%2Fcore_channel%2Fcmd_invite.cpp;h=c26318337597d389f9491697904ceb7d800a4b31;hb=dba2cddc463082ca028617df93e6726253e0866f;hp=a1319ebc049651d2099faf6149b33c960622128b;hpb=a3e0768758ca68429a29d9c78ce672f2d938c6e7;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/coremods/core_channel/cmd_invite.cpp b/src/coremods/core_channel/cmd_invite.cpp index a1319ebc0..c26318337 100644 --- a/src/coremods/core_channel/cmd_invite.cpp +++ b/src/coremods/core_channel/cmd_invite.cpp @@ -34,7 +34,7 @@ CommandInvite::CommandInvite(Module* parent, Invite::APIImpl& invapiimpl) /** Handle /INVITE */ -CmdResult CommandInvite::Handle (const std::vector& parameters, User *user) +CmdResult CommandInvite::Handle(User* user, const Params& parameters) { ModResult MOD_RESULT; @@ -51,14 +51,27 @@ CmdResult CommandInvite::Handle (const std::vector& parameters, Use if (parameters.size() >= 3) { if (IS_LOCAL(user)) - timeout = ServerInstance->Time() + InspIRCd::Duration(parameters[2]); + { + unsigned long duration; + if (!InspIRCd::Duration(parameters[2], duration)) + { + user->WriteNotice("*** Invalid duration for invite"); + return CMD_FAILURE; + } + timeout = ServerInstance->Time() + duration; + } else if (parameters.size() > 3) - timeout = ConvToInt(parameters[3]); + timeout = ConvToNum(parameters[3]); } - if ((!c) || (!u) || (u->registered != REG_ALL)) + if (!c) { - user->WriteNumeric(Numerics::NoSuchNick(c ? parameters[0] : parameters[1])); + user->WriteNumeric(Numerics::NoSuchChannel(parameters[1])); + return CMD_FAILURE; + } + if ((!u) || (u->registered != REG_ALL)) + { + user->WriteNumeric(Numerics::NoSuchNick(parameters[0])); return CMD_FAILURE; } @@ -70,7 +83,7 @@ CmdResult CommandInvite::Handle (const std::vector& parameters, Use return CMD_INVALID; // Drop the invite if our channel TS is lower - time_t RemoteTS = ConvToInt(parameters[2]); + time_t RemoteTS = ConvToNum(parameters[2]); if (c->age < RemoteTS) return CMD_FAILURE; } @@ -109,10 +122,12 @@ CmdResult CommandInvite::Handle (const std::vector& parameters, Use } } - if (IS_LOCAL(u)) + LocalUser* const localtargetuser = IS_LOCAL(u); + if (localtargetuser) { - invapi.Create(IS_LOCAL(u), c, timeout); - u->WriteFrom(user,"INVITE %s :%s",u->nick.c_str(),c->name.c_str()); + invapi.Create(localtargetuser, c, timeout); + ClientProtocol::Messages::Invite invitemsg(user, localtargetuser, c); + localtargetuser->Send(ServerInstance->GetRFCEvents().invite, invitemsg); } if (IS_LOCAL(user)) @@ -124,15 +139,15 @@ CmdResult CommandInvite::Handle (const std::vector& parameters, Use char prefix = 0; unsigned int minrank = 0; - switch (ServerInstance->Config->AnnounceInvites) + switch (announceinvites) { - case ServerConfig::INVITE_ANNOUNCE_OPS: + case Invite::ANNOUNCE_OPS: { prefix = '@'; minrank = OP_VALUE; break; } - case ServerConfig::INVITE_ANNOUNCE_DYNAMIC: + case Invite::ANNOUNCE_DYNAMIC: { PrefixMode* mh = ServerInstance->Modes->FindPrefixMode('h'); if ((mh) && (mh->name == "halfop")) @@ -150,8 +165,12 @@ CmdResult CommandInvite::Handle (const std::vector& parameters, Use CUList excepts; FOREACH_MOD(OnUserInvite, (user, u, c, timeout, minrank, excepts)); - if (ServerInstance->Config->AnnounceInvites != ServerConfig::INVITE_ANNOUNCE_NONE) - c->WriteAllExcept(user, true, prefix, excepts, "NOTICE %s :*** %s invited %s into the channel", c->name.c_str(), user->nick.c_str(), u->nick.c_str()); + if (announceinvites != Invite::ANNOUNCE_NONE) + { + excepts.insert(user); + ClientProtocol::Messages::Privmsg privmsg(ServerInstance->FakeClient, c, InspIRCd::Format("*** %s invited %s into the channel", user->nick.c_str(), u->nick.c_str()), MSG_NOTICE); + c->Write(ServerInstance->GetRFCEvents().privmsg, privmsg, prefix, excepts); + } } else if (IS_LOCAL(user)) { @@ -168,7 +187,7 @@ CmdResult CommandInvite::Handle (const std::vector& parameters, Use return CMD_SUCCESS; } -RouteDescriptor CommandInvite::GetRouting(User* user, const std::vector& parameters) +RouteDescriptor CommandInvite::GetRouting(User* user, const Params& parameters) { return (IS_LOCAL(user) ? ROUTE_LOCALONLY : ROUTE_BROADCAST); }