diff options
author | Adam <Adam@anope.org> | 2013-05-26 17:13:11 -0400 |
---|---|---|
committer | Adam <Adam@anope.org> | 2013-05-26 17:13:11 -0400 |
commit | 22658d63bdb1e52a66f4514af45fa55ca5891345 (patch) | |
tree | 673304ab19f7e077b489354248247867518331f8 | |
parent | f2dee1e1d642b07947f59f91dfba9af34ef84685 (diff) |
Get rid of the remaining references in the core to specific services. Move more stuff out of the core to the proper modules.
164 files changed, 833 insertions, 2135 deletions
diff --git a/data/botserv.example.conf b/data/botserv.example.conf index 887ddcd7d..1bd450123 100644 --- a/data/botserv.example.conf +++ b/data/botserv.example.conf @@ -298,7 +298,8 @@ command { service = "BotServ"; name = "SET GREET"; command = "botserv/set/greet" command { service = "BotServ"; name = "SET NOBOT"; command = "botserv/set/nobot"; permission = "botserv/set/nobot"; } command { service = "BotServ"; name = "SET PRIVATE"; command = "botserv/set/private"; permission = "botserv/set/private"; } -/* Fantasy commands +/* + * Fantasy commands * * Fantasy commands can be executed in channels that have a BotServ bot by prefixing the * command with one of the fantasy characters configured in botserv's fantasycharacter diff --git a/data/modules.example.conf b/data/modules.example.conf index 2129d3ac9..d906cb8bd 100644 --- a/data/modules.example.conf +++ b/data/modules.example.conf @@ -533,7 +533,7 @@ module { name = "help" } * * Provides the regex engine regex/pcre, which uses the Perl Compatible Regular Expressions library. */ -module { name = "m_regex_pcre" } +#module { name = "m_regex_pcre" } /* * m_regex_posix diff --git a/data/operserv.example.conf b/data/operserv.example.conf index 687247f0a..fab52fe2e 100644 --- a/data/operserv.example.conf +++ b/data/operserv.example.conf @@ -469,6 +469,13 @@ module name = "os_news" /* + * The service bot names to use to send news to users on connection + * and to opers when they oper. + */ + announcer = "Global" + oper_announcer = "OperServ" + + /* * The number of LOGON/OPER news items to display when a user logs on. * * This directive is optional, if no set it will default to 3. diff --git a/docs/README b/docs/README index cd3864d44..8a455f03d 100644 --- a/docs/README +++ b/docs/README @@ -173,7 +173,7 @@ Table of Contents * Bahamut 1.4.27 or later (including 1.8) * Charybdis 3.4 or later * Hybrid 8.1 or later - * InspIRCd 1.1, 1.2, or 2.0 + * InspIRCd 1.2 or 2.0 * ngIRCd 19.2 or later * Plexus 3 or later * Ratbox 2.0.6 or later diff --git a/include/account.h b/include/account.h index b5edd7ec2..4d6bd714f 100644 --- a/include/account.h +++ b/include/account.h @@ -65,18 +65,6 @@ class CoreExport NickAlias : public Serializable, public Extensible void Serialize(Serialize::Data &data) const anope_override; static Serializable* Unserialize(Serializable *obj, Serialize::Data &); - /** Release a nick - * See the comment in users.cpp - */ - void Release(); - - /** This function is called when a user on this nick either disconnects or changes nick. - * Note that the user isnt necessarially identified to this nick - * See the comment in users.cpp - * @param u The user - */ - void OnCancel(User *u); - /** Set a vhost for the user * @param ident The ident * @param host The host @@ -306,7 +294,7 @@ class CoreExport NickCore : public Serializable, public Extensible }; /* A request to check if an account/password is valid. These can exist for - * extended periods of time due to some authentication modules take. + * extended periods due to the time some authentication modules take. */ class CoreExport IdentifyRequest { diff --git a/include/bots.h b/include/bots.h index 42345d8ea..ef05c11e0 100644 --- a/include/bots.h +++ b/include/bots.h @@ -131,6 +131,4 @@ class CoreExport BotInfo : public User, public Serializable static BotInfo* Find(const Anope::string &nick, bool nick_only = false); }; -extern CoreExport BotInfo *BotServ, *ChanServ, *Global, *HostServ, *MemoServ, *NickServ, *OperServ; - #endif // BOTS_H diff --git a/include/channels.h b/include/channels.h index 7d1918f08..25bd95097 100644 --- a/include/channels.h +++ b/include/channels.h @@ -30,12 +30,6 @@ struct ChanUserContainer : public Extensible ChanUserContainer(User *u, Channel *c) : user(u), chan(c) { } }; -/* Possible flags: - * - * INHABIT - ChanServ is currently holding the channel - * PERSIST - Channel still exists when emptied (IRCd enforced) - * SYNCING - Channel is syncing users (channel was just created) and it should not be deleted - */ class CoreExport Channel : public Base, public Extensible { public: @@ -52,6 +46,8 @@ class CoreExport Channel : public Base, public Extensible Serialize::Reference<ChannelInfo> ci; /* When the channel was created */ time_t creation_time; + /* If the channel has just been created in a netjoin */ + bool syncing; /* Users in the channel */ typedef std::map<User *, ChanUserContainer *> ChanUserList; @@ -272,9 +268,8 @@ class CoreExport Channel : public Base, public Extensible * for the specified user. * @param user The user to give/remove modes to/from * @param give_modes if true modes may be given to the user - * @param check_noop if true, CI_NOAUTOOP is checked before giving modes */ - void SetCorrectModes(User *u, bool give_mode, bool check_noop); + void SetCorrectModes(User *u, bool give_modes); /** Unbans a user from this channel. * @param u The user to unban diff --git a/include/config.h b/include/config.h index bd76ca8a5..0ea30e5f6 100644 --- a/include/config.h +++ b/include/config.h @@ -124,6 +124,7 @@ namespace Configuration /* module configuration blocks */ std::map<Anope::string, Block *> modules; + Anope::map<Anope::string> bots; Conf(); @@ -131,6 +132,8 @@ namespace Configuration Block *GetModule(Module *); Block *GetModule(const Anope::string &name); + + BotInfo *GetClient(const Anope::string &name); }; struct Uplink diff --git a/include/modes.h b/include/modes.h index 2d9755817..1e5d7f7c1 100644 --- a/include/modes.h +++ b/include/modes.h @@ -262,24 +262,6 @@ class CoreExport ChannelModeRegistered : public ChannelMode bool CanSet(User *u) const anope_override; }; -class StackerInfo -{ - public: - /* Modes to be added */ - std::list<std::pair<Mode *, Anope::string> > AddModes; - /* Modes to be deleted */ - std::list<std::pair<Mode *, Anope::string> > DelModes; - /* Bot this is sent from */ - const BotInfo *bi; - - /** Add a mode to this object - * @param mode The mode - * @param set true if setting, false if unsetting - * @param param The param for the mode - */ - void AddMode(Mode *mode, bool set, const Anope::string ¶m); -}; - /** This is the mode manager * It contains functions for adding modes to Anope so Anope can track them * and do things such as MLOCK. @@ -289,16 +271,6 @@ class StackerInfo class CoreExport ModeManager { protected: - /* List of pairs of user/channels and their stacker info */ - static std::map<User *, StackerInfo *> UserStackerObjects; - static std::map<Channel *, StackerInfo *> ChannelStackerObjects; - - /** Build a list of mode strings to send to the IRCd from the mode stacker - * @param info The stacker info for a channel or user - * @return a list of strings - */ - static std::list<Anope::string> BuildModeStrings(StackerInfo *info); - /* Array of all modes Anope knows about. Modes are in this array at position * modechar. Additionally, status modes are in this array (again) at statuschar. */ diff --git a/include/module.h b/include/module.h index d2b365bd7..39ef3403f 100644 --- a/include/module.h +++ b/include/module.h @@ -46,9 +46,9 @@ #include "users.h" #include "xline.h" -#include "modules/chanserv.h" -#include "modules/global.h" -#include "modules/memoserv.h" -#include "modules/nickserv.h" +#include "modules/pseudoclients/chanserv.h" +#include "modules/pseudoclients/global.h" +#include "modules/pseudoclients/memoserv.h" +#include "modules/pseudoclients/nickserv.h" #endif // MODULE_H diff --git a/include/modules.h b/include/modules.h index 641f6f80e..3f99a9114 100644 --- a/include/modules.h +++ b/include/modules.h @@ -363,9 +363,8 @@ class CoreExport Module : public Extensible virtual void OnPostCommand(CommandSource &source, Command *command, const std::vector<Anope::string> ¶ms) { } /** Called when the databases are saved - * @return EVENT_CONTINUE to let other modules continue saving, EVENT_STOP to stop */ - virtual EventReturn OnSaveDatabase() { return EVENT_CONTINUE; } + virtual void OnSaveDatabase() { } /** Called when the databases are loaded * @return EVENT_CONTINUE to let other modules continue loading, EVENT_STOP to stop @@ -714,11 +713,16 @@ class CoreExport Module : public Extensible */ virtual void OnNickGroup(User *u, NickAlias *target) { } - /** Called when a user identifies + /** Called when a user identifies to a nick * @param u The user */ virtual void OnNickIdentify(User *u) { } + /** Called when a user is logged into an account + * @param u The user + */ + virtual void OnUserLogin(User *u) { } + /** Called when a nick logs out * @param u The nick */ @@ -985,8 +989,9 @@ class CoreExport Module : public Extensible * @param chan The channel * @param access The user's access on the channel * @param give_modes If giving modes is desired + * @param take_modes If taking modes is desired */ - virtual void OnSetCorrectModes(User *user, Channel *chan, AccessGroup &access, bool give_modes) { } + virtual void OnSetCorrectModes(User *user, Channel *chan, AccessGroup &access, bool &give_modes, bool &take_modes) { } virtual void OnSerializeCheck(Serialize::Type *) { } virtual void OnSerializableConstruct(Serializable *) { } @@ -1025,6 +1030,13 @@ class CoreExport Module : public Extensible * @param cm The mode */ virtual EventReturn OnCanSet(User *u, const ChannelMode *cm) { return EVENT_CONTINUE; } + + virtual EventReturn OnCheckDelete(Channel *) { return EVENT_CONTINUE; } + + /** Called every options:expiretimeout seconds. Should be used to expire nicks, + * channels, etc. + */ + virtual void OnExpireTick() { } }; /** Implementation-specific flags which may be set in ModuleManager::Attach() @@ -1036,13 +1048,13 @@ enum Implementation I_OnPreNickExpire, I_OnNickExpire, I_OnNickForbidden, I_OnNickGroup, I_OnNickLogout, I_OnNickIdentify, I_OnNickDrop, I_OnNickRegister, I_OnNickSuspended, I_OnNickUnsuspended, I_OnDelNick, I_OnNickCoreCreate, I_OnDelCore, I_OnChangeCoreDisplay, I_OnNickClearAccess, I_OnNickAddAccess, I_OnNickEraseAccess, I_OnNickClearCert, I_OnNickAddCert, I_OnNickEraseCert, - I_OnNickInfo, I_OnCheckAuthentication, I_OnNickUpdate, I_OnSetNickOption, + I_OnNickInfo, I_OnCheckAuthentication, I_OnNickUpdate, I_OnSetNickOption, I_OnUserLogin, /* ChanServ */ I_OnChanSuspend, I_OnChanDrop, I_OnPreChanExpire, I_OnChanExpire, I_OnAccessAdd, I_OnAccessDel, I_OnAccessClear, I_OnLevelChange, I_OnChanRegistered, I_OnChanUnsuspend, I_OnCreateChan, I_OnDelChan, I_OnChannelCreate, - I_OnChannelDelete, I_OnAkickAdd, I_OnAkickDel, I_OnCheckKick, I_OnCheckModes, - I_OnChanInfo, I_OnCheckPriv, I_OnGroupCheckPriv, I_OnSetChannelOption, I_OnChannelSync, I_OnSetCorrectModes, + I_OnAkickAdd, I_OnAkickDel, I_OnCheckKick, I_OnCheckModes, + I_OnChanInfo, I_OnCheckPriv, I_OnGroupCheckPriv, I_OnSetChannelOption, I_OnSetCorrectModes, /* BotServ */ I_OnCreateBot, I_OnDelBot, @@ -1055,6 +1067,9 @@ enum Implementation /* MemoServ */ I_OnMemoSend, I_OnMemoDel, + /* Channels */ + I_OnChannelModeSet, I_OnChannelModeUnset, I_OnChannelDelete, I_OnChannelSync, I_OnCheckDelete, + /* Users */ I_OnUserConnect, I_OnUserNickChange, I_OnUserQuit, I_OnPreUserLogoff, I_OnPostUserLogoff, I_OnJoinChannel, I_OnPrePartChannel, I_OnPartChannel, I_OnLeaveChannel, I_OnFingerprint, I_OnUserAway, I_OnInvite, @@ -1074,9 +1089,9 @@ enum Implementation I_OnPreHelp, I_OnPostHelp, I_OnPreCommand, I_OnPostCommand, I_OnRestart, I_OnShutdown, I_OnServerQuit, I_OnTopicUpdated, I_OnEncrypt, I_OnDecrypt, - I_OnChannelModeSet, I_OnChannelModeUnset, I_OnUserModeSet, I_OnUserModeUnset, I_OnChannelModeAdd, I_OnUserModeAdd, + I_OnUserModeSet, I_OnUserModeUnset, I_OnChannelModeAdd, I_OnUserModeAdd, I_OnMLock, I_OnUnMLock, I_OnServerSync, I_OnUplinkSync, I_OnBotPrivmsg, I_OnPrivmsg, I_OnLog, I_OnDnsRequest, - I_OnMessage, I_OnCanSet, + I_OnMessage, I_OnCanSet, I_OnExpireTick, I_OnSerializeCheck, I_OnSerializableConstruct, I_OnSerializableDestruct, I_OnSerializableUpdate, I_OnSerializeTypeCreate, I_END diff --git a/include/modules/chanserv.h b/include/modules/pseudoclients/chanserv.h index e1c3849fd..e1c3849fd 100644 --- a/include/modules/chanserv.h +++ b/include/modules/pseudoclients/chanserv.h diff --git a/include/modules/global.h b/include/modules/pseudoclients/global.h index 52afc4a23..52afc4a23 100644 --- a/include/modules/global.h +++ b/include/modules/pseudoclients/global.h diff --git a/include/modules/memoserv.h b/include/modules/pseudoclients/memoserv.h index d35d3f8a0..d35d3f8a0 100644 --- a/include/modules/memoserv.h +++ b/include/modules/pseudoclients/memoserv.h diff --git a/include/modules/nickserv.h b/include/modules/pseudoclients/nickserv.h index b20d6ebd1..c0238ecfc 100644 --- a/include/modules/nickserv.h +++ b/include/modules/pseudoclients/nickserv.h @@ -9,7 +9,8 @@ class NickServService : public Service } virtual void Validate(User *u) = 0; - virtual void Login(User *u, NickAlias *na) = 0; + virtual void Collide(User *u, NickAlias *na) = 0; + virtual void Release(NickAlias *na) = 0; }; #endif // NICKSERV_H diff --git a/include/regchannel.h b/include/regchannel.h index 91cc90ffa..08fae12b3 100644 --- a/include/regchannel.h +++ b/include/regchannel.h @@ -399,17 +399,6 @@ class CoreExport ChannelInfo : public Serializable, public Extensible */ bool CheckKick(User *user); - /** Check the channel topic - * If topic lock is enabled will change the topic back, else it records - * the new topic in the ChannelInfo - */ - void CheckTopic(); - - /** Restore the channel topic, used on channel creation when not syncing with the uplink - * and after uplink sync - */ - void RestoreTopic(); - /** Get the level for a privilege * @param priv The privilege name * @return the level diff --git a/include/users.h b/include/users.h index 00ff5e410..768b6dfa1 100644 --- a/include/users.h +++ b/include/users.h @@ -187,12 +187,6 @@ class CoreExport User : public virtual Base, public Extensible, public CommandRe void SendMessage(const BotInfo *source, const char *fmt, ...); void SendMessage(const BotInfo *source, const Anope::string &msg) anope_override; - /** Collide a nick - * See the comment in users.cpp - * @param na The nick - */ - void Collide(NickAlias *na); - /** Identify the user to the Nick * updates last_seen, logs the user in, * send messages, checks for mails, set vhost and more diff --git a/modules/commands/bs_assign.cpp b/modules/commands/bs_assign.cpp index bbac6e689..9a0b638c7 100644 --- a/modules/commands/bs_assign.cpp +++ b/modules/commands/bs_assign.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandBSAssign : public Command diff --git a/modules/commands/bs_badwords.cpp b/modules/commands/bs_badwords.cpp index 31dee8f8e..22fa74714 100644 --- a/modules/commands/bs_badwords.cpp +++ b/modules/commands/bs_badwords.cpp @@ -215,7 +215,6 @@ class CommandBSBadwords : public Command ci->ClearBadWords(); source.Reply(_("Bad words list is now empty.")); - return; } public: diff --git a/modules/commands/bs_bot.cpp b/modules/commands/bs_bot.cpp index 16fd9f2f2..aa3cf378d 100644 --- a/modules/commands/bs_bot.cpp +++ b/modules/commands/bs_bot.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandBSBot : public Command diff --git a/modules/commands/bs_botlist.cpp b/modules/commands/bs_botlist.cpp index e682bd47d..2714c3fdc 100644 --- a/modules/commands/bs_botlist.cpp +++ b/modules/commands/bs_botlist.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandBSBotList : public Command diff --git a/modules/commands/bs_control.cpp b/modules/commands/bs_control.cpp index 32e9392d7..94186c13b 100644 --- a/modules/commands/bs_control.cpp +++ b/modules/commands/bs_control.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandBSSay : public Command diff --git a/modules/commands/bs_info.cpp b/modules/commands/bs_info.cpp index 6c017dc55..8bbfd0b18 100644 --- a/modules/commands/bs_info.cpp +++ b/modules/commands/bs_info.cpp @@ -10,8 +10,6 @@ * * */ -/*************************************************************************/ - #include "module.h" class CommandBSInfo : public Command diff --git a/modules/commands/bs_kick.cpp b/modules/commands/bs_kick.cpp index 5c1bdc6a8..4b869421d 100644 --- a/modules/commands/bs_kick.cpp +++ b/modules/commands/bs_kick.cpp @@ -74,7 +74,7 @@ class CommandBSKickBase : public Command virtual bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override = 0; protected: - bool CheckArguments(CommandSource &source, const std::vector<Anope::string> ¶ms, ChannelInfo* &ci) anope_override + bool CheckArguments(CommandSource &source, const std::vector<Anope::string> ¶ms, ChannelInfo* &ci) { const Anope::string &chan = params[0]; const Anope::string &option = params[1]; diff --git a/modules/commands/cs_access.cpp b/modules/commands/cs_access.cpp index f8356b383..64b2386fb 100644 --- a/modules/commands/cs_access.cpp +++ b/modules/commands/cs_access.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" static std::map<Anope::string, int16_t, ci::less> defaultLevels; diff --git a/modules/commands/cs_akick.cpp b/modules/commands/cs_akick.cpp index 51665d309..1cce6afbe 100644 --- a/modules/commands/cs_akick.cpp +++ b/modules/commands/cs_akick.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandCSAKick : public Command diff --git a/modules/commands/cs_ban.cpp b/modules/commands/cs_ban.cpp index c3fffecd9..fbd9833a5 100644 --- a/modules/commands/cs_ban.cpp +++ b/modules/commands/cs_ban.cpp @@ -9,7 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ #include "module.h" diff --git a/modules/commands/cs_clone.cpp b/modules/commands/cs_clone.cpp index e4c1ac7f6..d7045123f 100644 --- a/modules/commands/cs_clone.cpp +++ b/modules/commands/cs_clone.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandCSClone : public Command @@ -75,14 +73,7 @@ public: target_ci->c->CheckModes(); - target_ci->c->SetCorrectModes(u, true, true); - - /* Mark the channel as persistent */ - if (target_ci->c->HasMode("PERM")) - target_ci->ExtendMetadata("PERSIST"); - /* Persist may be in def cflags, set it here */ - else if (target_ci->HasExt("PERSIST")) - target_ci->c->SetMode(NULL, "PERM"); + target_ci->c->SetCorrectModes(u, true); } if (target_ci->c && !target_ci->c->topic.empty()) diff --git a/modules/commands/cs_drop.cpp b/modules/commands/cs_drop.cpp index 433e35799..998dd8ab0 100644 --- a/modules/commands/cs_drop.cpp +++ b/modules/commands/cs_drop.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandCSDrop : public Command diff --git a/modules/commands/cs_enforce.cpp b/modules/commands/cs_enforce.cpp index 0579ebb2b..e40676186 100644 --- a/modules/commands/cs_enforce.cpp +++ b/modules/commands/cs_enforce.cpp @@ -33,7 +33,7 @@ class CommandCSEnforce : public Command { ChanUserContainer *uc = it->second; - ci->c->SetCorrectModes(uc->user, false, false); + ci->c->SetCorrectModes(uc->user, false); } if (!hadsecureops) diff --git a/modules/commands/cs_entrymsg.cpp b/modules/commands/cs_entrymsg.cpp index da764d81c..c5e31f122 100644 --- a/modules/commands/cs_entrymsg.cpp +++ b/modules/commands/cs_entrymsg.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" struct EntryMsg : Serializable diff --git a/modules/commands/cs_fantasy_stats.cpp b/modules/commands/cs_fantasy_stats.cpp index b8c83e73b..a7324bf9f 100644 --- a/modules/commands/cs_fantasy_stats.cpp +++ b/modules/commands/cs_fantasy_stats.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" #include "modules/sql.h" diff --git a/modules/commands/cs_fantasy_top.cpp b/modules/commands/cs_fantasy_top.cpp index 7f82ba221..ca2e67ab9 100644 --- a/modules/commands/cs_fantasy_top.cpp +++ b/modules/commands/cs_fantasy_top.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" #include "modules/sql.h" diff --git a/modules/commands/cs_flags.cpp b/modules/commands/cs_flags.cpp index 18b72ef29..4867b9029 100644 --- a/modules/commands/cs_flags.cpp +++ b/modules/commands/cs_flags.cpp @@ -9,11 +9,8 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" -static ServiceReference<ChanServService> chanserv("ChanServService", "ChanServ"); static std::map<Anope::string, char> defaultFlags; class FlagsChanAccess : public ChanAccess diff --git a/modules/commands/cs_getkey.cpp b/modules/commands/cs_getkey.cpp index ec64b45f8..d22cd2319 100644 --- a/modules/commands/cs_getkey.cpp +++ b/modules/commands/cs_getkey.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandCSGetKey : public Command @@ -50,7 +48,6 @@ class CommandCSGetKey : public Command Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci); source.Reply(_("Key for channel \002%s\002 is \002%s\002."), chan.c_str(), key.c_str()); - return; } bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override diff --git a/modules/commands/cs_info.cpp b/modules/commands/cs_info.cpp index 61511aaaf..3f9a014bb 100644 --- a/modules/commands/cs_info.cpp +++ b/modules/commands/cs_info.cpp @@ -9,12 +9,8 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" -static ServiceReference<ChanServService> chanserv("ChanServService", "ChanServ"); - class CommandCSInfo : public Command { void CheckOptStr(Anope::string &buf, const Anope::string &opt, const char *str, const ChannelInfo *ci, const NickCore *nc) @@ -116,8 +112,6 @@ class CommandCSInfo : public Command for (unsigned i = 0; i < replies.size(); ++i) source.Reply(replies[i]); - - return; } bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override diff --git a/modules/commands/cs_invite.cpp b/modules/commands/cs_invite.cpp index 4b204bfc4..d5d42c65f 100644 --- a/modules/commands/cs_invite.cpp +++ b/modules/commands/cs_invite.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandCSInvite : public Command @@ -83,7 +81,6 @@ class CommandCSInvite : public Command } u2->SendMessage(ci->WhoSends(), _("You have been invited to \002%s\002."), c->name.c_str()); } - return; } bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override diff --git a/modules/commands/cs_kick.cpp b/modules/commands/cs_kick.cpp index f1a632af3..8d6749540 100644 --- a/modules/commands/cs_kick.cpp +++ b/modules/commands/cs_kick.cpp @@ -9,12 +9,8 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" -static ServiceReference<ChanServService> chanserv("ChanServService", "ChanServ"); - class CommandCSKick : public Command { public: diff --git a/modules/commands/cs_list.cpp b/modules/commands/cs_list.cpp index 13492c007..9e2df0a62 100644 --- a/modules/commands/cs_list.cpp +++ b/modules/commands/cs_list.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandCSList : public Command @@ -117,7 +115,6 @@ class CommandCSList : public Command source.Reply(replies[i]); source.Reply(_("End of list - %d/%d matches shown."), nchans > listmax ? listmax : nchans, nchans); - return; } bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override diff --git a/modules/commands/cs_log.cpp b/modules/commands/cs_log.cpp index b3ad62859..a7987a740 100644 --- a/modules/commands/cs_log.cpp +++ b/modules/commands/cs_log.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandCSLog : public Command diff --git a/modules/commands/cs_mode.cpp b/modules/commands/cs_mode.cpp index ef43d1061..895bd3d5b 100644 --- a/modules/commands/cs_mode.cpp +++ b/modules/commands/cs_mode.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandCSMode : public Command diff --git a/modules/commands/cs_register.cpp b/modules/commands/cs_register.cpp index ff2fbf69c..4d4bc9353 100644 --- a/modules/commands/cs_register.cpp +++ b/modules/commands/cs_register.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandCSRegister : public Command @@ -74,19 +72,11 @@ class CommandCSRegister : public Command { c->CheckModes(); if (u) - c->SetCorrectModes(u, true, true); - - /* Mark the channel as persistent */ - if (c->HasMode("PERM")) - ci->Extend("PERSIST"); - /* Persist may be in def cflags, set it here */ - else if (ci->HasExt("PERSIST")) - c->SetMode(NULL, "PERM"); + c->SetCorrectModes(u, true); } FOREACH_MOD(I_OnChanRegistered, OnChanRegistered(ci)); } - return; } bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override @@ -103,7 +93,8 @@ class CommandCSRegister : public Command "\"founder\" of the channel. The channel founder is allowed\n" "to change all of the channel settings for the channel;\n" "%s will also automatically give the founder\n" - "channel-operator privileges when s/he enters the channel.")); + "channel-operator privileges when s/he enters the channel."), + source.service->nick.c_str(), source.service->nick.c_str()); BotInfo *bi; Anope::string cmd; if (Command::FindCommandFromService("chanserv/access", bi, cmd)) diff --git a/modules/commands/cs_seen.cpp b/modules/commands/cs_seen.cpp index 610ad4475..aacd3c168 100644 --- a/modules/commands/cs_seen.cpp +++ b/modules/commands/cs_seen.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" @@ -290,14 +288,28 @@ class CommandSeen : public Command } }; -class DataBasePurger : public Timer +class CSSeen : public Module { + Serialize::Type seeninfo_type; + CommandSeen commandseen; + CommandOSSeen commandosseen; public: - DataBasePurger(Module *o) : Timer(o, 300, Anope::CurTime, true) { } + CSSeen(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR), seeninfo_type("SeenInfo", SeenInfo::Unserialize), commandseen(this), commandosseen(this) + { + + Implementation eventlist[] = { I_OnExpireTick, + I_OnUserConnect, + I_OnUserNickChange, + I_OnUserQuit, + I_OnJoinChannel, + I_OnPartChannel, + I_OnPreUserKicked }; + ModuleManager::Attach(eventlist, this, sizeof(eventlist) / sizeof(Implementation)); + } - void Tick(time_t) anope_override + void OnExpireTick() anope_override { - size_t previous_size = database.size(), purgetime = Config->GetModule(this->GetOwner())->Get<time_t>("purgetime"); + size_t previous_size = database.size(), purgetime = Config->GetModule(this)->Get<time_t>("purgetime"); if (!purgetime) purgetime = Anope::DoTime("30d"); for (database_map::iterator it = database.begin(), it_end = database.end(); it != it_end;) @@ -314,37 +326,6 @@ class DataBasePurger : public Timer } Log(LOG_DEBUG) << "cs_seen: Purged database, checked " << previous_size << " nicks and removed " << (previous_size - database.size()) << " old entries."; } -}; - -class CSSeen : public Module -{ - Serialize::Type seeninfo_type; - CommandSeen commandseen; - CommandOSSeen commandosseen; - DataBasePurger purger; - public: - CSSeen(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR), seeninfo_type("SeenInfo", SeenInfo::Unserialize), commandseen(this), commandosseen(this), purger(this) - { - - Implementation eventlist[] = { I_OnReload, - I_OnUserConnect, - I_OnUserNickChange, - I_OnUserQuit, - I_OnJoinChannel, - I_OnPartChannel, - I_OnPreUserKicked }; - ModuleManager::Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation)); - } - - void OnReload(Configuration::Conf *conf) anope_override - { - time_t expiretimeout = conf->GetModule(this)->Get<time_t>("expiretimeout"); - if (!expiretimeout) - expiretimeout = Anope::DoTime("1d"); - - if (purger.GetSecs() != expiretimeout) - purger.SetSecs(expiretimeout); - } void OnUserConnect(User *u, bool &exempt) anope_override { diff --git a/modules/commands/cs_set.cpp b/modules/commands/cs_set.cpp index 028ff0069..45373e254 100644 --- a/modules/commands/cs_set.cpp +++ b/modules/commands/cs_set.cpp @@ -23,7 +23,6 @@ class CommandCSSet : public Command void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { this->OnSyntaxError(source, ""); - return; } bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override @@ -515,11 +514,13 @@ class CommandCSSetPersist : public Command */ if (!ci->bi && !cm) { + BotInfo *ChanServ = Config->GetClient("ChanServ"); if (!ChanServ) { source.Reply(_("ChanServ is required to enable persist on this network.")); return; } + ChanServ->Assign(NULL, ci); if (!ci->c->FindUser(ChanServ)) { @@ -559,6 +560,8 @@ class CommandCSSetPersist : public Command /* No channel mode, no BotServ, but using ChanServ as the botserv bot * which was assigned when persist was set on */ + BotInfo *ChanServ = Config->GetClient("ChanServ"), + *BotServ = Config->GetClient("BotServ"); if (!cm && !BotServ && ci->bi) { if (!ChanServ) @@ -576,8 +579,6 @@ class CommandCSSetPersist : public Command } else this->OnSyntaxError(source, "PERSIST"); - - return; } bool OnHelp(CommandSource &source, const Anope::string &) anope_override @@ -1105,7 +1106,6 @@ class CSSet : public Module CommandCSSetAutoOp commandcssetautoop; CommandCSSetBanType commandcssetbantype; CommandCSSetChanstats commandcssetchanstats; - bool CSDefChanstats; CommandCSSetDescription commandcssetdescription; CommandCSSetFounder commandcssetfounder; CommandCSSetKeepTopic commandcssetkeeptopic; @@ -1123,13 +1123,14 @@ class CSSet : public Module public: CSSet(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR), commandcsset(this), commandcssetautoop(this), commandcssetbantype(this), commandcssetchanstats(this), - CSDefChanstats(false), commandcssetdescription(this), commandcssetfounder(this), commandcssetkeeptopic(this), + commandcssetdescription(this), commandcssetfounder(this), commandcssetkeeptopic(this), commandcssetpeace(this), commandcssetpersist(this), commandcssetprivate(this), commandcssetrestricted(this), commandcssetsecure(this), commandcssetsecurefounder(this), commandcssetsecureops(this), commandcssetsignkick(this), commandcssetsuccessor(this), commandcssetnoexpire(this) { - Implementation i[] = { I_OnCheckKick, I_OnDelChan }; + Implementation i[] = { I_OnCheckKick, I_OnDelChan, I_OnChannelModeSet, I_OnChannelModeUnset, I_OnCheckDelete, I_OnJoinChannel, + I_OnSetCorrectModes }; ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation)); } @@ -1148,6 +1149,62 @@ class CSSet : public Module { if (ci->c && ci->HasExt("PERSIST")) ci->c->RemoveMode(ci->WhoSends(), "PERM", "", false); + ci->Shrink("PERSIST"); + } + + EventReturn OnChannelModeSet(Channel *c, MessageSource &setter, const Anope::string &mname, const Anope::string ¶m) anope_override + { + /* Channel mode +P or so was set, mark this channel as persistent */ + if (mname == "PERM" && c->ci) + { + c->ci->ExtendMetadata("PERSIST"); + } + + return EVENT_CONTINUE; + } + + EventReturn OnChannelModeUnset(Channel *c, MessageSource &setter, const Anope::string &mname, const Anope::string ¶m) anope_override + { + if (mname == "PERM") + { + if (c->ci) + c->ci->Shrink("PERSIST"); + + if (c->users.empty() && !c->syncing && c->CheckDelete()) + { + delete c; + return EVENT_STOP; + } + } + + return EVENT_CONTINUE; + } + + EventReturn OnCheckDelete(Channel *c) anope_override + { + if (c->ci && c->ci->HasExt("PERSIST")) + return EVENT_STOP; + return EVENT_CONTINUE; + } + + void OnJoinChannel(User *u, Channel *c) anope_override + { + if (c->ci && c->ci->HasExt("PERSIST") && c->creation_time > c->ci->time_registered) + { + Log(LOG_DEBUG) << "Changing TS of " << c->name << " from " << c->creation_time << " to " << c->ci->time_registered; + c->creation_time = c->ci->time_registered; + IRCD->SendChannel(c); + c->Reset(); + } + } + + void OnSetCorrectModes(User *user, Channel *chan, AccessGroup &access, bool &give_modes, bool &take_modes) anope_override + { + if (chan->ci) + { + give_modes &= !chan->ci->HasExt("NOAUTOOP"); + take_modes |= chan->ci->HasExt("SECUREOPS"); + } } }; diff --git a/modules/commands/cs_set_misc.cpp b/modules/commands/cs_set_misc.cpp index 9402f5b78..5f1359f18 100644 --- a/modules/commands/cs_set_misc.cpp +++ b/modules/commands/cs_set_misc.cpp @@ -8,8 +8,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" static std::map<Anope::string, Anope::string> descriptions; diff --git a/modules/commands/cs_status.cpp b/modules/commands/cs_status.cpp index 50f7080ac..5529e6148 100644 --- a/modules/commands/cs_status.cpp +++ b/modules/commands/cs_status.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandCSStatus : public Command diff --git a/modules/commands/cs_suspend.cpp b/modules/commands/cs_suspend.cpp index e19710e60..88a369e58 100644 --- a/modules/commands/cs_suspend.cpp +++ b/modules/commands/cs_suspend.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandCSSuspend : public Command @@ -205,7 +203,7 @@ class CSSuspend : public Module ci->Shrink("suspend:reason"); ci->Shrink("suspend:time"); - Log(LOG_NORMAL, "expire", ChanServ) << "Expiring suspend for " << ci->name; + Log(this) << "Expiring suspend for " << ci->name; } } catch (const ConvertException &) { } diff --git a/modules/commands/cs_sync.cpp b/modules/commands/cs_sync.cpp index 9e6dfb0ec..4b854bd45 100644 --- a/modules/commands/cs_sync.cpp +++ b/modules/commands/cs_sync.cpp @@ -35,7 +35,7 @@ class CommandCSSync : public Command Log(LOG_COMMAND, source, this, ci); for (Channel::ChanUserList::iterator it = ci->c->users.begin(), it_end = ci->c->users.end(); it != it_end; ++it) - ci->c->SetCorrectModes(it->second->user, true, false); + ci->c->SetCorrectModes(it->second->user, true); source.Reply(_("All user modes on \002%s\002 have been synced."), ci->name.c_str()); } diff --git a/modules/commands/cs_unban.cpp b/modules/commands/cs_unban.cpp index 8b90ee93d..59d2dfeaa 100644 --- a/modules/commands/cs_unban.cpp +++ b/modules/commands/cs_unban.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandCSUnban : public Command diff --git a/modules/commands/cs_updown.cpp b/modules/commands/cs_updown.cpp index 8a8f3f336..ab00d5d5d 100644 --- a/modules/commands/cs_updown.cpp +++ b/modules/commands/cs_updown.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandCSUp : public Command @@ -31,7 +29,7 @@ class CommandCSUp : public Command for (User::ChanUserList::iterator it = source.GetUser()->chans.begin(); it != source.GetUser()->chans.end(); ++it) { Channel *c = it->second->chan; - c->SetCorrectModes(source.GetUser(), true, false); + c->SetCorrectModes(source.GetUser(), true); } } else @@ -58,6 +56,11 @@ class CommandCSUp : public Command source.Reply(NICK_X_NOT_IN_USE, nick.c_str()); return; } + else if (!u->FindChannel(c)) + { + source.Reply(NICK_X_NOT_ON_CHAN, nick.c_str(), channel.c_str()); + return; + } else if (source.GetUser() && u != source.GetUser() && c->ci->HasExt("PEACE")) { if (c->ci->AccessFor(u) > c->ci->AccessFor(source.GetUser())) @@ -67,7 +70,7 @@ class CommandCSUp : public Command } } - c->SetCorrectModes(u, true, false); + c->SetCorrectModes(u, true); } } @@ -136,6 +139,11 @@ class CommandCSDown : public Command source.Reply(NICK_X_NOT_IN_USE, nick.c_str()); return; } + else if (!u->FindChannel(c)) + { + source.Reply(NICK_X_NOT_ON_CHAN, nick.c_str(), channel.c_str()); + return; + } else if (source.GetUser() && u != source.GetUser() && c->ci->HasExt("PEACE")) { if (c->ci->AccessFor(u) > c->ci->AccessFor(source.GetUser())) diff --git a/modules/commands/gl_global.cpp b/modules/commands/gl_global.cpp index 70dd4d324..a02c1cccd 100644 --- a/modules/commands/gl_global.cpp +++ b/modules/commands/gl_global.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandGLGlobal : public Command @@ -33,7 +31,7 @@ class CommandGLGlobal : public Command else { Log(LOG_ADMIN, source, this); - GService->SendGlobal(Global, source.GetNick(), msg); + GService->SendGlobal(NULL, source.GetNick(), msg); } } diff --git a/modules/commands/help.cpp b/modules/commands/help.cpp index eaf45ebf4..47ce98825 100644 --- a/modules/commands/help.cpp +++ b/modules/commands/help.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandHelp : public Command diff --git a/modules/commands/hs_del.cpp b/modules/commands/hs_del.cpp index ad9347ce0..1fa4f7b31 100644 --- a/modules/commands/hs_del.cpp +++ b/modules/commands/hs_del.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandHSDel : public Command diff --git a/modules/commands/hs_group.cpp b/modules/commands/hs_group.cpp index 13062fc9e..c07ce297a 100644 --- a/modules/commands/hs_group.cpp +++ b/modules/commands/hs_group.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandHSGroup : public Command diff --git a/modules/commands/hs_list.cpp b/modules/commands/hs_list.cpp index 6bf6d49a9..aa712008f 100644 --- a/modules/commands/hs_list.cpp +++ b/modules/commands/hs_list.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandHSList : public Command diff --git a/modules/commands/hs_off.cpp b/modules/commands/hs_off.cpp index 13a64c9d9..433fff675 100644 --- a/modules/commands/hs_off.cpp +++ b/modules/commands/hs_off.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandHSOff : public Command diff --git a/modules/commands/hs_on.cpp b/modules/commands/hs_on.cpp index fb3ca1396..95e685309 100644 --- a/modules/commands/hs_on.cpp +++ b/modules/commands/hs_on.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandHSOn : public Command diff --git a/modules/commands/hs_request.cpp b/modules/commands/hs_request.cpp index 99c5a4811..d12973e01 100644 --- a/modules/commands/hs_request.cpp +++ b/modules/commands/hs_request.cpp @@ -193,7 +193,7 @@ class CommandHSActivate : public Command FOREACH_MOD(I_OnSetVhost, OnSetVhost(na)); if (Config->GetModule(this->owner)->Get<bool>("memouser") && memoserv) - memoserv->Send(HostServ->nick, na->nick, _("[auto memo] Your requested vHost has been approved."), true); + memoserv->Send(source.service->nick, na->nick, _("[auto memo] Your requested vHost has been approved."), true); source.Reply(_("vHost for %s has been activated."), na->nick.c_str()); Log(LOG_COMMAND, source, this) << "for " << na->nick << " for vhost " << (!req->ident.empty() ? req->ident + "@" : "") << req->host; @@ -244,7 +244,7 @@ class CommandHSReject : public Command else message = _("[auto memo] Your requested vHost has been rejected."); - memoserv->Send(HostServ->nick, nick, message, true); + memoserv->Send(source.service->nick, nick, message, true); } source.Reply(_("vHost for %s has been rejected."), nick.c_str()); @@ -380,7 +380,7 @@ static void req_send_memos(Module *me, CommandSource &source, const Anope::strin Anope::string message = Anope::printf(_("[auto memo] vHost \002%s\002 has been requested by %s."), host.c_str(), source.GetNick().c_str()); - memoserv->Send(HostServ->nick, na->nick, message, true); + memoserv->Send(source.service->nick, na->nick, message, true); } } diff --git a/modules/commands/hs_set.cpp b/modules/commands/hs_set.cpp index 8e83ae8a8..834ac5fc1 100644 --- a/modules/commands/hs_set.cpp +++ b/modules/commands/hs_set.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandHSSet : public Command diff --git a/modules/commands/ms_cancel.cpp b/modules/commands/ms_cancel.cpp index 2ab605f40..cf1a0809f 100644 --- a/modules/commands/ms_cancel.cpp +++ b/modules/commands/ms_cancel.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandMSCancel : public Command diff --git a/modules/commands/ms_check.cpp b/modules/commands/ms_check.cpp index 9a24e9973..b912777fe 100644 --- a/modules/commands/ms_check.cpp +++ b/modules/commands/ms_check.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandMSCheck : public Command diff --git a/modules/commands/ms_del.cpp b/modules/commands/ms_del.cpp index 18927f8ee..dac5ae43e 100644 --- a/modules/commands/ms_del.cpp +++ b/modules/commands/ms_del.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class MemoDelCallback : public NumberList diff --git a/modules/commands/ms_ignore.cpp b/modules/commands/ms_ignore.cpp index 056b20128..28dd6514d 100644 --- a/modules/commands/ms_ignore.cpp +++ b/modules/commands/ms_ignore.cpp @@ -9,13 +9,8 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - - #include "module.h" -static ServiceReference<MemoServService> MemoServService("MemoServService", "MemoServ"); - class CommandMSIgnore : public Command { public: @@ -29,10 +24,6 @@ class CommandMSIgnore : public Command void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { - if (!MemoServService) - return; - - Anope::string channel = params[0]; Anope::string command = (params.size() > 1 ? params[1] : ""); Anope::string param = (params.size() > 2 ? params[2] : ""); @@ -123,9 +114,6 @@ class MSIgnore : public Module MSIgnore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR), commandmsignore(this) { - - if (!MemoServService) - throw ModuleException("No MemoServ!"); } }; diff --git a/modules/commands/ms_info.cpp b/modules/commands/ms_info.cpp index 517e6b1ac..67a504117 100644 --- a/modules/commands/ms_info.cpp +++ b/modules/commands/ms_info.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandMSInfo : public Command diff --git a/modules/commands/ms_list.cpp b/modules/commands/ms_list.cpp index 8b7ebeb62..dff88667b 100644 --- a/modules/commands/ms_list.cpp +++ b/modules/commands/ms_list.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandMSList : public Command diff --git a/modules/commands/ms_read.cpp b/modules/commands/ms_read.cpp index b25b4fc4b..8c1ebc9ba 100644 --- a/modules/commands/ms_read.cpp +++ b/modules/commands/ms_read.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" static ServiceReference<MemoServService> MemoServService("MemoServService", "MemoServ"); diff --git a/modules/commands/ms_rsend.cpp b/modules/commands/ms_rsend.cpp index a9372c328..235fb06d0 100644 --- a/modules/commands/ms_rsend.cpp +++ b/modules/commands/ms_rsend.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" namespace diff --git a/modules/commands/ms_send.cpp b/modules/commands/ms_send.cpp index d4d63a383..87603025a 100644 --- a/modules/commands/ms_send.cpp +++ b/modules/commands/ms_send.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" namespace diff --git a/modules/commands/ms_sendall.cpp b/modules/commands/ms_sendall.cpp index b19b96036..803fbf6ba 100644 --- a/modules/commands/ms_sendall.cpp +++ b/modules/commands/ms_sendall.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" namespace diff --git a/modules/commands/ms_set.cpp b/modules/commands/ms_set.cpp index d1edaecca..9bf63b15d 100644 --- a/modules/commands/ms_set.cpp +++ b/modules/commands/ms_set.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandMSSet : public Command @@ -20,6 +18,10 @@ class CommandMSSet : public Command { const Anope::string ¶m = params[1]; NickCore *nc = source.nc; + BotInfo *MemoServ = Config->GetClient("MemoServ"); + + if (!MemoServ) + return; if (param.equals_ci("ON")) { diff --git a/modules/commands/ms_staff.cpp b/modules/commands/ms_staff.cpp index 30ec92b16..20ce265a4 100644 --- a/modules/commands/ms_staff.cpp +++ b/modules/commands/ms_staff.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" namespace diff --git a/modules/commands/ns_access.cpp b/modules/commands/ns_access.cpp index 7de20b9b7..4fa3a2074 100644 --- a/modules/commands/ns_access.cpp +++ b/modules/commands/ns_access.cpp @@ -9,12 +9,8 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" -static ServiceReference<NickServService> nickserv("NickServService", "NickServ"); - class CommandNSAccess : public Command { private: diff --git a/modules/commands/ns_ajoin.cpp b/modules/commands/ns_ajoin.cpp index ba7e53912..0de8b43ff 100644 --- a/modules/commands/ns_ajoin.cpp +++ b/modules/commands/ns_ajoin.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" struct AJoinEntry; @@ -250,6 +248,7 @@ class NSAJoin : public Module void OnNickIdentify(User *u) anope_override { + BotInfo *NickServ = Config->GetClient("NickServ"); if (!NickServ) return; diff --git a/modules/commands/ns_alist.cpp b/modules/commands/ns_alist.cpp index 9c673a7fc..591af44c3 100644 --- a/modules/commands/ns_alist.cpp +++ b/modules/commands/ns_alist.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandNSAList : public Command diff --git a/modules/commands/ns_cert.cpp b/modules/commands/ns_cert.cpp index 71836481a..022d803ea 100644 --- a/modules/commands/ns_cert.cpp +++ b/modules/commands/ns_cert.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" static unsigned accessmax; @@ -169,8 +167,6 @@ class CommandNSCert : public Command return this->DoList(source, nc); else this->OnSyntaxError(source, cmd); - - return; } bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override @@ -180,8 +176,8 @@ class CommandNSCert : public Command source.Reply(_("Modifies or displays the certificate list for your nick.\n" "If you connect to IRC and provide a client certificate with a\n" "matching fingerprint in the cert list, your nick will be\n" - "automatically identified to %s.\n" - " \n"), NickServ ? NickServ->nick.c_str() : source.service->nick.c_str()); + "automatically identified to services.\n" + " \n")); source.Reply(_("Examples:\n" " \n" " \002CERT ADD <fingerprint>\002\n" @@ -205,6 +201,7 @@ class NSCert : public Module void DoAutoIdentify(User *u) { NickAlias *na = NickAlias::Find(u->nick); + BotInfo *NickServ = Config->GetClient("NickServ"); if (!NickServ || !na) return; if (u->IsIdentified() && u->Account() == na->nc) diff --git a/modules/commands/ns_drop.cpp b/modules/commands/ns_drop.cpp index 023d696f6..a21cac709 100644 --- a/modules/commands/ns_drop.cpp +++ b/modules/commands/ns_drop.cpp @@ -9,12 +9,8 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" -static ServiceReference<NickServService> nickserv("NickServService", "NickServ"); - class CommandNSDrop : public Command { public: diff --git a/modules/commands/ns_getemail.cpp b/modules/commands/ns_getemail.cpp index 386940a0a..8139139e1 100644 --- a/modules/commands/ns_getemail.cpp +++ b/modules/commands/ns_getemail.cpp @@ -13,8 +13,6 @@ * Cards are not excepted. Must use user@email-host. */ -/*************************************************************************/ - #include "module.h" class CommandNSGetEMail : public Command diff --git a/modules/commands/ns_getpass.cpp b/modules/commands/ns_getpass.cpp index a99181b3f..cb320ad76 100644 --- a/modules/commands/ns_getpass.cpp +++ b/modules/commands/ns_getpass.cpp @@ -9,12 +9,8 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" -static ServiceReference<NickServService> nickserv("NickServService", "NickServ"); - class CommandNSGetPass : public Command { public: diff --git a/modules/commands/ns_group.cpp b/modules/commands/ns_group.cpp index a744b9afc..9b202b31c 100644 --- a/modules/commands/ns_group.cpp +++ b/modules/commands/ns_group.cpp @@ -9,12 +9,8 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" -static ServiceReference<NickServService> nickserv("NickServService", "NickServ"); - class NSGroupRequest : public IdentifyRequest { CommandSource source; @@ -48,8 +44,6 @@ class NSGroupRequest : public IdentifyRequest u->Login(target->nc); IRCD->SendLogin(u); - if (!Config->GetBlock("options")->Get<bool>("nonicknameownership") && na->nc == u->Account() && na->nc->HasExt("UNCONFIRMED") == false) - u->SetMode(NickServ, "REGISTERED"); FOREACH_MOD(I_OnNickGroup, OnNickGroup(u, target)); Log(LOG_COMMAND, source, cmd) << "makes " << nick << " join group of " << target->nick << " (" << target->nc->display << ") (email: " << (!target->nc->email.empty() ? target->nc->email : "none") << ")"; @@ -251,10 +245,8 @@ class CommandNSUngroup : public Command User *user = User::Find(na->nick); if (user) /* The user on the nick who was ungrouped may be identified to the old group, set -r */ - user->RemoveMode(NickServ, "REGISTERED"); + user->RemoveMode(source.service, "REGISTERED"); } - - return; } bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override diff --git a/modules/commands/ns_identify.cpp b/modules/commands/ns_identify.cpp index 037072728..aec43c1be 100644 --- a/modules/commands/ns_identify.cpp +++ b/modules/commands/ns_identify.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class NSIdentifyRequest : public IdentifyRequest @@ -39,7 +37,6 @@ class NSIdentifyRequest : public IdentifyRequest Log(LOG_COMMAND, source, cmd) << "and identified for account " << na->nc->display; source.Reply(_("Password accepted - you are now recognized.")); u->Identify(na); - na->Release(); } } diff --git a/modules/commands/ns_info.cpp b/modules/commands/ns_info.cpp index 3e946a1f1..f1de95275 100644 --- a/modules/commands/ns_info.cpp +++ b/modules/commands/ns_info.cpp @@ -9,12 +9,8 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" -static ServiceReference<NickServService> nickserv("NickServService", "NickServ"); - class CommandNSInfo : public Command { private: diff --git a/modules/commands/ns_list.cpp b/modules/commands/ns_list.cpp index 69648c2f4..a4e73e857 100644 --- a/modules/commands/ns_list.cpp +++ b/modules/commands/ns_list.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandNSList : public Command diff --git a/modules/commands/ns_logout.cpp b/modules/commands/ns_logout.cpp index c149dc1f2..d5765b0f6 100644 --- a/modules/commands/ns_logout.cpp +++ b/modules/commands/ns_logout.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" static ServiceReference<NickServService> NickServService("NickServService", "NickServ"); @@ -52,7 +50,7 @@ class CommandNSLogout : public Command source.Reply(_("Your nick has been logged out.")); IRCD->SendLogout(u2); - u2->RemoveMode(NickServ, "REGISTERED"); + u2->RemoveMode(source.service, "REGISTERED"); u2->Logout(); /* Send out an event */ diff --git a/modules/commands/ns_recover.cpp b/modules/commands/ns_recover.cpp index e9455f88a..33bc9d19e 100644 --- a/modules/commands/ns_recover.cpp +++ b/modules/commands/ns_recover.cpp @@ -9,10 +9,10 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" +static ServiceReference<NickServService> nickserv("NickServService", "NickServ"); + struct NSRecoverExtensibleInfo : ExtensibleItem, std::map<Anope::string, ChannelStatus> { }; class NSRecoverRequest : public IdentifyRequest @@ -39,7 +39,7 @@ class NSRecoverRequest : public IdentifyRequest /* Nick is being held by us, release it */ if (na->HasExt("HELD")) { - na->Release(); + nickserv->Release(na); source.Reply(_("Service's hold on \002%s\002 has been released."), na->nick.c_str()); } else if (!u) @@ -68,7 +68,7 @@ class NSRecoverRequest : public IdentifyRequest } } - u->SendMessage(NickServ, _("This nickname has been recovered by %s. If you did not do\n" + u->SendMessage(source.service, _("This nickname has been recovered by %s. If you did not do\n" "this then %s may have your password, and you should change it.\n"), source.GetNick().c_str(), source.GetNick().c_str()); @@ -89,13 +89,14 @@ class NSRecoverRequest : public IdentifyRequest Log(LOG_COMMAND, source, cmd) << "and was automatically identified to " << na->nick << " (" << na->nc->display << ")"; } - u->SendMessage(NickServ, _("This nickname has been recovered by %s."), source.GetNick().c_str()); - u->Collide(na); + u->SendMessage(source.service, _("This nickname has been recovered by %s."), source.GetNick().c_str()); + if (nickserv) + nickserv->Collide(u, na); if (IRCD->CanSVSNick) { /* If we can svsnick then release our hold and svsnick the user using the command */ - na->Release(); + nickserv->Release(na); IRCD->SendForceNickChange(source.GetUser(), GetAccount(), Anope::CurTime); } else @@ -226,7 +227,7 @@ class NSRecover : public Module * because some IRCds do not allow us to have these automatically expire */ for (nickalias_map::const_iterator it = NickAliasList->begin(); it != NickAliasList->end(); ++it) - it->second->Release(); + nickserv->Release(it->second); } void OnRestart() anope_override { OnShutdown(); } @@ -236,8 +237,9 @@ class NSRecover : public Module if (Config->GetModule(this)->Get<bool>("restoreonrecover")) { NSRecoverExtensibleInfo *ei = u->GetExt<NSRecoverExtensibleInfo *>("ns_recover_info"); + BotInfo *NickServ = Config->GetClient("NickServ"); - if (ei != NULL) + if (ei != NULL && NickServ != NULL) for (std::map<Anope::string, ChannelStatus>::iterator it = ei->begin(), it_end = ei->end(); it != it_end;) { Channel *c = Channel::Find(it->first); diff --git a/modules/commands/ns_register.cpp b/modules/commands/ns_register.cpp index 2d2f59877..ac1c55696 100644 --- a/modules/commands/ns_register.cpp +++ b/modules/commands/ns_register.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" static bool SendRegmail(User *u, const NickAlias *na, const BotInfo *bi); @@ -59,7 +57,7 @@ class CommandNSConfirm : public Command IRCD->SendLogin(source.GetUser()); const NickAlias *na = NickAlias::Find(source.GetNick()); if (!Config->GetBlock("options")->Get<bool>("nonicknameownership") && na != NULL && na->nc == source.GetAccount() && na->nc->HasExt("UNCONFIRMED") == false) - source.GetUser()->SetMode(NickServ, "REGISTERED"); + source.GetUser()->SetMode(source.service, "REGISTERED"); } } else @@ -192,8 +190,6 @@ class CommandNSRegister : public Command { na->last_usermask = u->GetIdent() + "@" + u->GetDisplayedHost(); na->last_realname = u->realname; - - u->Login(nc); } Log(LOG_COMMAND, source, this) << "to register " << na->nick << " (email: " << (!na->nc->email.empty() ? na->nc->email : "none") << ")"; @@ -227,18 +223,14 @@ class CommandNSRegister : public Command source.Reply(_("If you do not confirm your email address within %s your account will expire."), Anope::Duration(unconfirmed_expire).c_str()); } } - else if (nsregister.equals_ci("none")) - { - if (u) - { - IRCD->SendLogin(u); - if (!Config->GetBlock("options")->Get<bool>("nonicknameownership") && na->nc == u->Account() && na->nc->HasExt("UNCONFIRMED") == false) - u->SetMode(NickServ, "REGISTERED"); - } - } if (u) + { + u->Login(nc); + if (!nc->HasExt("UNCONFIRMED")) + IRCD->SendLogin(u); u->lastnickreg = Anope::CurTime; + } } } diff --git a/modules/commands/ns_resetpass.cpp b/modules/commands/ns_resetpass.cpp index bf1e8dacf..44d941662 100644 --- a/modules/commands/ns_resetpass.cpp +++ b/modules/commands/ns_resetpass.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" static bool SendResetEmail(User *u, const NickAlias *na, const BotInfo *bi); diff --git a/modules/commands/ns_set.cpp b/modules/commands/ns_set.cpp index 3dac72f71..fd32fb2be 100644 --- a/modules/commands/ns_set.cpp +++ b/modules/commands/ns_set.cpp @@ -11,8 +11,6 @@ #include "module.h" -static ServiceReference<NickServService> nickserv("NickServService", "NickServ"); - class CommandNSSet : public Command { public: @@ -1350,7 +1348,6 @@ class NSSet : public Module CommandNSSetChanstats commandnssetchanstats; CommandNSSASetChanstats commandnssasetchanstats; - bool NSDefChanstats; CommandNSSetDisplay commandnssetdisplay; CommandNSSASetDisplay commandnssasetdisplay; @@ -1388,7 +1385,7 @@ class NSSet : public Module NSSet(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR), commandnsset(this), commandnssaset(this), commandnssetautoop(this), commandnssasetautoop(this), - commandnssetchanstats(this), commandnssasetchanstats(this), NSDefChanstats(false), + commandnssetchanstats(this), commandnssasetchanstats(this), commandnssetdisplay(this), commandnssasetdisplay(this), commandnssetemail(this), commandnssasetemail(this), commandnssetgreet(this), commandnssasetgreet(this), @@ -1402,7 +1399,7 @@ class NSSet : public Module commandnssasetnoexpire(this) { - Implementation i[] = { I_OnPreCommand }; + Implementation i[] = { I_OnPreCommand, I_OnSetCorrectModes }; ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation)); } @@ -1429,6 +1426,15 @@ class NSSet : public Module return EVENT_CONTINUE; } + + void OnSetCorrectModes(User *user, Channel *chan, AccessGroup &access, bool &give_modes, bool &take_modes) anope_override + { + if (chan->ci) + { + /* Only give modes if autoop is set */ + give_modes &= !user->Account() || user->Account()->HasExt("AUTOOP"); + } + } }; MODULE_INIT(NSSet) diff --git a/modules/commands/ns_set_misc.cpp b/modules/commands/ns_set_misc.cpp index ae7c2cb53..753450414 100644 --- a/modules/commands/ns_set_misc.cpp +++ b/modules/commands/ns_set_misc.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" static std::map<Anope::string, Anope::string> descriptions; diff --git a/modules/commands/ns_status.cpp b/modules/commands/ns_status.cpp index 68568de0a..3bfeab888 100644 --- a/modules/commands/ns_status.cpp +++ b/modules/commands/ns_status.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandNSStatus : public Command diff --git a/modules/commands/ns_suspend.cpp b/modules/commands/ns_suspend.cpp index 5ca9ca81d..eadb35d7d 100644 --- a/modules/commands/ns_suspend.cpp +++ b/modules/commands/ns_suspend.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" static ServiceReference<NickServService> nickserv("NickServService", "NickServ"); @@ -87,7 +85,8 @@ class CommandNSSuspend : public Command if (u2) { u2->Logout(); - u2->Collide(na2); + if (nickserv) + nickserv->Collide(u2, na2); } } } @@ -96,8 +95,6 @@ class CommandNSSuspend : public Command source.Reply(_("Nick %s is now suspended."), nick.c_str()); FOREACH_MOD(I_OnNickSuspended, OnNickSuspend(na)); - - return; } bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override @@ -218,7 +215,7 @@ class NSSuspend : public Module na->nc->Shrink("suspend:reason"); na->nc->Shrink("suspend:time"); - Log(LOG_NORMAL, "expire", NickServ) << "Expiring suspend for " << na->nick; + Log(LOG_NORMAL, "expire", Config->GetClient("NickServ")) << "Expiring suspend for " << na->nick; } } catch (const ConvertException &) { } diff --git a/modules/commands/ns_update.cpp b/modules/commands/ns_update.cpp index ee8a2c8cb..b56f8eded 100644 --- a/modules/commands/ns_update.cpp +++ b/modules/commands/ns_update.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandNSUpdate : public Command diff --git a/modules/commands/os_akill.cpp b/modules/commands/os_akill.cpp index b7433d0eb..34e6dbd2b 100644 --- a/modules/commands/os_akill.cpp +++ b/modules/commands/os_akill.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" static ServiceReference<XLineManager> akills("XLineManager", "xlinemanager/sgline"); diff --git a/modules/commands/os_chankill.cpp b/modules/commands/os_chankill.cpp index 713b5922f..1304dd75c 100644 --- a/modules/commands/os_chankill.cpp +++ b/modules/commands/os_chankill.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" static ServiceReference<XLineManager> akills("XLineManager", "xlinemanager/sgline"); diff --git a/modules/commands/os_config.cpp b/modules/commands/os_config.cpp index 391d36157..a9ff515fb 100644 --- a/modules/commands/os_config.cpp +++ b/modules/commands/os_config.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandOSConfig : public Command diff --git a/modules/commands/os_defcon.cpp b/modules/commands/os_defcon.cpp index 236cf2e2f..ba695649d 100644 --- a/modules/commands/os_defcon.cpp +++ b/modules/commands/os_defcon.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" #include "modules/os_session.h" @@ -128,17 +126,17 @@ class DefConTimeout : public Timer { DConfig.defaultlevel = level; FOREACH_MOD(I_OnDefconLevel, OnDefconLevel(level)); - Log(OperServ, "operserv/defcon") << "Defcon level timeout, returning to level " << level; + Log(Config->GetClient("OperServ"), "operserv/defcon") << "Defcon level timeout, returning to level " << level; if (DConfig.globalondefcon) { if (!DConfig.offmessage.empty()) - GlobalService->SendGlobal(Global, "", DConfig.offmessage); + GlobalService->SendGlobal(NULL, "", DConfig.offmessage); else - GlobalService->SendGlobal(Global, "", Anope::printf(Language::Translate(_("The Defcon Level is now at Level: \002%d\002")), DConfig.defaultlevel)); + GlobalService->SendGlobal(NULL, "", Anope::printf(Language::Translate(_("The Defcon Level is now at Level: \002%d\002")), DConfig.defaultlevel)); if (!DConfig.message.empty()) - GlobalService->SendGlobal(Global, "", DConfig.message); + GlobalService->SendGlobal(NULL, "", DConfig.message); } runDefCon(); @@ -221,12 +219,12 @@ class CommandOSDefcon : public Command if (DConfig.globalondefcon) { if (DConfig.defaultlevel == 5 && !DConfig.offmessage.empty()) - GlobalService->SendGlobal(Global, "", DConfig.offmessage); + GlobalService->SendGlobal(NULL, "", DConfig.offmessage); else if (DConfig.defaultlevel != 5) { - GlobalService->SendGlobal(Global, "", Anope::printf(_("The Defcon level is now at: \002%d\002"), DConfig.defaultlevel)); + GlobalService->SendGlobal(NULL, "", Anope::printf(_("The Defcon level is now at: \002%d\002"), DConfig.defaultlevel)); if (!DConfig.message.empty()) - GlobalService->SendGlobal(Global, "", DConfig.message); + GlobalService->SendGlobal(NULL, "", DConfig.message); } } @@ -417,7 +415,7 @@ class OSDefcon : public Module if (DConfig.Check(DEFCON_FORCE_CHAN_MODES) && cm && DConfig.DefConModesOff.count(mname)) { - c->RemoveMode(OperServ, cm, param); + c->RemoveMode(Config->GetClient("OperServ"), cm, param); return EVENT_STOP; } @@ -434,9 +432,9 @@ class OSDefcon : public Module Anope::string param; if (DConfig.GetDefConParam(mname, param)) - c->SetMode(OperServ, cm, param); + c->SetMode(Config->GetClient("OperServ"), cm, param); else - c->SetMode(OperServ, cm); + c->SetMode(Config->GetClient("OperServ"), cm); return EVENT_STOP; @@ -488,6 +486,7 @@ class OSDefcon : public Module if (exempt || u->Quitting() || !u->server->IsSynced() || u->server->IsULined()) return; + BotInfo *OperServ = Config->GetClient("OperServ"); if (DConfig.Check(DEFCON_AKILL_NEW_CLIENTS) && akills) { Log(OperServ, "operserv/defcon") << "DEFCON: adding akill for *@" << u->host; @@ -548,12 +547,13 @@ class OSDefcon : public Module void OnChannelSync(Channel *c) anope_override { if (DConfig.Check(DEFCON_FORCE_CHAN_MODES)) - c->SetModes(OperServ, false, "%s", DConfig.chanmodes.c_str()); + c->SetModes(Config->GetClient("OperServ"), false, "%s", DConfig.chanmodes.c_str()); } }; static void runDefCon() { + BotInfo *OperServ = Config->GetClient("OperServ"); if (DConfig.Check(DEFCON_FORCE_CHAN_MODES)) { if (!DConfig.chanmodes.empty() && !DefConModesSet) diff --git a/modules/commands/os_forbid.cpp b/modules/commands/os_forbid.cpp index c7c147c7e..a56d08219 100644 --- a/modules/commands/os_forbid.cpp +++ b/modules/commands/os_forbid.cpp @@ -9,11 +9,11 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" #include "modules/os_forbid.h" +static ServiceReference<NickServService> nickserv("NickServService", "NickServ"); + class MyForbidService : public ForbidService { Serialize::Checker<std::vector<ForbidData *>[FT_SIZE - 1]> forbid_data; @@ -271,6 +271,7 @@ class OSForbid : public Module ForbidData *d = this->forbidService.FindForbid(u->nick, FT_NICK); if (d != NULL) { + BotInfo *OperServ = Config->GetClient("OperServ"); if (OperServ) { if (d->reason.empty()) @@ -278,12 +279,14 @@ class OSForbid : public Module else u->SendMessage(OperServ, _("This nickname has been forbidden: %s"), d->reason.c_str()); } - u->Collide(NULL); + if (nickserv) + nickserv->Collide(u, NULL); } } void OnJoinChannel(User *u, Channel *c) anope_override { + BotInfo *OperServ = Config->GetClient("OperServ"); if (u->HasMode("OPER") || !OperServ) return; diff --git a/modules/commands/os_ignore.cpp b/modules/commands/os_ignore.cpp index b7dda73a3..56c784856 100644 --- a/modules/commands/os_ignore.cpp +++ b/modules/commands/os_ignore.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" #include "modules/os_ignore.h" diff --git a/modules/commands/os_jupe.cpp b/modules/commands/os_jupe.cpp index 4f40a5495..fbade0e82 100644 --- a/modules/commands/os_jupe.cpp +++ b/modules/commands/os_jupe.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandOSJupe : public Command diff --git a/modules/commands/os_kick.cpp b/modules/commands/os_kick.cpp index d9ac75c9a..ea382a453 100644 --- a/modules/commands/os_kick.cpp +++ b/modules/commands/os_kick.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandOSKick : public Command diff --git a/modules/commands/os_kill.cpp b/modules/commands/os_kill.cpp index 99a65ae4b..972092ef9 100644 --- a/modules/commands/os_kill.cpp +++ b/modules/commands/os_kill.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandOSKill : public Command diff --git a/modules/commands/os_list.cpp b/modules/commands/os_list.cpp index dc1fd15ed..f0005e1da 100644 --- a/modules/commands/os_list.cpp +++ b/modules/commands/os_list.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandOSChanList : public Command diff --git a/modules/commands/os_login.cpp b/modules/commands/os_login.cpp index 30172a0f3..573379236 100644 --- a/modules/commands/os_login.cpp +++ b/modules/commands/os_login.cpp @@ -10,8 +10,6 @@ * * */ -/*************************************************************************/ - #include "module.h" class CommandOSLogin : public Command diff --git a/modules/commands/os_mode.cpp b/modules/commands/os_mode.cpp index 8af247da5..7057ead72 100644 --- a/modules/commands/os_mode.cpp +++ b/modules/commands/os_mode.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandOSMode : public Command diff --git a/modules/commands/os_modinfo.cpp b/modules/commands/os_modinfo.cpp index b6f793796..1ad03c7c0 100644 --- a/modules/commands/os_modinfo.cpp +++ b/modules/commands/os_modinfo.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandOSModInfo : public Command diff --git a/modules/commands/os_module.cpp b/modules/commands/os_module.cpp index 0de03971e..8ff7498a7 100644 --- a/modules/commands/os_module.cpp +++ b/modules/commands/os_module.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandOSModLoad : public Command diff --git a/modules/commands/os_news.cpp b/modules/commands/os_news.cpp index e9f70b693..1d55df843 100644 --- a/modules/commands/os_news.cpp +++ b/modules/commands/os_news.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" #include "modules/os_news.h" @@ -342,6 +340,14 @@ class OSNews : public Module if (newsList.empty()) return; + BotInfo *bi = NULL; + if (Type == NEWS_OPER) + bi = BotInfo::Find(Config->GetModule(this)->Get<const Anope::string>("oper_announcer", "OperServ"), true); + else + bi = BotInfo::Find(Config->GetModule(this)->Get<const Anope::string>("announcer", "Global"), true); + if (bi == NULL) + return; + Anope::string msg; if (Type == NEWS_LOGON) msg = _("[\002Logon News\002 - %s] %s"); @@ -357,14 +363,7 @@ class OSNews : public Module if (Type == NEWS_RANDOM && i != cur_rand_news) continue; - const BotInfo *gl = Global; - if (!gl && !BotListByNick->empty()) - gl = BotListByNick->begin()->second; - const BotInfo *os = OperServ; - if (!os) - os = gl; - if (gl) - u->SendMessage(Type != NEWS_OPER ? gl : os, msg.c_str(), Anope::strftime(newsList[i]->time).c_str(), newsList[i]->text.c_str()); + u->SendMessage(bi, msg.c_str(), Anope::strftime(newsList[i]->time).c_str(), newsList[i]->text.c_str()); ++displayed; diff --git a/modules/commands/os_noop.cpp b/modules/commands/os_noop.cpp index 204b0e6e8..239b09a32 100644 --- a/modules/commands/os_noop.cpp +++ b/modules/commands/os_noop.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandOSNOOP : public Command @@ -95,6 +93,7 @@ class OSNOOP : public Module if (setter) { Anope::string reason = "NOOP command used by " + *setter; + BotInfo *OperServ = Config->GetClient("OperServ"); u->Kill(OperServ ? OperServ->nick : "", reason); } } diff --git a/modules/commands/os_oline.cpp b/modules/commands/os_oline.cpp index e8f7cee9d..a2da17406 100644 --- a/modules/commands/os_oline.cpp +++ b/modules/commands/os_oline.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandOSOLine : public Command diff --git a/modules/commands/os_oper.cpp b/modules/commands/os_oper.cpp index c3327dd4b..66a76334a 100644 --- a/modules/commands/os_oper.cpp +++ b/modules/commands/os_oper.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" struct MyOper : Oper, Serializable diff --git a/modules/commands/os_reload.cpp b/modules/commands/os_reload.cpp index ed04fbea3..d3521eef1 100644 --- a/modules/commands/os_reload.cpp +++ b/modules/commands/os_reload.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandOSReload : public Command diff --git a/modules/commands/os_session.cpp b/modules/commands/os_session.cpp index 656e046af..af6a547f5 100644 --- a/modules/commands/os_session.cpp +++ b/modules/commands/os_session.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" #include "modules/os_session.h" @@ -90,7 +88,7 @@ class MySessionService : public SessionService return this->Exceptions; } - void DelSession(Session *s) anope_override + void DelSession(Session *s) { this->Sessions.erase(s->addr); } @@ -125,28 +123,6 @@ class MySessionService : public SessionService } }; -class ExpireTimer : public Timer -{ - public: - ExpireTimer() : Timer(Config->GetBlock("options")->Get<time_t>("expiretimeout"), Anope::CurTime, true) { } - - void Tick(time_t) anope_override - { - if (!session_service || Anope::NoExpire) - return; - for (unsigned i = session_service->GetExceptions().size(); i > 0; --i) - { - Exception *e = session_service->GetExceptions()[i - 1]; - - if (!e->expires || e->expires > Anope::CurTime) - continue; - Log(OperServ, "expire/exception") << "Session exception for " << e->mask << "has expired."; - session_service->DelException(e); - delete e; - } - } -}; - class ExceptionDelCallback : public NumberList { protected: @@ -633,7 +609,6 @@ class OSSession : public Module { Serialize::Type exception_type; MySessionService ss; - ExpireTimer expiretimer; CommandOSSession commandossession; CommandOSException commandosexception; ServiceReference<XLineManager> akills; @@ -644,7 +619,7 @@ class OSSession : public Module { this->SetPermanent(true); - Implementation i[] = { I_OnReload, I_OnUserConnect, I_OnUserQuit }; + Implementation i[] = { I_OnReload, I_OnUserConnect, I_OnUserQuit, I_OnExpireTick }; ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation)); ModuleManager::SetPriority(this, PRIORITY_FIRST); } @@ -706,6 +681,7 @@ class OSSession : public Module if (kill && !exempt) { + BotInfo *OperServ = Config->GetClient("OperServ"); if (OperServ) { if (!sle_reason.empty()) @@ -760,6 +736,23 @@ class OSSession : public Module delete session; sessions.erase(sit); } + + void OnExpireTick() anope_override + { + if (!Anope::NoExpire) + return; + for (unsigned i = this->ss.GetExceptions().size(); i > 0; --i) + { + Exception *e = this->ss.GetExceptions()[i - 1]; + + if (!e->expires || e->expires > Anope::CurTime) + continue; + BotInfo *OperServ = Config->GetClient("OperServ"); + Log(OperServ, "expire/exception") << "Session exception for " << e->mask << "has expired."; + this->ss.DelException(e); + delete e; + } + } }; MODULE_INIT(OSSession) diff --git a/modules/commands/os_set.cpp b/modules/commands/os_set.cpp index 6fc05ab60..f30d3723e 100644 --- a/modules/commands/os_set.cpp +++ b/modules/commands/os_set.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandOSSet : public Command diff --git a/modules/commands/os_shutdown.cpp b/modules/commands/os_shutdown.cpp index 833c78491..f4fceada7 100644 --- a/modules/commands/os_shutdown.cpp +++ b/modules/commands/os_shutdown.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandOSQuit : public Command diff --git a/modules/commands/os_stats.cpp b/modules/commands/os_stats.cpp index 8b975a6c7..1ce27f501 100644 --- a/modules/commands/os_stats.cpp +++ b/modules/commands/os_stats.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" #include "modules/os_session.h" diff --git a/modules/commands/os_svs.cpp b/modules/commands/os_svs.cpp index 9fb1d63c3..4e9a31e6b 100644 --- a/modules/commands/os_svs.cpp +++ b/modules/commands/os_svs.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandOSSVSNick : public Command @@ -101,7 +99,7 @@ class CommandOSSVSJoin : public Command source.Reply(_("\002%s\002 is already in \002%s\002."), target->nick.c_str(), c->name.c_str()); else { - IRCD->SendSVSJoin(OperServ, target, params[1], ""); + IRCD->SendSVSJoin(source.service, target, params[1], ""); Log(LOG_ADMIN, source, this) << "to force " << target->nick << " to join " << params[1]; source.Reply(_("\002%s\002 has been joined to \002%s\002."), target->nick.c_str(), params[1].c_str()); } @@ -145,7 +143,7 @@ class CommandOSSVSPart : public Command source.Reply(_("\002%s\002 is not in \002%s\002."), target->nick.c_str(), c->name.c_str()); else { - IRCD->SendSVSPart(OperServ, target, params[1], ""); + IRCD->SendSVSPart(source.service, target, params[1], ""); Log(LOG_ADMIN, source, this) << "to force " << target->nick << " to part " << c->name; source.Reply(_("\002%s\002 has been parted from \002%s\002."), target->nick.c_str(), c->name.c_str()); } diff --git a/modules/commands/os_sxline.cpp b/modules/commands/os_sxline.cpp index dcf7863fe..d12237c93 100644 --- a/modules/commands/os_sxline.cpp +++ b/modules/commands/os_sxline.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class SXLineDelCallback : public NumberList diff --git a/modules/commands/os_update.cpp b/modules/commands/os_update.cpp index bce2feeed..3e411cbc8 100644 --- a/modules/commands/os_update.cpp +++ b/modules/commands/os_update.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class CommandOSUpdate : public Command diff --git a/modules/cs_statusupdate.cpp b/modules/cs_statusupdate.cpp index 130c0c3dc..bdb6c73d0 100644 --- a/modules/cs_statusupdate.cpp +++ b/modules/cs_statusupdate.cpp @@ -32,7 +32,7 @@ class StatusUpdate : public Module if (!access->HasPriv("AUTO" + cms->name)) ci->c->RemoveMode(NULL, cms, user->GetUID()); } - ci->c->SetCorrectModes(user, true, false); + ci->c->SetCorrectModes(user, true); } } } diff --git a/modules/database/db_flatfile.cpp b/modules/database/db_flatfile.cpp index 19f263e98..27b6ce1a2 100644 --- a/modules/database/db_flatfile.cpp +++ b/modules/database/db_flatfile.cpp @@ -8,8 +8,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class SaveData : public Serialize::Data @@ -240,7 +238,7 @@ class DBFlatFile : public Module, public Pipe } - EventReturn OnSaveDatabase() anope_override + void OnSaveDatabase() anope_override { BackupDatabase(); @@ -250,7 +248,7 @@ class DBFlatFile : public Module, public Pipe { i = fork(); if (i > 0) - return EVENT_CONTINUE; + return; else if (i < 0) Log(this) << "Unable to fork for database save"; } @@ -335,8 +333,6 @@ class DBFlatFile : public Module, public Pipe this->Notify(); exit(0); } - - return EVENT_CONTINUE; } /* Load just one type. Done if a module is reloaded during runtime */ diff --git a/modules/database/db_old.cpp b/modules/database/db_old.cpp index 64faafe10..b901d879a 100644 --- a/modules/database/db_old.cpp +++ b/modules/database/db_old.cpp @@ -8,8 +8,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" #include "modules/os_session.h" diff --git a/modules/database/db_plain.cpp b/modules/database/db_plain.cpp index fe95e06bb..a2c8d4274 100644 --- a/modules/database/db_plain.cpp +++ b/modules/database/db_plain.cpp @@ -8,8 +8,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" #include "modules/os_session.h" @@ -654,7 +652,7 @@ class DBPlain : public Module } - EventReturn OnSaveDatabase() anope_override + void OnSaveDatabase() anope_override { BackupDatabase(); @@ -868,15 +866,13 @@ class DBPlain : public Module if (!db.is_open()) { IRCD->SendGlobops(NULL, "Unable to open %s for writing!", DatabaseFile.c_str()); - return EVENT_CONTINUE; + return; } db << db_buffer.str(); db_buffer.str(""); db.close(); - - return EVENT_CONTINUE; } }; diff --git a/modules/encryption/enc_md5.cpp b/modules/encryption/enc_md5.cpp index 3bcdb599c..e19931800 100644 --- a/modules/encryption/enc_md5.cpp +++ b/modules/encryption/enc_md5.cpp @@ -14,8 +14,6 @@ #include "module.h" #include "encryption.h" -/*************************************************************************/ - /* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved. diff --git a/modules/extra/m_ldap_authentication.cpp b/modules/extra/m_ldap_authentication.cpp index 935ba76d5..617929380 100644 --- a/modules/extra/m_ldap_authentication.cpp +++ b/modules/extra/m_ldap_authentication.cpp @@ -104,6 +104,7 @@ class IdentifyInterface : public LDAPInterface { na = new NickAlias(ii->req->GetAccount(), new NickCore(ii->req->GetAccount())); FOREACH_MOD(I_OnNickRegister, OnNickRegister(ii->user, na)); + BotInfo *NickServ = Config->GetClient("NickServ"); if (ii->user && NickServ) ii->user->SendMessage(NickServ, _("Your account \002%s\002 has been successfully created."), na->nick.c_str()); } @@ -164,6 +165,7 @@ class OnIdentifyInterface : public LDAPInterface if (!email.equals_ci(u->Account()->email)) { u->Account()->email = email; + BotInfo *NickServ = Config->GetClient("NickServ"); if (NickServ) u->SendMessage(NickServ, _("Your email has been updated to \002%s\002"), email.c_str()); Log(this->owner) << "m_ldap_authentication: Updated email address for " << u->nick << " (" << u->Account()->display << ") to " << email; diff --git a/modules/extra/m_proxyscan.cpp b/modules/extra/m_proxyscan.cpp index 4e2a6bd88..fb5f96758 100644 --- a/modules/extra/m_proxyscan.cpp +++ b/modules/extra/m_proxyscan.cpp @@ -85,6 +85,7 @@ class ProxyConnect : public ConnectionSocket reason = reason.replace_all_cs("%i", this->conaddr.addr()); reason = reason.replace_all_cs("%p", stringify(this->conaddr.port())); + BotInfo *OperServ = Config->GetClient("OperServ"); Log(OperServ) << "PROXYSCAN: Open " << this->GetType() << " proxy found on " << this->conaddr.addr() << ":" << this->conaddr.port() << " (" << reason << ")"; XLine *x = new XLine("*@" + this->conaddr.addr(), OperServ ? OperServ->nick : "", Anope::CurTime + this->proxy.duration, reason, XLineManager::GenerateUID()); if (add_to_akill && akills) diff --git a/modules/extra/m_sql_authentication.cpp b/modules/extra/m_sql_authentication.cpp index ecc8700f6..648dc22c2 100644 --- a/modules/extra/m_sql_authentication.cpp +++ b/modules/extra/m_sql_authentication.cpp @@ -38,6 +38,7 @@ class SQLAuthenticationResult : public SQL::Interface catch (const SQL::Exception &) { } NickAlias *na = NickAlias::Find(req->GetAccount()); + BotInfo *NickServ = Config->GetClient("NickServ"); if (na == NULL) { na = new NickAlias(req->GetAccount(), new NickCore(req->GetAccount())); diff --git a/modules/extra/m_sql_oper.cpp b/modules/extra/m_sql_oper.cpp index 0289e9a22..6f9f05004 100644 --- a/modules/extra/m_sql_oper.cpp +++ b/modules/extra/m_sql_oper.cpp @@ -41,6 +41,7 @@ class SQLOperResult : public SQL::Interface } catch (const SQL::Exception &) { } + BotInfo *OperServ = Config->GetClient("OperServ"); if (opertype.empty()) { if (user->Account() && user->Account()->o && !user->Account()->o->config) diff --git a/modules/m_dnsbl.cpp b/modules/m_dnsbl.cpp index 08d4e365d..4a3b7dddc 100644 --- a/modules/m_dnsbl.cpp +++ b/modules/m_dnsbl.cpp @@ -65,6 +65,7 @@ class DNSBLResolver : public Request reason = reason.replace_all_cs("%r", record_reason); reason = reason.replace_all_cs("%N", Config->GetBlock("networkinfo")->Get<const Anope::string>("networkname")); + BotInfo *OperServ = Config->GetClient("OperServ"); Log(OperServ) << "DNSBL: " << user->GetMask() << " (" << user->ip << ") appears in " << this->blacklist.name; XLine *x = new XLine("*@" + user->ip, OperServ ? OperServ->nick : "m_dnsbl", Anope::CurTime + this->blacklist.bantime, reason, XLineManager::GenerateUID()); if (this->add_to_akill && akills) diff --git a/modules/m_helpchan.cpp b/modules/m_helpchan.cpp index eaf6eb777..a3003e59f 100644 --- a/modules/m_helpchan.cpp +++ b/modules/m_helpchan.cpp @@ -23,7 +23,7 @@ class HelpChannel : public Module User *u = User::Find(param); if (u && c->ci->AccessFor(u).HasPriv("OPME")) - u->SetMode(OperServ, "HELPOP"); + u->SetMode(Config->GetClient("OperServ"), "HELPOP"); } return EVENT_CONTINUE; diff --git a/modules/m_redis.cpp b/modules/m_redis.cpp index ce3093d50..03f6f8547 100644 --- a/modules/m_redis.cpp +++ b/modules/m_redis.cpp @@ -176,7 +176,7 @@ class MyRedisService : public Provider this->SendCommand(s, i, args); } - void Send(Interface *i, const std::vector<std::pair<const char *, size_t> > &args) anope_override + void Send(Interface *i, const std::vector<std::pair<const char *, size_t> > &args) { if (!sock) { @@ -202,6 +202,7 @@ class MyRedisService : public Provider this->SendCommand(i, args); } + public: bool BlockAndProcess() anope_override { this->sock->ProcessWrite(); diff --git a/modules/protocol/bahamut.cpp b/modules/protocol/bahamut.cpp index f485bd62c..ecea98329 100644 --- a/modules/protocol/bahamut.cpp +++ b/modules/protocol/bahamut.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class ChannelModeFlood : public ChannelModeParam @@ -211,7 +209,7 @@ class BahamutIRCdProto : public IRCDProto x = new XLine("*@" + u->host, old->by, old->expires, old->reason, old->id); old->manager->AddXLine(x); - Log(OperServ, "akill") << "AKILL: Added an akill for " << x->mask << " because " << u->GetMask() << "#" << u->realname << " matches " << old->mask; + Log(Config->GetClient("OperServ"), "akill") << "AKILL: Added an akill for " << x->mask << " because " << u->GetMask() << "#" << u->realname << " matches " << old->mask; } /* ZLine if we can instead */ @@ -292,12 +290,12 @@ class BahamutIRCdProto : public IRCDProto void SendLogin(User *u) anope_override { - IRCD->SendMode(NickServ, u, "+d %d", u->signon); + IRCD->SendMode(Config->GetClient("NickServ"), u, "+d %d", u->signon); } void SendLogout(User *u) anope_override { - IRCD->SendMode(NickServ, u, "+d 1"); + IRCD->SendMode(Config->GetClient("NickServ"), u, "+d 1"); } }; @@ -368,9 +366,7 @@ struct IRCDMessageMode : IRCDMessage */ struct IRCDMessageNick : IRCDMessage { - ServiceReference<NickServService> NSService; - - IRCDMessageNick(Module *creator) : IRCDMessage(creator, "NICK", 2), NSService("NickServService", "NickServ") { SetFlag(IRCDMESSAGE_SOFT_LIMIT); } + IRCDMessageNick(Module *creator) : IRCDMessage(creator, "NICK", 2) { SetFlag(IRCDMESSAGE_SOFT_LIMIT); } void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override { @@ -387,8 +383,8 @@ struct IRCDMessageNick : IRCDMessage try { NickAlias *na; - if (NSService && user->signon == convertTo<time_t>(params[7]) && (na = NickAlias::Find(user->nick))) - NSService->Login(user, na); + if (user->signon == convertTo<time_t>(params[7]) && (na = NickAlias::Find(user->nick))) + user->Login(na->nc); } catch (const ConvertException &) { } } diff --git a/modules/protocol/charybdis.cpp b/modules/protocol/charybdis.cpp index ec08aac65..368c79eac 100644 --- a/modules/protocol/charybdis.cpp +++ b/modules/protocol/charybdis.cpp @@ -196,6 +196,10 @@ struct IRCDMessageEncap : IRCDMessage void OnSuccess() anope_override { + BotInfo *NickServ = Config->GetClient("NickServ"); + if (!NickServ) + return; + /* SVSLOGIN * parameters: target, new nick, new username, new visible hostname, new login name * Sent after successful SASL authentication. @@ -212,6 +216,10 @@ struct IRCDMessageEncap : IRCDMessage void OnFail() anope_override { + BotInfo *NickServ = Config->GetClient("NickServ"); + if (!NickServ) + return; + UplinkSocket::Message(Me) << "ENCAP " << msource.GetName() << " SASL " << NickServ->GetUID() << " " << this->uid << " " << " D F"; Log(NickServ) << "A user failed to identify for account " << this->GetAccount() << " using SASL"; @@ -219,6 +227,10 @@ struct IRCDMessageEncap : IRCDMessage }; if (params[4] == "S") { + BotInfo *NickServ = Config->GetClient("NickServ"); + if (!NickServ) + return; + if (params[5] == "PLAIN") UplinkSocket::Message(Me) << "ENCAP " << source.GetName() << " SASL " << NickServ->GetUID() << " " << params[2] << " C +"; else @@ -280,6 +292,7 @@ struct IRCDMessageEUID : IRCDMessage { u->Login(na->nc); + BotInfo *NickServ = Config->GetClient("NickServ"); if (u->server->IsSynced() && NickServ) u->SendMessage(NickServ, _("You have been logged in as \2%s\2."), na->nc->display.c_str()); } diff --git a/modules/protocol/hybrid.cpp b/modules/protocol/hybrid.cpp index afef85726..4649f3cf6 100644 --- a/modules/protocol/hybrid.cpp +++ b/modules/protocol/hybrid.cpp @@ -46,22 +46,22 @@ class HybridProto : public IRCDProto void SendSQLine(User *, const XLine *x) anope_override { - UplinkSocket::Message(OperServ) << "RESV " << (x->expires ? x->expires - Anope::CurTime : 0) << " " << x->mask << " 0 :" << x->reason; + UplinkSocket::Message(Config->GetClient("OperServ")) << "RESV " << (x->expires ? x->expires - Anope::CurTime : 0) << " " << x->mask << " 0 :" << x->reason; } void SendSGLineDel(const XLine *x) anope_override { - UplinkSocket::Message(OperServ) << "UNXLINE * " << x->mask; + UplinkSocket::Message(Config->GetClient("OperServ")) << "UNXLINE * " << x->mask; } void SendSGLine(User *, const XLine *x) anope_override { - UplinkSocket::Message(OperServ) << "XLINE * " << x->mask << " 0 :" << x->GetReason(); + UplinkSocket::Message(Config->GetClient("OperServ")) << "XLINE * " << x->mask << " 0 :" << x->GetReason(); } void SendSZLineDel(const XLine *x) anope_override { - UplinkSocket::Message(OperServ) << "UNDLINE * " << x->GetHost(); + UplinkSocket::Message(Config->GetClient("OperServ")) << "UNDLINE * " << x->GetHost(); } void SendSZLine(User *, const XLine *x) anope_override @@ -72,7 +72,7 @@ class HybridProto : public IRCDProto if (timeleft > 172800 || !x->expires) timeleft = 172800; - UplinkSocket::Message(OperServ) << "DLINE * " << timeleft << " " << x->GetHost() << " :" << x->GetReason(); + UplinkSocket::Message(Config->GetClient("OperServ")) << "DLINE * " << timeleft << " " << x->GetHost() << " :" << x->GetReason(); } void SendAkillDel(const XLine *x) anope_override @@ -80,12 +80,12 @@ class HybridProto : public IRCDProto if (x->IsRegex() || x->HasNickOrReal()) return; - UplinkSocket::Message(OperServ) << "UNKLINE * " << x->GetUser() << " " << x->GetHost(); + UplinkSocket::Message(Config->GetClient("OperServ")) << "UNKLINE * " << x->GetUser() << " " << x->GetHost(); } void SendSQLineDel(const XLine *x) anope_override { - UplinkSocket::Message(OperServ) << "UNRESV * " << x->mask; + UplinkSocket::Message(Config->GetClient("OperServ")) << "UNRESV * " << x->mask; } void SendJoin(User *user, Channel *c, const ChannelStatus *status) anope_override @@ -137,7 +137,7 @@ class HybridProto : public IRCDProto old->manager->AddXLine(xline); x = xline; - Log(OperServ, "akill") << "AKILL: Added an akill for " << x->mask << " because " << u->GetMask() << "#" + Log(Config->GetClient("OperServ"), "akill") << "AKILL: Added an akill for " << x->mask << " because " << u->GetMask() << "#" << u->realname << " matches " << old->mask; } @@ -147,7 +147,7 @@ class HybridProto : public IRCDProto if (timeleft > 172800 || !x->expires) timeleft = 172800; - UplinkSocket::Message(OperServ) << "KLINE * " << timeleft << " " << x->GetUser() << " " << x->GetHost() << " :" << x->GetReason(); + UplinkSocket::Message(Config->GetClient("OperServ")) << "KLINE * " << timeleft << " " << x->GetUser() << " " << x->GetHost() << " :" << x->GetReason(); } void SendServer(const Server *server) anope_override @@ -208,12 +208,12 @@ class HybridProto : public IRCDProto void SendLogin(User *u) anope_override { - IRCD->SendMode(NickServ, u, "+d %s", u->Account()->display.c_str()); + IRCD->SendMode(Config->GetClient("NickServ"), u, "+d %s", u->Account()->display.c_str()); } void SendLogout(User *u) anope_override { - IRCD->SendMode(NickServ, u, "+d 0"); + IRCD->SendMode(Config->GetClient("NickServ"), u, "+d 0"); } void SendChannel(Channel *c) anope_override @@ -251,7 +251,7 @@ class HybridProto : public IRCDProto void SendSVSHold(const Anope::string &nick, time_t t) anope_override { - XLine x(nick, OperServ->nick, Anope::CurTime + t, "Being held for registered user"); + XLine x(nick, Me->GetName(), Anope::CurTime + t, "Being held for registered user"); this->SendSQLine(NULL, &x); } @@ -486,9 +486,7 @@ struct IRCDMessageTMode : IRCDMessage struct IRCDMessageUID : IRCDMessage { - ServiceReference<NickServService> NSService; - - IRCDMessageUID(Module *creator) : IRCDMessage(creator, "UID", 10), NSService("NickServService", "NickServ") { SetFlag(IRCDMESSAGE_REQUIRE_SERVER); } + IRCDMessageUID(Module *creator) : IRCDMessage(creator, "UID", 10) { SetFlag(IRCDMESSAGE_REQUIRE_SERVER); } /* 0 1 2 3 4 5 6 7 8 9 */ /* :0MC UID Steve 1 1350157102 +oi ~steve resolved.host 10.0.0.1 0MCAAAAAB 1350157108 :Mining all the time */ @@ -505,11 +503,11 @@ struct IRCDMessageUID : IRCDMessage params[9], params[2].is_pos_number_only() ? convertTo<time_t>(params[2]) : 0, params[3], params[7]); - if (NSService && params[8] != "0") + if (params[8] != "0") { NickAlias *na = NickAlias::Find(params[8]); if (na != NULL) - NSService->Login(user, na); + user->Login(na->nc); } } }; diff --git a/modules/protocol/inspircd11.cpp b/modules/protocol/inspircd11.cpp deleted file mode 100644 index f978417f6..000000000 --- a/modules/protocol/inspircd11.cpp +++ /dev/null @@ -1,892 +0,0 @@ -/* inspircd 1.1 beta 6+ functions - * - * (C) 2003-2013 Anope Team - * Contact us at team@anope.org - * - * Please read COPYING and README for further details. - * - * Based on the original code of Epona by Lara. - * Based on the original code of Services by Andy Church. - */ - -/*************************************************************************/ - -#include "module.h" - -static bool has_servicesmod = false; -static bool has_globopsmod = false; -static bool has_chghostmod = false; -static bool has_chgidentmod = false; -static bool has_hidechansmod = false; - -class InspIRCdProto : public IRCDProto -{ - public: - InspIRCdProto(Module *creator) : IRCDProto(creator, "InspIRCd 1.1") - { - DefaultPseudoclientModes = "+I"; - CanSVSNick = true; - CanSVSJoin = true; - CanSetVHost = true; - CanSetVIdent = true; - CanSNLine = true; - CanSQLine = true; - CanSZLine = true; - CanSVSHold = true; - CanSVSO = true; - MaxModes = 20; - } - private: - - Anope::string current_pass; - - void inspircd_cmd_chgident(const Anope::string &nick, const Anope::string &vIdent) - { - if (has_chgidentmod) - { - if (nick.empty() || vIdent.empty()) - return; - UplinkSocket::Message(OperServ) << "CHGIDENT " << nick << " " << vIdent; - } - else - Log() << "CHGIDENT not loaded!"; - } - - void inspircd_cmd_chghost(const Anope::string &nick, const Anope::string &vhost) - { - if (has_chghostmod) - { - if (nick.empty() || vhost.empty()) - return; - UplinkSocket::Message(OperServ) << "CHGHOST " << nick << " " << vhost; - } - else - Log() << "CHGHOST not loaded!"; - } - - void SendGlobalNotice(const BotInfo *bi, const Server *dest, const Anope::string &msg) anope_override - { - UplinkSocket::Message(bi) << "NOTICE $" << dest->GetName() << " :" << msg; - } - - void SendGlobalPrivmsg(const BotInfo *bi, const Server *dest, const Anope::string &msg) anope_override - { - UplinkSocket::Message(bi) << "PRIVMSG $" << dest->GetName() << " :" << msg; - } - - void SendAkillDel(const XLine *x) anope_override - { - if (x->IsRegex() || x->HasNickOrReal()) - return; - - /* ZLine if we can instead */ - if (x->GetUser() == "*") - { - sockaddrs a(x->GetHost()); - if (a.valid()) - { - IRCD->SendSZLineDel(x); - return; - } - } - - UplinkSocket::Message(OperServ) << "GLINE " << x->mask; - } - - void SendTopic(BotInfo *whosets, Channel *c) anope_override - { - UplinkSocket::Message(whosets) << "FTOPIC " << c->name << " " << c->topic_time << " " << c->topic_ts <<" :" << c->topic; - } - - void SendVhostDel(User *u) anope_override - { - if (u->HasMode("CLOAK")) - inspircd_cmd_chghost(u->nick, u->chost); - else - inspircd_cmd_chghost(u->nick, u->host); - - if (has_chgidentmod && u->GetIdent() != u->GetVIdent()) - inspircd_cmd_chgident(u->nick, u->GetIdent()); - } - - void SendAkill(User *u, XLine *x) anope_override - { - if (x->IsRegex() || x->HasNickOrReal()) - { - if (!u) - { - /* No user (this akill was just added), and contains nick and/or realname. Find users that match and ban them */ - for (user_map::const_iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it) - if (x->manager->Check(it->second, x)) - this->SendAkill(it->second, x); - return; - } - - const XLine *old = x; - - if (old->manager->HasEntry("*@" + u->host)) - return; - - /* We can't akill x as it has a nick and/or realname included, so create a new akill for *@host */ - x = new XLine("*@" + u->host, old->by, old->expires, old->reason, old->id); - old->manager->AddXLine(x); - - Log(OperServ, "akill") << "AKILL: Added an akill for " << x->mask << " because " << u->GetMask() << "#" << u->realname << " matches " << old->mask; - } - - /* ZLine if we can instead */ - if (x->GetUser() == "*") - { - sockaddrs a(x->GetHost()); - if (a.valid()) - { - IRCD->SendSZLine(u, x); - return; - } - } - - // Calculate the time left before this would expire, capping it at 2 days - time_t timeleft = x->expires - Anope::CurTime; - if (timeleft > 172800 || !x->expires) - timeleft = 172800; - UplinkSocket::Message(Me) << "ADDLINE G " << x->mask << " " << x->by << " " << Anope::CurTime << " " << timeleft << " :" << x->GetReason(); - } - - void SendSVSKillInternal(const BotInfo *source, User *user, const Anope::string &buf) anope_override - { - if (source) - { - UplinkSocket::Message(source) << "KILL " << user->nick << " :" << buf; - user->KillInternal(source->nick, buf); - } - else - { - UplinkSocket::Message(Me) << "KILL " << user->nick << " :" << buf; - user->KillInternal(Me->GetName(), buf); - } - } - - void SendNumericInternal(int numeric, const Anope::string &dest, const Anope::string &buf) anope_override - { - UplinkSocket::Message() << "PUSH " << dest << " ::" << Me->GetName() << " " << numeric << " " << dest << " " << buf; - } - - void SendModeInternal(const BotInfo *source, const Channel *dest, const Anope::string &buf) anope_override - { - if (source) - UplinkSocket::Message(source) << "FMODE " << dest->name << " " << dest->creation_time << " " << buf; - else - UplinkSocket::Message(Me) << "FMODE " << dest->name << " " << dest->creation_time << " " << buf; - } - - void SendClientIntroduction(const User *u) anope_override - { - Anope::string modes = "+" + u->GetModes(); - UplinkSocket::Message(Me) << "NICK " << u->timestamp << " " << u->nick << " " << u->host << " " << u->host << " " << u->GetIdent() << " " << modes << " 0.0.0.0 :" << u->realname; - UplinkSocket::Message(u) << "OPERTYPE Service"; - } - - /* SERVER services-dev.chatspike.net password 0 :Description here */ - void SendServer(const Server *server) anope_override - { - UplinkSocket::Message(Me) << "SERVER " << server->GetName() << " " << current_pass << " " << server->GetHops() << " :" << server->GetDescription(); - } - - /* JOIN */ - void SendJoin(User *user, Channel *c, const ChannelStatus *status) anope_override - { - UplinkSocket::Message(user) << "JOIN " << c->name << " " << c->creation_time; - if (status) - { - /* First save the channel status incase uc->Status == status */ - ChannelStatus cs = *status; - /* If the user is internally on the channel with flags, kill them so that - * the stacker will allow this. - */ - ChanUserContainer *uc = c->FindUser(user); - if (uc != NULL) - uc->status.Clear(); - - BotInfo *setter = BotInfo::Find(user->nick); - for (size_t i = 0; i < cs.Modes().length(); ++i) - c->SetMode(setter, ModeManager::FindChannelModeByChar(cs.Modes()[i]), user->GetUID(), false); - } - } - - /* UNSQLINE */ - void SendSQLineDel(const XLine *x) anope_override - { - UplinkSocket::Message(OperServ) << "QLINE " << x->mask; - } - - /* SQLINE */ - void SendSQLine(User *, const XLine *x) anope_override - { - // Calculate the time left before this would expire, capping it at 2 days - time_t timeleft = x->expires - Anope::CurTime; - if (timeleft > 172800 || !x->expires) - timeleft = 172800; - UplinkSocket::Message(Me) << "ADDLINE Q " << x->mask << " " << x->by << " " << Anope::CurTime << " " << timeleft << " :" << x->GetReason(); - } - - /* Functions that use serval cmd functions */ - - void SendVhost(User *u, const Anope::string &vIdent, const Anope::string &vhost) anope_override - { - if (!vIdent.empty()) - inspircd_cmd_chgident(u->nick, vIdent); - if (!vhost.empty()) - inspircd_cmd_chghost(u->nick, vhost); - } - - void SendConnect() anope_override - { - current_pass = Config->Uplinks[Anope::CurrentUplink].password; - SendServer(Me); - UplinkSocket::Message() << "BURST"; - Module *enc = ModuleManager::FindFirstOf(ENCRYPTION); - UplinkSocket::Message(Me) << "VERSION :Anope-" << Anope::Version() << " " << Me->GetName() << " :" << this->GetProtocolName() << " - (" << (enc ? enc->name : "none") << ") -- " << Anope::VersionBuildString(); - } - - /* SVSHOLD - set */ - void SendSVSHold(const Anope::string &nick, time_t t) anope_override - { - UplinkSocket::Message(OperServ) << "SVSHOLD " << nick << " " << t << "s :Being held for registered user"; - } - - /* SVSHOLD - release */ - void SendSVSHoldDel(const Anope::string &nick) anope_override - { - UplinkSocket::Message(OperServ) << "SVSHOLD " << nick; - } - - /* UNSZLINE */ - void SendSZLineDel(const XLine *x) anope_override - { - UplinkSocket::Message(OperServ) << "ZLINE " << x->GetHost(); - } - - /* SZLINE */ - void SendSZLine(User *, const XLine *x) anope_override - { - // Calculate the time left before this would expire, capping it at 2 days - time_t timeleft = x->expires - Anope::CurTime; - if (timeleft > 172800 || !x->expires) - timeleft = 172800; - UplinkSocket::Message(Me) << "ADDLINE Z " << x->GetHost() << " " << x->by << " " << Anope::CurTime << " " << timeleft << " :" << x->GetReason(); - } - - void SendSVSJoin(const BotInfo *source, const User *u, const Anope::string &chan, const Anope::string &) anope_override - { - UplinkSocket::Message(source) << "SVSJOIN " << u->GetUID() << " " << chan; - } - - void SendSVSPart(const BotInfo *source, const User *u, const Anope::string &chan, const Anope::string ¶m) anope_override - { - if (!param.empty()) - UplinkSocket::Message(source) << "SVSPART " << u->GetUID() << " " << chan << " :" << param; - else - UplinkSocket::Message(source) << "SVSPART " << u->GetUID() << " " << chan; - } - - void SendBOB() anope_override - { - UplinkSocket::Message() << "BURST " << Anope::CurTime; - } - - void SendEOB() anope_override - { - UplinkSocket::Message() << "ENDBURST"; - } - - void SendLogin(User *u) anope_override - { - if (!u->Account()) - return; - - Anope::string svidbuf = stringify(u->timestamp); - u->Account()->Extend("authenticationtoken", new ExtensibleItemClass<Anope::string>(svidbuf)); - } - - void SendLogout(User *u) anope_override - { - } -}; - -class ChannelModeFlood : public ChannelModeParam -{ - public: - ChannelModeFlood(char modeChar, bool minusNoArg) : ChannelModeParam("FLOOD", modeChar, minusNoArg) { } - - bool IsValid(const Anope::string &value) const anope_override - { - try - { - Anope::string rest; - if (!value.empty() && value[0] != ':' && convertTo<int>(value[0] == '*' ? value.substr(1) : value, rest, false) > 0 && rest[0] == ':' && rest.length() > 1 && convertTo<int>(rest.substr(1), rest, false) > 0 && rest.empty()) - return true; - } - catch (const ConvertException &) { } - - return false; - } -}; - -struct IRCDMessageCapab : Message::Capab -{ - IRCDMessageCapab(Module *creator) : Message::Capab(creator, "CAPAB") { SetFlag(IRCDMESSAGE_SOFT_LIMIT); } - - void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override - { - if (params[0].equals_cs("START")) - { - /* reset CAPAB */ - has_servicesmod = false; - has_globopsmod = false; - has_chghostmod = false; - has_chgidentmod = false; - has_hidechansmod = false; - IRCD->CanSVSHold = false; - } - else if (params[0].equals_cs("MODULES") && params.size() > 1) - { - if (params[1].find("m_globops.so") != Anope::string::npos) - has_globopsmod = true; - if (params[1].find("m_services.so") != Anope::string::npos) - has_servicesmod = true; - if (params[1].find("m_svshold.so") != Anope::string::npos) - IRCD->CanSVSHold = true; - if (params[1].find("m_chghost.so") != Anope::string::npos) - has_chghostmod = true; - if (params[1].find("m_chgident.so") != Anope::string::npos) - has_chgidentmod = true; - if (params[1].find("m_hidechans.so") != Anope::string::npos) - has_hidechansmod = true; - } - else if (params[0].equals_cs("CAPABILITIES") && params.size() > 1) - { - spacesepstream ssep(params[1]); - Anope::string capab; - while (ssep.GetToken(capab)) - { - if (capab.find("CHANMODES") != Anope::string::npos) - { - Anope::string modes(capab.begin() + 10, capab.end()); - commasepstream sep(modes); - Anope::string modebuf; - - sep.GetToken(modebuf); - for (size_t t = 0, end = modebuf.length(); t < end; ++t) - { - switch (modebuf[t]) - { - case 'b': - ModeManager::AddChannelMode(new ChannelModeList("BAN", 'b')); - continue; - case 'e': - ModeManager::AddChannelMode(new ChannelModeList("EXCEPT", 'e')); - continue; - case 'I': - ModeManager::AddChannelMode(new ChannelModeList("INVITEOVERRIDE", 'I')); - continue; - default: - ModeManager::AddChannelMode(new ChannelModeList("", modebuf[t])); - } - } - - sep.GetToken(modebuf); - for (size_t t = 0, end = modebuf.length(); t < end; ++t) - { - switch (modebuf[t]) - { - case 'k': - ModeManager::AddChannelMode(new ChannelModeKey('k')); - continue; - default: - ModeManager::AddChannelMode(new ChannelModeParam("", modebuf[t])); - } - } - - sep.GetToken(modebuf); - for (size_t t = 0, end = modebuf.length(); t < end; ++t) - { - switch (modebuf[t]) - { - case 'f': - ModeManager::AddChannelMode(new ChannelModeFlood('f', false)); - continue; - case 'l': - ModeManager::AddChannelMode(new ChannelModeParam("LIMIT", 'l', true)); - continue; - case 'L': - ModeManager::AddChannelMode(new ChannelModeParam("REDIRECT", 'L', true)); - continue; - default: - ModeManager::AddChannelMode(new ChannelModeParam("", modebuf[t], true)); - } - } - - sep.GetToken(modebuf); - for (size_t t = 0, end = modebuf.length(); t < end; ++t) - { - switch (modebuf[t]) - { - case 'i': - ModeManager::AddChannelMode(new ChannelMode("INVITE", 'i')); - continue; - case 'm': - ModeManager::AddChannelMode(new ChannelMode("MODERATED", 'm')); - continue; - case 'n': - ModeManager::AddChannelMode(new ChannelMode("NOEXTERNAL", 'n')); - continue; - case 'p': - ModeManager::AddChannelMode(new ChannelMode("PRIVATE", 'p')); - continue; - case 's': - ModeManager::AddChannelMode(new ChannelMode("SECRET", 's')); - continue; - case 't': - ModeManager::AddChannelMode(new ChannelMode("TOPIC", 't')); - continue; - case 'r': - ModeManager::AddChannelMode(new ChannelModeRegistered('r')); - continue; - case 'c': - ModeManager::AddChannelMode(new ChannelMode("BLOCKCOLOR", 'c')); - continue; - case 'u': - ModeManager::AddChannelMode(new ChannelMode("AUDITORIUM", 'u')); - continue; - case 'z': - ModeManager::AddChannelMode(new ChannelMode("SSL", 'z')); - continue; - case 'A': - ModeManager::AddChannelMode(new ChannelMode("ALLINVITE", 'A')); - continue; - case 'C': - ModeManager::AddChannelMode(new ChannelMode("NOCTCP", 'C')); - continue; - case 'G': - ModeManager::AddChannelMode(new ChannelMode("FILTER", 'G')); - continue; - case 'K': - ModeManager::AddChannelMode(new ChannelMode("NOKNOCK", 'K')); - continue; - case 'N': - ModeManager::AddChannelMode(new ChannelMode("NONICK", 'N')); - continue; - case 'O': - ModeManager::AddChannelMode(new ChannelModeOper('O')); - continue; - case 'Q': - ModeManager::AddChannelMode(new ChannelMode("NOKICK", 'Q')); - continue; - case 'R': - ModeManager::AddChannelMode(new ChannelMode("REGISTEREDONLY", 'R')); - continue; - case 'S': - ModeManager::AddChannelMode(new ChannelMode("STRIPCOLOR", 'S')); - continue; - case 'V': - ModeManager::AddChannelMode(new ChannelMode("NOINVITE", 'V')); - continue; - default: - ModeManager::AddChannelMode(new ChannelMode("", modebuf[t])); - } - } - } - else if (capab.find("PREFIX=(") != Anope::string::npos) - { - Anope::string modes(capab.begin() + 8, capab.begin() + capab.find(')')); - Anope::string chars(capab.begin() + capab.find(')') + 1, capab.end()); - unsigned short level = modes.length() - 1; - - for (size_t t = 0, end = modes.length(); t < end; ++t) - { - switch (modes[t]) - { - case 'q': - ModeManager::AddChannelMode(new ChannelModeStatus("OWNER", 'q', '~', level--)); - continue; - case 'a': - ModeManager::AddChannelMode(new ChannelModeStatus("PROTECT", 'a', '&', level--)); - continue; - case 'o': - ModeManager::AddChannelMode(new ChannelModeStatus("OP", 'o', '@', level--)); - continue; - case 'h': - ModeManager::AddChannelMode(new ChannelModeStatus("HALFOP", 'h', '%', level--)); - continue; - case 'v': - ModeManager::AddChannelMode(new ChannelModeStatus("VOICE", 'v', '+', level--)); - continue; - default: - ModeManager::AddChannelMode(new ChannelModeStatus("", modes[t], chars[t], level--)); - } - } - - ModeManager::RebuildStatusModes(); - } - else if (capab.find("MAXMODES=") != Anope::string::npos) - { - Anope::string maxmodes(capab.begin() + 9, capab.end()); - IRCD->MaxModes = maxmodes.is_pos_number_only() ? convertTo<unsigned>(maxmodes) : 3; - } - } - } - else if (params[0].equals_cs("END")) - { - if (!has_globopsmod) - { - UplinkSocket::Message() << "ERROR :m_globops is not loaded. This is required by Anope"; - Anope::QuitReason = "ERROR: Remote server does not have the m_globops module loaded, and this is required."; - Anope::Quitting = true; - return; - } - if (!has_servicesmod) - { - UplinkSocket::Message() << "ERROR :m_services is not loaded. This is required by Anope"; - Anope::QuitReason = "ERROR: Remote server does not have the m_services module loaded, and this is required."; - Anope::Quitting = true; - return; - } - if (!has_hidechansmod) - { - UplinkSocket::Message() << "ERROR :m_hidechans.so is not loaded. This is required by Anope"; - Anope::QuitReason = "ERROR: Remote server deos not have the m_hidechans module loaded, and this is required."; - Anope::Quitting = true; - return; - } - if (!IRCD->CanSVSHold) - Log() << "SVSHOLD missing, Usage disabled until module is loaded."; - if (!has_chghostmod) - Log() << "CHGHOST missing, Usage disabled until module is loaded."; - if (!has_chgidentmod) - Log() << "CHGIDENT missing, Usage disabled until module is loaded."; - } - - Message::Capab::Run(source, params); - } -}; - -struct IRCDMessageChgIdent : IRCDMessage -{ - IRCDMessageChgIdent(Module *creator, const Anope::string &n) : IRCDMessage(creator, n, 2) { } - - void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override - { - User *u = User::Find(params[0]); - if (!u) - { - Log(LOG_DEBUG) << "CHGIDENT for nonexistent user " << params[0]; - return; - } - - u->SetIdent(params[1]); - } -}; - -struct IRCDMessageChgName : IRCDMessage -{ - IRCDMessageChgName(Module *creator, const Anope::string &n) : IRCDMessage(creator, n, 1) { SetFlag(IRCDMESSAGE_REQUIRE_USER); } - - void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override - { - source.GetUser()->SetRealname(params[0]); - } -}; - -struct IRCDMessageEndBurst : IRCDMessage -{ - IRCDMessageEndBurst(Module *creator) : IRCDMessage(creator, "ENDBURST", 0) { } - - void Run(MessageSource &, const std::vector<Anope::string> ¶ms) anope_override - { - Me->GetLinks().front()->Sync(true); - } -}; - -struct IRCDMessageFHost : IRCDMessage -{ - IRCDMessageFHost(Module *creator, const Anope::string &n) : IRCDMessage(creator, n, 1) { SetFlag(IRCDMESSAGE_REQUIRE_USER); } - - void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override - { - source.GetUser()->SetDisplayedHost(params[0]); - } -}; - -struct IRCDMessageFJoin : IRCDMessage -{ - IRCDMessageFJoin(Module *creator) : IRCDMessage(creator, "FJOIN", 2) { SetFlag(IRCDMESSAGE_SOFT_LIMIT); } - - void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override - { - std::list<Message::Join::SJoinUser> users; - - spacesepstream sep(params[params.size() - 1]); - Anope::string buf; - - while (sep.GetToken(buf)) - { - Message::Join::SJoinUser sju; - - /* Loop through prefixes */ - for (char ch; (ch = ModeManager::GetStatusChar(buf[0]));) - { - ChannelMode *cm = ModeManager::FindChannelModeByChar(ch); - buf.erase(buf.begin()); - - if (!cm) - { - Log() << "Received unknown mode prefix " << ch << " in FJOIN string"; - continue; - } - - sju.first.AddMode(cm->mchar); - } - /* Erase the , */ - buf.erase(buf.begin()); - - sju.second = User::Find(buf); - if (!sju.second) - { - Log(LOG_DEBUG) << "FJOIN for nonexistant user " << buf << " on " << params[0]; - continue; - } - - } - - time_t ts = Anope::string(params[1]).is_pos_number_only() ? convertTo<time_t>(params[1]) : Anope::CurTime; - Message::Join::SJoin(source, params[0], ts, "", users); - } -}; - -struct IRCDMessageFMode : IRCDMessage -{ - IRCDMessageFMode(Module *creator) : IRCDMessage(creator, "FMODE", 3) { SetFlag(IRCDMESSAGE_SOFT_LIMIT); } - - void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override - { - /* :source FMODE #test 12345678 +nto foo */ - - Channel *c = Channel::Find(params[0]); - if (!c) - return; - time_t ts = Anope::string(params[1]).is_pos_number_only() ? convertTo<time_t>(params[1]) : 0; - - /* TS's are equal now, so we can proceed with parsing */ - // For fun, modes sometimes get sent without a mode prefix - Anope::string modes = "+" + params[2]; - for (unsigned n = 3; n < params.size(); ++n) - modes += " " + params[n]; - - c->SetModesInternal(source, modes, ts); - } -}; - -struct IRCDMessageFTopic : IRCDMessage -{ - IRCDMessageFTopic(Module *creator) : IRCDMessage(creator, "FTOPIC", 4) { } - - void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override - { - Channel *c = Channel::Find(params[0]); - if (c) - c->ChangeTopicInternal(params[2], params[3], Anope::string(params[1]).is_pos_number_only() ? convertTo<time_t>(params[1]) : Anope::CurTime); - } -}; - -struct IRCDMessageIdle : IRCDMessage -{ - IRCDMessageIdle(Module *creator) : IRCDMessage(creator, "IDLE", 1) { SetFlag(IRCDMESSAGE_REQUIRE_USER); } - - void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override - { - const BotInfo *bi = BotInfo::Find(params[0]); - UplinkSocket::Message(bi) << "IDLE " << source.GetSource() << " " << Anope::StartTime << " " << (bi ? Anope::CurTime - bi->lastmsg : 0); - } -}; - -struct IRCDMessageMode : IRCDMessage -{ - IRCDMessageMode(Module *creator) : IRCDMessage(creator, "MODE", 2) { SetFlag(IRCDMESSAGE_SOFT_LIMIT); } - - void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override - { - if (IRCD->IsChannelValid(params[0])) - { - Channel *c = Channel::Find(params[0]); - time_t ts; - - try - { - ts = convertTo<time_t>(params[2]); - } - catch (const ConvertException &) - { - ts = 0; - } - - if (c) - c->SetModesInternal(source, params[1], ts); - } - else - { - User *u = User::Find(params[0]); - if (u) - u->SetModesInternal("%s", params[1].c_str()); - } - } -}; - -struct IRCDMessageNick : IRCDMessage -{ - ServiceReference<NickServService> NSService; - - IRCDMessageNick(Module *creator) : IRCDMessage(creator, "NICK", 1), NSService("NickServService", "NickServ") { SetFlag(IRCDMESSAGE_SOFT_LIMIT); } - - void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override - { - if (params.size() == 8 && source.GetServer()) - { - time_t ts = Anope::string(params[0]).is_pos_number_only() ? convertTo<time_t>(params[0]) : Anope::CurTime; - - User *user = new User(params[1], params[4], params[2], params[3], params[6], source.GetServer(), params[7], ts, params[5]); - if (NSService) - { - NickAlias *na = NickAlias::Find(user->nick); - Anope::string *svidbuf = na ? na->nc->GetExt<ExtensibleItemClass<Anope::string> *>("authenticationtoken") : NULL; - if (na && svidbuf && *svidbuf == params[0]) - NSService->Login(user, na); - } - } - else if (params.size() == 1 && source.GetUser()) - source.GetUser()->ChangeNick(params[0]); - } -}; - -struct IRCDMessageOperType : IRCDMessage -{ - IRCDMessageOperType(Module *creator) : IRCDMessage(creator, "OPERTYPE", 0) { SetFlag(IRCDMESSAGE_SOFT_LIMIT); SetFlag(IRCDMESSAGE_REQUIRE_USER); } - - void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override - { - /* opertype is equivalent to mode +o because servers - dont do this directly */ - User *u = source.GetUser(); - if (!u->HasMode("OPER")) - u->SetModesInternal("+o"); - } -}; - -struct IRCDMessageRSQuit : IRCDMessage -{ - IRCDMessageRSQuit(Module *creator) : IRCDMessage(creator, "RSQUIT", 0) { SetFlag(IRCDMESSAGE_SOFT_LIMIT); SetFlag(IRCDMESSAGE_REQUIRE_SERVER); } - - void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override - { - if (params.empty() || params.size() > 3) - return; - - Server *s; - /* Horrible workaround to an insp bug (#) in how RSQUITs are sent - mark */ - if (params.size() > 1 && params[0] == Me->GetName()) - s = Server::Find(params[1]); - else - s = Server::Find(params[0]); - - source.GetServer()->Delete(source.GetServer()->GetName() + " " + (s ? s->GetName() : "<unknown>")); - } -}; - -struct IRCDMessageServer : IRCDMessage -{ - IRCDMessageServer(Module *creator) : IRCDMessage(creator, "SERVER", 4) { SetFlag(IRCDMESSAGE_REQUIRE_SERVER); } - - void Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override - { - unsigned int hops = Anope::string(params[1]).is_pos_number_only() ? convertTo<unsigned>(params[1]) : 0; - new Server(source.GetServer() == NULL ? Me : source.GetServer(), params[0], hops, params[2]); - } -}; - -class ProtoInspIRCd : public Module -{ - InspIRCdProto ircd_proto; - - /* Core message handlers */ - Message::Away message_away; - Message::Error message_error; - Message::Invite message_invite; - Message::Join message_join; - Message::Kick message_kick; - Message::Kill message_kill; - Message::MOTD message_motd; - Message::Part message_part; - Message::Ping message_ping; - Message::Privmsg message_privmsg; - Message::Quit message_quit; - Message::SQuit message_squit; - Message::Stats message_stats; - Message::Time message_time; - Message::Topic message_topic; - Message::Version message_version; - - /* Our message handlers */ - IRCDMessageCapab message_capab; - IRCDMessageChgIdent message_chgident, message_setident; - IRCDMessageChgName message_chgname, message_setname; - IRCDMessageEndBurst message_endburst; - IRCDMessageFHost message_fhost, message_sethost; - IRCDMessageFJoin message_fjoin; - IRCDMessageFMode message_fmode; - IRCDMessageFTopic message_ftopic; - IRCDMessageIdle message_idle; - IRCDMessageMode message_mode; - IRCDMessageNick message_nick; - IRCDMessageOperType message_opertype; - IRCDMessageRSQuit message_rsquit; - IRCDMessageServer message_server; - - void AddModes() - { - ModeManager::AddUserMode(new UserMode("CALLERID", 'g')); - ModeManager::AddUserMode(new UserMode("HELPOP", 'h')); - ModeManager::AddUserMode(new UserMode("INVIS", 'i')); - ModeManager::AddUserMode(new UserMode("OPER", 'o')); - ModeManager::AddUserMode(new UserMode("REGISTERED", 'r')); - ModeManager::AddUserMode(new UserMode("WALLOPS", 'w')); - ModeManager::AddUserMode(new UserMode("CLOAK", 'x')); - } - - public: - ProtoInspIRCd(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR), - ircd_proto(this), - message_away(this), message_error(this), message_invite(this), message_join(this), message_kick(this), - message_kill(this), message_motd(this), message_part(this), message_ping(this), message_privmsg(this), - message_quit(this), message_squit(this), message_stats(this), message_time(this), message_topic(this), - message_version(this), - - message_capab(this), message_chgident(this, "CHGIDENT"), message_setident(this, "SETIDENT"), - message_chgname(this, "CHGNAME"), message_setname(this, "SETNAME"), message_endburst(this), - message_fhost(this, "FHOST"), message_sethost(this, "SETHOST"), message_fjoin(this), - message_fmode(this), message_ftopic(this), message_idle(this), message_mode(this), - message_nick(this), message_opertype(this), message_rsquit(this), message_server(this) - { - - Servers::Capab.insert("NOQUIT"); - - this->AddModes(); - - ModuleManager::Attach(I_OnUserNickChange, this); - } - - void OnUserNickChange(User *u, const Anope::string &) anope_override - { - u->RemoveModeInternal(ModeManager::FindUserModeByName("REGISTERED")); - } -}; - -MODULE_INIT(ProtoInspIRCd) diff --git a/modules/protocol/inspircd12.cpp b/modules/protocol/inspircd12.cpp index d46d8733e..f4a29bc50 100644 --- a/modules/protocol/inspircd12.cpp +++ b/modules/protocol/inspircd12.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class ChannelModeFlood : public ChannelModeParam @@ -46,7 +44,7 @@ class InspIRCd12Proto : public IRCDProto if (!Servers::Capab.count("CHGIDENT")) Log() << "CHGIDENT not loaded!"; else - UplinkSocket::Message(HostServ) << "CHGIDENT " << nick << " " << vIdent; + UplinkSocket::Message(Me) << "CHGIDENT " << nick << " " << vIdent; } void SendChgHostInternal(const Anope::string &nick, const Anope::string &vhost) @@ -176,7 +174,7 @@ class InspIRCd12Proto : public IRCDProto x = new XLine("*@" + u->host, old->by, old->expires, old->reason, old->id); old->manager->AddXLine(x); - Log(OperServ, "akill") << "AKILL: Added an akill for " << x->mask << " because " << u->GetMask() << "#" << u->realname << " matches " << old->mask; + Log(Config->GetClient("OperServ"), "akill") << "AKILL: Added an akill for " << x->mask << " because " << u->GetMask() << "#" << u->realname << " matches " << old->mask; } /* ZLine if we can instead */ @@ -277,13 +275,13 @@ class InspIRCd12Proto : public IRCDProto /* SVSHOLD - set */ void SendSVSHold(const Anope::string &nick, time_t t) anope_override { - UplinkSocket::Message(NickServ) << "SVSHOLD " << nick << " " << t << " :Being held for registered user"; + UplinkSocket::Message(Config->GetClient("NickServ")) << "SVSHOLD " << nick << " " << t << " :Being held for registered user"; } /* SVSHOLD - release */ void SendSVSHoldDel(const Anope::string &nick) anope_override { - UplinkSocket::Message(NickServ) << "SVSHOLD " << nick; + UplinkSocket::Message(Config->GetClient("NickServ")) << "SVSHOLD " << nick; } /* UNSZLINE */ @@ -929,9 +927,7 @@ struct IRCDMessageMetadata : IRCDMessage { u->Login(nc); - const NickAlias *user_na = NickAlias::Find(u->nick); - if (!Config->GetBlock("options")->Get<bool>("nonicknameownership") && user_na && user_na->nc == nc && user_na->nc->HasExt("UNCONFIRMED") == false) - u->SetMode(NickServ, "REGISTERED"); + BotInfo *NickServ = Config->GetClient("nickserv"); /* Sometimes a user connects, we send them the usual "this nickname is registered" mess (if * their server isn't syncing) and then we receive this.. so tell them about it. @@ -1234,7 +1230,7 @@ class ProtoInspIRCd : public Module /* 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, "REGISTERED"); + u->RemoveMode(Config->GetClient("NickServ"), "REGISTERED"); } }; diff --git a/modules/protocol/inspircd20.cpp b/modules/protocol/inspircd20.cpp index 993c43b7a..2d7b4ef29 100644 --- a/modules/protocol/inspircd20.cpp +++ b/modules/protocol/inspircd20.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" static bool sasl = true; @@ -663,7 +661,7 @@ struct IRCDMessageEncap : IRCDMessage { UplinkSocket::Message(Me) << "ENCAP " << this->uid.substr(0, 3) << " SASL " << Me->GetSID() << " " << this->uid << " " << " D F"; - Log(NickServ) << "A user failed to identify for account " << this->GetAccount() << " using SASL"; + Log(Config->GetClient("NickServ")) << "A user failed to identify for account " << this->GetAccount() << " using SASL"; } }; diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp index 3d1a727e7..139c7e5c4 100644 --- a/modules/protocol/ngircd.cpp +++ b/modules/protocol/ngircd.cpp @@ -150,7 +150,7 @@ class ngIRCdProto : public IRCDProto UplinkSocket::Message(Me) << "METADATA " << u->nick << " cloakhost :" << vhost; if (!u->HasMode("CLOAK")) { - u->SetMode(HostServ, "CLOAK"); + u->SetMode(Config->GetClient("HostServ"), "CLOAK"); ModeManager::ProcessModes(); } } diff --git a/modules/protocol/plexus.cpp b/modules/protocol/plexus.cpp index 484f6a4bc..9f7e094a2 100644 --- a/modules/protocol/plexus.cpp +++ b/modules/protocol/plexus.cpp @@ -83,7 +83,7 @@ class PlexusProto : public IRCDProto void SendVhostDel(User *u) anope_override { if (u->HasMode("CLOAK")) - u->RemoveMode(HostServ, "CLOAK"); + u->RemoveMode(Config->GetClient("HostServ"), "CLOAK"); else this->SendVhost(u, u->GetIdent(), u->chost); } @@ -186,8 +186,6 @@ struct IRCDMessageEncap : IRCDMessage if (u && nc) { u->Login(nc); - if (!Config->GetBlock("options")->Get<bool>("nonicknameownership") && user_na && user_na->nc == nc && user_na->nc->HasExt("UNCONFIRMED") == false) - u->SetMode(NickServ, "REGISTERED"); } } @@ -239,9 +237,7 @@ struct IRCDMessageServer : IRCDMessage struct IRCDMessageUID : IRCDMessage { - ServiceReference<NickServService> NSService; - - IRCDMessageUID(Module *creator) : IRCDMessage(creator, "UID", 11), NSService("NickServService", "NickServ") { SetFlag(IRCDMESSAGE_REQUIRE_SERVER); } + IRCDMessageUID(Module *creator) : IRCDMessage(creator, "UID", 11) { SetFlag(IRCDMESSAGE_REQUIRE_SERVER); } /* params[0] = nick @@ -277,11 +273,11 @@ struct IRCDMessageUID : IRCDMessage User *user = new User(params[0], params[4], params[9], params[5], ip, source.GetServer(), params[10], ts, params[3], params[7]); try { - if (NSService && params[8].is_pos_number_only() && convertTo<time_t>(params[8]) == user->timestamp) + if (params[8].is_pos_number_only() && convertTo<time_t>(params[8]) == user->timestamp) { NickAlias *na = NickAlias::Find(user->nick); if (na) - NSService->Login(user, na); + user->Login(na->nc); } } catch (const ConvertException &) { } diff --git a/modules/protocol/ratbox.cpp b/modules/protocol/ratbox.cpp index 2b971b23f..fe4caabdf 100644 --- a/modules/protocol/ratbox.cpp +++ b/modules/protocol/ratbox.cpp @@ -105,10 +105,6 @@ struct IRCDMessageEncap : IRCDMessage if (!nc) return; u->Login(nc); - - const NickAlias *user_na = NickAlias::Find(u->nick); - if (!Config->GetBlock("options")->Get<bool>("nonicknameownership") && user_na && user_na->nc == nc && user_na->nc->HasExt("UNCONFIRMED") == false) - u->SetMode(NickServ, "REGISTERED"); } } }; diff --git a/modules/protocol/unreal.cpp b/modules/protocol/unreal.cpp index 6ca10af14..6cf07342e 100644 --- a/modules/protocol/unreal.cpp +++ b/modules/protocol/unreal.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" static bool sasl = true; @@ -76,6 +74,7 @@ class UnrealIRCdProto : public IRCDProto void SendVhostDel(User *u) anope_override { + BotInfo *HostServ = Config->GetClient("HostServ"); u->RemoveMode(HostServ, "CLOAK"); u->RemoveMode(HostServ, "VHOST"); ModeManager::ProcessModes(); @@ -105,7 +104,7 @@ class UnrealIRCdProto : public IRCDProto old->manager->AddXLine(xline); x = xline; - Log(OperServ, "akill") << "AKILL: Added an akill for " << x->mask << " because " << u->GetMask() << "#" << u->realname << " matches " << old->mask; + Log(Config->GetClient("OperServ"), "akill") << "AKILL: Added an akill for " << x->mask << " because " << u->GetMask() << "#" << u->realname << " matches " << old->mask; } /* ZLine if we can instead */ @@ -347,14 +346,14 @@ class UnrealIRCdProto : public IRCDProto return; if (Servers::Capab.count("ESVID") > 0) - IRCD->SendMode(NickServ, u, "+d %s", u->Account()->display.c_str()); + IRCD->SendMode(Config->GetClient("NickServ"), u, "+d %s", u->Account()->display.c_str()); else - IRCD->SendMode(NickServ, u, "+d %d", u->signon); + IRCD->SendMode(Config->GetClient("NickServ"), u, "+d %d", u->signon); } void SendLogout(User *u) anope_override { - IRCD->SendMode(NickServ, u, "+d 0"); + IRCD->SendMode(Config->GetClient("NickServ"), u, "+d 0"); } void SendChannel(Channel *c) anope_override @@ -754,9 +753,7 @@ struct IRCDMessageNetInfo : IRCDMessage struct IRCDMessageNick : IRCDMessage { - ServiceReference<NickServService> NSService; - - IRCDMessageNick(Module *creator) : IRCDMessage(creator, "NICK", 2), NSService("NickServService", "NickServ") { SetFlag(IRCDMESSAGE_SOFT_LIMIT); } + IRCDMessageNick(Module *creator) : IRCDMessage(creator, "NICK", 2) { SetFlag(IRCDMESSAGE_SOFT_LIMIT); } /* ** NICK - new @@ -822,8 +819,8 @@ struct IRCDMessageNick : IRCDMessage na = NickAlias::Find(params[6]); } - if (na && NSService) - NSService->Login(user, na); + if (na) + user->Login(na->nc); } else source.GetUser()->ChangeNick(params[0]); @@ -877,7 +874,7 @@ struct IRCDMessageSASL : IRCDMessage UplinkSocket::Message() << "SASL " << this->uid.substr(0, p) << " " << this->uid << " D F"; - Log(NickServ) << "A user failed to identify for account " << this->GetAccount() << " using SASL"; + Log(Config->GetClient("NickServ")) << "A user failed to identify for account " << this->GetAccount() << " using SASL"; } }; diff --git a/modules/pseudoclients/botserv.cpp b/modules/pseudoclients/botserv.cpp index 5a84d1e7f..828f3b0e2 100644 --- a/modules/pseudoclients/botserv.cpp +++ b/modules/pseudoclients/botserv.cpp @@ -9,40 +9,35 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class BotServCore : public Module { + Reference<BotInfo> BotServ; + public: BotServCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PSEUDOCLIENT | VENDOR) { - Implementation i[] = { I_OnReload, I_OnSetCorrectModes, I_OnBotAssign, I_OnBotDelete, I_OnPrivmsg, I_OnJoinChannel, I_OnLeaveChannel, + Implementation i[] = { I_OnReload, I_OnSetCorrectModes, I_OnBotAssign, I_OnPrivmsg, I_OnJoinChannel, I_OnLeaveChannel, I_OnPreHelp, I_OnPostHelp, I_OnChannelModeSet, I_OnCreateChan, I_OnUserKicked, I_OnCreateBot }; ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation)); } - ~BotServCore() - { - BotServ = NULL; - } - void OnReload(Configuration::Conf *conf) anope_override { const Anope::string &bsnick = conf->GetModule(this)->Get<const Anope::string>("client"); if (bsnick.empty()) - throw ConfigException(this->name + ": <client> must be defined"); + throw ConfigException(Module::name + ": <client> must be defined"); BotInfo *bi = BotInfo::Find(bsnick, true); if (!bi) - throw ConfigException(this->name + ": no bot named " + bsnick); + throw ConfigException(Module::name + ": no bot named " + bsnick); BotServ = bi; } - void OnSetCorrectModes(User *user, Channel *chan, AccessGroup &access, bool give_modes) anope_override + void OnSetCorrectModes(User *user, Channel *chan, AccessGroup &access, bool &give_modes, bool &take_modes) anope_override { /* Do not allow removing bot modes on our service bots */ if (chan->ci && chan->ci->bi == user) @@ -62,12 +57,6 @@ class BotServCore : public Module } } - void OnBotDelete(BotInfo *bi) anope_override - { - if (bi == BotServ) - BotServ = NULL; - } - void OnPrivmsg(User *u, Channel *c, Anope::string &msg) anope_override { if (!u || !c || !c->ci || !c->ci->bi || msg.empty()) @@ -256,7 +245,7 @@ class BotServCore : public Module /* Channel is syncing from a netburst, don't destroy it as more users are probably wanting to join immediatly * We also don't part the bot here either, if necessary we will part it after the sync */ - if (c->HasExt("SYNCING")) + if (c->syncing) return; /* Additionally, do not delete this channel if ChanServ/a BotServ bot is inhabiting it */ @@ -305,7 +294,7 @@ class BotServCore : public Module void OnPostHelp(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { - if (!params.empty() || source.c || source.service != BotServ) + if (!params.empty() || source.c || source.service != *BotServ) return; source.Reply(_(" \n" diff --git a/modules/pseudoclients/chanserv.cpp b/modules/pseudoclients/chanserv.cpp index 7b0234d2e..5a1fed00b 100644 --- a/modules/pseudoclients/chanserv.cpp +++ b/modules/pseudoclients/chanserv.cpp @@ -9,65 +9,23 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" -class ExpireCallback : public Timer +class ChanServCore : public Module, public ChanServService { - public: - ExpireCallback(Module *o) : Timer(o, Config->GetBlock("options")->Get<time_t>("expiretimeout"), Anope::CurTime, true) { } + Reference<BotInfo> ChanServ; + std::vector<Anope::string> defaults; - void Tick(time_t) anope_override + public: + ChanServCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PSEUDOCLIENT | VENDOR), + ChanServService(this) { - time_t chanserv_expire = Config->GetModule("chanserv")->Get<time_t>("expire", "14d"); - - if (!chanserv_expire || Anope::NoExpire || Anope::ReadOnly) - return; - - for (registered_channel_map::const_iterator it = RegisteredChannelList->begin(), it_end = RegisteredChannelList->end(); it != it_end; ) - { - ChannelInfo *ci = it->second; - ++it; - - bool expire = false; - - if (Anope::CurTime - ci->last_used >= chanserv_expire) - { - if (ci->c) - { - time_t last_used = ci->last_used; - for (Channel::ChanUserList::const_iterator cit = ci->c->users.begin(), cit_end = ci->c->users.end(); cit != cit_end && last_used == ci->last_used; ++cit) - ci->AccessFor(cit->second->user); - expire = last_used == ci->last_used; - } - else - expire = true; - } - - if (ci->HasExt("NO_EXPIRE")) - expire = false; - - FOREACH_MOD(I_OnPreChanExpire, OnPreChanExpire(ci, expire)); - - if (expire) - { - Anope::string extra; - if (ci->HasExt("SUSPENDED")) - extra = "suspended "; - - Log(LOG_NORMAL, "chanserv/expire") << "Expiring " << extra << "channel " << ci->name << " (founder: " << (ci->GetFounder() ? ci->GetFounder()->display : "(none)") << ")"; - FOREACH_MOD(I_OnChanExpire, OnChanExpire(ci)); - delete ci; - } - } + Implementation i[] = { I_OnReload, I_OnBotDelete, I_OnBotPrivmsg, I_OnDelCore, + I_OnPreHelp, I_OnPostHelp, I_OnCheckModes, I_OnCreateChan, I_OnCanSet, + I_OnChannelSync, I_OnBotKick, I_OnExpireTick, I_OnCheckDelete, I_OnPreUplinkSync, + I_OnChanRegistered, I_OnTopicUpdated }; + ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation)); } -}; - -class MyChanServService : public ChanServService -{ - public: - MyChanServService(Module *m) : ChanServService(m) { } void Hold(Channel *c) anope_override { @@ -76,13 +34,14 @@ class MyChanServService : public ChanServService */ class ChanServTimer : public Timer { + Reference<BotInfo> &ChanServ; Reference<Channel> c; public: /** Constructor * @param chan The channel */ - ChanServTimer(Module *m, Channel *chan) : Timer(m, Config->GetModule(m)->Get<time_t>("inhabit", "15s")), c(chan) + ChanServTimer(Reference<BotInfo> &cs, Module *m, Channel *chan) : Timer(m, Config->GetModule(m)->Get<time_t>("inhabit", "15s")), ChanServ(cs), c(chan) { if (!ChanServ || !c) return; @@ -122,29 +81,7 @@ class MyChanServService : public ChanServService if (c->HasExt("INHABIT")) return; - new ChanServTimer(this->owner, c); - } -}; - -class ChanServCore : public Module -{ - MyChanServService chanserv; - ExpireCallback expires; - std::vector<Anope::string> defaults; - - public: - ChanServCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PSEUDOCLIENT | VENDOR), - chanserv(this), expires(this) - { - Implementation i[] = { I_OnReload, I_OnBotDelete, I_OnBotPrivmsg, I_OnDelCore, - I_OnPreHelp, I_OnPostHelp, I_OnCheckModes, I_OnCreateChan, I_OnCanSet, - I_OnChannelSync, I_OnBotKick }; - ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation)); - } - - ~ChanServCore() - { - ChanServ = NULL; + new ChanServTimer(ChanServ, this->owner, c); } void OnReload(Configuration::Conf *conf) anope_override @@ -152,11 +89,11 @@ class ChanServCore : public Module const Anope::string &channick = conf->GetModule(this)->Get<const Anope::string>("client"); if (channick.empty()) - throw ConfigException(this->name + ": <client> must be defined"); + throw ConfigException(Module::name + ": <client> must be defined"); BotInfo *bi = BotInfo::Find(channick, true); if (!bi) - throw ConfigException(this->name + ": no bot named " + channick); + throw ConfigException(Module::name + ": no bot named " + channick); ChanServ = bi; @@ -265,7 +202,7 @@ class ChanServCore : public Module EventReturn OnPreHelp(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { - if (!params.empty() || source.c || source.service != ChanServ) + if (!params.empty() || source.c || source.service != *ChanServ) return EVENT_CONTINUE; source.Reply(_("\002%s\002 allows you to register and control various\n" "aspects of channels. %s can often prevent\n" @@ -280,7 +217,7 @@ class ChanServCore : public Module void OnPostHelp(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { - if (!params.empty() || source.c || source.service != ChanServ) + if (!params.empty() || source.c || source.service != *ChanServ) return; time_t expire = Config->GetModule(this)->Get<time_t>("expire", "14d"); if (expire >= 86400) @@ -354,14 +291,20 @@ class ChanServCore : public Module bool perm = c->HasMode("PERM") || (c->ci && c->ci->HasExt("PERSIST")); if (!perm && !c->HasExt("BOTCHANNEL") && (c->users.empty() || (c->users.size() == 1 && c->users.begin()->second->user->server == Me))) { - chanserv.Hold(c); + this->Hold(c); } if (c->ci) { c->CheckModes(); if (Me && Me->IsSynced()) - c->ci->RestoreTopic(); + { + /* Update channel topic */ + if ((c->ci->HasExt("KEEPTOPIC") || c->ci->HasExt("TOPICLOCK")) && c->ci->last_topic != c->topic) + { + c->ChangeTopic(!c->ci->last_topic_setter.empty() ? c->ci->last_topic_setter : c->ci->WhoSends()->nick, c->ci->last_topic, c->ci->last_topic_time ? c->ci->last_topic_time : Anope::CurTime); + } + } } } @@ -372,14 +315,142 @@ class ChanServCore : public Module * ChanServ always enforces channels like this to keep people from deleting bots etc * that are holding channels. */ - if (c->ci && c->users.size() == (c->ci->bi && c->FindUser(c->ci->bi) ? 2 : 1) && !c->HasExt("INHABIT") && !c->HasExt("SYNCING")) + if (c->ci && c->users.size() == (c->ci->bi && c->FindUser(c->ci->bi) ? 2 : 1) && !c->HasExt("INHABIT") && !c->syncing) { /* Join ChanServ and set a timer for this channel to part ChanServ later */ - chanserv.Hold(c); + this->Hold(c); } return EVENT_CONTINUE; } + + void OnLog(Log *l) anope_override + { + if (l->type == LOG_CHANNEL) + l->bi = ChanServ; + } + + void OnExpireTick() anope_override + { + time_t chanserv_expire = Config->GetModule(this)->Get<time_t>("expire", "14d"); + + if (!chanserv_expire || Anope::NoExpire || Anope::ReadOnly) + return; + + for (registered_channel_map::const_iterator it = RegisteredChannelList->begin(), it_end = RegisteredChannelList->end(); it != it_end; ) + { + ChannelInfo *ci = it->second; + ++it; + + bool expire = false; + + if (Anope::CurTime - ci->last_used >= chanserv_expire) + { + if (ci->c) + { + time_t last_used = ci->last_used; + for (Channel::ChanUserList::const_iterator cit = ci->c->users.begin(), cit_end = ci->c->users.end(); cit != cit_end && last_used == ci->last_used; ++cit) + ci->AccessFor(cit->second->user); + expire = last_used == ci->last_used; + } + else + expire = true; + } + + if (ci->HasExt("NO_EXPIRE")) + expire = false; + + FOREACH_MOD(I_OnPreChanExpire, OnPreChanExpire(ci, expire)); + + if (expire) + { + Anope::string extra; + if (ci->HasExt("SUSPENDED")) + extra = "suspended "; + + Log(LOG_NORMAL, "chanserv/expire") << "Expiring " << extra << "channel " << ci->name << " (founder: " << (ci->GetFounder() ? ci->GetFounder()->display : "(none)") << ")"; + FOREACH_MOD(I_OnChanExpire, OnChanExpire(ci)); + delete ci; + } + } + } + + EventReturn OnCheckDelete(Channel *c) anope_override + { + /* Do not delete this channel if ChanServ/a BotServ bot is inhabiting it */ + if (c->HasExt("INHABIT")) + return EVENT_STOP; + + /* Channel is persistent, it shouldn't be deleted and the service bot should stay */ + if (c->ci && c->ci->HasExt("PERSIST")) + return EVENT_STOP; + + return EVENT_CONTINUE; + } + + void OnPreUplinkSync(Server *serv) anope_override + { + /* Find all persistent channels and create them, as we are about to finish burst to our uplink */ + for (registered_channel_map::iterator it = RegisteredChannelList->begin(), it_end = RegisteredChannelList->end(); it != it_end; ++it) + { + ChannelInfo *ci = it->second; + if (ci->HasExt("PERSIST")) + { + bool created; + ci->c = Channel::FindOrCreate(ci->name, created, ci->time_registered); + + if (ModeManager::FindChannelModeByName("PERM") != NULL) + { + if (created) + IRCD->SendChannel(ci->c); + ci->c->SetMode(NULL, "PERM"); + } + else + { + if (!ci->bi) + ci->WhoSends()->Assign(NULL, ci); + if (ci->c->FindUser(ci->bi) == NULL) + { + ChannelStatus status(Config->GetModule("botserv")->Get<const Anope::string>("botmodes")); + ci->bi->Join(ci->c, &status); + } + } + } + } + + } + + void OnChanRegistered(ChannelInfo *ci) anope_override + { + /* Mark the channel as persistent */ + if (ci->c->HasMode("PERM")) + ci->ExtendMetadata("PERSIST"); + /* Persist may be in def cflags, set it here */ + else if (ci->HasExt("PERSIST")) + ci->c->SetMode(NULL, "PERM"); + } + + void OnTopicUpdated(Channel *c, const Anope::string &user, const Anope::string &topic) anope_override + { + if (!c->ci) + return; + + /* We only compare the topics here, not the time or setter. This is because some (old) IRCds do not + * allow us to set the topic as someone else, meaning we have to bump the TS and change the setter to us. + * This desyncs what is really set with what we have stored, and we end up resetting the topic often when + * it is not required + */ + if (c->ci->HasExt("TOPICLOCK") && c->ci->last_topic != c->topic) + { + c->ChangeTopic(c->ci->last_topic_setter, c->ci->last_topic, c->ci->last_topic_time); + } + else + { + c->ci->last_topic = c->topic; + c->ci->last_topic_setter = c->topic_setter; + c->ci->last_topic_time = c->topic_ts; + } + } }; MODULE_INIT(ChanServCore) diff --git a/modules/pseudoclients/global.cpp b/modules/pseudoclients/global.cpp index 67cb594c5..224cbeea1 100644 --- a/modules/pseudoclients/global.cpp +++ b/modules/pseudoclients/global.cpp @@ -9,12 +9,12 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" -class MyGlobalService : public GlobalService +class GlobalCore : public Module, public GlobalService { + Reference<BotInfo> Global; + void ServerGlobal(const BotInfo *sender, Server *s, const Anope::string &message) { if (s != Me && !s->IsJuped()) @@ -24,12 +24,21 @@ class MyGlobalService : public GlobalService } public: - MyGlobalService(Module *m) : GlobalService(m) { } + GlobalCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PSEUDOCLIENT | VENDOR), + GlobalService(this) + { + Implementation i[] = { I_OnReload, I_OnRestart, I_OnShutdown, I_OnNewServer, I_OnPreHelp }; + ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation)); + } void SendGlobal(const BotInfo *sender, const Anope::string &source, const Anope::string &message) anope_override { if (Me->GetLinks().empty()) return; + if (!sender) + sender = Global; + if (!sender) + return; Anope::string rmessage; @@ -40,57 +49,33 @@ class MyGlobalService : public GlobalService this->ServerGlobal(sender, Servers::GetUplink(), rmessage); } -}; - -class GlobalCore : public Module -{ - MyGlobalService global; - - public: - GlobalCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PSEUDOCLIENT | VENDOR), - global(this) - { - Implementation i[] = { I_OnReload, I_OnBotDelete, I_OnRestart, I_OnShutdown, I_OnNewServer, I_OnPreHelp }; - ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation)); - } - - ~GlobalCore() - { - Global = NULL; - } void OnReload(Configuration::Conf *conf) anope_override { const Anope::string &glnick = conf->GetModule(this)->Get<const Anope::string>("client"); if (glnick.empty()) - throw ConfigException(this->name + ": <client> must be defined"); + throw ConfigException(Module::name + ": <client> must be defined"); BotInfo *bi = BotInfo::Find(glnick, true); if (!bi) - throw ConfigException(this->name + ": no bot named " + glnick); + throw ConfigException(Module::name + ": no bot named " + glnick); Global = bi; } - void OnBotDelete(BotInfo *bi) anope_override - { - if (bi == Global) - Global = NULL; - } - void OnRestart() anope_override { const Anope::string &gl = Config->GetModule(this)->Get<const Anope::string>("globaloncycledown"); if (!gl.empty()) - this->global.SendGlobal(Global, "", gl); + this->SendGlobal(Global, "", gl); } void OnShutdown() anope_override { const Anope::string &gl = Config->GetModule(this)->Get<const Anope::string>("globaloncycledown"); if (!gl.empty()) - this->global.SendGlobal(Global, "", gl); + this->SendGlobal(Global, "", gl); } void OnNewServer(Server *s) anope_override @@ -102,7 +87,7 @@ class GlobalCore : public Module EventReturn OnPreHelp(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { - if (!params.empty() || source.c || source.service != Global) + if (!params.empty() || source.c || source.service != *Global) return EVENT_CONTINUE; source.Reply(_("%s commands:"), Global->nick.c_str()); return EVENT_CONTINUE; diff --git a/modules/pseudoclients/hostserv.cpp b/modules/pseudoclients/hostserv.cpp index e3afa37d3..7c98c7344 100644 --- a/modules/pseudoclients/hostserv.cpp +++ b/modules/pseudoclients/hostserv.cpp @@ -9,12 +9,11 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class HostServCore : public Module { + Reference<BotInfo> HostServ; public: HostServCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PSEUDOCLIENT | VENDOR) { @@ -22,36 +21,25 @@ class HostServCore : public Module if (!IRCD || !IRCD->CanSetVHost) throw ModuleException("Your IRCd does not support vhosts"); - Implementation i[] = { I_OnReload, I_OnBotDelete, I_OnNickIdentify, I_OnNickUpdate, I_OnPreHelp, + Implementation i[] = { I_OnReload, I_OnNickIdentify, I_OnNickUpdate, I_OnPreHelp, I_OnSetVhost, I_OnDeleteVhost }; ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation)); } - ~HostServCore() - { - HostServ = NULL; - } - void OnReload(Configuration::Conf *conf) anope_override { const Anope::string &hsnick = conf->GetModule(this)->Get<const Anope::string>("client"); if (hsnick.empty()) - throw ConfigException(this->name + ": <client> must be defined"); + throw ConfigException(Module::name + ": <client> must be defined"); BotInfo *bi = BotInfo::Find(hsnick, true); if (!bi) - throw ConfigException(this->name + ": no bot named " + hsnick); + throw ConfigException(Module::name + ": no bot named " + hsnick); HostServ = bi; } - void OnBotDelete(BotInfo *bi) anope_override - { - if (bi == HostServ) - HostServ = NULL; - } - void OnNickIdentify(User *u) anope_override { const NickAlias *na = NickAlias::Find(u->nick); @@ -87,7 +75,7 @@ class HostServCore : public Module EventReturn OnPreHelp(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { - if (!params.empty() || source.c || source.service != HostServ) + if (!params.empty() || source.c || source.service != *HostServ) return EVENT_CONTINUE; source.Reply(_("%s commands:"), HostServ->nick.c_str()); return EVENT_CONTINUE; diff --git a/modules/pseudoclients/memoserv.cpp b/modules/pseudoclients/memoserv.cpp index 1988961cd..5136e2af0 100644 --- a/modules/pseudoclients/memoserv.cpp +++ b/modules/pseudoclients/memoserv.cpp @@ -9,34 +9,39 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" -static bool SendMemoMail(NickCore *nc, MemoInfo *mi, Memo *m) +class MemoServCore : public Module, public MemoServService { - Anope::string subject = Language::Translate(nc, Config->GetBlock("mail")->Get<const Anope::string>("memo_subject").c_str()), - message = Language::Translate(Config->GetBlock("mail")->Get<const Anope::string>("memo_message").c_str()); - - subject = subject.replace_all_cs("%n", nc->display); - subject = subject.replace_all_cs("%s", m->sender); - subject = subject.replace_all_cs("%d", stringify(mi->GetIndex(m) + 1)); - subject = subject.replace_all_cs("%t", m->text); - subject = subject.replace_all_cs("%N", Config->GetBlock("networkinfo")->Get<const Anope::string>("networkname")); - - message = message.replace_all_cs("%n", nc->display); - message = message.replace_all_cs("%s", m->sender); - message = message.replace_all_cs("%d", stringify(mi->GetIndex(m) + 1)); - message = message.replace_all_cs("%t", m->text); - message = message.replace_all_cs("%N", Config->GetBlock("networkinfo")->Get<const Anope::string>("networkname")); + Reference<BotInfo> MemoServ; - return Mail::Send(nc, subject, message); -} + bool SendMemoMail(NickCore *nc, MemoInfo *mi, Memo *m) + { + Anope::string subject = Language::Translate(nc, Config->GetBlock("mail")->Get<const Anope::string>("memo_subject").c_str()), + message = Language::Translate(Config->GetBlock("mail")->Get<const Anope::string>("memo_message").c_str()); + + subject = subject.replace_all_cs("%n", nc->display); + subject = subject.replace_all_cs("%s", m->sender); + subject = subject.replace_all_cs("%d", stringify(mi->GetIndex(m) + 1)); + subject = subject.replace_all_cs("%t", m->text); + subject = subject.replace_all_cs("%N", Config->GetBlock("networkinfo")->Get<const Anope::string>("networkname")); + + message = message.replace_all_cs("%n", nc->display); + message = message.replace_all_cs("%s", m->sender); + message = message.replace_all_cs("%d", stringify(mi->GetIndex(m) + 1)); + message = message.replace_all_cs("%t", m->text); + message = message.replace_all_cs("%N", Config->GetBlock("networkinfo")->Get<const Anope::string>("networkname")); + + return Mail::Send(nc, subject, message); + } -class MyMemoServService : public MemoServService -{ public: - MyMemoServService(Module *m) : MemoServService(m) { } + MemoServCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PSEUDOCLIENT | VENDOR), + MemoServService(this) + { + Implementation i[] = { I_OnNickCoreCreate, I_OnCreateChan, I_OnReload, I_OnBotDelete, I_OnNickIdentify, I_OnJoinChannel, I_OnUserAway, I_OnNickUpdate, I_OnPreHelp, I_OnPostHelp }; + ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation)); + } MemoResult Send(const Anope::string &source, const Anope::string &target, const Anope::string &message, bool force) anope_override { @@ -134,34 +139,17 @@ class MyMemoServService : public MemoServService u->SendMessage(MemoServ, _("You have reached your maximum number of memos (%d). You will be unable to receive any new memos until you delete some of your current ones."), nc->memos.memomax); } } -}; - -class MemoServCore : public Module -{ - MyMemoServService memoserv; - public: - MemoServCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PSEUDOCLIENT | VENDOR), - memoserv(this) - { - Implementation i[] = { I_OnNickCoreCreate, I_OnCreateChan, I_OnReload, I_OnBotDelete, I_OnNickIdentify, I_OnJoinChannel, I_OnUserAway, I_OnNickUpdate, I_OnPreHelp, I_OnPostHelp }; - ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation)); - } - - ~MemoServCore() - { - MemoServ = NULL; - } void OnReload(Configuration::Conf *conf) anope_override { const Anope::string &msnick = conf->GetModule(this)->Get<const Anope::string>("client"); if (msnick.empty()) - throw ConfigException(this->name + ": <client> must be defined"); + throw ConfigException(Module::name + ": <client> must be defined"); BotInfo *bi = BotInfo::Find(msnick, true); if (!bi) - throw ConfigException(this->name + ": no bot named " + msnick); + throw ConfigException(Module::name + ": no bot named " + msnick); MemoServ = bi; } @@ -184,7 +172,7 @@ class MemoServCore : public Module void OnNickIdentify(User *u) anope_override { - this->memoserv.Check(u); + this->Check(u); } void OnJoinChannel(User *u, Channel *c) anope_override @@ -201,17 +189,17 @@ class MemoServCore : public Module void OnUserAway(User *u, const Anope::string &message) anope_override { if (message.empty()) - this->memoserv.Check(u); + this->Check(u); } void OnNickUpdate(User *u) anope_override { - this->memoserv.Check(u); + this->Check(u); } EventReturn OnPreHelp(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { - if (!params.empty() || source.c || source.service != MemoServ) + if (!params.empty() || source.c || source.service != *MemoServ) return EVENT_CONTINUE; source.Reply(_("\002%s\002 is a utility allowing IRC users to send short\n" "messages to other IRC users, whether they are online at\n" @@ -224,14 +212,11 @@ class MemoServCore : public Module void OnPostHelp(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { - if (!params.empty() || source.c || source.service != MemoServ) + if (!params.empty() || source.c || source.service != *MemoServ) return; source.Reply(_(" \n" "Type \002%s%s HELP \037command\037\002 for help on any of the\n" - "above commands.\n" - "(*) By default, any user with at least level 10 access on a\n" - " channel can read that channel's memos. This can be\n" - " changed with the %s \002LEVELS\002 command."), Config->StrictPrivmsg.c_str(), MemoServ->nick.c_str(), ChanServ->nick.c_str()); + "above commands."), Config->StrictPrivmsg.c_str(), MemoServ->nick.c_str()); } }; diff --git a/modules/pseudoclients/nickserv.cpp b/modules/pseudoclients/nickserv.cpp index be60f3982..642b22f2d 100644 --- a/modules/pseudoclients/nickserv.cpp +++ b/modules/pseudoclients/nickserv.cpp @@ -9,63 +9,116 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" -class NickServCollide; - -typedef std::map<Anope::string, NickServCollide *> nickservcollides_map; - -static nickservcollides_map NickServCollides; - /** Timer for colliding nicks to force people off of nicknames */ class NickServCollide : public Timer { + NickServService *service; Reference<User> u; + Reference<NickAlias> na; + + public: + NickServCollide(NickServService *nss, User *user, NickAlias *nick, time_t delay) : Timer(delay), service(nss), u(user), na(nick) + { + } + + void Tick(time_t t) anope_override + { + if (!u || !na) + return; + /* If they identified or don't exist anymore, don't kill them. */ + if (u->Account() == na->nc || u->timestamp > this->GetSetTime()) + return; + + service->Collide(u, na); + } +}; + +/** Timer for removing HELD status from nicks. + */ +class NickServHeld : public Timer +{ + Reference<NickAlias> na; + Anope::string nick; + public: + NickServHeld(NickAlias *n, long l) : Timer(l), na(n), nick(na->nick) + { + } + + void Tick(time_t) + { + if (na) + na->Shrink("HELD"); + } +}; + +/** Timer for releasing nicks to be available for use + */ +class CoreExport NickServRelease : public User, public Timer +{ + static std::map<Anope::string, NickServRelease *> NickServReleases; Anope::string nick; public: - /** Constructor - * @param nick The nick we're colliding - * @param delay How long to delay before kicking the user off the nick - */ - NickServCollide(User *user, time_t delay) : Timer(delay), u(user), nick(u->nick) + NickServRelease(NickAlias *na, time_t delay) : User(na->nick, Config->GetBlock("options")->Get<const Anope::string>("enforceruser"), + Config->GetBlock("options")->Get<const Anope::string>("enforcerhost"), "", "", Me, "Services Enforcer", Anope::CurTime, "", Servers::TS6_UID_Retrieve()), Timer(delay), nick(na->nick) { - /* Erase the current collide and use the new one */ - nickservcollides_map::iterator nit = NickServCollides.find(user->nick); - if (nit != NickServCollides.end()) + /* Erase the current release timer and use the new one */ + std::map<Anope::string, NickServRelease *>::iterator nit = NickServReleases.find(this->nick); + if (nit != NickServReleases.end()) + { + IRCD->SendQuit(nit->second, ""); delete nit->second; + } - NickServCollides.insert(std::make_pair(nick, this)); + NickServReleases.insert(std::make_pair(this->nick, this)); + + IRCD->SendClientIntroduction(this); } - virtual ~NickServCollide() + ~NickServRelease() { - NickServCollides.erase(this->nick); + NickServReleases.erase(this->nick); } - /** Called when the delay is up - * @param t The current time - */ - void Tick(time_t t) anope_override + void Tick(time_t t) { - if (!u) - return; - /* If they identified or don't exist anymore, don't kill them. */ - NickAlias *na = NickAlias::Find(u->nick); - if (!na || u->Account() == na->nc || u->timestamp > this->GetSetTime()) - return; - - u->Collide(na); + IRCD->SendQuit(this, ""); } }; +std::map<Anope::string, NickServRelease *> NickServRelease::NickServReleases; -class MyNickServService : public NickServService +class NickServCore : public Module, public NickServService { + Reference<BotInfo> NickServ; + std::vector<Anope::string> defaults; + + void OnCancel(User *u, NickAlias *na) + { + if (na->HasExt("COLLIDED")) + { + na->Extend("HELD"); + na->Shrink("COLLIDED"); + + new NickServHeld(na, Config->GetBlock("options")->Get<time_t>("releasetimeout")); + + if (IRCD->CanSVSHold) + IRCD->SendSVSHold(na->nick, Config->GetBlock("options")->Get<time_t>("releasetimeout")); + else + new NickServRelease(na, Config->GetBlock("options")->Get<time_t>("releasetimeout")); + } + } + public: - MyNickServService(Module *m) : NickServService(m) { } + NickServCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PSEUDOCLIENT | VENDOR), NickServService(this) + { + Implementation i[] = { I_OnReload, I_OnDelNick, I_OnDelCore, I_OnChangeCoreDisplay, I_OnNickIdentify, I_OnNickGroup, + I_OnNickUpdate, I_OnUserConnect, I_OnPostUserLogoff, I_OnServerSync, I_OnUserNickChange, I_OnPreHelp, I_OnPostHelp, + I_OnNickCoreCreate, I_OnUserQuit, I_OnExpireTick, I_OnUserLogin }; + ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation)); + } void Validate(User *u) anope_override { @@ -76,7 +129,7 @@ class MyNickServService : public NickServService if (na->nc->HasExt("SUSPENDED")) { u->SendMessage(NickServ, NICK_X_SUSPENDED, u->nick.c_str()); - u->Collide(na); + this->Collide(u, na); return; } @@ -113,98 +166,79 @@ class MyNickServService : public NickServService if (na->nc->HasExt("KILL_IMMED")) { u->SendMessage(NickServ, FORCENICKCHANGE_NOW); - u->Collide(na); + this->Collide(u, na); } else if (na->nc->HasExt("KILL_QUICK")) { time_t killquick = Config->GetModule("nickserv")->Get<time_t>("killquick", "60s"); u->SendMessage(NickServ, _("If you do not change within %s, I will change your nick."), Anope::Duration(killquick, u->Account()).c_str()); - new NickServCollide(u, killquick); + new NickServCollide(this, u, na, killquick); } else { time_t kill = Config->GetModule("nickserv")->Get<time_t>("kill", "20s"); u->SendMessage(NickServ, _("If you do not change within %s, I will change your nick."), Anope::Duration(kill, u->Account()).c_str()); - new NickServCollide(u, kill); + new NickServCollide(this, u, na, kill); } } } - void Login(User *user, NickAlias *na) anope_override + void OnUserLogin(User *u) anope_override { - const NickAlias *u_na = NickAlias::Find(user->nick); - user->Login(na->nc); - if (u_na && *u_na->nc == *na->nc && !Config->GetBlock("options")->Get<bool>("nonicknameownership") && na->nc->HasExt("UNCONFIRMED") == false) - user->SetMode(NickServ, "REGISTERED"); + NickAlias *na = NickAlias::Find(u->nick); + if (na && *na->nc == u->Account() && !Config->GetBlock("options")->Get<bool>("nonicknameownership") && na->nc->HasExt("UNCONFIRMED") == false) + u->SetMode(NickServ, "REGISTERED"); } -}; -class ExpireCallback : public Timer -{ - public: - ExpireCallback(Module *o) : Timer(o, Config->GetBlock("options")->Get<time_t>("expiretimeout"), Anope::CurTime, true) { } - - void Tick(time_t) anope_override + void Collide(User *u, NickAlias *na) anope_override { - if (Anope::NoExpire || Anope::ReadOnly) - return; - - time_t unconfirmed_expire = Config->GetModule(this->GetOwner())->Get<time_t>("unconfirmedexpire", "1d"); - time_t nickserv_expire = Config->GetModule(this->GetOwner())->Get<time_t>("expire"); + if (na) + na->Extend("COLLIDED"); - for (nickalias_map::const_iterator it = NickAliasList->begin(), it_end = NickAliasList->end(); it != it_end; ) + if (IRCD->CanSVSNick) { - NickAlias *na = it->second; - ++it; + const Anope::string &guestprefix = Config->GetBlock("options")->Get<const Anope::string>("guestnickprefix"); + + Anope::string guestnick; - User *u = User::Find(na->nick); - if (u && (na->nc->HasExt("SECURE") ? u->IsIdentified(true) : u->IsRecognized())) - na->last_seen = Anope::CurTime; - - bool expire = false; - - if (na->nc->HasExt("UNCONFIRMED")) - if (unconfirmed_expire && Anope::CurTime - na->time_registered >= unconfirmed_expire) - expire = true; - if (nickserv_expire && Anope::CurTime - na->last_seen >= nickserv_expire) - expire = true; - if (na->HasExt("NO_EXPIRE")) - expire = false; + int i = 0; + do + { + guestnick = guestprefix + stringify(static_cast<uint16_t>(rand())); + } + while (User::Find(guestnick) && i++ < 10); - FOREACH_MOD(I_OnPreNickExpire, OnPreNickExpire(na, expire)); - - if (expire) + if (i == 11) + u->Kill(NickServ ? NickServ->nick : "", "Services nickname-enforcer kill"); + else { - Anope::string extra; - if (na->nc->HasExt("SUSPENDED")) - extra = "suspended "; - Log(LOG_NORMAL, "expire") << "Expiring " << extra << "nickname " << na->nick << " (group: " << na->nc->display << ") (e-mail: " << (na->nc->email.empty() ? "none" : na->nc->email) << ")"; - FOREACH_MOD(I_OnNickExpire, OnNickExpire(na)); - delete na; + if (NickServ) + u->SendMessage(NickServ, _("Your nickname is now being changed to \002%s\002"), guestnick.c_str()); + IRCD->SendForceNickChange(u, guestnick, Anope::CurTime); } } + else + u->Kill(NickServ ? NickServ->nick : "", "Services nickname-enforcer kill"); } -}; -class NickServCore : public Module -{ - MyNickServService nickserv; - ExpireCallback expires; - std::vector<Anope::string> defaults; - - public: - NickServCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PSEUDOCLIENT | VENDOR), nickserv(this), expires(this) + void Release(NickAlias *na) anope_override { - Implementation i[] = { I_OnReload, I_OnBotDelete, I_OnDelNick, I_OnDelCore, I_OnChangeCoreDisplay, I_OnNickIdentify, I_OnNickGroup, - I_OnNickUpdate, I_OnUserConnect, I_OnPostUserLogoff, I_OnServerSync, I_OnUserNickChange, I_OnPreHelp, I_OnPostHelp, - I_OnNickCoreCreate, I_OnUserQuit }; - ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation)); - } + if (na->HasExt("HELD")) + { + if (IRCD->CanSVSHold) + IRCD->SendSVSHoldDel(na->nick); + else + { + User *u = User::Find(na->nick); + if (u && u->server == Me) + { + u->Quit(); + } + } - ~NickServCore() - { - NickServ = NULL; + na->Shrink("HELD"); + } } void OnReload(Configuration::Conf *conf) anope_override @@ -212,11 +246,11 @@ class NickServCore : public Module const Anope::string &nsnick = conf->GetModule(this)->Get<const Anope::string>("client"); if (nsnick.empty()) - throw ConfigException(this->name + ": <client> must be defined"); + throw ConfigException(Module::name + ": <client> must be defined"); BotInfo *bi = BotInfo::Find(nsnick, true); if (!bi) - throw ConfigException(this->name + ": no bot named " + nsnick); + throw ConfigException(Module::name + ": no bot named " + nsnick); NickServ = bi; @@ -229,12 +263,6 @@ class NickServCore : public Module } } - void OnBotDelete(BotInfo *bi) anope_override - { - if (bi == NickServ) - NickServ = NULL; - } - void OnDelNick(NickAlias *na) anope_override { User *u = User::Find(na->nick); @@ -284,7 +312,7 @@ class NickServCore : public Module ChanUserContainer *cc = it->second; Channel *c = cc->chan; if (c) - c->SetCorrectModes(u, true, true); + c->SetCorrectModes(u, true); } const Anope::string &modesonid = block->Get<const Anope::string>("modesonid"); @@ -325,7 +353,7 @@ class NickServCore : public Module ChanUserContainer *cc = it->second; Channel *c = cc->chan; if (c) - c->SetCorrectModes(u, true, true); + c->SetCorrectModes(u, true); } } @@ -340,14 +368,14 @@ class NickServCore : public Module if (!Config->GetBlock("options")->Get<bool>("nonicknameownership") && !unregistered_notice.empty() && !na) u->SendMessage(NickServ, unregistered_notice); else if (na) - this->nickserv.Validate(u); + this->Validate(u); } void OnPostUserLogoff(User *u) anope_override { NickAlias *na = NickAlias::Find(u->nick); if (na) - na->OnCancel(u); + OnCancel(u, na); } void OnServerSync(Server *s) anope_override @@ -356,7 +384,7 @@ class NickServCore : public Module { User *u = it->second; if (u->server == s && !u->IsIdentified()) - this->nickserv.Validate(u); + this->Validate(u); } } @@ -369,7 +397,7 @@ class NickServCore : public Module /* Remove +r, but keep an account associated with the user */ u->RemoveMode(NickServ, "REGISTERED"); - this->nickserv.Validate(u); + this->Validate(u); } else { @@ -381,7 +409,7 @@ class NickServCore : public Module } if (!u->nick.equals_ci(oldnick) && old_na) - old_na->OnCancel(u); + OnCancel(u, old_na); } void OnUserModeSet(User *u, const Anope::string &mname) anope_override @@ -392,7 +420,7 @@ class NickServCore : public Module EventReturn OnPreHelp(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { - if (!params.empty() || source.c || source.service != NickServ) + if (!params.empty() || source.c || source.service != *NickServ) return EVENT_CONTINUE; if (!Config->GetBlock("options")->Get<bool>("nonicknameownership")) source.Reply(_("\002%s\002 allows you to register a nickname and\n" @@ -412,7 +440,7 @@ class NickServCore : public Module void OnPostHelp(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { - if (!params.empty() || source.c || source.service != NickServ) + if (!params.empty() || source.c || source.service != *NickServ) return; if (source.IsServicesOper()) source.Reply(_(" \n" @@ -454,6 +482,47 @@ class NickServCore : public Module na->last_quit = msg; } } + + void OnExpireTick() anope_override + { + if (Anope::NoExpire || Anope::ReadOnly) + return; + + time_t unconfirmed_expire = Config->GetModule(this)->Get<time_t>("unconfirmedexpire", "1d"); + time_t nickserv_expire = Config->GetModule(this)->Get<time_t>("expire"); + + for (nickalias_map::const_iterator it = NickAliasList->begin(), it_end = NickAliasList->end(); it != it_end; ) + { + NickAlias *na = it->second; + ++it; + + User *u = User::Find(na->nick); + if (u && (na->nc->HasExt("SECURE") ? u->IsIdentified(true) : u->IsRecognized())) + na->last_seen = Anope::CurTime; + + bool expire = false; + + if (na->nc->HasExt("UNCONFIRMED")) + if (unconfirmed_expire && Anope::CurTime - na->time_registered >= unconfirmed_expire) + expire = true; + if (nickserv_expire && Anope::CurTime - na->last_seen >= nickserv_expire) + expire = true; + if (na->HasExt("NO_EXPIRE")) + expire = false; + + FOREACH_MOD(I_OnPreNickExpire, OnPreNickExpire(na, expire)); + + if (expire) + { + Anope::string extra; + if (na->nc->HasExt("SUSPENDED")) + extra = "suspended "; + Log(LOG_NORMAL, "expire") << "Expiring " << extra << "nickname " << na->nick << " (group: " << na->nc->display << ") (e-mail: " << (na->nc->email.empty() ? "none" : na->nc->email) << ")"; + FOREACH_MOD(I_OnNickExpire, OnNickExpire(na)); + delete na; + } + } + } }; MODULE_INIT(NickServCore) diff --git a/modules/pseudoclients/operserv.cpp b/modules/pseudoclients/operserv.cpp index c514536fa..85984327c 100644 --- a/modules/pseudoclients/operserv.cpp +++ b/modules/pseudoclients/operserv.cpp @@ -9,8 +9,6 @@ * Based on the original code of Services by Andy Church. */ -/*************************************************************************/ - #include "module.h" class SGLineManager : public XLineManager @@ -25,7 +23,7 @@ class SGLineManager : public XLineManager void OnExpire(const XLine *x) anope_override { - Log(OperServ, "expire/akill") << "AKILL on \002" << x->mask << "\002 has expired"; + Log(Config->GetClient("OperServ"), "expire/akill") << "AKILL on \002" << x->mask << "\002 has expired"; } void Send(User *u, XLine *x) anope_override @@ -80,7 +78,7 @@ class SQLineManager : public XLineManager void OnExpire(const XLine *x) anope_override { - Log(OperServ, "expire/sqline") << "SQLINE on \002" << x->mask << "\002 has expired"; + Log(Config->GetClient("OperServ"), "expire/sqline") << "SQLINE on \002" << x->mask << "\002 has expired"; } void Send(User *u, XLine *x) anope_override @@ -129,7 +127,7 @@ class SNLineManager : public XLineManager void OnExpire(const XLine *x) anope_override { - Log(OperServ, "expire/snline") << "SNLINE on \002" << x->mask << "\002 has expired"; + Log(Config->GetClient("OperServ"), "expire/snline") << "SNLINE on \002" << x->mask << "\002 has expired"; } void Send(User *u, XLine *x) anope_override @@ -152,6 +150,7 @@ class SNLineManager : public XLineManager class OperServCore : public Module { + Reference<BotInfo> OperServ; SGLineManager sglines; SQLineManager sqlines; SNLineManager snlines; @@ -160,7 +159,7 @@ class OperServCore : public Module OperServCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PSEUDOCLIENT | VENDOR), sglines(this), sqlines(this), snlines(this) { - Implementation i[] = { I_OnReload, I_OnBotDelete, I_OnBotPrivmsg, I_OnServerQuit, I_OnUserModeSet, I_OnUserModeUnset, I_OnUserConnect, I_OnUserNickChange, I_OnPreHelp }; + Implementation i[] = { I_OnReload, I_OnBotPrivmsg, I_OnServerQuit, I_OnUserModeSet, I_OnUserModeUnset, I_OnUserConnect, I_OnUserNickChange, I_OnPreHelp, I_OnLog }; ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation)); /* Yes, these are in this order for a reason. Most violent->least violent. */ @@ -171,8 +170,6 @@ class OperServCore : public Module ~OperServCore() { - OperServ = NULL; - this->sglines.Clear(); this->sqlines.Clear(); this->snlines.Clear(); @@ -196,18 +193,12 @@ class OperServCore : public Module OperServ = bi; } - void OnBotDelete(BotInfo *bi) anope_override - { - if (bi == OperServ) - OperServ = NULL; - } - EventReturn OnBotPrivmsg(User *u, BotInfo *bi, Anope::string &message) anope_override { if (bi == OperServ && !u->HasMode("OPER") && Config->GetModule(this)->Get<bool>("opersonly")) { u->SendMessage(bi, ACCESS_DENIED); - Log(OperServ, "bados") << "Denied access to " << bi->nick << " from " << u->GetMask() << " (non-oper)"; + Log(bi, "bados") << "Denied access to " << bi->nick << " from " << u->GetMask() << " (non-oper)"; return EVENT_STOP; } @@ -258,11 +249,17 @@ class OperServCore : public Module EventReturn OnPreHelp(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { - if (!params.empty() || source.c || source.service != OperServ) + if (!params.empty() || source.c || source.service != *OperServ) return EVENT_CONTINUE; source.Reply(_("%s commands:"), OperServ->nick.c_str()); return EVENT_CONTINUE; } + + void OnLog(Log *l) anope_override + { + if (l->type == LOG_SERVER) + l->bi = OperServ; + } }; MODULE_INIT(OperServCore) diff --git a/src/bots.cpp b/src/bots.cpp index 05dfdbe43..3ea2ef485 100644 --- a/src/bots.cpp +++ b/src/bots.cpp @@ -21,8 +21,6 @@ Serialize::Checker<botinfo_map> BotListByNick("BotInfo"), BotListByUID("BotInfo"); -BotInfo *BotServ = NULL, *ChanServ = NULL, *Global = NULL, *HostServ = NULL, *MemoServ = NULL, *NickServ = NULL, *OperServ = NULL; - BotInfo::BotInfo(const Anope::string &nnick, const Anope::string &nuser, const Anope::string &nhost, const Anope::string &nreal, const Anope::string &bmodes) : User(nnick, nuser, nhost, "", "", Me, nreal, Anope::CurTime, "", Servers::TS6_UID_Retrieve()), Serializable("BotInfo"), channels("ChannelInfo"), botmodes(bmodes) { this->lastmsg = this->created = Anope::CurTime; diff --git a/src/channels.cpp b/src/channels.cpp index bc32781de..d774b8c8d 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -34,6 +34,7 @@ Channel::Channel(const Anope::string &nname, time_t ts) this->name = nname; this->creation_time = ts; + this->syncing = false; this->server_modetime = this->chanserv_modetime = 0; this->server_modecount = this->chanserv_modecount = this->bouncy_modes = this->topic_ts = this->topic_time = 0; @@ -79,7 +80,7 @@ void Channel::Reset() } for (ChanUserList::const_iterator it = this->users.begin(), it_end = this->users.end(); it != it_end; ++it) - this->SetCorrectModes(it->second->user, true, false); + this->SetCorrectModes(it->second->user, true); this->Sync(); } @@ -152,21 +153,20 @@ void Channel::CheckModes() bool Channel::CheckDelete() { - /* Channel is persistent, it shouldn't be deleted and the service bot should stay */ - if (this->HasExt("PERSIST") || (this->ci && this->ci->HasExt("PERSIST"))) - return false; - /* Channel is syncing from a netburst, don't destroy it as more users are probably wanting to join immediatly * We also don't part the bot here either, if necessary we will part it after the sync */ - if (this->HasExt("SYNCING")) + if (this->syncing) return false; - - /* Additionally, do not delete this channel if ChanServ/a BotServ bot is inhabiting it */ - if (this->HasExt("INHABIT")) + + /* Permanent channels never get deleted */ + if (this->HasMode("PERM")) return false; - return this->users.empty(); + EventReturn MOD_RESULT; + FOREACH_RESULT(I_OnCheckDelete, OnCheckDelete(this)); + + return MOD_RESULT != EVENT_STOP && this->users.empty(); } ChanUserContainer* Channel::JoinUser(User *user) @@ -180,14 +180,6 @@ ChanUserContainer* Channel::JoinUser(User *user) user->chans[this] = cuc; this->users[user] = cuc; - if (this->ci && this->ci->HasExt("PERSIST") && this->creation_time > this->ci->time_registered) - { - Log(LOG_DEBUG) << "Changing TS of " << this->name << " from " << this->creation_time << " to " << this->ci->time_registered; - this->creation_time = this->ci->time_registered; - IRCD->SendChannel(this); - this->Reset(); - } - return cuc; } @@ -323,7 +315,7 @@ void Channel::SetModeInternal(MessageSource &setter, ChannelMode *cm, const Anop /* Enforce secureops, etc */ if (enforce_mlock && MOD_RESULT != EVENT_STOP) - this->SetCorrectModes(u, false, false); + this->SetCorrectModes(u, false); return; } @@ -343,14 +335,6 @@ void Channel::SetModeInternal(MessageSource &setter, ChannelMode *cm, const Anop cml->OnAdd(this, param); } - /* Channel mode +P or so was set, mark this channel as persistent */ - if (cm->name == "PERM") - { - this->Extend("PERSIST"); - if (this->ci) - this->ci->ExtendMetadata("PERSIST"); - } - FOREACH_RESULT(I_OnChannelModeSet, OnChannelModeSet(this, setter, cm->name, param)); /* Check if we should enforce mlock */ @@ -395,7 +379,7 @@ void Channel::RemoveModeInternal(MessageSource &setter, ChannelMode *cm, const A FOREACH_RESULT(I_OnChannelModeUnset, OnChannelModeUnset(this, setter, cm->name, param)); if (enforce_mlock && MOD_RESULT != EVENT_STOP) - this->SetCorrectModes(u, false, false); + this->SetCorrectModes(u, false); return; } @@ -419,20 +403,6 @@ void Channel::RemoveModeInternal(MessageSource &setter, ChannelMode *cm, const A cml->OnDel(this, param); } - if (cm->name == "PERM") - { - this->Shrink("PERSIST"); - - if (this->ci) - this->ci->Shrink("PERSIST"); - - if (this->users.empty() && !this->HasExt("SYNCING") && !this->HasExt("INHABIT")) - { - delete this; - return; - } - } - FOREACH_RESULT(I_OnChannelModeUnset, OnChannelModeUnset(this, setter, cm->name, param)); /* Check for mlock */ @@ -828,9 +798,6 @@ void Channel::ChangeTopicInternal(const Anope::string &user, const Anope::string Log(LOG_DEBUG) << "Topic of " << this->name << " changed by " << (u ? u->nick : user) << " to " << newtopic; FOREACH_MOD(I_OnTopicUpdated, OnTopicUpdated(this, user, this->topic)); - - if (this->ci) - this->ci->CheckTopic(); } void Channel::ChangeTopic(const Anope::string &user, const Anope::string &newtopic, time_t ts) @@ -847,12 +814,9 @@ void Channel::ChangeTopic(const Anope::string &user, const Anope::string &newtop this->topic_time = Anope::CurTime; FOREACH_MOD(I_OnTopicUpdated, OnTopicUpdated(this, user, this->topic)); - - if (this->ci) - this->ci->CheckTopic(); } -void Channel::SetCorrectModes(User *user, bool give_modes, bool check_noop) +void Channel::SetCorrectModes(User *user, bool give_modes) { if (user == NULL) return; @@ -865,14 +829,17 @@ void Channel::SetCorrectModes(User *user, bool give_modes, bool check_noop) AccessGroup u_access = ci->AccessFor(user); ChannelMode *registered = ModeManager::FindChannelModeByName("REGISTERED"); - /* Only give modes if autoop isn't set */ - give_modes &= (!user->Account() || user->Account()->HasExt("AUTOOP")) && (!check_noop || !ci->HasExt("NOAUTOOP")); /* If this channel has secureops, or the registered channel mode exists and the channel does not have +r set (aka the channel * was created just now or while we were off), or the registered channel mode does not exist and channel is syncing (aka just * created *to us*) and the user's server is synced (aka this isn't us doing our initial uplink - without this we would be deopping all * users with no access on a non-secureops channel on startup), and the user's server isn't ulined, then set negative modes. */ - bool take_modes = (ci->HasExt("SECUREOPS") || (registered && !this->HasMode("REGISTERED")) || (!registered && this->HasExt("SYNCING") && user->server->IsSynced())) && !user->server->IsULined(); + bool take_modes = (registered && !this->HasMode("REGISTERED")) || (!registered && this->syncing && user->server->IsSynced()); + + FOREACH_MOD(I_OnSetCorrectModes, OnSetCorrectModes(user, this, u_access, give_modes, take_modes)); + + /* Never take modes from ulines */ + take_modes &= !user->server->IsULined(); bool given = false; for (unsigned i = 0; i < ModeManager::GetStatusChannelModesByRank().size(); ++i) @@ -911,8 +878,6 @@ void Channel::SetCorrectModes(User *user, bool give_modes, bool check_noop) } } } - - FOREACH_MOD(I_OnSetCorrectModes, OnSetCorrectModes(user, this, u_access, give_modes)); } bool Channel::Unban(User *u, bool full) diff --git a/src/config.cpp b/src/config.cpp index 52469c75a..d90c9728c 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -589,6 +589,18 @@ Block *Conf::GetModule(const Anope::string &mname) return GetModule(mname); } +BotInfo *Conf::GetClient(const Anope::string &cname) +{ + Anope::map<Anope::string>::iterator it = bots.find(cname); + if (it != bots.end()) + return BotInfo::Find(!it->second.empty() ? it->second : cname, true); + + Block *block = GetModule(cname.lower()); + const Anope::string &client = block->Get<const Anope::string>("client"); + bots[cname] = client; + return GetClient(cname); +} + File::File(const Anope::string &n, bool e) : name(n), executable(e), fp(NULL) { } diff --git a/src/init.cpp b/src/init.cpp index 205fb2501..0a93c07f5 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -464,9 +464,9 @@ void Anope::Init(int ac, char **av) Log() << "Loading databases..."; EventReturn MOD_RESULT; FOREACH_RESULT(I_OnLoadDatabase, OnLoadDatabase()); + static_cast<void>(MOD_RESULT); Log() << "Databases loaded"; Serialize::CheckTypes(); } -/*************************************************************************/ diff --git a/src/logger.cpp b/src/logger.cpp index 380e94b14..3873c1dee 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -98,9 +98,6 @@ Log::Log(const User *_u, Channel *ch, const Anope::string &cat) : bi(NULL), u(_u { if (!chan) throw CoreException("Invalid pointers passed to Log::Log"); - - if (Config) - this->bi = ChanServ; } Log::Log(const User *_u, const Anope::string &cat, const BotInfo *_bi) : bi(_bi), u(_u), nc(NULL), c(NULL), chan(NULL), ci(NULL), s(NULL), m(NULL), type(LOG_USER), category(cat) @@ -113,9 +110,6 @@ Log::Log(Server *serv, const Anope::string &cat, const BotInfo *_bi) : bi(_bi), { if (!s) throw CoreException("Invalid pointer passed to Log::Log"); - - if (!this->bi) - this->bi = OperServ; } Log::Log(const BotInfo *b, const Anope::string &cat) : bi(b), u(NULL), nc(NULL), c(NULL), chan(NULL), ci(NULL), s(NULL), m(NULL), type(LOG_NORMAL), category(cat) @@ -134,13 +128,13 @@ Log::~Log() std::cout << GetTimeStamp() << " " << this->BuildPrefix() << this->buf.str() << std::endl; else if (this->type == LOG_TERMINAL) std::cout << this->BuildPrefix() << this->buf.str() << std::endl; + + FOREACH_MOD(I_OnLog, OnLog(this)); if (Config) for (unsigned i = 0; i < Config->LogInfos.size(); ++i) if (Config->LogInfos[i].HasType(this->type, this->category)) Config->LogInfos[i].ProcessMessage(this); - - FOREACH_MOD(I_OnLog, OnLog(this)); } Anope::string Log::BuildPrefix() const diff --git a/src/main.cpp b/src/main.cpp index 99174279b..576df28a6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -47,20 +47,30 @@ class UpdateTimer : public Timer public: UpdateTimer(time_t timeout) : Timer(timeout, Anope::CurTime, true) { } - void Tick(time_t) + void Tick(time_t) anope_override { Anope::SaveDatabases(); } }; +class ExpireTimer : public Timer +{ + public: + ExpireTimer(time_t timeout) : Timer(timeout, Anope::CurTime, true) { } + + void Tick(time_t) anope_override + { + FOREACH_MOD(I_OnExpireTick, OnExpireTick()); + } +}; + void Anope::SaveDatabases() { if (Anope::ReadOnly) return; - EventReturn MOD_RESULT; - FOREACH_RESULT(I_OnSaveDatabase, OnSaveDatabase()); Log(LOG_DEBUG) << "Saving databases"; + FOREACH_MOD(I_OnSaveDatabase, OnSaveDatabase()); } /** The following comes from InspIRCd to get the full path of the Anope executable @@ -100,8 +110,6 @@ static Anope::string GetFullProgDir(const Anope::string &argv0) return "/"; } -/*************************************************************************/ - /* Main routine. (What does it look like? :-) ) */ int main(int ac, char **av, char **envp) @@ -150,6 +158,7 @@ int main(int ac, char **av, char **envp) /* Set up timers */ time_t last_check = Anope::CurTime; UpdateTimer updateTimer(Config->GetBlock("options")->Get<time_t>("updatetimeout")); + ExpireTimer expireTimer(Config->GetBlock("options")->Get<time_t>("expiretimeout")); /*** Main loop. ***/ while (!Anope::Quitting) diff --git a/src/memos.cpp b/src/memos.cpp index b3f044e1e..a6cd6031a 100644 --- a/src/memos.cpp +++ b/src/memos.cpp @@ -75,7 +75,7 @@ Serializable* Memo::Unserialize(Serializable *obj, Serialize::Data &data) return m; } -MemoInfo::MemoInfo() : memos("Memo") +MemoInfo::MemoInfo() : memomax(0), memos("Memo") { } diff --git a/src/messages.cpp b/src/messages.cpp index 5a688a89c..d9a89ef46 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -49,7 +49,7 @@ void Error::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) Anope::Quitting = true; } -void Invite::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) anope_override +void Invite::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) { User *targ = User::Find(params[0]); Channel *c = Channel::Find(params[1]); @@ -101,7 +101,7 @@ void Join::SJoin(MessageSource &source, const Anope::string &chan, time_t ts, co bool keep_their_modes = true; if (created) - c->Extend("SYNCING"); + c->syncing = true; /* Some IRCds do not include a TS */ else if (!ts) ; @@ -120,7 +120,7 @@ void Join::SJoin(MessageSource &source, const Anope::string &chan, time_t ts, co /* If we are syncing, mlock is checked later in Channel::Sync. It is important to not check it here * so that Channel::SetCorrectModes can correctly detect the presence of channel mode +r. */ - c->SetModesInternal(source, modes, ts, !c->HasExt("SYNCING")); + c->SetModesInternal(source, modes, ts, !c->syncing); for (std::list<SJoinUser>::const_iterator it = users.begin(), it_end = users.end(); it != it_end; ++it) { @@ -137,16 +137,16 @@ void Join::SJoin(MessageSource &source, const Anope::string &chan, time_t ts, co /* Set whatever modes the user should have, and remove any that * they aren't allowed to have (secureops etc). */ - c->SetCorrectModes(u, true, true); + c->SetCorrectModes(u, true); if (c->ci) c->ci->CheckKick(u); } /* Channel is done syncing */ - if (c->HasExt("SYNCING")) + if (c->syncing) { - c->Shrink("SYNCING"); + c->syncing = false; /* Sync the channel (mode lock, topic, etc) */ /* the channel is synced when the netmerge is complete */ if (Me && Me->IsSynced()) @@ -444,7 +444,6 @@ void Version::Run(MessageSource &source, const std::vector<Anope::string> ¶m { Module *enc = ModuleManager::FindFirstOf(ENCRYPTION); IRCD->SendNumeric(351, source.GetSource(), "Anope-%s %s :%s -(%s) -- %s", Anope::Version().c_str(), Me->GetName().c_str(), IRCD->GetProtocolName().c_str(), enc ? enc->name.c_str() : "(none)", Anope::VersionBuildString().c_str()); - return; } void Whois::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) @@ -464,7 +463,5 @@ void Whois::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) } else IRCD->SendNumeric(401, source.GetSource(), "%s :No such user.", params[0].c_str()); - - return; } diff --git a/src/misc.cpp b/src/misc.cpp index b446ea711..6fb9e8c91 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -478,6 +478,7 @@ void Anope::Encrypt(const Anope::string &src, Anope::string &dest) { EventReturn MOD_RESULT; FOREACH_RESULT(I_OnEncrypt, OnEncrypt(src, dest)); + static_cast<void>(MOD_RESULT); } bool Anope::Decrypt(const Anope::string &src, Anope::string &dest) diff --git a/src/modes.cpp b/src/modes.cpp index 651fbafd9..2e9a49f09 100644 --- a/src/modes.cpp +++ b/src/modes.cpp @@ -14,9 +14,11 @@ #include "protocol.h" #include "channels.h" +struct StackerInfo; + /* List of pairs of user/channels and their stacker info */ -std::map<User *, StackerInfo *> ModeManager::UserStackerObjects; -std::map<Channel *, StackerInfo *> ModeManager::ChannelStackerObjects; +static std::map<User *, StackerInfo *> UserStackerObjects; +static std::map<Channel *, StackerInfo *> ChannelStackerObjects; /* List of all modes Anope knows about */ std::vector<ChannelMode *> ModeManager::ChannelModes; @@ -31,6 +33,25 @@ static std::vector<ChannelModeStatus *> ChannelModesByStatus; /* Number of generic modes we support */ unsigned ModeManager::GenericChannelModes = 0, ModeManager::GenericUserModes = 0; +struct StackerInfo +{ + /* Modes to be added */ + std::list<std::pair<Mode *, Anope::string> > AddModes; + /* Modes to be deleted */ + std::list<std::pair<Mode *, Anope::string> > DelModes; + /* Bot this is sent from */ + const BotInfo *bi; + + StackerInfo() : bi(NULL) { } + + /** Add a mode to this object + * @param mode The mode + * @param set true if setting, false if unsetting + * @param param The param for the mode + */ + void AddMode(Mode *mode, bool set, const Anope::string ¶m); +}; + ChannelStatus::ChannelStatus() { } @@ -255,7 +276,11 @@ static StackerInfo *GetInfo(List &l, Object *o) return s; } -std::list<Anope::string> ModeManager::BuildModeStrings(StackerInfo *info) +/** Build a list of mode strings to send to the IRCd from the mode stacker + * @param info The stacker info for a channel or user + * @return a list of strings + */ +static std::list<Anope::string> BuildModeStrings(StackerInfo *info) { std::list<Anope::string> ret; std::list<std::pair<Mode *, Anope::string> >::iterator it, it_end; @@ -521,8 +546,6 @@ void ModeManager::StackerAdd(const BotInfo *bi, User *u, UserMode *um, bool Set, s->AddMode(um, Set, Param); if (bi) s->bi = bi; - else - s->bi = NULL; if (!modePipe) modePipe = new ModePipe(); diff --git a/src/nickalias.cpp b/src/nickalias.cpp index 4e7d5b46a..327340a1d 100644 --- a/src/nickalias.cpp +++ b/src/nickalias.cpp @@ -77,115 +77,6 @@ NickAlias::~NickAlias() NickAliasList->erase(this->nick); } -void NickAlias::Release() -{ - if (this->HasExt("HELD")) - { - if (IRCD->CanSVSHold) - IRCD->SendSVSHoldDel(this->nick); - else - { - User *u = User::Find(this->nick); - if (u && u->server == Me) - { - u->Quit(); - } - } - - this->Shrink("HELD"); - } -} - -/** Timers for removing HELD status from nicks. - */ -class NickServHeld : public Timer -{ - static std::map<Anope::string, NickServHeld *> NickServHelds; - - Reference<NickAlias> na; - Anope::string nick; - public: - NickServHeld(NickAlias *n, long l) : Timer(l), na(n), nick(na->nick) - { - std::map<Anope::string, NickServHeld *>::iterator nit = NickServHelds.find(na->nick); - if (nit != NickServHelds.end()) - delete nit->second; - - NickServHelds[na->nick] = this; - } - - ~NickServHeld() - { - NickServHelds.erase(this->nick); - } - - void Tick(time_t) - { - if (na) - na->Shrink("HELD"); - } -}; -std::map<Anope::string, NickServHeld *> NickServHeld::NickServHelds; - -/** Timers for releasing nicks to be available for use - */ -class CoreExport NickServRelease : public User, public Timer -{ - static std::map<Anope::string, NickServRelease *> NickServReleases; - Anope::string nick; - - public: - /** Constructor - * @param na The nick - * @param delay The delay before the nick is released - */ - NickServRelease(NickAlias *na, time_t delay) : User(na->nick, Config->GetBlock("options")->Get<const Anope::string>("enforceruser"), - Config->GetBlock("options")->Get<const Anope::string>("enforcerhost"), "", "", Me, "Services Enforcer", Anope::CurTime, "", Servers::TS6_UID_Retrieve()), Timer(delay), nick(na->nick) - { - /* Erase the current release timer and use the new one */ - std::map<Anope::string, NickServRelease *>::iterator nit = NickServReleases.find(this->nick); - if (nit != NickServReleases.end()) - { - IRCD->SendQuit(nit->second, ""); - delete nit->second; - } - - NickServReleases.insert(std::make_pair(this->nick, this)); - - IRCD->SendClientIntroduction(this); - } - - virtual ~NickServRelease() - { - NickServReleases.erase(this->nick); - } - - /** Called when the delay is up - * @param t The current time - */ - void Tick(time_t t) - { - IRCD->SendQuit(this, ""); - } -}; -std::map<Anope::string, NickServRelease *> NickServRelease::NickServReleases; - -void NickAlias::OnCancel(User *) -{ - if (this->HasExt("COLLIDED")) - { - this->Extend("HELD"); - this->Shrink("COLLIDED"); - - new NickServHeld(this, Config->GetBlock("options")->Get<time_t>("releasetimeout")); - - if (IRCD->CanSVSHold) - IRCD->SendSVSHold(this->nick, Config->GetBlock("options")->Get<time_t>("releasetimeout")); - else - new NickServRelease(this, Config->GetBlock("options")->Get<time_t>("releasetimeout")); - } -} - void NickAlias::SetVhost(const Anope::string &ident, const Anope::string &host, const Anope::string &creator, time_t created) { this->vhost_ident = ident; diff --git a/src/nickcore.cpp b/src/nickcore.cpp index e2b47e953..9e2ff8dbb 100644 --- a/src/nickcore.cpp +++ b/src/nickcore.cpp @@ -25,7 +25,6 @@ NickCore::NickCore(const Anope::string &coredisplay) : Serializable("NickCore"), this->o = NULL; this->channelcount = 0; this->lastmail = 0; - this->memos.memomax = 0; this->display = coredisplay; @@ -51,10 +50,8 @@ NickCore::~NickCore() } this->users.clear(); - /* Remove the core from the list */ NickCoreList->erase(this->display); - /* Clear access before deleting display name, we want to be able to use the display name in the clear access event */ this->ClearAccess(); if (!this->memos.memos->empty()) diff --git a/src/protocol.cpp b/src/protocol.cpp index 052ebd8fc..ccd58c95f 100644 --- a/src/protocol.cpp +++ b/src/protocol.cpp @@ -372,7 +372,7 @@ bool IRCDProto::IsHostValid(const Anope::string &host) void IRCDProto::SendOper(User *u) { SendNumericInternal(381, u->GetUID(), ":You are now an IRC operator (set by services)"); - u->SetMode(OperServ, "OPER"); + u->SetMode(NULL, "OPER"); } unsigned IRCDProto::GetMaxListFor(Channel *c) diff --git a/src/regchannel.cpp b/src/regchannel.cpp index 4ed7b4d86..2fcb3ca14 100644 --- a/src/regchannel.cpp +++ b/src/regchannel.cpp @@ -359,8 +359,6 @@ ChannelInfo::~ChannelInfo() if (this->c) { - this->Shrink("PERSIST"); - if (this->bi && this->c->FindUser(this->bi)) this->bi->Part(this->c); @@ -565,10 +563,14 @@ BotInfo *ChannelInfo::WhoSends() const { if (this && this->bi) return this->bi; - else if (ChanServ) + + BotInfo *ChanServ = Config->GetClient("ChanServ"); + if (ChanServ) return ChanServ; - else if (!BotListByNick->empty()) + + if (!BotListByNick->empty()) return BotListByNick->begin()->second; + return NULL; } @@ -1041,39 +1043,6 @@ bool ChannelInfo::CheckKick(User *user) return true; } -void ChannelInfo::CheckTopic() -{ - if (!this->c) - return; - - /* We only compare the topics here, not the time or setter. This is because some (old) IRCds do not - * allow us to set the topic as someone else, meaning we have to bump the TS and change the setter to us. - * This desyncs what is really set with what we have stored, and we end up resetting the topic often when - * it is not required - */ - if (this->HasExt("TOPICLOCK") && this->last_topic != this->c->topic) - { - this->c->ChangeTopic(this->last_topic_setter, this->last_topic, this->last_topic_time); - } - else - { - this->last_topic = this->c->topic; - this->last_topic_setter = this->c->topic_setter; - this->last_topic_time = this->c->topic_ts; - } -} - -void ChannelInfo::RestoreTopic() -{ - if (!this->c) - return; - - if ((this->HasExt("KEEPTOPIC") || this->HasExt("TOPICLOCK")) && this->last_topic != this->c->topic) - { - this->c->ChangeTopic(!this->last_topic_setter.empty() ? this->last_topic_setter : this->WhoSends()->nick, this->last_topic, this->last_topic_time ? this->last_topic_time : Anope::CurTime); - } -} - int16_t ChannelInfo::GetLevel(const Anope::string &priv) const { if (PrivilegeManager::FindPrivilege(priv) == NULL) diff --git a/src/servers.cpp b/src/servers.cpp index 0c1019216..d8fc84a81 100644 --- a/src/servers.cpp +++ b/src/servers.cpp @@ -247,33 +247,6 @@ void Server::Sync(bool sync_links) if (this->GetUplink() && this->GetUplink() == Me) { - for (registered_channel_map::iterator it = RegisteredChannelList->begin(), it_end = RegisteredChannelList->end(); it != it_end; ++it) - { - ChannelInfo *ci = it->second; - if (ci->HasExt("PERSIST")) - { - bool created; - ci->c = Channel::FindOrCreate(ci->name, created, ci->time_registered); - - if (ModeManager::FindChannelModeByName("PERM") != NULL) - { - if (created) - IRCD->SendChannel(ci->c); - ci->c->SetMode(NULL, "PERM"); - } - else - { - if (!ci->bi) - ci->WhoSends()->Assign(NULL, ci); - if (ci->c->FindUser(ci->bi) == NULL) - { - ChannelStatus status(Config->GetModule("botserv")->Get<const Anope::string>("botmodes")); - ci->bi->Join(ci->c, &status); - } - } - } - } - FOREACH_MOD(I_OnPreUplinkSync, OnPreUplinkSync(this)); for (channel_map::const_iterator it = ChannelList.begin(), it_end = ChannelList.end(); it != it_end; ++it) @@ -347,8 +320,6 @@ Server *Server::Find(const Anope::string &name, bool name_only) return NULL; } -/*************************************************************************/ - static inline char& nextID(char &c) { if (c == 'Z') diff --git a/src/tools/anopesmtp.cpp b/src/tools/anopesmtp.cpp index 9d94564a9..c14f2ca23 100644 --- a/src/tools/anopesmtp.cpp +++ b/src/tools/anopesmtp.cpp @@ -65,8 +65,6 @@ extern int connect(int, struct sockaddr *, int); # endif #endif -/*************************************************************************/ - #ifdef _WIN32 typedef SOCKET ano_socket_t; #define ano_sockclose(fd) closesocket(fd) @@ -141,8 +139,6 @@ void alog(const char *fmt, ...) file.close(); } -/*************************************************************************/ - /* Remove a trailing \r\n */ std::string strip(const std::string &buf) { @@ -156,8 +152,6 @@ std::string strip(const std::string &buf) return newbuf; } -/*************************************************************************/ - /* Is the buffer a header? */ bool smtp_is_header(const std::string &buf) { @@ -171,8 +165,6 @@ bool smtp_is_header(const std::string &buf) return false; } -/*************************************************************************/ - /* Parse a header into a name and value */ void smtp_parse_header(const std::string &buf, std::string &header, std::string &value) { @@ -191,8 +183,6 @@ void smtp_parse_header(const std::string &buf, std::string &header, std::string } } -/*************************************************************************/ - /* Have we reached the end of input? */ bool smtp_is_end(const std::string &buf) { @@ -203,8 +193,6 @@ bool smtp_is_end(const std::string &buf) return false; } -/*************************************************************************/ - /* Set who the email is to */ void smtp_set_to(const std::string &to) { @@ -217,8 +205,6 @@ void smtp_set_to(const std::string &to) } } -/*************************************************************************/ - /* Establish a connection to the SMTP server */ int smtp_connect(const char *host, unsigned short port) { @@ -245,8 +231,6 @@ int smtp_connect(const char *host, unsigned short port) return 1; } -/*************************************************************************/ - /* Send a line of text */ int smtp_send(const char *text) { @@ -260,8 +244,6 @@ int smtp_send(const char *text) return result; } -/*************************************************************************/ - /* Read a line of text */ int smtp_read(char *buf, int len) { @@ -276,8 +258,6 @@ int smtp_read(char *buf, int len) return result; } -/*************************************************************************/ - /* Retrieve a response code */ int smtp_get_code(const std::string &text) { @@ -289,8 +269,6 @@ int smtp_get_code(const std::string &text) return atol(text.substr(0, tmp).c_str()); } -/*************************************************************************/ - /* Send the email */ int smtp_send_email() { @@ -424,16 +402,12 @@ int smtp_send_email() return 1; } -/*************************************************************************/ - void smtp_disconnect() { smtp_send("QUIT\r\n"); ano_sockclose(smail.sock); } -/*************************************************************************/ - int main(int argc, char *argv[]) { /* Win32 stuff */ diff --git a/src/users.cpp b/src/users.cpp index 8d0606ab1..cba624104 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -150,7 +150,7 @@ const Anope::string &User::GetDisplayedHost() const void User::SetCloakedHost(const Anope::string &newhost) { if (newhost.empty()) - throw "empty host in User::SetCloakedHost"; + throw CoreException("empty host in User::SetCloakedHost"); chost = newhost; @@ -278,88 +278,23 @@ void User::SendMessage(const BotInfo *source, const Anope::string &msg) * - The user is not registered and NSDefMsg is enabled * - The user is registered and has set /ns set msg on */ + bool send_privmsg = Config->UsePrivmsg && ((!this->nc && Config->DefPrivmsg) || (this->nc && this->nc->HasExt("MSG"))); sepstream sep(translated_message, '\n', true); for (Anope::string tok; sep.GetToken(tok);) { - if (Config->UsePrivmsg && ((!this->nc && Config->DefPrivmsg) || (this->nc && this->nc->HasExt("MSG")))) + if (send_privmsg) IRCD->SendPrivmsg(source, this->GetUID(), "%s", tok.c_str()); else IRCD->SendNotice(source, this->GetUID(), "%s", tok.c_str()); } } -/** Collides a nick. - * - * First, it marks the nick as COLLIDED, this is checked in NickAlias::OnCancel. - * - * Then it does one of two things. - * - * 1. This will force change the users nick to the guest nick. This gets processed by the IRCd and comes - * back as a nick change, which calls NickAlias::OnCancel - * with the users old nick's nickalias (if there is one). - * - * 2. Calls User::Kill, which kills the user and deletes the user at the end of the I/O loop. - * Users destructor then calls NickAlias::OnCancel - * - * NickAlias::OnCancel checks for NS_COLLIDED, it then does one of two things. - * - * 1. If supported, we send a SVSHold for the user. We are done here, the IRCds expires this at the time we give it. - * - * 2. We create a new client with SendClientIntroduction(). Note that is it important that this is called either after the - * user has been removed from our internal list of user or after the users nick has been updated completely internally. - * We then create a release timer for this new client that waits and later on sends a QUIT for the client. Release timers - * are never used for SVSHolds. Ever. - * - * - * Note that now for the timers we only store the users name, not the NickAlias* pointer. We never remove timers when - * a user changes nick or a nick is deleted, the timers must assume that either of these may have happend. - * - * Adam - */ -void User::Collide(NickAlias *na) -{ - if (na) - na->Extend("COLLIDED"); - - if (IRCD->CanSVSNick) - { - const Anope::string &guestprefix = Config->GetBlock("options")->Get<const Anope::string>("guestnickprefix"); - - Anope::string guestnick; - - int i = 0; - do - { - guestnick = guestprefix + stringify(static_cast<uint16_t>(rand())); - } while (User::Find(guestnick) && i++ < 10); - - if (i == 11) - this->Kill(NickServ ? NickServ->nick : "", "Services nickname-enforcer kill"); - else - { - if (NickServ) - this->SendMessage(NickServ, _("Your nickname is now being changed to \002%s\002"), guestnick.c_str()); - IRCD->SendForceNickChange(this, guestnick, Anope::CurTime); - } - } - else - this->Kill(NickServ ? NickServ->nick : "", "Services nickname-enforcer kill"); -} - void User::Identify(NickAlias *na) { - if (!na) - { - Log() << "User::Identify() called with NULL pointer"; - return; - } - if (this->nick.equals_ci(na->nick)) { - Anope::string last_usermask = this->GetIdent() + "@" + this->GetDisplayedHost(); - Anope::string last_realhost = this->GetIdent() + "@" + this->host; - na->last_usermask = last_usermask; - na->last_realhost = last_realhost; + na->last_usermask = this->GetIdent() + "@" + this->GetDisplayedHost(); + na->last_realhost = this->GetIdent() + "@" + this->host; na->last_realname = this->realname; na->last_seen = Anope::CurTime; } @@ -367,27 +302,21 @@ void User::Identify(NickAlias *na) this->Login(na->nc); IRCD->SendLogin(this); - const NickAlias *this_na = NickAlias::Find(this->nick); - if (!Config->GetBlock("options")->Get<bool>("nonicknameownership") && this_na && this_na->nc == *na->nc && na->nc->HasExt("UNCONFIRMED") == false) - this->SetMode(NickServ, "REGISTERED"); - FOREACH_MOD(I_OnNickIdentify, OnNickIdentify(this)); if (this->IsServicesOper()) { if (!this->nc->o->ot->modes.empty()) { - this->SetModes(OperServ, "%s", this->nc->o->ot->modes.c_str()); - if (OperServ) - this->SendMessage(OperServ, "Changing your usermodes to \002%s\002", this->nc->o->ot->modes.c_str()); + this->SetModes(NULL, "%s", this->nc->o->ot->modes.c_str()); + this->SendMessage(NULL, "Changing your usermodes to \002%s\002", this->nc->o->ot->modes.c_str()); UserMode *um = ModeManager::FindUserModeByName("OPER"); if (um && !this->HasMode("OPER") && this->nc->o->ot->modes.find(um->mchar) != Anope::string::npos) IRCD->SendOper(this); } if (IRCD->CanSetVHost && !this->nc->o->vhost.empty()) { - if (OperServ) - this->SendMessage(OperServ, "Changing your vhost to \002%s\002", this->nc->o->vhost.c_str()); + this->SendMessage(NULL, "Changing your vhost to \002%s\002", this->nc->o->vhost.c_str()); this->SetDisplayedHost(this->nc->o->vhost); IRCD->SendVhost(this, "", this->nc->o->vhost); } @@ -408,6 +337,8 @@ void User::Login(NickCore *core) if (this->server->IsSynced()) Log(this, "account") << "is now identified as " << this->nc->display; + + FOREACH_MOD(I_OnUserLogin, OnUserLogin(this)); } void User::Logout() diff --git a/src/xline.cpp b/src/xline.cpp index efe19411f..66bb6d308 100644 --- a/src/xline.cpp +++ b/src/xline.cpp @@ -44,7 +44,7 @@ void XLine::InitRegex() } } -XLine::XLine(const Anope::string &ma, const Anope::string &r, const Anope::string &uid) : Serializable("XLine"), mask(ma), by(OperServ ? OperServ->nick : ""), created(0), expires(0), reason(r), id(uid) +XLine::XLine(const Anope::string &ma, const Anope::string &r, const Anope::string &uid) : Serializable("XLine"), mask(ma), created(0), expires(0), reason(r), id(uid) { regex = NULL; manager = NULL; |