From: John Runyon Date: Wed, 14 Dec 2022 00:16:28 +0000 (-0600) Subject: misc fixes X-Git-Url: https://jfr.im/git/erebus.git/commitdiff_plain/68dff4aa28dc38d341c65b3f9a055d395f9fb5c7 misc fixes --- diff --git a/bot.py b/bot.py index 578caf2..08c8128 100644 --- a/bot.py +++ b/bot.py @@ -4,7 +4,7 @@ # Erebus IRC bot - Author: John Runyon # "Bot" and "BotConnection" classes (handling a specific "arm") -import socket, sys, time, threading, os, random +import socket, sys, time, threading, os, random, struct from collections import deque if sys.version_info.major < 3: @@ -494,6 +494,9 @@ class BotConnection(object): def connect(self): self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.socket.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1) # Does Python make SOL_TCP portable? Who knows, it's not documented, and it appears to come from the _socket C lib. + self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 0, 0)) + self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) self.socket.bind((self.bind, 0)) self.socket.connect((self.server, self.port)) return True diff --git a/ctlmod.py b/ctlmod.py index 2799f01..dbf9e08 100644 --- a/ctlmod.py +++ b/ctlmod.py @@ -8,9 +8,9 @@ import sys, time, importlib import modlib if sys.version_info.major >= 3: - from importlib import reload + from importlib import reload # reload is only available as a global in Py2, only in importlib in Py3 else: - importlib.invalidate_caches = lambda: None + importlib.invalidate_caches = lambda: None # invalidate_caches doesn't exist in Py2 modules = {} dependents = {} diff --git a/modlib.py b/modlib.py index 51018f4..ee94e9e 100644 --- a/modlib.py +++ b/modlib.py @@ -121,6 +121,9 @@ class modlib(object): if isinstance(cmd, stringbase): cmd = (cmd,) + if clevel > self.PUBLIC and not needchan: + raise Exception('clevel must be left at default if needchan is False') + func.needchan = needchan func.wantchan = wantchan func.reqglevel = glevel diff --git a/modules/control.py b/modules/control.py index fab46f6..aac0257 100644 --- a/modules/control.py +++ b/modules/control.py @@ -47,10 +47,14 @@ def modload(bot, user, chan, realtarget, *args): @lib.help(" [FORCE]", "unloads a module", "will refuse to unload a module which is depended on by others", "unless you specify FORCE.") @lib.argsGE(1) def modunload(bot, user, chan, realtarget, *args): + if not ctlmod.isloaded(args[0]): + bot.msg(user, "%s is not loaded" % (args[0])) + return if len(ctlmod.dependents[args[0]]) > 0: if len(args) == 1 or args[1].lower() != "force": bot.msg(user, "That module has dependents! Say MODUNLOAD %s FORCE to unload it and any dependents." % (args[0])) return + okay = ctlmod.unload(bot.parent, args[0]) if okay: bot.msg(user, "Unloaded %s" % (args[0])) @@ -61,6 +65,10 @@ def modunload(bot, user, chan, realtarget, *args): @lib.help("", "reloads a module") @lib.argsEQ(1) def modreload(bot, user, chan, realtarget, *args): + if not ctlmod.isloaded(args[0]): + bot.msg(user, "%s is not loaded" % (args[0])) + return + okay = ctlmod.reloadmod(bot.parent, args[0]) if okay: bot.msg(user, "Reloaded %s" % (args[0])) @@ -92,8 +100,9 @@ def _whois(user, chan, showglevel=True, showclevel=True): fmt += " (not staff)" if showclevel and chan is not None: - if chan.levelof(user.auth) >= 1: - fillers['clevel'] = chan.levelof(user.auth) + clev = chan.levelof(user.auth) + if clev >= 1: + fillers['clevel'] = (lib.clevs[clev] if clev < len(lib.clevs) else clev) fmt += " (channel access: %(clevel)s)" else: fmt += " (not a channel user)"