summaryrefslogtreecommitdiff
path: root/src/protocol
diff options
context:
space:
mode:
Diffstat (limited to 'src/protocol')
-rw-r--r--src/protocol/CMakeLists.txt54
-rw-r--r--src/protocol/bahamut.cpp832
-rw-r--r--src/protocol/inspircd11.cpp1171
-rw-r--r--src/protocol/inspircd12.cpp1371
-rw-r--r--src/protocol/inspircd20.cpp1351
-rw-r--r--src/protocol/ratbox.cpp899
-rw-r--r--src/protocol/unreal32.cpp1345
7 files changed, 0 insertions, 7023 deletions
diff --git a/src/protocol/CMakeLists.txt b/src/protocol/CMakeLists.txt
deleted file mode 100644
index abca56caf..000000000
--- a/src/protocol/CMakeLists.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-# Find all the *.cpp files within the current source directory, and sort the list
-file(GLOB PROTOCOL_SRCS_CPP RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cpp")
-set(PROTOCOL_SRCS ${PROTOCOL_SRCS_C} ${PROTOCOL_SRCS_CPP})
-sort_list(PROTOCOL_SRCS)
-
-# If using Windows, add the MODULE_COMPILE define
-if(WIN32)
- add_definitions(-DMODULE_COMPILE)
-endif(WIN32)
-
-# Set all the files to use C++ as well as set their compile flags (use the module-specific compile flags, though)
-set_source_files_properties(${PROTOCOL_SRCS} PROPERTIES LANGUAGE CXX COMPILE_FLAGS "${CXXFLAGS}")
-
-# Create an empty list to store extra include directories
-set(EXTRA_INCLUDES)
-
-# Iterate through all the source files
-foreach(SRC ${PROTOCOL_SRCS})
- # Convert the source file extension to have a .so extension
- string(REGEX REPLACE "\\.(c|cpp)$" ".so" SO ${SRC})
- # Temporary variable for the current source's include directories
- set(TEMP_INCLUDES)
- # Calculate the header file dependencies for the given source file
- calculate_depends(${SRC} TEMP_INCLUDES)
- # If there were some extra include directories, add them to the list
- if(TEMP_INCLUDES)
- append_to_list(EXTRA_INCLUDES ${TEMP_INCLUDES})
- endif(TEMP_INCLUDES)
- # For Visual Studio only, include win32_memory static library, required to override Visual Studio's overrides of the new/delete operators
- if(MSVC)
- set(WIN32_MEMORY win32_memory)
- else(MSVC)
- set(WIN32_MEMORY)
- endif(MSVC)
- # Generate the module and set it's linker flags, also set it to depend on the main Anope executable to be built beforehand
- add_library(${SO} MODULE ${SRC})
- set_target_properties(${SO} PROPERTIES LINKER_LANGUAGE CXX PREFIX "" SUFFIX "" LINK_FLAGS "${LDFLAGS}")
- add_dependencies(${SO} ${PROGRAM_NAME})
- # For Windows only, have the module link to the export library of Anope as well as the wsock32 library (most of the modules probably don't need this, but this is to be on the safe side), also set it's version
- if(WIN32)
- target_link_libraries(${SO} ${PROGRAM_NAME} wsock32 ${WIN32_MEMORY})
- set_target_properties(${PROGRAM_NAME} PROPERTIES VERSION "${VERSION_DOTTED}")
- endif(WIN32)
- # Set the module to be installed to the module directory under the data directory
- install(TARGETS ${SO}
- DESTINATION data/modules
- )
-endforeach(SRC)
-
-# If there were extra include directories, remove the duplicates and add the directories to the include path
-if(EXTRA_INCLUDES)
- remove_list_duplicates(EXTRA_INCLUDES)
- include_directories(${EXTRA_INCLUDES})
-endif(EXTRA_INCLUDES)
diff --git a/src/protocol/bahamut.cpp b/src/protocol/bahamut.cpp
deleted file mode 100644
index d7849c940..000000000
--- a/src/protocol/bahamut.cpp
+++ /dev/null
@@ -1,832 +0,0 @@
-/* Bahamut functions
- *
- * (C) 2003-2010 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 "services.h"
-#include "modules.h"
-
-IRCDVar myIrcd[] = {
- {"Bahamut 1.8.x", /* ircd name */
- "+", /* Modes used by pseudoclients */
- 2, /* Chan Max Symbols */
- "+o", /* Channel Umode used by Botserv bots */
- 1, /* SVSNICK */
- 0, /* Vhost */
- 1, /* Supports SNlines */
- 1, /* Supports SQlines */
- 1, /* Supports SZlines */
- 3, /* Number of server args */
- 0, /* Join 2 Set */
- 0, /* Join 2 Message */
- 0, /* TS Topic Forward */
- 0, /* TS Topci Backward */
- 1, /* Chan SQlines */
- 1, /* Quit on Kill */
- 1, /* SVSMODE unban */
- 0, /* Reverse */
- 0, /* vidents */
- 1, /* svshold */
- 1, /* time stamp on mode */
- 1, /* NICKIP */
- 0, /* O:LINE */
- 1, /* UMODE */
- 0, /* VHOST ON NICK */
- 0, /* Change RealName */
- 1, /* 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 */
- 0, /* ts6 */
- 0, /* p10 */
- 0, /* CIDR channelbans */
- "$", /* TLD Prefix for Global */
- 6, /* Max number of modes we can send per line */
- }
- ,
- {NULL}
-};
-
-void bahamut_cmd_burst()
-{
- send_cmd(NULL, "BURST");
-}
-
-/*
- * 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 bahamut_cmd_svinfo()
-{
- send_cmd(NULL, "SVINFO 3 1 0 :%ld", static_cast<long>(time(NULL)));
-}
-
-/* PASS */
-void bahamut_cmd_pass(const char *pass)
-{
- send_cmd(NULL, "PASS %s :TS", pass);
-}
-
-/* CAPAB */
-void bahamut_cmd_capab()
-{
- send_cmd(NULL, "CAPAB SSJOIN NOQUIT BURST UNCONNECT NICKIP TSMODE TS3");
-}
-
-/* this avoids "undefined symbol" messages of those whom try to load mods that
- call on this function */
-void bahamut_cmd_chghost(const char *nick, const char *vhost)
-{
- Alog(LOG_DEBUG) << "This IRCD does not support vhosting";
-}
-
-class BahamutIRCdProto : public IRCDProto
-{
- void SendModeInternal(BotInfo *source, Channel *dest, const char *buf)
- {
- if (!buf)
- return;
- if (Capab.HasFlag(CAPAB_TSMODE))
- send_cmd(source->nick, "MODE %s 0 %s", dest->name.c_str(), buf);
- else
- send_cmd(source->nick, "MODE %s %s", dest->name.c_str(), buf);
- }
-
- void SendModeInternal(BotInfo *bi, User *u, const char *buf)
- {
- if (!buf)
- return;
- send_cmd(bi ? bi->nick : Config.ServerName, "SVSMODE %s %ld %s", u->nick.c_str(), static_cast<long>(u->timestamp), buf);
- }
-
- /* SVSHOLD - set */
- void SendSVSHold(const char *nick)
- {
- send_cmd(Config.ServerName, "SVSHOLD %s %u :%s", nick, static_cast<unsigned>(Config.NSReleaseTimeout), "Being held for registered user");
- }
-
- /* SVSHOLD - release */
- void SendSVSHoldDel(const char *nick)
- {
- send_cmd(Config.ServerName, "SVSHOLD %s 0", nick);
- }
-
- /* SVSMODE -b */
- void SendBanDel(Channel *c, const std::string &nick)
- {
- SendSVSModeChan(c, "-b", nick.empty() ? NULL : nick.c_str());
- }
-
- /* SVSMODE channel modes */
- void SendSVSModeChan(Channel *c, const char *mode, const char *nick)
- {
- if (nick)
- send_cmd(Config.ServerName, "SVSMODE %s %s %s", c->name.c_str(), mode, nick);
- else
- send_cmd(Config.ServerName, "SVSMODE %s %s", c->name.c_str(), mode);
- }
-
- /* SQLINE */
- void SendSQLine(XLine *x)
- {
- send_cmd(NULL, "SQLINE %s :%s", x->Mask.c_str(), x->Reason.c_str());
- }
-
- /* UNSLINE */
- void SendSGLineDel(XLine *x)
- {
- send_cmd(NULL, "UNSGLINE 0 :%s", x->Mask.c_str());
- }
-
- /* UNSZLINE */
- void SendSZLineDel(XLine *x)
- {
- /* this will likely fail so its only here for legacy */
- send_cmd(NULL, "UNSZLINE 0 %s", x->Mask.c_str());
- /* this is how we are supposed to deal with it */
- send_cmd(NULL, "RAKILL %s *", x->Mask.c_str());
- }
-
- /* SZLINE */
- void SendSZLine(XLine *x)
- {
- /* this will likely fail so its only here for legacy */
- send_cmd(NULL, "SZLINE %s :%s", x->Mask.c_str(), x->Reason.c_str());
- /* this is how we are supposed to deal with it */
- send_cmd(NULL, "AKILL %s * %d %s %ld :%s", x->Mask.c_str(), 172800, x->By.c_str(), static_cast<long>(time(NULL)), x->Reason.c_str());
- }
-
- /* SVSNOOP */
- void SendSVSNOOP(const char *server, int set)
- {
- send_cmd(NULL, "SVSNOOP %s %s", server, set ? "+" : "-");
- }
-
- /* SGLINE */
- void SendSGLine(XLine *x)
- {
- send_cmd(NULL, "SGLINE %d :%s:%s", static_cast<int>(x->Mask.length()), x->Mask.c_str(), x->Reason.c_str());
- }
-
- /* RAKILL */
- void SendAkillDel(XLine *x)
- {
- send_cmd(NULL, "RAKILL %s %s", x->GetHost().c_str(), x->GetUser().c_str());
- }
-
- /* TOPIC */
- void SendTopic(BotInfo *whosets, Channel *c, const char *whosetit, const char *topic)
- {
- send_cmd(whosets->nick, "TOPIC %s %s %lu :%s", c->name.c_str(), whosetit, static_cast<unsigned long>(c->topic_time), topic);
- }
-
- /* UNSQLINE */
- void SendSQLineDel(XLine *x)
- {
- send_cmd(NULL, "UNSQLINE %s", x->Mask.c_str());
- }
-
- /* JOIN - SJOIN */
- void SendJoin(BotInfo *user, const char *channel, time_t chantime)
- {
- send_cmd(user->nick, "SJOIN %ld %s", static_cast<long>(chantime), channel);
- }
-
- void SendAkill(XLine *x)
- {
- // Calculate the time left before this would expire, capping it at 2 days
- time_t timeleft = x->Expires - time(NULL);
- if (timeleft > 172800)
- timeleft = 172800;
- send_cmd(NULL, "AKILL %s %s %d %s %ld :%s", x->GetHost().c_str(), x->GetUser().c_str(), static_cast<int>(timeleft), x->By.c_str(), static_cast<long>(time(NULL)), x->Reason.c_str());
- }
-
- /*
- Note: if the stamp is null 0, the below usage is correct of Bahamut
- */
- void SendSVSKillInternal(BotInfo *source, User *user, const char *buf)
- {
- send_cmd(source ? source->nick : NULL, "SVSKILL %s :%s", user->nick.c_str(), buf);
- }
-
- /* SVSMODE */
- /* parv[0] - sender
- * parv[1] - nick
- * parv[2] - TS (or mode, depending on svs version)
- * parv[3] - mode (or services id if old svs version)
- * parv[4] - optional arguement (services id)
- */
- void SendSVSMode(User *u, int ac, const char **av)
- {
- this->SendModeInternal(NULL, u, merge_args(ac, av));
- }
-
- void SendEOB()
- {
- send_cmd(NULL, "BURST 0");
- }
-
- void SendNoticeChanopsInternal(BotInfo *source, Channel *dest, const char *buf)
- {
- if (!buf)
- return;
- send_cmd(NULL, "NOTICE @%s :%s", dest->name.c_str(), buf);
- }
-
- void SendKickInternal(BotInfo *source, Channel *chan, User *user, const char *buf)
- {
- if (buf)
- send_cmd(source->nick, "KICK %s %s :%s", chan->name.c_str(), user->nick.c_str(), buf);
- else
- send_cmd(source->nick, "KICK %s %s", chan->name.c_str(), user->nick.c_str());
- }
-
- 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, Config.s_BotServ);
- send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s 0 0 :%s", nick.c_str(), static_cast<long>(time(NULL)), modes, user.c_str(), host.c_str(), Config.ServerName, real.c_str());
- }
-
- /* SVSMODE +d */
- /* nc_change was = 1, and there is no na->status */
- void SendUnregisteredNick(User *u)
- {
- BotInfo *bi = NickServ;
- u->RemoveMode(bi, UMODE_REGISTERED);
- ircdproto->SendMode(bi, u, "+d 1");
- }
-
- /* SERVER */
- void SendServer(Server *server)
- {
- send_cmd(NULL, "SERVER %s %d :%s", server->GetName().c_str(), server->GetHops(), server->GetDescription().c_str());
- }
-
- void SendConnect()
- {
- bahamut_cmd_pass(uplink_server->password);
- bahamut_cmd_capab();
- SendServer(Me);
- bahamut_cmd_svinfo();
- bahamut_cmd_burst();
- }
-
- void SetAutoIdentificationToken(User *u)
- {
- char svidbuf[15];
-
- if (!u->Account())
- return;
-
- srand(time(NULL));
- snprintf(svidbuf, sizeof(svidbuf), "%d", rand());
-
- u->Account()->Shrink("authenticationtoken");
- u->Account()->Extend("authenticationtoken", new ExtensibleItemPointerArray<char>(sstrdup(svidbuf)));
-
- BotInfo *bi = NickServ;
- u->SetMode(bi, UMODE_REGISTERED);
- ircdproto->SendMode(bi, u, "+d %s", svidbuf);
- }
-} ircd_proto;
-
-/* EVENT: SJOIN */
-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 = false;
-
- 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);
- }
-
- /* For a reason unknown to me, bahamut will send a SJOIN from the user joining a channel
- * if the channel already existed
- */
- if (!was_created && ac == 2)
- {
- User *u = finduser(source);
- if (!u)
- Alog(LOG_DEBUG) << "SJOIN for nonexistant user " << source << " on " << c->name;
- else
- {
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnPreJoinChannel, OnPreJoinChannel(u, c));
-
- /* Add the user to the channel */
- c->JoinUser(u);
-
- /* 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)))
- {
- FOREACH_MOD(I_OnJoinChannel, OnJoinChannel(u, c));
- }
- }
- }
- else
- {
- 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;
-}
-
-/*
-** 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
-*/
-int anope_event_nick(const char *source, int ac, const char **av)
-{
- User *user;
-
- if (ac != 2)
- {
- user = do_nick(source, av[0], av[4], av[5], av[6], av[9], strtoul(av[2], NULL, 10), strtoul(av[8], NULL, 0), NULL, NULL);
- if (user)
- {
- /* Check to see if the user should be identified because their
- * services id matches the one in their nickcore
- */
- user->CheckAuthenticationToken(av[7]);
-
- UserSetInternalModes(user, 1, &av[3]);
- }
- }
- else
- do_nick(source, av[0], NULL, NULL, NULL, NULL, strtoul(av[1], NULL, 10), 0, NULL, NULL);
- return MOD_CONT;
-}
-
-/* EVENT : CAPAB */
-int anope_event_capab(const char *source, int ac, const char **av)
-{
- CapabParse(ac, av);
- return MOD_CONT;
-}
-
-/* EVENT : OS */
-int anope_event_os(const char *source, int ac, const char **av)
-{
- if (ac < 1)
- return MOD_CONT;
- m_privmsg(source, Config.s_OperServ, av[0]);
- return MOD_CONT;
-}
-
-/* EVENT : NS */
-int anope_event_ns(const char *source, int ac, const char **av)
-{
- if (ac < 1)
- return MOD_CONT;
- m_privmsg(source, Config.s_NickServ, av[0]);
- return MOD_CONT;
-}
-
-/* EVENT : MS */
-int anope_event_ms(const char *source, int ac, const char **av)
-{
- if (ac < 1)
- return MOD_CONT;
- m_privmsg(source, Config.s_MemoServ, av[0]);
- return MOD_CONT;
-}
-
-/* EVENT : HS */
-int anope_event_hs(const char *source, int ac, const char **av)
-{
- if (ac < 1)
- return MOD_CONT;
- m_privmsg(source, Config.s_HostServ, av[0]);
- return MOD_CONT;
-}
-
-/* EVENT : CS */
-int anope_event_cs(const char *source, int ac, const char **av)
-{
- if (ac < 1)
- return MOD_CONT;
- m_privmsg(source, Config.s_ChanServ, av[0]);
- 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;
-}
-
-/* EVENT : SERVER */
-int anope_event_server(const char *source, int ac, const char **av)
-{
- do_server(source, av[0], atoi(av[1]), av[2], "");
- return MOD_CONT;
-}
-
-/* EVENT : PRIVMSG */
-int anope_event_privmsg(const char *source, int ac, const char **av)
-{
- if (ac != 2)
- return MOD_CONT;
- m_privmsg(source, av[0], av[1]);
- return MOD_CONT;
-}
-
-int anope_event_part(const char *source, int ac, const char **av)
-{
- if (ac < 1 || ac > 2)
- return MOD_CONT;
- do_part(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_whois(const char *source, int ac, const char **av)
-{
- if (source && ac >= 1)
- m_whois(source, av[0]);
- return MOD_CONT;
-}
-
-int anope_event_topic(const char *source, int ac, const char **av)
-{
- if (ac != 4)
- return MOD_CONT;
- do_topic(source, ac, av);
- 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)
-{
- if (ac != 1)
- return MOD_CONT;
- do_quit(source, ac, av);
- return MOD_CONT;
-}
-
-/* EVENT: MODE */
-int anope_event_mode(const char *source, int ac, const char **av)
-{
- if (ac < 2)
- return MOD_CONT;
-
- if (*av[0] == '#' || *av[0] == '&')
- do_cmode(source, ac, av);
- else
- do_umode(source, ac, av);
- return MOD_CONT;
-}
-
-/* EVENT: KILL */
-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;
-}
-
-/* EVENT: KICK */
-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;
-}
-
-/* EVENT: JOIN */
-int anope_event_join(const char *source, int ac, const char **av)
-{
- if (ac != 1)
- return MOD_CONT;
- do_join(source, ac, av);
- return MOD_CONT;
-}
-
-/* EVENT: MOTD */
-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_away(const char *source, int ac, const char **av)
-{
- if (!source)
- return MOD_CONT;
- m_away(source, (ac ? av[0] : NULL));
- 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_error(const char *source, int ac, const char **av)
-{
- if (ac >= 1)
- Alog(LOG_DEBUG) << av[0];
- return MOD_CONT;
-}
-
-int anope_event_burst(const char *source, int ac, const char **av)
-{
- Server *s = Server::Find(source ? source : "");
-
- if (!ac)
- {
- /* for future use - start burst */
- }
- else
- {
- /* 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
- */
- if (!s)
- s = Me->GetUplink();
- if (s)
- s->Sync(true);
- }
- return MOD_CONT;
-}
-
-bool ChannelModeFlood::IsValid(const std::string &value)
-{
- char *dp, *end;
-
- if (!value.empty() && value[0] != ':' && strtoul((value[0] == '*' ? value.c_str() + 1 : value.c_str()), &dp, 10) > 0 && *dp == ':' && *(++dp) && strtoul(dp, &end, 10) > 0 && !*end)
- return true;
-
- return false;
-}
-
-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("MOTD", anope_event_motd);
- Anope::AddMessage("NICK", anope_event_nick);
- Anope::AddMessage("PART", anope_event_part);
- 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("WHOIS", anope_event_whois);
- Anope::AddMessage("SVSMODE", anope_event_mode);
- Anope::AddMessage("CAPAB", anope_event_capab);
- Anope::AddMessage("CS", anope_event_cs);
- Anope::AddMessage("HS", anope_event_hs);
- Anope::AddMessage("MS", anope_event_ms);
- Anope::AddMessage("NS", anope_event_ns);
- Anope::AddMessage("OS", anope_event_os);
- Anope::AddMessage("SJOIN", anope_event_sjoin);
- Anope::AddMessage("ERROR", anope_event_error);
- Anope::AddMessage("BURST", anope_event_burst);
-}
-
-static void AddModes()
-{
- /* Add user modes */
- ModeManager::AddUserMode(new UserMode(UMODE_SERV_ADMIN, "UMODE_SERV_ADMIN", 'A'));
- ModeManager::AddUserMode(new UserMode(UMODE_REGPRIV, "UMODE_REGPRIV", 'R'));
- 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_REGISTERED, "UMODE_REGISTERED", 'r'));
- ModeManager::AddUserMode(new UserMode(UMODE_SNOMASK, "UMODE_SNOMASK", 's'));
- ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w'));
- ModeManager::AddUserMode(new UserMode(UMODE_DEAF, "UMODE_DEAF", 'd'));
-
- /* b/e/I */
- ModeManager::AddChannelMode(new ChannelModeBan('b'));
-
- /* 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_BLOCKCOLOR, "CMODE_BLOCKCOLOR", 'c'));
- ModeManager::AddChannelMode(new ChannelMode(CMODE_INVITE, "CMODE_INVITE", 'i'));
- ModeManager::AddChannelMode(new ChannelModeFlood('f'));
- 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 ChannelModeRegistered('r'));
- ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, "CMODE_SECRET", 's'));
- ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, "CMODE_TOPIC", 't'));
- ModeManager::AddChannelMode(new ChannelMode(CMODE_REGMODERATED, "CMODE_REGMODERATED", 'M'));
- ModeManager::AddChannelMode(new ChannelModeOper('O'));
- ModeManager::AddChannelMode(new ChannelMode(CMODE_REGISTEREDONLY, "CMODE_REGISTEREDONLY", 'R'));
-}
-
-class ProtoBahamut : public Module
-{
- public:
- ProtoBahamut(const std::string &modname, const std::string &creator) : Module(modname, creator)
- {
- this->SetAuthor("Anope");
- this->SetType(PROTOCOL);
-
- pmodule_ircd_version("BahamutIRCd 1.4.*/1.8.*");
- pmodule_ircd_var(myIrcd);
- pmodule_ircd_useTSMode(0);
-
- CapabType c[] = { CAPAB_NOQUIT, CAPAB_TSMODE, CAPAB_UNCONNECT, CAPAB_BURST, CAPAB_DKEY, CAPAB_DOZIP };
- for (unsigned i = 0; i < 6; ++i)
- Capab.SetFlag(c[i]);
-
- moduleAddIRCDMsgs();
- AddModes();
-
- pmodule_ircd_proto(&ircd_proto);
-
- ModuleManager::Attach(I_OnUserNickChange, this);
- }
-
- void OnUserNickChange(User *u, const std::string &)
- {
- u->RemoveModeInternal(ModeManager::FindUserModeByName(UMODE_REGISTERED));
- }
-};
-
-MODULE_INIT(ProtoBahamut)
diff --git a/src/protocol/inspircd11.cpp b/src/protocol/inspircd11.cpp
deleted file mode 100644
index 66c9ffabc..000000000
--- a/src/protocol/inspircd11.cpp
+++ /dev/null
@@ -1,1171 +0,0 @@
-/* inspircd 1.1 beta 6+ functions
- *
- * (C) 2003-2010 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 "services.h"
-#include "modules.h"
-#include "hashcomp.h"
-
-#ifndef _WIN32
-# include <sys/socket.h>
-# include <netinet/in.h>
-# include <arpa/inet.h>
-#endif
-
-#ifdef _WIN32
-# include <winsock.h>
-int inet_aton(const char *name, struct in_addr *addr)
-{
- uint32 a = inet_addr(name);
- addr->s_addr = a;
- return a != (uint32) - 1;
-}
-#endif
-
-IRCDVar myIrcd[] = {
- {"InspIRCd 1.1", /* ircd name */
- "+I", /* Modes used by pseudoclients */
- 5, /* Chan Max Symbols */
- "+ao", /* Channel Umode used by Botserv bots */
- 1, /* SVSNICK */
- 1, /* Vhost */
- 1, /* Supports SNlines */
- 1, /* Supports SQlines */
- 1, /* Supports SZlines */
- 4, /* Number of server args */
- 0, /* Join 2 Set */
- 1, /* Join 2 Message */
- 1, /* TS Topic Forward */
- 0, /* TS Topci Backward */
- 0, /* Chan SQlines */
- 0, /* Quit on Kill */
- 0, /* SVSMODE unban */
- 1, /* Reverse */
- 1, /* vidents */
- 1, /* svshold */
- 0, /* time stamp on mode */
- 0, /* NICKIP */
- 1, /* O:LINE */
- 1, /* UMODE */
- 1, /* VHOST ON NICK */
- 0, /* Change RealName */
- 1, /* No Knock requires +i */
- 0, /* We support inspircd TOKENS */
- 0, /* TIME STAMPS are BASE64 */
- 0, /* Can remove User Channel Modes with SVSMODE */
- 0, /* Sglines are not enforced until user reconnects */
- 0, /* ts6 */
- 0, /* p10 */
- 1, /* CIDR channelbans */
- "$", /* TLD Prefix for Global */
- 20, /* Max number of modes we can send per line */
- }
- ,
- {NULL}
-};
-
-static bool has_servicesmod = false;
-static bool has_globopsmod = false;
-static bool has_svsholdmod = false;
-static bool has_chghostmod = false;
-static bool has_chgidentmod = false;
-static bool has_hidechansmod = false;
-
-/* CHGHOST */
-void inspircd_cmd_chghost(const char *nick, const char *vhost)
-{
- if (has_chghostmod)
- {
- if (!nick || !vhost)
- return;
- send_cmd(Config.s_OperServ, "CHGHOST %s %s", nick, vhost);
- }
- else
- ircdproto->SendGlobops(OperServ, "CHGHOST not loaded!");
-}
-
-int anope_event_idle(const char *source, int ac, const char **av)
-{
- if (ac == 1)
- send_cmd(av[0], "IDLE %s %ld 0", source, static_cast<long>(time(NULL)));
- return MOD_CONT;
-}
-
-static char currentpass[1024];
-
-/* PASS */
-void inspircd_cmd_pass(const char *pass)
-{
- strlcpy(currentpass, pass, sizeof(currentpass));
-}
-
-class InspIRCdProto : public IRCDProto
-{
- void SendAkillDel(XLine *x)
- {
- send_cmd(Config.s_OperServ, "GLINE %s", x->Mask.c_str());
- }
-
- void SendTopic(BotInfo *whosets, Channel *c, const char *whosetit, const char *topic)
- {
- send_cmd(whosets->nick, "FTOPIC %s %lu %s :%s", c->name.c_str(), static_cast<unsigned long>(c->topic_time), whosetit, topic);
- }
-
- void SendVhostDel(User *u)
- {
- if (u->HasMode(UMODE_CLOAK))
- inspircd_cmd_chghost(u->nick.c_str(), u->chost.c_str());
- else
- inspircd_cmd_chghost(u->nick.c_str(), u->host);
-
- if (has_chgidentmod && u->GetIdent() != u->GetVIdent())
- inspircd_cmd_chgident(u->nick.c_str(), u->GetIdent().c_str());
- }
-
- void SendAkill(XLine *x)
- {
- // Calculate the time left before this would expire, capping it at 2 days
- time_t timeleft = x->Expires - time(NULL);
- if (timeleft > 172800)
- timeleft = 172800;
- send_cmd(Config.ServerName, "ADDLINE G %s %s %ld %ld :%s", x->Mask.c_str(), x->By.c_str(), static_cast<long>(time(NULL)), static_cast<long>(timeleft), x->Reason.c_str());
- }
-
- void SendSVSKillInternal(BotInfo *source, User *user, const char *buf)
- {
- send_cmd(source ? source->nick : Config.ServerName, "KILL %s :%s", user->nick.c_str(), buf);
- }
-
- void SendSVSMode(User *u, int ac, const char **av)
- {
- this->SendModeInternal(NULL, u, merge_args(ac, av));
- }
-
- void SendNumericInternal(const char *source, int numeric, const char *dest, const char *buf)
- {
- send_cmd(source, "PUSH %s ::%s %03d %s %s", dest, source, numeric, dest, buf);
- }
-
- void SendGuestNick(const char *nick, const char *user, const char *host, const char *real, const char *modes)
- {
- send_cmd(Config.ServerName, "NICK %ld %s %s %s %s +%s 0.0.0.0 :%s", static_cast<long>(time(NULL)), nick, host, host, user, modes, real);
- }
-
- void SendModeInternal(BotInfo *source, Channel *dest, const char *buf)
- {
- if (!buf)
- return;
- send_cmd(source ? source->nick : Config.s_OperServ, "FMODE %s %u %s", dest->name.c_str(), static_cast<unsigned>(dest->creation_time), buf);
- }
-
- void SendModeInternal(BotInfo *bi, User *u, const char *buf)
- {
- if (!buf)
- return;
- send_cmd(bi ? bi->nick : Config.ServerName, "MODE %s %s", u->nick.c_str(), buf);
- }
-
- 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)
- {
- send_cmd(Config.ServerName, "NICK %ld %s %s %s %s %s 0.0.0.0 :%s", static_cast<long>(time(NULL)), nick.c_str(), host.c_str(), host.c_str(), user.c_str(), modes, real.c_str());
- send_cmd(nick, "OPERTYPE Service");
- }
-
- void SendKickInternal(BotInfo *source, Channel *chan, User *user, const char *buf)
- {
- if (buf)
- send_cmd(source->nick, "KICK %s %s :%s", chan->name.c_str(), user->nick.c_str(), buf);
- else
- send_cmd(source->nick, "KICK %s %s :%s", chan->name.c_str(), user->nick.c_str(), user->nick.c_str());
- }
-
- void SendNoticeChanopsInternal(BotInfo *source, Channel *dest, const char *buf)
- {
- if (!buf)
- return;
- send_cmd(Config.ServerName, "NOTICE @%s :%s", dest->name.c_str(), buf);
- }
-
- /* SERVER services-dev.chatspike.net password 0 :Description here */
- void SendServer(Server *server)
- {
- send_cmd(Config.ServerName, "SERVER %s %s %d :%s", server->GetName().c_str(), currentpass, server->GetHops(), server->GetDescription().c_str());
- }
-
- /* JOIN */
- void SendJoin(BotInfo *user, const char *channel, time_t chantime)
- {
- send_cmd(user->nick, "JOIN %s %ld", channel, static_cast<long>(chantime));
- }
-
- /* UNSQLINE */
- void SendSQLineDel(XLine *x)
- {
- send_cmd(Config.s_OperServ, "QLINE %s", x->Mask.c_str());
- }
-
- /* SQLINE */
- void SendSQLine(XLine *x)
- {
- send_cmd(Config.ServerName, "ADDLINE Q %s %s %ld 0 :%s", x->Mask.c_str(), Config.s_OperServ, static_cast<long>(time(NULL)), x->Reason.c_str());
- }
-
- /* SQUIT */
- void SendSquit(const char *servname, const char *message)
- {
- if (!servname || !message)
- return;
- send_cmd(Config.ServerName, "SQUIT %s :%s", servname, message);
- }
-
- /* Functions that use serval cmd functions */
-
- void SendVhost(User *u, const std::string &vIdent, const std::string &vhost)
- {
- if (!vIdent.empty())
- inspircd_cmd_chgident(u->nick.c_str(), vIdent.c_str());
- if (!vhost.empty())
- inspircd_cmd_chghost(u->nick.c_str(), vhost.c_str());
- }
-
- void SendConnect()
- {
- inspircd_cmd_pass(uplink_server->password);
- SendServer(Me);
- send_cmd(NULL, "BURST");
- send_cmd(Config.ServerName, "VERSION :Anope-%s %s :%s - (%s) -- %s", Anope::Version().c_str(), Config.ServerName, ircd->name, Config.EncModuleList.begin()->c_str(), Anope::Build().c_str());
- }
-
- /* CHGIDENT */
- void inspircd_cmd_chgident(const char *nick, const char *vIdent)
- {
- if (has_chgidentmod)
- {
- if (!nick || !vIdent || !*vIdent)
- return;
- send_cmd(Config.s_OperServ, "CHGIDENT %s %s", nick, vIdent);
- }
- else
- ircdproto->SendGlobops(OperServ, "CHGIDENT not loaded!");
- }
-
- /* SVSHOLD - set */
- void SendSVSHold(const char *nick)
- {
- send_cmd(Config.s_OperServ, "SVSHOLD %s %ds :%s", nick, static_cast<int>(Config.NSReleaseTimeout), "Being held for registered user");
- }
-
- /* SVSHOLD - release */
- void SendSVSHoldDel(const char *nick)
- {
- send_cmd(Config.s_OperServ, "SVSHOLD %s", nick);
- }
-
- /* UNSZLINE */
- void SendSZLineDel(XLine *x)
- {
- send_cmd(Config.s_OperServ, "ZLINE %s", x->Mask.c_str());
- }
-
- /* SZLINE */
- void SendSZLine(XLine *x)
- {
- send_cmd(Config.ServerName, "ADDLINE Z %s %s %ld 0 :%s", x->Mask.c_str(), x->By.c_str(), static_cast<long>(time(NULL)), x->Reason.c_str());
- }
-
- /* SVSMODE +- */
- void SendUnregisteredNick(User *u)
- {
- u->RemoveMode(NickServ, UMODE_REGISTERED);
- }
-
- void SendSVSJoin(const char *source, const char *nick, const char *chan, const char *param)
- {
- send_cmd(source, "SVSJOIN %s %s", nick, chan);
- }
-
- void SendSVSPart(const char *source, const char *nick, const char *chan)
- {
- send_cmd(source, "SVSPART %s %s", nick, chan);
- }
-
- void SendEOB()
- {
- send_cmd(NULL, "ENDBURST");
- }
-
- 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)));
-
- u->SetMode(NickServ, UMODE_REGISTERED);
- }
-} ircd_proto;
-
-int anope_event_ftopic(const char *source, int ac, const char **av)
-{
- /* :source FTOPIC channel ts setby :topic */
- const char *temp;
- if (ac < 4)
- return MOD_CONT;
- temp = av[1]; /* temp now holds ts */
- av[1] = av[2]; /* av[1] now holds set by */
- av[2] = temp; /* av[2] now holds ts */
- do_topic(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_mode(const char *source, int ac, const char **av)
-{
- if (ac < 2)
- return MOD_CONT;
-
- if (*av[0] == '#' || *av[0] == '&')
- do_cmode(source, ac, av);
- else
- {
- /* InspIRCd lets opers change another
- users modes, we have to kludge this
- as it slightly breaks RFC1459
- */
- if (!strcasecmp(source, av[0]))
- do_umode(source, ac, av);
- else
- do_umode(av[0], ac, av);
- }
- return MOD_CONT;
-}
-
-int anope_event_opertype(const char *source, int ac, const char **av)
-{
- /* opertype is equivalent to mode +o because servers
- dont do this directly */
- User *u;
- u = finduser(source);
- if (u && !is_oper(u))
- {
- const char *newav[2];
- newav[0] = source;
- newav[1] = "+o";
- return anope_event_mode(source, 2, newav);
- }
- else
- return MOD_CONT;
-}
-
-int anope_event_fmode(const char *source, int ac, const char **av)
-{
- const char *newav[25];
- int n, o;
- Channel *c;
-
- /* :source FMODE #test 12345678 +nto foo */
- if (ac < 3)
- return MOD_CONT;
-
- /* Checking the TS for validity to avoid desyncs */
- if ((c = findchan(av[0])))
- {
- if (c->creation_time > strtol(av[1], NULL, 10))
- /* Our TS is bigger, we should lower it */
- c->creation_time = strtol(av[1], NULL, 10);
- else if (c->creation_time < strtol(av[1], NULL, 10))
- /* The TS we got is bigger, we should ignore this message. */
- return MOD_CONT;
- }
- else
- /* Got FMODE for a non-existing channel */
- return MOD_CONT;
-
- /* TS's are equal now, so we can proceed with parsing */
- n = o = 0;
- while (n < ac)
- {
- if (n != 1)
- {
- newav[o] = av[n];
- ++o;
- Alog(LOG_DEBUG) << "Param: " << newav[o - 1];
- }
- ++n;
- }
-
- return anope_event_mode(source, ac - 1, newav);
-}
-
-int anope_event_fjoin(const char *source, int ac, const char **av)
-{
- Channel *c = findchan(av[0]);
- time_t ts = atol(av[1]);
- bool was_created = false;
- bool keep_their_modes = true;
-
- if (!c)
- {
- c = new Channel(av[0], 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);
-
- spacesepstream sep(av[ac - 1]);
- std::string buf;
- while (sep.GetToken(buf))
- {
- std::list<ChannelMode *> Status;
- Status.clear();
- char ch;
-
- /* Loop through prefixes */
- while ((ch = ModeManager::GetStatusChar(buf[0])))
- {
- ChannelMode *cm = ModeManager::FindChannelModeByChar(ch);
-
- if (!cm)
- {
- Alog() << "Recieved unknown mode prefix " << buf[0] << " in FJOIN string";
- buf.erase(buf.begin());
- continue;
- }
-
- buf.erase(buf.begin());
- Status.push_back(cm);
- }
-
- User *u = finduser(buf);
- if (!u)
- {
- Alog(LOG_DEBUG) << "FJOIN 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;
-}
-
-/* Events */
-int anope_event_ping(const char *source, int ac, const char **av)
-{
- if (ac < 1)
- return MOD_CONT;
- ircdproto->SendPong(Config.ServerName, av[0]);
- 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_away(const char *source, int ac, const char **av)
-{
- if (!source)
- return MOD_CONT;
- m_away(source, (ac ? av[0] : NULL));
- return MOD_CONT;
-}
-
-/* Taken from hybrid.c, topic syntax is identical */
-
-int anope_event_topic(const char *source, int ac, const char **av)
-{
- 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]);
-
- c->topic_setter = 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_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_rsquit(const char *source, int ac, const char **av)
-{
- if (ac < 1 || ac > 3)
- return MOD_CONT;
-
- /* Horrible workaround to an insp bug (#) in how RSQUITs are sent - mark */
- if (ac > 1 && !strcmp(Config.ServerName, av[0]))
- do_squit(source, ac - 1, av + 1);
- else
- do_squit(source, ac, av);
-
- return MOD_CONT;
-}
-
-int anope_event_quit(const char *source, int ac, const char **av)
-{
- if (ac != 1)
- return MOD_CONT;
- do_quit(source, ac, av);
- 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 != 2)
- return MOD_CONT;
- 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_setname(const char *source, int ac, const char **av)
-{
- User *u;
-
- if (ac != 1)
- return MOD_CONT;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "SETNAME for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetRealname(av[0]);
- return MOD_CONT;
-}
-
-int anope_event_chgname(const char *source, int ac, const char **av)
-{
- User *u;
-
- if (ac != 2)
- return MOD_CONT;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "FNAME for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetRealname(av[0]);
- return MOD_CONT;
-}
-
-int anope_event_setident(const char *source, int ac, const char **av)
-{
- User *u;
-
- if (ac != 1)
- return MOD_CONT;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "SETIDENT for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetIdent(av[0]);
- return MOD_CONT;
-}
-
-int anope_event_chgident(const char *source, int ac, const char **av)
-{
- User *u;
-
- if (ac != 2)
- return MOD_CONT;
-
- u = finduser(av[0]);
- if (!u)
- {
- Alog(LOG_DEBUG) << "CHGIDENT for nonexistent user " << av[0];
- return MOD_CONT;
- }
-
- u->SetIdent(av[1]);
- return MOD_CONT;
-}
-
-int anope_event_sethost(const char *source, int ac, const char **av)
-{
- User *u;
-
- if (ac != 1)
- return MOD_CONT;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "SETHOST for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetDisplayedHost(av[0]);
- return MOD_CONT;
-}
-
-
-int anope_event_nick(const char *source, int ac, const char **av)
-{
- User *user;
- struct in_addr addy;
- uint32 *ad = reinterpret_cast<uint32 *>(&addy);
-
- if (ac != 1)
- {
- if (ac == 8)
- {
- int ts = strtoul(av[0], NULL, 10);
-
- inet_aton(av[6], &addy);
- user = do_nick("", av[1], /* nick */
- av[4], /* username */
- av[2], /* realhost */
- source, /* server */
- av[7], /* realname */
- ts, htonl(*ad), av[3], NULL);
- if (user)
- {
- /* InspIRCd1.1 has no user mode +d so we
- * use nick timestamp to check for auth - Adam
- */
- user->CheckAuthenticationToken(av[0]);
-
- UserSetInternalModes(user, 1, &av[5]);
- user->SetCloakedHost(av[3]);
- }
- }
- }
- else
- do_nick(source, av[0], NULL, NULL, NULL, NULL, 0, 0, NULL, NULL);
- return MOD_CONT;
-}
-
-
-int anope_event_chghost(const char *source, int ac, const char **av)
-{
- User *u;
-
- if (ac != 1)
- return MOD_CONT;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "FHOST for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetDisplayedHost(av[0]);
- return MOD_CONT;
-}
-
-/* EVENT: SERVER */
-int anope_event_server(const char *source, int ac, const char **av)
-{
- do_server(source, av[0], atoi(av[1]), av[2], "");
- return MOD_CONT;
-}
-
-int anope_event_privmsg(const char *source, int ac, const char **av)
-{
- if (ac != 2)
- return MOD_CONT;
- m_privmsg(source, av[0], av[1]);
- return MOD_CONT;
-}
-
-int anope_event_part(const char *source, int ac, const char **av)
-{
- if (ac < 1 || ac > 2)
- return MOD_CONT;
- do_part(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_whois(const char *source, int ac, const char **av)
-{
- if (source && ac >= 1)
- m_whois(source, av[0]);
- return MOD_CONT;
-}
-
-int anope_event_capab(const char *source, int ac, const char **av)
-{
- if (!strcasecmp(av[0], "START"))
- {
- /* reset CAPAB */
- has_servicesmod = false;
- has_globopsmod = false;
- has_svsholdmod = false;
- has_chghostmod = false;
- has_chgidentmod = false;
- has_hidechansmod = false;
- }
- else if (!strcasecmp(av[0], "MODULES"))
- {
- if (strstr(av[1], "m_globops.so"))
- has_globopsmod = true;
- if (strstr(av[1], "m_services.so"))
- has_servicesmod = true;
- if (strstr(av[1], "m_svshold.so"))
- has_svsholdmod = true;
- if (strstr(av[1], "m_chghost.so"))
- has_chghostmod = true;
- if (strstr(av[1], "m_chgident.so"))
- has_chgidentmod = true;
- if (strstr(av[1], "m_hidechans.so"))
- has_hidechansmod = true;
- }
- else if (!strcasecmp(av[0], "CAPABILITIES"))
- {
- spacesepstream ssep(av[1]);
- std::string capab;
- while (ssep.GetToken(capab))
- {
- if (capab.find("CHANMODES") != std::string::npos)
- {
- std::string modes(capab.begin() + 10, capab.end());
- commasepstream sep(modes);
- std::string modebuf;
-
- sep.GetToken(modebuf);
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- switch (modebuf[t])
- {
- case 'b':
- ModeManager::AddChannelMode(new ChannelModeBan('b'));
- continue;
- case 'e':
- ModeManager::AddChannelMode(new ChannelModeExcept('e'));
- continue;
- case 'I':
- ModeManager::AddChannelMode(new ChannelModeInvex('I'));
- continue;
- default:
- ModeManager::AddChannelMode(new ChannelModeList(CMODE_END, "", modebuf[t]));
- }
- }
-
- sep.GetToken(modebuf);
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- switch (modebuf[t])
- {
- case 'k':
- ModeManager::AddChannelMode(new ChannelModeKey('k'));
- continue;
- default:
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_END, "", modebuf[t]));
-
- }
- }
-
- sep.GetToken(modebuf);
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- switch (modebuf[t])
- {
- case 'f':
- ModeManager::AddChannelMode(new ChannelModeFlood('f'));
- continue;
- case 'l':
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_LIMIT, "CMODE_LIMIT", 'l', true));
- continue;
- case 'L':
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_REDIRECT, "CMODE_REDIRECT", 'L', true));
- continue;
- default:
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_END, "", modebuf[t], true));
- }
- }
-
- sep.GetToken(modebuf);
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- switch (modebuf[t])
- {
- case 'i':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_INVITE, "CMODE_INVITE", 'i'));
- continue;
- case 'm':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_MODERATED, "CMODE_MODERATED", 'm'));
- continue;
- case 'n':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NOEXTERNAL, "CMODE_NOEXTERNAL", 'n'));
- continue;
- case 'p':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_PRIVATE, "CMODE_PRIVATE", 'p'));
- continue;
- case 's':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, "CMODE_SECRET", 's'));
- continue;
- case 't':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, "CMODE_TOPIC", 't'));
- continue;
- case 'r':
- ModeManager::AddChannelMode(new ChannelModeRegistered('r'));
- continue;
- case 'c':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_BLOCKCOLOR, "CMODE_BLOCKCOLOR", 'c'));
- continue;
- case 'u':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_AUDITORIUM, "CMODE_AUDITORIUM", 'u'));
- continue;
- case 'z':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_SSL, "CMODE_SSL", 'z'));
- continue;
- case 'A':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_ALLINVITE, "CMODE_ALLINVITE", 'A'));
- continue;
- case 'C':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NOCTCP, "CMODE_NOCTCP", 'C'));
- continue;
- case 'G':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_FILTER, "CMODE_FILTER", 'G'));
- continue;
- case 'K':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NOKNOCK, "CMODE_NOKNOCK", 'K'));
- continue;
- case 'N':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NONICK, "CMODE_NONICK", 'N'));
- continue;
- case 'O':
- ModeManager::AddChannelMode(new ChannelModeOper('O'));
- continue;
- case 'Q':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NOKICK, "CMODE_NOKICK", 'Q'));
- continue;
- case 'R':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_REGISTEREDONLY, "CMODE_REGISTEREDONLY", 'R'));
- continue;
- case 'S':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_STRIPCOLOR, "CMODE_STRIPCOLOR", 'S'));
- continue;
- case 'V':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NOINVITE, "CMODE_NOINVITE", 'V'));
- continue;
- default:
- ModeManager::AddChannelMode(new ChannelMode(CMODE_END, "", modebuf[t]));
- }
- }
- }
- else if (capab.find("PREIX=(") != std::string::npos)
- {
- std::string modes(capab.begin() + 8, capab.begin() + capab.find(")"));
- std::string chars(capab.begin() + capab.find(")") + 1, capab.end());
-
- for (size_t t = 0, end = modes.size(); t < end; ++t)
- {
- switch (modes[t])
- {
- case 'q':
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, "CMODE_OWNER", 'q', '~'));
- continue;
- case 'a':
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT, "CMODE_PROTECT", 'a', '&'));
- continue;
- case 'o':
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, "CMODE_OP", 'o', '@'));
- continue;
- case 'h':
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_HALFOP, "CMODE_HALFOP", 'h', '%'));
- continue;
- case 'v':
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", 'v', '+'));
- continue;
- }
- }
- }
- else if (capab.find("MAXMODES=") != std::string::npos)
- {
- std::string maxmodes(capab.begin() + 9, capab.end());
- ircd->maxmodes = atoi(maxmodes.c_str());
- }
- }
- }
- else if (!strcasecmp(av[0], "END"))
- {
- if (!has_globopsmod)
- {
- send_cmd(NULL, "ERROR :m_globops is not loaded. This is required by Anope");
- quitmsg = "ERROR: Remote server does not have the m_globops module loaded, and this is required.";
- quitting = 1;
- return MOD_STOP;
- }
- if (!has_servicesmod)
- {
- send_cmd(NULL, "ERROR :m_services is not loaded. This is required by Anope");
- quitmsg = "ERROR: Remote server does not have the m_services module loaded, and this is required.";
- quitting = 1;
- return MOD_STOP;
- }
- if (!has_hidechansmod)
- {
- send_cmd(NULL, "ERROR :m_hidechans.so is not loaded. This is required by Anope");
- quitmsg = "ERROR: Remote server deos not have the m_hidechans module loaded, and this is required.";
- quitting = 1;
- return MOD_STOP;
- }
- if (!has_svsholdmod)
- ircdproto->SendGlobops(OperServ, "SVSHOLD missing, Usage disabled until module is loaded.");
- if (!has_chghostmod)
- ircdproto->SendGlobops(OperServ, "CHGHOST missing, Usage disabled until module is loaded.");
- if (!has_chgidentmod)
- ircdproto->SendGlobops(OperServ, "CHGIDENT missing, Usage disabled until module is loaded.");
- ircd->svshold = has_svsholdmod;
- }
-
- CapabParse(ac, av);
- return MOD_CONT;
-}
-
-int anope_event_endburst(const char *source, int ac, const char **av)
-{
- Me->GetUplink()->Sync(true);
- return MOD_CONT;
-}
-
-void moduleAddIRCDMsgs()
-{
- Anope::AddMessage("ENDBURST", anope_event_endburst);
- 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("MOTD", anope_event_motd);
- Anope::AddMessage("NICK", anope_event_nick);
- Anope::AddMessage("CAPAB",anope_event_capab);
- Anope::AddMessage("PART", anope_event_part);
- 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("RSQUIT", anope_event_rsquit);
- Anope::AddMessage("TOPIC", anope_event_topic);
- Anope::AddMessage("WHOIS", anope_event_whois);
- Anope::AddMessage("SVSMODE", anope_event_mode);
- Anope::AddMessage("FHOST", anope_event_chghost);
- Anope::AddMessage("CHGIDENT", anope_event_chgident);
- Anope::AddMessage("FNAME", anope_event_chgname);
- Anope::AddMessage("SETHOST", anope_event_sethost);
- Anope::AddMessage("SETIDENT", anope_event_setident);
- Anope::AddMessage("SETNAME", anope_event_setname);
- Anope::AddMessage("FJOIN", anope_event_fjoin);
- Anope::AddMessage("FMODE", anope_event_fmode);
- Anope::AddMessage("FTOPIC", anope_event_ftopic);
- Anope::AddMessage("OPERTYPE", anope_event_opertype);
- Anope::AddMessage("IDLE", anope_event_idle);
-}
-
-bool ChannelModeFlood::IsValid(const std::string &value)
-{
- char *dp, *end;
-
- if (!value.empty() && value[0] != ':' && strtoul((value[0] == '*' ? value.c_str() + 1 : value.c_str()), &dp, 10) > 0 && *dp == ':' && *(++dp) && strtoul(dp, &end, 10) > 0 && !*end)
- return true;
-
- return false;
-}
-
-static void AddModes()
-{
- ModeManager::AddUserMode(new UserMode(UMODE_CALLERID, "UMODE_CALLERID", 'g'));
- ModeManager::AddUserMode(new UserMode(UMODE_HELPOP, "UMODE_HELPOP", 'h'));
- ModeManager::AddUserMode(new UserMode(UMODE_INVIS, "UMODE_INVIS", 'i'));
- ModeManager::AddUserMode(new UserMode(UMODE_OPER, "UMODE_OPER", 'o'));
- ModeManager::AddUserMode(new UserMode(UMODE_REGISTERED, "UMODE_REGISTERED", 'r'));
- ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w'));
- ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, "UMODE_CLOAK", 'x'));
-}
-
-class ProtoInspIRCd : public Module
-{
- public:
- ProtoInspIRCd(const std::string &modname, const std::string &creator) : Module(modname, creator)
- {
- this->SetAuthor("Anope");
- this->SetType(PROTOCOL);
-
- pmodule_ircd_version("InspIRCd 1.1");
- pmodule_ircd_var(myIrcd);
- pmodule_ircd_useTSMode(0);
-
- CapabType c[] = { CAPAB_NOQUIT, CAPAB_SSJ3, CAPAB_NICK2, CAPAB_VL, CAPAB_TLKEXT };
- for (unsigned i = 0; i < 5; ++i)
- Capab.SetFlag(c[i]);
-
- AddModes();
-
- pmodule_ircd_proto(&ircd_proto);
- moduleAddIRCDMsgs();
-
- ModuleManager::Attach(I_OnUserNickChange, this);
- }
-
- void OnUserNickChange(User *u, const std::string &)
- {
- u->RemoveModeInternal(ModeManager::FindUserModeByName(UMODE_REGISTERED));
- }
-
-};
-
-MODULE_INIT(ProtoInspIRCd)
diff --git a/src/protocol/inspircd12.cpp b/src/protocol/inspircd12.cpp
deleted file mode 100644
index 49197e9ae..000000000
--- a/src/protocol/inspircd12.cpp
+++ /dev/null
@@ -1,1371 +0,0 @@
-/* inspircd 1.2 functions
- *
- * (C) 2003-2010 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 "services.h"
-#include "modules.h"
-#include "hashcomp.h"
-
-#ifndef _WIN32
-# include <sys/socket.h>
-# include <netinet/in.h>
-# include <arpa/inet.h>
-#endif
-
-#ifdef _WIN32
-# include <winsock.h>
-int inet_aton(const char *name, struct in_addr *addr)
-{
- uint32 a = inet_addr(name);
- addr->s_addr = a;
- return a != (uint32) - 1;
-}
-#endif
-
-IRCDVar myIrcd[] = {
- {"InspIRCd 1.2", /* ircd name */
- "+I", /* Modes used by pseudoclients */
- 5, /* Chan Max Symbols */
- "+ao", /* Channel Umode used by Botserv bots */
- 1, /* SVSNICK */
- 1, /* Vhost */
- 0, /* Supports SNlines */
- 1, /* Supports SQlines */
- 1, /* Supports SZlines */
- 4, /* Number of server args */
- 0, /* Join 2 Set */
- 0, /* Join 2 Message */
- 1, /* TS Topic Forward */
- 0, /* TS Topci Backward */
- 0, /* Chan SQlines */
- 0, /* Quit on Kill */
- 0, /* SVSMODE unban */
- 1, /* Reverse */
- 1, /* vidents */
- 1, /* svshold */
- 0, /* time stamp on mode */
- 0, /* NICKIP */
- 0, /* O:LINE */
- 1, /* UMODE */
- 1, /* VHOST ON NICK */
- 0, /* Change RealName */
- 1, /* No Knock requires +i */
- 0, /* We support inspircd 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 */
- 1, /* CIDR channelbans */
- "$", /* TLD Prefix for Global */
- 20, /* Max number of modes we can send per line */
- }
- ,
- {NULL}
-};
-
-static bool has_servicesmod = false;
-static bool has_globopsmod = false;
-static bool has_svsholdmod = false;
-static bool has_chghostmod = false;
-static bool has_chgidentmod = false;
-static bool has_hidechansmod = false;
-
-/* Previously introduced user during burst */
-static User *prev_u_intro = NULL;
-
-/* CHGHOST */
-void inspircd_cmd_chghost(const char *nick, const char *vhost)
-{
- if (!has_chghostmod)
- {
- ircdproto->SendGlobops(OperServ, "CHGHOST not loaded!");
- return;
- }
-
- BotInfo *bi = OperServ;
- send_cmd(bi->GetUID(), "CHGHOST %s %s", nick, vhost);
-}
-
-int anope_event_idle(const char *source, int ac, const char **av)
-{
- BotInfo *bi = findbot(av[0]);
- if (!bi)
- return MOD_CONT;
-
- send_cmd(bi->GetUID(), "IDLE %s %ld %ld", source, static_cast<long>(start_time), static_cast<long>(time(NULL) - bi->lastmsg));
- return MOD_CONT;
-}
-
-static char currentpass[1024];
-
-/* PASS */
-void inspircd_cmd_pass(const char *pass)
-{
- strlcpy(currentpass, pass, sizeof(currentpass));
-}
-
-class InspIRCdProto : public IRCDProto
-{
- void SendAkillDel(XLine *x)
- {
- BotInfo *bi = OperServ;
- send_cmd(bi->GetUID(), "GLINE %s", x->Mask.c_str());
- }
-
- void SendTopic(BotInfo *whosets, Channel *c, const char *whosetit, const char *topic)
- {
- send_cmd(whosets->GetUID(), "FTOPIC %s %lu %s :%s", c->name.c_str(), static_cast<unsigned long>(c->topic_time), whosetit, topic);
- }
-
- void SendVhostDel(User *u)
- {
- if (u->HasMode(UMODE_CLOAK))
- inspircd_cmd_chghost(u->nick.c_str(), u->chost.c_str());
- else
- inspircd_cmd_chghost(u->nick.c_str(), u->host);
-
- if (has_chgidentmod && u->GetIdent() != u->GetVIdent())
- inspircd_cmd_chgident(u->nick.c_str(), u->GetIdent().c_str());
- }
-
- void SendAkill(XLine *x)
- {
- // Calculate the time left before this would expire, capping it at 2 days
- time_t timeleft = x->Expires - time(NULL);
- if (timeleft > 172800 || !x->Expires)
- timeleft = 172800;
- BotInfo *bi = OperServ;
- send_cmd(bi->GetUID(), "ADDLINE G %s@%s %s %ld %ld :%s", x->GetUser().c_str(), x->GetHost().c_str(), x->By.c_str(), static_cast<long>(time(NULL)), static_cast<long>(timeleft), 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));
- }
-
- void SendNumericInternal(const char *source, int numeric, const char *dest, const char *buf)
- {
- send_cmd(TS6SID, "PUSH %s ::%s %03d %s %s", dest, source, numeric, dest, buf);
- }
-
- void SendGuestNick(const char *nick, const char *user, const char *host, const char *real, const char *modes)
- {
- send_cmd(TS6SID, "UID %ld %s %s %s %s +%s 0.0.0.0 :%s", static_cast<long>(time(NULL)), nick, host, host, user, modes, real);
- }
-
- void SendModeInternal(BotInfo *source, Channel *dest, const char *buf)
- {
- send_cmd(source ? source->GetUID() : TS6SID, "FMODE %s %u %s", dest->name.c_str(), static_cast<unsigned>(dest->creation_time), buf);
- }
-
- void SendModeInternal(BotInfo *bi, User *u, const char *buf)
- {
- if (!buf)
- return;
- send_cmd(bi ? bi->GetUID() : TS6SID, "MODE %s %s", u->GetUID().c_str(), buf);
- }
-
- 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)
- {
- send_cmd(TS6SID, "UID %s %ld %s %s %s %s 0.0.0.0 %ld %s :%s", uid.c_str(), static_cast<long>(time(NULL)), nick.c_str(), host.c_str(), host.c_str(), user.c_str(), static_cast<long>(time(NULL)), modes, real.c_str());
- }
-
- void SendKickInternal(BotInfo *source, Channel *chan, User *user, const char *buf)
- {
- if (buf)
- send_cmd(source->GetUID(), "KICK %s %s :%s", chan->name.c_str(), user->GetUID().c_str(), buf);
- else
- send_cmd(source->GetUID(), "KICK %s %s :%s", chan->name.c_str(), user->GetUID().c_str(), user->nick.c_str());
- }
-
- void SendNoticeChanopsInternal(BotInfo *source, Channel *dest, const char *buf)
- {
- send_cmd(TS6SID, "NOTICE @%s :%s", dest->name.c_str(), buf);
- }
-
- /* SERVER services-dev.chatspike.net password 0 :Description here */
- void SendServer(Server *server)
- {
- send_cmd(NULL, "SERVER %s %s %d %s :%s", server->GetName().c_str(), currentpass, server->GetHops(), server->GetSID().c_str(), server->GetDescription().c_str());
- }
-
- /* JOIN */
- void SendJoin(BotInfo *user, const char *channel, time_t chantime)
- {
- send_cmd(TS6SID, "FJOIN %s %ld + :,%s", channel, static_cast<long>(chantime), user->GetUID().c_str());
- }
-
- /* UNSQLINE */
- void SendSQLineDel(XLine *x)
- {
- send_cmd(TS6SID, "DELLINE Q %s", x->Mask.c_str());
- }
-
- /* SQLINE */
- void SendSQLine(XLine *x)
- {
- send_cmd(TS6SID, "ADDLINE Q %s %s %ld 0 :%s", x->Mask.c_str(), Config.s_OperServ, static_cast<long>(time(NULL)), x->Reason.c_str());
- }
-
- /* SQUIT */
- void SendSquit(const char *servname, const char *message)
- {
- send_cmd(TS6SID, "SQUIT %s :%s", servname, message);
- }
-
- /* Functions that use serval cmd functions */
-
- void SendVhost(User *u, const std::string &vIdent, const std::string &vhost)
- {
- if (!vIdent.empty())
- inspircd_cmd_chgident(u->nick.c_str(), vIdent.c_str());
- if (!vhost.empty())
- inspircd_cmd_chghost(u->nick.c_str(), vhost.c_str());
- }
-
- void SendConnect()
- {
- inspircd_cmd_pass(uplink_server->password);
- SendServer(Me);
- send_cmd(TS6SID, "BURST");
- send_cmd(TS6SID, "VERSION :Anope-%s %s :%s - (%s) -- %s", Anope::Version().c_str(), Config.ServerName, ircd->name, Config.EncModuleList.begin()->c_str(), Anope::Build().c_str());
- }
-
- /* CHGIDENT */
- void inspircd_cmd_chgident(const char *nick, const char *vIdent)
- {
- if (!has_chgidentmod)
- ircdproto->SendGlobops(OperServ, "CHGIDENT not loaded!");
- else
- {
- BotInfo *bi = OperServ;
- send_cmd(bi->GetUID(), "CHGIDENT %s %s", nick, vIdent);
- }
- }
-
- /* SVSHOLD - set */
- void SendSVSHold(const char *nick)
- {
- BotInfo *bi = OperServ;
- send_cmd(bi->GetUID(), "SVSHOLD %s %u :%s", nick, static_cast<unsigned>(Config.NSReleaseTimeout), "Being held for registered user");
- }
-
- /* SVSHOLD - release */
- void SendSVSHoldDel(const char *nick)
- {
- BotInfo *bi = OperServ;
- send_cmd(bi->GetUID(), "SVSHOLD %s", nick);
- }
-
- /* UNSZLINE */
- void SendSZLineDel(XLine *x)
- {
- send_cmd(TS6SID, "DELLINE Z %s", x->Mask.c_str());
- }
-
- /* SZLINE */
- void SendSZLine(XLine *x)
- {
- send_cmd(TS6SID, "ADDLINE Z %s %s %ld 0 :%s", x->Mask.c_str(), x->By.c_str(), static_cast<long>(time(NULL)), x->Reason.c_str());
- }
-
- /* SVSMODE -r */
- void SendUnregisteredNick(User *u)
- {
- u->RemoveMode(NickServ, UMODE_REGISTERED);
- }
-
- void SendSVSJoin(const char *source, const char *nick, const char *chan, const char *param)
- {
- User *u = finduser(nick);
- BotInfo *bi = findbot(source);
- send_cmd(bi->GetUID(), "SVSJOIN %s %s", u->GetUID().c_str(), chan);
- }
-
- void SendSVSPart(const char *source, const char *nick, const char *chan)
- {
- User *u = finduser(nick);
- BotInfo *bi = findbot(source);
- send_cmd(bi->GetUID(), "SVSPART %s %s", u->GetUID().c_str(), chan);
- }
-
- void SendSWhois(const char *source, const char *who, const char *mask)
- {
- User *u = finduser(who);
-
- send_cmd(TS6SID, "METADATA %s swhois :%s", u->GetUID().c_str(), mask);
- }
-
- void SendEOB()
- {
- send_cmd(TS6SID, "ENDBURST");
- }
-
- void SendGlobopsInternal(BotInfo *source, const char *buf)
- {
- if (has_globopsmod)
- send_cmd(source ? source->GetUID() : TS6SID, "SNONOTICE g :%s", buf);
- else
- send_cmd(source ? source->GetUID() : TS6SID, "SNONOTICE A :%s", buf);
- }
-
- void SendAccountLogin(User *u, NickCore *account)
- {
- send_cmd(TS6SID, "METADATA %s accountname :%s", u->GetUID().c_str(), account->display);
- }
-
- void SendAccountLogout(User *u, NickCore *account)
- {
- send_cmd(TS6SID, "METADATA %s accountname :", u->GetUID().c_str());
- }
-
- int IsNickValid(const char *nick)
- {
- /* InspIRCd, like TS6, uses UIDs on collision, so... */
- if (isdigit(*nick))
- return 0;
- return 1;
- }
-
- void SetAutoIdentificationToken(User *u)
- {
- if (!u->Account())
- return;
-
- u->SetMode(NickServ, UMODE_REGISTERED);
- }
-} ircd_proto;
-
-int anope_event_ftopic(const char *source, int ac, const char **av)
-{
- /* :source FTOPIC channel ts setby :topic */
- const char *temp;
- if (ac < 4)
- return MOD_CONT;
- temp = av[1]; /* temp now holds ts */
- av[1] = av[2]; /* av[1] now holds set by */
- av[2] = temp; /* av[2] now holds ts */
- do_topic(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_mode(const char *source, int ac, const char **av)
-{
- if (*av[0] == '#' || *av[0] == '&')
- do_cmode(source, ac, av);
- else
- {
- /* InspIRCd lets opers change another
- users modes, we have to kludge this
- as it slightly breaks RFC1459
- */
- User *u = finduser(source);
- User *u2 = finduser(av[0]);
-
- // This can happen with server-origin modes.
- if (!u)
- u = u2;
-
- // if it's still null, drop it like fire.
- // most likely situation was that server introduced a nick which we subsequently akilled
- if (u == NULL)
- return MOD_CONT;
-
- av[0] = u2->nick.c_str();
- do_umode(u->nick.c_str(), ac, av);
- }
- return MOD_CONT;
-}
-
-int anope_event_opertype(const char *source, int ac, const char **av)
-{
- /* opertype is equivalent to mode +o because servers
- dont do this directly */
- User *u;
- u = finduser(source);
- if (u && !is_oper(u))
- {
- const char *newav[2];
- newav[0] = source;
- newav[1] = "+o";
- return anope_event_mode(source, 2, newav);
- }
- else
- return MOD_CONT;
-}
-
-int anope_event_fmode(const char *source, int ac, const char **av)
-{
- const char *newav[25];
- int n, o;
- Channel *c;
-
- /* :source FMODE #test 12345678 +nto foo */
- if (ac < 3)
- return MOD_CONT;
-
- /* Checking the TS for validity to avoid desyncs */
- if ((c = findchan(av[0])))
- {
- if (c->creation_time > strtol(av[1], NULL, 10))
- /* Our TS is bigger, we should lower it */
- c->creation_time = strtol(av[1], NULL, 10);
- else if (c->creation_time < strtol(av[1], NULL, 10))
- /* The TS we got is bigger, we should ignore this message. */
- return MOD_CONT;
- }
- else
- /* Got FMODE for a non-existing channel */
- return MOD_CONT;
-
- /* TS's are equal now, so we can proceed with parsing */
- n = o = 0;
- while (n < ac)
- {
- if (n != 1)
- {
- newav[o] = av[n];
- ++o;
- Alog(LOG_DEBUG) << "Param: " << newav[o - 1];
- }
- ++n;
- }
-
- return anope_event_mode(source, ac - 1, newav);
-}
-
-/*
- * [Nov 03 22:31:57.695076 2009] debug: Received: :964 FJOIN #test 1223763723 +BPSnt :,964AAAAAB ,964AAAAAC ,966AAAAAA
- *
- * 0: name
- * 1: channel ts (when it was created, see protocol docs for more info)
- * 2: channel modes + params (NOTE: this may definitely be more than one param!)
- * last: users
- */
-int anope_event_fjoin(const char *source, int ac, const char **av)
-{
- Channel *c = findchan(av[0]);
- time_t ts = atol(av[1]);
- bool was_created = false;
- bool keep_their_modes = true;
-
- if (!c)
- {
- c = new Channel(av[0], 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 FJOIN 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();
-
- /* Loop through prefixes and find modes for them */
- while (buf[0] != ',')
- {
- ChannelMode *cm = ModeManager::FindChannelModeByChar(buf[0]);
- if (!cm)
- {
- Alog() << "Recieved unknown mode prefix " << buf[0] << " in FJOIN string";
- buf.erase(buf.begin());
- continue;
- }
-
- buf.erase(buf.begin());
- Status.push_back(cm);
- }
- buf.erase(buf.begin());
-
- User *u = finduser(buf);
- if (!u)
- {
- Alog(LOG_DEBUG) << "FJOIN 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;
-}
-
-/* Events */
-int anope_event_ping(const char *source, int ac, const char **av)
-{
- if (ac == 1)
- ircdproto->SendPong(NULL, av[0]);
-
- if (ac == 2)
- ircdproto->SendPong(av[1], av[0]);
-
- return MOD_CONT;
-}
-
-int anope_event_time(const char *source, int ac, const char **av)
-{
- if (ac !=2)
- return MOD_CONT;
-
- send_cmd(TS6SID, "TIME %s %s %ld", source, av[1], static_cast<long>(time(NULL)));
-
- /* We handled it, don't pass it on to the core..
- * The core doesn't understand our syntax anyways.. ~ Viper */
- return MOD_STOP;
-}
-
-int anope_event_436(const char *source, int ac, const char **av)
-{
- m_nickcoll(av[0]);
- return MOD_CONT;
-}
-
-int anope_event_away(const char *source, int ac, const char **av)
-{
- m_away(source, (ac ? av[0] : NULL));
- return MOD_CONT;
-}
-
-/* Taken from hybrid.c, topic syntax is identical */
-int anope_event_topic(const char *source, int ac, const char **av)
-{
- Channel *c = findchan(av[0]);
- time_t topic_time = time(NULL);
- User *u = finduser(source);
-
- if (!c)
- {
- Alog(LOG_DEBUG) << "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]);
-
- 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[0]));
- }
- else
- {
- FOREACH_MOD(I_OnTopicUpdated, OnTopicUpdated(c, ""));
- }
-
- return MOD_CONT;
-}
-
-int anope_event_squit(const char *source, int ac, const char **av)
-{
- do_squit(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_rsquit(const char *source, int ac, const char **av)
-{
- /* On InspIRCd we must send a SQUIT when we recieve RSQUIT for a server we have juped */
- Server *s = Server::Find(av[0]);
- if (s && s->HasFlag(SERVER_JUPED))
- send_cmd(TS6SID, "SQUIT %s :%s", s->GetSID().c_str(), ac > 1 ? av[1] : "");
-
- do_squit(source, ac, av);
-
- return MOD_CONT;
-}
-
-int anope_event_quit(const char *source, int ac, const char **av)
-{
- do_quit(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_kill(const char *source, int ac, const char **av)
-{
- User *u = finduser(av[0]);
- BotInfo *bi = findbot(av[0]);
- m_kill(u ? u->nick.c_str() : (bi ? bi->nick : av[0]), av[1]);
- return MOD_CONT;
-}
-
-int anope_event_kick(const char *source, int ac, const char **av)
-{
- do_kick(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_join(const char *source, int ac, const char **av)
-{
- do_join(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_motd(const char *source, int ac, const char **av)
-{
- m_motd(source);
- return MOD_CONT;
-}
-
-int anope_event_setname(const char *source, int ac, const char **av)
-{
- User *u;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "SETNAME for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetRealname(av[0]);
- return MOD_CONT;
-}
-
-int anope_event_chgname(const char *source, int ac, const char **av)
-{
- User *u;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "FNAME for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetRealname(av[0]);
- return MOD_CONT;
-}
-
-int anope_event_setident(const char *source, int ac, const char **av)
-{
- User *u;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "SETIDENT for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetIdent(av[0]);
- return MOD_CONT;
-}
-
-int anope_event_chgident(const char *source, int ac, const char **av)
-{
- User *u;
-
- u = finduser(av[0]);
- if (!u)
- {
- Alog(LOG_DEBUG) << "CHGIDENT for nonexistent user " << av[0];
- return MOD_CONT;
- }
-
- u->SetIdent(av[1]);
- return MOD_CONT;
-}
-
-int anope_event_sethost(const char *source, int ac, const char **av)
-{
- User *u;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "SETHOST for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetDisplayedHost(av[0]);
- return MOD_CONT;
-}
-
-int anope_event_nick(const char *source, int ac, const char **av)
-{
- do_nick(source, av[0], NULL, NULL, NULL, NULL, 0, 0, NULL, NULL);
- return MOD_CONT;
-}
-
-/*
- * [Nov 03 22:09:58.176252 2009] debug: Received: :964 UID 964AAAAAC 1225746297 w00t2 localhost testnet.user w00t 127.0.0.1 1225746302 +iosw +ACGJKLNOQcdfgjklnoqtx :Robin Burchell <w00t@inspircd.org>
- * 0: uid
- * 1: ts
- * 2: nick
- * 3: host
- * 4: dhost
- * 5: ident
- * 6: ip
- * 7: signon
- * 8+: modes and params -- IMPORTANT, some modes (e.g. +s) may have parameters. So don't assume a fixed position of realname!
- * last: realname
- */
-
-int anope_event_uid(const char *source, int ac, const char **av)
-{
- User *user;
- NickAlias *na;
- struct in_addr addy;
- Server *s = Server::Find(source ? source : "");
- uint32 *ad = reinterpret_cast<uint32 *>(&addy);
- int ts = strtoul(av[1], NULL, 10);
-
- /* Check if the previously introduced user was Id'd for the nickgroup of the nick he s currently using.
- * If not, validate the user. ~ Viper*/
- user = prev_u_intro;
- prev_u_intro = NULL;
- if (user) na = findnick(user->nick);
- if (user && !user->server->IsSynced() && (!na || na->nc != user->Account()))
- {
- validate_user(user);
- if (user->HasMode(UMODE_REGISTERED))
- user->RemoveMode(NickServ, UMODE_REGISTERED);
- }
- user = NULL;
-
- inet_aton(av[6], &addy);
- user = do_nick("", av[2], /* nick */
- av[5], /* username */
- av[3], /* realhost */
- s->GetName().c_str(), /* server */
- av[ac - 1], /* realname */
- ts, htonl(*ad), av[4], av[0]);
- if (user)
- {
- UserSetInternalModes(user, 1, &av[8]);
- user->SetCloakedHost(av[4]);
- if (!user->server->IsSynced())
- prev_u_intro = user;
- else
- validate_user(user);
- }
-
- return MOD_CONT;
-}
-
-int anope_event_chghost(const char *source, int ac, const char **av)
-{
- User *u;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "FHOST for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetDisplayedHost(av[0]);
- return MOD_CONT;
-}
-
-/*
- * [Nov 04 00:08:46.308435 2009] debug: Received: SERVER irc.inspircd.com pass 0 964 :Testnet Central!
- * 0: name
- * 1: pass
- * 2: hops
- * 3: numeric
- * 4: desc
- */
-int anope_event_server(const char *source, int ac, const char **av)
-{
- do_server(source, av[0], atoi(av[2]), av[4], av[3]);
- return MOD_CONT;
-}
-
-int anope_event_privmsg(const char *source, int ac, const char **av)
-{
- if (!finduser(source))
- return MOD_CONT; // likely a message from a server, which can happen.
-
- m_privmsg(source, av[0], av[1]);
- return MOD_CONT;
-}
-
-int anope_event_part(const char *source, int ac, const char **av)
-{
- do_part(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_whois(const char *source, int ac, const char **av)
-{
- m_whois(source, av[0]);
- return MOD_CONT;
-}
-
-int anope_event_metadata(const char *source, int ac, const char **av)
-{
- User *u;
-
- if (ac < 3)
- return MOD_CONT;
- else if (!strcmp(av[1], "accountname"))
- {
- if ((u = finduser(av[0])))
- {
- /* Identify the user for this account - Adam */
- u->AutoID(av[2]);
- }
- }
-
- return MOD_CONT;
-}
-
-int anope_event_capab(const char *source, int ac, const char **av)
-{
- if (!strcasecmp(av[0], "START"))
- {
- /* reset CAPAB */
- has_servicesmod = false;
- has_globopsmod = false;
- has_svsholdmod = false;
- has_chghostmod = false;
- has_chgidentmod = false;
- has_hidechansmod = false;
- }
- else if (!strcasecmp(av[0], "MODULES"))
- {
- if (strstr(av[1], "m_globops.so"))
- has_globopsmod = true;
- if (strstr(av[1], "m_services_account.so"))
- has_servicesmod = true;
- if (strstr(av[1], "m_svshold.so"))
- has_svsholdmod = true;
- if (strstr(av[1], "m_chghost.so"))
- has_chghostmod = true;
- if (strstr(av[1], "m_chgident.so"))
- has_chgidentmod = true;
- if (strstr(av[1], "m_hidechans.so"))
- has_hidechansmod = true;
- if (strstr(av[1], "m_servprotect.so"))
- ircd->pseudoclient_mode = "+Ik";
- }
- else if (!strcasecmp(av[0], "CAPABILITIES"))
- {
- spacesepstream ssep(av[1]);
- std::string capab;
- while (ssep.GetToken(capab))
- {
- if (capab.find("CHANMODES") != std::string::npos)
- {
- std::string modes(capab.begin() + 10, capab.end());
- commasepstream sep(modes);
- std::string modebuf;
-
- sep.GetToken(modebuf);
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- switch (modebuf[t])
- {
- case 'b':
- ModeManager::AddChannelMode(new ChannelModeBan('b'));
- continue;
- case 'e':
- ModeManager::AddChannelMode(new ChannelModeExcept('e'));
- continue;
- case 'I':
- ModeManager::AddChannelMode(new ChannelModeInvex('I'));
- continue;
- /* InspIRCd sends q and a here if they have no prefixes */
- case 'q':
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, "CMODE_OWNER", 'q', '@'));
- continue;
- case 'a':
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT , "CMODE_PROTECT", 'a', '@'));
- continue;
- // XXX list modes needs a bit of a rewrite, we need to be able to support +g here
- default:
- ModeManager::AddChannelMode(new ChannelModeList(CMODE_END, "", modebuf[t]));
- }
- }
-
- sep.GetToken(modebuf);
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- switch (modebuf[t])
- {
- case 'k':
- ModeManager::AddChannelMode(new ChannelModeKey('k'));
- continue;
- default:
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_END, "", modebuf[t]));
- }
- }
-
- sep.GetToken(modebuf);
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- switch (modebuf[t])
- {
- case 'F':
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_NICKFLOOD, "CMODE_NICKFLOOD", 'F', true));
- continue;
- case 'J':
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_NOREJOIN, "CMODE_NOREJOIN", 'J', true));
- continue;
- case 'L':
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_REDIRECT, "CMODE_REDIRECT", 'L', true));
- continue;
- case 'f':
- ModeManager::AddChannelMode(new ChannelModeFlood('f', true));
- continue;
- case 'j':
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_JOINFLOOD, "CMODE_JOINFLOOD", 'j', true));
- continue;
- case 'l':
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_LIMIT, "CMODE_LIMIT", 'l', true));
- continue;
- default:
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_END, "", modebuf[t], true));
- }
- }
-
- sep.GetToken(modebuf);
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- switch (modebuf[t])
- {
- case 'A':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_ALLINVITE, "CMODE_ALLINVITE", 'A'));
- continue;
- case 'B':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_BLOCKCAPS, "CMODE_BLOCKCAPS", 'B'));
- continue;
- case 'C':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NOCTCP, "CMODE_NOCTCP", 'C'));
- continue;
- case 'D':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_DELAYEDJOIN, "CMODE_DELAYEDJOIN", 'D'));
- continue;
- case 'G':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_FILTER, "CMODE_FILTER", 'G'));
- continue;
- case 'K':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NOKNOCK, "CMODE_NOKNOCK", 'K'));
- continue;
- case 'M':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_REGMODERATED, "CMODE_REGMODERATED", 'M'));
- continue;
- case 'N':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NONICK, "CMODE_NONICK", 'N'));
- continue;
- case 'O':
- ModeManager::AddChannelMode(new ChannelModeOper('O'));
- continue;
- case 'P':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_PERM, "CMODE_PERM", 'P'));
- continue;
- case 'Q':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NOKICK, "CMODE_NOKICK", 'Q'));
- continue;
- case 'R':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_REGISTEREDONLY, "CMODE_REGISTEREDONLY", 'R'));
- continue;
- case 'S':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_STRIPCOLOR, "CMODE_STRIPCOLOR", 'S'));
- continue;
- case 'T':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NONOTICE, "CMODE_NONOTICE", 'T'));
- continue;
- case 'c':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_BLOCKCOLOR, "CMODE_BLOCKCOLOR", 'c'));
- continue;
- case 'i':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_INVITE, "CMODE_INVITE", 'i'));
- continue;
- case 'm':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_MODERATED, "CMODE_MODERATED", 'm'));
- continue;
- case 'n':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NOEXTERNAL, "CMODE_NOEXTERNAL", 'n'));
- continue;
- case 'p':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_PRIVATE, "CMODE_PRIVATE", 'p'));
- continue;
- case 'r':
- ModeManager::AddChannelMode(new ChannelModeRegistered('r'));
- continue;
- case 's':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, "CMODE_SECRET", 's'));
- continue;
- case 't':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, "CMODE_TOPIC", 't'));
- continue;
- case 'u':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_AUDITORIUM, "CMODE_AUDITORIUM", 'u'));
- continue;
- case 'z':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_SSL, "CMODE_SSL", 'z'));
- continue;
- default:
- ModeManager::AddChannelMode(new ChannelMode(CMODE_END, "", modebuf[t]));
- }
- }
- }
- else if (capab.find("USERMODES") != std::string::npos)
- {
- std::string modes(capab.begin() + 10, capab.end());
- commasepstream sep(modes);
- std::string modebuf;
-
- while (sep.GetToken(modebuf))
- {
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- switch (modebuf[t])
- {
- case 'h':
- ModeManager::AddUserMode(new UserMode(UMODE_HELPOP, "UMODE_HELPOP", 'h'));
- continue;
- case 'B':
- ModeManager::AddUserMode(new UserMode(UMODE_BOT, "UMODE_BOT", 'B'));
- continue;
- case 'G':
- ModeManager::AddUserMode(new UserMode(UMODE_FILTER, "UMODE_FILTER", 'G'));
- continue;
- case 'H':
- ModeManager::AddUserMode(new UserMode(UMODE_HIDEOPER, "UMODE_HIDEOPER", 'H'));
- continue;
- case 'I':
- ModeManager::AddUserMode(new UserMode(UMODE_PRIV, "UMODE_PRIV", 'I'));
- continue;
- case 'Q':
- ModeManager::AddUserMode(new UserMode(UMODE_HIDDEN, "UMODE_HIDDEN", 'Q'));
- continue;
- case 'R':
- ModeManager::AddUserMode(new UserMode(UMODE_REGPRIV, "UMODE_REGPRIV", 'R'));
- continue;
- case 'S':
- ModeManager::AddUserMode(new UserMode(UMODE_STRIPCOLOR, "UMODE_STRIPCOLOR", 'S'));
- continue;
- case 'W':
- ModeManager::AddUserMode(new UserMode(UMODE_WHOIS, "UMODE_WHOIS", 'W'));
- continue;
- case 'c':
- ModeManager::AddUserMode(new UserMode(UMODE_COMMONCHANS, "UMODE_COMMONCHANS", 'c'));
- continue;
- case 'g':
- ModeManager::AddUserMode(new UserMode(UMODE_CALLERID, "UMODE_CALLERID", 'g'));
- continue;
- case 'i':
- ModeManager::AddUserMode(new UserMode(UMODE_INVIS, "UMODE_INVIS", 'i'));
- continue;
- case 'k':
- ModeManager::AddUserMode(new UserMode(UMODE_PROTECTED, "UMODE_PROTECTED", 'k'));
- continue;
- case 'o':
- ModeManager::AddUserMode(new UserMode(UMODE_OPER, "UMODE_OPER", 'o'));
- continue;
- case 'r':
- ModeManager::AddUserMode(new UserMode(UMODE_REGISTERED, "UMODE_REGISTERED", 'r'));
- continue;
- case 'w':
- ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w'));
- continue;
- case 'x':
- ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, "UMODE_CLOAK", 'x'));
- continue;
- case 'd':
- ModeManager::AddUserMode(new UserMode(UMODE_DEAF, "UMODE_DEAF", 'd'));
- continue;
- default:
- ModeManager::AddUserMode(new UserMode(UMODE_END, "", modebuf[t]));
- }
- }
- }
- }
- else if (capab.find("PREFIX=(") != std::string::npos)
- {
- std::string modes(capab.begin() + 8, capab.begin() + capab.find(")"));
- std::string chars(capab.begin() + capab.find(")") + 1, capab.end());
-
- for (size_t t = 0, end = modes.size(); t < end; ++t)
- {
- switch (modes[t])
- {
- case 'q':
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, "CMODE_OWNER", 'q', chars[t]));
- continue;
- case 'a':
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT, "CMODE_PROTECT", 'a', chars[t]));
- continue;
- case 'o':
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, "CMODE_OP", 'o', chars[t]));
- continue;
- case 'h':
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_HALFOP, "CMODE_HALFOP", 'h', chars[t]));
- continue;
- case 'v':
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", 'v', chars[t]));
- continue;
- }
- }
- }
- else if (capab.find("MAXMODES=") != std::string::npos)
- {
- std::string maxmodes(capab.begin() + 9, capab.end());
- ircd->maxmodes = atoi(maxmodes.c_str());
- }
- }
- }
- else if (!strcasecmp(av[0], "END"))
- {
- if (!has_globopsmod)
- {
- send_cmd(NULL, "ERROR :m_globops is not loaded. This is required by Anope");
- quitmsg = "Remote server does not have the m_globops module loaded, and this is required.";
- quitting = 1;
- return MOD_STOP;
- }
- if (!has_servicesmod)
- {
- send_cmd(NULL, "ERROR :m_services_account.so is not loaded. This is required by Anope");
- quitmsg = "ERROR: Remote server does not have the m_services_account module loaded, and this is required.";
- quitting = 1;
- return MOD_STOP;
- }
- if (!has_hidechansmod)
- {
- send_cmd(NULL, "ERROR :m_hidechans.so is not loaded. This is required by Anope");
- quitmsg = "ERROR: Remote server does not have the m_hidechans module loaded, and this is required.";
- quitting = 1;
- return MOD_STOP;
- }
- if (!has_svsholdmod)
- ircdproto->SendGlobops(OperServ, "SVSHOLD missing, Usage disabled until module is loaded.");
- if (!has_chghostmod)
- ircdproto->SendGlobops(OperServ, "CHGHOST missing, Usage disabled until module is loaded.");
- if (!has_chgidentmod)
- ircdproto->SendGlobops(OperServ, "CHGIDENT missing, Usage disabled until module is loaded.");
- ircd->svshold = has_svsholdmod;
- }
-
- CapabParse(ac, av);
-
- return MOD_CONT;
-}
-
-int anope_event_endburst(const char *source, int ac, const char **av)
-{
- NickAlias *na;
- User *u = prev_u_intro;
- Server *s = Server::Find(source ? source : "");
-
- if (!s)
- throw new CoreException("Got ENDBURST without a source");
-
- /* Check if the previously introduced user was Id'd for the nickgroup of the nick he s currently using.
- * If not, validate the user. ~ Viper*/
- prev_u_intro = NULL;
- if (u)
- na = findnick(u->nick);
- if (u && !u->server->IsSynced() && (!na || na->nc != u->Account()))
- {
- validate_user(u);
- if (u->HasMode(UMODE_REGISTERED))
- u->RemoveMode(NickServ, UMODE_REGISTERED);
- }
-
- Alog() << "Processed ENDBURST for " << s->GetName();
-
- s->Sync(true);
- return MOD_CONT;
-}
-
-void moduleAddIRCDMsgs()
-{
- Anope::AddMessage("ENDBURST", anope_event_endburst);
- 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("MOTD", anope_event_motd);
- Anope::AddMessage("NICK", anope_event_nick);
- Anope::AddMessage("UID", anope_event_uid);
- Anope::AddMessage("CAPAB", anope_event_capab);
- Anope::AddMessage("PART", anope_event_part);
- Anope::AddMessage("PING", anope_event_ping);
- Anope::AddMessage("TIME", anope_event_time);
- 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("RSQUIT", anope_event_rsquit);
- Anope::AddMessage("TOPIC", anope_event_topic);
- Anope::AddMessage("WHOIS", anope_event_whois);
- Anope::AddMessage("SVSMODE", anope_event_mode);
- Anope::AddMessage("FHOST", anope_event_chghost);
- Anope::AddMessage("CHGIDENT", anope_event_chgident);
- Anope::AddMessage("FNAME", anope_event_chgname);
- Anope::AddMessage("SETHOST", anope_event_sethost);
- Anope::AddMessage("SETIDENT", anope_event_setident);
- Anope::AddMessage("SETNAME", anope_event_setname);
- Anope::AddMessage("FJOIN", anope_event_fjoin);
- Anope::AddMessage("FMODE", anope_event_fmode);
- Anope::AddMessage("FTOPIC", anope_event_ftopic);
- Anope::AddMessage("OPERTYPE", anope_event_opertype);
- Anope::AddMessage("IDLE", anope_event_idle);
- Anope::AddMessage("METADATA", anope_event_metadata);
-}
-
-bool ChannelModeFlood::IsValid(const std::string &value)
-{
- char *dp, *end;
- if (!value.empty() && value[0] != ':' && strtoul((value[0] == '*' ? value.c_str() + 1 : value.c_str()), &dp, 10) > 0 && *dp == ':' && *(++dp) && strtoul(dp, &end, 10) > 0 && !*end)
- return 1;
- else return 0;
-}
-
-class ProtoInspIRCd : public Module
-{
- public:
- ProtoInspIRCd(const std::string &modname, const std::string &creator) : Module(modname, creator)
- {
- this->SetAuthor("Anope");
- this->SetType(PROTOCOL);
-
- if (Config.Numeric)
- TS6SID = sstrdup(Config.Numeric);
-
- pmodule_ircd_version("InspIRCd 1.2");
- pmodule_ircd_var(myIrcd);
- pmodule_ircd_useTSMode(0);
-
- CapabType c[] = { CAPAB_NOQUIT, CAPAB_SSJ3, CAPAB_NICK2, CAPAB_VL, CAPAB_TLKEXT };
- for (unsigned i = 0; i < 5; ++i)
- Capab.SetFlag(c[i]);
-
- pmodule_ircd_proto(&ircd_proto);
- moduleAddIRCDMsgs();
-
- ModuleManager::Attach(I_OnUserNickChange, this);
- }
-
- ~ProtoInspIRCd()
- {
- delete [] TS6SID;
- }
-
- void OnUserNickChange(User *u, const std::string &)
- {
- /* InspIRCd 1.2 doesn't set -r on nick change, remove -r here. Note that if we have to set +r later
- * this will cancel out this -r, resulting in no mode changes.
- */
- u->RemoveMode(NickServ, UMODE_REGISTERED);
- }
-};
-
-MODULE_INIT(ProtoInspIRCd)
diff --git a/src/protocol/inspircd20.cpp b/src/protocol/inspircd20.cpp
deleted file mode 100644
index f74a045fc..000000000
--- a/src/protocol/inspircd20.cpp
+++ /dev/null
@@ -1,1351 +0,0 @@
-/* Inspircd 2.0 functions
- *
- * (C) 2003-2010 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 "services.h"
-#include "modules.h"
-#include "hashcomp.h"
-
-#ifndef _WIN32
-# include <sys/socket.h>
-# include <netinet/in.h>
-# include <arpa/inet.h>
-#endif
-
-#ifdef _WIN32
-# include <winsock.h>
-int inet_aton(const char *name, struct in_addr *addr)
-{
- uint32 a = inet_addr(name);
- addr->s_addr = a;
- return a != (uint32) - 1;
-}
-#endif
-
-IRCDVar myIrcd[] = {
- {"InspIRCd 2.0", /* ircd name */
- "+I", /* Modes used by pseudoclients */
- 5, /* Chan Max Symbols */
- "+ao", /* Channel Umode used by Botserv bots */
- 1, /* SVSNICK */
- 1, /* Vhost */
- 0, /* Supports SNlines */
- 1, /* Supports SQlines */
- 1, /* Supports SZlines */
- 4, /* Number of server args */
- 0, /* Join 2 Set */
- 0, /* Join 2 Message */
- 1, /* TS Topic Forward */
- 0, /* TS Topci Backward */
- 0, /* Chan SQlines */
- 0, /* Quit on Kill */
- 0, /* SVSMODE unban */
- 1, /* Reverse */
- 1, /* vidents */
- 1, /* svshold */
- 0, /* time stamp on mode */
- 0, /* NICKIP */
- 0, /* O:LINE */
- 1, /* UMODE */
- 1, /* VHOST ON NICK */
- 0, /* Change RealName */
- 1, /* No Knock requires +i */
- 0, /* We support inspircd 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 */
- 1, /* CIDR channelbans */
- "$", /* TLD Prefix for Global */
- 20, /* Max number of modes we can send per line */
- }
- ,
- {NULL}
-};
-
-static bool has_servicesmod = false;
-static bool has_svsholdmod = false;
-static bool has_chghostmod = false;
-static bool has_chgidentmod = false;
-
-/* Previously introduced user during burst */
-static User *prev_u_intro = NULL;
-
-/* CHGHOST */
-void inspircd_cmd_chghost(const char *nick, const char *vhost)
-{
- if (!has_chghostmod)
- {
- ircdproto->SendGlobops(OperServ, "CHGHOST not loaded!");
- return;
- }
-
- BotInfo *bi = OperServ;
- send_cmd(bi->GetUID(), "CHGHOST %s %s", nick, vhost);
-}
-
-int anope_event_idle(const char *source, int ac, const char **av)
-{
- BotInfo *bi = findbot(av[0]);
- if (!bi)
- return MOD_CONT;
-
- send_cmd(bi->GetUID(), "IDLE %s %ld %ld", source, static_cast<long>(start_time), static_cast<long>(time(NULL) - bi->lastmsg));
- return MOD_CONT;
-}
-
-static char currentpass[1024];
-
-/* PASS */
-void inspircd_cmd_pass(const char *pass)
-{
- strlcpy(currentpass, pass, sizeof(currentpass));
-}
-
-class InspIRCdProto : public IRCDProto
-{
- void SendAkillDel(XLine *x)
- {
- BotInfo *bi = OperServ;
- send_cmd(bi->GetUID(), "GLINE %s", x->Mask.c_str());
- }
-
- void SendTopic(BotInfo *whosets, Channel *c, const char *whosetit, const char *topic)
- {
- send_cmd(whosets->GetUID(), "FTOPIC %s %lu %s :%s", c->name.c_str(), static_cast<unsigned long>(c->topic_time), whosetit, topic);
- }
-
- void SendVhostDel(User *u)
- {
- if (u->HasMode(UMODE_CLOAK))
- inspircd_cmd_chghost(u->nick.c_str(), u->chost.c_str());
- else
- inspircd_cmd_chghost(u->nick.c_str(), u->host);
-
- if (has_chgidentmod && u->GetIdent() != u->GetVIdent())
- inspircd_cmd_chgident(u->nick.c_str(), u->GetIdent().c_str());
- }
-
- void SendAkill(XLine *x)
- {
- // Calculate the time left before this would expire, capping it at 2 days
- time_t timeleft = x->Expires - time(NULL);
- if (timeleft > 172800 || !x->Expires)
- timeleft = 172800;
- BotInfo *bi = OperServ;
- send_cmd(bi->GetUID(), "ADDLINE G %s@%s %s %ld %ld :%s", x->GetUser().c_str(), x->GetHost().c_str(), x->By.c_str(), static_cast<long>(time(NULL)), static_cast<long>(timeleft), 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));
- }
-
- void SendNumericInternal(const char *source, int numeric, const char *dest, const char *buf)
- {
- send_cmd(TS6SID, "PUSH %s ::%s %03d %s %s", dest, source, numeric, dest, buf);
- }
-
- void SendGuestNick(const char *nick, const char *user, const char *host, const char *real, const char *modes)
- {
- send_cmd(TS6SID, "UID %ld %s %s %s %s +%s 0.0.0.0 :%s", static_cast<long>(time(NULL)), nick, host, host, user, modes, real);
- }
-
- void SendModeInternal(BotInfo *source, Channel *dest, const char *buf)
- {
- send_cmd(source ? source->GetUID() : TS6SID, "FMODE %s %u %s", dest->name.c_str(), static_cast<unsigned>(dest->creation_time), buf);
- }
-
- void SendModeInternal(BotInfo *bi, User *u, const char *buf)
- {
- if (!buf)
- return;
- send_cmd(bi ? bi->GetUID() : TS6SID, "MODE %s %s", u->GetUID().c_str(), buf);
- }
-
- 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)
- {
- send_cmd(TS6SID, "UID %s %ld %s %s %s %s 0.0.0.0 %ld %s :%s", uid.c_str(), static_cast<long>(time(NULL)), nick.c_str(), host.c_str(), host.c_str(), user.c_str(), static_cast<long>(time(NULL)), modes, real.c_str());
- }
-
- void SendKickInternal(BotInfo *source, Channel *chan, User *user, const char *buf)
- {
- if (buf)
- send_cmd(source->GetUID(), "KICK %s %s :%s", chan->name.c_str(), user->GetUID().c_str(), buf);
- else
- send_cmd(source->GetUID(), "KICK %s %s :%s", chan->name.c_str(), user->GetUID().c_str(), user->nick.c_str());
- }
-
- void SendNoticeChanopsInternal(BotInfo *source, Channel *dest, const char *buf)
- {
- send_cmd(TS6SID, "NOTICE @%s :%s", dest->name.c_str(), buf);
- }
-
- /* SERVER services-dev.chatspike.net password 0 :Description here */
- void SendServer(Server *server)
- {
- send_cmd(NULL, "SERVER %s %s %d %s :%s", server->GetName().c_str(), currentpass, server->GetHops(), server->GetSID().c_str(), server->GetDescription().c_str());
- }
-
- /* JOIN */
- void SendJoin(BotInfo *user, const char *channel, time_t chantime)
- {
- send_cmd(TS6SID, "FJOIN %s %ld + :,%s", channel, static_cast<long>(chantime), user->GetUID().c_str());
- }
-
- /* UNSQLINE */
- void SendSQLineDel(XLine *x)
- {
- send_cmd(TS6SID, "DELLINE Q %s", x->Mask.c_str());
- }
-
- /* SQLINE */
- void SendSQLine(XLine *x)
- {
- send_cmd(TS6SID, "ADDLINE Q %s %s %ld 0 :%s", x->Mask.c_str(), Config.s_OperServ, static_cast<long>(time(NULL)), x->Reason.c_str());
- }
-
- /* SQUIT */
- void SendSquit(const char *servname, const char *message)
- {
- send_cmd(TS6SID, "SQUIT %s :%s", servname, message);
- }
-
- /* Functions that use serval cmd functions */
-
- void SendVhost(User *u, const std::string &vIdent, const std::string &vhost)
- {
- if (!vIdent.empty())
- inspircd_cmd_chgident(u->nick.c_str(), vIdent.c_str());
- if (!vhost.empty())
- inspircd_cmd_chghost(u->nick.c_str(), vhost.c_str());
- }
-
- void SendConnect()
- {
- send_cmd(NULL, "CAPAB START 1202");
- send_cmd(NULL, "CAPAB CAPABILITIES :PROTOCOL=1202");
- send_cmd(NULL, "CAPAB END");
- inspircd_cmd_pass(uplink_server->password);
- SendServer(Me);
- send_cmd(TS6SID, "BURST");
- send_cmd(TS6SID, "VERSION :Anope-%s %s :%s - (%s) -- %s", Anope::Version().c_str(), Config.ServerName, ircd->name, Config.EncModuleList.begin()->c_str(), Anope::Build().c_str());
- }
-
- /* CHGIDENT */
- void inspircd_cmd_chgident(const char *nick, const char *vIdent)
- {
- if (!has_chgidentmod)
- ircdproto->SendGlobops(OperServ, "CHGIDENT not loaded!");
- else
- {
- BotInfo *bi = OperServ;
- send_cmd(bi->GetUID(), "CHGIDENT %s %s", nick, vIdent);
- }
- }
-
- /* SVSHOLD - set */
- void SendSVSHold(const char *nick)
- {
- BotInfo *bi = OperServ;
- send_cmd(bi->GetUID(), "SVSHOLD %s %u :%s", nick, static_cast<unsigned>(Config.NSReleaseTimeout), "Being held for registered user");
- }
-
- /* SVSHOLD - release */
- void SendSVSHoldDel(const char *nick)
- {
- BotInfo *bi = OperServ;
- send_cmd(bi->GetUID(), "SVSHOLD %s", nick);
- }
-
- /* UNSZLINE */
- void SendSZLineDel(XLine *x)
- {
- send_cmd(TS6SID, "DELLINE Z %s", x->Mask.c_str());
- }
-
- /* SZLINE */
- void SendSZLine(XLine *x)
- {
- send_cmd(TS6SID, "ADDLINE Z %s %s %ld 0 :%s", x->Mask.c_str(), x->By.c_str(), static_cast<long>(time(NULL)), x->Reason.c_str());
- }
-
- /* SVSMODE -r */
- void SendUnregisteredNick(User *u)
- {
- u->RemoveMode(NickServ, UMODE_REGISTERED);
- }
-
- void SendSVSJoin(const char *source, const char *nick, const char *chan, const char *param)
- {
- User *u = finduser(nick);
- BotInfo *bi = findbot(source);
- send_cmd(bi->GetUID(), "SVSJOIN %s %s", u->GetUID().c_str(), chan);
- }
-
- void SendSVSPart(const char *source, const char *nick, const char *chan)
- {
- User *u = finduser(nick);
- BotInfo *bi = findbot(source);
- send_cmd(bi->GetUID(), "SVSPART %s %s", u->GetUID().c_str(), chan);
- }
-
- void SendSWhois(const char *source, const char *who, const char *mask)
- {
- User *u = finduser(who);
-
- send_cmd(TS6SID, "METADATA %s swhois :%s", u->GetUID().c_str(), mask);
- }
-
- void SendEOB()
- {
- send_cmd(TS6SID, "ENDBURST");
- }
-
- void SendGlobopsInternal(BotInfo *source, const char *buf)
- {
- send_cmd(source ? source->GetUID() : TS6SID, "SNONOTICE g :%s", buf);
- }
-
- void SendAccountLogin(User *u, NickCore *account)
- {
- send_cmd(TS6SID, "METADATA %s accountname :%s", u->GetUID().c_str(), account->display);
- }
-
- void SendAccountLogout(User *u, NickCore *account)
- {
- send_cmd(TS6SID, "METADATA %s accountname :", u->GetUID().c_str());
- }
-
- int IsNickValid(const char *nick)
- {
- /* InspIRCd, like TS6, uses UIDs on collision, so... */
- if (isdigit(*nick))
- return 0;
- return 1;
- }
-
- void SetAutoIdentificationToken(User *u)
- {
- if (!u->Account())
- return;
-
- u->SetMode(NickServ, UMODE_REGISTERED);
- }
-} ircd_proto;
-
-int anope_event_ftopic(const char *source, int ac, const char **av)
-{
- /* :source FTOPIC channel ts setby :topic */
- const char *temp;
- if (ac < 4)
- return MOD_CONT;
- temp = av[1]; /* temp now holds ts */
- av[1] = av[2]; /* av[1] now holds set by */
- av[2] = temp; /* av[2] now holds ts */
- do_topic(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_mode(const char *source, int ac, const char **av)
-{
- if (*av[0] == '#' || *av[0] == '&')
- do_cmode(source, ac, av);
- else
- {
- /* InspIRCd lets opers change another
- users modes, we have to kludge this
- as it slightly breaks RFC1459
- */
- User *u = finduser(source);
- User *u2 = finduser(av[0]);
-
- // This can happen with server-origin modes.
- if (!u)
- u = u2;
-
- // if it's still null, drop it like fire.
- // most likely situation was that server introduced a nick which we subsequently akilled
- if (u == NULL)
- return MOD_CONT;
-
- av[0] = u2->nick.c_str();
- do_umode(u->nick.c_str(), ac, av);
- }
- return MOD_CONT;
-}
-
-int anope_event_opertype(const char *source, int ac, const char **av)
-{
- /* opertype is equivalent to mode +o because servers
- dont do this directly */
- User *u;
- u = finduser(source);
- if (u && !is_oper(u))
- {
- const char *newav[2];
- newav[0] = source;
- newav[1] = "+o";
- return anope_event_mode(source, 2, newav);
- }
- else
- return MOD_CONT;
-}
-
-int anope_event_fmode(const char *source, int ac, const char **av)
-{
- const char *newav[25];
- int n, o;
- Channel *c;
-
- /* :source FMODE #test 12345678 +nto foo */
- if (ac < 3)
- return MOD_CONT;
-
- /* Checking the TS for validity to avoid desyncs */
- if ((c = findchan(av[0])))
- {
- if (c->creation_time > strtol(av[1], NULL, 10))
- /* Our TS is bigger, we should lower it */
- c->creation_time = strtol(av[1], NULL, 10);
- else if (c->creation_time < strtol(av[1], NULL, 10))
- /* The TS we got is bigger, we should ignore this message. */
- return MOD_CONT;
- }
- else
- /* Got FMODE for a non-existing channel */
- return MOD_CONT;
-
- /* TS's are equal now, so we can proceed with parsing */
- n = o = 0;
- while (n < ac)
- {
- if (n != 1)
- {
- newav[o] = av[n];
- ++o;
- Alog(LOG_DEBUG) << "Param: " << newav[o - 1];
- }
- ++n;
- }
-
- return anope_event_mode(source, ac - 1, newav);
-}
-
-/*
- * [Nov 03 22:31:57.695076 2009] debug: Received: :964 FJOIN #test 1223763723 +BPSnt :,964AAAAAB ,964AAAAAC ,966AAAAAA
- *
- * 0: name
- * 1: channel ts (when it was created, see protocol docs for more info)
- * 2: channel modes + params (NOTE: this may definitely be more than one param!)
- * last: users
- */
-int anope_event_fjoin(const char *source, int ac, const char **av)
-{
- Channel *c = findchan(av[0]);
- time_t ts = atol(av[1]);
- bool was_created = false;
- bool keep_their_modes = true;
-
- if (!c)
- {
- c = new Channel(av[0], 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 FJOIN 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();
-
- /* Loop through prefixes and find modes for them */
- while (buf[0] != ',')
- {
- ChannelMode *cm = ModeManager::FindChannelModeByChar(buf[0]);
- if (!cm)
- {
- Alog() << "Recieved unknown mode prefix " << buf[0] << " in FJOIN string";
- buf.erase(buf.begin());
- continue;
- }
-
- buf.erase(buf.begin());
- Status.push_back(cm);
- }
- buf.erase(buf.begin());
-
- User *u = finduser(buf);
- if (!u)
- {
- Alog(LOG_DEBUG) << "FJOIN 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;
-}
-
-/* Events */
-int anope_event_ping(const char *source, int ac, const char **av)
-{
- if (ac == 1)
- ircdproto->SendPong(NULL, av[0]);
-
- if (ac == 2)
- ircdproto->SendPong(av[1], av[0]);
-
- return MOD_CONT;
-}
-
-int anope_event_time(const char *source, int ac, const char **av)
-{
- if (ac !=2)
- return MOD_CONT;
-
- send_cmd(TS6SID, "TIME %s %s %ld", source, av[1], static_cast<long>(time(NULL)));
-
- /* We handled it, don't pass it on to the core..
- * The core doesn't understand our syntax anyways.. ~ Viper */
- return MOD_STOP;
-}
-
-int anope_event_436(const char *source, int ac, const char **av)
-{
- m_nickcoll(av[0]);
- return MOD_CONT;
-}
-
-int anope_event_away(const char *source, int ac, const char **av)
-{
- m_away(source, (ac ? av[0] : NULL));
- return MOD_CONT;
-}
-
-/* Taken from hybrid.c, topic syntax is identical */
-int anope_event_topic(const char *source, int ac, const char **av)
-{
- Channel *c = findchan(av[0]);
- time_t topic_time = time(NULL);
- User *u = finduser(source);
-
- if (!c)
- {
- Alog(LOG_DEBUG) << "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]);
-
- 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[0]));
- }
- else
- {
- FOREACH_MOD(I_OnTopicUpdated, OnTopicUpdated(c, ""));
- }
-
- return MOD_CONT;
-}
-
-int anope_event_squit(const char *source, int ac, const char **av)
-{
- do_squit(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_rsquit(const char *source, int ac, const char **av)
-{
- /* On InspIRCd we must send a SQUIT when we recieve RSQUIT for a server we have juped */
- Server *s = Server::Find(av[0]);
- if (s && s->HasFlag(SERVER_JUPED))
- send_cmd(TS6SID, "SQUIT %s :%s", s->GetSID().c_str(), ac > 1 ? av[1] : "");
-
- do_squit(source, ac, av);
-
- return MOD_CONT;
-}
-
-int anope_event_quit(const char *source, int ac, const char **av)
-{
- do_quit(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_kill(const char *source, int ac, const char **av)
-{
- User *u = finduser(av[0]);
- BotInfo *bi = findbot(av[0]);
- m_kill(u ? u->nick.c_str() : (bi ? bi->nick : av[0]), av[1]);
- return MOD_CONT;
-}
-
-int anope_event_kick(const char *source, int ac, const char **av)
-{
- do_kick(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_join(const char *source, int ac, const char **av)
-{
- do_join(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_motd(const char *source, int ac, const char **av)
-{
- m_motd(source);
- return MOD_CONT;
-}
-
-int anope_event_setname(const char *source, int ac, const char **av)
-{
- User *u;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "SETNAME for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetRealname(av[0]);
- return MOD_CONT;
-}
-
-int anope_event_chgname(const char *source, int ac, const char **av)
-{
- User *u;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "FNAME for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetRealname(av[0]);
- return MOD_CONT;
-}
-
-int anope_event_setident(const char *source, int ac, const char **av)
-{
- User *u;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "SETIDENT for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetIdent(av[0]);
- return MOD_CONT;
-}
-
-int anope_event_chgident(const char *source, int ac, const char **av)
-{
- User *u = finduser(source);
-
- if (!u)
- {
- Alog(LOG_DEBUG) << "FIDENT for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetIdent(av[0]);
- return MOD_CONT;
-}
-
-int anope_event_sethost(const char *source, int ac, const char **av)
-{
- User *u;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "SETHOST for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetDisplayedHost(av[0]);
- return MOD_CONT;
-}
-
-int anope_event_nick(const char *source, int ac, const char **av)
-{
- do_nick(source, av[0], NULL, NULL, NULL, NULL, 0, 0, NULL, NULL);
- return MOD_CONT;
-}
-
-/*
- * [Nov 03 22:09:58.176252 2009] debug: Received: :964 UID 964AAAAAC 1225746297 w00t2 localhost testnet.user w00t 127.0.0.1 1225746302 +iosw +ACGJKLNOQcdfgjklnoqtx :Robin Burchell <w00t@inspircd.org>
- * 0: uid
- * 1: ts
- * 2: nick
- * 3: host
- * 4: dhost
- * 5: ident
- * 6: ip
- * 7: signon
- * 8+: modes and params -- IMPORTANT, some modes (e.g. +s) may have parameters. So don't assume a fixed position of realname!
- * last: realname
- */
-
-int anope_event_uid(const char *source, int ac, const char **av)
-{
- User *user;
- NickAlias *na;
- struct in_addr addy;
- Server *s = Server::Find(source ? source : "");
- uint32 *ad = reinterpret_cast<uint32 *>(&addy);
- int ts = strtoul(av[1], NULL, 10);
-
- /* Check if the previously introduced user was Id'd for the nickgroup of the nick he s currently using.
- * If not, validate the user. ~ Viper*/
- user = prev_u_intro;
- prev_u_intro = NULL;
- if (user)
- na = findnick(user->nick);
- if (user && !user->server->IsSynced() && (!na || na->nc != user->Account()))
- {
- validate_user(user);
- if (user->HasMode(UMODE_REGISTERED))
- user->RemoveMode(NickServ, UMODE_REGISTERED);
- }
- user = NULL;
-
- inet_aton(av[6], &addy);
- user = do_nick("", av[2], /* nick */
- av[5], /* username */
- av[3], /* realhost */
- s->GetName().c_str(), /* server */
- av[ac - 1], /* realname */
- ts, htonl(*ad), av[4], av[0]);
- if (user)
- {
- UserSetInternalModes(user, 1, &av[8]);
- user->SetCloakedHost(av[4]);
- if (!user->server->IsSynced())
- prev_u_intro = user;
- else
- validate_user(user);
- }
-
- return MOD_CONT;
-}
-
-int anope_event_chghost(const char *source, int ac, const char **av)
-{
- User *u;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "FHOST for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetDisplayedHost(av[0]);
- return MOD_CONT;
-}
-
-/*
- * [Nov 04 00:08:46.308435 2009] debug: Received: SERVER irc.inspircd.com pass 0 964 :Testnet Central!
- * 0: name
- * 1: pass
- * 2: hops
- * 3: numeric
- * 4: desc
- */
-int anope_event_server(const char *source, int ac, const char **av)
-{
- do_server(source, av[0], atoi(av[2]), av[4], av[3]);
- return MOD_CONT;
-}
-
-int anope_event_privmsg(const char *source, int ac, const char **av)
-{
- if (!finduser(source))
- return MOD_CONT; // likely a message from a server, which can happen.
-
- m_privmsg(source, av[0], av[1]);
- return MOD_CONT;
-}
-
-int anope_event_part(const char *source, int ac, const char **av)
-{
- do_part(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_whois(const char *source, int ac, const char **av)
-{
- m_whois(source, av[0]);
- return MOD_CONT;
-}
-
-int anope_event_metadata(const char *source, int ac, const char **av)
-{
- User *u;
-
- if (ac < 3)
- return MOD_CONT;
- else if (!strcmp(av[1], "accountname"))
- {
- if ((u = finduser(av[0])))
- {
- /* Identify the user for this account - Adam */
- u->AutoID(av[2]);
- }
- }
-
- return MOD_CONT;
-}
-
-int anope_event_capab(const char *source, int ac, const char **av)
-{
- if (!strcasecmp(av[0], "START"))
- {
- if (ac < 2 || atoi(av[1]) < 1202)
- {
- send_cmd(NULL, "ERROR :Protocol mismatch, no or invalid protocol version given in CAPAB START");
- quitmsg = "Protocol mismatch, no or invalid protocol version given in CAPAB START";
- quitting = 1;
- return MOD_STOP;
- }
-
- /* reset CAPAB */
- has_servicesmod = false;
- has_svsholdmod = false;
- has_chghostmod = false;
- has_chgidentmod = false;
- }
- else if (!strcasecmp(av[0], "CHANMODES"))
- {
- spacesepstream ssep(av[1]);
- std::string capab;
-
- while (ssep.GetToken(capab))
- {
- std::string modename = capab.substr(0, capab.find('='));
- std::string modechar = capab.substr(capab.find('=') + 1);
- ChannelMode *cm = NULL;
-
- if (modename == "admin")
- cm = new ChannelModeStatus(CMODE_PROTECT, "CMODE_PROTECT", modechar[1], modechar[0]);
- else if (modename == "allowinvite")
- cm = new ChannelMode(CMODE_ALLINVITE, "CMODE_ALLINVITE", modechar[0]);
- else if (modename == "auditorium")
- cm = new ChannelMode(CMODE_AUDITORIUM, "CMODE_AUDITORIUM", modechar[0]);
- else if (modename == "autoop")
- continue; // XXX Not currently tracked
- else if (modename == "ban")
- cm = new ChannelModeBan(modechar[0]);
- else if (modename == "banexception")
- cm = new ChannelModeExcept(modechar[0]);
- else if (modename == "blockcaps")
- cm = new ChannelMode(CMODE_BLOCKCAPS, "CMODE_BLOCKCAPS", modechar[0]);
- else if (modename == "blockcolor")
- cm = new ChannelMode(CMODE_BLOCKCOLOR, "CMODE_BLOCKCOLOR", modechar[0]);
- else if (modename == "c_registered")
- cm = new ChannelModeRegistered(modechar[0]);
- else if (modename == "censor")
- cm = new ChannelMode(CMODE_FILTER, "CMODE_FILTER", modechar[0]);
- else if (modename == "delayjoin")
- cm = new ChannelMode(CMODE_DELAYEDJOIN, "CMODE_DELAYEDJOIN", modechar[0]);
- else if (modename == "delaymsg")
- continue;
- else if (modename == "exemptchanops")
- continue; // XXX
- else if (modename == "filter")
- continue; // XXX
- else if (modename == "flood")
- cm = new ChannelModeFlood(modechar[0], true);
- else if (modename == "founder")
- cm = new ChannelModeStatus(CMODE_OWNER, "CMODE_OWNER", modechar[1], modechar[0]);
- else if (modename == "halfop")
- cm = new ChannelModeStatus(CMODE_HALFOP, "CMODE_HALFOP", modechar[1], modechar[0]);
- else if (modename == "halfvoice")
- continue; // XXX - halfvoice? wtf
- else if (modename == "history")
- continue; // XXX
- else if (modename == "invex")
- cm = new ChannelModeInvex(modechar[0]);
- else if (modename == "inviteonly")
- cm = new ChannelMode(CMODE_INVITE, "CMODE_INVITE", modechar[0]);
- else if (modename == "joinflood")
- cm = new ChannelModeParam(CMODE_JOINFLOOD, "CMODE_JOINFLOOD", modechar[0], true);
- else if (modename == "key")
- cm = new ChannelModeKey(modechar[0]);
- else if (modename == "kicknorejoin")
- cm = new ChannelModeParam(CMODE_NOREJOIN, "CMODE_NOREJOIN", modechar[0], true);
- else if (modename == "limit")
- cm = new ChannelModeParam(CMODE_LIMIT, "CMODE_LIMIT", modechar[0], true);
- else if (modename == "moderated")
- cm = new ChannelMode(CMODE_MODERATED, "CMODE_MODERATED", modechar[0]);
- else if (modename == "namebase")
- continue; // XXX
- else if (modename == "nickflood")
- cm = new ChannelModeParam(CMODE_NICKFLOOD, "CMODE_NICKFLOOD", modechar[0], true);
- else if (modename == "noctcp")
- cm = new ChannelMode(CMODE_NOCTCP, "CMODE_NOCTCP", modechar[0]);
- else if (modename == "noextmsg")
- cm = new ChannelMode(CMODE_NOEXTERNAL, "CMODE_NOEXTERNAL", modechar[0]);
- else if (modename == "nokick")
- cm = new ChannelMode(CMODE_NOKICK, "CMODE_NOKICK", modechar[0]);
- else if (modename == "noknock")
- cm = new ChannelMode(CMODE_NOKNOCK, "CMODE_NOKNOCK", modechar[0]);
- else if (modename == "nonick")
- cm = new ChannelMode(CMODE_NONICK, "CMODE_NONICK", modechar[0]);
- else if (modename == "nonotice")
- cm = new ChannelMode(CMODE_NONOTICE, "CMODE_NONOTICE", modechar[0]);
- else if (modename == "official-join")
- continue; // XXX
- else if (modename == "op")
- cm = new ChannelModeStatus(CMODE_OP, "CMODE_OP", modechar[1], modechar[0]);
- else if (modename == "operonly")
- cm = new ChannelModeOper(modechar[0]);
- else if (modename == "operprefix")
- continue; // XXX
- else if (modename == "permanent")
- cm = new ChannelMode(CMODE_PERM, "CMODE_PERM", modechar[0]);
- else if (modename == "private")
- cm = new ChannelMode(CMODE_PRIVATE, "CMODE_PRIVATE", modechar[0]);
- else if (modename == "redirect")
- cm = new ChannelModeParam(CMODE_REDIRECT, "CMODE_REDIRECT", modechar[0], true);
- else if (modename == "reginvite")
- cm = new ChannelMode(CMODE_REGISTEREDONLY, "CMODE_REGISTEREDONLY", modechar[0]);
- else if (modename == "regmoderated")
- cm = new ChannelMode(CMODE_REGMODERATED, "CMODE_REGMODERATED", modechar[0]);
- else if (modename == "secret")
- cm = new ChannelMode(CMODE_SECRET, "CMODE_SECRET", modechar[0]);
- else if (modename == "sslonly")
- cm = new ChannelMode(CMODE_SSL, "CMODE_SSL", modechar[0]);
- else if (modename == "stripcolor")
- cm = new ChannelMode(CMODE_STRIPCOLOR, "CMODE_STRIPCOLOR", modechar[0]);
- else if (modename == "topiclock")
- cm = new ChannelMode(CMODE_TOPIC, "CMODE_TOPIC", modechar[0]);
- else if (modename == "voice")
- cm = new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", modechar[1], modechar[0]);
-
- if (cm)
- ModeManager::AddChannelMode(cm);
- else
- Alog() << "Unrecognized mode string in CAPAB CHANMODES: " << capab;
- }
- }
- else if (!strcasecmp(av[0], "USERMODES"))
- {
- spacesepstream ssep(av[1]);
- std::string capab;
-
- while (ssep.GetToken(capab))
- {
- std::string modename = capab.substr(0, capab.find('='));
- std::string modechar = capab.substr(capab.find('=') + 1);
- UserMode *um = NULL;
-
- if (modename == "bot")
- um = new UserMode(UMODE_BOT, "UMODE_BOT", modechar[0]);
- else if (modename == "callerid")
- um = new UserMode(UMODE_CALLERID, "UMODE_CALLERID", modechar[0]);
- else if (modename == "cloak")
- um = new UserMode(UMODE_CLOAK, "UMODE_CLOAK", modechar[0]);
- else if (modename == "deaf")
- um = new UserMode(UMODE_DEAF, "UMODE_DEAF", modechar[0]);
- else if (modename == "deaf_commonchan")
- um = new UserMode(UMODE_COMMONCHANS, "UMODE_COMMONCHANS", modechar[0]);
- else if (modename == "helpop")
- um = new UserMode(UMODE_HELPOP, "UMODE_HELPOP", modechar[0]);
- else if (modename == "hidechans")
- um = new UserMode(UMODE_PRIV, "UMODE_PRIV", modechar[0]);
- else if (modename == "hideoper")
- um = new UserMode(UMODE_HIDEOPER, "UMODE_HIDEOPER", modechar[0]);
- else if (modename == "invisible")
- um = new UserMode(UMODE_INVIS, "UMODE_INVIS", modechar[0]);
- else if (modename == "oper")
- um = new UserMode(UMODE_OPER, "UMODE_OPER", modechar[0]);
- else if (modename == "regdeaf")
- um = new UserMode(UMODE_REGPRIV, "UMODE_REGPRIV", modechar[0]);
- else if (modename == "servprotect")
- um = new UserMode(UMODE_PROTECTED, "UMODE_PROTECTED", modechar[0]);
- else if (modename == "showwhois")
- um = new UserMode(UMODE_WHOIS, "UMODE_WHOIS", modechar[0]);
- else if (modename == "snomask")
- continue; // XXX
- else if (modename == "u_censor")
- um = new UserMode(UMODE_FILTER, "UMODE_FILTER", modechar[0]);
- else if (modename == "u_registered")
- um = new UserMode(UMODE_REGISTERED, "UMODE_REGISTERED", modechar[0]);
- else if (modename == "u_stripcolor")
- um = new UserMode(UMODE_STRIPCOLOR, "UMODE_STRIPCOLOR", modechar[0]);
- else if (modename == "wallops")
- um = new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", modechar[0]);
-
- if (um)
- ModeManager::AddUserMode(um);
- else
- Alog() << "Unrecognized mode string in CAPAB USERMODES: " << capab;
- }
- }
- else if (!strcasecmp(av[0], "MODULES"))
- {
- spacesepstream ssep(av[1]);
- std::string module;
-
- while (ssep.GetToken(module))
- if (module == "m_svshold.so")
- has_svsholdmod = true;
- }
- else if (!strcasecmp(av[0], "MODSUPPORT"))
- {
- spacesepstream ssep(av[1]);
- std::string module;
-
- while (ssep.GetToken(module))
- {
- if (module == "m_services_account.so")
- has_servicesmod = true;
- else if (module == "m_chghost.so")
- has_chghostmod = true;
- else if (module == "m_chgident.so")
- has_chgidentmod = true;
- else if (module == "m_servprotect.so")
- ircd->pseudoclient_mode = "+Ik";
- }
- }
- else if (!strcasecmp(av[0], "CAPABILITIES"))
- {
- spacesepstream ssep(av[1]);
- std::string capab;
- while (ssep.GetToken(capab))
- {
- if (capab.find("CHANMODES") != std::string::npos)
- {
- std::string modes(capab.begin() + 10, capab.end());
- commasepstream sep(modes);
- std::string modebuf;
-
- sep.GetToken(modebuf);
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- if (ModeManager::FindChannelModeByChar(modebuf[t]))
- continue;
- // XXX list modes needs a bit of a rewrite
- ModeManager::AddChannelMode(new ChannelModeList(CMODE_END, "", modebuf[t]));
- }
-
- sep.GetToken(modebuf);
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- if (ModeManager::FindChannelModeByChar(modebuf[t]))
- continue;
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_END, "", modebuf[t]));
- }
-
- sep.GetToken(modebuf);
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- if (ModeManager::FindChannelModeByChar(modebuf[t]))
- continue;
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_END, "", modebuf[t], true));
- }
-
- sep.GetToken(modebuf);
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- if (ModeManager::FindChannelModeByChar(modebuf[t]));
- continue;
- ModeManager::AddChannelMode(new ChannelMode(CMODE_END, "", modebuf[t]));
- }
- }
- else if (capab.find("USERMODES") != std::string::npos)
- {
- std::string modes(capab.begin() + 10, capab.end());
- commasepstream sep(modes);
- std::string modebuf;
-
- sep.GetToken(modebuf);
- sep.GetToken(modebuf);
-
- if (sep.GetToken(modebuf))
- {
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- ModeManager::AddUserMode(new UserModeParam(UMODE_END, "", modebuf[t]));
- }
- }
-
- if (sep.GetToken(modebuf))
- {
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- ModeManager::AddUserMode(new UserMode(UMODE_END, "", modebuf[t]));
- }
- }
- }
- else if (capab.find("MAXMODES=") != std::string::npos)
- {
- std::string maxmodes(capab.begin() + 9, capab.end());
- ircd->maxmodes = atoi(maxmodes.c_str());
- }
- }
- }
- else if (!strcasecmp(av[0], "END"))
- {
- if (!has_servicesmod)
- {
- send_cmd(NULL, "ERROR :m_services_account.so is not loaded. This is required by Anope");
- quitmsg = "ERROR: Remote server does not have the m_services_account module loaded, and this is required.";
- quitting = 1;
- return MOD_STOP;
- }
- if (!ModeManager::FindUserModeByName(UMODE_PRIV))
- {
- send_cmd(NULL, "ERROR :m_hidechans.so is not loaded. This is required by Anope");
- quitmsg = "ERROR: Remote server does not have the m_hidechans module loaded, and this is required.";
- quitting = 1;
- return MOD_STOP;
- }
- if (!has_svsholdmod)
- ircdproto->SendGlobops(OperServ, "SVSHOLD missing, Usage disabled until module is loaded.");
- if (!has_chghostmod)
- ircdproto->SendGlobops(OperServ, "CHGHOST missing, Usage disabled until module is loaded.");
- if (!has_chgidentmod)
- ircdproto->SendGlobops(OperServ, "CHGIDENT missing, Usage disabled until module is loaded.");
- ircd->svshold = has_svsholdmod;
- }
-
- CapabParse(ac, av);
-
- return MOD_CONT;
-}
-
-int anope_event_endburst(const char *source, int ac, const char **av)
-{
- NickAlias *na;
- User *u = prev_u_intro;
- Server *s = Server::Find(source ? source : "");
-
- if (!s)
- throw new CoreException("Got ENDBURST without a source");
-
- /* Check if the previously introduced user was Id'd for the nickgroup of the nick he s currently using.
- * If not, validate the user. ~ Viper*/
- prev_u_intro = NULL;
- if (u)
- na = findnick(u->nick);
- if (u && !u->server->IsSynced() && (!na || na->nc != u->Account()))
- {
- validate_user(u);
- if (u->HasMode(UMODE_REGISTERED))
- u->RemoveMode(NickServ, UMODE_REGISTERED);
- }
-
- Alog() << "Processed ENDBURST for " << s->GetName();
-
- s->Sync(true);
- return MOD_CONT;
-}
-
-void moduleAddIRCDMsgs()
-{
- Anope::AddMessage("ENDBURST", anope_event_endburst);
- 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("MOTD", anope_event_motd);
- Anope::AddMessage("NICK", anope_event_nick);
- Anope::AddMessage("UID", anope_event_uid);
- Anope::AddMessage("CAPAB", anope_event_capab);
- Anope::AddMessage("PART", anope_event_part);
- Anope::AddMessage("PING", anope_event_ping);
- Anope::AddMessage("TIME", anope_event_time);
- 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("RSQUIT", anope_event_rsquit);
- Anope::AddMessage("TOPIC", anope_event_topic);
- Anope::AddMessage("WHOIS", anope_event_whois);
- Anope::AddMessage("SVSMODE", anope_event_mode);
- Anope::AddMessage("FHOST", anope_event_chghost);
- Anope::AddMessage("FIDENT", anope_event_chgident);
- Anope::AddMessage("FNAME", anope_event_chgname);
- Anope::AddMessage("SETHOST", anope_event_sethost);
- Anope::AddMessage("SETIDENT", anope_event_setident);
- Anope::AddMessage("SETNAME", anope_event_setname);
- Anope::AddMessage("FJOIN", anope_event_fjoin);
- Anope::AddMessage("FMODE", anope_event_fmode);
- Anope::AddMessage("FTOPIC", anope_event_ftopic);
- Anope::AddMessage("OPERTYPE", anope_event_opertype);
- Anope::AddMessage("IDLE", anope_event_idle);
- Anope::AddMessage("METADATA", anope_event_metadata);
-}
-
-bool ChannelModeFlood::IsValid(const std::string &value)
-{
- char *dp, *end;
- if (!value.empty() && value[0] != ':' && strtoul((value[0] == '*' ? value.c_str() + 1 : value.c_str()), &dp, 10) > 0 && *dp == ':' && *(++dp) && strtoul(dp, &end, 10) > 0 && !*end)
- return 1;
- else return 0;
-}
-
-class ProtoInspIRCd : public Module
-{
- public:
- ProtoInspIRCd(const std::string &modname, const std::string &creator) : Module(modname, creator)
- {
- this->SetAuthor("Anope");
- this->SetType(PROTOCOL);
-
- if (Config.Numeric)
- TS6SID = sstrdup(Config.Numeric);
-
- pmodule_ircd_version("InspIRCd 2.0");
- pmodule_ircd_var(myIrcd);
- pmodule_ircd_useTSMode(0);
-
- CapabType c[] = { CAPAB_NOQUIT, CAPAB_SSJ3, CAPAB_NICK2, CAPAB_VL, CAPAB_TLKEXT };
- for (unsigned i = 0; i < 5; ++i)
- Capab.SetFlag(c[i]);
-
- pmodule_ircd_proto(&ircd_proto);
- moduleAddIRCDMsgs();
-
- ModuleManager::Attach(I_OnUserNickChange, this);
- }
-
- ~ProtoInspIRCd()
- {
- delete [] TS6SID;
- }
-
- void OnUserNickChange(User *u, const std::string &)
- {
- u->RemoveModeInternal(ModeManager::FindUserModeByName(UMODE_REGISTERED));
- }
-};
-
-MODULE_INIT(ProtoInspIRCd)
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)
diff --git a/src/protocol/unreal32.cpp b/src/protocol/unreal32.cpp
deleted file mode 100644
index 0cfb0512e..000000000
--- a/src/protocol/unreal32.cpp
+++ /dev/null
@@ -1,1345 +0,0 @@
-/* Unreal IRCD 3.2.x functions
- *
- * (C) 2003-2010 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 "services.h"
-#include "modules.h"
-
-IRCDVar myIrcd[] = {
- {"UnrealIRCd 3.2.x", /* ircd name */
- "+Soi", /* Modes used by pseudoclients */
- 5, /* Chan Max Symbols */
- "+ao", /* Channel Umode used by Botserv bots */
- 1, /* SVSNICK */
- 1, /* Vhost */
- 1, /* Supports SNlines */
- 1, /* Supports SQlines */
- 1, /* Supports SZlines */
- 3, /* Number of server args */
- 0, /* Join 2 Set */
- 0, /* Join 2 Message */
- 1, /* TS Topic Forward */
- 0, /* TS Topci Backward */
- 0, /* Chan SQlines */
- 0, /* Quit on Kill */
- 1, /* SVSMODE unban */
- 1, /* Reverse */
- 1, /* vidents */
- 1, /* svshold */
- 1, /* time stamp on mode */
- 1, /* NICKIP */
- 1, /* O:LINE */
- 1, /* UMODE */
- 1, /* VHOST ON NICK */
- 1, /* Change RealName */
- 1, /* No Knock requires +i */
- 1, /* We support Unreal TOKENS */
- 1, /* TIME STAMPS are BASE64 */
- 1, /* Can remove User Channel Modes with SVSMODE */
- 0, /* Sglines are not enforced until user reconnects */
- 0, /* ts6 */
- 0, /* p10 */
- 0, /* CIDR channelbans */
- "$", /* TLD Prefix for Global */
- 12, /* Max number of modes we can send per line */
- }
- ,
- {NULL}
-};
-
-/* svswatch
- * parv[0] - sender
- * parv[1] - target nick
- * parv[2] - parameters
- */
-void unreal_cmd_svswatch(const char *sender, const char *nick, const char *parm)
-{
- send_cmd(sender, "Bw %s :%s", nick, parm);
-}
-
-void unreal_cmd_netinfo(int ac, const char **av)
-{
- send_cmd(NULL, "AO %ld %ld %d %s 0 0 0 :%s", static_cast<long>(maxusercnt), static_cast<long>(time(NULL)), atoi(av[2]), av[3], av[7]);
-}
-
-/* PROTOCTL */
-/*
- NICKv2 = Nick Version 2
- VHP = Sends hidden host
- UMODE2 = sends UMODE2 on user modes
- NICKIP = Sends IP on NICK
- TOKEN = Use tokens to talk
- SJ3 = Supports SJOIN
- NOQUIT = No Quit
- TKLEXT = Extended TKL we don't use it but best to have it
- SJB64 = Base64 encoded time stamps
- VL = Version Info
- NS = Config.Numeric Server
-
-*/
-void unreal_cmd_capab()
-{
- if (Config.Numeric)
- send_cmd(NULL, "PROTOCTL NICKv2 VHP UMODE2 NICKIP TOKEN SJOIN SJOIN2 SJ3 NOQUIT TKLEXT SJB64 VL");
- else
- send_cmd(NULL, "PROTOCTL NICKv2 VHP UMODE2 NICKIP TOKEN SJOIN SJOIN2 SJ3 NOQUIT TKLEXT SJB64");
-}
-
-/* PASS */
-void unreal_cmd_pass(const char *pass)
-{
- send_cmd(NULL, "PASS :%s", pass);
-}
-
-/* CHGHOST */
-void unreal_cmd_chghost(const char *nick, const char *vhost)
-{
- if (!nick || !vhost)
- return;
- send_cmd(Config.ServerName, "AL %s %s", nick, vhost);
-}
-
-/* CHGIDENT */
-void unreal_cmd_chgident(const char *nick, const char *vIdent)
-{
- if (!nick || !vIdent)
- return;
- send_cmd(Config.ServerName, "AZ %s %s", nick, vIdent);
-}
-
-class UnrealIRCdProto : public IRCDProto
-{
- /* SVSNOOP */
- void SendSVSNOOP(const char *server, int set)
- {
- send_cmd(NULL, "f %s %s", server, set ? "+" : "-");
- }
-
- void SendAkillDel(XLine *x)
- {
- send_cmd(NULL, "BD - G %s %s %s", x->GetUser().c_str(), x->GetHost().c_str(), Config.s_OperServ);
- }
-
- void SendTopic(BotInfo *whosets, Channel *c, const char *whosetit, const char *topic)
- {
- send_cmd(whosets->nick, ") %s %s %lu :%s", c->name.c_str(), whosetit, static_cast<unsigned long>(c->topic_time), topic);
- }
-
- void SendVhostDel(User *u)
- {
- BotInfo *bi = HostServ;
- u->RemoveMode(bi, UMODE_CLOAK);
- u->RemoveMode(bi, UMODE_VHOST);
- ModeManager::ProcessModes();
- u->SetMode(bi, UMODE_CLOAK);
- ModeManager::ProcessModes();
- }
-
- void SendAkill(XLine *x)
- {
- // Calculate the time left before this would expire, capping it at 2 days
- time_t timeleft = x->Expires - time(NULL);
- if (timeleft > 172800)
- timeleft = 172800;
- send_cmd(NULL, "BD + G %s %s %s %ld %ld :%s", x->GetUser().c_str(), x->GetHost().c_str(), x->By.c_str(), static_cast<long>(time(NULL) + timeleft), static_cast<long>(x->Expires), x->Reason.c_str());
- }
-
- void SendSVSKillInternal(BotInfo *source, User *user, const char *buf)
- {
- send_cmd(source ? source->nick : Config.ServerName, "h %s :%s", user->nick.c_str(), buf);
- }
-
- /*
- * m_svsmode() added by taz
- * parv[0] - sender
- * parv[1] - username to change mode for
- * parv[2] - modes to change
- * parv[3] - Service Stamp (if mode == d)
- */
- void SendSVSMode(User *u, int ac, const char **av)
- {
- if (ac >= 1)
- {
- if (!u || !av[0])
- return;
- this->SendModeInternal(NULL, u, merge_args(ac, av));
- }
- }
-
- void SendModeInternal(BotInfo *source, Channel *dest, const char *buf)
- {
- if (!buf)
- return;
- send_cmd(source->nick, "G %s %s", dest->name.c_str(), buf);
- }
-
- void SendModeInternal(BotInfo *bi, User *u, const char *buf)
- {
- if (!buf)
- return;
- send_cmd(bi ? bi->nick : Config.ServerName, "v %s %s", u->nick.c_str(), buf);
- }
-
- 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, Config.ServerName);
- send_cmd(NULL, "& %s 1 %ld %s %s %s 0 %s %s%s :%s", nick.c_str(), static_cast<long>(time(NULL)), user.c_str(), host.c_str(), Config.ServerName, modes, host.c_str(), myIrcd->nickip ? " *" : " ", real.c_str());
- }
-
- void SendKickInternal(BotInfo *source, Channel *chan, User *user, const char *buf)
- {
- if (buf)
- send_cmd(source->nick, "H %s %s :%s", chan->name.c_str(), user->nick.c_str(), buf);
- else
- send_cmd(source->nick, "H %s %s", chan->name.c_str(), user->nick.c_str());
- }
-
- void SendNoticeChanopsInternal(BotInfo *source, Channel *dest, const char *buf)
- {
- if (!buf)
- return;
- send_cmd(source->nick, "B @%s :%s", dest->name.c_str(), buf);
- }
-
- /* SERVER name hop descript */
- /* Unreal 3.2 actually sends some info about itself in the descript area */
- void SendServer(Server *server)
- {
- if (Config.Numeric)
- send_cmd(NULL, "SERVER %s %d :U0-*-%s %s", server->GetName().c_str(), server->GetHops(), Config.Numeric, server->GetDescription().c_str());
- else
- send_cmd(NULL, "SERVER %s %d :%s", server->GetName().c_str(), server->GetHops(), server->GetDescription().c_str());
- }
-
- /* JOIN */
- void SendJoin(BotInfo *user, const char *channel, time_t chantime)
- {
- send_cmd(Config.ServerName, "~ !%s %s :%s", base64enc(static_cast<long>(chantime)), channel, user->nick.c_str());
- }
-
- /* unsqline
- */
- void SendSQLineDel(XLine *x)
- {
- send_cmd(NULL, "d %s", x->Mask.c_str());
- }
-
- /* SQLINE */
- /*
- ** - Unreal will translate this to TKL for us
- **
- */
- void SendSQLine(XLine *x)
- {
- send_cmd(NULL, "c %s :%s", x->Mask.c_str(), x->Reason.c_str());
- }
-
- /*
- ** svso
- ** parv[0] = sender prefix
- ** parv[1] = nick
- ** parv[2] = options
- */
- void SendSVSO(const char *source, const char *nick, const char *flag)
- {
- if (!source || !nick || !flag)
- return;
- send_cmd(source, "BB %s %s", nick, flag);
- }
-
- /* NICK <newnick> */
- void SendChangeBotNick(BotInfo *oldnick, const char *newnick)
- {
- if (!oldnick || !newnick)
- return;
- send_cmd(oldnick->nick, "& %s %ld", newnick, static_cast<long>(time(NULL)));
- }
-
- /* Functions that use serval cmd functions */
-
- void SendVhost(User *u, const std::string &vIdent, const std::string &vhost)
- {
- if (!vIdent.empty())
- unreal_cmd_chgident(u->nick.c_str(), vIdent.c_str());
- if (!vhost.empty())
- unreal_cmd_chghost(u->nick.c_str(), vhost.c_str());
- }
-
- void SendConnect()
- {
- unreal_cmd_capab();
- unreal_cmd_pass(uplink_server->password);
- SendServer(Me);
- }
-
- /* SVSHOLD - set */
- void SendSVSHold(const char *nick)
- {
- send_cmd(NULL, "BD + Q H %s %s %ld %ld :%s", nick, Config.ServerName, static_cast<long>(time(NULL) + Config.NSReleaseTimeout), static_cast<long>(time(NULL)), "Being held for registered user");
- }
-
- /* SVSHOLD - release */
- void SendSVSHoldDel(const char *nick)
- {
- send_cmd(NULL, "BD - Q * %s %s", nick, Config.ServerName);
- }
-
- /* UNSGLINE */
- /*
- * SVSNLINE - :realname mask
- */
- void SendSGLineDel(XLine *x)
- {
- send_cmd(NULL, "BR - :%s", x->Mask.c_str());
- }
-
- /* UNSZLINE */
- void SendSZLineDel(XLine *x)
- {
- send_cmd(NULL, "BD - Z * %s %s", x->Mask.c_str(), Config.s_OperServ);
- }
-
- /* SZLINE */
- void SendSZLine(XLine *x)
- {
- send_cmd(NULL, "BD + Z * %s %s %ld %ld :%s", x->Mask.c_str(), x->By.c_str(), static_cast<long>(time(NULL) + 172800), static_cast<long>(time(NULL)), x->Reason.c_str());
- }
-
- /* SGLINE */
- /*
- * SVSNLINE + reason_where_is_space :realname mask with spaces
- */
- void SendSGLine(XLine *x)
- {
- char edited_reason[BUFSIZE];
- strlcpy(edited_reason, x->Reason.c_str(), BUFSIZE);
- strnrepl(edited_reason, BUFSIZE, " ", "_");
- send_cmd(NULL, "BR + %s :%s", edited_reason, x->Mask.c_str());
- }
-
- /* SVSMODE -b */
- void SendBanDel(Channel *c, const std::string &nick)
- {
- SendSVSModeChan(c, "-b", nick.empty() ? NULL : nick.c_str());
- }
-
- /* SVSMODE channel modes */
-
- void SendSVSModeChan(Channel *c, const char *mode, const char *nick)
- {
- if (nick)
- send_cmd(Config.ServerName, "n %s %s %s", c->name.c_str(), mode, nick);
- else
- send_cmd(Config.ServerName, "n %s %s", c->name.c_str(), mode);
- }
-
- /* svsjoin
- parv[0] - sender
- parv[1] - nick to make join
- parv[2] - channel to join
- parv[3] - (optional) channel key(s)
- */
- /* In older Unreal SVSJOIN and SVSNLINE tokens were mixed so SVSJOIN and SVSNLINE are broken
- when coming from a none TOKEN'd server
- */
- void SendSVSJoin(const char *source, const char *nick, const char *chan, const char *param)
- {
- if (param)
- send_cmd(source, "BX %s %s :%s", nick, chan, param);
- else
- send_cmd(source, "BX %s :%s", nick, chan);
- }
-
- /* svspart
- parv[0] - sender
- parv[1] - nick to make part
- parv[2] - channel(s) to part
- */
- void SendSVSPart(const char *source, const char *nick, const char *chan)
- {
- send_cmd(source, "BT %s :%s", nick, chan);
- }
-
- void SendSWhois(const char *source, const char *who, const char *mask)
- {
- send_cmd(source, "BA %s :%s", who, mask);
- }
-
- void SendEOB()
- {
- send_cmd(Config.ServerName, "ES");
- }
-
- /*
- 1 = valid nick
- 0 = nick is in valid
- */
- int IsNickValid(const char *nick)
- {
- if (!stricmp("ircd", nick) || !stricmp("irc", nick))
- return 0;
- return 1;
- }
-
- int IsChannelValid(const char *chan)
- {
- if (strchr(chan, ':') || *chan != '#')
- return 0;
- return 1;
- }
-
- void SetAutoIdentificationToken(User *u)
- {
- char svidbuf[15];
-
- if (!u->Account())
- return;
-
- srand(time(NULL));
- snprintf(svidbuf, sizeof(svidbuf), "%d", rand());
-
- u->Account()->Shrink("authenticationtoken");
- u->Account()->Extend("authenticationtoken", new ExtensibleItemPointerArray<char>(sstrdup(svidbuf)));
-
- BotInfo *bi = NickServ;
- u->SetMode(bi, UMODE_REGISTERED);
- ircdproto->SendMode(bi, u, "+d %s", svidbuf);
- }
-
- void SendUnregisteredNick(User *u)
- {
- BotInfo *bi = NickServ;
- u->RemoveMode(bi, UMODE_REGISTERED);
- ircdproto->SendMode(bi, u, "+d 1");
- }
-} ircd_proto;
-
-/* Event: PROTOCTL */
-int anope_event_capab(const char *source, int ac, const char **av)
-{
- for (int i = 0; i < ac; ++i)
- {
- std::string capab = av[i];
-
- if (capab.find("CHANMODES") != std::string::npos)
- {
- std::string modes(capab.begin() + 10, capab.end());
- commasepstream sep(modes);
- std::string modebuf;
-
- sep.GetToken(modebuf);
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- switch (modebuf[t])
- {
- case 'b':
- ModeManager::AddChannelMode(new ChannelModeBan('b'));
- continue;
- case 'e':
- ModeManager::AddChannelMode(new ChannelModeExcept('e'));
- continue;
- case 'I':
- ModeManager::AddChannelMode(new ChannelModeInvex('I'));
- continue;
- default:
- ModeManager::AddChannelMode(new ChannelModeList(CMODE_END, "", modebuf[t]));
- }
- }
-
- sep.GetToken(modebuf);
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- switch (modebuf[t])
- {
- case 'k':
- ModeManager::AddChannelMode(new ChannelModeKey('k'));
- continue;
- case 'f':
- ModeManager::AddChannelMode(new ChannelModeFlood('f'));
- continue;
- case 'L':
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_REDIRECT, "CMODE_REDIRECT", 'L'));
- continue;
- default:
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_END, "", modebuf[t]));
- }
- }
-
- sep.GetToken(modebuf);
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- switch (modebuf[t])
- {
- case 'l':
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_LIMIT, "CMODE_LIMIT", 'l', true));
- continue;
- case 'j':
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_JOINFLOOD, "CMODE_JOINFLOOD", 'j', true));
- continue;
- default:
- ModeManager::AddChannelMode(new ChannelModeParam(CMODE_END, "", modebuf[t], true));
- }
- }
-
- sep.GetToken(modebuf);
- for (size_t t = 0, end = modebuf.size(); t < end; ++t)
- {
- switch (modebuf[t])
- {
- case 'p':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_PRIVATE, "CMODE_PRIVATE", 'p'));
- continue;
- case 's':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_SECRET, "CMODE_SECRET", 's'));
- continue;
- case 'm':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_MODERATED, "CMODE_MODERATED", 'm'));
- continue;
- case 'n':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NOEXTERNAL, "CMODE_NOEXTERNAL", 'n'));
- continue;
- case 't':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_TOPIC, "CMODE_TOPIC", 't'));
- continue;
- case 'i':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_INVITE, "CMODE_INVITE", 'i'));
- continue;
- case 'r':
- ModeManager::AddChannelMode(new ChannelModeRegistered('r'));
- continue;
- case 'R':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_REGISTEREDONLY, "CMODE_REGISTEREDONLY", 'R'));
- continue;
- case 'c':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_BLOCKCOLOR, "CMODE_BLOCKCOLOR", 'c'));
- continue;
- case 'O':
- ModeManager::AddChannelMode(new ChannelModeOper('O'));
- continue;
- case 'A':
- ModeManager::AddChannelMode(new ChannelModeAdmin('A'));
- continue;
- case 'Q':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NOKICK, "CMODE_NOKICK", 'Q'));
- continue;
- case 'K':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NOKNOCK, "CMODE_NOKNOCK", 'K'));
- continue;
- case 'V':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NOINVITE, "CMODE_NOINVITE", 'V'));
- continue;
- case 'C':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NOCTCP, "CMODE_NOCTCP", 'C'));
- continue;
- case 'u':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_AUDITORIUM, "CMODE_AUDITORIUM", 'u'));
- continue;
- case 'z':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_SSL, "CMODE_SSL", 'z'));
- continue;
- case 'N':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NONICK, "CMODE_NONICK", 'N'));
- continue;
- case 'S':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_STRIPCOLOR, "CMODE_STRIPCOLOR", 'S'));
- continue;
- case 'M':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_REGMODERATED, "CMODE_REGMODERATED", 'M'));
- continue;
- case 'T':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_NONOTICE, "CMODE_NONOTICE", 'T'));
- continue;
- case 'G':
- ModeManager::AddChannelMode(new ChannelMode(CMODE_FILTER, "CMODE_FILTER", 'G'));
- continue;
- default:
- ModeManager::AddChannelMode(new ChannelMode(CMODE_END, "", modebuf[t]));
- }
- }
- }
- }
-
- CapabParse(ac, av);
-
- return MOD_CONT;
-}
-
-/* Events */
-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;
-}
-
-/** This is here because:
- *
- * If we had servers three servers, A, B & C linked like so: A<->B<->C
- * If Anope is (linked to) A and B splits from A and then reconnects
- * B introduces itself, introduces C, sends EOS for C, introduces Bs clients
- * introduces Cs clients, sends EOS for B. This causes all of Cs clients to be introduced
- * with their server "not syncing". We now send a PING immediatly when receiving a new server
- * and then finish sync once we get a pong back from that server
- */
-int anope_event_pong(const char *source, int ac, const char **av)
-{
- Server *s = Server::Find(source);
- if (s && !s->IsSynced())
- s->Sync(false);
- return MOD_CONT;
-}
-
-/* netinfo
- * argv[0] = max global count
- * argv[1] = time of end sync
- * argv[2] = unreal protocol using (numeric)
- * argv[3] = cloak-crc (> u2302)
- * argv[4] = free(**)
- * argv[5] = free(**)
- * argv[6] = free(**)
- * argv[7] = ircnet
- */
-int anope_event_netinfo(const char *source, int ac, const char **av)
-{
- unreal_cmd_netinfo(ac, av);
- 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;
-}
-
-/*
-** away
-** parv[0] = sender prefix
-** parv[1] = away message
-*/
-int anope_event_away(const char *source, int ac, const char **av)
-{
- if (!source)
- return MOD_CONT;
- m_away(source, (ac ? av[0] : NULL));
- return MOD_CONT;
-}
-
-/*
-** m_topic
-** parv[0] = sender prefix
-** parv[1] = topic text
-**
-** For servers using TS:
-** parv[0] = sender prefix
-** parv[1] = channel name
-** parv[2] = topic nickname
-** parv[3] = topic time
-** parv[4] = topic text
-*/
-int anope_event_topic(const char *source, int ac, const char **av)
-{
- if (ac != 4)
- return MOD_CONT;
- do_topic(source, ac, av);
- 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)
-{
- if (ac != 1)
- return MOD_CONT;
- do_quit(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_mode(const char *source, int ac, const char **av)
-{
- if (ac < 2)
- return MOD_CONT;
-
- if (*av[0] == '#' || *av[0] == '&')
- do_cmode(source, ac, av);
- else
- do_umode(source, ac, av);
- return MOD_CONT;
-}
-
-/* This is used to strip the TS from the end of the mode stirng */
-int anope_event_gmode(const char *source, int ac, const char **av)
-{
- if (Server::Find(source))
- --ac;
- return anope_event_mode(source, ac, av);
-}
-
-/* Unreal sends USER modes with this */
-/*
- umode2
- parv[0] - sender
- parv[1] - modes to change
-*/
-int anope_event_umode2(const char *source, int ac, const char **av)
-{
- if (ac < 1)
- return MOD_CONT;
-
- const char *newav[4];
- newav[0] = source;
- newav[1] = av[0];
- do_umode(source, ac, newav);
- 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)
- return MOD_CONT;
- 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_setname(const char *source, int ac, const char **av)
-{
- User *u;
-
- if (ac != 1)
- return MOD_CONT;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "SETNAME for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetRealname(av[0]);
- return MOD_CONT;
-}
-
-int anope_event_chgname(const char *source, int ac, const char **av)
-{
- User *u;
-
- if (ac != 2)
- return MOD_CONT;
-
- u = finduser(av[0]);
- if (!u)
- {
- Alog(LOG_DEBUG) << "CHGNAME for nonexistent user " << av[0];
- return MOD_CONT;
- }
-
- u->SetRealname(av[1]);
- return MOD_CONT;
-}
-
-int anope_event_setident(const char *source, int ac, const char **av)
-{
- User *u;
-
- if (ac != 1)
- return MOD_CONT;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "SETIDENT for nonexistent user " << source;
- return MOD_CONT;
- }
-
- u->SetVIdent(av[0]);
- return MOD_CONT;
-}
-int anope_event_chgident(const char *source, int ac, const char **av)
-{
- User *u;
-
- if (ac != 2)
- return MOD_CONT;
-
- u = finduser(av[0]);
- if (!u)
- {
- Alog(LOG_DEBUG) << "CHGIDENT for nonexistent user " << av[0];
- return MOD_CONT;
- }
-
- u->SetVIdent(av[1]);
- return MOD_CONT;
-}
-
-int anope_event_sethost(const char *source, int ac, const char **av)
-{
- User *u;
-
- if (ac != 1)
- return MOD_CONT;
-
- u = finduser(source);
- if (!u)
- {
- Alog(LOG_DEBUG) << "SETHOST for nonexistent user " << source;
- return MOD_CONT;
- }
-
- /* When a user sets +x we recieve the new host and then the mode change */
- if (u->HasMode(UMODE_CLOAK))
- u->SetDisplayedHost(av[0]);
- else
- u->SetCloakedHost(av[0]);
-
- return MOD_CONT;
-}
-
-/*
-** NICK - new
-** source = NULL
-** parv[0] = nickname
-** parv[1] = hopcount
-** parv[2] = timestamp
-** parv[3] = username
-** parv[4] = hostname
-** parv[5] = servername
-** if NICK version 1:
-** parv[6] = servicestamp
-** parv[7] = info
-** if NICK version 2:
-** parv[6] = servicestamp
-** parv[7] = umodes
-** parv[8] = virthost, * if none
-** parv[9] = info
-** if NICKIP:
-** parv[9] = ip
-** parv[10] = info
-**
-** NICK - change
-** source = oldnick
-** parv[0] = new nickname
-** parv[1] = hopcount
-*/
-/*
- do_nick(const char *source, char *nick, char *username, char *host,
- char *server, char *realname, time_t ts,
- uint32 ip, char *vhost, char *uid)
-*/
-int anope_event_nick(const char *source, int ac, const char **av)
-{
- User *user;
-
- if (ac != 2)
- {
- if (ac == 7)
- {
- /*
- <codemastr> that was a bug that is now fixed in 3.2.1
- <codemastr> in some instances it would use the non-nickv2 format
- <codemastr> it's sent when a nick collision occurs
- - so we have to leave it around for now -TSL
- */
- do_nick(source, av[0], av[3], av[4], av[5], av[6], strtoul(av[2], NULL, 10), 0, "*", NULL);
- }
- else if (ac == 11)
- {
- user = do_nick(source, av[0], av[3], av[4], av[5], av[10], strtoul(av[2], NULL, 10), ntohl(decode_ip(av[9])), av[8], NULL);
- if (user)
- {
- /* Check to see if the user should be identified because their
- * services id matches the one in their nickcore
- */
- user->CheckAuthenticationToken(av[6]);
-
- UserSetInternalModes(user, 1, &av[7]);
- }
- }
- else
- {
- /* NON NICKIP */
- user = do_nick(source, av[0], av[3], av[4], av[5], av[9], strtoul(av[2], NULL, 10), 0, av[8], NULL);
- if (user)
- {
- /* Check to see if the user should be identified because their
- * services id matches the one in their nickcore
- */
- user->CheckAuthenticationToken(av[6]);
-
- UserSetInternalModes(user, 1, &av[7]);
- }
- }
- }
- else
- do_nick(source, av[0], NULL, NULL, NULL, NULL, strtoul(av[1], NULL, 10), 0, NULL, NULL);
- return MOD_CONT;
-}
-
-int anope_event_chghost(const char *source, int ac, const char **av)
-{
- User *u;
-
- if (ac != 2)
- return MOD_CONT;
-
- u = finduser(av[0]);
- if (!u)
- {
- Alog(LOG_DEBUG) << "debug: CHGHOST for nonexistent user " << av[0];
- return MOD_CONT;
- }
-
- u->SetDisplayedHost(av[1]);
- return MOD_CONT;
-}
-
-/* EVENT: SERVER */
-int anope_event_server(const char *source, int ac, const char **av)
-{
- char *desc;
- char *vl;
- char *upnumeric;
-
- if (!stricmp(av[1], "1"))
- {
- vl = myStrGetToken(av[2], ' ', 0);
- upnumeric = myStrGetToken(vl, '-', 2);
- desc = myStrGetTokenRemainder(av[2], ' ', 1);
- do_server(source, av[0], atoi(av[1]), desc, upnumeric);
- delete [] vl;
- delete [] desc;
- delete [] upnumeric;
- }
- else
- do_server(source, av[0], atoi(av[1]), av[2], "");
- ircdproto->SendPing(Config.ServerName, av[0]);
-
- return MOD_CONT;
-}
-
-int anope_event_privmsg(const char *source, int ac, const char **av)
-{
- if (ac != 2)
- return MOD_CONT;
- m_privmsg(source, av[0], av[1]);
- return MOD_CONT;
-}
-
-int anope_event_part(const char *source, int ac, const char **av)
-{
- if (ac < 1 || ac > 2)
- return MOD_CONT;
- do_part(source, ac, av);
- return MOD_CONT;
-}
-
-int anope_event_whois(const char *source, int ac, const char **av)
-{
- if (source && ac >= 1)
- m_whois(source, av[0]);
- return MOD_CONT;
-}
-
-int anope_event_error(const char *source, int ac, const char **av)
-{
- if (av[0])
- {
- Alog(LOG_DEBUG) << av[0];
- if (strstr(av[0], "No matching link configuration"))
- Alog() << "Error: Your IRCD's link block may not be setup correctly, please check unrealircd.conf";
- }
- return MOD_CONT;
-
-}
-
-int anope_event_sdesc(const char *source, int ac, const char **av)
-{
- Server *s = Server::Find(source ? source : "");
-
- if (s)
- s->SetDescription(av[0]);
-
- return MOD_CONT;
-}
-
-int anope_event_sjoin(const char *source, int ac, const char **av)
-{
- Channel *c = findchan(av[1]);
- time_t ts = base64dects(av[0]);
- bool keep_their_modes = true;
- bool was_created = false;
-
- 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;
-
- 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))
- {
- /* Ban */
- if (keep_their_modes && buf[0] == '&')
- {
- buf.erase(buf.begin());
- ChannelModeList *cml = dynamic_cast<ChannelModeList *>(ModeManager::FindChannelModeByName(CMODE_BAN));
- if (cml->IsValid(buf))
- cml->AddMask(c, buf.c_str());
- }
- /* Except */
- else if (keep_their_modes && buf[0] == '"')
- {
- buf.erase(buf.begin());
- ChannelModeList *cml = dynamic_cast<ChannelModeList *>(ModeManager::FindChannelModeByName(CMODE_EXCEPT));
-
- if (cml->IsValid(buf))
- cml->AddMask(c, buf.c_str());
- }
- /* Invex */
- else if (keep_their_modes && buf[0] == '\'')
- {
- buf.erase(buf.begin());
- ChannelModeList *cml = dynamic_cast<ChannelModeList *>(ModeManager::FindChannelModeByName(CMODE_INVITEOVERRIDE));
-
- if (cml->IsValid(buf))
- cml->AddMask(c, buf.c_str());
- }
- else
- {
- 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;
-}
-
-void moduleAddIRCDMsgs()
-{
- Anope::AddMessage("436", anope_event_436);
- Anope::AddMessage("AWAY", anope_event_away);
- Anope::AddMessage("6", anope_event_away);
- Anope::AddMessage("JOIN", anope_event_join);
- Anope::AddMessage("C", anope_event_join);
- Anope::AddMessage("KICK", anope_event_kick);
- Anope::AddMessage("H", anope_event_kick);
- Anope::AddMessage("KILL", anope_event_kill);
- Anope::AddMessage(".", anope_event_kill);
- Anope::AddMessage("MODE", anope_event_mode);
- Anope::AddMessage("G", anope_event_gmode);
- Anope::AddMessage("MOTD", anope_event_motd);
- Anope::AddMessage("F", anope_event_motd);
- Anope::AddMessage("NICK", anope_event_nick);
- Anope::AddMessage("&", anope_event_nick);
- Anope::AddMessage("PART", anope_event_part);
- Anope::AddMessage("D", anope_event_part);
- Anope::AddMessage("PING", anope_event_ping);
- Anope::AddMessage("8", anope_event_ping);
- Anope::AddMessage("PONG", anope_event_pong);
- Anope::AddMessage("9", anope_event_pong);
- Anope::AddMessage("PRIVMSG", anope_event_privmsg);
- Anope::AddMessage("!", anope_event_privmsg);
- Anope::AddMessage("QUIT", anope_event_quit);
- Anope::AddMessage(",", anope_event_quit);
- Anope::AddMessage("SERVER", anope_event_server);
- Anope::AddMessage("'", anope_event_server);
- Anope::AddMessage("SQUIT", anope_event_squit);
- Anope::AddMessage("-", anope_event_squit);
- Anope::AddMessage("TOPIC", anope_event_topic);
- Anope::AddMessage(")", anope_event_topic);
- Anope::AddMessage("SVSMODE", anope_event_mode);
- Anope::AddMessage("n", anope_event_mode);
- Anope::AddMessage("SVS2MODE", anope_event_mode);
- Anope::AddMessage("v", anope_event_mode);
- Anope::AddMessage("WHOIS", anope_event_whois);
- Anope::AddMessage("#", anope_event_whois);
- Anope::AddMessage("PROTOCTL", anope_event_capab);
- Anope::AddMessage("_", anope_event_capab);
- Anope::AddMessage("CHGHOST", anope_event_chghost);
- Anope::AddMessage("AL", anope_event_chghost);
- Anope::AddMessage("CHGIDENT", anope_event_chgident);
- Anope::AddMessage("AZ", anope_event_chgident);
- Anope::AddMessage("CHGNAME", anope_event_chgname);
- Anope::AddMessage("BK", anope_event_chgname);
- Anope::AddMessage("NETINFO", anope_event_netinfo);
- Anope::AddMessage("AO", anope_event_netinfo);
- Anope::AddMessage("SETHOST", anope_event_sethost);
- Anope::AddMessage("AA", anope_event_sethost);
- Anope::AddMessage("SETIDENT", anope_event_setident);
- Anope::AddMessage("AD", anope_event_setident);
- Anope::AddMessage("SETNAME", anope_event_setname);
- Anope::AddMessage("AE", anope_event_setname);
- Anope::AddMessage("ERROR", anope_event_error);
- Anope::AddMessage("5", anope_event_error);
- Anope::AddMessage("UMODE2", anope_event_umode2);
- Anope::AddMessage("|", anope_event_umode2);
- Anope::AddMessage("SJOIN", anope_event_sjoin);
- Anope::AddMessage("~", anope_event_sjoin);
- Anope::AddMessage("SDESC", anope_event_sdesc);
- Anope::AddMessage("AG", anope_event_sdesc);
-
- /* The non token version of these is in messages.c */
- Anope::AddMessage("2", m_stats);
- Anope::AddMessage(">", m_time);
- Anope::AddMessage("+", m_version);
-}
-
-/* Borrowed part of this check from UnrealIRCd */
-bool ChannelModeFlood::IsValid(const std::string &value2)
-{
- const char *value = value2.c_str();
- char *dp, *end;
- /* NEW +F */
- char xbuf[256], *p, *p2, *x = xbuf + 1;
- int v;
- if (!value)
- return 0;
- if (*value != ':' && strtoul((*value == '*' ? value + 1 : value), &dp, 10) > 0 && *dp == ':' && *(++dp) && strtoul(dp, &end, 10) > 0 && !*end)
- return 1;
- else
- {
- /* '['<number><1 letter>[optional: '#'+1 letter],[next..]']'':'<number> */
- strlcpy(xbuf, value, sizeof(xbuf));
- p2 = strchr(xbuf + 1, ']');
- if (!p2) return 0;
- *p2 = '\0';
- if (*(p2 + 1) != ':')
- return 0;
- for (x = strtok(xbuf + 1, ","); x; x = strtok(NULL, ","))
- {
- /* <number><1 letter>[optional: '#'+1 letter] */
- p = x;
- while (isdigit(*p))
- ++p;
- if (!*p || !(*p == 'c' || *p == 'j' || *p == 'k' || *p == 'm' || *p == 'n' || *p == 't'))
- continue; /* continue instead of break for forward compatability. */
- *p = '\0';
- v = atoi(x);
- if (v < 1 || v > 999)
- return 0;
- ++p;
- }
- return 1;
- }
-}
-
-static void AddModes()
-{
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_VOICE, "CMODE_VOICE", 'v', '+'));
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_HALFOP, "CMODE_HALFOP", 'h', '%'));
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OP, "CMODE_OP", 'o', '@'));
- /* Unreal sends +q as * and +a as ~ */
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_PROTECT, "CMODE_PROTECT", 'a', '~'));
- ModeManager::AddChannelMode(new ChannelModeStatus(CMODE_OWNER, "CMODE_OWNER", 'q', '*')); /* Unreal sends +q as * */
-
- /* Add user modes */
- ModeManager::AddUserMode(new UserMode(UMODE_SERV_ADMIN, "UMODE_SERV_ADMIN", 'A'));
- ModeManager::AddUserMode(new UserMode(UMODE_BOT, "UMODE_BOT", 'B'));
- ModeManager::AddUserMode(new UserMode(UMODE_CO_ADMIN, "UMODE_CO_ADMIN", 'C'));
- ModeManager::AddUserMode(new UserMode(UMODE_FILTER, "UMODE_FILTER", 'G'));
- ModeManager::AddUserMode(new UserMode(UMODE_HIDEOPER, "UMODE_HIDEOPER", 'H'));
- ModeManager::AddUserMode(new UserMode(UMODE_NETADMIN, "UMODE_NETADMIN", 'N'));
- ModeManager::AddUserMode(new UserMode(UMODE_REGPRIV, "UMODE_REGPRIV", 'R'));
- ModeManager::AddUserMode(new UserMode(UMODE_PROTECTED, "UMODE_PROTECTED", 'S'));
- ModeManager::AddUserMode(new UserMode(UMODE_NO_CTCP, "UMODE_NO_CTCP", 'T'));
- ModeManager::AddUserMode(new UserMode(UMODE_WEBTV, "UMODE_WEBTV", 'V'));
- ModeManager::AddUserMode(new UserMode(UMODE_WHOIS, "UMODE_WHOIS", 'W'));
- ModeManager::AddUserMode(new UserMode(UMODE_ADMIN, "UMODE_ADMIN", 'a'));
- ModeManager::AddUserMode(new UserMode(UMODE_DEAF, "UMODE_DEAF", 'd'));
- ModeManager::AddUserMode(new UserMode(UMODE_GLOBOPS, "UMODE_GLOBOPS", 'g'));
- ModeManager::AddUserMode(new UserMode(UMODE_HELPOP, "UMODE_HELPOP", 'h'));
- ModeManager::AddUserMode(new UserMode(UMODE_INVIS, "UMODE_INVIS", 'i'));
- ModeManager::AddUserMode(new UserMode(UMODE_OPER, "UMODE_OPER", 'o'));
- ModeManager::AddUserMode(new UserMode(UMODE_PRIV, "UMODE_PRIV", 'p'));
- ModeManager::AddUserMode(new UserMode(UMODE_GOD, "UMODE_GOD", 'q'));
- ModeManager::AddUserMode(new UserMode(UMODE_REGISTERED, "UMODE_REGISTERED", 'r'));
- ModeManager::AddUserMode(new UserMode(UMODE_SNOMASK, "UMODE_SNOMASK", 's'));
- ModeManager::AddUserMode(new UserMode(UMODE_VHOST, "UMODE_VHOST", 't'));
- ModeManager::AddUserMode(new UserMode(UMODE_WALLOPS, "UMODE_WALLOPS", 'w'));
- ModeManager::AddUserMode(new UserMode(UMODE_CLOAK, "UMODE_CLOAK", 'x'));
- ModeManager::AddUserMode(new UserMode(UMODE_SSL, "UMODE_SSL", 'z'));
-}
-
-class ProtoUnreal : public Module
-{
- public:
- ProtoUnreal(const std::string &modname, const std::string &creator) : Module(modname, creator)
- {
- this->SetAuthor("Anope");
- this->SetType(PROTOCOL);
-
- pmodule_ircd_version("UnrealIRCd 3.2+");
- pmodule_ircd_var(myIrcd);
- pmodule_ircd_useTSMode(0);
-
- CapabType c[] = { CAPAB_NOQUIT, CAPAB_NICKIP, CAPAB_ZIP, CAPAB_TOKEN, CAPAB_SSJ3, CAPAB_NICK2, CAPAB_VL, CAPAB_TLKEXT, CAPAB_CHANMODE, CAPAB_SJB64, CAPAB_NICKCHARS };
- for (unsigned i = 0; i < 11; ++i)
- Capab.SetFlag(c[i]);
-
- AddModes();
-
- pmodule_ircd_proto(&ircd_proto);
- moduleAddIRCDMsgs();
-
- ModuleManager::Attach(I_OnUserNickChange, this);
- }
-
- void OnUserNickChange(User *u, const std::string &)
- {
- u->RemoveModeInternal(ModeManager::FindUserModeByName(UMODE_REGISTERED));
- }
-};
-
-MODULE_INIT(ProtoUnreal)