aboutsummaryrefslogtreecommitdiff
path: root/src/IRCBot.py
diff options
context:
space:
mode:
authorGravatar jesopo2019-10-17 16:53:48 +0100
committerGravatar jesopo2019-10-17 16:53:48 +0100
commitaa2511baaa7f28314b8720191b8f3e4d7778de68 (patch)
tree76262c951fc379b4eb591a2b2b49819c9fe2d54a /src/IRCBot.py
parentmove bot.conf.example to docs/ (diff)
signature
add IRCBot.stop() - use it for !shutdown and './bitbotctl stop'
Diffstat (limited to 'src/IRCBot.py')
-rw-r--r--src/IRCBot.py31
1 files changed, 25 insertions, 6 deletions
diff --git a/src/IRCBot.py b/src/IRCBot.py
index da13a739..504dfdc0 100644
--- a/src/IRCBot.py
+++ b/src/IRCBot.py
@@ -50,7 +50,8 @@ class Bot(object):
self._timers = timers
self.start_time = time.time()
- self.running = False
+ self._writing = False
+ self._reading = False
self.servers = {}
self.reconnections = {}
@@ -273,19 +274,37 @@ class Bot(object):
except BitBotPanic:
return
def _run(self):
- self.running = True
+ self._writing = True
+ self._reading = True
+
self._read_thread = self._daemon_thread(
lambda: self._loop_catch("read", self._read_loop))
self._write_thread = self._daemon_thread(
lambda: self._loop_catch("write", self._write_loop))
self._event_loop()
+ def stop(self, reason: str="Stopping"):
+ self._reading = False # disable read thread
+ self.trigger_read()
+ for server in self.servers.values():
+ line = server.send_quit(reason)
+ line.events.on("send").hook(self._shutdown_hook(server))
+ def _shutdown_hook(self, server):
+ def shutdown(e):
+ server.disconnect()
+ self.disconnect(server)
+ if not self.servers:
+ self._writing = False
+ return shutdown
+
def _kill(self):
- self.running = False
+ self._writing = False
+ self._reading = False
self._trigger_both()
def _event_loop(self):
- while self.running or not self._event_queue.empty():
+ while ((self._writing or self._reading) or
+ not self._event_queue.empty()):
try:
item = self._event_queue.get(block=True,
timeout=self.get_poll_timeout())
@@ -320,7 +339,7 @@ class Bot(object):
self.panic("Exception on '%s' thread" % name, throw=False)
def _write_loop(self):
- while self.running:
+ while self._writing:
poll_sources = {}
with self._write_condition:
fds = []
@@ -364,7 +383,7 @@ class Bot(object):
def _read_loop(self):
poll_sources = {}
- while self.running:
+ while self._reading:
new_poll_sources = {}
for poll_source in self._poll_sources:
for fileno in poll_source.get_readables():