[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
|