aboutsummaryrefslogtreecommitdiff
path: root/src/core_modules/signals.py
diff options
context:
space:
mode:
authorGravatar jesopo2019-12-10 05:27:35 +0000
committerGravatar jesopo2019-12-10 05:27:35 +0000
commit638eee0d685c06d258cb55287204ca97bca7c344 (patch)
tree33442439317ae2846f1efb7674b7a3758c8990a1 /src/core_modules/signals.py
parentmove sys.exit() codes to an enum in utils.consts (diff)
signature
move core modules to src/core_modules, make them uneffected by white/black list
Diffstat (limited to 'src/core_modules/signals.py')
-rw-r--r--src/core_modules/signals.py65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/core_modules/signals.py b/src/core_modules/signals.py
new file mode 100644
index 00000000..921b483c
--- /dev/null
+++ b/src/core_modules/signals.py
@@ -0,0 +1,65 @@
+import signal, sys
+from src import Config, IRCLine, ModuleManager, utils
+
+class Module(ModuleManager.BaseModule):
+ def on_load(self):
+ self._exited = False
+ signal.signal(signal.SIGINT, self.SIGINT)
+ signal.signal(signal.SIGUSR1, self.SIGUSR1)
+ signal.signal(signal.SIGHUP, self.SIGHUP)
+
+ def SIGINT(self, signum, frame):
+ print()
+ self.bot.trigger(lambda: self._kill(signum))
+
+ def _kill(self, signum):
+ if self._exited:
+ return
+ self._exited = True
+
+ self.events.on("signal.interrupt").call(signum=signum)
+
+ written = False
+ for server in list(self.bot.servers.values()):
+ if server.connected:
+ server.socket.clear_send_buffer()
+
+ line = IRCLine.ParsedLine("QUIT", ["Shutting down"])
+ sent_line = server.send(line, immediate=True)
+ sent_line.events.on("send").hook(self._make_hook(server))
+
+ server.send_enabled = False
+ written = True
+
+ if not written:
+ sys.exit()
+
+ def _make_hook(self, server):
+ return lambda e: self._disconnect_hook(server)
+ def _disconnect_hook(self, server):
+ self.bot.disconnect(server)
+ if not self.bot.servers:
+ sys.exit()
+
+ def SIGUSR1(self, signum, frame):
+ self.bot.trigger(self._reload_config)
+
+ def SIGHUP(self, signum, frame):
+ self.bot.trigger(self._SIGHUP)
+ def _SIGHUP(self):
+ self._reload_config()
+ self._reload_modules()
+
+ def _reload_config(self):
+ self.bot.log.info("Reloading config file")
+ self.bot.config.load()
+ self.bot.log.info("Reloaded config file")
+
+ def _reload_modules(self):
+ self.bot.log.info("Reloading modules")
+
+ result = self.bot.try_reload_modules()
+ if result.success:
+ self.bot.log.info(result.message)
+ else:
+ self.bot.log.warn(result.message)