summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2016-07-28 21:29:35 -0400
committerAdam <Adam@anope.org>2016-07-28 21:29:35 -0400
commit0e758a2ac23dc4a001e8e126cec14588da9a9769 (patch)
tree45df813323e023c5c89db7279426c4ad0943b4a9 /src
parenta3c8afae00c54d5b95c620248b51f90679d7d53f (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.cpp106
-rw-r--r--src/base.cpp3
-rw-r--r--src/bots.cpp38
-rw-r--r--src/channels.cpp33
-rw-r--r--src/command.cpp17
-rw-r--r--src/config.cpp29
-rw-r--r--src/event.cpp101
-rw-r--r--src/extensible.cpp6
-rw-r--r--src/init.cpp10
-rw-r--r--src/logger.cpp20
-rw-r--r--src/main.cpp8
-rw-r--r--src/messages.cpp30
-rw-r--r--src/misc.cpp11
-rw-r--r--src/modes.cpp19
-rw-r--r--src/modulemanager.cpp8
-rw-r--r--src/opertype.cpp6
-rw-r--r--src/process.cpp7
-rw-r--r--src/serialize.cpp180
-rw-r--r--src/servers.cpp10
-rw-r--r--src/service.cpp106
-rw-r--r--src/service_manager.cpp144
-rw-r--r--src/uplink.cpp6
-rw-r--r--src/users.cpp57
-rw-r--r--src/xline.cpp70
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> &params)
{
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> &params
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> &params)
@@ -88,9 +89,9 @@ void Join::Run(MessageSource &source, const std::vector<Anope::string> &params)
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> &params
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> &params)
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> &param
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> &param
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> &params)
s->Delete(s->GetName() + " " + s->GetUplink()->GetName());
}
-void Stats::Run(MessageSource &source, const std::vector<Anope::string> &params)
+void Message::Stats::Run(MessageSource &source, const std::vector<Anope::string> &params)
{
User *u = source.GetUser();
@@ -431,7 +431,7 @@ void Stats::Run(MessageSource &source, const std::vector<Anope::string> &params)
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> &params)
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 &param)
@@ -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)
{