diff options
author | Adam <Adam@anope.org> | 2016-07-28 21:29:35 -0400 |
---|---|---|
committer | Adam <Adam@anope.org> | 2016-07-28 21:29:35 -0400 |
commit | 0e758a2ac23dc4a001e8e126cec14588da9a9769 (patch) | |
tree | 45df813323e023c5c89db7279426c4ad0943b4a9 /src | |
parent | a3c8afae00c54d5b95c620248b51f90679d7d53f (diff) |
Allow serializable fields to use storage in the respective objects.
Split service management code nito a proper servicemanager. Make service
references managed instead of lazy lookup. Also made events and
serializable use service manager instead of their respective systems for
management
Diffstat (limited to 'src')
-rw-r--r-- | src/accessgroup.cpp | 106 | ||||
-rw-r--r-- | src/base.cpp | 3 | ||||
-rw-r--r-- | src/bots.cpp | 38 | ||||
-rw-r--r-- | src/channels.cpp | 33 | ||||
-rw-r--r-- | src/command.cpp | 17 | ||||
-rw-r--r-- | src/config.cpp | 29 | ||||
-rw-r--r-- | src/event.cpp | 101 | ||||
-rw-r--r-- | src/extensible.cpp | 6 | ||||
-rw-r--r-- | src/init.cpp | 10 | ||||
-rw-r--r-- | src/logger.cpp | 20 | ||||
-rw-r--r-- | src/main.cpp | 8 | ||||
-rw-r--r-- | src/messages.cpp | 30 | ||||
-rw-r--r-- | src/misc.cpp | 11 | ||||
-rw-r--r-- | src/modes.cpp | 19 | ||||
-rw-r--r-- | src/modulemanager.cpp | 8 | ||||
-rw-r--r-- | src/opertype.cpp | 6 | ||||
-rw-r--r-- | src/process.cpp | 7 | ||||
-rw-r--r-- | src/serialize.cpp | 180 | ||||
-rw-r--r-- | src/servers.cpp | 10 | ||||
-rw-r--r-- | src/service.cpp | 106 | ||||
-rw-r--r-- | src/service_manager.cpp | 144 | ||||
-rw-r--r-- | src/uplink.cpp | 6 | ||||
-rw-r--r-- | src/users.cpp | 57 | ||||
-rw-r--r-- | src/xline.cpp | 70 |
24 files changed, 549 insertions, 476 deletions
diff --git a/src/accessgroup.cpp b/src/accessgroup.cpp new file mode 100644 index 000000000..0d2f7bbe0 --- /dev/null +++ b/src/accessgroup.cpp @@ -0,0 +1,106 @@ +#include "modules/chanserv.h"
+#include "accessgroup.h"
+
+using namespace ChanServ;
+
+bool AccessGroup::HasPriv(const Anope::string &priv)
+{
+ if (this->super_admin)
+ return true;
+ else if (!ci || ci->GetLevel(priv) == ACCESS_INVALID)
+ return false;
+
+ /* Privileges prefixed with auto are understood to be given
+ * automatically. Sometimes founders want to not automatically
+ * obtain privileges, so we will let them */
+ bool auto_mode = !priv.find("AUTO");
+
+ /* Only grant founder privilege if this isn't an auto mode or if they don't match any entries in this group */
+ if ((!auto_mode || this->empty()) && this->founder)
+ return true;
+
+ EventReturn MOD_RESULT = EventManager::Get()->Dispatch(&::Event::GroupCheckPriv::OnGroupCheckPriv, this, priv);
+ if (MOD_RESULT != EVENT_CONTINUE)
+ return MOD_RESULT == EVENT_ALLOW;
+
+ for (unsigned i = this->size(); i > 0; --i)
+ {
+ ChanAccess *access = this->at(i - 1);
+
+ if (access->HasPriv(priv))
+ return true;
+ }
+
+ return false;
+}
+
+ChanAccess *AccessGroup::Highest()
+{
+ ChanAccess *highest = NULL;
+ for (unsigned i = 0; i < this->size(); ++i)
+ if (highest == NULL || *this->at(i) > *highest)
+ highest = this->at(i);
+ return highest;
+}
+
+bool AccessGroup::operator>(AccessGroup &other)
+{
+ if (other.super_admin)
+ return false;
+ else if (this->super_admin)
+ return true;
+ else if (other.founder)
+ return false;
+ else if (this->founder)
+ return true;
+
+ const std::vector<Privilege> &privs = service->GetPrivileges();
+ for (unsigned i = privs.size(); i > 0; --i)
+ {
+ bool this_p = this->HasPriv(privs[i - 1].name),
+ other_p = other.HasPriv(privs[i - 1].name);
+
+ if (!this_p && !other_p)
+ continue;
+
+ return this_p && !other_p;
+ }
+
+ return false;
+}
+
+bool AccessGroup::operator<(AccessGroup &other)
+{
+ if (this->super_admin)
+ return false;
+ else if (other.super_admin)
+ return true;
+ else if (this->founder)
+ return false;
+ else if (other.founder)
+ return true;
+
+ const std::vector<Privilege> &privs = service->GetPrivileges();
+ for (unsigned i = privs.size(); i > 0; --i)
+ {
+ bool this_p = this->HasPriv(privs[i - 1].name),
+ other_p = other.HasPriv(privs[i - 1].name);
+
+ if (!this_p && !other_p)
+ continue;
+
+ return !this_p && other_p;
+ }
+
+ return false;
+}
+
+bool AccessGroup::operator>=(AccessGroup &other)
+{
+ return !(*this < other);
+}
+
+bool AccessGroup::operator<=(AccessGroup &other)
+{
+ return !(*this > other);
+}
\ No newline at end of file diff --git a/src/base.cpp b/src/base.cpp index 0fcd868bc..61dcbdf60 100644 --- a/src/base.cpp +++ b/src/base.cpp @@ -10,9 +10,8 @@ #include "services.h" #include "anope.h" #include "service.h" +#include "base.h" -std::map<Anope::string, std::map<Anope::string, Service *> > *Service::Services = NULL; -std::map<Anope::string, std::map<Anope::string, Anope::string> > *Service::Aliases = NULL; std::set<ReferenceBase *> *ReferenceBase::references = NULL; ReferenceBase::ReferenceBase() diff --git a/src/bots.cpp b/src/bots.cpp index f934676bb..6091756f7 100644 --- a/src/bots.cpp +++ b/src/bots.cpp @@ -26,7 +26,7 @@ ServiceBot::ServiceBot(const Anope::string &nnick, const Anope::string &nuser, c this->lastmsg = Anope::CurTime; this->introduced = false; - bi = botinfo.Create(); + bi = Serialize::New<BotInfo *>(); bi->bot = this; bi->SetNick(nnick); @@ -35,7 +35,7 @@ ServiceBot::ServiceBot(const Anope::string &nnick, const Anope::string &nuser, c bi->SetRealName(nreal); bi->SetCreated(Anope::CurTime); - Event::OnCreateBot(&Event::CreateBot::OnCreateBot, this); + EventManager::Get()->Dispatch(&Event::CreateBot::OnCreateBot, this); // If we're synchronised with the uplink already, send the bot. if (Me && Me->IsSynced()) @@ -57,13 +57,13 @@ ServiceBot::~ServiceBot() bi->bot = nullptr; bi->Delete(); - Event::OnDelBot(&Event::DelBot::OnDelBot, this); + EventManager::Get()->Dispatch(&Event::DelBot::OnDelBot, this); // If we're synchronised with the uplink already, send the bot. if (Me && Me->IsSynced()) { IRCD->SendQuit(this, ""); - Event::OnUserQuit(&Event::UserQuit::OnUserQuit, this, ""); + EventManager::Get()->Dispatch(&Event::UserQuit::OnUserQuit, this, ""); this->introduced = false; // XXX ? //XLine x(this->nick); @@ -106,13 +106,13 @@ void ServiceBot::SetNewNick(const Anope::string &newnick) std::vector<ChanServ::Channel *> ServiceBot::GetChannels() const { - return bi->GetRefs<ChanServ::Channel *>(ChanServ::channel); + return bi->GetRefs<ChanServ::Channel *>(); } void ServiceBot::Assign(User *u, ChanServ::Channel *ci) { EventReturn MOD_RESULT; - MOD_RESULT = Event::OnPreBotAssign(&Event::PreBotAssign::OnPreBotAssign, u, ci, this); + MOD_RESULT = EventManager::Get()->Dispatch(&Event::PreBotAssign::OnPreBotAssign, u, ci, this); if (MOD_RESULT == EVENT_STOP) return; @@ -121,13 +121,13 @@ void ServiceBot::Assign(User *u, ChanServ::Channel *ci) ci->SetBot(this); - Event::OnBotAssign(&Event::BotAssign::OnBotAssign, u, ci, this); + EventManager::Get()->Dispatch(&Event::BotAssign::OnBotAssign, u, ci, this); } void ServiceBot::UnAssign(User *u, ChanServ::Channel *ci) { EventReturn MOD_RESULT; - MOD_RESULT = Event::OnBotUnAssign(&Event::BotUnAssign::OnBotUnAssign, u, ci); + MOD_RESULT = EventManager::Get()->Dispatch(&Event::BotUnAssign::OnBotUnAssign, u, ci); if (MOD_RESULT == EVENT_STOP) return; @@ -156,7 +156,7 @@ void ServiceBot::Join(Channel *c, ChannelStatus *status) if (IRCD) IRCD->SendJoin(this, c, status); - Event::OnJoinChannel(&Event::JoinChannel::OnJoinChannel, this, c); + EventManager::Get()->Dispatch(&Event::JoinChannel::OnJoinChannel, this, c); } void ServiceBot::Join(const Anope::string &chname, ChannelStatus *status) @@ -170,13 +170,13 @@ void ServiceBot::Part(Channel *c, const Anope::string &reason) if (c->FindUser(this) == NULL) return; - Event::OnPrePartChannel(&Event::PrePartChannel::OnPrePartChannel, this, c); + EventManager::Get()->Dispatch(&Event::PrePartChannel::OnPrePartChannel, this, c); IRCD->SendPart(this, c, "%s", !reason.empty() ? reason.c_str() : ""); c->DeleteUser(this); - Event::OnPartChannel(&Event::PartChannel::OnPartChannel, this, c, c->name, reason); + EventManager::Get()->Dispatch(&Event::PartChannel::OnPartChannel, this, c, c->name, reason); } void ServiceBot::OnMessage(User *u, const Anope::string &message) @@ -259,9 +259,9 @@ bool BotInfo::GetOperOnly() return Get(&BotInfoType::operonly); } -void BotInfo::SetNick(const Anope::string &nick) +void BotInfo::SetNick(const Anope::string &n) { - Set(&BotInfoType::nick, nick); + Set(&BotInfoType::nick, n); } Anope::string BotInfo::GetNick() @@ -269,9 +269,9 @@ Anope::string BotInfo::GetNick() return Get(&BotInfoType::nick); } -void BotInfo::SetUser(const Anope::string &user) +void BotInfo::SetUser(const Anope::string &u) { - Set(&BotInfoType::user, user); + Set(&BotInfoType::user, u); } Anope::string BotInfo::GetUser() @@ -279,9 +279,9 @@ Anope::string BotInfo::GetUser() return Get(&BotInfoType::user); } -void BotInfo::SetHost(const Anope::string &host) +void BotInfo::SetHost(const Anope::string &h) { - Set(&BotInfoType::host, host); + Set(&BotInfoType::host, h); } Anope::string BotInfo::GetHost() @@ -289,9 +289,9 @@ Anope::string BotInfo::GetHost() return Get(&BotInfoType::host); } -void BotInfo::SetRealName(const Anope::string &realname) +void BotInfo::SetRealName(const Anope::string &r) { - Set(&BotInfoType::realname, realname); + Set(&BotInfoType::realname, r); } Anope::string BotInfo::GetRealName() diff --git a/src/channels.cpp b/src/channels.cpp index e1529b270..7a380b547 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -43,12 +43,12 @@ Channel::Channel(const Anope::string &nname, time_t ts) if (Me && Me->IsSynced()) Log(NULL, this, "create"); - Event::OnChannelCreate(&Event::ChannelCreate::OnChannelCreate, this); + EventManager::Get()->Dispatch(&Event::ChannelCreate::OnChannelCreate, this); } Channel::~Channel() { - Event::OnChannelDelete(&Event::ChannelDelete::OnChannelDelete, this); + EventManager::Get()->Dispatch(&Event::ChannelDelete::OnChannelDelete, this); ModeManager::StackerDel(this); @@ -94,7 +94,7 @@ void Channel::Reset() void Channel::Sync() { syncing = false; - Event::OnChannelSync(&Event::ChannelSync::OnChannelSync, this); + EventManager::Get()->Dispatch(&Event::ChannelSync::OnChannelSync, this); CheckModes(); } @@ -112,7 +112,7 @@ void Channel::CheckModes() } Reference<Channel> ref = this; - Event::OnCheckModes(&Event::CheckModes::OnCheckModes, ref); + EventManager::Get()->Dispatch(&Event::CheckModes::OnCheckModes, ref); } bool Channel::CheckDelete() @@ -128,7 +128,7 @@ bool Channel::CheckDelete() return false; EventReturn MOD_RESULT; - MOD_RESULT = Event::OnCheckDelete(&Event::CheckDelete::OnCheckDelete, this); + MOD_RESULT = EventManager::Get()->Dispatch(&Event::CheckDelete::OnCheckDelete, this); return MOD_RESULT != EVENT_STOP && this->users.empty(); } @@ -152,7 +152,7 @@ void Channel::DeleteUser(User *user) if (user->server && user->server->IsSynced() && !user->Quitting()) Log(user, this, "leave"); - Event::OnLeaveChannel(&Event::LeaveChannel::OnLeaveChannel, user, this); + EventManager::Get()->Dispatch(&Event::LeaveChannel::OnLeaveChannel, user, this); ChanUserContainer *cu = user->FindChannel(this); if (!this->users.erase(user)) @@ -286,7 +286,7 @@ void Channel::SetModeInternal(const MessageSource &setter, ChannelMode *ocm, con if (cc) cc->status.AddMode(cm->mchar); - MOD_RESULT = Event::OnChannelModeSet(&Event::ChannelModeSet::OnChannelModeSet, this, setter, cm, param); + MOD_RESULT = EventManager::Get()->Dispatch(&Event::ChannelModeSet::OnChannelModeSet, this, setter, cm, param); /* Enforce secureops, etc */ if (enforce_mlock && MOD_RESULT != EVENT_STOP) @@ -307,7 +307,7 @@ void Channel::SetModeInternal(const MessageSource &setter, ChannelMode *ocm, con return; } - MOD_RESULT = Event::OnChannelModeSet(&Event::ChannelModeSet::OnChannelModeSet, this, setter, cm, param); + MOD_RESULT = EventManager::Get()->Dispatch(&Event::ChannelModeSet::OnChannelModeSet, this, setter, cm, param); /* Check if we should enforce mlock */ if (!enforce_mlock || MOD_RESULT == EVENT_STOP) @@ -350,7 +350,7 @@ void Channel::RemoveModeInternal(const MessageSource &setter, ChannelMode *ocm, if (cc) cc->status.DelMode(cm->mchar); - MOD_RESULT = Event::OnChannelModeUnset(&Event::ChannelModeUnset::OnChannelModeUnset, this, setter, cm, param); + MOD_RESULT = EventManager::Get()->Dispatch(&Event::ChannelModeUnset::OnChannelModeUnset, this, setter, cm, param); if (enforce_mlock && MOD_RESULT != EVENT_STOP) this->SetCorrectModes(u, false); @@ -370,7 +370,7 @@ void Channel::RemoveModeInternal(const MessageSource &setter, ChannelMode *ocm, else this->modes.erase(cm->name); - MOD_RESULT = Event::OnChannelModeUnset(&Event::ChannelModeUnset::OnChannelModeUnset, this, setter, cm, param); + MOD_RESULT = EventManager::Get()->Dispatch(&Event::ChannelModeUnset::OnChannelModeUnset, this, setter, cm, param); if (cm->name == "PERM") { @@ -740,13 +740,13 @@ bool Channel::KickInternal(const MessageSource &source, const Anope::string &nic ChannelStatus status = cu->status; - EventReturn MOD_RESULT = Event::OnPreUserKicked(&Event::PreUserKicked::OnPreUserKicked, source, cu, reason); + EventReturn MOD_RESULT = EventManager::Get()->Dispatch(&Event::PreUserKicked::OnPreUserKicked, source, cu, reason); if ((sender && sender->server == Me) || source.GetServer() == Me) if (MOD_RESULT == EVENT_STOP) return false; this->DeleteUser(target); - Event::OnUserKicked(&Event::UserKicked::OnUserKicked, source, target, this->name, status, reason); + EventManager::Get()->Dispatch(&Event::UserKicked::OnUserKicked, source, target, this->name, status, reason); return true; } @@ -780,7 +780,7 @@ void Channel::ChangeTopicInternal(User *u, const Anope::string &user, const Anop Log(LOG_DEBUG) << "Topic of " << this->name << " changed by " << this->topic_setter << " to " << newtopic; - Event::OnTopicUpdated(&Event::TopicUpdated::OnTopicUpdated, u, this, user, this->topic); + EventManager::Get()->Dispatch(&Event::TopicUpdated::OnTopicUpdated, u, this, user, this->topic); } void Channel::ChangeTopic(const Anope::string &user, const Anope::string &newtopic, time_t ts) @@ -794,7 +794,7 @@ void Channel::ChangeTopic(const Anope::string &user, const Anope::string &newtop /* Now that the topic is set update the time set. This is *after* we set it so the protocol modules are able to tell the old last set time */ this->topic_time = Anope::CurTime; - Event::OnTopicUpdated(&Event::TopicUpdated::OnTopicUpdated, nullptr, this, user, this->topic); + EventManager::Get()->Dispatch(&Event::TopicUpdated::OnTopicUpdated, nullptr, this, user, this->topic); } void Channel::SetCorrectModes(User *user, bool give_modes) @@ -812,7 +812,7 @@ void Channel::SetCorrectModes(User *user, bool give_modes) /* Initially only take modes if the channel is being created by a non netmerge */ bool take_modes = this->syncing && user->server->IsSynced(); - Event::OnSetCorrectModes(&Event::SetCorrectModes::OnSetCorrectModes, user, this, u_access, give_modes, take_modes); + EventManager::Get()->Dispatch(&Event::SetCorrectModes::OnSetCorrectModes, user, this, u_access, give_modes, take_modes); /* Never take modes from ulines */ if (user->server->IsULined()) @@ -883,8 +883,7 @@ bool Channel::CheckKick(User *user) Anope::string mask, reason; - EventReturn MOD_RESULT; - MOD_RESULT = Event::OnCheckKick(&Event::CheckKick::OnCheckKick, user, this, mask, reason); + EventReturn MOD_RESULT = EventManager::Get()->Dispatch(&Event::CheckKick::OnCheckKick, user, this, mask, reason); if (MOD_RESULT != EVENT_STOP) return false; diff --git a/src/command.cpp b/src/command.cpp index f7de4ccec..825bc1bc8 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -105,7 +105,7 @@ void CommandSource::Reply(const Anope::string &message) this->reply->SendMessage(*this->service, tok); } -Command::Command(Module *o, const Anope::string &sname, size_t minparams, size_t maxparams) : Service(o, "Command", sname), max_params(maxparams), min_params(minparams), module(owner) +Command::Command(Module *o, const Anope::string &sname, size_t minparams, size_t maxparams) : Service(o, "Command", sname), max_params(maxparams), min_params(minparams), module(o) { allow_unregistered = require_user = false; } @@ -205,20 +205,20 @@ void Command::Run(CommandSource &source, const Anope::string &message) if (it == source.service->commands.end()) { if (has_help) - source.Reply(_("Unknown command \002%s\002. \"%s%s HELP\" for help."), message.c_str(), Config->StrictPrivmsg.c_str(), source.service->nick.c_str()); + source.Reply(_("Unknown command \002{0}\002. \"{1}{2} HELP\" for help."), message, Config->StrictPrivmsg, source.service->nick); else - source.Reply(_("Unknown command \002%s\002."), message.c_str()); + source.Reply(_("Unknown command \002{0}\002."), message); return; } const CommandInfo &info = it->second; - ServiceReference<Command> c("Command", info.name); + ServiceReference<Command> c(info.name); if (!c) { if (has_help) - source.Reply(_("Unknown command \002%s\002. \"%s%s HELP\" for help."), message.c_str(), Config->StrictPrivmsg.c_str(), source.service->nick.c_str()); + source.Reply(_("Unknown command \002{0}\002. \"{1}{2} HELP\" for help."), message, Config->StrictPrivmsg, source.service->nick); else - source.Reply(_("Unknown command \002%s\002."), message.c_str()); + source.Reply(_("Unknown command \002{0}\002."), message); Log(source.service) << "Command " << it->first << " exists on me, but its service " << info.name << " was not found!"; return; } @@ -252,8 +252,7 @@ void Command::Run(CommandSource &source, const Anope::string &cmdname, const Com source.command = cmdname; source.permission = info.permission; - EventReturn MOD_RESULT; - MOD_RESULT = Event::OnPreCommand(&Event::PreCommand::OnPreCommand, source, this, params); + EventReturn MOD_RESULT = EventManager::Get()->Dispatch(&Event::PreCommand::OnPreCommand, source, this, params); if (MOD_RESULT == EVENT_STOP) return; @@ -276,7 +275,7 @@ void Command::Run(CommandSource &source, const Anope::string &cmdname, const Com } this->Execute(source, params); - Event::OnPostCommand(&Event::PostCommand::OnPostCommand, source, this, params); + EventManager::Get()->Dispatch(&Event::PostCommand::OnPostCommand, source, this, params); } bool Command::FindCommandFromService(const Anope::string &command_service, ServiceBot* &bot, Anope::string &name) diff --git a/src/config.cpp b/src/config.cpp index 5042f1a47..ad73f8e59 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -315,7 +315,7 @@ Conf::Conf() : Block("") if (ot == NULL) throw ConfigException("Oper block for " + nname + " has invalid oper type " + type); - Oper *o = operblock.Create(); + Oper *o = Serialize::New<Oper *>(); o->conf = this; o->SetName(nname); o->SetType(ot); @@ -326,7 +326,7 @@ Conf::Conf() : Block("") o->SetVhost(vhost); } - for (BotInfo *bi : Serialize::GetObjects<BotInfo *>(botinfo)) + for (BotInfo *bi : Serialize::GetObjects<BotInfo *>()) bi->conf = nullptr; for (int i = 0; i < this->CountBlock("service"); ++i) { @@ -502,7 +502,7 @@ Conf::Conf() : Block("") if (status.length() > 1) throw ConfigException("Channelmode status must be at most one character"); - if (list || !param_regex.empty() || param_unset || !status.empty()) + if (list || !param_regex.empty() || !status.empty()) param = true; Channelmode cm; @@ -552,20 +552,19 @@ Conf::Conf() : Block("") /* Clear existing conf opers */ if (Config) - for (Oper *o : Serialize::GetObjects<Oper *>(operblock)) + for (Oper *o : Serialize::GetObjects<Oper *>()) if (o->conf == Config) o->Delete(); /* Apply new opers */ - if (NickServ::service) - for (Oper *o : Serialize::GetObjects<Oper *>(operblock)) - { - NickServ::Nick *na = NickServ::service->FindNick(o->GetName()); - if (!na) - continue; + for (Oper *o : Serialize::GetObjects<Oper *>()) + { + NickServ::Nick *na = NickServ::FindNick(o->GetName()); + if (!na) + continue; - na->GetAccount()->o = o; - Log() << "Tied oper " << na->GetAccount()->GetDisplay() << " to type " << o->GetType()->GetName(); - } + na->GetAccount()->o = o; + Log() << "Tied oper " << na->GetAccount()->GetDisplay() << " to type " << o->GetType()->GetName(); + } /* Check the user keys */ if (!options->Get<unsigned>("seed")) @@ -613,7 +612,7 @@ void Conf::Post(Conf *old) ModeManager::Apply(old); /* Apply opertype changes, as non-conf opers still point to the old oper types */ - for (Oper *o : Serialize::GetObjects<Oper *>(operblock)) + for (Oper *o : Serialize::GetObjects<Oper *>()) { /* Oper's type is in the old config, so update it */ if (std::find(old->MyOperTypes.begin(), old->MyOperTypes.end(), o->GetType()) != old->MyOperTypes.end()) @@ -633,7 +632,7 @@ void Conf::Post(Conf *old) } } - for (BotInfo *bi : Serialize::GetObjects<BotInfo *>(botinfo)) + for (BotInfo *bi : Serialize::GetObjects<BotInfo *>()) { if (!bi->conf) { diff --git a/src/event.cpp b/src/event.cpp index 3e313d5a0..89c60da13 100644 --- a/src/event.cpp +++ b/src/event.cpp @@ -1,6 +1,7 @@ -/* Modular support +/* * - * (C) 2003-2014 Anope Team + * (C) 2016 Adam <Adam@anope.org> + * * Contact us at team@anope.org * * Please read COPYING and README for further details. @@ -10,89 +11,15 @@ #include "services.h" #include "event.h" -using namespace Event; +EventManager *EventManager::eventManager = nullptr; + +void EventManager::Init() +{ + eventManager = new EventManager(); +} + +EventManager *EventManager::Get() +{ + return eventManager; +} -EventHandlers<PreUserKicked> Event::OnPreUserKicked(nullptr); -EventHandlers<UserKicked> Event::OnUserKicked(nullptr); -EventHandlers<PreBotAssign> Event::OnPreBotAssign(nullptr); -EventHandlers<BotAssign> Event::OnBotAssign(nullptr); -EventHandlers<BotUnAssign> Event::OnBotUnAssign(nullptr); -EventHandlers<UserConnect> Event::OnUserConnect(nullptr); -EventHandlers<NewServer> Event::OnNewServer(nullptr); -EventHandlers<UserNickChange> Event::OnUserNickChange(nullptr); -EventHandlers<PreCommand> Event::OnPreCommand(nullptr); -EventHandlers<PostCommand> Event::OnPostCommand(nullptr); -EventHandlers<SaveDatabase> Event::OnSaveDatabase(nullptr); -EventHandlers<LoadDatabase> Event::OnLoadDatabase(nullptr); -EventHandlers<Encrypt> Event::OnEncrypt(nullptr); -EventHandlers<Decrypt> Event::OnDecrypt(nullptr); -EventHandlers<CreateBot> Event::OnCreateBot(nullptr); -EventHandlers<DelBot> Event::OnDelBot(nullptr); -EventHandlers<PrePartChannel> Event::OnPrePartChannel(nullptr); -EventHandlers<PartChannel> Event::OnPartChannel(nullptr); -EventHandlers<LeaveChannel> Event::OnLeaveChannel(nullptr); -EventHandlers<JoinChannel> Event::OnJoinChannel(nullptr); -EventHandlers<TopicUpdated> Event::OnTopicUpdated(nullptr); -EventHandlers<PreServerConnect> Event::OnPreServerConnect(nullptr); -EventHandlers<ServerConnect> Event::OnServerConnect(nullptr); -EventHandlers<PreUplinkSync> Event::OnPreUplinkSync(nullptr); -EventHandlers<ServerDisconnect> Event::OnServerDisconnect(nullptr); -EventHandlers<Restart> Event::OnRestart(nullptr); -EventHandlers<Shutdown> Event::OnShutdown(nullptr); -EventHandlers<AddXLine> Event::OnAddXLine(nullptr); -EventHandlers<DelXLine> Event::OnDelXLine(nullptr); -EventHandlers<IsServicesOperEvent> Event::OnIsServicesOper(nullptr); -EventHandlers<ServerQuit> Event::OnServerQuit(nullptr); -EventHandlers<UserQuit> Event::OnUserQuit(nullptr); -EventHandlers<PreUserLogoff> Event::OnPreUserLogoff(nullptr); -EventHandlers<PostUserLogoff> Event::OnPostUserLogoff(nullptr); -EventHandlers<AccessDel> Event::OnAccessDel(nullptr); -EventHandlers<AccessAdd> Event::OnAccessAdd(nullptr); -EventHandlers<AccessClear> Event::OnAccessClear(nullptr); -EventHandlers<ChanRegistered> Event::OnChanRegistered(nullptr); -EventHandlers<CreateChan> Event::OnCreateChan(nullptr); -EventHandlers<DelChan> Event::OnDelChan(nullptr); -EventHandlers<ChannelCreate> Event::OnChannelCreate(nullptr); -EventHandlers<ChannelDelete> Event::OnChannelDelete(nullptr); -EventHandlers<CheckKick> Event::OnCheckKick(nullptr); -EventHandlers<CheckPriv> Event::OnCheckPriv(nullptr); -EventHandlers<GroupCheckPriv> Event::OnGroupCheckPriv(nullptr); -EventHandlers<NickIdentify> Event::OnNickIdentify(nullptr); -EventHandlers<UserLogin> Event::OnUserLogin(nullptr); -EventHandlers<NickLogout> Event::OnNickLogout(nullptr); -EventHandlers<DelNick> Event::OnDelNick(nullptr); -EventHandlers<NickCoreCreate> Event::OnNickCoreCreate(nullptr); -EventHandlers<DelCore> Event::OnDelCore(nullptr); -EventHandlers<ChangeCoreDisplay> Event::OnChangeCoreDisplay(nullptr); -EventHandlers<NickClearAccess> Event::OnNickClearAccess(nullptr); -EventHandlers<NickAddAccess> Event::OnNickAddAccess(nullptr); -EventHandlers<NickEraseAccess> Event::OnNickEraseAccess(nullptr); -EventHandlers<CheckAuthentication> Event::OnCheckAuthentication(nullptr); -EventHandlers<Fingerprint> Event::OnFingerprint(nullptr); -EventHandlers<UserAway> Event::OnUserAway(nullptr); -EventHandlers<Invite> Event::OnInvite(nullptr); -EventHandlers<SetVhost> Event::OnSetVhost(nullptr); -EventHandlers<SetDisplayedHost> Event::OnSetDisplayedHost(nullptr); -EventHandlers<ChannelModeSet> Event::OnChannelModeSet(nullptr); -EventHandlers<ChannelModeUnset> Event::OnChannelModeUnset(nullptr); -EventHandlers<UserModeSet> Event::OnUserModeSet(nullptr); -EventHandlers<UserModeUnset> Event::OnUserModeUnset(nullptr); -EventHandlers<ChannelModeAdd> Event::OnChannelModeAdd(nullptr); -EventHandlers<UserModeAdd> Event::OnUserModeAdd(nullptr); -EventHandlers<ModuleLoad> Event::OnModuleLoad(nullptr); -EventHandlers<ModuleUnload> Event::OnModuleUnload(nullptr); -EventHandlers<ServerSync> Event::OnServerSync(nullptr); -EventHandlers<UplinkSync> Event::OnUplinkSync(nullptr); -EventHandlers<BotPrivmsg> Event::OnBotPrivmsg(nullptr); -EventHandlers<BotNotice> Event::OnBotNotice(nullptr); -EventHandlers<Privmsg> Event::OnPrivmsg(nullptr); -EventHandlers<Event::Log> Event::OnLog(nullptr); -EventHandlers<LogMessage> Event::OnLogMessage(nullptr); -EventHandlers<CheckModes> Event::OnCheckModes(nullptr); -EventHandlers<ChannelSync> Event::OnChannelSync(nullptr); -EventHandlers<SetCorrectModes> Event::OnSetCorrectModes(nullptr); -EventHandlers<Message> Event::OnMessage(nullptr); -EventHandlers<CanSet> Event::OnCanSet(nullptr); -EventHandlers<CheckDelete> Event::OnCheckDelete(nullptr); -EventHandlers<ExpireTick> Event::OnExpireTick(nullptr); -EventHandlers<SerializeEvents> Event::OnSerialize(nullptr); diff --git a/src/extensible.cpp b/src/extensible.cpp index c3c56abf8..a014d6bd0 100644 --- a/src/extensible.cpp +++ b/src/extensible.cpp @@ -18,12 +18,10 @@ ExtensibleBase::ExtensibleBase(Module *m, const Anope::string &t, const Anope::s { } -ExtensibleBase::~ExtensibleBase() -{ -} - Extensible::~Extensible() { + while (!extension_items.empty()) + (*extension_items.begin())->Unset(this); } bool Extensible::HasExtOK(const Anope::string &name) diff --git a/src/init.cpp b/src/init.cpp index e64bf0eff..f0f793839 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -481,8 +481,11 @@ void Anope::Init(int ac, char **av) /* Initialize the socket engine. Note that some engines can not survive a fork(), so this must be here. */ SocketEngine::Init(); + ServiceManager::Init(); + EventManager::Init(); + new BotInfoType(); - new XLineType(nullptr, "XLine"); + new XLineType(nullptr); new OperBlockType(); /* Read configuration file; exit if there are problems. */ @@ -567,14 +570,11 @@ void Anope::Init(int ac, char **av) /* Load up databases */ Log() << "Loading databases..."; - EventReturn MOD_RESULT; - MOD_RESULT = Event::OnLoadDatabase(&Event::LoadDatabase::OnLoadDatabase); + EventReturn MOD_RESULT = EventManager::Get()->Dispatch(&Event::LoadDatabase::OnLoadDatabase);; static_cast<void>(MOD_RESULT); Log() << "Databases loaded"; for (channel_map::const_iterator it = ChannelList.begin(), it_end = ChannelList.end(); it != it_end; ++it) it->second->Sync(); - - //Serialize::CheckTypes(); } diff --git a/src/logger.cpp b/src/logger.cpp index 3a735d48d..7be130d0b 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -90,11 +90,11 @@ Log::Log(LogType t, CommandSource &src, Command *_c, ChanServ::Channel *_ci) : u if (type != LOG_COMMAND && type != LOG_OVERRIDE && type != LOG_ADMIN) throw CoreException("This constructor does not support this log type"); - size_t sl = c->name.find('/'); + size_t sl = c->GetName().find('/'); this->bi = NULL; if (sl != Anope::string::npos) - this->bi = ServiceBot::Find(c->name.substr(0, sl), true); - this->category = c->name; + this->bi = ServiceBot::Find(c->GetName().substr(0, sl), true); + this->category = c->GetName(); } Log::Log(User *_u, Channel *ch, const Anope::string &cat) : bi(NULL), u(_u), nc(NULL), c(NULL), source(NULL), chan(ch), ci(chan ? *chan->ci : NULL), s(NULL), m(NULL), type(LOG_CHANNEL), category(cat) @@ -132,7 +132,15 @@ Log::~Log() else if (this->type == LOG_TERMINAL) std::cout << this->BuildPrefix() << this->buf.str() << std::endl; - Event::OnLog(&Event::Log::OnLog, this); + /* Some of the higher debug messages are in the event/service system which manages event dispatch, + * so firing off the log event here can cause them to be in weird states + */ + if (this->type <= LOG_NORMAL) + { + EventManager *em = EventManager::Get(); + if (em != nullptr) + em->Dispatch(&Event::Log::OnLog, this); + } if (Config) for (unsigned i = 0; i < Config->LogInfos.size(); ++i) @@ -154,7 +162,7 @@ Anope::string Log::FormatSource() const Anope::string Log::FormatCommand() const { - Anope::string buffer = FormatSource() + " used " + (source != NULL && !source->command.empty() ? source->command : this->c->name) + " "; + Anope::string buffer = FormatSource() + " used " + (source != NULL && !source->command.empty() ? source->command : this->c->GetName()) + " "; if (this->ci) buffer += "on " + this->ci->GetName() + " "; @@ -348,7 +356,7 @@ void LogInfo::ProcessMessage(const Log *l) const Anope::string &buffer = l->BuildPrefix() + l->buf.str(); - Event::OnLogMessage(&Event::LogMessage::OnLogMessage, this, l, buffer); + EventManager::Get()->Dispatch(&Event::LogMessage::OnLogMessage, this, l, buffer); for (unsigned i = 0; i < this->targets.size(); ++i) { diff --git a/src/main.cpp b/src/main.cpp index 65fb8d3f6..b6a41fd53 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -62,7 +62,7 @@ class ExpireTimer : public Timer void Tick(time_t) override { - Event::OnExpireTick(&Event::ExpireTick::OnExpireTick); + EventManager::Get()->Dispatch(&Event::ExpireTick::OnExpireTick); } }; @@ -72,7 +72,7 @@ void Anope::SaveDatabases() return; Log(LOG_DEBUG) << "Saving databases"; - Event::OnSaveDatabase(&Event::SaveDatabase::OnSaveDatabase); + EventManager::Get()->Dispatch(&Event::SaveDatabase::OnSaveDatabase); } /** The following comes from InspIRCd to get the full path of the Anope executable @@ -180,11 +180,11 @@ int main(int ac, char **av, char **envp) if (Anope::Restarting) { - Event::OnRestart(&Event::Restart::OnRestart); + EventManager::Get()->Dispatch(&Event::Restart::OnRestart); } else { - Event::OnShutdown(&Event::Shutdown::OnShutdown); + EventManager::Get()->Dispatch(&Event::Shutdown::OnShutdown); } if (Anope::QuitReason.empty()) diff --git a/src/messages.cpp b/src/messages.cpp index a6ccbe324..caef641a3 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -22,6 +22,7 @@ #include "channels.h" #include "event.h" #include "bots.h" +#include "modules/operserv/stats.h" using namespace Message; @@ -29,7 +30,7 @@ void Away::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) { const Anope::string &msg = !params.empty() ? params[0] : ""; - Event::OnUserAway(&Event::UserAway::OnUserAway, source.GetUser(), msg); + EventManager::Get()->Dispatch(&Event::UserAway::OnUserAway, source.GetUser(), msg); if (!msg.empty()) Log(source.GetUser(), "away") << "is now away: " << msg; @@ -66,7 +67,7 @@ void Invite::Run(MessageSource &source, const std::vector<Anope::string> ¶ms if (!targ || targ->server != Me || !c || c->FindUser(targ)) return; - Event::OnInvite(&Event::Invite::OnInvite, source.GetUser(), c, targ); + EventManager::Get()->Dispatch(&Event::Invite::OnInvite, source.GetUser(), c, targ); } void Join::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) @@ -88,9 +89,9 @@ void Join::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) Channel *c = cc->chan; ++it; - Event::OnPrePartChannel(&Event::PrePartChannel::OnPrePartChannel, user, c); + EventManager::Get()->Dispatch(&Event::PrePartChannel::OnPrePartChannel, user, c); cc->chan->DeleteUser(user); - Event::OnPartChannel(&Event::PartChannel::OnPartChannel, user, c, c->name, ""); + EventManager::Get()->Dispatch(&Event::PartChannel::OnPartChannel, user, c, c->name, ""); } continue; } @@ -152,7 +153,7 @@ void Join::SJoin(MessageSource &source, const Anope::string &chan, time_t ts, co */ c->SetCorrectModes(u, true); - Event::OnJoinChannel(&Event::JoinChannel::OnJoinChannel, u, c); + EventManager::Get()->Dispatch(&Event::JoinChannel::OnJoinChannel, u, c); } /* Channel is done syncing */ @@ -273,7 +274,7 @@ void Notice::Run(MessageSource &source, const std::vector<Anope::string> ¶ms ServiceBot *bi = ServiceBot::Find(params[0]); if (!bi) return; - Event::OnBotNotice(&Event::BotNotice::OnBotNotice, u, bi, message); + EventManager::Get()->Dispatch(&Event::BotNotice::OnBotNotice, u, bi, message); } } @@ -294,9 +295,9 @@ void Part::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) Log(u, c, "part") << "Reason: " << (!reason.empty() ? reason : "No reason"); - Event::OnPrePartChannel(&Event::PrePartChannel::OnPrePartChannel, u, c); + EventManager::Get()->Dispatch(&Event::PrePartChannel::OnPrePartChannel, u, c); c->DeleteUser(u); - Event::OnPartChannel(&Event::PartChannel::OnPartChannel, u, c, c->name, !reason.empty() ? reason : ""); + EventManager::Get()->Dispatch(&Event::PartChannel::OnPartChannel, u, c, c->name, reason); } } @@ -317,7 +318,7 @@ void Privmsg::Run(MessageSource &source, const std::vector<Anope::string> ¶m Channel *c = Channel::Find(receiver); if (c) { - Event::OnPrivmsg(&Event::Privmsg::OnPrivmsg, u, c, message); + EventManager::Get()->Dispatch(&Event::Privmsg::OnPrivmsg, u, c, message); } } else @@ -366,8 +367,7 @@ void Privmsg::Run(MessageSource &source, const std::vector<Anope::string> ¶m return; } - EventReturn MOD_RESULT; - MOD_RESULT = Event::OnBotPrivmsg(&Event::BotPrivmsg::OnBotPrivmsg, u, bi, message); + EventReturn MOD_RESULT = EventManager::Get()->Dispatch(&Event::BotPrivmsg::OnBotPrivmsg, u, bi, message); if (MOD_RESULT == EVENT_STOP) return; @@ -409,7 +409,7 @@ void SQuit::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) s->Delete(s->GetName() + " " + s->GetUplink()->GetName()); } -void Stats::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) +void Message::Stats::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) { User *u = source.GetUser(); @@ -431,7 +431,7 @@ void Stats::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) IRCD->SendNumeric(219, source.GetSource(), "%c :End of /STATS report.", params[0][0]); else { - for (Oper *o : Serialize::GetObjects<Oper *>(operblock)) + for (Oper *o : Serialize::GetObjects<Oper *>()) IRCD->SendNumeric(243, source.GetSource(), "O * * %s %s 0", o->GetName().c_str(), o->GetType()->GetName().replace_all_cs(" ", "_").c_str()); IRCD->SendNumeric(219, source.GetSource(), "%c :End of /STATS report.", params[0][0]); @@ -440,9 +440,11 @@ void Stats::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) break; case 'u': { + ::Stats *s = Serialize::GetObject<::Stats *>(); long uptime = static_cast<long>(Anope::CurTime - Anope::StartTime); + IRCD->SendNumeric(242, source.GetSource(), ":Services up %d day%s, %02d:%02d:%02d", uptime / 86400, uptime / 86400 == 1 ? "" : "s", (uptime / 3600) % 24, (uptime / 60) % 60, uptime % 60); - IRCD->SendNumeric(250, source.GetSource(), ":Current users: %d (%d ops); maximum %d", UserListByNick.size(), OperCount, MaxUserCount); + IRCD->SendNumeric(250, source.GetSource(), ":Current users: %d (%d ops); maximum %d", UserListByNick.size(), OperCount, s ? s->GetMaxUserCount() : 0); IRCD->SendNumeric(219, source.GetSource(), "%c :End of /STATS report.", params[0][0]); break; } /* case 'u' */ diff --git a/src/misc.cpp b/src/misc.cpp index 436ac2261..323b66b13 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -140,14 +140,15 @@ void ListFormatter::Process(std::vector<Anope::string> &buffer) unsigned length = 0; for (std::map<Anope::string, size_t>::iterator it = lenghts.begin(), it_end = lenghts.end(); it != it_end; ++it) { - /* Break lines at 80 chars */ - if (length > 80) + if (length > Config->LineWrap) { breaks.insert(it->first); length = 0; } else + { length += it->second; + } } /* Only put a list header if more than 1 column */ @@ -480,8 +481,7 @@ bool Anope::Match(const Anope::string &str, const Anope::string &mask, bool case void Anope::Encrypt(const Anope::string &src, Anope::string &dest) { - EventReturn MOD_RESULT; - MOD_RESULT = Event::OnEncrypt(&Event::Encrypt::OnEncrypt, src, dest); + EventReturn MOD_RESULT = EventManager::Get()->Dispatch(&Event::Encrypt::OnEncrypt, src, dest); static_cast<void>(MOD_RESULT); } @@ -495,8 +495,7 @@ bool Anope::Decrypt(const Anope::string &src, Anope::string &dest) } Anope::string hashm(src.begin(), src.begin() + pos); - EventReturn MOD_RESULT; - MOD_RESULT = Event::OnDecrypt(&Event::Decrypt::OnDecrypt, hashm, src, dest); + EventReturn MOD_RESULT = EventManager::Get()->Dispatch(&Event::Decrypt::OnDecrypt, hashm, src, dest); if (MOD_RESULT == EVENT_ALLOW) return true; diff --git a/src/modes.cpp b/src/modes.cpp index cb70d7102..aae3d3f21 100644 --- a/src/modes.cpp +++ b/src/modes.cpp @@ -148,8 +148,7 @@ ChannelMode::ChannelMode(const Anope::string &cm, char mch) : Mode(cm, MC_CHANNE bool ChannelMode::CanSet(User *u) const { - EventReturn MOD_RESULT; - MOD_RESULT = Event::OnCanSet(&Event::CanSet::OnCanSet, u, this); + EventReturn MOD_RESULT = EventManager::Get()->Dispatch(&Event::CanSet::OnCanSet, u, this); return MOD_RESULT != EVENT_STOP; } @@ -391,7 +390,7 @@ bool ModeManager::AddUserMode(UserMode *um) UserModes.push_back(um); - Event::OnUserModeAdd(&Event::UserModeAdd::OnUserModeAdd, um); + EventManager::Get()->Dispatch(&Event::UserModeAdd::OnUserModeAdd, um); return true; } @@ -426,7 +425,7 @@ bool ModeManager::AddChannelMode(ChannelMode *cm) ChannelModes.push_back(cm); - Event::OnChannelModeAdd(&Event::ChannelModeAdd::OnChannelModeAdd, cm); + EventManager::Get()->Dispatch(&Event::ChannelModeAdd::OnChannelModeAdd, cm); for (unsigned int i = 0; i < ChannelModes.size(); ++i) ChannelModes[i]->Check(); @@ -716,16 +715,20 @@ void ModeManager::StackerDel(Mode *m) void ModeManager::Apply(Configuration::Conf *old) { - /* XXX remove old modes */ +#warning "remove old modes" for (Configuration::Channelmode &cm : Config->Channelmodes) { ChannelMode *mode; - if (cm.character) - Log(LOG_DEBUG) << "Creating channelmode " << cm.name << " (" << cm.character << ")"; + if (cm.list) + Log(LOG_DEBUG) << "Creating channelmode list " << cm.name << " (" << cm.character << ")"; + else if (cm.status) + Log(LOG_DEBUG) << "Creating channelmode status " << cm.name << " (" << cm.character << ")"; + else if (cm.param) + Log(LOG_DEBUG) << "Creating channelmode param " << cm.name << " (" << cm.character << ")"; else - Log(LOG_DEBUG) << "Creating channelmode " << cm.name; + Log(LOG_DEBUG) << "Creating channelmode " << cm.name << " (" << cm.character << ")"; if (cm.list) mode = new ChannelModeList(cm.name, cm.character); diff --git a/src/modulemanager.cpp b/src/modulemanager.cpp index 76cec0b57..f931671b0 100644 --- a/src/modulemanager.cpp +++ b/src/modulemanager.cpp @@ -133,7 +133,7 @@ ModuleReturn ModuleManager::LoadModule(const Anope::string &modname, User *u) #ifdef _WIN32 /* Generate the filename for the temporary copy of the module */ - Anope::string pbuf = Anope::DataDir + "/runtime/" + modname + ".so.XXXXXX"; + Anope::string pbuf = Anope::DataDir + "/runtime/" + modname.replace_all_cs("/", "_") + ".so.XXXXXX"; /* Don't skip return value checking! -GD */ ModuleReturn ret = moduleCopyFile(modname, pbuf); @@ -146,7 +146,7 @@ ModuleReturn ModuleManager::LoadModule(const Anope::string &modname, User *u) return ret; } #else - Anope::string pbuf = Anope::ModuleDir + "/modules/" + modname + ".so"; + Anope::string pbuf = Anope::ModuleDir + "/modules/" + modname.replace_all_cs("/", "_") + ".so"; #endif dlerror(); @@ -267,7 +267,7 @@ ModuleReturn ModuleManager::LoadModule(const Anope::string &modname, User *u) Log(LOG_DEBUG) << "Module " << modname << " loaded."; - Event::OnModuleLoad(&Event::ModuleLoad::OnModuleLoad, u, m); + EventManager::Get()->Dispatch(&Event::ModuleLoad::OnModuleLoad, u, m); return MOD_ERR_OK; } @@ -277,7 +277,7 @@ ModuleReturn ModuleManager::UnloadModule(Module *m, User *u) if (!m) return MOD_ERR_PARAMS; - Event::OnModuleUnload(&Event::ModuleUnload::OnModuleUnload, u, m); + EventManager::Get()->Dispatch(&Event::ModuleUnload::OnModuleUnload, u, m); return DeleteModule(m); } diff --git a/src/opertype.cpp b/src/opertype.cpp index d524c7ded..09bc23bb7 100644 --- a/src/opertype.cpp +++ b/src/opertype.cpp @@ -67,9 +67,9 @@ OperType *Oper::GetType() return OperType::Find(Get(&OperBlockType::type)); } -void Oper::SetType(OperType *type) +void Oper::SetType(OperType *t) { - Set(&OperBlockType::type, type->GetName()); + Set(&OperBlockType::type, t->GetName()); } bool Oper::GetRequireOper() @@ -84,7 +84,7 @@ void Oper::SetRequireOper(const bool &b) Oper *Oper::Find(const Anope::string &name) { - for (Oper *o : Serialize::GetObjects<Oper *>(operblock)) + for (Oper *o : Serialize::GetObjects<Oper *>()) if (o->GetName() == name) return o; diff --git a/src/process.cpp b/src/process.cpp index d14d8d589..e0beff9a7 100644 --- a/src/process.cpp +++ b/src/process.cpp @@ -51,12 +51,9 @@ void Anope::Process(const Anope::string &buffer) MessageSource src(source); - EventReturn MOD_RESULT; - MOD_RESULT = Event::OnMessage(&Event::Message::OnMessage, src, command, params); - if (MOD_RESULT == EVENT_STOP) - return; + EventReturn MOD_RESULT = EventManager::Get()->Dispatch(&Event::Message::OnMessage, src, command, params); - ServiceReference<IRCDMessage> m("IRCDMessage", proto_name + "/" + command.lower()); + ServiceReference<IRCDMessage> m(proto_name + "/" + command.lower()); if (!m) { Log(LOG_DEBUG) << "unknown message from server (" << buffer << ")"; diff --git a/src/serialize.cpp b/src/serialize.cpp index b11f8232c..4313047a9 100644 --- a/src/serialize.cpp +++ b/src/serialize.cpp @@ -1,13 +1,10 @@ /* * - * (C) 2003-2014 Anope Team + * (C) 2003-2016 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. - * */ @@ -19,14 +16,15 @@ using namespace Serialize; -std::map<Anope::string, TypeBase *> Serialize::Types; - std::unordered_map<ID, Object *> Serialize::objects; std::vector<FieldBase *> Serialize::serializableFields; +std::multimap<Anope::string, Anope::string> Serialize::child_types; + static ID curid; + Object *Serialize::GetID(ID id) { auto it = objects.find(id); @@ -46,23 +44,19 @@ void Serialize::Clear() void Serialize::Unregister(Module *m) { - for (FieldBase *field : serializableFields) - if (field->creator == m) - field->Unregister(); - - for (const std::pair<Anope::string, TypeBase *> &p : Types) - { - TypeBase *s = p.second; - + for (TypeBase *s : ServiceManager::Get()->FindServices<Serialize::TypeBase *>()) if (s->GetOwner() == m) s->Unregister(); - } + + for (FieldBase *field : serializableFields) + if (field->GetOwner() == m) + field->Unregister(); } std::vector<Edge> Object::GetRefs(TypeBase *type) { std::vector<Edge> refs; - EventReturn result = Event::OnSerialize(&Event::SerializeEvents::OnSerializeGetRefs, this, type, refs); + EventReturn result = EventManager::Get()->Dispatch(&Event::SerializeEvents::OnSerializeGetRefs, this, type, refs); if (result == EVENT_ALLOW) return refs; @@ -86,7 +80,7 @@ std::vector<Edge> Object::GetRefs(TypeBase *type) Object::Object(TypeBase *type) { ID i; - EventReturn result = Event::OnSerialize(&Event::SerializeEvents::OnSerializableGetId, i); + EventReturn result = EventManager::Get()->Dispatch(&Event::SerializeEvents::OnSerializableGetId, i); if (result != EVENT_ALLOW) { while (GetID(++curid)); @@ -100,9 +94,9 @@ Object::Object(TypeBase *type) type->objects.insert(this); - Log(LOG_DEBUG) << "Creating object id #" << id << " type " << type->GetName(); + Log(LOG_DEBUG_2) << "Creating object id #" << id << " address " << static_cast<void *>(this) << " type " << type->GetName(); - Event::OnSerialize(&Event::SerializeEvents::OnSerializableCreate, this); + EventManager::Get()->Dispatch(&Event::SerializeEvents::OnSerializableCreate, this); } Object::Object(TypeBase *type, ID i) @@ -114,12 +108,12 @@ Object::Object(TypeBase *type, ID i) type->objects.insert(this); - Log(LOG_DEBUG) << "Creating object from id #" << id << " type " << type->GetName(); + Log(LOG_DEBUG_2) << "Creating object from id #" << id << " address " << static_cast<void *>(this) << " type " << type->GetName(); } Object::~Object() { - Log(LOG_DEBUG) << "Destructing object id #" << id << " type " << s_type->GetName(); + Log(LOG_DEBUG_2) << "Destructing object id #" << id << " address " << static_cast<void *>(this) << " type " << s_type->GetName(); /* Remove in memory edges */ cont: @@ -128,12 +122,12 @@ Object::~Object() { if (!edge.direction) { - Log(LOG_DEBUG_2) << "Removing edge from object id #" << edge.other->id << " type " << edge.other->GetSerializableType()->GetName() << " on field " << edge.field->GetName(); + Log(LOG_DEBUG_2) << "Removing edge from object id #" << edge.other->id << " type " << edge.other->GetSerializableType()->GetName() << " on field " << edge.field->serialize_name; edge.other->RemoveEdge(this, edge.field); } else { - Log(LOG_DEBUG_2) << "Removing edge to object id #" << edge.other->id << " type " << edge.other->GetSerializableType()->GetName() << " on field " << edge.field->GetName(); + Log(LOG_DEBUG_2) << "Removing edge to object id #" << edge.other->id << " type " << edge.other->GetSerializableType()->GetName() << " on field " << edge.field->serialize_name; this->RemoveEdge(edge.other, edge.field); } goto cont; @@ -145,7 +139,7 @@ Object::~Object() void Object::Delete() { - Log(LOG_DEBUG) << "Deleting object id #" << id << " type " << s_type->GetName(); + Log(LOG_DEBUG_2) << "Deleting object id #" << id << " type " << s_type->GetName(); /* Delete dependant objects */ for (const Edge &edge : GetRefs(nullptr)) @@ -158,17 +152,17 @@ void Object::Delete() if (field->depends) { - Log(LOG_DEBUG_2) << "Deleting dependent object #" << other->id << " type " << other->GetSerializableType()->GetName() << " due to edge on " << field->GetName(); + Log(LOG_DEBUG_2) << "Deleting dependent object #" << other->id << " type " << other->GetSerializableType()->GetName() << " due to edge on " << field->serialize_name; other->Delete(); } else { - Log(LOG_DEBUG_2) << "Unsetting field " << field->GetName() << " on object #" << other->id << " type " << other->GetSerializableType()->GetName(); + Log(LOG_DEBUG_2) << "Unsetting field " << field->serialize_name << " on object #" << other->id << " type " << other->GetSerializableType()->GetName(); field->UnsetS(other); } } - Event::OnSerialize(&Event::SerializeEvents::OnSerializableDelete, this); + EventManager::Get()->Dispatch(&Event::SerializeEvents::OnSerializableDelete, this); delete this; } @@ -198,112 +192,71 @@ void Object::RemoveEdge(Object *other, FieldBase *field) Log(LOG_DEBUG_2) << "Unable to locate edge for removal on #" << this->id << " type " << s_type->GetName() << " <- #" << other->id << " type " << other->GetSerializableType()->GetName(); } -TypeBase::TypeBase(Module *o, const Anope::string &n) : Service(o, "Serialize::Type", n), name(n), owner(o) +TypeBase::TypeBase(Module *o, const Anope::string &n) : Service(o, TypeBase::NAME, n), name(n), owner(o) { - Types[this->name] = this; } TypeBase::~TypeBase() { - if (!Serialize::GetObjects<Object *>(this).empty()) + if (!Serialize::GetObjects<Object *>(this->GetName()).empty()) throw CoreException("Type destructing with objects still alive"); - - if (parent) - { - auto it = std::find(parent->children.begin(), parent->children.end(), this); - if (it != parent->children.end()) - parent->children.erase(it); - } - - for (TypeBase *child : children) - child->parent = nullptr; - - Types.erase(this->name); } void TypeBase::Unregister() { Log(LOG_DEBUG_2) << "Unregistering type " << this->GetName(); - for (Object *obj : GetObjects<Object *>(this)) + for (Object *obj : GetObjects<Object *>(this->GetName())) obj->Delete(); - cont: - for (FieldBase *field : fields) + for (FieldBase *field : serializableFields) { - field->Unregister(); - goto cont; + if (field->serialize_type == this->GetName()) + { + field->Unregister(); + } } } -void TypeBase::SetParent(TypeBase *other) -{ - parent = other; - other->children.push_back(this); -} - Serialize::FieldBase *TypeBase::GetField(const Anope::string &fname) { - for (FieldBase *f : fields) - if (f->GetName() == fname) - return f; + /* is this too slow? */ + for (FieldBase *fb : ServiceManager::Get()->FindServices<FieldBase *>()) + if (fb->serialize_type == this->GetName() && fb->serialize_name == fname) + return fb; + + Log(LOG_DEBUG_2) << "GetField() for unknown field " << fname << " on " << this->GetName(); + return nullptr; } -std::vector<TypeBase *> TypeBase::GetSubTypes() +std::vector<Serialize::FieldBase *> TypeBase::GetFields() { - std::vector<TypeBase *> v; + std::vector<Serialize::FieldBase *> fields; - v.push_back(this); + for (FieldBase *fb : ServiceManager::Get()->FindServices<FieldBase *>()) + if (fb->serialize_type == this->GetName()) + fields.push_back(fb); - for (TypeBase *b : children) - { - std::vector<TypeBase *> c = b->GetSubTypes(); - v.insert(v.end(), c.begin(), c.end()); - } - - return v; + return fields; } TypeBase *TypeBase::Find(const Anope::string &name) { - std::map<Anope::string, TypeBase *>::iterator it = Types.find(name); - if (it != Types.end()) - return it->second; - return nullptr; -} - -const std::map<Anope::string, Serialize::TypeBase *>& TypeBase::GetTypes() -{ - return Types; + return ServiceManager::Get()->FindService<TypeBase *>(name); } -void Serialize::FieldBase::Listener::OnAcquire() -{ - TypeBase *t = *this; - - if (base->unregister) - return; - - Log(LOG_DEBUG_2) << "Acquired type reference to " << t->GetName() << " for field " << base->GetName(); - - auto it = std::find(t->fields.begin(), t->fields.end(), base); - if (it == t->fields.end()) - t->fields.push_back(base); -} - -FieldBase::FieldBase(Module *c, const Anope::string &n, const ServiceReference<TypeBase> &t, bool d) : type(this, t), creator(c), name(n), depends(d) +FieldBase::FieldBase(Module *c, const Anope::string &n, const Anope::string &t, bool d) + : Service(c, FieldBase::NAME) + , serialize_type(t) + , serialize_name(n) + , depends(d) { serializableFields.push_back(this); - - type.Check(); } FieldBase::~FieldBase() { - if (std::find(type->fields.begin(), type->fields.end(), this) != type->fields.end()) - Log(LOG_DEBUG) << "Destructing field " << this->GetName() << " on " << type->GetName() << " while still registered!"; - auto it = std::find(serializableFields.begin(), serializableFields.end(), this); if (it != serializableFields.end()) serializableFields.erase(it); @@ -311,25 +264,46 @@ FieldBase::~FieldBase() void FieldBase::Unregister() { - unregister = true; - - Log(LOG_DEBUG_2) << "Unregistering field " << this->GetName() << " on " << type->GetName(); + Log(LOG_DEBUG_2) << "Unregistering field " << serialize_name << " on " << serialize_type; /* find edges on this field */ - for (Object *s : Serialize::GetObjects<Object *>(type)) + for (Object *s : Serialize::GetObjects<Object *>(serialize_type)) { for (const std::pair<TypeBase *, std::vector<Edge>> &p : s->edges) for (const Edge &edge : p.second) if (edge.direction && edge.field == this) { - Log(LOG_DEBUG_2) << "Removing edge on #" << s->id << " <-> #" << edge.other->id << " type " << edge.other->GetSerializableType()->GetName(); + Log(LOG_DEBUG_2) << "Removing edge on #" << s->id << " type " << s->GetSerializableType()->GetName() << " -> #" << edge.other->id << " type " << edge.other->GetSerializableType()->GetName(); s->RemoveEdge(edge.other, edge.field); + goto cont; } cont:; } +} + +void Serialize::SetParent(const Anope::string &child, const Anope::string &parent) +{ + child_types.insert(std::make_pair(parent, child)); +} + +std::vector<Serialize::TypeBase *> Serialize::GetTypes(const Anope::string &name) +{ + std::vector<Serialize::TypeBase *> v; + + Serialize::TypeBase *t = Serialize::TypeBase::Find(name); + if (t != nullptr) + v.push_back(t); + else + Log(LOG_DEBUG_2) << "GetTypes for unknown type " << name; + + auto its = child_types.equal_range(name); + for (; its.first != its.second; ++its.first) + { + t = Serialize::TypeBase::Find(its.first->second); + if (t != nullptr) + v.push_back(t); + } - auto it = std::find(type->fields.begin(), type->fields.end(), this); - if (it != type->fields.end()) - type->fields.erase(it); + return v; } diff --git a/src/servers.cpp b/src/servers.cpp index 9f94bc78e..1308147b7 100644 --- a/src/servers.cpp +++ b/src/servers.cpp @@ -51,7 +51,7 @@ Server::Server(Server *up, const Anope::string &sname, unsigned shops, const Ano Burst(); } - Event::OnNewServer(&Event::NewServer::OnNewServer, this); + EventManager::Get()->Dispatch(&Event::NewServer::OnNewServer, this); } Server::~Server() @@ -86,7 +86,7 @@ void Server::Delete(const Anope::string &reason) { this->quit_reason = reason; this->quitting = true; - Event::OnServerQuit(&Event::ServerQuit::OnServerQuit, this); + EventManager::Get()->Dispatch(&Event::ServerQuit::OnServerQuit, this); delete this; } @@ -228,7 +228,7 @@ void Server::Sync(bool sync_links) Log(this, "sync") << "is done syncing"; - Event::OnServerSync(&Event::ServerSync::OnServerSync, this); + EventManager::Get()->Dispatch(&Event::ServerSync::OnServerSync, this); if (sync_links && !this->links.empty()) { @@ -240,7 +240,7 @@ void Server::Sync(bool sync_links) if (me) { - Event::OnPreUplinkSync(&Event::PreUplinkSync::OnPreUplinkSync, this); + EventManager::Get()->Dispatch(&Event::PreUplinkSync::OnPreUplinkSync, this); } for (channel_map::const_iterator it = ChannelList.begin(), it_end = ChannelList.end(); it != it_end;) @@ -257,7 +257,7 @@ void Server::Sync(bool sync_links) IRCD->SendEOB(); Me->Sync(false); - Event::OnUplinkSync(&Event::UplinkSync::OnUplinkSync, this); + EventManager::Get()->Dispatch(&Event::UplinkSync::OnUplinkSync, this); if (!Anope::NoFork) { diff --git a/src/service.cpp b/src/service.cpp index cfa9a17c7..c2270b734 100644 --- a/src/service.cpp +++ b/src/service.cpp @@ -1,6 +1,8 @@ /* * - * (C) 2014 Anope Team + * (C) 2014-2016 Anope Team + * (C) 2016 Adam <Adam@anope.org> + * * Contact us at team@anope.org * * Please read COPYING and README for further details. @@ -10,117 +12,59 @@ #include "services.h" #include "service.h" +#include "modules/nickserv.h" +#include "modules/chanserv.h" +#include "modules/memoserv.h" -void Service::check() -{ - if (Services || Aliases) - return; - - Services = new std::map<Anope::string, std::map<Anope::string, Service *> >(); - Aliases = new std::map<Anope::string, std::map<Anope::string, Anope::string> >; -} +NickServ::NickServService *NickServ::service = nullptr; +ChanServ::ChanServService *ChanServ::service = nullptr; +MemoServ::MemoServService *MemoServ::service = nullptr; -Service *Service::FindService(const std::map<Anope::string, Service *> &services, const std::map<Anope::string, Anope::string> *aliases, const Anope::string &n) +ServiceReferenceBase::ServiceReferenceBase(const Anope::string &_type, const Anope::string &_name) : type(_type), name(_name) { - std::map<Anope::string, Service *>::const_iterator it = services.find(n); - if (it != services.end()) - return it->second; - - if (aliases != NULL) - { - std::map<Anope::string, Anope::string>::const_iterator it2 = aliases->find(n); - if (it2 != aliases->end()) - return FindService(services, aliases, it2->second); - } - - return NULL; + ServiceManager::Get()->RegisterReference(this); } -Service *Service::FindService(const Anope::string &t, const Anope::string &n) +ServiceReferenceBase::ServiceReferenceBase(const Anope::string &_type) : ServiceReferenceBase(_type, "") { - check(); - - std::map<Anope::string, std::map<Anope::string, Service *> >::const_iterator it = (*Services).find(t); - if (it == (*Services).end()) - return NULL; - - std::map<Anope::string, std::map<Anope::string, Anope::string> >::const_iterator it2 = (*Aliases).find(t); - if (it2 != (*Aliases).end()) - return FindService(it->second, &it2->second, n); - - return FindService(it->second, NULL, n); } -std::vector<Anope::string> Service::GetServiceKeys(const Anope::string &t) +ServiceReferenceBase::~ServiceReferenceBase() { - check(); - - std::vector<Anope::string> keys; - std::map<Anope::string, std::map<Anope::string, Service *> >::iterator it = (*Services).find(t); - if (it != (*Services).end()) - for (std::map<Anope::string, Service *>::iterator it2 = it->second.begin(); it2 != it->second.end(); ++it2) - keys.push_back(it2->first); - return keys; + ServiceManager::Get()->UnregisterReference(this); } -void Service::AddAlias(const Anope::string &t, const Anope::string &n, const Anope::string &v) +void ServiceReferenceBase::SetService(Service *service) { - check(); - - std::map<Anope::string, Anope::string> &smap = (*Aliases)[t]; - smap[n] = v; + if (service == nullptr) + this->services.clear(); + else + this->services = { service }; } -void Service::DelAlias(const Anope::string &t, const Anope::string &n) +void ServiceReferenceBase::SetServices(const std::vector<Service *> &s) { - check(); - - std::map<Anope::string, Anope::string> &smap = (*Aliases)[t]; - smap.erase(n); - if (smap.empty()) - (*Aliases).erase(t); + this->services = s; } Service::Service(Module *o, const Anope::string &t, const Anope::string &n) : owner(o), type(t), name(n) { - this->Register(); + ServiceManager::Get()->Register(this); } Service::~Service() { - this->Unregister(); -} - -void Service::Register() -{ - check(); - - std::map<Anope::string, Service *> &smap = (*Services)[this->type]; - if (smap.find(this->name) != smap.end()) - throw ModuleException("Service " + this->type + " with name " + this->name + " already exists"); - smap[this->name] = this; - - ReferenceBase::ResetAll(); -} - -void Service::Unregister() -{ - check(); - - std::map<Anope::string, Service *> &smap = (*Services)[this->type]; - smap.erase(this->name); - if (smap.empty()) - (*Services).erase(this->type); + ServiceManager::Get()->Unregister(this); } ServiceAlias::ServiceAlias(const Anope::string &type, const Anope::string &from, const Anope::string &to) : t(type), f(from) { - Service::AddAlias(type, from, to); + ServiceManager::Get()->AddAlias(type, from, to); } ServiceAlias::~ServiceAlias() { - Service::DelAlias(t, f); + ServiceManager::Get()->DelAlias(t, f); } diff --git a/src/service_manager.cpp b/src/service_manager.cpp new file mode 100644 index 000000000..0d9255c7d --- /dev/null +++ b/src/service_manager.cpp @@ -0,0 +1,144 @@ +/* + * + * (C) 2016 Anope Team + * (C) 2016 Adam <Adam@anope.org> + * + * Contact us at team@anope.org + * + * Please read COPYING and README for further details. + * + */ + +#include "services.h" +#include "service.h" +#include "logger.h" + +ServiceManager *ServiceManager::manager = nullptr; + +void ServiceManager::Init() +{ + assert(manager == nullptr); + manager = new ServiceManager(); +} + +ServiceManager *ServiceManager::Get() +{ + return manager; +} + +void ServiceManager::Destroy() +{ + delete manager; + manager = nullptr; +} + +Service *ServiceManager::FindService(const Anope::string &name) +{ + for (Service *s : services) + if (s->GetName() == name) + return s; + return nullptr; +} + +Service *ServiceManager::FindService(const Anope::string &type, const Anope::string &name) +{ + for (Service *s : services) + if (s->GetType() == type && s->GetName() == name) + return s; + return nullptr; +} + +std::vector<Service *> ServiceManager::FindServices(const Anope::string &type) +{ + std::vector<Service *> v; + + for (Service *s : services) + if (s->GetType() == type) + v.push_back(s); + + return v; +} + +void ServiceManager::AddAlias(const Anope::string &t, const Anope::string &n, const Anope::string &v) +{ +#warning "aliases dont work" +// std::map<Anope::string, Anope::string> &smap = aliases[t]; +// smap[n] = v; +} + +void ServiceManager::DelAlias(const Anope::string &t, const Anope::string &n) +{ +// std::map<Anope::string, Anope::string> &smap = aliases[t]; +// smap.erase(n); +// if (smap.empty()) +// aliases.erase(t); +} + +void ServiceManager::Register(Service *service) +{ + // assert type + if (service->GetType().empty()) + throw ModuleException("Service type must be non empty"); + + if (service->GetName().empty() == false) + { + Service *s = FindService(service->GetType(), service->GetName()); + + if (s != nullptr) + throw ModuleException("Service of type " + service->GetType() + " with name " + service->GetName() + " already exists"); + } + + Log(LOG_DEBUG_2) << "Service registered: " << service->GetType() << " " << service->GetName() << " address " << static_cast<void *>(this) << " by " << service->GetOwner(); + + services.push_back(service); + + LookupAll(); +} + +void ServiceManager::Unregister(Service *service) +{ + Log(LOG_DEBUG_2) << "Service unregistered: " << service->GetType() << " " << service->GetName() << " address " << static_cast<void *>(service) << " by " << service->GetOwner(); + + auto it = std::find(services.begin(), services.end(), service); + if (it != services.end()) + { + services.erase(it); + + LookupAll(); + } +} + +void ServiceManager::Lookup(ServiceReferenceBase *reference) +{ + if (reference->GetName().empty()) + { + std::vector<Service *> services = this->FindServices(reference->GetType()); + Log(LOG_DEBUG_2) << "Service lookup " << static_cast<void *>(reference) << " type " << reference->GetType() << " name " << reference->GetName() << ": " << services.size() << " services"; + reference->SetServices(services); + } + else + { + Service *service = this->FindService(reference->GetType(), reference->GetName()); + Log(LOG_DEBUG_2) << "Service lookup " << static_cast<void *>(reference) << " type " << reference->GetType() << " name " << reference->GetName() << ": " << service; + reference->SetService(service); + } +} + +void ServiceManager::LookupAll() +{ + for (ServiceReferenceBase *s : references) + Lookup(s); +} + +void ServiceManager::RegisterReference(ServiceReferenceBase *reference) +{ + Lookup(reference); + this->references.push_back(reference); +} + +void ServiceManager::UnregisterReference(ServiceReferenceBase *reference) +{ + auto it = std::find(this->references.begin(), this->references.end(), reference); + if (it != this->references.end()) + this->references.erase(it); +} diff --git a/src/uplink.cpp b/src/uplink.cpp index 5b585ce09..91f9c6264 100644 --- a/src/uplink.cpp +++ b/src/uplink.cpp @@ -56,7 +56,7 @@ void Uplink::Connect() new UplinkSocket(); if (!Config->GetBlock("serverinfo")->Get<Anope::string>("localhost").empty()) UplinkSock->Bind(Config->GetBlock("serverinfo")->Get<Anope::string>("localhost")); - Event::OnPreServerConnect(&Event::PreServerConnect::OnPreServerConnect); + EventManager::Get()->Dispatch(&Event::PreServerConnect::OnPreServerConnect); Anope::string ip = Anope::Resolve(u.host, u.ipv6 ? AF_INET6 : AF_INET); Log(LOG_TERMINAL) << "Attempting to connect to uplink #" << (Anope::CurrentUplink + 1) << " " << u.host << " (" << ip << "), port " << u.port; UplinkSock->Connect(ip, u.port); @@ -82,7 +82,7 @@ UplinkSocket::~UplinkSocket() if (IRCD && Servers::GetUplink() && Servers::GetUplink()->IsSynced()) { - Event::OnServerDisconnect(&Event::ServerDisconnect::OnServerDisconnect); + EventManager::Get()->Dispatch(&Event::ServerDisconnect::OnServerDisconnect); for (user_map::const_iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it) { @@ -149,7 +149,7 @@ void UplinkSocket::OnConnect() { Log(LOG_TERMINAL) << "Successfully connected to uplink #" << (Anope::CurrentUplink + 1) << " " << Config->Uplinks[Anope::CurrentUplink].host << ":" << Config->Uplinks[Anope::CurrentUplink].port; IRCD->SendConnect(); - Event::OnServerConnect(&Event::ServerConnect::OnServerConnect); + EventManager::Get()->Dispatch(&Event::ServerConnect::OnServerConnect); } void UplinkSocket::OnError(const Anope::string &err) diff --git a/src/users.cpp b/src/users.cpp index 850cd8de8..87366676b 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -29,8 +29,6 @@ user_map UserListByNick, UserListByUID; int OperCount = 0; -unsigned MaxUserCount = 0; -time_t MaxUserTime = 0; std::list<User *> User::quitting_users; @@ -74,18 +72,10 @@ User::User(const Anope::string &snick, const Anope::string &sident, const Anope: Log(this, "connect") << (!vhost.empty() && vhost != host ? "(" + vhost + ") " : "") << "(" << srealname << ") " << (!uip.empty() && uip != host ? "[" + uip + "] " : "") << "connected to the network (" << sserver->GetName() << ")"; } - if (UserListByNick.size() > MaxUserCount) - { - MaxUserCount = UserListByNick.size(); - MaxUserTime = Anope::CurTime; - if (sserver && sserver->IsSynced()) - Log(this, "maxusers") << "connected - new maximum user count: " << UserListByNick.size(); - } - bool exempt = false; if (server && server->IsULined()) exempt = true; - Event::OnUserConnect(&Event::UserConnect::OnUserConnect, this, exempt); + EventManager::Get()->Dispatch(&Event::UserConnect::OnUserConnect, this, exempt); } static void CollideKill(User *target, const Anope::string &reason) @@ -154,12 +144,9 @@ void User::ChangeNick(const Anope::string &newnick, time_t ts) this->nick = newnick; else { - if (NickServ::service) - { - NickServ::Nick *old_na = NickServ::service->FindNick(this->nick); - if (old_na && (this->IsIdentified(true) || this->IsRecognized())) - old_na->SetLastSeen(Anope::CurTime); - } + NickServ::Nick *old_na = NickServ::FindNick(this->nick); + if (old_na && (this->IsIdentified(true) || this->IsRecognized())) + old_na->SetLastSeen(Anope::CurTime); UserListByNick.erase(this->nick); @@ -191,7 +178,7 @@ void User::ChangeNick(const Anope::string &newnick, time_t ts) } } - Event::OnUserNickChange(&Event::UserNickChange::OnUserNickChange, this, old); + EventManager::Get()->Dispatch(&Event::UserNickChange::OnUserNickChange, this, old); } void User::SetDisplayedHost(const Anope::string &shost) @@ -203,7 +190,7 @@ void User::SetDisplayedHost(const Anope::string &shost) Log(this, "host") << "changed vhost to " << shost; - Event::OnSetDisplayedHost(&Event::SetDisplayedHost::OnSetDisplayedHost, this); + EventManager::Get()->Dispatch(&Event::SetDisplayedHost::OnSetDisplayedHost, this); this->UpdateHost(); } @@ -290,14 +277,12 @@ void User::SetRealname(const Anope::string &srealname) throw CoreException("realname empty in SetRealname"); this->realname = srealname; - if (NickServ::service) - { - //XXX event - NickServ::Nick *na = NickServ::service->FindNick(this->nick); - if (na && (this->IsIdentified(true) || this->IsRecognized())) - na->SetLastRealname(srealname); - } + //XXX event + NickServ::Nick *na = NickServ::FindNick(this->nick); + + if (na && (this->IsIdentified(true) || this->IsRecognized())) + na->SetLastRealname(srealname); Log(this, "realname") << "changed realname to " << srealname; } @@ -311,7 +296,7 @@ User::~User() --this->server->users; } - Event::OnPreUserLogoff(&Event::PreUserLogoff::OnPreUserLogoff, this); + EventManager::Get()->Dispatch(&Event::PreUserLogoff::OnPreUserLogoff, this); ModeManager::StackerDel(this); this->Logout(); @@ -326,7 +311,7 @@ User::~User() if (!this->uid.empty()) UserListByUID.erase(this->uid); - Event::OnPostUserLogoff(&Event::PostUserLogoff::OnPostUserLogoff, this); + EventManager::Get()->Dispatch(&Event::PostUserLogoff::OnPostUserLogoff, this); } void User::SendMessage(const MessageSource &source, const Anope::string &msg) @@ -348,8 +333,6 @@ void User::SendMessage(const MessageSource &source, const Anope::string &msg) Anope::string buf; for (Anope::string word; ssep.GetToken(word);) { - if (word.empty()) - word = " "; Anope::string add = buf.empty() ? word : " " + word; if (buf.length() + add.length() > Config->LineWrap) { @@ -387,7 +370,7 @@ void User::Identify(NickServ::Nick *na) this->Login(na->GetAccount()); - Event::OnNickIdentify(&Event::NickIdentify::OnNickIdentify, this); + EventManager::Get()->Dispatch(&Event::NickIdentify::OnNickIdentify, this); if (this->IsServicesOper()) { @@ -424,7 +407,7 @@ void User::Login(NickServ::Account *core) if (this->server->IsSynced()) Log(this, "account") << "is now identified as " << this->nc->GetDisplay(); - Event::OnUserLogin(&Event::UserLogin::OnUserLogin, this); + EventManager::Get()->Dispatch(&Event::UserLogin::OnUserLogin, this); } void User::Logout() @@ -495,7 +478,7 @@ bool User::IsServicesOper() } EventReturn MOD_RESULT; - MOD_RESULT = Event::OnIsServicesOper(&Event::IsServicesOperEvent::IsServicesOper, this); + MOD_RESULT = EventManager::Get()->Dispatch(&Event::IsServicesOperEvent::IsServicesOper, this); if (MOD_RESULT == EVENT_STOP) return false; @@ -522,7 +505,7 @@ void User::UpdateHost() return; //XXX event - NickServ::Nick *na = NickServ::service ? NickServ::service->FindNick(this->nick) : nullptr; + NickServ::Nick *na = NickServ::FindNick(this->nick); on_access = false; if (na) on_access = na->GetAccount()->IsOnAccess(this); @@ -575,7 +558,7 @@ void User::SetModeInternal(const MessageSource &source, UserMode *um, const Anop if (um->name == "CLOAK" || um->name == "VHOST") this->UpdateHost(); - Event::OnUserModeSet(&Event::UserModeSet::OnUserModeSet, source, this, um->name); + EventManager::Get()->Dispatch(&Event::UserModeSet::OnUserModeSet, source, this, um->name); } void User::RemoveModeInternal(const MessageSource &source, UserMode *um) @@ -594,7 +577,7 @@ void User::RemoveModeInternal(const MessageSource &source, UserMode *um) this->UpdateHost(); } - Event::OnUserModeUnset(&Event::UserModeUnset::OnUserModeUnset, source, this, um->name); + EventManager::Get()->Dispatch(&Event::UserModeUnset::OnUserModeUnset, source, this, um->name); } void User::SetMode(ServiceBot *bi, UserMode *um, const Anope::string ¶m) @@ -781,7 +764,7 @@ void User::Quit(const Anope::string &reason) return; } - Event::OnUserQuit(&Event::UserQuit::OnUserQuit, this, reason); + EventManager::Get()->Dispatch(&Event::UserQuit::OnUserQuit, this, reason); this->quit = true; quitting_users.push_back(this); diff --git a/src/xline.cpp b/src/xline.cpp index 9d518a659..9601db54f 100644 --- a/src/xline.cpp +++ b/src/xline.cpp @@ -88,36 +88,30 @@ void XLine::Recache() } } -XLine::XLine(const Anope::string &ma, const Anope::string &r, const Anope::string &uid) : Serialize::Object(xline) +XLine::~XLine() { - SetMask(ma); - SetReason(r); - SetID(id); + delete regex; + delete c; } -XLine::XLine(const Anope::string &ma, const Anope::string &b, const time_t ex, const Anope::string &r, const Anope::string &uid) : Serialize::Object(xline) +void XLine::SetType(const Anope::string &t) { - SetMask(ma); - SetBy(b); - SetReason(r); - SetID(id); + Set(&XLineType::type, t); } -XLine::~XLine() +Anope::string XLine::GetType() { - delete regex; - delete c; + return Get(&XLineType::type); } void XLine::SetMask(const Anope::string &m) { Set(&XLineType::mask, m); - Recache(); } Anope::string XLine::GetMask() { - return Get(&XLineType::mask); + return Get<Anope::string>(&XLineType::mask); } void XLine::SetBy(const Anope::string &b) @@ -209,6 +203,17 @@ bool XLine::IsRegex() return mask.length() > 2 && mask[0] == '/' && mask[mask.length() - 1] == '/'; } +XLineManager *XLine::GetManager() +{ + return ServiceManager::Get()->FindService<XLineManager *>(GetType()); +} + +void XLineType::Mask::SetField(XLine *s, const Anope::string &value) +{ + Serialize::Field<XLine, Anope::string>::SetField(s, value); + s->Recache(); +} + void XLineManager::RegisterXLineManager(XLineManager *xlm) { XLineManagers.push_back(xlm); @@ -231,32 +236,20 @@ void XLineManager::CheckAll(User *u) Anope::string XLineManager::GenerateUID() { Anope::string id; - int count = 0; - do - { - id.clear(); - - if (++count > 10) - { - Log(LOG_DEBUG) << "Unable to generate XLine UID"; - break; - } - for (int i = 0; i < 10; ++i) - { - char c; - do - c = (rand() % 75) + 48; - while (!isupper(c) && !isdigit(c)); - id += c; - } + for (int i = 0; i < 10; ++i) + { + char c; + do + c = (rand() % 75) + 48; + while (!isupper(c) && !isdigit(c)); + id += c; } - while (0);//XLinesByUID.count(id) > 0); return id; } -XLineManager::XLineManager(Module *creator, const Anope::string &xname, char t) : Service(creator, "XLineManager", xname), type(t) +XLineManager::XLineManager(Module *creator, const Anope::string &xname, char t) : Service(creator, NAME, xname), type(t) { } @@ -274,8 +267,8 @@ std::vector<XLine *> XLineManager::GetXLines() const { std::vector<XLine *> xlines; - for (XLine *x : Serialize::GetObjects<XLine *>(xline)) - if (x->manager == this) + for (XLine *x : Serialize::GetObjects<XLine *>()) + if (x->GetType() == this->GetName()) xlines.push_back(x); return xlines; @@ -283,8 +276,7 @@ std::vector<XLine *> XLineManager::GetXLines() const void XLineManager::AddXLine(XLine *x) { - // XXX this needs to always be set - x->manager = this; + x->SetType(this->GetName()); } XLine* XLineManager::GetEntry(unsigned index) @@ -359,7 +351,7 @@ XLine* XLineManager::HasEntry(const Anope::string &mask) XLine *XLineManager::CheckAllXLines(User *u) { - for (XLine *x : Serialize::GetObjects<XLine *>(xline)) + for (XLine *x : Serialize::GetObjects<XLine *>()) { if (x->GetExpires() && x->GetExpires() < Anope::CurTime) { |