diff options
author | Sadie Powell <sadie@witchery.services> | 2025-05-10 14:15:27 +0100 |
---|---|---|
committer | Sadie Powell <sadie@witchery.services> | 2025-05-27 15:30:09 +0100 |
commit | 50030e07fa51d3e8970ca044bf745f513501bfee (patch) | |
tree | 01eb1ac77e61314301688af9c081e46abcda9f38 | |
parent | 7b2f0f579016f2d8cc8c919704cf1f75d74558db (diff) |
-rw-r--r-- | include/bots.h | 2 | ||||
-rw-r--r-- | src/bots.cpp | 30 | ||||
-rw-r--r-- | src/messages.cpp | 13 |
3 files changed, 35 insertions, 10 deletions
diff --git a/include/bots.h b/include/bots.h index 6d0320a1c..55dde5bbe 100644 --- a/include/bots.h +++ b/include/bots.h @@ -41,6 +41,8 @@ public: time_t lastmsg; /* Map of actual command names -> service name/permission required */ CommandInfo::map commands; + /** CTCP responses this bot can send. */ + Anope::map<std::function<void(BotInfo *, User *, const Anope::string &)>> ctcps; /* The server-side alias used to message this bot. */ Anope::string alias; /* Modes the bot should have as configured in service:modes */ diff --git a/src/bots.cpp b/src/bots.cpp index 3c203849f..6db542dd3 100644 --- a/src/bots.cpp +++ b/src/bots.cpp @@ -34,6 +34,36 @@ BotInfo::BotInfo(const Anope::string &nnick, const Anope::string &nuser, const A if (!this->uid.empty()) (*BotListByUID)[this->uid] = this; + ctcps.emplace("CLIENTINFO", [this](auto *bi, auto *u, const auto &) + { + Anope::string buf; + for (const auto &[ctcp, _] : this->ctcps) + { + if (!buf.empty()) + buf.push_back(' '); + buf.append(ctcp.upper()); + } + IRCD->SendNotice(bi, u->GetUID(), Anope::FormatCTCP("CLIENTINFO", buf)); + }); + ctcps.emplace("PING", [](auto *bi, auto *u, const auto &ctcpbody) + { + IRCD->SendNotice(bi, u->GetUID(), Anope::FormatCTCP("PING", ctcpbody)); + }); + ctcps.emplace("SOURCE", [](auto *bi, auto *u, const auto &) + { + IRCD->SendNotice(bi, u->GetUID(), Anope::FormatCTCP("SOURCE", "https://www.anope.org/")); + }); + ctcps.emplace("TIME", [](auto *bi, auto *u, const auto &) + { + IRCD->SendNotice(bi, u->GetUID(), Anope::FormatCTCP("TIME", Anope::strftime(Anope::CurTime, nullptr, true))); + }); + ctcps.emplace("VERSION", [](auto *bi, auto *u, const auto &) + { + auto *enc = ModuleManager::FindFirstOf(ENCRYPTION); + IRCD->SendNotice(bi, u->GetUID(), Anope::FormatCTCP("VERSION", Anope::printf("Anope-%s %s -- %s -- %s", Anope::Version().c_str(), + Anope::VersionBuildString().c_str(), IRCD->GetProtocolName().c_str(), enc ? enc->name.c_str() : "(none)"))); + }); + FOREACH_MOD(OnCreateBot, (this)); // If we're synchronised with the uplink already, send the bot. diff --git a/src/messages.cpp b/src/messages.cpp index 2ed52b3e7..ec2b255f8 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -340,16 +340,9 @@ void Privmsg::Run(MessageSource &source, const std::vector<Anope::string> ¶m Anope::string ctcpname, ctcpbody; if (Anope::ParseCTCP(message, ctcpname, ctcpbody)) { - if (ctcpname.equals_ci("PING")) - { - IRCD->SendNotice(bi, u->nick, Anope::FormatCTCP("PING", ctcpbody)); - } - else if (ctcpname.equals_ci("VERSION")) - { - Module *enc = ModuleManager::FindFirstOf(ENCRYPTION); - IRCD->SendNotice(bi, u->nick, Anope::FormatCTCP("VERSION", Anope::printf("Anope-%s %s -- %s -- %s", Anope::Version().c_str(), - Anope::VersionBuildString().c_str(), IRCD->GetProtocolName().c_str(), enc ? enc->name.c_str() : "(none)"))); - } + auto ctcpit = bi->ctcps.find(ctcpname); + if (ctcpit != bi->ctcps.end()) + ctcpit->second(bi, u, ctcpbody); return; } |