summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSadie Powell <sadie@witchery.services>2025-05-03 18:41:59 +0100
committerSadie Powell <sadie@witchery.services>2025-05-03 18:41:59 +0100
commitf0b26c9b44de2e96713acdfca824828b0b9976ec (patch)
tree07f55a9e5d0078c2c153b6765f772f7bea8e0653
parentf953f7f006b8ceb6fc3f0885308c040f71a48a47 (diff)
Drop support for Bahamut as it has no non-DALnet users.
Closes #438.
-rw-r--r--data/anope.example.conf1
-rw-r--r--data/stats.standalone.example.conf1
-rw-r--r--docs/README1
-rw-r--r--modules/database/db_atheme.cpp17
-rw-r--r--modules/protocol/bahamut.cpp554
5 files changed, 1 insertions, 573 deletions
diff --git a/data/anope.example.conf b/data/anope.example.conf
index e8e587b97..ca7c70a20 100644
--- a/data/anope.example.conf
+++ b/data/anope.example.conf
@@ -259,7 +259,6 @@ serverinfo
* You MUST modify this to match the IRCd you run.
*
* Supported:
- * - bahamut
* - hybrid
* - inspircd
* - ngircd
diff --git a/data/stats.standalone.example.conf b/data/stats.standalone.example.conf
index a85099529..c769201b1 100644
--- a/data/stats.standalone.example.conf
+++ b/data/stats.standalone.example.conf
@@ -256,7 +256,6 @@ serverinfo
* You MUST modify this to match the IRCd you run.
*
* Supported:
- * - bahamut
* - hybrid
* - inspircd
* - ngircd
diff --git a/docs/README b/docs/README
index 09ce8e0bf..916d7b4f8 100644
--- a/docs/README
+++ b/docs/README
@@ -166,7 +166,6 @@ Table of Contents
Anope currently works with:
- * Bahamut 2.0 or later
* InspIRCd 3 or later
* ircd-hybrid 8.2.34 or later
* ircd-ratbox 3 or later
diff --git a/modules/database/db_atheme.cpp b/modules/database/db_atheme.cpp
index 2eb8642aa..950432d10 100644
--- a/modules/database/db_atheme.cpp
+++ b/modules/database/db_atheme.cpp
@@ -286,22 +286,7 @@ private:
data->mlocks.emplace_back("REGISTERED", set);
// Atheme also supports per-ircd values here (ew).
- if (IRCD->owner->name == "bahamut")
- {
- if (locks & 0x1000u)
- data->mlocks.emplace_back("BLOCKCOLOR", set);
- if (locks & 0x2000u)
- data->mlocks.emplace_back("REGMODERATED", set);
- if (locks & 0x4000u)
- data->mlocks.emplace_back("REGISTEREDONLY", set);
- if (locks & 0x8000u)
- data->mlocks.emplace_back("OPERONLY", set);
-
- // Anope doesn't recognise the following Bahamut modes currently:
- // - 0x10000u ('A')
- // - 0x20000u ('P')
- }
- else if (IRCD->owner->name == "inspircd")
+ if (IRCD->owner->name == "inspircd")
{
if (locks & 0x1000u)
data->mlocks.emplace_back("BLOCKCOLOR", set);
diff --git a/modules/protocol/bahamut.cpp b/modules/protocol/bahamut.cpp
deleted file mode 100644
index 39ae522f3..000000000
--- a/modules/protocol/bahamut.cpp
+++ /dev/null
@@ -1,554 +0,0 @@
-/* Bahamut functions
- *
- * (C) 2003-2025 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-#include "module.h"
-
-class ChannelModeFlood final
- : public ChannelModeParam
-{
-public:
- ChannelModeFlood(char modeChar, bool minusNoArg) : ChannelModeParam("FLOOD", modeChar, minusNoArg) { }
-
- bool IsValid(Anope::string &value) const override
- {
- if (value.empty() || value[0] == ':')
- return false;
-
- Anope::string rest;
- auto num1 = Anope::Convert<int>(value[0] == '*' ? value.substr(1) : value, 0, &rest);
- if (num1 <= 0 || rest[0] != ':' || rest.length() <= 1)
- return false;
-
- return Anope::Convert<int>(rest.substr(1), 0, &rest) > 0 && rest.empty();
- }
-};
-
-class BahamutIRCdProto final
- : public IRCDProto
-{
-public:
- BahamutIRCdProto(Module *creator) : IRCDProto(creator, "Bahamut 2+")
- {
- DefaultPseudoclientModes = "+";
- CanSVSNick = true;
- CanSVSNOOP = true;
- CanSNLine = true;
- CanSQLine = true;
- CanSQLineChannel = true;
- CanSZLine = true;
- CanSVSHold = true;
- MaxModes = 60;
- }
-
- void SendModeInternal(const MessageSource &source, Channel *chan, const Anope::string &modes, const std::vector<Anope::string> &values) override
- {
- auto params = values;
- params.insert(params.begin(), { chan->name, Anope::ToString(chan->created), modes });
- Uplink::SendInternal({}, source, "MODE", params);
- }
-
- void SendModeInternal(const MessageSource &source, User *u, const Anope::string &modes, const std::vector<Anope::string> &values) override
- {
- auto params = values;
- params.insert(params.begin(), { u->nick, Anope::ToString(u->timestamp), modes });
- Uplink::SendInternal({}, source, "SVSMODE", params);
- }
-
- void SendGlobalNotice(BotInfo *bi, const Server *dest, const Anope::string &msg) override
- {
- Uplink::Send(bi, "NOTICE", "$" + dest->GetName(), msg);
- }
-
- void SendGlobalPrivmsg(BotInfo *bi, const Server *dest, const Anope::string &msg) override
- {
- Uplink::Send(bi, "PRIVMSG", "$" + dest->GetName(), msg);
- }
-
- /* SVSHOLD - set */
- void SendSVSHold(const Anope::string &nick, time_t time) override
- {
- Uplink::Send("SVSHOLD", nick, time, "Being held for a registered user");
- }
-
- /* SVSHOLD - release */
- void SendSVSHoldDel(const Anope::string &nick) override
- {
- Uplink::Send("SVSHOLD", nick, 0);
- }
-
- /* SQLINE */
- void SendSQLine(User *, const XLine *x) override
- {
- Uplink::Send("SQLINE", x->mask, x->reason);
- }
-
- /* UNSLINE */
- void SendSGLineDel(const XLine *x) override
- {
- Uplink::Send("UNSGLINE", 0, x->mask);
- }
-
- /* UNSZLINE */
- void SendSZLineDel(const XLine *x) override
- {
- Uplink::Send("RAKILL", x->GetHost(), '*');
- }
-
- /* SZLINE */
- void SendSZLine(User *, const XLine *x) override
- {
- // Calculate the time left before this would expire
- time_t timeleft = x->expires ? x->expires - Anope::CurTime : x->expires;
- Uplink::Send("AKILL", x->GetHost(), '*', timeleft, x->by, Anope::CurTime, x->GetReason());
- }
-
- /* SVSNOOP */
- void SendSVSNOOP(const Server *server, bool set) override
- {
- Uplink::Send("SVSNOOP", server->GetName(), set ? '+' : '-');
- }
-
- /* SGLINE */
- void SendSGLine(User *, const XLine *x) override
- {
- Uplink::Send("SGLINE", x->mask.length(), x->mask, x->GetReason());
- }
-
- /* RAKILL */
- void SendAkillDel(const XLine *x) override
- {
- if (x->IsRegex() || x->HasNickOrReal())
- return;
-
- /* ZLine if we can instead */
- if (x->GetUser() == "*")
- {
- cidr a(x->GetHost());
- if (a.valid())
- {
- IRCD->SendSZLineDel(x);
- return;
- }
- }
-
- Uplink::Send("RAKILL", x->GetHost(), x->GetUser());
- }
-
- /* TOPIC */
- void SendTopic(const MessageSource &source, Channel *c) override
- {
- Uplink::Send(source, "TOPIC", c->name, c->topic_setter, c->topic_ts, c->topic);
- }
-
- /* UNSQLINE */
- void SendSQLineDel(const XLine *x) override
- {
- Uplink::Send("UNSQLINE", x->mask);
- }
-
- /* JOIN - SJOIN */
- void SendJoin(User *user, Channel *c, const ChannelStatus *status) override
- {
- Uplink::Send(user, "SJOIN", c->created, c->name);
- if (status)
- {
- /* 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();
-
- BotInfo *setter = BotInfo::Find(user->GetUID());
- for (auto mode : cs.Modes())
- c->SetMode(setter, ModeManager::FindChannelModeByChar(mode), user->GetUID(), false);
-
- if (uc != NULL)
- uc->status = cs;
- }
- }
-
- void SendAkill(User *u, XLine *x) override
- {
- if (x->IsRegex() || x->HasNickOrReal())
- {
- if (!u)
- {
- /* No user (this akill was just added), and contains nick and/or realname. Find users that match and ban them */
- for (const auto &[_, user] : UserListByNick)
- if (x->manager->Check(user, x))
- this->SendAkill(user, x);
- return;
- }
-
- const XLine *old = x;
-
- if (old->manager->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 = new XLine("*@" + u->host, old->by, old->expires, old->reason, old->id);
- old->manager->AddXLine(x);
-
- Log(Config->GetClient("OperServ"), "akill") << "AKILL: Added an akill for " << x->mask << " because " << u->GetMask() << "#" << u->realname << " matches " << old->mask;
- }
-
- /* ZLine if we can instead */
- if (x->GetUser() == "*")
- {
- cidr a(x->GetHost());
- if (a.valid())
- {
- IRCD->SendSZLine(u, x);
- return;
- }
- }
-
- // Calculate the time left before this would expire
- time_t timeleft = x->expires ? x->expires - Anope::CurTime : x->expires;
- Uplink::Send("AKILL", x->GetHost(), x->GetUser(), timeleft, x->by, Anope::CurTime, x->reason);
- }
-
- /*
- Note: if the stamp is null 0, the below usage is correct of Bahamut
- */
- void SendSVSKill(const MessageSource &source, User *user, const Anope::string &buf) override
- {
- Uplink::Send(source, "SVSKILL", user->nick, buf);
- }
-
- void SendBOB() override
- {
- Uplink::Send("BURST");
- }
-
- void SendEOB() override
- {
- Uplink::Send("BURST", 0);
- }
-
- void SendClientIntroduction(User *u) override
- {
- Uplink::Send("NICK", u->nick, 1, u->timestamp, "+" + u->GetModes(), u->GetIdent(), u->host, u->server->GetName(), 0, "0.0.0.0", u->realname);
- }
-
- /* SERVER */
- void SendServer(const Server *server) override
- {
- Uplink::Send("SERVER", server->GetName(), server->GetHops(), server->GetDescription());
- }
-
- void SendConnect() override
- {
- Uplink::Send("PASS", Config->Uplinks[Anope::CurrentUplink].password, "TS");
- Uplink::Send("CAPAB", "BURST", "NICKIPSTR", "SSJOIN", "UNCONNECT");
- SendServer(Me);
- /*
- * SVINFO
- * parv[0] = sender prefix
- * parv[1] = TS_CURRENT for the server
- * parv[2] = TS_MIN for the server
- * parv[3] = server is standalone or connected to non-TS only
- * parv[4] = server's idea of UTC time
- */
- Uplink::Send("SVINFO", 5, 5, 0, Anope::CurTime);
- this->SendBOB();
- }
-
- void SendChannel(Channel *c) override
- {
- Uplink::Send("SJOIN", c->created, c->name, "+" + c->GetModes(true, true), "");
- }
-
- void SendLogin(User *u, NickAlias *) override
- {
- IRCD->SendMode(Config->GetClient("NickServ"), u, "+d", u->signon);
- }
-
- void SendLogout(User *u) override
- {
- IRCD->SendMode(Config->GetClient("NickServ"), u, "+d", 1);
- }
-};
-
-struct IRCDMessageBurst final
- : IRCDMessage
-{
- IRCDMessageBurst(Module *creator) : IRCDMessage(creator, "BURST", 0) { SetFlag(FLAG_REQUIRE_SERVER); SetFlag(FLAG_SOFT_LIMIT); }
-
- void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
- {
- /* If we found a server with the given source, that one just
- * finished bursting. If there was no source, then our uplink
- * server finished bursting. -GD
- */
- Server *s = source.GetServer();
- if (!s)
- s = Me->GetLinks().front();
- if (s)
- s->Sync(true);
- }
-};
-
-struct IRCDMessageMode final
- : IRCDMessage
-{
- IRCDMessageMode(Module *creator, const Anope::string &sname) : IRCDMessage(creator, sname, 2) { SetFlag(FLAG_SOFT_LIMIT); }
-
- void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
- {
- if (params.size() > 2 && IRCD->IsChannelValid(params[0]))
- {
- Channel *c = Channel::Find(params[0]);
- auto ts = IRCD->ExtractTimestamp(params[1]);
-
- if (c)
- c->SetModesInternal(source, params[2], { params.begin() + 3, params.end() }, ts);
- }
- else
- {
- User *u = User::Find(params[0]);
- if (u)
- u->SetModesInternal(source, params[1]);
- }
- }
-};
-
-/*
- ** NICK - new
- ** source = NULL
- ** parv[0] = nickname
- ** parv[1] = hopcount
- ** parv[2] = timestamp
- ** parv[3] = modes
- ** parv[4] = username
- ** parv[5] = hostname
- ** parv[6] = server
- ** parv[7] = servicestamp
- ** parv[8] = IP
- ** parv[9] = info
- ** NICK - change
- ** source = oldnick
- ** parv[0] = new nickname
- ** parv[1] = hopcount
- */
-struct IRCDMessageNick final
- : IRCDMessage
-{
- IRCDMessageNick(Module *creator) : IRCDMessage(creator, "NICK", 2) { SetFlag(FLAG_SOFT_LIMIT); }
-
- void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
- {
- if (params.size() == 10)
- {
- Server *s = Server::Find(params[6]);
- if (s == NULL)
- {
- Log(LOG_DEBUG) << "User " << params[0] << " introduced from nonexistent server " << params[6] << "?";
- return;
- }
-
- NickAlias *na = NULL;
- auto signon = IRCD->ExtractTimestamp(params[2]);
- auto stamp = IRCD->ExtractTimestamp(params[7]);
- if (signon && signon == stamp)
- na = NickAlias::Find(params[0]);
-
- User::OnIntroduce(params[0], params[4], params[5], "", params[8], s, params[9], signon, params[3], "", na ? *na->nc : NULL);
- }
- else
- {
- User *u = source.GetUser();
-
- if (u)
- u->ChangeNick(params[0]);
- }
- }
-};
-
-struct IRCDMessageServer final
- : IRCDMessage
-{
- IRCDMessageServer(Module *creator) : IRCDMessage(creator, "SERVER", 3) { SetFlag(FLAG_REQUIRE_SERVER); }
-
- void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
- {
- auto hops = Anope::Convert<unsigned>(params[1], 0);
- new Server(source.GetServer() == NULL ? Me : source.GetServer(), params[0], hops, params[2]);
- }
-};
-
-struct IRCDMessageSJoin final
- : IRCDMessage
-{
- IRCDMessageSJoin(Module *creator) : IRCDMessage(creator, "SJOIN", 2) { SetFlag(FLAG_SOFT_LIMIT); }
-
- void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
- {
- Anope::string modes;
- std::vector<Anope::string> modeparams;
- if (params.size() >= 4)
- {
- modes = params[2];
- modeparams = { params.begin() + 3, params.end() };
- }
-
- std::list<Message::Join::SJoinUser> users;
-
- /* For some reason, bahamut will send a SJOIN from the user joining a channel
- * if the channel already existed
- */
- if (source.GetUser())
- {
- Message::Join::SJoinUser sju;
- sju.second = source.GetUser();
- users.push_back(sju);
- }
- else
- {
- spacesepstream sep(params[params.size() - 1]);
- Anope::string buf;
-
- while (sep.GetToken(buf))
- {
- Message::Join::SJoinUser sju;
-
- /* Get prefixes from the nick */
- for (char ch; (ch = ModeManager::GetStatusChar(buf[0]));)
- {
- buf.erase(buf.begin());
- sju.first.AddMode(ch);
- }
-
- sju.second = User::Find(buf);
- if (!sju.second)
- {
- Log(LOG_DEBUG) << "SJOIN for nonexistent user " << buf << " on " << params[1];
- continue;
- }
-
- users.push_back(sju);
- }
- }
-
- auto ts = IRCD->ExtractTimestamp(params[0]);
- Message::Join::SJoin(source, params[1], ts, modes, modeparams, users);
- }
-};
-
-struct IRCDMessageTopic final
- : IRCDMessage
-{
- IRCDMessageTopic(Module *creator) : IRCDMessage(creator, "TOPIC", 4) { }
-
- void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
- {
- Channel *c = Channel::Find(params[0]);
- if (c)
- c->ChangeTopicInternal(source.GetUser(), params[1], params[3], IRCD->ExtractTimestamp(params[2]));
- }
-};
-
-class ProtoBahamut final
- : public Module
-{
- BahamutIRCdProto ircd_proto;
-
- /* Core message handlers */
- Message::Away message_away;
- Message::Capab message_capab;
- Message::Error message_error;
- Message::Invite message_invite;
- Message::Join message_join;
- Message::Kick message_kick;
- Message::Kill message_kill;
- Message::MOTD message_motd;
- Message::Notice message_notice;
- Message::Part message_part;
- Message::Ping message_ping;
- Message::Privmsg message_privmsg;
- Message::Quit message_quit;
- Message::SQuit message_squit;
- Message::Stats message_stats;
- Message::Time message_time;
- Message::Version message_version;
- Message::Whois message_whois;
-
- /* Our message handlers */
- IRCDMessageBurst message_burst;
- IRCDMessageMode message_mode, message_svsmode;
- IRCDMessageNick message_nick;
- IRCDMessageServer message_server;
- IRCDMessageSJoin message_sjoin;
- IRCDMessageTopic message_topic;
-
- static void AddModes()
- {
- /* Add user modes */
- ModeManager::AddUserMode(new UserModeOperOnly("SERV_ADMIN", 'A'));
- ModeManager::AddUserMode(new UserMode("REGPRIV", 'R'));
- ModeManager::AddUserMode(new UserModeOperOnly("ADMIN", 'a'));
- ModeManager::AddUserMode(new UserMode("INVIS", 'i'));
- ModeManager::AddUserMode(new UserModeOperOnly("OPER", 'o'));
- ModeManager::AddUserMode(new UserModeNoone("REGISTERED", 'r'));
- ModeManager::AddUserMode(new UserModeOperOnly("SNOMASK", 's'));
- ModeManager::AddUserMode(new UserModeOperOnly("WALLOPS", 'w'));
- ModeManager::AddUserMode(new UserMode("DEAF", 'd'));
-
- /* b/e/I */
- ModeManager::AddChannelMode(new ChannelModeList("BAN", 'b'));
-
- /* v/h/o/a/q */
- ModeManager::AddChannelMode(new ChannelModeStatus("VOICE", 'v', '+', 0));
- ModeManager::AddChannelMode(new ChannelModeStatus("HALFOP", 'h', '%', 1));
- ModeManager::AddChannelMode(new ChannelModeStatus("OP", 'o', '@', 1));
-
- /* Add channel modes */
- ModeManager::AddChannelMode(new ChannelMode("BLOCKCOLOR", 'c'));
- ModeManager::AddChannelMode(new ChannelMode("INVITE", 'i'));
- ModeManager::AddChannelMode(new ChannelModeFlood('f', false));
- ModeManager::AddChannelMode(new ChannelModeKey('k'));
- ModeManager::AddChannelMode(new ChannelModeParam("LIMIT", 'l', true));
- ModeManager::AddChannelMode(new ChannelMode("MODERATED", 'm'));
- ModeManager::AddChannelMode(new ChannelMode("NOEXTERNAL", 'n'));
- ModeManager::AddChannelMode(new ChannelMode("PRIVATE", 'p'));
- ModeManager::AddChannelMode(new ChannelModeNoone("REGISTERED", 'r'));
- ModeManager::AddChannelMode(new ChannelMode("SECRET", 's'));
- ModeManager::AddChannelMode(new ChannelMode("TOPIC", 't'));
- ModeManager::AddChannelMode(new ChannelMode("REGMODERATED", 'M'));
- ModeManager::AddChannelMode(new ChannelModeOperOnly("OPERONLY", 'O'));
- ModeManager::AddChannelMode(new ChannelMode("REGISTEREDONLY", 'R'));
- }
-
-public:
- ProtoBahamut(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR),
- ircd_proto(this),
- message_away(this), message_capab(this), message_error(this), message_invite(this),
- message_join(this), message_kick(this), message_kill(this), message_motd(this), message_notice(this),
- message_part(this), message_ping(this), message_privmsg(this), message_quit(this),
- message_squit(this), message_stats(this), message_time(this), message_version(this), message_whois(this),
-
- message_burst(this), message_mode(this, "MODE"), message_svsmode(this, "SVSMODE"),
- message_nick(this), message_server(this), message_sjoin(this), message_topic(this)
- {
- this->AddModes();
- }
-
- void OnUserNickChange(User *u, const Anope::string &) override
- {
- u->RemoveModeInternal(Me, ModeManager::FindUserModeByName("REGISTERED"));
- IRCD->SendLogout(u);
- }
-};
-
-MODULE_INIT(ProtoBahamut)