diff options
Diffstat (limited to 'modules')
30 files changed, 1872 insertions, 1197 deletions
diff --git a/modules/botserv/bot.cpp b/modules/botserv/bot.cpp index 30550df56..082bd6337 100644 --- a/modules/botserv/bot.cpp +++ b/modules/botserv/bot.cpp @@ -232,7 +232,10 @@ class CommandBSBot : public Command bi->introduced = false; } else - IRCD->SendNickChange(bi, nick); + { + IRCD->Send<messages::NickChange>(bi, nick, Anope::CurTime); + bi->timestamp = Anope::CurTime; + } if (!nick.equals_cs(bi->nick)) { diff --git a/modules/botserv/main/botserv.cpp b/modules/botserv/main/botserv.cpp index 4f3d4c92b..4b0309b31 100644 --- a/modules/botserv/main/botserv.cpp +++ b/modules/botserv/main/botserv.cpp @@ -62,6 +62,7 @@ class BotServCore : public Module, public BotServ::BotServService void OnBotAssign(User *sender, ChanServ::Channel *ci, ServiceBot *bi) override { + printf("on bot assign !\n"); if (ci->c && ci->c->users.size() >= Config->GetModule(this)->Get<unsigned>("minusers")) { ChannelStatus status(Config->GetModule(this)->Get<Anope::string>("botmodes")); diff --git a/modules/chanserv/invite.cpp b/modules/chanserv/invite.cpp index b6d0f19c9..9c21bc704 100644 --- a/modules/chanserv/invite.cpp +++ b/modules/chanserv/invite.cpp @@ -78,7 +78,7 @@ class CommandCSInvite : public Command bool override = !source.AccessFor(ci).HasPriv("INVITE"); - IRCD->SendInvite(ci->WhoSends(), c, u2); + IRCD->Send<messages::Invite>(ci->WhoSends(), c, u2); if (u2 != u) { source.Reply(_("\002{0}\002 has been invited to \002{1}\002."), u2->nick, c->name); diff --git a/modules/chanserv/main/chanserv.cpp b/modules/chanserv/main/chanserv.cpp index b6aedb0dd..492f64459 100644 --- a/modules/chanserv/main/chanserv.cpp +++ b/modules/chanserv/main/chanserv.cpp @@ -471,7 +471,7 @@ class ChanServCore : public Module if (ModeManager::FindChannelModeByName("PERM") != NULL) { if (c) - IRCD->SendChannel(ci->c); + IRCD->Send<messages::MessageChannel>(ci->c); ci->c->SetMode(NULL, "PERM"); } else @@ -513,7 +513,7 @@ class ChanServCore : public Module { ::Log(LOG_DEBUG) << "Changing TS of " << c->name << " from " << c->creation_time << " to " << c->ci->GetTimeRegistered(); c->creation_time = c->ci->GetTimeRegistered(); - IRCD->SendChannel(c); + IRCD->Send<messages::MessageChannel>(c); c->Reset(); } } diff --git a/modules/chanserv/set.cpp b/modules/chanserv/set.cpp index 89eb4985a..833817cde 100644 --- a/modules/chanserv/set.cpp +++ b/modules/chanserv/set.cpp @@ -1242,7 +1242,7 @@ class CSSet : public Module { Log(LOG_DEBUG) << "Changing TS of " << c->name << " from " << c->creation_time << " to " << c->ci->GetTimeRegistered(); c->creation_time = c->ci->GetTimeRegistered(); - IRCD->SendChannel(c); + IRCD->Send<messages::MessageChannel>(c); c->Reset(); } } diff --git a/modules/dnsbl.cpp b/modules/dnsbl.cpp index a2c8a4380..f8d35bf71 100644 --- a/modules/dnsbl.cpp +++ b/modules/dnsbl.cpp @@ -107,7 +107,7 @@ class DNSBLResolver : public Request } else { - IRCD->SendAkill(NULL, x); + IRCD->Send<messages::Akill>(nullptr, x); delete x; } } diff --git a/modules/hostserv/main/hostserv.cpp b/modules/hostserv/main/hostserv.cpp index 4ff348f2b..f7ba03418 100644 --- a/modules/hostserv/main/hostserv.cpp +++ b/modules/hostserv/main/hostserv.cpp @@ -76,7 +76,7 @@ class HostServCore : public Module if (u->vhost.empty() || !u->vhost.equals_cs(vhost->GetHost()) || (!vhost->GetIdent().empty() && !u->GetVIdent().equals_cs(vhost->GetIdent()))) { - IRCD->SendVhost(u, vhost->GetIdent(), vhost->GetHost()); + IRCD->Send<messages::VhostSet>(u, vhost->GetIdent(), vhost->GetHost()); u->vhost = vhost->GetHost(); u->UpdateHost(); @@ -124,7 +124,7 @@ class HostServCore : public Module if (vhost == nullptr) return; - IRCD->SendVhost(u, vhost->GetIdent(), vhost->GetHost()); + IRCD->Send<messages::VhostSet>(u, vhost->GetIdent(), vhost->GetHost()); u->vhost = vhost->GetHost(); u->UpdateHost(); @@ -150,7 +150,7 @@ class HostServCore : public Module User *u = User::Find(na->GetNick()); if (u && u->Account() == na->GetAccount()) - IRCD->SendVhostDel(u); + IRCD->Send<messages::VhostDel>(u); } } diff --git a/modules/hostserv/off.cpp b/modules/hostserv/off.cpp index 1d7d91876..e1af7def4 100644 --- a/modules/hostserv/off.cpp +++ b/modules/hostserv/off.cpp @@ -42,7 +42,7 @@ class CommandHSOff : public Command // XXX vident? u->vhost.clear(); - IRCD->SendVhostDel(u); + IRCD->Send<messages::VhostDel>(u); Log(LOG_COMMAND, source, this) << "to disable their vhost"; source.Reply(_("Your vhost was removed and the normal cloaking restored.")); } diff --git a/modules/hostserv/on.cpp b/modules/hostserv/on.cpp index c8f4211de..3041f65a5 100644 --- a/modules/hostserv/on.cpp +++ b/modules/hostserv/on.cpp @@ -60,7 +60,7 @@ class CommandHSOn : public Command source.Reply(_("Your vhost of \002{0}\002 is now activated."), vhost->Mask()); Log(LOG_COMMAND, source, this) << "to enable their vhost of " << vhost->Mask(); - IRCD->SendVhost(u, vhost->GetIdent(), vhost->GetHost()); + IRCD->Send<messages::VhostSet>(u, vhost->GetIdent(), vhost->GetHost()); u->vhost = vhost->GetHost(); if (IRCD->CanSetVIdent && !vhost->GetIdent().empty()) u->SetVIdent(vhost->GetIdent()); diff --git a/modules/nickserv/ajoin.cpp b/modules/nickserv/ajoin.cpp index 5973c95ac..0d708143c 100644 --- a/modules/nickserv/ajoin.cpp +++ b/modules/nickserv/ajoin.cpp @@ -371,7 +371,7 @@ class NSAJoin : public Module { try { - unsigned limit = convertTo<unsigned>(l); + unsigned int limit = convertTo<unsigned int>(l); if (c->users.size() >= limit) need_invite = true; } @@ -384,10 +384,10 @@ class NSAJoin : public Module { if (!u_access.HasPriv("INVITE")) continue; - IRCD->SendInvite(NickServ, c, u); + IRCD->Send<messages::Invite>(NickServ, c, u); } - IRCD->SendSVSJoin(NickServ, u, entry->GetChannel(), key); + IRCD->Send<messages::SVSJoin>(NickServ, u, entry->GetChannel(), key); } } }; diff --git a/modules/nickserv/logout.cpp b/modules/nickserv/logout.cpp index 6a9d119ad..0e6cdb46a 100644 --- a/modules/nickserv/logout.cpp +++ b/modules/nickserv/logout.cpp @@ -68,7 +68,7 @@ class CommandNSLogout : public Command else source.Reply(_("You have been logged out.")); - IRCD->SendLogout(u2); + IRCD->Send<messages::Logout>(u2); u2->RemoveMode(source.service, "REGISTERED"); u2->Logout(); diff --git a/modules/nickserv/main/nickserv.cpp b/modules/nickserv/main/nickserv.cpp index 60b136db1..3741d119b 100644 --- a/modules/nickserv/main/nickserv.cpp +++ b/modules/nickserv/main/nickserv.cpp @@ -115,7 +115,7 @@ class NickServRelease : public User, public Timer NickServReleases.insert(std::make_pair(this->nick, this)); - IRCD->SendClientIntroduction(this); + IRCD->Send<messages::NickIntroduction>(this); } ~NickServRelease() @@ -168,7 +168,7 @@ class NickServCore : public Module, public NickServ::NickServService new NickServHeld(this, na, Config->GetModule("nickserv/main")->Get<time_t>("releasetimeout", "1m")); if (IRCD->CanSVSHold) - IRCD->SendSVSHold(na->GetNick(), Config->GetModule("nickserv/main")->Get<time_t>("releasetimeout", "1m")); + IRCD->Send<messages::SVSHold>(na->GetNick(), Config->GetModule("nickserv/main")->Get<time_t>("releasetimeout", "1m")); else new NickServRelease(this, na, Config->GetModule("nickserv/main")->Get<time_t>("releasetimeout", "1m")); } @@ -324,7 +324,7 @@ class NickServCore : public Module, public NickServ::NickServService else { u->SendMessage(*NickServ, _("Your nickname is now being changed to \002%s\002"), guestnick.c_str()); - IRCD->SendForceNickChange(u, guestnick, Anope::CurTime); + IRCD->Send<messages::SVSNick>(u, guestnick, Anope::CurTime); } } else @@ -338,7 +338,7 @@ class NickServCore : public Module, public NickServ::NickServService if (held.HasExt(na)) { if (IRCD->CanSVSHold) - IRCD->SendSVSHoldDel(na->GetNick()); + IRCD->Send<messages::SVSHoldDel>(na->GetNick()); else { User *u = User::Find(na->GetNick(), true); @@ -418,7 +418,7 @@ class NickServCore : public Module, public NickServ::NickServService User *u = User::Find(na->GetNick(), true); if (u && u->Account() == na->GetAccount()) { - IRCD->SendLogout(u); + IRCD->Send<messages::Logout>(u); u->RemoveMode(NickServ, "REGISTERED"); u->Logout(); } @@ -432,7 +432,7 @@ class NickServCore : public Module, public NickServ::NickServService for (unsigned int i = nc->users.size(); i > 0; --i) { User *user = nc->users[i - 1]; - IRCD->SendLogout(user); + IRCD->Send<messages::Logout>(user); user->RemoveMode(NickServ, "REGISTERED"); user->Logout(); EventManager::Get()->Dispatch(&Event::NickLogout::OnNickLogout, user); @@ -552,7 +552,7 @@ class NickServCore : public Module, public NickServ::NickServService else { /* Reset +r and re-send account (even though it really should be set at this point) */ - IRCD->SendLogin(u, na); + IRCD->Send<messages::Login>(u, na); if (!Config->GetModule("nickserv/main")->Get<bool>("nonicknameownership") && na->GetAccount() == u->Account() && !na->GetAccount()->IsUnconfirmed()) u->SetMode(NickServ, "REGISTERED"); Log(u, "", NickServ) << u->GetMask() << " automatically identified for group " << u->Account()->GetDisplay(); diff --git a/modules/nickserv/recover.cpp b/modules/nickserv/recover.cpp index f3fa24bb6..60a0bee2f 100644 --- a/modules/nickserv/recover.cpp +++ b/modules/nickserv/recover.cpp @@ -92,7 +92,7 @@ class NSRecoverRequestListener : public NickServ::IdentifyRequestListener source.Reply(_("Ghost with your nick has been killed.")); if (IRCD->CanSVSNick) - IRCD->SendForceNickChange(source.GetUser(), user, Anope::CurTime); + IRCD->Send<messages::SVSNick>(source.GetUser(), user, Anope::CurTime); } /* User is not identified or not identified to the same account as the person using this command */ else @@ -266,7 +266,7 @@ class NSRecover : public Module if (u->FindChannel(c)) this->OnJoinChannel(u, c); else if (IRCD->CanSVSJoin) - IRCD->SendSVSJoin(NickServ, u, cname, ""); + IRCD->Send<messages::SVSJoin>(NickServ, u, cname, ""); } } @@ -276,7 +276,7 @@ class NSRecover : public Module if (svs->from) { // svsnick from to to - IRCD->SendForceNickChange(svs->from, svs->to, Anope::CurTime); + IRCD->Send<messages::SVSNick>(svs->from, svs->to, Anope::CurTime); } svsnick.Unset(u); diff --git a/modules/nickserv/register.cpp b/modules/nickserv/register.cpp index 4ceb3f113..b06e08075 100644 --- a/modules/nickserv/register.cpp +++ b/modules/nickserv/register.cpp @@ -59,7 +59,7 @@ class CommandNSConfirm : public Command /* Login the users online already */ for (User *u : na->GetAccount()->users) { - IRCD->SendLogin(u, na); + IRCD->Send<messages::Login>(u, na); NickServ::Nick *u_na = NickServ::FindNick(u->nick); @@ -90,7 +90,7 @@ class CommandNSConfirm : public Command NickServ::Nick *na = NickServ::FindNick(source.GetNick()); if (na) { - IRCD->SendLogin(source.GetUser(), na); + IRCD->Send<messages::Login>(source.GetUser(), na); if (!Config->GetModule("nickserv/main")->Get<bool>("nonicknameownership") && na->GetAccount() == source.GetAccount() && !na->GetAccount()->IsUnconfirmed()) source.GetUser()->SetMode(source.service, "REGISTERED"); } diff --git a/modules/nickserv/set.cpp b/modules/nickserv/set.cpp index 136d43be8..c7d03f8d2 100644 --- a/modules/nickserv/set.cpp +++ b/modules/nickserv/set.cpp @@ -362,7 +362,7 @@ class CommandNSSetDisplay : public Command for (User *u : user_na->GetAccount()->users) { - IRCD->SendLogin(u, user_na); + IRCD->Send<messages::Login>(u, user_na); } source.Reply(_("The new display is now \002{0}\002."), user_na->GetAccount()->GetDisplay()); diff --git a/modules/operserv/jupe.cpp b/modules/operserv/jupe.cpp index 2f9386eda..882effa4f 100644 --- a/modules/operserv/jupe.cpp +++ b/modules/operserv/jupe.cpp @@ -57,11 +57,11 @@ class CommandOSJupe : public Command Anope::string sid = IRCD->SID_Retrieve(); if (server) { - IRCD->SendSquit(server, rbuf); + IRCD->Send<messages::SQuit>(server, rbuf); server->Delete(rbuf); } Server *juped_server = new Server(Me, jserver, 1, rbuf, sid, true); - IRCD->SendServer(juped_server); + IRCD->Send<messages::MessageServer>(juped_server); Log(LOG_ADMIN, source, this) << "on " << jserver << " (" << rbuf << ")"; } diff --git a/modules/operserv/main/operserv.cpp b/modules/operserv/main/operserv.cpp index 09dc3bbac..fc8dbf423 100644 --- a/modules/operserv/main/operserv.cpp +++ b/modules/operserv/main/operserv.cpp @@ -38,12 +38,12 @@ class SGLineManager : public XLineManager void Send(User *u, XLine *x) override { - IRCD->SendAkill(u, x); + IRCD->Send<messages::Akill>(u, x); } void SendDel(XLine *x) override { - IRCD->SendAkillDel(x); + IRCD->Send<messages::AkillDel>(x); } bool Check(User *u, XLine *x) override @@ -106,7 +106,7 @@ class SQLineManager : public XLineManager } else if (x->GetMask()[0] != '#' || IRCD->CanSQLineChannel) { - IRCD->SendSQLine(u, x); + IRCD->Send<messages::SQLine>(u, x); /* If it is an oper, assume they're walking it, otherwise kill for good measure */ if (u && !u->HasMode("OPER")) u->Kill(Config->GetClient("OperServ"), "Q-Lined: " + x->GetReason()); @@ -118,7 +118,7 @@ class SQLineManager : public XLineManager if (!IRCD->CanSQLine || x->IsRegex()) ; else if (x->GetMask()[0] != '#' || IRCD->CanSQLineChannel) - IRCD->SendSQLineDel(x); + IRCD->Send<messages::SQLineDel>(x); } bool Check(User *u, XLine *x) override @@ -168,7 +168,7 @@ class SNLineManager : public XLineManager void Send(User *u, XLine *x) override { if (IRCD->CanSNLine && !x->IsRegex()) - IRCD->SendSGLine(u, x); + IRCD->Send<messages::SGLine>(u, x); if (u) u->Kill(Config->GetClient("OperServ"), "SNLined: " + x->GetReason()); @@ -177,7 +177,7 @@ class SNLineManager : public XLineManager void SendDel(XLine *x) override { if (IRCD->CanSNLine && !x->IsRegex()) - IRCD->SendSGLineDel(x); + IRCD->Send<messages::SGLineDel>(x); } bool Check(User *u, XLine *x) override diff --git a/modules/operserv/noop.cpp b/modules/operserv/noop.cpp index 2d813a0cc..329a6c338 100644 --- a/modules/operserv/noop.cpp +++ b/modules/operserv/noop.cpp @@ -50,7 +50,7 @@ class CommandOSNOOP : public Command if (cmd.equals_ci("SET")) { /* Remove the O:lines */ - IRCD->SendSVSNOOP(s, true); + IRCD->Send<messages::NOOP>(s, true); s->Extend<Anope::string>("noop", source.GetNick()); Log(LOG_ADMIN, source, this) << "SET on " << s->GetName(); @@ -69,7 +69,7 @@ class CommandOSNOOP : public Command else if (cmd.equals_ci("REVOKE")) { s->Shrink<Anope::string>("noop"); - IRCD->SendSVSNOOP(s, false); + IRCD->Send<messages::NOOP>(s, false); Log(LOG_ADMIN, source, this) << "REVOKE on " << s->GetName(); source.Reply(_("All O:lines of \002{0}\002 have been reset."), s->GetName()); } diff --git a/modules/operserv/svs.cpp b/modules/operserv/svs.cpp index 81138740f..ccba9d8d1 100644 --- a/modules/operserv/svs.cpp +++ b/modules/operserv/svs.cpp @@ -69,7 +69,7 @@ class CommandOSSVSNick : public Command source.Reply(_("\002{0}\002 is now being changed to \002{1}\002."), nick, newnick); Log(LOG_ADMIN, source, this) << "to change " << nick << " to " << newnick; - IRCD->SendForceNickChange(u2, newnick, Anope::CurTime); + IRCD->Send<messages::SVSNick>(u2, newnick, Anope::CurTime); } bool OnHelp(CommandSource &source, const Anope::string &subcommand) override @@ -122,7 +122,7 @@ class CommandOSSVSJoin : public Command return; } - IRCD->SendSVSJoin(*source.service, target, params[1], ""); + IRCD->Send<messages::SVSJoin>(*source.service, target, params[1], ""); Log(LOG_ADMIN, source, this) << "to force " << target->nick << " to join " << params[1]; source.Reply(_("\002{0}\002 has been joined to \002{1}\002."), target->nick, params[1]); } @@ -178,7 +178,7 @@ class CommandOSSVSPart : public Command } const Anope::string &reason = params.size() > 2 ? params[2] : ""; - IRCD->SendSVSPart(*source.service, target, params[1], reason); + IRCD->Send<messages::SVSPart>(*source.service, target, params[1], reason); if (!reason.empty()) Log(LOG_ADMIN, source, this) << "to force " << target->nick << " to part " << c->name << " with reason " << reason; else diff --git a/modules/protocol/bahamut.cpp b/modules/protocol/bahamut.cpp index 46ffb3ea2..cdb05e7f7 100644 --- a/modules/protocol/bahamut.cpp +++ b/modules/protocol/bahamut.cpp @@ -23,103 +23,175 @@ #include "modules/protocol/rfc1459.h" #include "modules/protocol/bahamut.h" -class ChannelModeFlood : public ChannelModeParam +void bahamut::senders::Akill::Send(User* u, XLine* x) { - public: - ChannelModeFlood(char modeChar, bool minusNoArg) : ChannelModeParam("FLOOD", modeChar, minusNoArg) { } - - bool IsValid(Anope::string &value) const override + if (x->IsRegex() || x->HasNickOrReal()) { - try + if (!u) { - Anope::string rest; - if (!value.empty() && value[0] != ':' && convertTo<int>(value[0] == '*' ? value.substr(1) : value, rest, false) > 0 && rest[0] == ':' && rest.length() > 1 && convertTo<int>(rest.substr(1), rest, false) > 0 && rest.empty()) - return true; + /* No user (this akill was just added), and contains nick and/or realname. Find users that match and ban them */ + for (user_map::const_iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it) + if (x->GetManager()->Check(it->second, x)) + this->Send(it->second, x); + return; } - catch (const ConvertException &) { } - return false; + XLine *old = x; + + if (old->GetManager()->HasEntry("*@" + u->host)) + return; + + /* We can't akill x as it has a nick and/or realname included, so create a new akill for *@host */ + x = Serialize::New<XLine *>(); + x->SetMask("*@" + u->host); + x->SetBy(old->GetBy()); + x->SetExpires(old->GetExpires()); + x->SetReason(old->GetReason()); + x->SetID(old->GetID()); + old->GetManager()->AddXLine(x); + + Log(Config->GetClient("OperServ"), "akill") << "AKILL: Added an akill for " << x->GetMask() << " because " << u->GetMask() << "#" << u->realname << " matches " << old->GetMask(); } -}; -bahamut::Proto::Proto(Module *creator) : IRCDProto(creator, "Bahamut 1.8.x") -{ - DefaultPseudoclientModes = "+"; - CanSVSNick = true; - CanSNLine = true; - CanSQLine = true; - CanSQLineChannel = true; - CanSZLine = true; - CanSVSHold = true; - MaxModes = 60; + /* ZLine if we can instead */ + if (x->GetUser() == "*") + { + cidr a(x->GetHost()); + if (a.valid()) + { + IRCD->Send<messages::SZLine>(u, x); + return; + } + } + + // Calculate the time left before this would expire, capping it at 2 days + time_t timeleft = x->GetExpires() - Anope::CurTime; + if (timeleft > 172800) + timeleft = 172800; + + Uplink::Send("AKILL", x->GetHost(), x->GetUser(), timeleft, x->GetBy(), Anope::CurTime, x->GetReason()); } -void bahamut::Proto::SendMode(const MessageSource &source, Channel *dest, const Anope::string &buf) +void bahamut::senders::AkillDel::Send(XLine* x) { - if (Servers::Capab.count("TSMODE") > 0) + if (x->IsRegex() || x->HasNickOrReal()) + return; + + /* ZLine if we can instead */ + if (x->GetUser() == "*") { - IRCMessage message(source, "MODE", dest->name, dest->creation_time); - message.TokenizeAndPush(buf); - Uplink::SendMessage(message); + cidr a(x->GetHost()); + if (a.valid()) + { + IRCD->Send<messages::SZLineDel>(x); + return; + } } - else + + Uplink::Send("RAKKILL", x->GetHost(), x->GetUser()); +} + +void bahamut::senders::MessageChannel::Send(Channel* c) +{ + Anope::string modes = c->GetModes(true, true); + if (modes.empty()) + modes = "+"; + Uplink::Send("SJOIN", c->creation_time, c->name, modes, ""); +} + +void bahamut::senders::Join::Send(User* user, Channel* c, const ChannelStatus* status) +{ + Uplink::Send(user, "SJOIN", c->creation_time, c->name); + + if (status) { - IRCDProto::SendMode(source, dest, buf); + /* First save the channel status incase uc->Status == status */ + ChannelStatus cs = *status; + /* If the user is internally on the channel with flags, kill them so that + * the stacker will allow this. + */ + ChanUserContainer *uc = c->FindUser(user); + if (uc != NULL) + uc->status.Clear(); + + ServiceBot *setter = ServiceBot::Find(user->GetUID()); + for (size_t i = 0; i < cs.Modes().length(); ++i) + c->SetMode(setter, ModeManager::FindChannelModeByChar(cs.Modes()[i]), user->GetUID(), false); + + if (uc != NULL) + uc->status = cs; } } -void bahamut::Proto::SendMode(const MessageSource &source, User *u, const Anope::string &buf) +void bahamut::senders::Kill::Send(const MessageSource &source, const Anope::string &target, const Anope::string &reason) { - IRCMessage message(source, "SVSMODE", u->nick, u->timestamp); - message.TokenizeAndPush(buf); - Uplink::SendMessage(message); + Uplink::Send(source, "SVSKILL", target, reason); +} + +/* + Note: if the stamp is null 0, the below usage is correct of Bahamut +*/ +void bahamut::senders::Kill::Send(const MessageSource &source, User *user, const Anope::string &reason) +{ + Uplink::Send(source, "SVSKILL", user->nick, reason); } -void bahamut::Proto::SendGlobalNotice(ServiceBot *bi, Server *dest, const Anope::string &msg) +void bahamut::senders::Login::Send(User *u, NickServ::Nick *na) { - Uplink::Send(bi, "NOTICE", "$" + dest->GetName(), msg); + IRCD->SendMode(Config->GetClient("NickServ"), u, "+d {0}", u->signon); } -void bahamut::Proto::SendGlobalPrivmsg(ServiceBot *bi, Server *dest, const Anope::string &msg) +void bahamut::senders::Logout::Send(User *u) { - Uplink::Send(bi, "PRIVMSG", "$" + dest->GetName(), msg); + IRCD->SendMode(Config->GetClient("NickServ"), u, "+d 1"); } -/* SVSHOLD - set */ -void bahamut::Proto::SendSVSHold(const Anope::string &nick, time_t time) +void bahamut::senders::ModeChannel::Send(const MessageSource &source, Channel *channel, const Anope::string &modes) { - Uplink::Send(Me, "SVSHOLD", nick, time, "Being held for registered user"); + IRCMessage message(source, "MODE", channel->name, channel->creation_time); + message.TokenizeAndPush(modes); + Uplink::SendMessage(message); } -/* SVSHOLD - release */ -void bahamut::Proto::SendSVSHoldDel(const Anope::string &nick) +void bahamut::senders::ModeUser::Send(const MessageSource &source, User *user, const Anope::string &modes) { - Uplink::Send(Me, "SVSHOLD", nick, 0); + IRCMessage message(source, "SVSMODE", user->nick, user->timestamp); + message.TokenizeAndPush(modes); + Uplink::SendMessage(message); } -/* SQLINE */ -void bahamut::Proto::SendSQLine(User *, XLine *x) +void bahamut::senders::NickIntroduction::Send(User *user) { - Uplink::Send(Me, "SQLINE", x->GetMask(), x->GetReason()); + Anope::string modes = "+" + user->GetModes(); + Uplink::Send("NICK", user->nick, 1, user->timestamp, modes, user->GetIdent(), user->host, user->server->GetName(), 0, 0, user->realname); +} + +void bahamut::senders::NOOP::Send(Server* server, bool set) +{ + Uplink::Send("SVSNOOP", server->GetSID(), set ? "+" : "-"); +} + +void bahamut::senders::SGLine::Send(User*, XLine* x) +{ + Uplink::Send("SGLINE", x->GetMask().length(), x->GetMask() + ":" + x->GetReason()); } -/* UNSLINE */ -void bahamut::Proto::SendSGLineDel(XLine *x) +void bahamut::senders::SGLineDel::Send(XLine* x) { Uplink::Send("UNSGLINE", 0, x->GetMask()); } -/* UNSZLINE */ -void bahamut::Proto::SendSZLineDel(XLine *x) +void bahamut::senders::SQLine::Send(User*, XLine* x) { - /* this will likely fail so its only here for legacy */ - Uplink::Send("UNSZLINE", 0, x->GetHost()); - /* this is how we are supposed to deal with it */ - Uplink::Send("RAKILL", x->GetHost(), "*"); + Uplink::Send(Me, "SQLINE", x->GetMask(), x->GetReason()); +} + +void bahamut::senders::SQLineDel::Send(XLine* x) +{ + Uplink::Send("UNSQLINE", x->GetMask()); } -/* SZLINE */ -void bahamut::Proto::SendSZLine(User *, XLine *x) +void bahamut::senders::SZLine::Send(User*, XLine* x) { // Calculate the time left before this would expire, capping it at 2 days time_t timeleft = x->GetExpires() - Anope::CurTime; @@ -131,130 +203,69 @@ void bahamut::Proto::SendSZLine(User *, XLine *x) Uplink::Send("AKILL", x->GetHost(), "*", timeleft, x->GetBy(), Anope::CurTime, x->GetReason()); } -/* SVSNOOP */ -void bahamut::Proto::SendSVSNOOP(Server *server, bool set) +void bahamut::senders::SZLineDel::Send(XLine* x) { - Uplink::Send("SVSNOOP", server->GetName(), set ? "+" : "-"); + /* this will likely fail so its only here for legacy */ + Uplink::Send("UNSZLINE", 0, x->GetHost()); + /* this is how we are supposed to deal with it */ + Uplink::Send("RAKILL", x->GetHost(), "*"); } -/* SGLINE */ -void bahamut::Proto::SendSGLine(User *, XLine *x) +void bahamut::senders::SVSHold::Send(const Anope::string& nick, time_t t) { - Uplink::Send("SGLINE", x->GetMask().length(), x->GetMask() + ":" + x->GetReason()); + Uplink::Send(Me, "SVSHOLD", nick, t, "Being held for registered user"); } -/* RAKILL */ -void bahamut::Proto::SendAkillDel(XLine *x) +void bahamut::senders::SVSHoldDel::Send(const Anope::string& nick) { - if (x->IsRegex() || x->HasNickOrReal()) - return; - - /* ZLine if we can instead */ - if (x->GetUser() == "*") - { - cidr a(x->GetHost()); - if (a.valid()) - { - IRCD->SendSZL |
