# 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:
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
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 = {}
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
@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]))
@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]))
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)"