]> jfr.im git - erebus.git/commitdiff
misc fixes
authorJohn Runyon <redacted>
Wed, 14 Dec 2022 00:16:28 +0000 (18:16 -0600)
committerJohn Runyon <redacted>
Wed, 14 Dec 2022 00:16:28 +0000 (18:16 -0600)
bot.py
ctlmod.py
modlib.py
modules/control.py

diff --git a/bot.py b/bot.py
index 578caf2165e2cd974d0665fbbfd790e17af07b04..08c812872cb731372383f5480db50e85d7b8eaf8 100644 (file)
--- 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
index 2799f01ec4f2ecef21d4c98cb86a002a8d863be3..dbf9e08a5faa86abd5ce627da5fc8435f3073bfa 100644 (file)
--- 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 = {}
index 51018f4bd424113bdbb378667dd0f56e83d745bc..ee94e9ee38679a7dd928a89a9b69c1c40677645c 100644 (file)
--- 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
index fab46f6a1d1df57cec1719d28dc96e4e606317b5..aac0257b06907af5ba2e0b1e154aa3fc8b39f6cf 100644 (file)
@@ -47,10 +47,14 @@ def modload(bot, user, chan, realtarget, *args):
 @lib.help("<mod> [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("<mod>", "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)"