Thread: [pybot-commits] CVS: pybot/pybot __init__.py,1.5,1.6 command.py,1.2,1.3 hook.py,1.2,1.3 main.py,1.4,
Brought to you by:
niemeyer
Update of /cvsroot/pybot/pybot/pybot In directory sc8-pr-cvs1:/tmp/cvs-serv6970/pybot Modified Files: __init__.py command.py hook.py main.py misc.py module.py option.py runner.py server.py sqlitedb.py user.py Log Message: Major work on pybot!! * modules/*: All modules moved to the new re matching system. * command.py: Removed old matching system. * modules/*: Pickling replaced by sqlite in all places were persistence was needed. * modules/*: All modules have inline help. * modules/*: All modules have permission help. * modules/infopack.py: Infopacks have help now. * *: Many method names changed to a better alternative. * options.py: Removed soft/hard relation. Now there's a single dict that might resist to reboots, if necessary. Notice that no standard module uses it for persistent options, since they use sqlite. * modules/example.py: Introduced basic sample module. * modules/soap.py: Obsoleted. Use xmlrpc instead. * scripts/pybotmsg.py: Added a basic xmlrpc client. * runner.py: Included other modules in the "default load" ones. * *: Other changes I probably forgot. Index: __init__.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/__init__.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** __init__.py 8 May 2003 19:11:34 -0000 1.5 --- __init__.py 12 May 2003 20:42:20 -0000 1.6 *************** *** 1,3 **** ! # Copyright (c) 2000-2001 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. --- 1,3 ---- ! # Copyright (c) 2000-2003 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. Index: command.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/command.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** command.py 4 Dec 2001 00:57:38 -0000 1.2 --- command.py 12 May 2003 20:42:20 -0000 1.3 *************** *** 1,3 **** ! # Copyright (c) 2000-2001 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. --- 1,3 ---- ! # Copyright (c) 2000-2003 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. *************** *** 17,27 **** # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from types import TupleType, ListType, IntType ! from string import split, lower from pybot.user import User import re - class MatchError: pass - class Command: re = re.compile("(?::(\\S*) )?(\\w+) ((\\S+) :(?:\01(\\w+) )?((?:\\W*(\\w+)\\W*\\s)?(.*?))(?:\01)?|.*)$") --- 17,24 ---- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from string import split from pybot.user import User import re class Command: re = re.compile("(?::(\\S*) )?(\\w+) ((\\S+) :(?:\01(\\w+) )?((?:\\W*(\\w+)\\W*\\s)?(.*?))(?:\01)?|.*)$") *************** *** 140,319 **** 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 --- 137,139 ---- Index: hook.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/hook.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** hook.py 4 Dec 2001 00:57:38 -0000 1.2 --- hook.py 12 May 2003 20:42:20 -0000 1.3 *************** *** 1,3 **** ! # Copyright (c) 2000-2001 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. --- 1,3 ---- ! # Copyright (c) 2000-2003 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. Index: main.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/main.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** main.py 9 May 2003 20:18:36 -0000 1.4 --- main.py 12 May 2003 20:42:20 -0000 1.5 *************** *** 1,3 **** ! # Copyright (c) 2000-2001 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. --- 1,3 ---- ! # Copyright (c) 2000-2003 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. Index: misc.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/misc.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** misc.py 9 May 2003 15:27:44 -0000 1.3 --- misc.py 12 May 2003 20:42:20 -0000 1.4 *************** *** 1,3 **** ! # Copyright (c) 2000-2001 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. --- 1,3 ---- ! # Copyright (c) 2000-2003 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. Index: module.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/module.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** module.py 5 May 2003 20:47:20 -0000 1.4 --- module.py 12 May 2003 20:42:20 -0000 1.5 *************** *** 1,3 **** ! # Copyright (c) 2000-2001 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. --- 1,3 ---- ! # Copyright (c) 2000-2003 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. *************** *** 22,29 **** class Modules: def __init__(self): ! self.__modules = {} def isloaded(self, name): ! return self.__modules.has_key(name) def loadlist(self, names): --- 22,32 ---- class Modules: def __init__(self): ! self._modules = {} def isloaded(self, name): ! return self._modules.has_key(name) ! ! def getlist(self): ! return self._modules.keys() def loadlist(self, names): *************** *** 55,63 **** for name, module, func, level in modulelist: try: ! func(self) except: traceback.print_exc() else: ! self.__modules[name] = module ret.append(name) return ret --- 58,66 ---- for name, module, func, level in modulelist: try: ! func() except: traceback.print_exc() else: ! self._modules[name] = module ret.append(name) return ret *************** *** 69,74 **** module = getattr(module, name) reload(module) ! getattr(module, "__loadmodule__")(self) ! self.__modules[name] = module return 1 except: --- 72,77 ---- module = getattr(module, name) reload(module) ! getattr(module, "__loadmodule__")() ! self._modules[name] = module return 1 except: *************** *** 76,84 **** 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 --- 79,87 ---- def unload(self, name): ! module = self._modules.get(name) if module: try: ! getattr(module, "__unloadmodule__")() ! del self._modules[name] del sys.modules["pybot.modules."+name] return 1 *************** *** 87,91 **** def reload(self, name): ! module = self.__modules.get(name) if module: if self.unload(name): --- 90,94 ---- def reload(self, name): ! module = self._modules.get(name) if module: if self.unload(name): *************** *** 93,96 **** --- 96,108 ---- + class ModuleMethod: + def __init__(self, method): + self._method = method + + def __call__(self, *args, **kwargs): + if "defret" in kwargs: + del kwargs["defret"] + return self._method(*args, **kwargs) + class ModuleMethods: """Intermodule communication class. *************** *** 101,136 **** """ 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 RemoteMethods: 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 --- 113,148 ---- """ def __init__(self): ! self._methods = {} ! def _return_defret(self, *args, **kwargs): ! try: ! return kwargs["defret"] ! except KeyError: ! return None def __getattr__(self, name): ! return self._methods.get(name) or self._return_defret def register(self, name, method): ! self._methods[name] = ModuleMethod(method) def unregister(self, name): ! try: ! del self._methods[name] ! except KeyError: ! pass class RemoteMethods: 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.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** option.py 4 Dec 2001 00:57:38 -0000 1.3 --- option.py 12 May 2003 20:42:20 -0000 1.4 *************** *** 1,3 **** ! # Copyright (c) 2000-2001 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. --- 1,3 ---- ! # Copyright (c) 2000-2003 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. *************** *** 17,75 **** # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from time import time 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 --- 17,95 ---- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! import time class Options: def __init__(self): ! self._dict = {} ! def getdict(self): ! return self._dict ! def setdict(self, dict): ! self._dict = dict ! def get(self, name, default=None, keepalive=0, reboot=0): ! """ ! You may define for how long the option will be considered ! valid trough the keepalive argument (in seconds). If keepalive ! is 0 (default), option will stay valid while pybot is up, or ! at least until you change the keepalive to something else. If ! reboot is true, the option will be alive even if pybot reboots, ! or quits and returns later. ! """ ! curtime = time.time() ! if keepalive: ! keepalive += curtime ! opt = self._dict.get(name) ! if opt: ! if not opt[1] or curtime < opt[1]: ! if keepalive: ! opt[1] = keepalive ! return opt[0] ! else: ! del self._dict[name] ! self._dict[name] = [default, keepalive, reboot] ! return default ! def set(self, name, value, keepalive=None, reboot=None): ! oldvalue = self.get(name) ! newvalue = [value, keepalive, reboot] ! if oldvalue: ! if ListType == type(oldvalue[0]) == type(newvalue[0]): ! oldvalue[0][:] = newvalue[0] ! newvalue[0] = oldvalue[0] ! elif DictType == type(oldvalue[0]) == type(newvalue[0]): ! oldvalue[0].clear() ! oldvalue[0].update(newvalue[0]) ! newvalue[0] = oldvalue[0] ! if keepalive is None: ! newvalue[1] = oldvalue[1] ! if reboot is None: ! newvalue[2] = oldvalue[2] ! self._dict[name] = newvalue ! ! def remove(self, name): try: ! del self._dict[name] except KeyError: pass ! def keys(self): ! return self._dict.keys() ! def has_key(self, name): ! return self._dict.has_key(name) ! def __getitem__(self, name): ! return self.get(name) ! def __setitem__(self, name, value): ! self.set(name, value) ! ! def __delitem__(self, name): ! self.remove(name) ! ! def __contains__(self, name): ! return self.has_key(name) # vim:ts=4:sw=4:et Index: runner.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/runner.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** runner.py 9 May 2003 20:18:36 -0000 1.2 --- runner.py 12 May 2003 20:42:20 -0000 1.3 *************** *** 1,5 **** #!/usr/bin/python # ! # Copyright (c) 2000-2001 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. --- 1,5 ---- #!/usr/bin/python # ! # Copyright (c) 2000-2003 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. *************** *** 84,89 **** 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) --- 84,91 ---- pybot.hooks.register("ConnectionError", print_connection_error) pybot.hooks.register("ConnectingError", print_connecting_error) ! ! # Load modules which are part of the basic infrastructure ! pybot.modls.loadlist(["help", "options", "timer", "modulecontrol", ! "permission", "pong", "servercontrol"]) ret = pybot.main.loop() sys.exit(ret) Index: server.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/server.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** server.py 9 May 2003 20:18:36 -0000 1.3 --- server.py 12 May 2003 20:42:20 -0000 1.4 *************** *** 1,3 **** ! # Copyright (c) 2000-2001 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. --- 1,3 ---- ! # Copyright (c) 2000-2003 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. *************** *** 35,40 **** self.servers = [] ! def add(self, servername): ! self.servers.append(Server(servername)) def add_console(self): --- 35,40 ---- self.servers = [] ! def add(self, host, servername=None): ! self.servers.append(Server(host, servername)) def add_console(self): *************** *** 55,60 **** class BaseServer: ! def __init__(self, servername): ! self.servername = servername self.killed = 0 self._inlines = [] --- 55,64 ---- class BaseServer: ! def __init__(self, host, servername=None): ! if not servername: ! self.servername = host ! else: ! self.servername = servername ! self.host = host self.killed = 0 self._inlines = [] *************** *** 64,68 **** pass ! def changeserver(self, servername): pass --- 68,72 ---- pass ! def changeserver(self, host, servername): pass *************** *** 92,99 **** class Server(BaseServer): ! def __init__(self, servername): ! BaseServer.__init__(self, servername) ! self.changeserver(servername) self._inbuffer = "" self._outlines = [] --- 96,103 ---- class Server(BaseServer): ! def __init__(self, host, servername=None): ! BaseServer.__init__(self, host, servername) ! self.changeserver(host, servername) self._inbuffer = "" self._outlines = [] *************** *** 180,186 **** self._disconnect() ! def changeserver(self, servername): ! self.servername = servername ! tokens = split(servername,":") self._host = tokens[0] if len(tokens) == 2: --- 184,192 ---- self._disconnect() ! def changeserver(self, host, servername=None): ! if not servername: ! self.servername = host ! self.host = host ! tokens = split(host,":") self._host = tokens[0] if len(tokens) == 2: *************** *** 303,307 **** def emptyline(self): ! pass def postloop(self): --- 309,313 ---- def emptyline(self): ! self.show_lines() def postloop(self): Index: sqlitedb.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/sqlitedb.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** sqlitedb.py 8 May 2003 19:11:34 -0000 1.2 --- sqlitedb.py 12 May 2003 20:42:20 -0000 1.3 *************** *** 1,3 **** ! # Copyright (c) 2000-2001 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. --- 1,3 ---- ! # Copyright (c) 2000-2003 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. *************** *** 19,22 **** --- 19,25 ---- import pybot import sqlite + import re + + FIELDS = re.compile(r"\((.*)\)") class SQLiteDB: *************** *** 24,33 **** self._path = pybot.config.get("sqlite", "path") self._conn = sqlite.connect(self._path) - self._conn.autocommit = 1 - self.error = sqlite.DatabaseError def cursor(self): return self._conn.cursor() # vim:ts=4:sw=4:et --- 27,95 ---- self._path = pybot.config.get("sqlite", "path") self._conn = sqlite.connect(self._path) self.error = sqlite.DatabaseError + self.autocommit(1) + self.table("dict", "name,value") + + def copy(self): + return SQLiteDB() def cursor(self): return self._conn.cursor() + + def commit(self): + return self._conn.commit() + + def autocommit(self, enable): + self._conn.autocommit = enable + + def table(self, name, fields): + """\ + Besides creating tables when they don't exist, this function + will ensure that the given table has the given fields in the + given order, and change the table if not. + """ + cursor = self.cursor() + # Check that the table exist. + cursor.execute("select * from sqlite_master " + "where type='table' and name=%s", name) + row = cursor.fetchone() + if not row: + # No, it doesn't exist yet. + cursor.execute("create table %s (%s)" % (name, fields)) + elif row.sql.find("(%s)" % fields) == -1: + # It exist, but is invalid. We'll have to fix it. + self.autocommit(0) + cursor.execute("create temporary table temp_table (%s)" % fields) + m = FIELDS.search(row.sql) + if not m: + raise ValueError, "invalid sql in table '%s'" % name + oldfields = [x.strip() for x in m.group(1).split(",")] + copyfields = ",".join([x for x in fields.split(",") + if x in oldfields]) + cursor.execute("insert into temp_table (%s) select %s from %s" + % (copyfields, copyfields, name)) + cursor.execute("drop table %s" % name) + cursor.execute("create table %s (%s)" % (name, fields)) + cursor.execute("insert into %s select %s from temp_table" + % (name, fields)) + cursor.execute("drop table temp_table") + self.commit() + self.autocommit(1) + + def __getitem__(self, name): + cursor = self.cursor() + cursor.execute("select value from dict where name=%s", name) + if not cursor.rowcount: + return None + return cursor.fetchone().value + + def __setitem__(self, name, value): + del self[name] + cursor = self.cursor() + cursor.execute("insert into dict values (%s,%s)", name, value) + + def __delitem__(self, name): + cursor = self.cursor() + cursor.execute("delete from dict where name=%s", name) # vim:ts=4:sw=4:et Index: user.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/user.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** user.py 19 Jun 2002 21:46:22 -0000 1.3 --- user.py 12 May 2003 20:42:20 -0000 1.4 *************** *** 1,3 **** ! # Copyright (c) 2000-2001 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. --- 1,3 ---- ! # Copyright (c) 2000-2003 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. *************** *** 20,28 **** 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): --- 20,31 ---- class User: ! def __init__(self, nick="", username="", host="", string=None): ! if string: ! self.setstring(string) ! else: ! self.nick = nick ! self.username = username ! self.host = host ! self.string = nick+"!"+username+"@"+host def setstring(self, str): *************** *** 60,63 **** --- 63,69 ---- username, host = tokens return self.match(nick, username, host) + + def matchuser(self, user): + return self.match(user.nick, user.username, user.host) # vim:ts=4:sw=4:et |