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