From a22f8d3b2de88b9bb6f80f0c2780846ae23ab389 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 15 Jul 2010 22:55:02 -0400 Subject: Moved some files and diretories around, made cmake skip files it knows it can't compile because of missing dependices. --- src/protocol/CMakeLists.txt | 54 -- src/protocol/bahamut.cpp | 832 -------------------------- src/protocol/inspircd11.cpp | 1171 ------------------------------------ src/protocol/inspircd12.cpp | 1371 ------------------------------------------- src/protocol/inspircd20.cpp | 1351 ------------------------------------------ src/protocol/ratbox.cpp | 899 ---------------------------- src/protocol/unreal32.cpp | 1345 ------------------------------------------ 7 files changed, 7023 deletions(-) delete mode 100644 src/protocol/CMakeLists.txt delete mode 100644 src/protocol/bahamut.cpp delete mode 100644 src/protocol/inspircd11.cpp delete mode 100644 src/protocol/inspircd12.cpp delete mode 100644 src/protocol/inspircd20.cpp delete mode 100644 src/protocol/ratbox.cpp delete mode 100644 src/protocol/unreal32.cpp (limited to 'src/protocol') 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(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(u->timestamp), buf); - } - - /* SVSHOLD - set */ - void SendSVSHold(const char *nick) - { - send_cmd(Config.ServerName, "SVSHOLD %s %u :%s", nick, static_cast(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(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(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(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(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(timeleft), x->By.c_str(), static_cast(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(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(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::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(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 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::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 -# include -# include -#endif - -#ifdef _WIN32 -# include -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(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(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(time(NULL)), static_cast(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(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(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(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(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(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(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(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(u->timestamp)); - - u->Account()->Shrink("authenticationtoken"); - u->Account()->Extend("authenticationtoken", new ExtensibleItemPointerArray(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::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(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 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::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(&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 -# include -# include -#endif - -#ifdef _WIN32 -# include -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(start_time), static_cast(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(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(time(NULL)), static_cast(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(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(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(time(NULL)), nick.c_str(), host.c_str(), host.c_str(), user.c_str(), static_cast(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(