summaryrefslogtreecommitdiff
path: root/src/protocol/ratbox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/protocol/ratbox.cpp')
-rw-r--r--src/protocol/ratbox.cpp899
1 files changed, 0 insertions, 899 deletions
diff --git a/src/protocol/ratbox.cpp b/src/protocol/ratbox.cpp
deleted file mode 100644
index 80065222d..000000000
--- a/src/protocol/ratbox.cpp
+++ /dev/null
@@ -1,899 +0,0 @@
-/* Ratbox IRCD functions
- *
- * (C) 2003-2010 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for furhter details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-#include "services.h"
-#include "modules.h"
-
-static char *TS6UPLINK = NULL; // XXX is this needed?
-
-IRCDVar myIrcd[] = {
- {"Ratbox 2.0+", /* ircd name */
- "+oi", /* Modes used by pseudoclients */
- 2, /* Chan Max Symbols */
- "+o", /* Channel Umode used by Botserv bots */
- 0, /* SVSNICK */
- 0, /* Vhost */
- 1, /* Supports SNlines */
- 1, /* Supports SQlines */
- 0, /* Supports SZlines */
- 3, /* Number of server args */
- 1, /* Join 2 Set */
- 1, /* Join 2 Message */
- 0, /* TS Topic Forward */
- 0, /* TS Topci Backward */
- 1, /* Chan SQlines */
- 0, /* Quit on Kill */
- 0, /* SVSMODE unban */
- 0, /* Reverse */
- 0, /* vidents */
- 0, /* svshold */
- 0, /* time stamp on mode */
- 0, /* NICKIP */
- 0, /* UMODE */
- 0, /* O:LINE */
- 0, /* VHOST ON NICK */
- 0, /* Change RealName */
- 0, /* No Knock requires +i */
- 0, /* We support TOKENS */
- 0, /* TIME STAMPS are BASE64 */
- 0, /* Can remove User Channel Modes with SVSMODE */
- 0, /* Sglines are not enforced until user reconnects */
- 1, /* ts6 */
- 0, /* p10 */
- 0, /* CIDR channelbans */
- "$$", /* TLD Prefix for Global */
- 4, /* Max number of modes we can send per line */
- }
- ,
- {NULL}
-};
-
-/*
- * 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
- */
-void ratbox_cmd_svinfo()
-{
- send_cmd(NULL, "SVINFO 6 3 0 :%ld", static_cast<long>(time(NULL)));
-}
-
-void ratbox_cmd_svsinfo()
-{
-}
-
-void ratbox_cmd_tmode(const char *source, const char *dest, const char *fmt, ...)
-{
- va_list args;
- char buf[BUFSIZE];
- *buf = '\0';
-
- if (fmt)
- {
- va_start(args, fmt);
- vsnprintf(buf, BUFSIZE - 1, fmt, args);
- va_end(args);
- }
- if (!*buf)
- return;
-
- send_cmd(NULL, "MODE %s %s", dest, buf);
-}
-
-
-/* CAPAB */
-/*
- QS - Can handle quit storm removal
- EX - Can do channel +e exemptions
- CHW - Can do channel wall @#
- LL - Can do lazy links
- IE - Can do invite exceptions
- EOB - Can do EOB message
- KLN - Can do KLINE message
- GLN - Can do GLINE message
- HUB - This server is a HUB
- UID - Can do UIDs
- ZIP - Can do ZIPlinks
- ENC - Can do ENCrypted links
- KNOCK - supports KNOCK
- TBURST - supports TBURST
- PARA - supports invite broadcasting for +p
- ENCAP - ?
-*/
-void ratbox_cmd_capab()
-{
- send_cmd(NULL, "CAPAB :QS EX CHW IE KLN GLN KNOCK TB UNKLN CLUSTER ENCAP");
-}
-
-/* PASS */
-void ratbox_cmd_pass(const char *pass)
-{
- send_cmd(NULL, "PASS %s TS 6 :%s", pass, TS6SID);
-}
-
-class RatboxProto : public IRCDTS6Proto
-{
- void SendGlobopsInternal(BotInfo *source, const char *buf)
- {
- if (source)
- send_cmd(source->GetUID(), "OPERWALL :%s", buf);
- else
- send_cmd(TS6SID, "OPERWALL :%s", buf);
- }
-
- void SendSQLine(XLine *x)
- {
- send_cmd(TS6SID, "RESV * %s :%s", x->Mask.c_str(), x->Reason.c_str());
- }
-
- void SendSGLineDel(XLine *x)
- {
- BotInfo *bi = OperServ;
- send_cmd(bi ? bi->GetUID() : Config.s_OperServ, "UNXLINE * %s", x->Mask.c_str());
- }
-
- void SendSGLine(XLine *x)
- {
- BotInfo *bi = OperServ;
- send_cmd(bi ? bi->GetUID() : Config.s_OperServ, "XLINE * %s 0 :%s", x->Mask.c_str(), x->Reason.c_str());
- }
-
- void SendAkillDel(XLine *x)
- {
- BotInfo *bi = OperServ;
- send_cmd(bi ? bi->GetUID() : Config.s_OperServ, "UNKLINE * %s %s", x->GetUser().c_str(), x->GetHost().c_str());
- }
-
- void SendSQLineDel(XLine *x)
- {
- send_cmd(TS6SID, "UNRESV * %s", x->Mask.c_str());
- }
-
- void SendJoin(BotInfo *user, const char *channel, time_t chantime)
- {
- send_cmd(NULL, "SJOIN %ld %s + :%s", static_cast<long>(chantime), channel, user->GetUID().c_str());
- }
-
- void SendAkill(XLine *x)
- {
- BotInfo *bi = OperServ;
- send_cmd(bi ? bi->GetUID() : Config.s_OperServ, "KLINE * %ld %s %s :%s", static_cast<long>(x->Expires - time(NULL)), x->GetUser().c_str(), x->GetHost().c_str(), x->Reason.c_str());
- }
-
- void SendSVSKillInternal(BotInfo *source, User *user, const char *buf)
- {
- send_cmd(source ? source->GetUID() : TS6SID, "KILL %s :%s", user->GetUID().c_str(), buf);
- }
-
- void SendSVSMode(User *u, int ac, const char **av)
- {
- this->SendModeInternal(NULL, u, merge_args(ac, av));
- }
-
- /* SERVER name hop descript */
- void SendServer(Server *server)
- {
- send_cmd(NULL, "SERVER %s %d :%s", server->GetName().c_str(), server->GetHops(), server->GetDescription().c_str());
- }
-
- void SendConnect()
- {
- ratbox_cmd_pass(uplink_server->password);
- ratbox_cmd_capab();
- /* Make myself known to myself in the serverlist */
- SendServer(Me);
- ratbox_cmd_svinfo();
- }
-
- void SendClientIntroduction(const std::string &nick, const std::string &user, const std::string &host, const std::string &real, const char *modes, const std::string &uid)
- {
- EnforceQlinedNick(nick, NULL);
- send_cmd(TS6SID, "UID %s 1 %ld %s %s %s 0 %s :%s", nick.c_str(), static_cast<long>(time(NULL)), modes, user.c_str(), host.c_str(), uid.c_str(), real.c_str());
- }
-
- void SendPartInternal(BotInfo *bi, const char *chan, const char *buf)
- {
- if (buf)
- send_cmd(bi->GetUID(), "PART %s :%s", chan, buf);
- else
- send_cmd(bi->GetUID(), "PART %s", chan);
- }
-
- void SendNumericInternal(const char *source, int numeric, const char *dest, const char *buf)
- {
- // This might need to be set in the call to SendNumeric instead of here, will review later -- CyberBotX
- send_cmd(TS6SID, "%03d %s %s", numeric, dest, buf);
- }
-
- void SendModeInternal(BotInfo *bi, Channel *dest, const char *buf)
- {
- if (bi)
- send_cmd(bi->GetUID(), "MODE %s %s", dest->name.c_str(), buf);
- else send_cmd(TS6SID, "MODE %s %s", dest->name.c_str(), buf);
- }
-
- void SendModeInternal(BotInfo *bi, User *u, const char *buf)
- {
- if (!buf)
- return;
- send_cmd(bi ? bi->GetUID() : TS6SID, "SVSMODE %s %s", u->nick.c_str(), buf);
- }
-
- void SendKickInternal(BotInfo *bi, Channel *chan, User *user, const char *buf)
- {
- if (buf)
- send_cmd(bi->GetUID(), "KICK %s %s :%s", chan->name.c_str(), user->GetUID().c_str(), buf);
- else
- send_cmd(bi->GetUID(), "KICK %s %s", chan->name.c_str(), user->GetUID().c_str());
- }
-
- void SendNoticeChanopsInternal(BotInfo *source, Channel *dest, const char *buf)
- {
- send_cmd(NULL, "NOTICE @%s :%s", dest->name.c_str(), buf);
- }
-
- /* QUIT */
- void SendQuitInternal(BotInfo *bi, const char *buf)
- {
- if (buf)
- send_cmd(bi->GetUID(), "QUIT :%s", buf);
- else
- send_cmd(bi->GetUID(), "QUIT");
- }
-
- /* INVITE */
- void SendInvite(BotInfo *source, const char *chan, const char *nick)
- {
- User *u = finduser(nick);
- send_cmd(source->GetUID(), "INVITE %s %s", u ? u->GetUID().c_str(): nick, chan);
- }
-
- void SendAccountLogin(User *u, NickCore *account)
- {
- send_cmd(TS6SID, "ENCAP * SU %s %s", u->GetUID().c_str(), account->display);
- }
-
- void SendAccountLogout(User *u, NickCore *account)
- {
- send_cmd(TS6SID, "ENCAP * SU %s", u->GetUID().c_str());
- }
-
- int IsNickValid(const char *nick)
- {
- /* TS6 Save extension -Certus */
- if (isdigit(*nick))
- return 0;
- return 1;
- }
-
- void SendTopic(BotInfo *bi, Channel *c, const char *whosetit, const char *topic)
- {
- send_cmd(bi->GetUID(), "TOPIC %s :%s", c->name.c_str(), topic);
- }
-
- void SetAutoIdentificationToken(User *u)
- {
- char svidbuf[15];
-
- if (!u->Account())
- return;
-
- snprintf(svidbuf, sizeof(svidbuf), "%ld", static_cast<long>(u->timestamp));
-
- u->Account()->Shrink("authenticationtoken");
- u->Account()->Extend("authenticationtoken", new ExtensibleItemPointerArray<char>(sstrdup(svidbuf)));
- }
-} ircd_proto;
-
-int anope_event_sjoin(const char *source, int ac, const char **av)
-{
- Channel *c = findchan(av[1]);
- time_t ts = atol(av[0]);
- bool was_created = false;
- bool keep_their_modes = true;
-
- if (!c)
- {
- c = new Channel(av[1], ts);
- was_created = true;
- }
- /* Our creation time is newer than what the server gave us */
- else if (c->creation_time > ts)
- {
- c->creation_time = ts;
-
- /* Remove status from all of our users */
- for (std::list<Mode *>::const_iterator it = ModeManager::Modes.begin(), it_end = ModeManager::Modes.end(); it != it_end; ++it)
- {
- Mode *m = *it;
-
- if (m->Type != MODE_STATUS)
- continue;
-
- ChannelMode *cm = dynamic_cast<ChannelMode *>(m);
-
- for (CUserList::const_iterator uit = c->users.begin(), uit_end = c->users.end(); uit != uit_end; ++uit)
- {
- UserContainer *uc = *uit;
-
- c->RemoveMode(NULL, cm, uc->user->nick);
- }
- }
- if (c->ci)
- {
- /* Rejoin the bot to fix the TS */
- if (c->ci->bi)
- {
- c->ci->bi->Part(c, "TS reop");
- c->ci->bi->Join(c);
- }
- /* Reset mlock */
- check_modes(c);
- }
- }
- /* Their TS is newer than ours, our modes > theirs, unset their modes if need be */
- else
- keep_their_modes = false;
-
- /* Mark the channel as syncing */
- if (was_created)
- c->SetFlag(CH_SYNCING);
-
- /* If we need to keep their modes, and this SJOIN string contains modes */
- if (keep_their_modes && ac >= 4)
- {
- /* Set the modes internally */
- ChanSetInternalModes(c, ac - 3, av + 2);
- }
-
- spacesepstream sep(av[ac - 1]);
- std::string buf;
- while (sep.GetToken(buf))
- {
- std::list<ChannelMode *> Status;
- Status.clear();
- char ch;
-
- /* Get prefixes from the nick */
- while ((ch = ModeManager::GetStatusChar(buf[0])))
- {
- buf.erase(buf.begin());
- ChannelMode *cm = ModeManager::FindChannelModeByChar(ch);
- if (!cm)
- {
- Alog() << "Recieved unknown mode prefix " << buf[0] << " in SJOIN string";
- continue;
- }
-
- Status.push_back(cm);
- }
-
- User *u = finduser(buf);
- if (!u)
- {
- Alog(LOG_DEBUG) << "SJOIN for nonexistant user " << buf << " on " << c->name;
- continue;
- }
-
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnPreJoinChannel, OnPreJoinChannel(u, c));
-
- /* Add the user to the channel */
- c->JoinUser(u);
-
- /* Update their status internally on the channel
- * This will enforce secureops etc on the user
- */
- for (std::list<ChannelMode *>::iterator it = Status.begin(), it_end = Status.end(); it != it_end; ++it)
- c->SetModeInternal(*it, buf);
-
- /* Now set whatever modes this user is allowed to have on the channel */
- chan_set_correct_modes(u, c, 1);
-
- /* Check to see if modules want the user to join, if they do
- * check to see if they are allowed to join (CheckKick will kick/ban them)
- * Don't trigger OnJoinChannel event then as the user will be destroyed
- */
- if (MOD_RESULT != EVENT_STOP && c->ci && c->ci->CheckKick(u))
- continue;
-
- FOREACH_MOD(I_OnJoinChannel, OnJoinChannel(u, c));
- }
-
- /* Channel is done syncing */
- if (was_created)
- {
- /* Unset the syncing flag */
- c->UnsetFlag(CH_SYNCING);
-
- /* If there are users in the channel they are allowed to be, set topic mlock etc. */
- if (!c->users.empty())
- c->Sync();
- /* If there are no users in the channel, there is a ChanServ timer set to part the service bot
- * and destroy the channel soon
- */
- }
-
- return MOD_CONT;
-}
-
-/*
- Non TS6
-
- av[0] = nick
- av[1] = hop
- av[2] = ts
- av[3] = modes
- av[4] = user
- av[5] = host
- av[6] = server
- av[7] = info
-
- TS6
- av[0] = nick
- av[1] = hop
- av[2] = ts
- av[3] = modes
- av[4] = user
- av[5] = host
- av[6] = IP
- av[7] = UID
- av[8] = info
-
-*/
-int anope_event_nick(const char *source, int ac, const char **av)
-{
- User *user;
-
- if (ac == 9)
- {
- Server *s = Server::Find(source ? source : "");
- /* Source is always the server */
- user = do_nick("", av[0], av[4], av[5], s->GetName().c_str(), av[8], strtoul(av[2], NULL, 10), 0, "*", av[7]);
- if (user)
- {
- /* No usermode +d on ratbox so we use
- * nick timestamp to check for auth - Adam
- */
- user->CheckAuthenticationToken(av[2]);
-
- UserSetInternalModes(user, 1, &av[3]);
- }
- }
- else if (ac == 2)
- do_nick(source, av[0], NULL, NULL, NULL, NULL, strtoul(av[1], NULL, 10), 0, NULL, NULL);
- return MOD_CONT;
-}
-
-int anope_event_topic(const char *source, int ac, const char **av)
-{
- User *u;
-
- if (ac == 4)
- do_topic(source, ac, av);
- else
- {
- Channel *c = findchan(av[0]);
- time_t topic_time = time(NULL);
-
- if (!c)
- {
- Alog(LOG_DEBUG) << "TOPIC " << merge_args(ac - 1, av + 1) << " for nonexistent channel " << av[0];
- return MOD_CONT;
- }
-
- if (check_topiclock(c, topic_time))
- return MOD_CONT;
-
- if (c->topic)
- {
- delete [] c->topic;
- c->topic = NULL;
- }
- if (ac > 1 && *av[1])
- c->topic = sstrdup(av[1]);
-
- u = finduser(source);
- c->topic_setter = u ? u->nick : source;
- c->topic_time = topic_time;
-
- record_topic(av[0]);
-
- if (ac > 1 && *av[1])
- {
- FOREACH_MOD(I_OnTopicUpdated, OnTopicUpdated(c, av[1]));
- }
- else
- {
- FOREACH_MOD(I_OnTopicUpdated, OnTopicUpdated(c, ""));
- }
- }
- return MOD_CONT;
-}
-
-int anope_event_tburst(const char *source, int ac, const char **av)
-{
- char *setter;
- Channel *c;
- time_t topic_time;
-
- if (ac != 4)
- return MOD_CONT;
-
- setter = myStrGetToken(av[2], '!', 0);
-
- c = findchan(av[0]);
- topic_time = strtol(av[1], NULL, 10);
-
- if (!c)
- {
- Alog(LOG_DEBUG) << "debug: TOPIC " << merge_args(ac - 1, av + 1) << " for nonexistent channel " << av[0];
- if (setter)
- delete [] setter;
- return MOD_CONT;
- }
-
- if (check_topiclock(c, topic_time))
- {
- if (setter)
- delete [] setter;
- return MOD_CONT;
- }
-
- if (c->topic)
- {
- delete [] c->topic;
- c->topic = NULL;
- }
- if (ac > 1 && *av[3])
- c->topic = sstrdup(av[3]);
-
- c->topic_setter = setter;
- c->topic_time = topic_time;
-
- record_topic(av[0]);
- if (setter)
- delete [] setter;
- return MOD_CONT;
-}
-
-int anope_event_436(const char *source, int ac, const char **av)
-{
- if (ac < 1)
- return MOD_CONT;
-
- m_nickcoll(av[0]);
- return MOD_CONT;
-}
-
-int anope_event_ping(const char *source, int ac, const char **av)
-{
- if (ac < 1)
- return MOD_CONT;
- ircdproto->SendPong(ac > 1 ? av[1] : Config.ServerName, av[0]);
- return MOD_CONT;
-}
-
-int anope_event_away(const char *source, int ac, const char **av)
-{
- User *u = NULL;
-
- u = finduser(source);
- m_away(u ? u->nick.c_str() : source, (ac ? av[0] : NULL));
- return MOD_CONT;
-}
-
-int anope_event_kill(const char *source, int ac, const char **av)
-{
- if (ac != 2)
- return MOD_CONT;
-
- m_kill(av[0], av[1]);
- return MOD_CONT;
-}
-
-int anope_event_kick(const char *source, int ac, const char **av)
-{
- if (ac != 3)
- return MOD_CONT;
- do_kick(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_join(const char *source, int ac, const char **av)
-{
- if (ac != 1)
- {
- anope_event_sjoin(source, ac, av);
- return MOD_CONT;
- }
- else
- do_join(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_motd(const char *source, int ac, const char **av)
-{
- if (!source)
- return MOD_CONT;
-
- m_motd(source);
- return MOD_CONT;
-}
-
-int anope_event_privmsg(const char *source, int ac, const char **av)
-{
- User *u;
- BotInfo *bi;
-
- if (ac != 2)
- return MOD_CONT;
-
- u = finduser(source);
- bi = findbot(av[0]);
- // XXX: this is really the same as charybdis
- m_privmsg(source, av[0], av[1]);
- return MOD_CONT;
-}
-
-int anope_event_part(const char *source, int ac, const char **av)
-{
- User *u;
-
- if (ac < 1 || ac > 2)
- return MOD_CONT;
-
- u = finduser(source);
- do_part(u ? u->nick.c_str() : source, ac, av);
-
- return MOD_CONT;
-}
-
-int anope_event_whois(const char *source, int ac, const char **av)
-{
- BotInfo *bi;
-
- if (source && ac >= 1)
- {
- bi = findbot(av[0]);
- m_whois(source, bi->GetUID().c_str());
- }
- return MOD_CONT;
-}
-
-/* EVENT: SERVER */
-int anope_event_server(const char *source, int ac, const char **av)
-{
- if (!stricmp(av[1], "1"))
- {
- if (TS6UPLINK)
- do_server(source, av[0], atoi(av[1]), av[2], TS6UPLINK);
- else
- do_server(source, av[0], atoi(av[1]), av[2], "");
- }
- else
- do_server(source, av[0], atoi(av[1]), av[2], "");
- return MOD_CONT;
-}
-
-int anope_event_sid(const char *source, int ac, const char **av)
-{
- /* :42X SID trystan.nomadirc.net 2 43X :ircd-ratbox test server */
-
- Server *s = Server::Find(source);
-
- do_server(s->GetName(), av[0], atoi(av[1]), av[3], av[2]);
- return MOD_CONT;
-}
-
-int anope_event_squit(const char *source, int ac, const char **av)
-{
- if (ac != 2)
- return MOD_CONT;
- do_squit(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_quit(const char *source, int ac, const char **av)
-{
- User *u;
-
- if (ac != 1)
- return MOD_CONT;
-
- u = finduser(source);
-
- do_quit(u ? u->nick.c_str() : source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_mode(const char *source, int ac, const char **av)
-{
- User *u, *u2;
-
- if (ac < 2)
- return MOD_CONT;
-
- if (*av[0] == '#' || *av[0] == '&')
- do_cmode(source, ac, av);
- else
- {
- u = finduser(source);
- u2 = finduser(av[0]);
- av[0] = u2->nick.c_str();
- do_umode(u->nick.c_str(), ac, av);
- }
- return MOD_CONT;
-}
-
-int anope_event_tmode(const char *source, int ac, const char **av)
-{
- if (*av[1] == '#' || *av[1] == '&')
- do_cmode(source, ac, av);
- return MOD_CONT;
-}
-
-/* Event: PROTOCTL */
-int anope_event_capab(const char *source, int ac, const char **av)
-{
- CapabParse(ac, av);
- return MOD_CONT;
-}
-
-int anope_event_pass(const char *source, int ac, const char **av)
-{
- TS6UPLINK = sstrdup(av[3]);
- return MOD_CONT;
-}
-
-int anope_event_bmask(const char *source, int ac, const char **av)
-{
- Channel *c;
- char *bans;
- char *b;
- int count, i;
- ChannelModeList *cms;
-
- /* :42X BMASK 1106409026 #ircops b :*!*@*.aol.com */
- /* 0 1 2 3 */
- c = findchan(av[1]);
-
- if (c)
- {
- bans = sstrdup(av[3]);
- count = myNumToken(bans, ' ');
- for (i = 0; i <= count - 1; ++i)
- {
- b = myStrGetToken(bans, ' ', i);
- if (!stricmp(av[2], "b"))
- {
- cms = dynamic_cast<ChannelModeList *>(ModeManager::FindChannelModeByChar('b'));
- cms->AddMask(c, b);
- }
- if (!stricmp(av[2], "e"))
- {
- cms = dynamic_cast<ChannelModeList *>(ModeManager::FindChannelModeByChar('e'));
- cms->AddMask(c, b);
- }
- if (!stricmp(av[2], "I"))
- {
- cms = dynamic_cast<ChannelModeList *>(ModeManager::FindChannelModeByChar('I'));
- cms->AddMask(c, b);
- }
- if (b)
- delete [] b;
- }
- delete [] bans;
- }
- return MOD_CONT;
-}
-
-int anope_event_error(const char *source, int ac, const char **av)
-{
- if (ac >= 1)
- Alog(LOG_DEBUG) << av[0];
- return MOD_CONT;
-}
-
-void moduleAddIRCDMsgs()
-{
- Anope::AddMessage("436", anope_event_436);
- Anope::AddMessage("AWAY", anope_event_away);
- Anope::AddMessage("JOIN", anope_event_join);
- Anope::AddMessage("KICK", anope_event_kick);
- Anope::AddMessage("KILL", anope_event_kill);
- Anope::AddMessage("MODE", anope_event_mode);
- Anope::AddMessage("TMODE", anope_event_tmode);
- Anope::AddMessage("MOTD", anope_event_motd);
- Anope::AddMessage("NICK", anope_event_nick);
- Anope::AddMessage("BMASK", anope_event_bmask);
- Anope::AddMessage("UID", anope_event_nick);
- Anope::AddMessage("PART", anope_event_part);
- Anope::AddMessage("PASS", anope_event_pass);
- Anope::AddMessage("PING", anope_event_ping);
- Anope::AddMessage("PRIVMSG", anope_event_privmsg);
- Anope::AddMessage("QUIT", anope_event_quit);
- Anope::AddMessage("SERVER", anope_event_server);
- Anope::AddMessage("SQUIT", anope_event_squit);
- Anope::AddMessage("TOPIC", anope_event_topic);
- Anope::AddMessage("TB", anope_event_tburst);
- Anope::AddMessage("WHOIS", anope_event_whois);
- Anope::AddMessage("CAPAB", anope_event_capab);
- Anope::AddMessage("SJOIN", anope_event_sjoin);
- Anope::AddMessage("ERROR", anope_event_error);
- Anope::AddMessage("SID", anope_event_sid);
-}
-
-static void AddModes()
-{
- /* Add user modes */
- ModeManager::AddUserMode(new UserMode(UMODE_ADMIN, "UMODE_ADMIN", 'a'));
- ModeManager::AddUserMode(new UserMode(UMODE_INVIS, "UMODE_INVIS", 'i'));
- ModeManager::AddUserMode(new UserMode(UMODE_OPER, "UMODE_OPER", 'o'));
- ModeManager::AddUserMode(new UserMode(UMODE_SNOMASK, "UMODE_SNOMASK", 's'));
- ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w'));
-
- /* b/e/I */
- ModeManager::AddChannelMode(new ChannelModeBan('b'));
- ModeManager::AddChannelMode(new ChannelModeExcept('e'));
- ModeManager::AddChannelMode(new ChannelModeInvex('I'));
-
- /* v/h/o/a/q */
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", 'v', '+'));
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, "CMODE_OP", 'o', '@'));
-
- /* Add channel modes */
- ModeManager::AddChannelMode(new ChannelMode(CMODE_INVITE, "CMODE_INVITE", 'i'));
- ModeManager::AddChannelMode(new ChannelModeKey('k'));
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_LIMIT, "CMODE_LIMIT", 'l'));
- ModeManager::AddChannelMode(new ChannelMode(CMODE_MODERATED, "CMODE_MODERATED", 'm'));
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NOEXTERNAL, "CMODE_NOEXTERNAL", 'n'));
- ModeManager::AddChannelMode(new ChannelMode(CMODE_PRIVATE, "CMODE_PRIVATE", 'p'));
- ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, "CMODE_SECRET", 's'));
- ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, "CMODE_TOPIC", 't'));
-}
-
-class ProtoRatbox : public Module
-{
- public:
- ProtoRatbox(const std::string &modname, const std::string &creator) : Module(modname, creator)
- {
- this->SetAuthor("Anope");
- this->SetType(PROTOCOL);
-
- if (Config.Numeric)
- TS6SID = sstrdup(Config.Numeric);
- UseTSMODE = 1; /* TMODE */
-
- pmodule_ircd_version("Ratbox IRCD 2.0+");
- pmodule_ircd_var(myIrcd);
- pmodule_ircd_useTSMode(1);
-
- CapabType c[] = { CAPAB_ZIP, CAPAB_TS5, CAPAB_QS, CAPAB_UID, CAPAB_KNOCK };
- for (unsigned i = 0; i < 5; ++i)
- Capab.SetFlag(c[i]);
-
- AddModes();
-
- pmodule_ircd_proto(&ircd_proto);
- moduleAddIRCDMsgs();
- }
-
- ~ProtoRatbox()
- {
- delete [] TS6SID;
- }
-};
-
-MODULE_INIT(ProtoRatbox)