aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCara Salter <cara@devcara.com>2023-04-03 09:39:39 -0400
committerCara Salter <cara@devcara.com>2023-04-03 09:39:39 -0400
commit27e58363dde28f4667761970fc7068be8fe047ac (patch)
tree1150459da073130084cd6a1b27076da98679b964
parent53913850062506ff1d98d9d12a46a70db4d6fb08 (diff)
download142bot-27e58363dde28f4667761970fc7068be8fe047ac.tar.gz
142bot-27e58363dde28f4667761970fc7068be8fe047ac.zip
modules: Fix issue with unloading modules bound to OnMessage
When unloaded, modules attached to OnMessage events would still be part of the list used by FOREACH_MOD to send events to, leading to a segfault. This changes the behavior of load and unload to place new modules at the *start* of the event handler arrays, leading them to already be processed by the time the bot gets to the ModuleManager.
-rw-r--r--include/142bot/modules.hpp3
-rw-r--r--modules/mmanager/mmanager.cpp8
-rw-r--r--src/modules.cpp2
3 files changed, 9 insertions, 4 deletions
diff --git a/include/142bot/modules.hpp b/include/142bot/modules.hpp
index 27025b8..3af0253 100644
--- a/include/142bot/modules.hpp
+++ b/include/142bot/modules.hpp
@@ -73,7 +73,8 @@ enum Events
{ \
try \
{ \
- if (!(*_i)->x) { \
+ if (!(*_i)->x) { \
+ list_to_call = loader->EventHandlers[y]; \
break; \
} \
} \
diff --git a/modules/mmanager/mmanager.cpp b/modules/mmanager/mmanager.cpp
index 36b6aae..1a012f9 100644
--- a/modules/mmanager/mmanager.cpp
+++ b/modules/mmanager/mmanager.cpp
@@ -127,7 +127,7 @@ public:
} else {
EmbedSimple("Can't do that, check server logs", message.msg.channel_id);
}
- }else if (lowercase(subcommand) == "ping") {
+ } else if (lowercase(subcommand) == "ping") {
dpp::channel* c = dpp::find_channel(message.msg.channel_id);
if (c) {
std::chrono::steady_clock::time_point start_time = std::chrono::steady_clock::now();
@@ -139,7 +139,11 @@ public:
this->EmbedSimple(fmt::format("**Pong!** REST Response time: {:.3f} ms", microseconds_ping / 1000, 4), cid);
});
}
- } else {
+ } else if (lowercase(subcommand) == "restart") {
+ EmbedSimple("Restarting...", message.msg.channel_id);
+ ::sleep(5);
+ exit(0);
+ } else {
EmbedSimple("Command not found.", message.msg.channel_id);
}
} else {
diff --git a/src/modules.cpp b/src/modules.cpp
index b2e56e1..0c9fb18 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -57,7 +57,7 @@ ModuleLoader::ModuleLoader(Bot* creator): bot(creator) {
void ModuleLoader::attach(const std::vector<Events> &i, Module* m) {
for (auto n = i.begin(); n != i.end(); ++n) {
if (std::find(EventHandlers[*n].begin(), EventHandlers[*n].end(), m) == EventHandlers[*n].end()) {
- EventHandlers[*n].push_back(m);
+ EventHandlers[*n].insert(EventHandlers[*n].begin(), m);
bot->core->log(dpp::ll_info, fmt::format("Module {} attached to event {}", m->description(), StringNames[*n]));
} else {
bot->core->log(dpp::ll_warning, fmt::format("Module {} already attached to event {}", m->description(), StringNames[*n]));