[Pybot-commits] CVS: pybot/pybot runner.py,NONE,1.1 __init__.py,1.1.1.1,1.2 command.py,1.1.1.1,1.2 c
Brought to you by:
niemeyer
From: Gustavo N. <nie...@us...> - 2001-12-04 00:57:41
|
Update of /cvsroot/pybot/pybot/pybot In directory usw-pr-cvs1:/tmp/cvs-serv32496/pybot Modified Files: __init__.py command.py core.py hook.py main.py misc.py module.py option.py server.py user.py Added Files: runner.py Log Message: - Implemented new startup system. - Converted tabs to spaces so people using other editors feel confortable as well (suggested by John Thingstad). --- NEW FILE: runner.py --- #!/usr/bin/python # # Copyright (c) 2000-2001 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. # # pybot is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # pybot is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with pybot; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import sys import os # Add upper directory to search path in case we are in development tree. sys.path[0] = os.path.dirname(sys.path[0]) import pybot def print_cmd(cmd): print "Command(%s): %s"%(cmd.cmd, cmd.line) def print_msg(msg): print "Message(%s/%s): %s"%(msg.target, msg.user.nick, msg.line) def print_not(msg): print "Notice(%s/%s): %s"%(msg.target, msg.user.nick, msg.line) def print_connected(server): print "Connected to %s!"%server.servername def print_connection_error(server): print "Connection error on %s!"%server.servername def print_connecting_error(server): print "Error connecting to %s!"%server.servername def main(): pybot.init() # Initialize globaly acessible data pybot.hooks.register("Command", print_cmd) pybot.hooks.register("Message", print_msg) pybot.hooks.register("Notice", print_not) pybot.hooks.register("Connected", print_connected) pybot.hooks.register("ConnectionError", print_connection_error) pybot.hooks.register("ConnectingError", print_connecting_error) pybot.modls.load("options") pybot.modls.load("modulecontrol") ret = pybot.main.loop() sys.exit(ret) if __name__ == "__main__": main() # vim:ts=4:sw=4:et Index: __init__.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/__init__.py,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** __init__.py 2001/11/02 17:20:19 1.1.1.1 --- __init__.py 2001/12/04 00:57:37 1.2 *************** *** 18,54 **** def init(): ! from pybot.module import Modules, ModuleMethods, SoapMethods ! from pybot.option import Options ! from pybot.server import Servers ! from pybot.hook import Hooks ! from pybot.main import Main ! ! from ConfigParser import ConfigParser ! import os ! ! global main, modls, servers, options, hooks, mm, sm, config ! ! hooks = Hooks() ! servers = Servers() ! options = Options() ! modls = Modules() ! mm = ModuleMethods() ! sm = SoapMethods() ! config = ConfigParser() ! defaults = config.defaults() ! ! if os.path.isfile("./pybot.conf") and os.path.isdir("pybot"): ! config.read("./pybot.conf") ! defaults["datadir"] = os.path.abspath("./data") ! elif os.path.isfile(os.path.expanduser("~/.pybot/pybot.conf")): ! config.read(os.path.expanduser("~/.pybot/pybot.conf")) ! defaults["datadir"] = os.path.expanduser("~/.pybot/data") ! elif os.path.isfile("/etc/pybot.conf"): ! config.read("/etc/pybot.conf") ! defaults["datadir"] = ("/usr/share/pybot") ! ! main = Main() ! ! # vim:ts=4:sw=4 --- 18,54 ---- def init(): ! from pybot.module import Modules, ModuleMethods, SoapMethods ! from pybot.option import Options ! from pybot.server import Servers ! from pybot.hook import Hooks ! from pybot.main import Main ! ! from ConfigParser import ConfigParser ! import os ! ! global main, modls, servers, options, hooks, mm, sm, config ! ! hooks = Hooks() ! servers = Servers() ! options = Options() ! modls = Modules() ! mm = ModuleMethods() ! sm = SoapMethods() ! config = ConfigParser() ! defaults = config.defaults() ! ! if os.path.isfile("./pybot.conf") and os.path.isdir("pybot"): ! config.read("./pybot.conf") ! defaults["datadir"] = os.path.abspath("./data") ! elif os.path.isfile(os.path.expanduser("~/.pybot/pybot.conf")): ! config.read(os.path.expanduser("~/.pybot/pybot.conf")) ! defaults["datadir"] = os.path.expanduser("~/.pybot/data") ! elif os.path.isfile("/etc/pybot.conf"): ! config.read("/etc/pybot.conf") ! defaults["datadir"] = ("/usr/share/pybot") ! ! main = Main() ! ! # vim:ts=4:sw=4:et Index: command.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/command.py,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** command.py 2001/11/02 17:20:22 1.1.1.1 --- command.py 2001/12/04 00:57:38 1.2 *************** *** 25,317 **** class Command: ! re = re.compile("(?::(\\S*) )?(\\w+) ((\\S+) :(?:\01(\\w+) )?((?:\\W*(\\w+)\\W*\\s)?(.*?))(?:\01)?|.*)$") ! ! def __init__(self): ! self.user = User() ! def setline(self, server=None, line=None): ! self.server = server ! ## Maintaining temporarly for compatibility with old modules ! tokens = split(line) ! if len(tokens) == 0: ! return ! if tokens[0][0] == ":": ! if len(tokens) == 1: ! return ! self.prefix = tokens[0][1:] ! self.cmd = tokens[1] ! self.params = tokens[2:] ! else: ! self.prefix = "" ! self.cmd = tokens[0] ! self.params = tokens[1:] ! self.line = line ! self._internalset() ! ## ! m = self.re.match(line) ! if m: ! nick = self.server.user.nick ! self.prefix = m.group(1) or "" ! self.user.setstring(self.prefix) ! self.cmd = m.group(2) ! # _index is used for speed purposes and shouldn't be ! # used by modules. ! try: ! # Message = 0, Notice = 1 ! self._index = ["PRIVMSG", "NOTICE"].index(self.cmd) ! except: ! # Command = 2 ! self._index = 2 ! self.line = self.rawline = m.group(3) ! self.target = "" ! self.ctcp = "" ! self.forme = 0 ! self.direct = 0 ! self.answertarget = "" ! else: ! self.target = m.group(4) ! self.ctcp = m.group(5) ! if self.ctcp: ! self._index += 3 # CTCP = 3, CTCPReply = 4 ! self.rawline = m.group(6) ! if m.group(7) == nick: ! self.line = m.group(8) ! self.forme = 1 ! else: ! self.line = self.rawline ! self.forme = 0 ! if self.target == nick: ! self.forme = 1 ! self.direct = 1 ! self.answertarget = self.user.nick ! else: ! self.direct = 0 ! self.answertarget = self.target ! else: ! self.target = "" ! self.answertarget = "" ! self.forme = 0 ! self.direct = 0 ! self.line = "" ! self.rawline = "" ! self._index = 2 ! ! def _internalset(self): ! self.user.setstring(self.prefix) ! if self.params: ! self.target = self.params[0] ! nick = self.server.user.nick ! if len(self.params) > 1: ! self.msg = [self.params[1][1:]] + self.params[2:] ! self.rawmsg = self.msg[:] ! punct = "" ! while self.msg and self.msg[-1] and self.msg[-1][-1] in [".","!","?"]: ! punct = self.msg[-1][-1] + punct ! self.msg[-1] = self.msg[-1][:-1] ! if not self.msg[-1]: ! del self.msg[-1] ! if punct: ! self.msg.append(punct) ! if re.compile("\W*%s\W*$"%nick).match(self.msg[0]): ! del self.msg[0] ! self.forme = 1 ! else: ! self.forme = 0 ! else: ! self.msg = [] ! self.rawmsg = [] ! self.forme = 0 ! if self.target == nick: ! self.forme = 1 ! self.direct = 1 ! self.answertarget = self.user.nick ! else: ! self.direct = 0 ! self.answertarget = self.target ! else: ! self.target = "" ! self.answertarget = "" ! self.msg = [] ! self.rawmsg = [] ! self.forme = 0 ! self.direct = 0 ! def answer(self, *params, **kw): ! self.server.sendmsg(self.answertarget, self.user.nick, *params, **kw) ! ! def match(self, var, varn, *pattern): ! if varn != 0: ! var[:] = [None]*varn ! try: ! n = self._match(var, 0, self.msg, pattern) ! except MatchError: ! return None ! if n == len(self.msg): ! return 1 ! def _match(self, var, n, query, pattern): ! l = len(query) ! lp = len(pattern) ! i = 0 ! while i < lp: ! tok = pattern[i] ! if type(tok) == TupleType: ! n = self._match(var, n, query, tok) ! elif type(tok) == ListType: ! n = self._matchany(var, n, query, tok) ! elif n >= l: ! raise MatchError ! elif type(tok) == IntType: ! pos = tok ! i = i+1 ! tok = pattern[i] ! if tok == "~": ! var[pos] = query[n] ! elif tok[0] == "~": ! if lower(query[n]) != tok[1:]: ! raise MatchError ! var[pos] = query[n] ! elif tok[0] == "^": ! if not re.compile(tok[1:]).match(lower(query[n])): ! raise MatchError ! var[pos] = query[n] ! elif tok[0] == "|": ! n = self._matchmany(var, pos, n, query, pattern[i+1:], tok) - 1 ! n = n + 1 ! else: ! if tok == "&": ! pass ! elif tok[0] == "&": ! if not re.compile(tok[1:]).match(lower(query[n])): ! raise MatchError ! elif tok == "%": ! if not self.forme: ! raise MatchError ! n = n - 1 ! elif tok[0] == "/": ! if not lower(self.server.user.nick)+tok[1:] == query[n]: ! raise MatchError ! elif tok == ".": ! if 0 in map(lambda x: x == ".", query[n]): ! raise MatchError ! elif tok == "!": ! if 0 in map(lambda x: x == "!", query[n]): ! raise MatchError ! elif tok == "?": ! if "?" not in query[n] or 0 in map(lambda x: x in ["!","?"], query[n]): ! raise MatchError ! elif tok[0] == "\\": ! if lower(query[n]) != tok[1:]: ! raise MatchError ! elif lower(query[n]) != tok: ! raise MatchError ! n = n + 1 ! i = i + 1 ! return n ! ! def _matchany(self, var, n, query, pattern): ! l = len(query) ! lp = len(pattern) ! i = 0 ! while i < lp: ! tok = pattern[i] ! if type(tok) == TupleType: ! try: ! return self._match(var, n, query, tok) ! except MatchError: pass ! elif type(tok) == ListType: ! try: ! return self._matchany(var, n, query, tok) ! except MatchError: pass ! elif tok == None: ! return n ! elif n >= l: ! pass ! elif type(tok) == IntType: ! pos = tok ! i = i+1 ! tok = pattern[i] ! if tok == "~": ! var[pos] = query[n] ! return n + 1 ! elif tok[0] == "~": ! if lower(query[n]) == tok[1:]: ! var[pos] = query[n] ! return n + 1 ! elif tok[0] == "^": ! if re.compile(tok[1:]).match(lower(query[n])): ! var[pos] = query[n] ! return n + 1 ! elif tok[0] == "|": ! try: ! n = self._matchmany(var, pos, n, query, pattern[i+1:], tok) ! return n ! except MatchError: pass ! else: ! if tok == "&": ! return n + 1 ! elif tok[0] == "&": ! if re.compile(tok[1:]).match(lower(query[n])): ! return n + 1 ! elif tok == "%": ! if self.forme: ! return n ! elif tok[0] == "/": ! if lower(self.server.user.nick)+tok[1:] == lower(query[n]): ! return n + 1 ! elif tok == ".": ! if 0 not in map(lambda x: x == ".", query[n]): ! return n + 1 ! elif tok == "!": ! if 0 not in map(lambda x: x == "!", query[n]): ! return n + 1 ! elif tok == "?": ! if "?" in query[n] and 0 not in map(lambda x: x in ["!","?"], query[n]): ! return n + 1 ! elif tok[0] == "\\": ! if lower(query[n]) == tok[1:]: ! return n + 1 ! elif lower(query[n]) == tok: ! return n + 1 ! i = i + 1 ! raise MatchError ! ! def _matchmany(self, var, pos, n, query, pattern, str): ! l = len(query) ! a = 0 ! b = 0 ! ab = split(str[1:-1],",") ! if len(ab) == 1: ! try: ! a = b = int(ab[0]) ! b = b+n+1 ! except ValueError: pass ! elif len(ab) == 2: ! try: a = int(ab[0]) ! except ValueError: pass ! try: ! b = int(ab[1]) ! b = b+n+1 ! except ValueError: pass ! a = a+n ! if a > l: ! raise MatchError ! if b > l: ! b = 0 ! if str[-1] == "<": ! if b == 0: b = l+1 ! else: b = b+1 ! step = 1 ! else: ! if b == 0: b = l+1 ! step = -1 ! a, b = b-1, a-1 ! for i in range(a,b,step): ! try: ! self._match(var, i, query, pattern) ! var[pos] = query[n:i] ! return i ! except MatchError: pass ! raise MatchError ! # vim:ts=4:sw=4 --- 25,319 ---- class Command: ! re = re.compile("(?::(\\S*) )?(\\w+) ((\\S+) :(?:\01(\\w+) )?((?:\\W*(\\w+)\\W*\\s)?(.*?))(?:\01)?|.*)$") ! ! def __init__(self): ! self.user = User() ! def setline(self, server=None, line=None): ! self.server = server ! ## Maintaining temporarly for compatibility with old modules ! tokens = split(line) ! if len(tokens) == 0: ! return ! if tokens[0][0] == ":": ! if len(tokens) == 1: ! return ! self.prefix = tokens[0][1:] ! self.cmd = tokens[1] ! self.params = tokens[2:] ! else: ! self.prefix = "" ! self.cmd = tokens[0] ! self.params = tokens[1:] ! self.line = line ! self._internalset() ! ## ! m = self.re.match(line) ! if m: ! nick = self.server.user.nick ! self.prefix = m.group(1) or "" ! self.user.setstring(self.prefix) ! self.cmd = m.group(2) ! # _index is used for speed purposes and shouldn't be ! # used by modules. ! try: ! # Message = 0, Notice = 1 ! self._index = ["PRIVMSG", "NOTICE"].index(self.cmd) ! except: ! # Command = 2 ! self._index = 2 ! self.line = self.rawline = m.group(3) ! self.target = "" ! self.ctcp = "" ! self.forme = 0 ! self.direct = 0 ! self.answertarget = "" ! else: ! self.target = m.group(4) ! self.ctcp = m.group(5) ! if self.ctcp: ! self._index += 3 # CTCP = 3, CTCPReply = 4 ! self.rawline = m.group(6) ! if m.group(7) == nick: ! self.line = m.group(8) ! self.forme = 1 ! else: ! self.line = self.rawline ! self.forme = 0 ! if self.target == nick: ! self.forme = 1 ! self.direct = 1 ! self.answertarget = self.user.nick ! else: ! self.direct = 0 ! self.answertarget = self.target ! else: ! self.target = "" ! self.answertarget = "" ! self.forme = 0 ! self.direct = 0 ! self.line = "" ! self.rawline = "" ! self._index = 2 ! ! def _internalset(self): ! self.user.setstring(self.prefix) ! if self.params: ! self.target = self.params[0] ! nick = self.server.user.nick ! if len(self.params) > 1: ! self.msg = [self.params[1][1:]] + self.params[2:] ! self.rawmsg = self.msg[:] ! punct = "" ! while self.msg and self.msg[-1] and self.msg[-1][-1] in [".","!","?"]: ! punct = self.msg[-1][-1] + punct ! self.msg[-1] = self.msg[-1][:-1] ! if not self.msg[-1]: ! del self.msg[-1] ! if punct: ! self.msg.append(punct) ! if re.compile("\W*%s\W*$"%nick).match(self.msg[0]): ! del self.msg[0] ! self.forme = 1 ! else: ! self.forme = 0 ! else: ! self.msg = [] ! self.rawmsg = [] ! self.forme = 0 ! if self.target == nick: ! self.forme = 1 ! self.direct = 1 ! self.answertarget = self.user.nick ! else: ! self.direct = 0 ! self.answertarget = self.target ! else: ! self.target = "" ! self.answertarget = "" ! self.msg = [] ! self.rawmsg = [] ! self.forme = 0 ! self.direct = 0 ! def answer(self, *params, **kw): ! self.server.sendmsg(self.answertarget, self.user.nick, *params, **kw) ! ! # FIXME: These should be removed as soon as all modules ! # start using regexps ! def match(self, var, varn, *pattern): ! if varn != 0: ! var[:] = [None]*varn ! try: ! n = self._match(var, 0, self.msg, pattern) ! except MatchError: ! return None ! if n == len(self.msg): ! return 1 ! def _match(self, var, n, query, pattern): ! l = len(query) ! lp = len(pattern) ! i = 0 ! while i < lp: ! tok = pattern[i] ! if type(tok) == TupleType: ! n = self._match(var, n, query, tok) ! elif type(tok) == ListType: ! n = self._matchany(var, n, query, tok) ! elif n >= l: ! raise MatchError ! elif type(tok) == IntType: ! pos = tok ! i = i+1 ! tok = pattern[i] ! if tok == "~": ! var[pos] = query[n] ! elif tok[0] == "~": ! if lower(query[n]) != tok[1:]: ! raise MatchError ! var[pos] = query[n] ! elif tok[0] == "^": ! if not re.compile(tok[1:]).match(lower(query[n])): ! raise MatchError ! var[pos] = query[n] ! elif tok[0] == "|": ! n = self._matchmany(var, pos, n, query, pattern[i+1:], tok) - 1 ! n = n + 1 ! else: ! if tok == "&": ! pass ! elif tok[0] == "&": ! if not re.compile(tok[1:]).match(lower(query[n])): ! raise MatchError ! elif tok == "%": ! if not self.forme: ! raise MatchError ! n = n - 1 ! elif tok[0] == "/": ! if not lower(self.server.user.nick)+tok[1:] == query[n]: ! raise MatchError ! elif tok == ".": ! if 0 in map(lambda x: x == ".", query[n]): ! raise MatchError ! elif tok == "!": ! if 0 in map(lambda x: x == "!", query[n]): ! raise MatchError ! elif tok == "?": ! if "?" not in query[n] or 0 in map(lambda x: x in ["!","?"], query[n]): ! raise MatchError ! elif tok[0] == "\\": ! if lower(query[n]) != tok[1:]: ! raise MatchError ! elif lower(query[n]) != tok: ! raise MatchError ! n = n + 1 ! i = i + 1 ! return n ! ! def _matchany(self, var, n, query, pattern): ! l = len(query) ! lp = len(pattern) ! i = 0 ! while i < lp: ! tok = pattern[i] ! if type(tok) == TupleType: ! try: ! return self._match(var, n, query, tok) ! except MatchError: pass ! elif type(tok) == ListType: ! try: ! return self._matchany(var, n, query, tok) ! except MatchError: pass ! elif tok == None: ! return n ! elif n >= l: ! pass ! elif type(tok) == IntType: ! pos = tok ! i = i+1 ! tok = pattern[i] ! if tok == "~": ! var[pos] = query[n] ! return n + 1 ! elif tok[0] == "~": ! if lower(query[n]) == tok[1:]: ! var[pos] = query[n] ! return n + 1 ! elif tok[0] == "^": ! if re.compile(tok[1:]).match(lower(query[n])): ! var[pos] = query[n] ! return n + 1 ! elif tok[0] == "|": ! try: ! n = self._matchmany(var, pos, n, query, pattern[i+1:], tok) ! return n ! except MatchError: pass ! else: ! if tok == "&": ! return n + 1 ! elif tok[0] == "&": ! if re.compile(tok[1:]).match(lower(query[n])): ! return n + 1 ! elif tok == "%": ! if self.forme: ! return n ! elif tok[0] == "/": ! if lower(self.server.user.nick)+tok[1:] == lower(query[n]): ! return n + 1 ! elif tok == ".": ! if 0 not in map(lambda x: x == ".", query[n]): ! return n + 1 ! elif tok == "!": ! if 0 not in map(lambda x: x == "!", query[n]): ! return n + 1 ! elif tok == "?": ! if "?" in query[n] and 0 not in map(lambda x: x in ["!","?"], query[n]): ! return n + 1 ! elif tok[0] == "\\": ! if lower(query[n]) == tok[1:]: ! return n + 1 ! elif lower(query[n]) == tok: ! return n + 1 ! i = i + 1 ! raise MatchError ! ! def _matchmany(self, var, pos, n, query, pattern, str): ! l = len(query) ! a = 0 ! b = 0 ! ab = split(str[1:-1],",") ! if len(ab) == 1: ! try: ! a = b = int(ab[0]) ! b = b+n+1 ! except ValueError: pass ! elif len(ab) == 2: ! try: a = int(ab[0]) ! except ValueError: pass ! try: ! b = int(ab[1]) ! b = b+n+1 ! except ValueError: pass ! a = a+n ! if a > l: ! raise MatchError ! if b > l: ! b = 0 ! if str[-1] == "<": ! if b == 0: b = l+1 ! else: b = b+1 ! step = 1 ! else: ! if b == 0: b = l+1 ! step = -1 ! a, b = b-1, a-1 ! for i in range(a,b,step): ! try: ! self._match(var, i, query, pattern) ! var[pos] = query[n:i] ! return i ! except MatchError: pass ! raise MatchError ! # vim:ts=4:sw=4:et Index: core.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/core.py,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** core.py 2001/11/02 17:20:21 1.1.1.1 --- core.py 2001/12/04 00:57:38 1.2 *************** *** 20,62 **** class User: ! def __init__(self, nick="", username="", host=""): ! self.nick = nick ! self.username = username ! self.host = host ! self.string = nick+"!"+username+"@"+host ! def setstring(self, str): ! tokens = split(str, "!") ! if len(tokens) == 2: ! self.nick = tokens[0] ! tokens = split(tokens[1],"@") ! if len(tokens) == 2: ! self.username, self.host = tokens ! self.string = str ! return ! self.nick = "" ! self.username = "" ! self.host = "" ! self.string = "" ! ! def set(self, nick="", username="", host=""): ! self.nick = nick ! self.username = username ! self.host = host ! self.string = nick+"!"+username+"@"+host ! ! def match(self, nick="*", username="*", host="*"): ! if (nick=="*" or nick==self.nick) and \ ! (username=="*" or username==self.username) and \ ! (host=="*" or (host[0]=="*" and host[1:]==self.host[-(len(host)-1):]) or host==self.host): ! return 1 ! ! def matchstr(self, str): ! tokens = split(str, "!") ! if len(tokens) == 2: ! nick = tokens[0] ! tokens = split(tokens[1],"@") ! if len(tokens) == 2: ! username, host = tokens ! return self.match(nick, username, host) --- 20,63 ---- class User: ! def __init__(self, nick="", username="", host=""): ! self.nick = nick ! self.username = username ! self.host = host ! self.string = nick+"!"+username+"@"+host ! def setstring(self, str): ! tokens = split(str, "!") ! if len(tokens) == 2: ! self.nick = tokens[0] ! tokens = split(tokens[1],"@") ! if len(tokens) == 2: ! self.username, self.host = tokens ! self.string = str ! return ! self.nick = "" ! self.username = "" ! self.host = "" ! self.string = "" ! ! def set(self, nick="", username="", host=""): ! self.nick = nick ! self.username = username ! self.host = host ! self.string = nick+"!"+username+"@"+host ! ! def match(self, nick="*", username="*", host="*"): ! if (nick=="*" or nick==self.nick) and \ ! (username=="*" or username==self.username) and \ ! (host=="*" or (host[0]=="*" and host[1:]==self.host[-(len(host)-1):]) or host==self.host): ! return 1 ! ! def matchstr(self, str): ! tokens = split(str, "!") ! if len(tokens) == 2: ! nick = tokens[0] ! tokens = split(tokens[1],"@") ! if len(tokens) == 2: ! username, host = tokens ! return self.match(nick, username, host) + # vim:ts=4:sw=4:et Index: hook.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/hook.py,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** hook.py 2001/11/02 17:20:19 1.1.1.1 --- hook.py 2001/12/04 00:57:38 1.2 *************** *** 21,58 **** class Hooks: ! def __init__(self): ! self.__hook = {} ! ! def register(self, hookname, hookfunc, priority=500, threaded=0): ! hook = self.__hook.get(hookname) ! if not hook: ! self.__hook[hookname] = [(hookfunc,priority,threaded)] ! else: ! l = len(hook) ! i = 0 ! while i < l: ! if hook[i][1] > priority: ! hook.insert(i,(hookfunc,priority,threaded)) ! return ! i = i + 1 ! hook.append((hookfunc,priority,threaded)) ! ! def unregister(self, hookname, hookfunc, priority=500, threaded=0): ! self.__hook[hookname].remove((hookfunc,priority,threaded)) ! ! def call(self, hookname, *hookparam, **hookkwparam): ! ret = [] ! if self.__hook.has_key(hookname): ! for hook in self.__hook[hookname][:]: ! try: ! if hook[2]: ! start_new_thread(hook[0], hookparam, hookkwparam) ! else: ! val = apply(hook[0],hookparam,hookkwparam) ! ret.append(val) ! if val == -1: break ! except: ! traceback.print_exc() ! return ret ! # vim:ts=4:sw=4 --- 21,58 ---- class Hooks: ! def __init__(self): ! self.__hook = {} ! ! def register(self, hookname, hookfunc, priority=500, threaded=0): ! hook = self.__hook.get(hookname) ! if not hook: ! self.__hook[hookname] = [(hookfunc,priority,threaded)] ! else: ! l = len(hook) ! i = 0 ! while i < l: ! if hook[i][1] > priority: ! hook.insert(i,(hookfunc,priority,threaded)) ! return ! i = i + 1 ! hook.append((hookfunc,priority,threaded)) ! ! def unregister(self, hookname, hookfunc, priority=500, threaded=0): ! self.__hook[hookname].remove((hookfunc,priority,threaded)) ! ! def call(self, hookname, *hookparam, **hookkwparam): ! ret = [] ! if self.__hook.has_key(hookname): ! for hook in self.__hook[hookname][:]: ! try: ! if hook[2]: ! start_new_thread(hook[0], hookparam, hookkwparam) ! else: ! val = apply(hook[0],hookparam,hookkwparam) ! ret.append(val) ! if val == -1: break ! except: ! traceback.print_exc() ! return ret ! # vim:ts=4:sw=4:et Index: main.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/main.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** main.py 2001/11/22 13:43:17 1.2 --- main.py 2001/12/04 00:57:38 1.3 *************** *** 27,96 **** class Main: ! """Main pybot class. ! """ ! def __init__(self): ! random.seed(time()) ! self.reboot = 0 ! self.quit = 0 ! # Aaron told SIGQUIT is not available in Windows. We must figure ! # out which platforms it is available and what's the most clean ! # way to use it. ! # signal.signal(signal.SIGQUIT, self.signalhandler) ! signal.signal(signal.SIGTERM, self.signalhandler) ! ! def signalhandler(self, signum, frame): ! self.quit = 1 ! for server in self.servers: ! server.sendline("QUIT :Argh!") ! ! def loop(self): ! hooknames = ["Message", "Notice", "Command", "CTCP", "CTCPReply"] ! callhook = pybot.hooks.call ! servers = pybot.servers.getall() ! myrange = range ! killed = [] ! try: ! while 1: ! for i in killed: ! del servers[i] ! killed = [] ! for i in myrange(len(servers)): ! server = servers[i] ! server.interaction() ! if server.killed: ! killed.append(i) ! else: ! for n in myrange(10): ! line = server.readline() ! if not line: ! break ! cmd = Command() ! cmd.setline(server, line) ! hookname = hooknames[cmd._index] ! ret = callhook(hookname, cmd) ! if cmd.forme and cmd._index == 0 and not (0 in ret or -1 in ret): ! callhook("UnhandledMessage", cmd) ! callhook("Loop") ! sleep(0.5) ! if self.reboot: ! for server in servers: ! server.kill() ! server.interaction() ! callhook("Reboot") ! sleep(2) ! return 0 ! elif self.quit: ! for server in servers: ! server.kill() ! server.interaction() ! callhook("Quit") ! return 100 ! except KeyboardInterrupt: ! for server in servers: ! server.sendline("QUIT :Argh!") ! server.kill() ! server.interaction() ! callhook("Quit") ! return 100 ! # vim:ts=4:sw=4 --- 27,96 ---- class Main: ! """Main pybot class. ! """ ! def __init__(self): ! random.seed(time()) ! self.reboot = 0 ! self.quit = 0 ! # Aaron told SIGQUIT is not available in Windows. We must figure ! # out which platforms it is available and what's the most clean ! # way to use it. ! # signal.signal(signal.SIGQUIT, self.signalhandler) ! signal.signal(signal.SIGTERM, self.signalhandler) ! ! def signalhandler(self, signum, frame): ! self.quit = 1 ! for server in self.servers: ! server.sendline("QUIT :Argh!") ! ! def loop(self): ! hooknames = ["Message", "Notice", "Command", "CTCP", "CTCPReply"] ! callhook = pybot.hooks.call ! servers = pybot.servers.getall() ! myrange = range ! killed = [] ! try: ! while 1: ! for i in killed: ! del servers[i] ! killed = [] ! for i in myrange(len(servers)): ! server = servers[i] ! server.interaction() ! if server.killed: ! killed.append(i) ! else: ! for n in myrange(10): ! line = server.readline() ! if not line: ! break ! cmd = Command() ! cmd.setline(server, line) ! hookname = hooknames[cmd._index] ! ret = callhook(hookname, cmd) ! if cmd.forme and cmd._index == 0 and not (0 in ret or -1 in ret): ! callhook("UnhandledMessage", cmd) ! callhook("Loop") ! sleep(0.5) ! if self.reboot: ! for server in servers: ! server.kill() ! server.interaction() ! callhook("Reboot") ! sleep(2) ! return 0 ! elif self.quit: ! for server in servers: ! server.kill() ! server.interaction() ! callhook("Quit") ! return 100 ! except KeyboardInterrupt: ! for server in servers: ! server.sendline("QUIT :Argh!") ! server.kill() ! server.interaction() ! callhook("Quit") ! return 100 ! # vim:ts=4:sw=4:et Index: misc.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/misc.py,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** misc.py 2001/11/02 17:20:19 1.1.1.1 --- misc.py 2001/12/04 00:57:38 1.2 *************** *** 26,90 **** def buildanswer(pattern, target=None, nick=None): ! ret = [] ! for tok in pattern: ! if type(tok) == TupleType: ! recret = buildanswer(tok, target, nick) ! ret = ret + recret ! elif type(tok) == ListType or type(tok) == InstanceType: ! tmptok = tok[randint(0,len(tok)-1)] ! if type(tmptok) == StringType: ! # Avoid using string as a list. This must be fixed ! # to handle '%...' strings. ! ret.append(tmptok) ! elif tmptok != None: ! recret = buildanswer(tmptok, target, nick) ! ret.append(recret) ! elif tok[0] == ":": ! tok = tok[1:] ! if tok[0] == "%": ! if nick != target: ! ret.append(":"+nick+tok[1:]) ! elif tok[0] == "/": ! ret.append(":"+nick+tok[1:]) ! elif tok[0] == "\\": ! ret.append(":"+tok[1:]) ! elif tok != None: ! ret.append(":"+tok) ! else: ! if tok[0] == "%": ! if nick != target: ! ret.append(nick+tok[1:]) ! elif tok[0] == "/": ! ret.append(nick+tok[1:]) ! elif tok[0] == "\\": ! ret.append(tok[1:]) ! elif tok != None: ! ret.append(tok) ! if ret: ! str = ret[0] ! for tok in ret[1:]: ! if tok[0] in [".","!","?",","]: ! str = str+tok ! else: ! str = str+" "+tok ! else: ! str = "" ! return str def breakline(line): ! lenline = len(line) ! sublines = [] ! startpos = 0 ! endpos = MAXLINESIZE ! while 1: ! if endpos > lenline: ! sublines.append(line[startpos:]) ! return sublines ! pos = rfind(line, " ", startpos, endpos) ! if pos != -1: ! endpos = pos ! sublines.append(line[startpos:endpos]) ! startpos = endpos ! endpos = startpos+MAXLINESIZE ! # vim:ts=4:sw=4 --- 26,90 ---- def buildanswer(pattern, target=None, nick=None): ! ret = [] ! for tok in pattern: ! if type(tok) == TupleType: ! recret = buildanswer(tok, target, nick) ! ret = ret + recret ! elif type(tok) == ListType or type(tok) == InstanceType: ! tmptok = tok[randint(0,len(tok)-1)] ! if type(tmptok) == StringType: ! # Avoid using string as a list. This must be fixed ! # to handle '%...' strings. ! ret.append(tmptok) ! elif tmptok != None: ! recret = buildanswer(tmptok, target, nick) ! ret.append(recret) ! elif tok[0] == ":": ! tok = tok[1:] ! if tok[0] == "%": ! if nick != target: ! ret.append(":"+nick+tok[1:]) ! elif tok[0] == "/": ! ret.append(":"+nick+tok[1:]) ! elif tok[0] == "\\": ! ret.append(":"+tok[1:]) ! elif tok != None: ! ret.append(":"+tok) ! else: ! if tok[0] == "%": ! if nick != target: ! ret.append(nick+tok[1:]) ! elif tok[0] == "/": ! ret.append(nick+tok[1:]) ! elif tok[0] == "\\": ! ret.append(tok[1:]) ! elif tok != None: ! ret.append(tok) ! if ret: ! str = ret[0] ! for tok in ret[1:]: ! if tok[0] in [".","!","?",","]: ! str = str+tok ! else: ! str = str+" "+tok ! else: ! str = "" ! return str def breakline(line): ! lenline = len(line) ! sublines = [] ! startpos = 0 ! endpos = MAXLINESIZE ! while 1: ! if endpos > lenline: ! sublines.append(line[startpos:]) ! return sublines ! pos = rfind(line, " ", startpos, endpos) ! if pos != -1: ! endpos = pos ! sublines.append(line[startpos:endpos]) ! startpos = endpos ! endpos = startpos+MAXLINESIZE ! # vim:ts=4:sw=4:et Index: module.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/module.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** module.py 2001/11/14 15:28:41 1.2 --- module.py 2001/12/04 00:57:38 1.3 *************** *** 21,136 **** class Modules: ! def __init__(self): ! self.__modules = {} ! ! def isloaded(self, name): ! return self.__modules.has_key(name) ! ! def loadlist(self, names): ! """Load list of given modules considering level attribute.""" ! modulelist = [] ! for name in names: ! try: ! module = __import__("pybot.modules."+name) ! module = getattr(module, "modules") ! module = getattr(module, name) ! reload(module) ! func = getattr(module, "__loadmodule__") ! try: ! level = getattr(module, "__loadlevel__") ! except AttributeError: ! level = 100 ! l = len(modulelist) ! i = 0 ! while i < l: ! if modulelist[i][-1] > level: ! modulelist.insert(i, (name, module, func, level)) ! break ! i = i + 1 ! else: ! modulelist.append((name, module, func, level)) ! except (AttributeError, ImportError): ! traceback.print_exc() ! ret = [] ! for name, module, func, level in modulelist: ! try: ! func(self) ! except: ! traceback.print_exc() ! else: ! self.__modules[name] = module ! ret.append(name) ! return ret ! ! def load(self, name): ! try: ! module = __import__("pybot.modules."+name) ! module = getattr(module, "modules") ! module = getattr(module, name) ! reload(module) ! getattr(module, "__loadmodule__")(self) ! self.__modules[name] = module ! return 1 ! except: ! traceback.print_exc() ! ! def unload(self, name): ! module = self.__modules.get(name) ! if module: ! try: ! getattr(module, "__unloadmodule__")(self) ! del self.__modules[name] ! del sys.modules["pybot.modules."+name] ! return 1 ! except: ! traceback.print_exc() ! ! def reload(self, name): ! module = self.__modules.get(name) ! if module: ! if self.unload(name): ! return self.load(name) ! class ModuleMethods: ! """Intermodule communication class. ! Every module that registers here must have a dummy first parameter. ! When calling a method, if nobody is registered for the named method, ! the first parameter provided will be returned. ! """ ! def __init__(self): ! self.__methods = {} ! ! def __return_defret(self, defret, *other): ! """Return the first parameter provided. ! This is the dummy method used when a named method that nobody is ! registered for is called. ! """ ! return defret ! def __getattr__(self, name): ! return self.__methods.get(name) or self.__return_defret ! def register(self, name, method): ! self.__methods[name] = method ! ! def unregister(self, name): ! if self.__methods.has_key(name): ! del self.__methods[name] class SoapMethods: ! def __init__(self): ! self.__func = {} ! ! def register(self, funcname, func): ! self.__func[funcname] = func ! ! def unregister(self, funcname): ! del self.__func[funcname] ! def get_methods(self): ! return self.__func ! # vim:ts=4:sw=4 --- 21,136 ---- class Modules: ! def __init__(self): ! self.__modules = {} ! ! def isloaded(self, name): ! return self.__modules.has_key(name) ! ! def loadlist(self, names): ! """Load list of given modules considering level attribute.""" ! modulelist = [] ! for name in names: ! try: ! module = __import__("pybot.modules."+name) ! module = getattr(module, "modules") ! module = getattr(module, name) ! reload(module) ! func = getattr(module, "__loadmodule__") ! try: ! level = getattr(module, "__loadlevel__") ! except AttributeError: ! level = 100 ! l = len(modulelist) ! i = 0 ! while i < l: ! if modulelist[i][-1] > level: ! modulelist.insert(i, (name, module, func, level)) ! break ! i = i + 1 ! else: ! modulelist.append((name, module, func, level)) ! except (AttributeError, ImportError): ! traceback.print_exc() ! ret = [] ! for name, module, func, level in modulelist: ! try: ! func(self) ! except: ! traceback.print_exc() ! else: ! self.__modules[name] = module ! ret.append(name) ! return ret ! ! def load(self, name): ! try: ! module = __import__("pybot.modules."+name) ! module = getattr(module, "modules") ! module = getattr(module, name) ! reload(module) ! getattr(module, "__loadmodule__")(self) ! self.__modules[name] = module ! return 1 ! except: ! traceback.print_exc() ! ! def unload(self, name): ! module = self.__modules.get(name) ! if module: ! try: ! getattr(module, "__unloadmodule__")(self) ! del self.__modules[name] ! del sys.modules["pybot.modules."+name] ! return 1 ! except: ! traceback.print_exc() ! ! def reload(self, name): ! module = self.__modules.get(name) ! if module: ! if self.unload(name): ! return self.load(name) ! class ModuleMethods: ! """Intermodule communication class. ! Every module that registers here must have a dummy first parameter. ! When calling a method, if nobody is registered for the named method, ! the first parameter provided will be returned. ! """ ! def __init__(self): ! self.__methods = {} ! ! def __return_defret(self, defret, *other): ! """Return the first parameter provided. ! This is the dummy method used when a named method that nobody is ! registered for is called. ! """ ! return defret ! def __getattr__(self, name): ! return self.__methods.get(name) or self.__return_defret ! def register(self, name, method): ! self.__methods[name] = method ! ! def unregister(self, name): ! if self.__methods.has_key(name): ! del self.__methods[name] class SoapMethods: ! def __init__(self): ! self.__func = {} ! ! def register(self, funcname, func): ! self.__func[funcname] = func ! ! def unregister(self, funcname): ! del self.__func[funcname] ! def get_methods(self): ! return self.__func ! # vim:ts=4:sw=4:et Index: option.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/option.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** option.py 2001/11/13 20:39:25 1.2 --- option.py 2001/12/04 00:57:38 1.3 *************** *** 20,75 **** class Options: ! def __init__(self): ! self.__hard = {} ! self.__soft = {} ! ! def gethard(self, name, default): ! return self.__hard.setdefault(name, default) ! def sethard(self, name, value): ! self.__hard[name] = value ! def hashard(self, name): ! return self.__hard.has_key(name) ! def delhard(self, name): ! try: ! del self.__hard[name] ! except KeyError: ! pass ! def getharddict(self): ! return self.__hard ! def setharddict(self, dict): ! self.__hard = dict ! def getsoft(self, name, default, keepalive=None): ! """Return temporary option. ! You may define for how long the option will be considered ! valid trough the keepalive argument (in seconds). If keepalive ! is None (default), option will stay valid while pybot is up, or ! at least until you change the keepalive to something else.""" ! opt = self.__soft.get(name) ! if opt: ! if opt[0] is None or time() < opt[0]: ! if keepalive is None: ! opt[0] = None ! elif keepalive: ! opt[0] = time()+keepalive ! return opt[1] ! else: ! del self.__soft[name] ! if keepalive is None: ! self.__soft[name] = [None, default] ! else: ! self.__soft[name] = [time()+keepalive, default] ! return default ! def setsoft(self, name, value, keepalive): ! return self.getsoft(name, value, keepalive) ! ! def hassoft(self, name): ! return self.__soft.has_key(name) ! # vim:ts=4:sw=4 --- 20,75 ---- class Options: ! def __init__(self): ! self.__hard = {} ! self.__soft = {} ! ! def gethard(self, name, default): ! return self.__hard.setdefault(name, default) ! def sethard(self, name, value): ! self.__hard[name] = value ! def hashard(self, name): ! return self.__hard.has_key(name) ! def delhard(self, name): ! try: ! del self.__hard[name] ! except KeyError: ! pass ! def getharddict(self): ! return self.__hard ! def setharddict(self, dict): ! self.__hard = dict ! def getsoft(self, name, default, keepalive=None): ! """Return temporary option. ! You may define for how long the option will be considered ! valid trough the keepalive argument (in seconds). If keepalive ! is None (default), option will stay valid while pybot is up, or ! at least until you change the keepalive to something else.""" ! opt = self.__soft.get(name) ! if opt: ! if opt[0] is None or time() < opt[0]: ! if keepalive is None: ! opt[0] = None ! elif keepalive: ! opt[0] = time()+keepalive ! return opt[1] ! else: ! del self.__soft[name] ! if keepalive is None: ! self.__soft[name] = [None, default] ! else: ! self.__soft[name] = [time()+keepalive, default] ! return default ! def setsoft(self, name, value, keepalive): ! return self.getsoft(name, value, keepalive) ! ! def hassoft(self, name): ! return self.__soft.has_key(name) ! # vim:ts=4:sw=4:et Index: server.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/server.py,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** server.py 2001/11/02 17:20:21 1.1.1.1 --- server.py 2001/12/04 00:57:38 1.2 *************** *** 32,234 **** class Servers: ! def __init__(self): ! self.servers = [] ! def add(self, servername): ! self.servers.append(Server(self, servername)) ! ! def remove(self, servername): ! for i in range(len(self.servers)): ! if server[i].servername == servername: ! del server[i] ! ! def get(self, servername): ! for server in self.servers: ! if server.servername == servername: ! return server ! def getall(self): ! return self.servers class Server: ! def __init__(self, bot, servername): ! self.changeserver(servername) ! self._bot = bot ! self._inbuffer = "" ! self._inlines = [] ! self._outlines = [] ! self._outlines_lock = allocate_lock() ! self._last_sent = 0 ! self._last_sent_timeout = 0; ! self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ! self._socket.setblocking(0) ! self._timeout = 0 ! self.connected = 0 ! self._connect = 1 ! self._reconnect = 0 ! self.killed = 0 ! self.user = User() ! ! def interaction(self): ! if not self.connected: ! if self._timeout: ! self._timeout = self._timeout-1 ! elif self._connect: ! try: ! self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ! self._socket.connect((self._host, self._port)) ! except socket.error, why: ! if not why[0] in (EINPROGRESS, EALREADY, EWOULDBLOCK): ! self._timeout = CONNECTDELAY ! pybot.hooks.call("ConnectingError", self) ! self._disconnect() ! return ! self.connected = 1 ! pybot.hooks.call("Connected", self) ! else: ! try: ! selret = select([self._socket],[self._socket],[],10) ! except: ! self._disconnect() ! self._timeout = CONNECTDELAY ! pybot.hooks.call("ConnectionError", self) ! return ! if len(selret[0]) != 0: ! try: ! recv = self._socket.recv(4096) ! except socket.error, why: ! self._disconnect() ! self._timeout = CONNECTDELAY ! pybot.hooks.call("ConnectionError", self) ! return ! if recv: ! self._inbuffer = self._inbuffer + recv ! lines = split(self._inbuffer, "\r\n") ! if len(lines) > 0: ! self._inbuffer = lines[-1] ! self._inlines = self._inlines + lines[:-1] ! else: ! self._disconnect() ! self._timeout = CONNECTDELAY ! pybot.hooks.call("ConnectionError", self) ! return ! if len(selret[1]) != 0: ! try: ! self._outlines_lock.acquire() ! try: ! lines_sent = 0 ! while lines_sent < 3 and self._outlines and (self._outlines[0][1] <= 20 or self._last_sent < time()): ! if self._last_sent+2 < time(): ! self._last_sent_timeout = 1 ! elif self._last_sent_timeout < 5 and self._outlines[0][1] > 20: ! self._last_sent_timeout = self._last_sent_timeout+1 ! self._last_sent = time()+self._last_sent_timeout; ! line = self._outlines[0][0]+"\r\n" ! del self._outlines[0] ! self._socket.send(line) ! lines_sent = lines_sent + 1 ! finally: ! self._outlines_lock.release() ! except socket.error, why: ! if why[0] != EWOULDBLOCK: ! self._disconnect() ! self._timeout = CONNECTDELAY ! pybot.hooks.call("ConnectionError", self) ! if self.killed: ! self._disconnect() ! pybot.hooks.call("Disconnected", (self)) ! elif self._reconnect: ! self._reconnect = 0 ! self._disconnect() ! def changeserver(self, servername): ! self.servername = servername ! tokens = split(servername,":") ! self._host = tokens[0] ! if len(tokens) == 2: ! self._port = int(tokens[1]) ! else: ! self._port = 6667 ! def _disconnect(self): ! try: ! self._socket.shutdown() ! self._socket.close() ! except: ! pass ! self.connected = 0 ! self._outlines = [] ! def kill(self): ! self._connect = 0 ! self.killed = 1 ! ! def reconnect(self): ! if self.connected: ! self._reconnect = 1 ! self._timeout = CONNECTDELAY ! def readline(self): ! """Return one line from the buffer (and remove it). ! This method is not thread safe, since it must be called only ! by the main loop. ! """ ! line = None ! if len(self._inlines) > 0: ! line = self._inlines[0] ! del self._inlines[0] ! return line ! def sendline(self, line, priority=50, outhooks=1): ! """Send one line for the server. ! This method is thread safe. ! """ ! self._outlines_lock.acquire() ! l = len(self._outlines) ! i = 0 ! while i < l: ! if self._outlines[i][1] > priority: ! self._outlines.insert(i,(line,priority)) ! self._outlines_lock.release() ! return ! i = i + 1 ! self._outlines.append((line,priority)) ! self._outlines_lock.release() ! if outhooks: ! msg = Command() ! msg.setline(self, line) ! msg.user = self.user ! hookname = ["OutMessage", "OutNotice", "OutCommand", "OutCTCP", ! "OutCTCPReply"][msg._index] ! pybot.hooks.call(hookname, msg) ! def sendcmd(self, prefix, cmd, *params, **kw): ! priority = kw.get("priority", 50) ! outhooks = kw.get("outhooks", 1) ! if prefix: ! lineprefix = ":"+prefix+" "+cmd+" " ! else: ! lineprefix = cmd+" " ! line = buildanswer(params, None, self.user.nick) ! for subline in breakline(line): ! subline = lineprefix+subline ! self.sendline(subline, priority, outhooks) ! def sendmsg(self, target, nick, *params, **kw): ! priority = kw.get("priority", 50) ! outhooks = kw.get("outhooks", 1) ! ctcp = kw.get("ctcp") ! cmd = kw.get("notice") and "NOTICE" or "PRIVMSG" ! if ctcp: ! linemask = "%s %s :\01%s %%s \01"%(cmd, target, ctcp) ! else: ! linemask = "%s %s :%%s"%(cmd, target) ! line = buildanswer(params, target, nick) ! for subline in breakline(line): ! subline = linemask%subline ! self.sendline(subline, priority, outhooks) ! # vim:ts=4:sw=4 --- 32,234 ---- class Servers: ! def __init__(self): ! self.servers = [] ! def add(self, servername): ! self.servers.append(Server(self, servername)) ! ! def remove(self, servername): ! for i in range(len(self.servers)): ! if server[i].servername == servername: ! del server[i] ! ! def get(self, servername): ! for server in self.servers: ! if server.servername == servername: ! return server ! def getall(self): ! return self.servers class Server: ! def __init__(self, bot, servername): ! self.changeserver(servername) ! self._bot = bot ! self._inbuffer = "" ! self._inlines = [] ! self._outlines = [] ! self._outlines_lock = allocate_lock() ! self._last_sent = 0 ! self._last_sent_timeout = 0; ! self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ! self._socket.setblocking(0) ! self._timeout = 0 ! self.connected = 0 ! self._connect = 1 ! self._reconnect = 0 ! self.killed = 0 ! self.user = User() ! ! def interaction(self): ! if not self.connected: ! if self._timeout: ! self._timeout = self._timeout-1 ! elif self._connect: ! try: ! self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ! self._socket.connect((self._host, self._port)) ! except socket.error, why: ! if not why[0] in (EINPROGRESS, EALREADY, EWOULDBLOCK): ! self._timeout = CONNECTDELAY ! pybot.hooks.call("ConnectingError", self) ! self._disconnect() ! return ! self.connected = 1 ! pybot.hooks.call("Connected", self) ! else: ! try: ! selret = select([self._socket],[self._socket],[],10) ! except: ! self._disconnect() ! self._timeout = CONNECTDELAY ! pybot.hooks.call("ConnectionError", self) ! return ! if len(selret[0]) != 0: ! try: ! recv = self._socket.recv(4096) ! except socket.error, why: ! self._disconnect() ! self._timeout = CONNECTDELAY ! pybot.hooks.call("ConnectionError", self) ! return ! if recv: ! self._inbuffer = self._inbuffer + recv ! lines = split(self._inbuffer, "\r\n") ! if len(lines) > 0: ! self._inbuffer = lines[-1] ! self._inlines = self._inlines + lines[:-1] ! else: ! self._disconnect() ! self._timeout = CONNECTDELAY ! pybot.hooks.call("ConnectionError", self) ! return ! if len(selret[1]) != 0: ! try: ! self._outlines_lock.acquire() ! try: ! lines_sent = 0 ! while lines_sent < 3 and self._outlines and (self._outlines[0][1] <= 20 or self._last_sent < time()): ! if self._last_sent+2 < time(): ! self._last_sent_timeout = 1 ! elif self._last_sent_timeout < 5 and self._outlines[0][1] > 20: ! self._last_sent_timeout = self._last_sent_timeout+1 ! self._last_sent = time()+self._last_sent_timeout; ! line = self._outlines[0][0]+"\r\n" ! del self._outlines[0] ! self._socket.send(line) ! lines_sent = lines_sent + 1 ! finally: ! self._outlines_lock.release() ! except socket.error, why: ! if why[0] != EWOULDBLOCK: ! self._disconnect() ! self._timeout = CONNECTDELAY ! pybot.hooks.call("ConnectionError", self) ! if self.killed: ! self._disconnect() ! pybot.hooks.call("Disconnected", (self)) ! elif self._reconnect: ! self._reconnect = 0 ! self._disconnect() ! def changeserver(self, servername): ! self.servername = servername ! tokens = split(servername,":") ! self._host = tokens[0] ! if len(tokens) == 2: ! self._port = int(tokens[1]) ! else: ! self._port = 6667 ! def _disconnect(self): ! try: ! self._socket.shutdown() ! self._socket.close() ! except: ! pass ! self.connected = 0 ! self._outlines = [] ! def kill(self): ! self._connect = 0 ! self.killed = 1 ! ! def reconnect(self): ! if self.conne... [truncated message content] |