Add IRCBot.panic() - a nicer interface for killing the whole application
This commit is contained in:
parent
ced59a0f74
commit
f8fa529ca5
1 changed files with 19 additions and 4 deletions
|
@ -1,4 +1,4 @@
|
|||
import enum, queue, os, queue, select, socket, threading, time, traceback
|
||||
import enum, queue, os, queue, select, socket, sys, threading, time, traceback
|
||||
import typing, uuid
|
||||
from src import EventManager, Exports, IRCServer, Logging, ModuleManager
|
||||
from src import Socket, utils
|
||||
|
@ -100,6 +100,20 @@ class Bot(object):
|
|||
elif type == TriggerResult.Return:
|
||||
return returned
|
||||
|
||||
def panic(self, reason=None):
|
||||
callback = None
|
||||
|
||||
if not reason == None:
|
||||
self.log.error("panic() called: %s", [reason])
|
||||
|
||||
exception = sys.exc_info()[1]
|
||||
if exception:
|
||||
def _raise():
|
||||
raise exception
|
||||
callback = _raise
|
||||
|
||||
self._event_queue.put(TriggerEvent(TriggerEventType.Kill, callback))
|
||||
|
||||
def load_modules(self, safe: bool=False
|
||||
) -> typing.Tuple[typing.List[str], typing.List[str]]:
|
||||
db_blacklist = set(self.get_setting("module-blacklist", []))
|
||||
|
@ -263,6 +277,8 @@ class Bot(object):
|
|||
raise
|
||||
elif item.type == TriggerEventType.Kill:
|
||||
self._kill()
|
||||
if not item.callback == None:
|
||||
item.callback()
|
||||
|
||||
def _post_send_factory(self, server, lines):
|
||||
return lambda: server._post_send(lines)
|
||||
|
@ -272,9 +288,8 @@ class Bot(object):
|
|||
def _loop_catch(self, name: str, loop: typing.Callable[[], None]):
|
||||
try:
|
||||
loop()
|
||||
except:
|
||||
self.log.critical("Exception on '%s' thread", exc_info=True)
|
||||
self._event_queue.put(TriggerEvent(TriggerEventType.Kill))
|
||||
except Exception as e:
|
||||
self.panic("Exception on '%s' thread" % name)
|
||||
|
||||
def _write_loop(self):
|
||||
while self.running:
|
||||
|
|
Loading…
Reference in a new issue