pybot-commits Mailing List for pybot (Page 7)
Brought to you by:
niemeyer
You can subscribe to this list here.
2001 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(6) |
Dec
(7) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2002 |
Jan
|
Feb
|
Mar
(1) |
Apr
(7) |
May
(1) |
Jun
(14) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2003 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(56) |
Jun
(4) |
Jul
|
Aug
(85) |
Sep
(2) |
Oct
|
Nov
|
Dec
|
From: Gustavo N. <nie...@us...> - 2002-06-20 01:17:54
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory usw-pr-cvs1:/tmp/cvs-serv15052/pybot/modules Modified Files: permission.py Log Message: - Improved permission module a lot; - Included help system; - Changed admin permission handling (WARNING!!! Don't merge this patch if you don't know what it means!) Index: permission.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/permission.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** permission.py 4 Dec 2001 00:57:38 -0000 1.3 --- permission.py 20 Jun 2002 01:17:48 -0000 1.4 *************** *** 19,22 **** --- 19,39 ---- from pybot import mm, hooks, options from pybot.user import User + import re + + HELP = [ + ("""\ + I'm able to control what features are available to what users \ + trough a permission system. Only administrators can give or take \ + permissions. If you're one of them, you can do it with "(give|take) \ + perm[ission] <perm> [to|from] [user <user>] [on|at] [this \ + channel|channel <channel>] [on|at|to] [this server|server <server>].\ + """,), + ("""\ + If you're an administrator, you may also view which permissions are \ + enabled, and to which users, with "(show|list) perm[ission][s] [<perm>]".\ + If you don't provide <perm>, you'll get a list of permissions, otherwise \ + you'll receive a list of users with this permission enabled.\ + """,)] + class Permission: *************** *** 29,32 **** --- 46,58 ---- hooks.register("Message", self.message) + # Matches '(give|take) perm[ission] <perm> [to|from] [user <user>] [on|at] [this channel|channel <channel>] [on|at|to] [this server|server <server>]' + self.re1 = re.compile("(?P<command>give|take)\s+(?:(?P<perm1>\w+)\s+perm(?:ission)?|perm(?:ission)?\s+(?P<perm2>\w+))(?:\s+to|\s+from)?(?:\s+user\s+(?P<user>\S+))?(?:\s+on|\s+at)?(?:\s+(?P<thischannel>this\s+channel)|\s+channel\s+(?P<channel>\S+))?(?:\s+on|\s+at|\s+to)?(?:\s+(?P<thisserver>this\s+server)|\s+server\s+(?P<server>\S+))?\s*[!.]*$", re.I) + + # Matches '(show|list) perm[ission][s] [<perm>]' + self.re2 = re.compile("(?:show|list)\s+perm(?:ission)?s?(?:\s+(?P<perm>\w+))?\s*[!.]*$", re.I) + + # Match 'perm[ission][s] [system]' + mm.register_help(0, "perm(?:ission)?s?(?:\s+system)?", HELP) + def unload(self): mm.unregister("hasperm") *************** *** 34,129 **** mm.unregister("unsetperm") hooks.unregister("Message", self.message) def message(self, msg): ! var = [] ! if msg.match(var, 6, "%", "give", 0, "~", ["permission", "perm"], "to", [("user", 1, "~"), None], [(["on", "at", None], [(2, "~this", "channel"), ("channel", 3, "^[#&+!][^,^G]+$")]), None], [(["on", "at", "to", None], [(4, "~this", "server"), ("server", 5, "~")]), None], ["!", ".", None]): ! if self.mm_hasperm(0, msg.server.servername, msg.target, msg.user, None): ! if var[1] or var[2] or var[3] or var[4]: ! if var[2]: channel = msg.target server = msg.server.servername else: ! if var[3]: ! channel = var[3] else: channel = None ! if var[4]: server = msg.server.servername ! elif var[5]: ! server = var[5] else: server = None ! if var[1]: user = User() ! user.setstring(var[1]) else: user = None ! self.mm_setperm(0, server,channel,user,var[0]) ! msg.answer("%:", ["Done, sir!", "Given, sir!", "No problems!", "Ok!"]) ! else: ! msg.answer("%:", ["Sorry, you", "Sir, you", "You"], ["can't work with permissions.", "don't have this power.", "can't give permissions."]) ! return 0 ! elif msg.match(var, 6, "%", "take", 0, "~", ["permission", "perm"], "from", [("user", 1, "~"), None], [(["on", "at", None], [(2, "~this", "channel"), ("channel", 3, "^[#&+!][^,^G]+$")]), None], [(["on", "at", None], [(4, "~this", "server"), ("server", 5, "~")]), None], ["!", ".", None]): ! if self.mm_hasperm(0, msg.server.servername, msg.target, msg.user, None): ! if var[1] or var[2] or var[3] or var[4]: ! if var[2]: ! channel = msg.target ! server = msg.server.servername else: ! if var[3]: ! channel = var[3] ! else: ! channel = None ! if var[4]: ! server = msg.server.servername ! elif var[5]: ! server = var[5] else: ! server = None ! if var[1]: ! user = User() ! user.setstring(var[1]) else: ! user = None ! self.mm_unsetperm(0, server,channel,user,var[0]) ! msg.answer("%:", ["Done, sir!", "No problems!", "Ok!", "Right now!", "Right now, sir!"]) ! else: ! msg.answer("%:", ["Sorry, you", "Sir, you", "You"], ["can't work with permissions.", "don't have this power.", "can't take permissions."]) ! return 0 ! def mm_hasperm(self, defret, server, channel, user, perm): - for _user in self.gosh: - if user.match(_user.nick, _user.username, _user.host): - return 1 if self.perm.has_key(perm): for tup in self.perm[perm]: ! if (tup[0] == None or tup[0] == server) and \ ! (tup[1] == None or tup[1] == channel) and \ ! (tup[2] == None or user.match(tup[2].nick, tup[2].username, tup[2].host)): return 1 def mm_setperm(self, defret, server, channel, user, perm): ! if perm == "gosh": ! self.gosh.append(user) else: ! if not self.perm.has_key(perm): ! self.perm[perm] = [(server,channel,user)] ! else: ! self.perm[perm].append((server,channel,user)) def mm_unsetperm(self, defret, server, channel, user, perm): ! if perm == "gosh": ! for _user in self.gosh: ! if _user.match(user.nick, user.username, user.host): ! self.gosh.remove(_user) ! elif self.perm.has_key(perm): _perm = self.perm[perm] for tup in _perm: ! if (tup[0] == None or tup[0] == server) and \ ! (tup[1] == None or tup[1] == channel) and \ ! (tup[2] == None or user.match(tup[2].nick, tup[2].username, tup[2].host)): _perm.remove(tup) if len(_perm) == 0: del self.perm[perm] --- 60,182 ---- mm.unregister("unsetperm") hooks.unregister("Message", self.message) + mm.unregister_help(0, HELP) def message(self, msg): ! if msg.forme: ! m = self.re1.match(msg.line) ! if m: ! if self.mm_hasperm(0, msg.server.servername, msg.target, msg.user, None): ! if m.group("thischannel"): ! found = 1 channel = msg.target server = msg.server.servername else: ! if m.group("channel"): ! found = 1 ! channel = m.group("channel") else: channel = None ! if m.group("thisserver"): ! found = 1 server = msg.server.servername ! elif m.group("server"): ! server = m.group("server") else: server = None ! if m.group("user"): ! userstr = m.group("user") ! if not re.compile(".+!.+@.+").match(userstr): ! msg.answer("%:", "Please, provide a user in the format \"<nick>!<username>@<servername>\".") ! return 0 user = User() ! user.setstring(userstr) else: user = None ! perm = m.group("perm1") or m.group("perm2") ! if m.group("command").lower() == "give": ! self.mm_setperm(0, server, channel, user, perm) else: ! if not self.mm_unsetperm(0, server, channel, ! user, perm): ! msg.answer("%:", "No entries like this were found", [".", "!"]) ! return 0 ! msg.answer("%:", ["Done, sir!", "No problems!", "Ok!"]) ! else: ! msg.answer("%:", ["Sorry, you", "Sir, you", "You"], ["can't work with permissions.", "don't have this power."]) ! return 0 ! ! m = self.re2.match(msg.line) ! if m: ! if self.mm_hasperm(0, msg.server.servername, msg.target, msg.user, None): ! perm = m.group("perm") ! if perm: ! if not (self.perm.has_key(perm) and self.perm[perm]): ! msg.answer("%:", "Nobody has this permission", [".", "!"]) else: ! perms = self.perm[perm] ! permlen = len(self.perm[perm]) ! s = "" ! for i in range(permlen): ! tup = perms[i] ! if tup[2] is not None: ! s += tup[2].string ! if tup[1] is not None: ! join = "" ! if s: ! join = " at " ! s = "%s%schannel %s" % (s, join, tup[1]) ! if tup[0] is not None: ! join = "" ! if s: ! join = " on " ! s = "%s%sserver %s" % (s, join, tup[0]) ! if i == permlen-1: ! s += "." ! elif i == permlen-2: ! s += ", and " ! else: ! s += ", " ! msg.answer("%:", "This permission is available for the following people:", s) else: ! if not self.perm: ! msg.answer("%:", "No given permissions", [".", "!"]) ! else: ! msg.answer("%:", "The following permissions are available for some users:", ", ".join(self.perm.keys())) ! else: ! msg.answer("%:", ["Sorry, you", "Sir, you", "You"], ["can't work with permissions.", "don't have this power."]) ! return 0 ! def mm_hasperm(self, defret, server, channel, user, perm): if self.perm.has_key(perm): for tup in self.perm[perm]: ! if (tup[0] is None or tup[0] == server) and \ ! (tup[1] is None or tup[1] == channel) and \ ! (tup[2] is None or user.match(tup[2].nick, tup[2].username, tup[2].host)): return 1 + if perm != "admin": + if not (self.perm.has_key("admin") and self.perm["admin"]): + return 1 + return self.mm_hasperm(defret, server, channel, user, "admin") + return 0 def mm_setperm(self, defret, server, channel, user, perm): ! if not self.perm.has_key(perm): ! self.perm[perm] = [(server,channel,user)] else: ! self.perm[perm].append((server,channel,user)) def mm_unsetperm(self, defret, server, channel, user, perm): ! found = 0 ! if self.perm.has_key(perm): _perm = self.perm[perm] for tup in _perm: ! if (tup[0] is None or tup[0] == server) and \ ! (tup[1] is None or tup[1] == channel) and \ ! (tup[2] is None or user.match(tup[2].nick, tup[2].username, tup[2].host)): _perm.remove(tup) if len(_perm) == 0: del self.perm[perm] + found = 1 + return found |
From: Gustavo N. <nie...@us...> - 2002-06-20 01:17:54
|
Update of /cvsroot/pybot/pybot In directory usw-pr-cvs1:/tmp/cvs-serv15052 Modified Files: ChangeLog Log Message: - Improved permission module a lot; - Included help system; - Changed admin permission handling (WARNING!!! Don't merge this patch if you don't know what it means!) Index: ChangeLog =================================================================== RCS file: /cvsroot/pybot/pybot/ChangeLog,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** ChangeLog 19 Jun 2002 20:05:36 -0000 1.6 --- ChangeLog 20 Jun 2002 01:17:47 -0000 1.7 *************** *** 1,2 **** --- 1,8 ---- + 2002-06-19 Gustavo Niemeyer <nie...@co...> + * scripts/pybotsetup.py: Adopted new admin permission working. + * modules/log.py: Created logging facilities. + * modules/permission.py: Improved permission handling a lot, + included help system, and changed admin permission system. + 2002-04-03 Gustavo Niemeyer <nie...@co...> * scripts/pybot.py: Fixed. |
From: Gustavo N. <nie...@us...> - 2002-06-20 01:17:54
|
Update of /cvsroot/pybot/pybot/scripts In directory usw-pr-cvs1:/tmp/cvs-serv15052/scripts Modified Files: pybotsetup.py Log Message: - Improved permission module a lot; - Included help system; - Changed admin permission handling (WARNING!!! Don't merge this patch if you don't know what it means!) Index: pybotsetup.py =================================================================== RCS file: /cvsroot/pybot/pybot/scripts/pybotsetup.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** pybotsetup.py 3 Apr 2002 22:29:51 -0000 1.3 --- pybotsetup.py 20 Jun 2002 01:17:48 -0000 1.4 *************** *** 25,41 **** import time import cPickle if os.path.isfile("options"): - sys.exit("You already have an options file!") - # For the future: file = open("options") option = cPickle.load(file) ! file.close() else: option = {} - if os.path.isdir("pybot"): - sys.path.append(".") - from pybot.user import User --- 25,40 ---- import time import cPickle + import shutil + + if os.path.isdir("pybot"): + sys.path.append(".") if os.path.isfile("options"): file = open("options") option = cPickle.load(file) ! file.close() else: option = {} from pybot.user import User *************** *** 43,50 **** print """ This program does the basic setup for pybot. It will allow you to ! set the first nick, username and server you want pybot to connect, ! and also who you are (supposing you're the one who pybot will obey ! to). Further setup (including connecting to other servers and ! setting new masters) may be done talking with him, after connected. You may also use it to recover a previous setup. You may need to --- 42,48 ---- print """ This program does the basic setup for pybot. It will allow you to ! set the first nick, username and server you want pybot to connect. ! Further setup (including setting administrators and connecting to ! channels and servers) may be done by talking with him, after connected. You may also use it to recover a previous setup. You may need to *************** *** 57,78 **** print """ - Enter the nick you're going to use while talking to pybot.""" - nick = raw_input("Your nick: ") - - print """Enter the username you're going to use while talking to pybot. - Please, note that you may have a '~' added to your username, depending on - your host's configuration. If you want to be sure what your username is, - issue a '/whois %s' while connected to your irc server. You may also - use a wildcard, like *username, if you're not sure at all."""%nick - username = raw_input("Your username: ") - - print """ - Enter the hostname you're going to use while talking to pybot. - If you're not sure, you should also look at the output of the command - '/whois %s' while connected to your irc server. A wildcard like - *.my.host also work here, but be careful!"""%nick - hostname = raw_input("Your host: ") - - print """ Enter the server name:port where pybot will connect to. This is just to start it out. You may add and/or remove servers later talking --- 55,58 ---- *************** *** 96,108 **** sys.exit("Interrupted!") ! option["Permission.gosh"] = [User(nick, username, hostname)] ! option["ServerControl.servers"] = {server:[pybotnick, pybotusername, "0", pybotrealname, {}]} ! option["ModuleControl.modules"] = ["servercontrol", "pong", "permission", "help", "social"] file = open("options", "w") option = cPickle.dump(option,file,1) file.close() ! print "Options saved!" # vim:ts=4:sw=4:et --- 76,101 ---- sys.exit("Interrupted!") ! if option["Permission.perm"].has_key("admin"): ! del option["Permission.perm"]["admin"] ! #option["ServerControl.servers"] = {server:[pybotnick, pybotusername, "0", pybotrealname, {}]} ! #option["ModuleControl.modules"] = ["servercontrol", "pong", "permission", "help", "social"] + # Clean old permission system + if option.has_key("Permission.gosh"): + del option["Permission.gosh"] + + if os.path.isfile("options"): + shutil.copyfile("options", "options.old") file = open("options", "w") option = cPickle.dump(option,file,1) file.close() ! print """ ! Options saved! ! ! WARNING: As soon as your bot connects to the new server, you must set ! the "admin" permission, otherwise your bot will be free to hack by ! anyone. To understand how to do this, ask the bot "help permissions". ! """ # vim:ts=4:sw=4:et |
From: Gustavo N. <nie...@us...> - 2002-06-20 01:12:58
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory usw-pr-cvs1:/tmp/cvs-serv14077 Modified Files: log.py Log Message: - Don't show search line on results. - Decrease message priority a little bit. Index: log.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/log.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** log.py 19 Jun 2002 22:10:42 -0000 1.3 --- log.py 20 Jun 2002 01:12:55 -0000 1.4 *************** *** 93,101 **** return logmsg ! def search(self, regexp, max): p = re.compile(regexp, re.I) file = open(self.__logname) l = [] for line in file.xreadlines(): stime, servername, type, src, dest, line = line.split(" ", 5) if src == "-" or dest == "-": --- 93,102 ---- return logmsg ! def search(self, regexp, max, searchline): p = re.compile(regexp, re.I) file = open(self.__logname) l = [] for line in file.xreadlines(): + line = line[:-1] stime, servername, type, src, dest, line = line.split(" ", 5) if src == "-" or dest == "-": *************** *** 103,108 **** if p.search(line): l.append(LogMsg(int(stime), servername, type, src, dest, line)) ! if len(l) > max: l.pop(0) file.close() return l --- 104,113 ---- if p.search(line): l.append(LogMsg(int(stime), servername, type, src, dest, line)) ! if len(l) > max+1: l.pop(0) + if l and l[-1].line == searchline: + l.pop() + elif len(l) > max: + l.pop(0) file.close() return l *************** *** 113,120 **** hooks.register("Message", self.message) ! hooks.register("Message", self.log_message, 90) ! hooks.register("CTCP", self.log_ctcp, 90) ! hooks.register("OutMessage", self.log_outmessage, 90) ! hooks.register("OutCTCP", self.log_outctcp, 90) # Match '[have you] seen <nick> [!?]' --- 118,125 ---- hooks.register("Message", self.message) ! hooks.register("Message", self.log_message, 95) ! hooks.register("CTCP", self.log_ctcp, 95) ! hooks.register("OutMessage", self.log_outmessage, 95) ! hooks.register("OutCTCP", self.log_outctcp, 95) # Match '[have you] seen <nick> [!?]' *************** *** 122,126 **** # Match '[show] (log[s]|message[s]) [with] /<regexp>/[.!]' ! self.re2 = re.compile("(?:show\s+)?(?:log|message)s?\s+(?:with\s+)?/(?P<regexp>.*)/\s*[.!?]*", re.I) # Match 'seen' --- 127,131 ---- # Match '[show] (log[s]|message[s]) [with] /<regexp>/[.!]' ! self.re2 = re.compile("(?:show\s+|search\s+)?(?:log|message)s?\s+(?:with\s+|search\s+)?/(?P<regexp>.*)/\s*[.!?]*$", re.I) # Match 'seen' *************** *** 132,139 **** def unload(self): hooks.unregister("Message", self.message) ! hooks.unregister("Message", self.log_message, 90) ! hooks.unregister("CTCP", self.log_ctcp, 90) ! hooks.unregister("OutMessage", self.log_outmessage, 90) ! hooks.unregister("OutCTCP", self.log_outctcp, 90) mm.unregister_help(0, HELP_SEEN) --- 137,144 ---- def unload(self): hooks.unregister("Message", self.message) ! hooks.unregister("Message", self.log_message, 95) ! hooks.unregister("CTCP", self.log_ctcp, 95) ! hooks.unregister("OutMessage", self.log_outmessage, 95) ! hooks.unregister("OutCTCP", self.log_outctcp, 95) mm.unregister_help(0, HELP_SEEN) *************** *** 156,160 **** if mm.hasperm(1, msg.server.servername, msg.target, msg.user, "logsearch"): max = 5 ! logmsgs = self.log.search(m.group("regexp"), max) if logmsgs: llen = len(logmsgs) --- 161,166 ---- if mm.hasperm(1, msg.server.servername, msg.target, msg.user, "logsearch"): max = 5 ! logmsgs = self.log.search(m.group("regexp"), max, ! msg.rawline) if logmsgs: llen = len(logmsgs) |
From: Gustavo N. <nie...@us...> - 2002-06-19 22:10:45
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory usw-pr-cvs1:/tmp/cvs-serv9886 Modified Files: log.py Log Message: Fixed little typo. Index: log.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/log.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** log.py 19 Jun 2002 21:41:30 -0000 1.2 --- log.py 19 Jun 2002 22:10:42 -0000 1.3 *************** *** 63,67 **** s = "today at %d:%d" % msg[3:5] else: ! s = "%d-%d-%d at %d:%d" % msg[:5] return s --- 63,67 ---- s = "today at %d:%d" % msg[3:5] else: ! s = "on %d-%d-%d at %d:%d" % msg[:5] return s |
From: Gustavo N. <nie...@us...> - 2002-06-19 21:46:25
|
Update of /cvsroot/pybot/pybot/pybot In directory usw-pr-cvs1:/tmp/cvs-serv2373 Modified Files: user.py Log Message: Do user matching case insensitively. Index: user.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/user.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** user.py 4 Dec 2001 00:57:38 -0000 1.2 --- user.py 19 Jun 2002 21:46:22 -0000 1.3 *************** *** 47,53 **** 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 --- 47,53 ---- def match(self, nick="*", username="*", host="*"): ! if (nick=="*" or nick.lower()==self.nick.lower()) and \ ! (username=="*" or username.lower()==self.username.lower()) and \ ! (host=="*" or (host[0]=="*" and host[1:].lower()==self.host[-(len(host)-1):].lower()) or host.lower()==self.host.lower()): return 1 |
From: Gustavo N. <nie...@us...> - 2002-06-19 21:41:32
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory usw-pr-cvs1:/tmp/cvs-serv884 Modified Files: log.py Log Message: Implemented "seen" and log search functionalities. Index: log.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/log.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** log.py 19 Jun 2002 20:05:37 -0000 1.1 --- log.py 19 Jun 2002 21:41:30 -0000 1.2 *************** *** 18,30 **** from pybot import config, options, hooks, mm, servers import time import re import os ! class Message: ! def __init__(self, time=0, nick="", phrase=""): ! self.phrase = phrase self.time = time ! self.nick = nick class Log: --- 18,69 ---- from pybot import config, options, hooks, mm, servers + from pybot.user import User import time import re import os ! HELP_SEEN = [ ! ("""\ ! You may check when was the last time I've seen somebody with \ ! "[have you] seen <nick>". I'll also let you know what was the \ ! last message the user wrote.\ ! """,)] ! ! HELP_SEARCH = [ ! ("""\ ! You may search the log files with "[show] (log[s]|message[s]) \ ! [with] /<regexp>/'. You must have the "logsearch" permission for \ ! this to work.\ ! """,)] ! ! class LogMsg: ! def __init__(self, time, servername, type, src, dest, line): self.time = time ! self.servername = servername ! self.type = type ! self.src = src ! self.dest = dest ! self.line = line ! ! def __str__(self): ! src = User() ! src.setstring(self.src) ! if self.type == "MESSAGE": ! s = "<%s> %s" % (src.nick, self.line) ! elif self.type == "ACTION": ! s = "* %s %s" % (src.nick, self.line) ! else: ! s = "" ! return s ! ! def timestr(self): ! msg = time.localtime(self.time) ! now = time.localtime() ! if msg[:3] == now[:3]: ! s = "today at %d:%d" % msg[3:5] ! else: ! s = "%d-%d-%d at %d:%d" % msg[:5] ! return s ! class Log: *************** *** 38,41 **** --- 77,111 ---- file.close() + def seen(self, nick): + stripnick = re.compile(r"^[\W_]*([^\W_]+)[\W_]*$") + nick = stripnick.sub(r"\1", nick.lower()) + file = open(self.__logname) + logmsg = None + for line in file.xreadlines(): + stime, servername, type, src, dest, line = line.split(" ", 5) + if src == "-" or dest == "-": + continue + user = User() + user.setstring(src) + if stripnick.sub(r"\1", user.nick.lower()) == nick: + logmsg = LogMsg(int(stime), servername, type, src, dest, line) + file.close() + return logmsg + + def search(self, regexp, max): + p = re.compile(regexp, re.I) + file = open(self.__logname) + l = [] + for line in file.xreadlines(): + stime, servername, type, src, dest, line = line.split(" ", 5) + if src == "-" or dest == "-": + continue + if p.search(line): + l.append(LogMsg(int(stime), servername, type, src, dest, line)) + if len(l) > max: + l.pop(0) + file.close() + return l + class LogModule: def __init__(self): *************** *** 49,56 **** # Match '[have you] seen <nick> [!?]' ! self.re1 = re.compile(r"(?:have\s+you\s+)?seen\s+(?P<nick>\w+)\s*[!?]*$", re.I) ! # Match '[show] log [with] /<regexp>/[.!]' ! #self.re2 = re.compile("", re.I) def unload(self): --- 119,132 ---- # Match '[have you] seen <nick> [!?]' ! self.re1 = re.compile(r"(?:have\s+you\s+)?seen\s+(?P<nick>[^\s!?]+)\s*[!?]*$", re.I) ! # Match '[show] (log[s]|message[s]) [with] /<regexp>/[.!]' ! self.re2 = re.compile("(?:show\s+)?(?:log|message)s?\s+(?:with\s+)?/(?P<regexp>.*)/\s*[.!?]*", re.I) ! ! # Match 'seen' ! mm.register_help(0, "seen", HELP_SEEN) ! ! # Match '(log|search (log[s]|message[s]))' ! mm.register_help(0, "log|search\s+(?:log|message)s?", HELP_SEARCH) def unload(self): *************** *** 59,63 **** hooks.unregister("CTCP", self.log_ctcp, 90) hooks.unregister("OutMessage", self.log_outmessage, 90) ! hooks.nuregister("OutCTCP", self.log_outctcp, 90) def message(self, msg): --- 135,142 ---- hooks.unregister("CTCP", self.log_ctcp, 90) hooks.unregister("OutMessage", self.log_outmessage, 90) ! hooks.unregister("OutCTCP", self.log_outctcp, 90) ! ! mm.unregister_help(0, HELP_SEEN) ! mm.unregister_help(0, HELP_SEARCH) def message(self, msg): *************** *** 65,69 **** m = self.re1.match(msg.line) if m: ! msg.answer("%:", ["Oops!", "Sorry!"], "Not yet", [".", "!"]) return 0 --- 144,178 ---- m = self.re1.match(msg.line) if m: ! nick = m.group("nick") ! logmsg = self.log.seen(nick) ! if not logmsg: ! msg.answer("%:", "Sorry, I haven't seen %s for a while..." % nick) ! else: ! msg.answer("%:", "I have seen %s %s, with the following message:" % (nick, logmsg.timestr())) ! msg.answer(str(logmsg)) ! return 0 ! m = self.re2.match(msg.line) ! if m: ! if mm.hasperm(1, msg.server.servername, msg.target, msg.user, "logsearch"): ! max = 5 ! logmsgs = self.log.search(m.group("regexp"), max) ! if logmsgs: ! llen = len(logmsgs) ! if llen == 1: ! if max == 1: ! s = "Here is the last entry found:" ! else: ! s = "Here is the only entry found:" ! elif llen == max: ! s = "Here are the last %d entries found:" % llen ! else: ! s = "Here are the only %d entries found:" % llen ! msg.answer("%:", s) ! for logmsg in logmsgs: ! msg.answer(str(logmsg)) ! else: ! msg.answer("%:", ["Sorry!", "Oops!"], ["No messages found", "Can't find any message", "No entries found"], [".", "!"]) ! else: ! msg.answer("%:", [("You're not", ["allowed to search logs.", "that good...", "allowed to do this..."]), "No, sir!", "Nope."]) return 0 |
From: Gustavo N. <nie...@us...> - 2002-06-19 20:05:45
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory usw-pr-cvs1:/tmp/cvs-serv1247/pybot/modules Added Files: log.py Log Message: Added first draft of log module. --- NEW FILE: log.py --- # Copyright (c) 2000-2002 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 from pybot import config, options, hooks, mm, servers import time import re import os class Message: def __init__(self, time=0, nick="", phrase=""): self.phrase = phrase self.time = time self.nick = nick class Log: def __init__(self): self.__logname = config.get("log", "logfile") def append(self, servername, type, src, dest, line): file = open(self.__logname, "a") file.write("%d %s %s %s %s %s\n" % (int(time.time()), servername, type, src, dest, line)) file.close() class LogModule: def __init__(self): self.log = Log() hooks.register("Message", self.message) hooks.register("Message", self.log_message, 90) hooks.register("CTCP", self.log_ctcp, 90) hooks.register("OutMessage", self.log_outmessage, 90) hooks.register("OutCTCP", self.log_outctcp, 90) # Match '[have you] seen <nick> [!?]' self.re1 = re.compile(r"(?:have\s+you\s+)?seen\s+(?P<nick>\w+)\s*[!?]*$", re.I) # Match '[show] log [with] /<regexp>/[.!]' #self.re2 = re.compile("", re.I) def unload(self): hooks.unregister("Message", self.message) hooks.unregister("Message", self.log_message, 90) hooks.unregister("CTCP", self.log_ctcp, 90) hooks.unregister("OutMessage", self.log_outmessage, 90) hooks.nuregister("OutCTCP", self.log_outctcp, 90) def message(self, msg): if msg.forme: m = self.re1.match(msg.line) if m: msg.answer("%:", ["Oops!", "Sorry!"], "Not yet", [".", "!"]) return 0 def log_message(self, msg): target = msg.direct and "-" or msg.target self.log.append(msg.server.servername, "MESSAGE", msg.user.string, target, msg.rawline) def log_ctcp(self, msg): if msg.ctcp == "ACTION": target = msg.direct and "-" or msg.target self.log.append(msg.server.servername, "ACTION", msg.user.string, target, msg.rawline) def log_outmessage(self, msg): self.log.append(msg.server.servername, "MESSAGE", "-", msg.target, msg.rawline) def log_outctcp(self, msg): if msg.ctcp == "ACTION": self.log.append(msg.server.servername, "ACTION", "-", msg.target, msg.rawline) def __loadmodule__(bot): global module module = LogModule() def __unloadmodule__(bot): global module module.unload() del module # vim:ts=4:sw=4:et |
From: Gustavo N. <nie...@us...> - 2002-06-19 20:05:45
|
Update of /cvsroot/pybot/pybot In directory usw-pr-cvs1:/tmp/cvs-serv1247 Modified Files: ChangeLog pybot.conf Log Message: Added first draft of log module. Index: ChangeLog =================================================================== RCS file: /cvsroot/pybot/pybot/ChangeLog,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** ChangeLog 3 Apr 2002 22:29:51 -0000 1.5 --- ChangeLog 19 Jun 2002 20:05:36 -0000 1.6 *************** *** 1,4 **** --- 1,9 ---- 2002-04-03 Gustavo Niemeyer <nie...@co...> * scripts/pybot.py: Fixed. + * modules/freshmeat.py: Fixed little bug in regular expression and + implemented help system. + * modules/messages.py: unregister_help() must have a defret + parameter. + * modules/freshmeat.py: Removed since AppWatch is dead. 2001-12-03 Gustavo Niemeyer <nie...@co...> Index: pybot.conf =================================================================== RCS file: /cvsroot/pybot/pybot/pybot.conf,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** pybot.conf 2 Nov 2001 17:19:01 -0000 1.1.1.1 --- pybot.conf 19 Jun 2002 20:05:37 -0000 1.2 *************** *** 4,5 **** --- 4,7 ---- infopackdir = %(datadir)s/infopacks + [log] + logfile = %(datadir)s/logs/pybot.log |
From: Gustavo N. <nie...@us...> - 2002-06-19 20:02:05
|
Update of /cvsroot/pybot/pybot/data/logs In directory usw-pr-cvs1:/tmp/cvs-serv32646/data/logs Log Message: Directory /cvsroot/pybot/pybot/data/logs added to the repository |
From: Gustavo N. <nie...@us...> - 2002-06-17 20:33:44
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory usw-pr-cvs1:/tmp/cvs-serv19863 Modified Files: infopack.py social.py Log Message: - Ignore case when compiling infopack triggers. - Social had a wrong "thanks" regular expression. Index: infopack.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/infopack.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** infopack.py 4 Dec 2001 00:57:38 -0000 1.2 --- infopack.py 17 Jun 2002 20:33:40 -0000 1.3 *************** *** 54,58 **** values.append(value) elif line[0] == "T": ! pattern = re.compile(line[2:].rstrip()) self.__triggers.append(pattern) elif line[0] == "M": --- 54,58 ---- values.append(value) elif line[0] == "T": ! pattern = re.compile(line[2:].rstrip(), re.I) self.__triggers.append(pattern) elif line[0] == "M": *************** *** 73,77 **** if line and line[0] != "#": if line[0] == "T": ! pattern = re.compile(line[2:].rstrip()) self.__triggers.append(pattern) elif line[0] == "M": --- 73,77 ---- if line and line[0] != "#": if line[0] == "T": ! pattern = re.compile(line[2:].rstrip(), re.I) self.__triggers.append(pattern) elif line[0] == "M": Index: social.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/social.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** social.py 4 Dec 2001 16:10:57 -0000 1.4 --- social.py 17 Jun 2002 20:33:41 -0000 1.5 *************** *** 34,38 **** # Match '[thank[']s|thank you|thx|tnk[']s] [!|.]' ! self.re3 = re.compile(r'(?:thank|thx|tnk)(?:\'?s|\s+you)(?:\s+(?P<nick>\w+))\s*[!.]*', re.I) # Match 'are you ok?|how are you [doing]?' --- 34,38 ---- # Match '[thank[']s|thank you|thx|tnk[']s] [!|.]' ! self.re3 = re.compile(r'(?:thank|thx|tnk)(?:\'?s|\s+you)(?:\s+(?P<nick>\w+))?\s*[!.]*', re.I) # Match 'are you ok?|how are you [doing]?' *************** *** 77,81 **** m = self.re3.match(msg.line) if m and (msg.forme or m.group("nick") == usernick): ! msg.answer("%:", ["No problems", "You're welcome", "I'm glad to help you", "I'm here for things like this..."], ["!", "."]) return 0 --- 77,81 ---- m = self.re3.match(msg.line) if m and (msg.forme or m.group("nick") == usernick): ! msg.answer("%:", ["No problems", "You're welcome", "I'm glad to help you", "I'm here for things like this", "Not at all"], ["!", "."]) return 0 |
From: Gustavo N. <nie...@us...> - 2002-05-09 15:55:46
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory usw-pr-cvs1:/tmp/cvs-serv32404 Modified Files: pong.py timer.py Log Message: - Now pybot pings the server every minute as a keepalive (thanks Olive!). - Some fixes in timer module to load it first, and keep data softly stored in options object. This way, timer may reload safely. Index: pong.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/pong.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** pong.py 4 Dec 2001 00:57:38 -0000 1.2 --- pong.py 9 May 2002 15:55:41 -0000 1.3 *************** *** 17,32 **** # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import hooks class Pong: def __init__(self, bot): hooks.register("Command", self.pong, 0) def unload(self): hooks.unregister("Command", self.pong, 0) def pong(self, cmd): if cmd.cmd == "PING": cmd.server.sendcmd("", "PONG", cmd.params, priority=10) def __loadmodule__(bot): --- 17,38 ---- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import hooks, mm, servers class Pong: def __init__(self, bot): hooks.register("Command", self.pong, 0) + mm.hooktimer(0, 60, self.ping, ()) def unload(self): hooks.unregister("Command", self.pong, 0) + mm.unhooktimer(0, 60, self.ping, ()) def pong(self, cmd): if cmd.cmd == "PING": cmd.server.sendcmd("", "PONG", cmd.params, priority=10) + + def ping(self): + for server in servers.getall(): + server.sendcmd("", "PING", server.user.nick) def __loadmodule__(bot): Index: timer.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/timer.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** timer.py 4 Dec 2001 00:57:38 -0000 1.2 --- timer.py 9 May 2002 15:55:41 -0000 1.3 *************** *** 17,21 **** # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import mm, hooks from time import time from thread import start_new_thread --- 17,21 ---- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import mm, hooks, options from time import time from thread import start_new_thread *************** *** 23,27 **** class Timer: def __init__(self, bot): ! self._timer = [] mm.register("hooktimer", self.mm_hooktimer) mm.register("unhooktimer", self.mm_unhooktimer) --- 23,27 ---- class Timer: def __init__(self, bot): ! self._timer = options.getsoft("Timer.data", []) mm.register("hooktimer", self.mm_hooktimer) mm.register("unhooktimer", self.mm_unhooktimer) *************** *** 63,66 **** --- 63,69 ---- del self._timer[i] return ret + + # Load first to let hooktimer() available to other modules. + __loadlevel__ = 90 def __loadmodule__(bot): |
From: Gustavo N. <nie...@us...> - 2002-04-03 23:32:09
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory usw-pr-cvs1:/tmp/cvs-serv12775 Modified Files: freshmeat.py Log Message: Oops. Target is not necessary. Changed comments and help. Index: freshmeat.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/freshmeat.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** freshmeat.py 3 Apr 2002 23:25:38 -0000 1.3 --- freshmeat.py 3 Apr 2002 23:32:06 -0000 1.4 *************** *** 26,36 **** ("""\ You may tell me which channels/users I have to notify of freshmeat news \ ! with "[don't] show freshmeat news (on|to) [channel|user] <target> [on \ ! server <server>]".\ """,)] URL = "http://freshmeat.net/backend/recentnews.txt" PROXY = None ! # PROXY = {"http":"http://proxy.conectiva.com.br:3128"} FETCHINTERVAL = 10 --- 26,36 ---- ("""\ You may tell me which channels/users I have to notify of freshmeat news \ ! with "[don't] show freshmeat news [(on|to) [channel|user] <target> [on \ ! server <server>]]".\ """,)] URL = "http://freshmeat.net/backend/recentnews.txt" PROXY = None ! # PROXY = {"http":"http://proxy.url.com:3128"} FETCHINTERVAL = 10 *************** *** 44,48 **** mm.hooktimer(0, FETCHINTERVAL*60, self.checknews, ()) ! # Match '[don[']t|do not] show freshmeat news (to|on|at|for) [channel|user] <target> [[on|at] server <server>] [!|.]' self.re1 = re.compile(r"(?P<dont>don'?t\s+|do\s+not\s+)?show\s+freshmeat\s+news(?:\s+(?:to|on|at|for)(?:\s+channel|\s+user)?\s+(?P<target>\S+)(?:(?:\s+on|\s+at)?\s+server\s+(?P<server>\S+?))?)?\s*[!.]*$", re.I) --- 44,48 ---- mm.hooktimer(0, FETCHINTERVAL*60, self.checknews, ()) ! # Match '[don[']t|do not] show freshmeat news [(to|on|at|for) [channel|user] <target> [[on|at] server <server>]] [!|.]' self.re1 = re.compile(r"(?P<dont>don'?t\s+|do\s+not\s+)?show\s+freshmeat\s+news(?:\s+(?:to|on|at|for)(?:\s+channel|\s+user)?\s+(?P<target>\S+)(?:(?:\s+on|\s+at)?\s+server\s+(?P<server>\S+?))?)?\s*[!.]*$", re.I) |
From: Gustavo N. <nie...@us...> - 2002-04-03 23:29:34
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory usw-pr-cvs1:/tmp/cvs-serv12131 Removed Files: appwatch.py Log Message: AppWatch is dead. --- appwatch.py DELETED --- |
From: Gustavo N. <nie...@us...> - 2002-04-03 23:25:41
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory usw-pr-cvs1:/tmp/cvs-serv11114 Modified Files: freshmeat.py Log Message: - Implemented help system. - Fixed little bug in regular expression. Index: freshmeat.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/freshmeat.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** freshmeat.py 4 Dec 2001 00:57:38 -0000 1.2 --- freshmeat.py 3 Apr 2002 23:25:38 -0000 1.3 *************** *** 23,28 **** import re URL = "http://freshmeat.net/backend/recentnews.txt" ! PROXY = {"http":"http://proxy.conectiva.com.br:3128"} FETCHINTERVAL = 10 --- 23,36 ---- import re + HELP = [ + ("""\ + You may tell me which channels/users I have to notify of freshmeat news \ + with "[don't] show freshmeat news (on|to) [channel|user] <target> [on \ + server <server>]".\ + """,)] + URL = "http://freshmeat.net/backend/recentnews.txt" ! PROXY = None ! # PROXY = {"http":"http://proxy.conectiva.com.br:3128"} FETCHINTERVAL = 10 *************** *** 37,46 **** # Match '[don[']t|do not] show freshmeat news (to|on|at|for) [channel|user] <target> [[on|at] server <server>] [!|.]' ! self.re1 = re.compile(r"(?P<dont>don'?t\s+|do\s+not\s+)?show\s+freshmeat\s+news(?:(?:to|on|at|for)(?:\s+channel|\s+user)?\s+(?P<target>\S+)(?:(?:\s+on|\s+at)?\s+server\s+(?P<server>\S+?))?)?\s*[!.]*$", re.I) def unload(self): hooks.unregister("Message", self.message) mm.unhooktimer(0, FETCHINTERVAL*60, self.checknews, ()) def shownews(self, newslist): first = 1 --- 45,59 ---- # Match '[don[']t|do not] show freshmeat news (to|on|at|for) [channel|user] <target> [[on|at] server <server>] [!|.]' ! self.re1 = re.compile(r"(?P<dont>don'?t\s+|do\s+not\s+)?show\s+freshmeat\s+news(?:\s+(?:to|on|at|for)(?:\s+channel|\s+user)?\s+(?P<target>\S+)(?:(?:\s+on|\s+at)?\s+server\s+(?P<server>\S+?))?)?\s*[!.]*$", re.I) + # Match '[leav(e|ing)] message[s]' + mm.register_help(0, "freshmeat(?:\s+news)?", HELP) + def unload(self): hooks.unregister("Message", self.message) mm.unhooktimer(0, FETCHINTERVAL*60, self.checknews, ()) + mm.unregister_help(0, HELP) + def shownews(self, newslist): first = 1 *************** *** 61,65 **** def fetchnews(self): urlopener = urllib.URLopener() ! urlopener.proxies.update(PROXY) try: url = urlopener.open(URL) --- 74,79 ---- def fetchnews(self): urlopener = urllib.URLopener() ! if PROXY: ! urlopener.proxies.update(PROXY) try: url = urlopener.open(URL) |
From: Gustavo N. <nie...@us...> - 2002-04-03 23:24:10
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory usw-pr-cvs1:/tmp/cvs-serv10737 Modified Files: messages.py Log Message: unregister_help() must have a defret parameter. Index: messages.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/messages.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** messages.py 19 Mar 2002 18:32:06 -0000 1.4 --- messages.py 3 Apr 2002 23:24:07 -0000 1.5 *************** *** 46,50 **** hooks.unregister("UserJoined", self.checkmsgs) ! mm.unregister_help(HELP) def checkmsgs(self, server, target, user): --- 46,50 ---- hooks.unregister("UserJoined", self.checkmsgs) ! mm.unregister_help(0, HELP) def checkmsgs(self, server, target, user): |
From: Gustavo N. <nie...@us...> - 2002-04-03 23:09:00
|
Update of /cvsroot/pybot/pybot In directory usw-pr-cvs1:/tmp/cvs-serv7090 Modified Files: TODO Log Message: Updated. Index: TODO =================================================================== RCS file: /cvsroot/pybot/pybot/TODO,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** TODO 2 Nov 2001 17:19:01 -0000 1.1.1.1 --- TODO 3 Apr 2002 23:08:54 -0000 1.2 *************** *** 2,11 **** This are some of the features to be implemented in the future: ! - A website for pybot. - Documentation!! Please, write documentation. :-) ! - Create a script to run pybot from outside the build environment. It must ! detect somehow where pybot is installed and call it. - Adapt distutils classes to install every necessary file in their respective --- 2,10 ---- This are some of the features to be implemented in the future: ! - A better website for pybot. - Documentation!! Please, write documentation. :-) ! - Include every module in the online help system. - Adapt distutils classes to install every necessary file in their respective *************** *** 17,21 **** - Give users a chance to identify themselves to pybot when they are in other servers than their registered ones. Must discover some way to ! detect when the user has left and auto-logout him. - Develop a README explaining how to do the basic setup of pybot. --- 16,20 ---- - Give users a chance to identify themselves to pybot when they are in other servers than their registered ones. Must discover some way to ! detect when the user has left and auto-logout him - Develop a README explaining how to do the basic setup of pybot. |
From: Gustavo N. <nie...@us...> - 2002-04-03 22:29:59
|
Update of /cvsroot/pybot/pybot In directory usw-pr-cvs1:/tmp/cvs-serv28749 Modified Files: ChangeLog Log Message: Fixed. Index: ChangeLog =================================================================== RCS file: /cvsroot/pybot/pybot/ChangeLog,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** ChangeLog 4 Dec 2001 01:00:09 -0000 1.4 --- ChangeLog 3 Apr 2002 22:29:51 -0000 1.5 *************** *** 1,2 **** --- 1,5 ---- + 2002-04-03 Gustavo Niemeyer <nie...@co...> + * scripts/pybot.py: Fixed. + 2001-12-03 Gustavo Niemeyer <nie...@co...> * pybot.py, pybot/runner.py: New files with new startup system. |
From: Gustavo N. <nie...@us...> - 2002-04-03 22:29:59
|
Update of /cvsroot/pybot/pybot/scripts In directory usw-pr-cvs1:/tmp/cvs-serv28749/scripts Modified Files: pybotsetup.py Log Message: Fixed. Index: pybotsetup.py =================================================================== RCS file: /cvsroot/pybot/pybot/scripts/pybotsetup.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** pybotsetup.py 4 Dec 2001 00:57:38 -0000 1.2 --- pybotsetup.py 3 Apr 2002 22:29:51 -0000 1.3 *************** *** 25,31 **** import time import cPickle - import pybot if os.path.isfile("options"): file = open("options") option = cPickle.load(file) --- 25,32 ---- import time import cPickle if os.path.isfile("options"): + sys.exit("You already have an options file!") + # For the future: file = open("options") option = cPickle.load(file) *************** *** 34,37 **** --- 35,43 ---- option = {} + if os.path.isdir("pybot"): + sys.path.append(".") + + from pybot.user import User + try: print """ *************** *** 90,95 **** sys.exit("Interrupted!") ! option["Permission.gosh"] = [pybot.User(nick, username, hostname)] ! option["ServerControl.servers"] = {server:[pybotnick, pybotusername, "0", pybotrealname, []]} file = open("options", "w") --- 96,102 ---- sys.exit("Interrupted!") ! option["Permission.gosh"] = [User(nick, username, hostname)] ! option["ServerControl.servers"] = {server:[pybotnick, pybotusername, "0", pybotrealname, {}]} ! option["ModuleControl.modules"] = ["servercontrol", "pong", "permission", "help", "social"] file = open("options", "w") |
From: Gustavo N. <nie...@us...> - 2002-03-19 18:32:09
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory usw-pr-cvs1:/tmp/cvs-serv543 Modified Files: messages.py plock.py Log Message: - Fixed typo; - Unregister help when unloading module; - Changed plock dir. Index: messages.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/messages.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** messages.py 4 Dec 2001 00:57:38 -0000 1.3 --- messages.py 19 Mar 2002 18:32:06 -0000 1.4 *************** *** 25,30 **** ("""\ You may leave a message to another user with "[priv[ate]] message (to|for) \ ! <nick>: <message>". I'll let <nick> know about your message when he join \ ! or speak something in one of the channels I'm in.\ """,)] --- 25,30 ---- ("""\ You may leave a message to another user with "[priv[ate]] message (to|for) \ ! <nick>: <message>". I'll let <nick> know about your message when he joins \ ! or speaks something in one of the channels I'm in.\ """,)] *************** *** 45,48 **** --- 45,50 ---- hooks.unregister("Message", self.message) hooks.unregister("UserJoined", self.checkmsgs) + + mm.unregister_help(HELP) def checkmsgs(self, server, target, user): Index: plock.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/plock.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** plock.py 4 Dec 2001 00:57:38 -0000 1.4 --- plock.py 19 Mar 2002 18:32:06 -0000 1.5 *************** *** 64,68 **** class PLock: def __init__(self, bot): ! self.pdir = "/mnt/locks/" hooks.register("Message", self.message) options.gethard("UserData.type", {}).setdefault("email", "~") --- 64,68 ---- class PLock: def __init__(self, bot): ! self.pdir = "/cnc/distro/locks/" hooks.register("Message", self.message) options.gethard("UserData.type", {}).setdefault("email", "~") |
From: Gustavo N. <nie...@us...> - 2001-12-04 16:11:00
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory usw-pr-cvs1:/tmp/cvs-serv13959 Modified Files: social.py Log Message: re5 was matching the null string as well. Fixed. Index: social.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/social.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** social.py 2001/12/04 00:57:38 1.3 --- social.py 2001/12/04 16:10:57 1.4 *************** *** 40,44 **** # Match 'pybot?' ! self.re5 = re.compile(r'!*?[?!]*$', re.I) # Match 'never mind [!|.]' --- 40,44 ---- # Match 'pybot?' ! self.re5 = re.compile(r'!*\?[?!]*$', re.I) # Match 'never mind [!|.]' |
From: Gustavo N. <nie...@us...> - 2001-12-04 01:00:12
|
Update of /cvsroot/pybot/pybot In directory usw-pr-cvs1:/tmp/cvs-serv2096 Modified Files: ChangeLog Log Message: Updated. Index: ChangeLog =================================================================== RCS file: /cvsroot/pybot/pybot/ChangeLog,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** ChangeLog 2001/12/04 00:57:37 1.3 --- ChangeLog 2001/12/04 01:00:09 1.4 *************** *** 2,5 **** --- 2,7 ---- * pybot.py, pybot/runner.py: New files with new startup system. * run, scripts/pybot.py: Removed. + * *.py: Converted tabs to spaces so people using other editors + feel confortable as well (suggested by John Thingstad). 2001-11-14 Gustavo Niemeyer <nie...@co...> |
Update of /cvsroot/pybot/pybot/pybot/modules In directory usw-pr-cvs1:/tmp/cvs-serv32496/pybot/modules Modified Files: __init__.py appwatch.py ctcp.py eval.py forward.py freshmeat.py help.py ignore.py infopack.py messages.py modulecontrol.py notes.py options.py permission.py plock.py pong.py randnum.py repeat.py soap.py social.py threadedexample.py timer.py uptime.py userdata.py Log Message: - Implemented new startup system. - Converted tabs to spaces so people using other editors feel confortable as well (suggested by John Thingstad). Index: __init__.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/__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:26 1.1.1.1 --- __init__.py 2001/12/04 00:57:38 1.2 *************** *** 18,19 **** --- 18,20 ---- + # vim:ts=4:sw=4:et Index: appwatch.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/appwatch.py,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** appwatch.py 2001/11/02 17:20:23 1.1.1.1 --- appwatch.py 2001/12/04 00:57:38 1.2 *************** *** 28,127 **** class AppWatch: ! def __init__(self, bot): ! self.newslast = options.gethard("AppWatch.newslast", [None]) ! self.newstargets = options.gethard("AppWatch.newstargets", []) ! self.newstargets_lock = thread.allocate_lock() ! self.fetch_lock = thread.allocate_lock() ! hooks.register("Message", self.message) ! mm.hooktimer(0, FETCHINTERVAL*60, self.checknews, ()) ! # Match '[don[']t|do not] show appwatch news (to|on|at|for) [channel|user] <target> [[on|at] server <server>] [!|.]' ! self.re1 = re.compile(r"(?P<dont>don'?t\s+|do\s+not\s+)?show\s+appwatch\s+news(?:(?:to|on|at|for)(?:\s+channel|\s+user)?\s+(?P<target>\S+)(?:(?:\s+on|\s+at)?\s+server\s+(?P<server>\S+?))?)?\s*[!.]*", re.I) ! ! def unload(self): ! hooks.unregister("Message", self.message) ! mm.unhooktimer(0, FETCHINTERVAL*60, self.checknews, ()) ! ! def shownews(self, newslist): ! first = 1 ! newsmsg = "" ! for news in newslist: ! if not first: ! newsmsg = newsmsg+", " ! else: ! first = 0 ! newsmsg = newsmsg+news[0] ! self.newstargets_lock.acquire() ! for target in self.newstargets: ! server = servers.get(target[0]) ! if server: ! server.sendmsg(target[1], None, "AppWatch news:", newsmsg, notice=1) ! self.newstargets_lock.release() ! ! def fetchnews(self): ! urlopener = urllib.URLopener() ! urlopener.proxies.update(PROXY) ! try: ! url = urlopener.open(URL) ! except: ! pass ! else: ! newslist = [] ! while 1: ! news_name = string.rstrip(url.readline()) ! news_url = string.rstrip(url.readline()) ! url.readline() # Discard "---" ! news_tuple = (news_name, news_url) ! if not (news_name and news_url) or news_tuple == self.newslast[0]: ! break ! newslist.append(news_tuple) ! url.close() ! if newslist: ! self.newslast[0] = newslist[0] ! newslist.reverse() ! self.shownews(newslist) ! self.fetch_lock.release() ! ! def checknews(self): ! if self.newstargets and self.fetch_lock.acquire(0): ! thread.start_new_thread(self.fetchnews, ()) ! ! def message(self, msg): ! if msg.forme: ! m = self.re1.match(msg.line) ! if m: ! if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "appwatchnews"): ! target = m.group("target") or msg.target ! servername = m.group("server") or msg.server.servername ! tuple = (servername, target) ! if not m.group("dont"): ! try: ! self.newstargets.index(tuple) ! except ValueError: ! self.newstargets.append(tuple) ! msg.answer("%:", ["Sure", "I'll show", "Of course"], ["!", ", sir!"]) ! else: ! msg.answer("%:", ["Oops!", "Sorry!", "Nope."], "I'm already showing news for this target", ["!", "."]) ! else: ! self.newstargets_lock.acquire() ! try: ! self.newstargets.remove(tuple) ! except ValueError: ! msg.answer("%:", ["Oops!", "Sorry!", "Nope."], "I'm not showing news for this target", ["!", "."]) ! else: ! msg.answer("%:", ["Sure", "I won't show", "Of course"], ["!", "."]) ! self.newstargets_lock.release() ! else: ! msg.answer("%:", ["You can't", "You're not allowed to", "You're not good enough to"], ["do this", "You can't change freshmeat news settings"], ["!", "."]) ! return 0 ! def __loadmodule__(bot): ! global appwatch ! appwatch = AppWatch(bot) def __unloadmodule__(bot): ! global appwatch ! appwatch.unload() ! del appwatch ! # vim:ts=4:sw=4 --- 28,127 ---- class AppWatch: ! def __init__(self, bot): ! self.newslast = options.gethard("AppWatch.newslast", [None]) ! self.newstargets = options.gethard("AppWatch.newstargets", []) ! self.newstargets_lock = thread.allocate_lock() ! self.fetch_lock = thread.allocate_lock() ! hooks.register("Message", self.message) ! mm.hooktimer(0, FETCHINTERVAL*60, self.checknews, ()) ! # Match '[don[']t|do not] show appwatch news (to|on|at|for) [channel|user] <target> [[on|at] server <server>] [!|.]' ! self.re1 = re.compile(r"(?P<dont>don'?t\s+|do\s+not\s+)?show\s+appwatch\s+news(?:(?:to|on|at|for)(?:\s+channel|\s+user)?\s+(?P<target>\S+)(?:(?:\s+on|\s+at)?\s+server\s+(?P<server>\S+?))?)?\s*[!.]*", re.I) ! ! def unload(self): ! hooks.unregister("Message", self.message) ! mm.unhooktimer(0, FETCHINTERVAL*60, self.checknews, ()) ! ! def shownews(self, newslist): ! first = 1 ! newsmsg = "" ! for news in newslist: ! if not first: ! newsmsg = newsmsg+", " ! else: ! first = 0 ! newsmsg = newsmsg+news[0] ! self.newstargets_lock.acquire() ! for target in self.newstargets: ! server = servers.get(target[0]) ! if server: ! server.sendmsg(target[1], None, "AppWatch news:", newsmsg, notice=1) ! self.newstargets_lock.release() ! ! def fetchnews(self): ! urlopener = urllib.URLopener() ! urlopener.proxies.update(PROXY) ! try: ! url = urlopener.open(URL) ! except: ! pass ! else: ! newslist = [] ! while 1: ! news_name = string.rstrip(url.readline()) ! news_url = string.rstrip(url.readline()) ! url.readline() # Discard "---" ! news_tuple = (news_name, news_url) ! if not (news_name and news_url) or news_tuple == self.newslast[0]: ! break ! newslist.append(news_tuple) ! url.close() ! if newslist: ! self.newslast[0] = newslist[0] ! newslist.reverse() ! self.shownews(newslist) ! self.fetch_lock.release() ! ! def checknews(self): ! if self.newstargets and self.fetch_lock.acquire(0): ! thread.start_new_thread(self.fetchnews, ()) ! ! def message(self, msg): ! if msg.forme: ! m = self.re1.match(msg.line) ! if m: ! if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "appwatchnews"): ! target = m.group("target") or msg.target ! servername = m.group("server") or msg.server.servername ! tuple = (servername, target) ! if not m.group("dont"): ! try: ! self.newstargets.index(tuple) ! except ValueError: ! self.newstargets.append(tuple) ! msg.answer("%:", ["Sure", "I'll show", "Of course"], ["!", ", sir!"]) ! else: ! msg.answer("%:", ["Oops!", "Sorry!", "Nope."], "I'm already showing news for this target", ["!", "."]) ! else: ! self.newstargets_lock.acquire() ! try: ! self.newstargets.remove(tuple) ! except ValueError: ! msg.answer("%:", ["Oops!", "Sorry!", "Nope."], "I'm not showing news for this target", ["!", "."]) ! else: ! msg.answer("%:", ["Sure", "I won't show", "Of course"], ["!", "."]) ! self.newstargets_lock.release() ! else: ! msg.answer("%:", ["You can't", "You're not allowed to", "You're not good enough to"], ["do this", "You can't change freshmeat news settings"], ["!", "."]) ! return 0 ! def __loadmodule__(bot): ! global appwatch ! appwatch = AppWatch(bot) def __unloadmodule__(bot): ! global appwatch ! appwatch.unload() ! del appwatch ! # vim:ts=4:sw=4:et Index: ctcp.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/ctcp.py,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** ctcp.py 2001/11/02 17:20:23 1.1.1.1 --- ctcp.py 2001/12/04 00:57:38 1.2 *************** *** 21,110 **** class CTCP: ! def __init__(self, bot): ! hook.register("Message", self.message, 80) ! hook.register("Notice", self.notice, 80) ! mm.register("sendctcp", self.mm_sendctcp) ! mm.register("answerctcp", self.mm_answerctcp) ! mm.register("answermsgctcp", self.mm_answermsgctcp) ! mm.register("answernotctcp", self.mm_answernotctcp) ! ! def unload(self): ! hook.unregister("Message", self.message, 80) ! hook.unregister("Notice", self.notice, 80) ! mm.unregister("sendctcp") ! mm.unregister("answerctcp") ! mm.unregister("answermsgctcp") ! mm.unregister("answernotctcp") ! ! def message(self, msg): ! var = [] ! if msg.msg[0] and msg.msg[0][0]=="\01": ! msg.ctcpcmd = msg.msg[0][1:] ! msg.msg[-1] = msg.msg[-1][:-1] ! del msg.msg[0] ! del msg.rawmsg[0] ! msg.rawmsg[-1] = msg.rawmsg[-1][:-1] ! hook.call("CTCP", msg) ! return -1 ! ! def notice(self, msg): ! var = [] ! if msg.msg and msg.msg[0][0]=="\01": ! msg.ctcpcmd = msg.msg[0][1:] ! msg.msg[-1] = msg.msg[-1][:-1] ! del msg.msg[0] ! hook.call("CTCPReply", msg) ! return -1 ! def handlectcpout(self, server, line): ! msg = message() ! msg.setline(server, line) ! hook.call("OutCommand", msg) ! msg.ctcpcmd = msg.msg[0][1:] ! msg.msg[-1] = msg.msg[-1][:-1] ! del msg.msg[0] ! msg.rawmsg[-1] = msg.rawmsg[-1][:-1] ! del msg.rawmsg[0] ! msg.user = server.user ! if msg.cmd == "PRIVMSG": ! hook.call("OutCTCP", msg) ! else: ! hook.call("OutCTCPReply", msg) ! def mm_sendctcp(self, defret, server, cmd, ctcpcmd, target, nick, params, out=1): ! if type(params) == ListType: ! line = cmd+" "+target+" :\01"+ctcpcmd+" "+buildanswer(params, target, nick)+"\01" ! else: ! line = cmd+" "+target+" :\01"+ctcpcmd+" "+params+"\01" ! server.sendline(line) ! if out: self.handlectcpout(server,line) ! def mm_answerctcp(self, defret, msg, cmd, ctcpcmd, params, outhooks=1): ! if msg.direct: ! target = msg.user.nick ! else: ! target = msg.target ! if type(params) == ListType: ! line = cmd+" "+target+" :\01"+ctcpcmd+" "+buildanswer(params, target, msg.user.nick)+"\01" ! else: ! line = cmd+" "+target+" :\01"+ctcpcmd+" "+params+"\01" ! msg.server.sendline(line) ! if out: self.handlectcpout(msg.server,line) ! ! def mm_answermsgctcp(self, defret, msg, ctcpcmd, params, outhooks=1): ! self.mm_answerctcp(msg, "PRIVMSG", ctcpcmd, params, outhooks) ! def mm_answernotctcp(self, defret, msg, ctcpcmd, params, outhooks=1): ! self.mm_answerctcp(msg, "NOTICE", ctcpcmd, params, outhooks) def __loadmodule__(bot): ! global ctcp ! ctcp = CTCP(bot) def __unloadmodule__(bot): ! global ctcp ! ctcp.unload() ! del ctcp ! # vim:ts=4:sw=4 --- 21,110 ---- class CTCP: ! def __init__(self, bot): ! hook.register("Message", self.message, 80) ! hook.register("Notice", self.notice, 80) ! mm.register("sendctcp", self.mm_sendctcp) ! mm.register("answerctcp", self.mm_answerctcp) ! mm.register("answermsgctcp", self.mm_answermsgctcp) ! mm.register("answernotctcp", self.mm_answernotctcp) ! ! def unload(self): ! hook.unregister("Message", self.message, 80) ! hook.unregister("Notice", self.notice, 80) ! mm.unregister("sendctcp") ! mm.unregister("answerctcp") ! mm.unregister("answermsgctcp") ! mm.unregister("answernotctcp") ! ! def message(self, msg): ! var = [] ! if msg.msg[0] and msg.msg[0][0]=="\01": ! msg.ctcpcmd = msg.msg[0][1:] ! msg.msg[-1] = msg.msg[-1][:-1] ! del msg.msg[0] ! del msg.rawmsg[0] ! msg.rawmsg[-1] = msg.rawmsg[-1][:-1] ! hook.call("CTCP", msg) ! return -1 ! ! def notice(self, msg): ! var = [] ! if msg.msg and msg.msg[0][0]=="\01": ! msg.ctcpcmd = msg.msg[0][1:] ! msg.msg[-1] = msg.msg[-1][:-1] ! del msg.msg[0] ! hook.call("CTCPReply", msg) ! return -1 ! def handlectcpout(self, server, line): ! msg = message() ! msg.setline(server, line) ! hook.call("OutCommand", msg) ! msg.ctcpcmd = msg.msg[0][1:] ! msg.msg[-1] = msg.msg[-1][:-1] ! del msg.msg[0] ! msg.rawmsg[-1] = msg.rawmsg[-1][:-1] ! del msg.rawmsg[0] ! msg.user = server.user ! if msg.cmd == "PRIVMSG": ! hook.call("OutCTCP", msg) ! else: ! hook.call("OutCTCPReply", msg) ! def mm_sendctcp(self, defret, server, cmd, ctcpcmd, target, nick, params, out=1): ! if type(params) == ListType: ! line = cmd+" "+target+" :\01"+ctcpcmd+" "+buildanswer(params, target, nick)+"\01" ! else: ! line = cmd+" "+target+" :\01"+ctcpcmd+" "+params+"\01" ! server.sendline(line) ! if out: self.handlectcpout(server,line) ! def mm_answerctcp(self, defret, msg, cmd, ctcpcmd, params, outhooks=1): ! if msg.direct: ! target = msg.user.nick ! else: ! target = msg.target ! if type(params) == ListType: ! line = cmd+" "+target+" :\01"+ctcpcmd+" "+buildanswer(params, target, msg.user.nick)+"\01" ! else: ! line = cmd+" "+target+" :\01"+ctcpcmd+" "+params+"\01" ! msg.server.sendline(line) ! if out: self.handlectcpout(msg.server,line) ! ! def mm_answermsgctcp(self, defret, msg, ctcpcmd, params, outhooks=1): ! self.mm_answerctcp(msg, "PRIVMSG", ctcpcmd, params, outhooks) ! def mm_answernotctcp(self, defret, msg, ctcpcmd, params, outhooks=1): ! self.mm_answerctcp(msg, "NOTICE", ctcpcmd, params, outhooks) def __loadmodule__(bot): ! global ctcp ! ctcp = CTCP(bot) def __unloadmodule__(bot): ! global ctcp ! ctcp.unload() ! del ctcp ! # vim:ts=4:sw=4:et Index: eval.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/eval.py,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** eval.py 2001/11/02 17:20:23 1.1.1.1 --- eval.py 2001/12/04 00:57:38 1.2 *************** *** 22,86 **** class Eval: ! def __init__(self, bot): ! hooks.register("Message", self.message) ! self.dict = {} ! self.dict["__builtins__"] = {} ! self.dict.update(math.__dict__) ! del self.dict["__doc__"] ! del self.dict["__file__"] ! del self.dict["__name__"] ! self.dict["map"] = map ! self.dict["zip"] = zip ! self.dict["len"] = len ! self.dict["min"] = min ! self.dict["max"] = max ! self.dict["chr"] = chr ! self.dict["ord"] = ord ! self.dict["abs"] = abs ! self.dict["hex"] = hex ! self.dict["int"] = int ! self.dict["oct"] = oct ! self.dict["list"] = list ! self.dict["long"] = long ! self.dict["float"] = float ! self.dict["round"] = round ! self.dict["tuple"] = tuple ! self.dict["reduce"] = reduce ! self.dict["filter"] = filter ! self.dict["coerce"] = coerce ! # Match 'eval <expr>[!|.]' ! self.re1 = re.compile(r"eval\s+(?P<expr>.*?)[!.]*$") ! ! def unload(self): ! hooks.unregister("Message", self.message) ! ! def message(self, msg): ! var = [] ! if msg.forme: ! m = self.re1.match(msg.line) ! if m: ! if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "eval"): ! try: ! answer = eval(m.group("expr"), self.dict) ! except: ! msg.answer("%:", ["Can't evaluate this", "There's something wrong with this expression"], [".", "!"]) ! else: ! if len(answer) > 255: ! msg.answer("%:", "Sorry, your answer is too long...") ! else: ! msg.answer("%:", str(answer)) ! else: ! msg.answer("%:", ["Sorry...", "Oops!", "Heh!"], "You don't have this power", [".", "!"]) ! return 0 def __loadmodule__(bot): ! global _eval ! _eval = Eval(bot) def __unloadmodule__(bot): ! global _eval ! _eval.unload() ! del _eval ! # vim:ts=4:sw=4:nowrap --- 22,86 ---- class Eval: ! def __init__(self, bot): ! hooks.register("Message", self.message) ! self.dict = {} ! self.dict["__builtins__"] = {} ! self.dict.update(math.__dict__) ! del self.dict["__doc__"] ! del self.dict["__file__"] ! del self.dict["__name__"] ! self.dict["map"] = map ! self.dict["zip"] = zip ! self.dict["len"] = len ! self.dict["min"] = min ! self.dict["max"] = max ! self.dict["chr"] = chr ! self.dict["ord"] = ord ! self.dict["abs"] = abs ! self.dict["hex"] = hex ! self.dict["int"] = int ! self.dict["oct"] = oct ! self.dict["list"] = list ! self.dict["long"] = long ! self.dict["float"] = float ! self.dict["round"] = round ! self.dict["tuple"] = tuple ! self.dict["reduce"] = reduce ! self.dict["filter"] = filter ! self.dict["coerce"] = coerce ! # Match 'eval <expr>[!|.]' ! self.re1 = re.compile(r"eval\s+(?P<expr>.*?)[!.]*$") ! ! def unload(self): ! hooks.unregister("Message", self.message) ! ! def message(self, msg): ! var = [] ! if msg.forme: ! m = self.re1.match(msg.line) ! if m: ! if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "eval"): ! try: ! answer = eval(m.group("expr"), self.dict) ! except: ! msg.answer("%:", ["Can't evaluate this", "There's something wrong with this expression"], [".", "!"]) ! else: ! if len(answer) > 255: ! msg.answer("%:", "Sorry, your answer is too long...") ! else: ! msg.answer("%:", str(answer)) ! else: ! msg.answer("%:", ["Sorry...", "Oops!", "Heh!"], "You don't have this power", [".", "!"]) ! return 0 def __loadmodule__(bot): ! global _eval ! _eval = Eval(bot) def __unloadmodule__(bot): ! global _eval ! _eval.unload() ! del _eval ! # vim:ts=4:sw=4:et Index: forward.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/forward.py,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** forward.py 2001/11/02 17:20:23 1.1.1.1 --- forward.py 2001/12/04 00:57:38 1.2 *************** *** 22,159 **** class Forward: ! def __init__(self, bot): ! self.data = options.gethard("Forward.data", []) ! hooks.register("Message", self.message_forward, 90) ! hooks.register("OutMessage", self.message_forward, 90) ! hooks.register("Notice", self.notice_forward, 90) ! hooks.register("OutNotice", self.notice_forward, 90) ! hooks.register("CTCP", self.ctcp_forward, 90) ! hooks.register("OutCTCP", self.ctcp_forward, 90) ! hooks.register("UserJoined", self.joined_forward, 90) ! hooks.register("UserParted", self.parted_forward, 90) ! hooks.register("Message", self.message) ! # Match 'forward messages [[(from|on|at) server <fromserver1>] | for you | [(from|on|at) [user|channel] <fromtarget>] [(from|on|at) server <fromserver2>]] to [user|channel] <totarget> [(on|at) server <toserver>] [with (server|channel [and server]|<withstring>)] [!|.]' ! self.re1 = re.compile(r"(?P<dont>do\s+not\s+|don't\s+)?forward\s+messages\s+(?:(?:(?:from\s+|on\s+|at\s+)server\s+(?P<fromserver1>\S+)\s+)|(?:(?P<foryou>for\s+you\s+)?(?:(?:from\s+|on\s+|at\s+)(?:channel\s+|user\s+)?(?P<fromtarget>\S+)\s+)?(?:(?:from\s+|on\s+|at\s+)(?:server\s+)?(?P<fromserver2>\S+)\s+)?))?to\s+(?:user\s+|channel\s+)?(?P<totarget>\S+)(?:\s+(?:on\s+|at\s+)server\s+(?P<toserver>\S+))?(?:\s+with(?:(?P<withserver1>\s+server)|(?P<withchannel>\s+channel)(?:\s+and\s+(?P<withserver2>server))?|(?P<withstring>\S+)))?\s*[!.]*$", re.I) ! # Match 'what['re| are] you forwarding [?]' ! self.re2 = re.compile(r"what(?:'re|\s+are)\s+you\s+forwarding\s*\?*$", re.I) ! ! def unload(self): ! hooks.unregister("Message", self.message_forward, 90) ! hooks.unregister("OutMessage", self.message_forward, 90) ! hooks.unregister("Notice", self.notice_forward, 90) ! hooks.unregister("OutNotice", self.notice_forward, 90) ! hooks.unregister("CTCP", self.ctcp_forward, 90) ! hooks.unregister("OutCTCP", self.ctcp_forward, 90) ! hooks.unregister("UserJoined", self.joined_forward, 90) ! hooks.unregister("UserParted", self.parted_forward, 90) ! hooks.unregister("Message", self.message) ! ! def do_forward(self, server, target, nick, forme, before, after): ! for tuple in self.data: ! if (tuple[0]==None or tuple[0]==server.servername) and \ ! (tuple[1]==None or tuple[1]==target) and \ ! (not tuple[2] or forme): ! fwdserver = servers.get(tuple[3]) ! if fwdserver: ! s = nick ! if tuple[6]: ! s = s+"@"+tuple[6] ! else: ! with = tuple[5] ! if with&1: ! s = s+"@"+target ! if with&2: ! s = s+","+server.servername ! elif with&2: ! s = s+"@"+server.servername ! fwdserver.sendmsg(tuple[4], None, before+s+after, outhooks=0) ! ! def message_forward(self, msg): ! self.do_forward(msg.server, msg.target, msg.user.nick, msg.forme, "<", "> "+msg.rawline) ! ! def notice_forward(self, msg): ! self.do_forward(msg.server, msg.target, msg.user.nick, msg.forme, "-", "- "+msg.rawline) ! ! def ctcp_forward(self, msg): ! if msg.ctcp == "ACTION": ! self.do_forward(msg.server, msg.target, msg.user.nick, msg.forme, "* ", " "+msg.rawline) ! ! def joined_forward(self, server, target, user): ! self.do_forward(server, target, user.nick, 0, "--> ", " has joined") ! def parted_forward(self, server, target, user, reason): ! if reason: ! self.do_forward(server, target, user.nick, 0, "--> ", " has leaved: "+reason) ! else: ! self.do_forward(server, target, user.nick, 0, "--> ", " has leaved") ! ! def message(self, msg): ! var = [] ! if msg.forme: ! m = self.re1.match(msg.line) ! if m: ! if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "forward"): ! foryou = m.group("foryou") != None ! fromtarget = m.group("fromtarget") ! fromserver = m.group("fromserver1") or m.group("fromserver2") ! totarget = m.group("totarget") ! toserver = m.group("toserver") or msg.server.servername ! with = 0 ! if m.group("withchannel"): ! with = with|1 ! if m.group("withserver1") or m.group("withserver2"): ! with = with|2 ! withstring = m.group("withstring") ! if m.group("dont"): ! try: ! self.data.remove((fromserver, fromtarget, foryou, toserver, totarget, with, withstring)) ! msg.answer("%:", ["Sure", "I'll not forward", "Of course", "No problems"], ["!", "."]) ! except ValueError: ! msg.answer("%:", ["Sorry, but", "Oops! I think", None], "I'm not forwarding any messages like this", [".", "!"]) ! else: ! self.data.append((fromserver, fromtarget, foryou, toserver, totarget, with, withstring)) ! msg.answer("%:", ["Sure", "I'll forward", "Right now", "Of course"], ["!", "."]) ! return 0 ! ! m = self.re2.match(msg.line) ! if m: ! if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "listforward"): ! if self.data: ! for tuple in self.data: ! str = "I'm forwarding messages" ! if tuple[2]: ! str = str+" for me" ! if tuple[0] and tuple[1] and tuple[1] != msg.server.servername: ! str = str+" from "+tuple[1]+" at "+tuple[0] ! elif tuple[1]: ! str = str+" from "+tuple[1] ! elif tuple[0]: ! str = str+" from server "+tuple[0] ! str = str+" to "+tuple[4] ! if tuple[3] and tuple[3] != msg.server.servername: ! str = str+" at "+tuple[3] ! if tuple[5]==3: ! str = str+" with channel and server" ! elif tuple[5]&1: ! str = str+" with channel" ! elif tuple[5]&2: ! str = str+" with server" ! elif tuple[6]: ! str = str+" with "+tuple[6] ! msg.answer("%:", str, [".", "!"]) ! else: ! msg.answer("%:", ["Sir,", None], "I'm not forwarding anything", ["!", "."]) ! return 0 ! def __loadmodule__(bot): ! global forward ! forward = Forward(bot) def __unloadmodule__(bot): ! global forward ! forward.unload() ! del forward ! # vim:ts=4:sw=4 --- 22,159 ---- class Forward: ! def __init__(self, bot): ! self.data = options.gethard("Forward.data", []) ! hooks.register("Message", self.message_forward, 90) ! hooks.register("OutMessage", self.message_forward, 90) ! hooks.register("Notice", self.notice_forward, 90) ! hooks.register("OutNotice", self.notice_forward, 90) ! hooks.register("CTCP", self.ctcp_forward, 90) ! hooks.register("OutCTCP", self.ctcp_forward, 90) ! hooks.register("UserJoined", self.joined_forward, 90) ! hooks.register("UserParted", self.parted_forward, 90) ! hooks.register("Message", self.message) ! # Match 'forward messages [[(from|on|at) server <fromserver1>] | for you | [(from|on|at) [user|channel] <fromtarget>] [(from|on|at) server <fromserver2>]] to [user|channel] <totarget> [(on|at) server <toserver>] [with (server|channel [and server]|<withstring>)] [!|.]' ! self.re1 = re.compile(r"(?P<dont>do\s+not\s+|don't\s+)?forward\s+messages\s+(?:(?:(?:from\s+|on\s+|at\s+)server\s+(?P<fromserver1>\S+)\s+)|(?:(?P<foryou>for\s+you\s+)?(?:(?:from\s+|on\s+|at\s+)(?:channel\s+|user\s+)?(?P<fromtarget>\S+)\s+)?(?:(?:from\s+|on\s+|at\s+)(?:server\s+)?(?P<fromserver2>\S+)\s+)?))?to\s+(?:user\s+|channel\s+)?(?P<totarget>\S+)(?:\s+(?:on\s+|at\s+)server\s+(?P<toserver>\S+))?(?:\s+with(?:(?P<withserver1>\s+server)|(?P<withchannel>\s+channel)(?:\s+and\s+(?P<withserver2>server))?|(?P<withstring>\S+)))?\s*[!.]*$", re.I) ! # Match 'what['re| are] you forwarding [?]' ! self.re2 = re.compile(r"what(?:'re|\s+are)\s+you\s+forwarding\s*\?*$", re.I) ! ! def unload(self): ! hooks.unregister("Message", self.message_forward, 90) ! hooks.unregister("OutMessage", self.message_forward, 90) ! hooks.unregister("Notice", self.notice_forward, 90) ! hooks.unregister("OutNotice", self.notice_forward, 90) ! hooks.unregister("CTCP", self.ctcp_forward, 90) ! hooks.unregister("OutCTCP", self.ctcp_forward, 90) ! hooks.unregister("UserJoined", self.joined_forward, 90) ! hooks.unregister("UserParted", self.parted_forward, 90) ! hooks.unregister("Message", self.message) ! ! def do_forward(self, server, target, nick, forme, before, after): ! for tuple in self.data: ! if (tuple[0]==None or tuple[0]==server.servername) and \ ! (tuple[1]==None or tuple[1]==target) and \ ! (not tuple[2] or forme): ! fwdserver = servers.get(tuple[3]) ! if fwdserver: ! s = nick ! if tuple[6]: ! s = s+"@"+tuple[6] ! else: ! with = tuple[5] ! if with&1: ! s = s+"@"+target ! if with&2: ! s = s+","+server.servername ! elif with&2: ! s = s+"@"+server.servername ! fwdserver.sendmsg(tuple[4], None, before+s+after, outhooks=0) ! ! def message_forward(self, msg): ! self.do_forward(msg.server, msg.target, msg.user.nick, msg.forme, "<", "> "+msg.rawline) ! ! def notice_forward(self, msg): ! self.do_forward(msg.server, msg.target, msg.user.nick, msg.forme, "-", "- "+msg.rawline) ! ! def ctcp_forward(self, msg): ! if msg.ctcp == "ACTION": ! self.do_forward(msg.server, msg.target, msg.user.nick, msg.forme, "* ", " "+msg.rawline) ! ! def joined_forward(self, server, target, user): ! self.do_forward(server, target, user.nick, 0, "--> ", " has joined") ! def parted_forward(self, server, target, user, reason): ! if reason: ! self.do_forward(server, target, user.nick, 0, "--> ", " has leaved: "+reason) ! else: ! self.do_forward(server, target, user.nick, 0, "--> ", " has leaved") ! ! def message(self, msg): ! var = [] ! if msg.forme: ! m = self.re1.match(msg.line) ! if m: ! if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "forward"): ! foryou = m.group("foryou") != None ! fromtarget = m.group("fromtarget") ! fromserver = m.group("fromserver1") or m.group("fromserver2") ! totarget = m.group("totarget") ! toserver = m.group("toserver") or msg.server.servername ! with = 0 ! if m.group("withchannel"): ! with = with|1 ! if m.group("withserver1") or m.group("withserver2"): ! with = with|2 ! withstring = m.group("withstring") ! if m.group("dont"): ! try: ! self.data.remove((fromserver, fromtarget, foryou, toserver, totarget, with, withstring)) ! msg.answer("%:", ["Sure", "I'll not forward", "Of course", "No problems"], ["!", "."]) ! except ValueError: ! msg.answer("%:", ["Sorry, but", "Oops! I think", None], "I'm not forwarding any messages like this", [".", "!"]) ! else: ! self.data.append((fromserver, fromtarget, foryou, toserver, totarget, with, withstring)) ! msg.answer("%:", ["Sure", "I'll forward", "Right now", "Of course"], ["!", "."]) ! return 0 ! ! m = self.re2.match(msg.line) ! if m: ! if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "listforward"): ! if self.data: ! for tuple in self.data: ! str = "I'm forwarding messages" ! if tuple[2]: ! str = str+" for me" ! if tuple[0] and tuple[1] and tuple[1] != msg.server.servername: ! str = str+" from "+tuple[1]+" at "+tuple[0] ! elif tuple[1]: ! str = str+" from "+tuple[1] ! elif tuple[0]: ! str = str+" from server "+tuple[0] ! str = str+" to "+tuple[4] ! if tuple[3] and tuple[3] != msg.server.servername: ! str = str+" at "+tuple[3] ! if tuple[5]==3: ! str = str+" with channel and server" ! elif tuple[5]&1: ! str = str+" with channel" ! elif tuple[5]&2: ! str = str+" with server" ! elif tuple[6]: ! str = str+" with "+tuple[6] ! msg.answer("%:", str, [".", "!"]) ! else: ! msg.answer("%:", ["Sir,", None], "I'm not forwarding anything", ["!", "."]) ! return 0 ! def __loadmodule__(bot): ! global forward ! forward = Forward(bot) def __unloadmodule__(bot): ! global forward ! forward.unload() ! del forward ! # vim:ts=4:sw=4:et Index: freshmeat.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/freshmeat.py,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** freshmeat.py 2001/11/02 17:20:22 1.1.1.1 --- freshmeat.py 2001/12/04 00:57:38 1.2 *************** *** 28,131 **** class Freshmeat: ! def __init__(self, bot): ! self.newslast = options.gethard("Freshmeat.newslast", [None]) ! self.newstargets = options.gethard("Freshmeat.newstargets", []) ! self.newstargets_lock = thread.allocate_lock() ! self.fetch_lock = thread.allocate_lock() ! hooks.register("Message", self.message) ! mm.hooktimer(0, FETCHINTERVAL*60, self.checknews, ()) ! ! # Match '[don[']t|do not] show freshmeat news (to|on|at|for) [channel|user] <target> [[on|at] server <server>] [!|.]' ! self.re1 = re.compile(r"(?P<dont>don'?t\s+|do\s+not\s+)?show\s+freshmeat\s+news(?:(?:to|on|at|for)(?:\s+channel|\s+user)?\s+(?P<target>\S+)(?:(?:\s+on|\s+at)?\s+server\s+(?P<server>\S+?))?)?\s*[!.]*$", re.I) ! ! def unload(self): ! hooks.unregister("Message", self.message) ! mm.unhooktimer(0, FETCHINTERVAL*60, self.checknews, ()) ! ! def shownews(self, newslist): ! first = 1 ! newsmsg = "" ! for news in newslist: ! if not first: ! newsmsg = newsmsg+", " ! else: ! first = 0 ! newsmsg = newsmsg+news[0] ! self.newstargets_lock.acquire() ! for target in self.newstargets: ! server = servers.get(target[0]) ! if server: ! server.sendmsg(target[1], None, "Freshmeat news:", newsmsg, notice=1) ! self.newstargets_lock.release() ! ! def fetchnews(self): ! urlopener = urllib.URLopener() ! urlopener.proxies.update(PROXY) ! try: ! url = urlopener.open(URL) ! except: ! pass ! else: ! newslist = [] ! while 1: ! news_name = string.rstrip(url.readline()) ! news_time = string.rstrip(url.readline()) ! news_url = string.rstrip(url.readline()) ! defstr = ' (Default)' ! defstrlen = len(defstr) ! if news_name[-defstrlen:] == defstr: ! news_name = news_name[:-defstrlen] ! news_tuple = (news_name, news_time, news_url) ! if not (news_name and news_time and news_url) or news_tuple == self.newslast[0]: ! break ! newslist.append(news_tuple) ! url.close() ! if newslist: ! self.newslast[0] = newslist[0] ! newslist.reverse() ! self.shownews(newslist) ! self.fetch_lock.release() ! ! def checknews(self): ! if self.newstargets and self.fetch_lock.acquire(0): ! thread.start_new_thread(self.fetchnews, ()) ! ! def message(self, msg): ! if msg.forme: ! m = self.re1.match(msg.line) ! if m: ! if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "freshmeatnews"): ! target = m.group("target") or msg.target ! servername = m.group("server") or msg.server.servername ! tuple = (servername, target) ! if not m.group("dont"): ! try: ! self.newstargets.index(tuple) ! except ValueError: ! self.newstargets.append(tuple) ! msg.answer("%:", ["Sure", "I'll show", "Of course"], ["!", ", sir!"]) ! else: ! msg.answer("%:", ["Oops!", "Sorry!", "Nope."], "I'm already showing news for this target", ["!", "."]) ! else: ! self.newstargets_lock.acquire() ! try: ! self.newstargets.remove(tuple) ! except ValueError: ! msg.answer("%:", ["Oops!", "Sorry!", "Nope."], "I'm not showing news for this target", ["!", "."]) ! else: ! msg.answer("%:", ["Sure", "I won't show", "Of course"], ["!", "."]) ! self.newstargets_lock.release() ! else: ! msg.answer("%:", ["You can't", "You're not allowed to", "You're not good enough to"], ["do this", "You can't change freshmeat news settings"], ["!", "."]) ! return 0 ! def __loadmodule__(bot): ! global freshmeat ! freshmeat = Freshmeat(bot) def __unloadmodule__(bot): ! global freshmeat ! freshmeat.unload() ! del freshmeat ! # vim:ts=4:sw=4 --- 28,131 ---- class Freshmeat: ! def __init__(self, bot): ! self.newslast = options.gethard("Freshmeat.newslast", [None]) ! self.newstargets = options.gethard("Freshmeat.newstargets", []) ! self.newstargets_lock = thread.allocate_lock() ! self.fetch_lock = thread.allocate_lock() ! hooks.register("Message", self.message) ! mm.hooktimer(0, FETCHINTERVAL*60, self.checknews, ()) ! ! # Match '[don[']t|do not] show freshmeat news (to|on|at|for) [channel|user] <target> [[on|at] server <server>] [!|.]' ! self.re1 = re.compile(r"(?P<dont>don'?t\s+|do\s+not\s+)?show\s+freshmeat\s+news(?:(?:to|on|at|for)(?:\s+channel|\s+user)?\s+(?P<target>\S+)(?:(?:\s+on|\s+at)?\s+server\s+(?P<server>\S+?))?)?\s*[!.]*$", re.I) ! ! def unload(self): ! hooks.unregister("Message", self.message) ! mm.unhooktimer(0, FETCHINTERVAL*60, self.checknews, ()) ! ! def shownews(self, newslist): ! first = 1 ! newsmsg = "" ! for news in newslist: ! if not first: ! newsmsg = newsmsg+", " ! else: ! first = 0 ! newsmsg = newsmsg+news[0] ! self.newstargets_lock.acquire() ! for target in self.newstargets: ! server = servers.get(target[0]) ! if server: ! server.sendmsg(target[1], None, "Freshmeat news:", newsmsg, notice=1) ! self.newstargets_lock.release() ! ! def fetchnews(self): ! urlopener = urllib.URLopener() ! urlopener.proxies.update(PROXY) ! try: ! url = urlopener.open(URL) ! except: ! pass ! else: ! newslist = [] ! while 1: ! news_name = string.rstrip(url.readline()) ! news_time = string.rstrip(url.readline()) ! news_url = string.rstrip(url.readline()) ! defstr = ' (Default)' ! defstrlen = len(defstr) ! if news_name[-defstrlen:] == defstr: ! news_name = news_name[:-defstrlen] ! news_tuple = (news_name, news_time, news_url) ! if not (news_name and news_time and news_url) or news_tuple == self.newslast[0]: ! break ! newslist.append(news_tuple) ! url.close() ! if newslist: ! self.newslast[0] = newslist[0] ! newslist.reverse() ! self.shownews(newslist) ! self.fetch_lock.release() ! ! def checknews(self): ! if self.newstargets and self.fetch_lock.acquire(0): ! thread.start_new_thread(self.fetchnews, ()) ! ! def message(self, msg): ! if msg.forme: ! m = self.re1.match(msg.line) ! if m: ! if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "freshmeatnews"): ! target = m.group("target") or msg.target ! servername = m.group("server") or msg.server.servername ! tuple = (servername, target) ! if not m.group("dont"): ! try: ! self.newstargets.index(tuple) ! except ValueError: ! self.newstargets.append(tuple) ! msg.answer("%:", ["Sure", "I'll show", "Of course"], ["!", ", sir!"]) ! else: ! msg.answer("%:", ["Oops!", "Sorry!", "Nope."], "I'm already showing news for this target", ["!", "."]) ! else: ! self.newstargets_lock.acquire() ! try: ! self.newstargets.remove(tuple) ! except ValueError: ! msg.answer("%:", ["Oops!", "Sorry!", "Nope."], "I'm not showing news for this target", ["!", "."]) ! else: ! msg.answer("%:", ["Sure", "I won't show", "Of course"], ["!", "."]) ! self.newstargets_lock.release() ! else: ! msg.answer("%:", ["You can't", "You're not allowed to", "You're not good enough to"], ["do this", "You can't change freshmeat news settings"], ["!", "."]) ! return 0 ! def __loadmodule__(bot): ! global freshmeat ! freshmeat = Freshmeat(bot) def __unloadmodule__(bot): ! global freshmeat ! freshmeat.unload() ! del freshmeat ! # vim:ts=4:sw=4:et Index: help.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/help.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** help.py 2001/11/14 15:28:41 1.2 --- help.py 2001/12/04 00:57:38 1.3 *************** *** 27,74 **** class Help: ! def __init__(self, bot): ! self.data = options.getsoft("Help.data", []) ! mm.register("register_help", self.mm_register_help) ! mm.register("unregister_help", self.mm_unregister_help) ! hooks.register("Message", self.message) ! ! # [show] help [about] <keyword> ! self.re1 = re.compile(r"(?:show\s+)?help(?:\s+about)?(?:\s+(?P<something>.+?))?\s*[.!]*$", re.I) ! ! def unload(self): ! hooks.unregister("Message", self.message) ! mm.unregister("register_help") ! mm.unregister("unregister_help") ! ! def message(self, msg): ! if msg.forme: ! m = self.re1.match(msg.line) ! if m: ! if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "help"): ! something = m.group("something") ! if something: ! found = 0 ! for pattern, text in self.data: ! if pattern.match(something): ! found = 1 ! for line in text: ! msg.answer("%:", *line) ! else: ! found = 1 ! for line in HELP: ! msg.answer("%:", *line) ! if not found: ! msg.answer("%:", ["No", "Sorry, no", "Sorry, but there's no"], "help about that", [".", "!"]) ! else: ! msg.answer("%:", ["Sorry, you", "You"], ["can't", "are not allowed to"], "ask for help", [".", "!"]) ! return 0 ! ! def mm_register_help(self, defret, pattern, text): ! self.data.append((re.compile(pattern, re.I), text)) ! def mm_unregister_help(self, defret, text): ! for i in range(len(self.data)-1,-1,-1): ! if self.data[i][1] == text: ! del self.data[i] --- 27,74 ---- class Help: ! def __init__(self, bot): ! self.data = options.getsoft("Help.data", []) ! mm.register("register_help", self.mm_register_help) ! mm.register("unregister_help", self.mm_unregister_help) ! hooks.register("Message", self.message) ! ! # [show] help [about] <keyword> ! self.re1 = re.compile(r"(?:show\s+)?help(?:\s+about)?(?:\s+(?P<something>.+?))?\s*[.!]*$", re.I) ! ! def unload(self): ! hooks.unregister("Message", self.message) ! mm.unregister("register_help") ! mm.unregister("unregister_help") ! ! def message(self, msg): ! if msg.forme: ! m = self.re1.match(msg.line) ! if m: ! if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "help"): ! something = m.group("something") ! if something: ! found = 0 ! for pattern, text in self.data: ! if pattern.match(something): ! found = 1 ! for line in text: ! msg.answer("%:", *line) ! else: ! found = 1 ! for line in HELP: ! msg.answer("%:", *line) ! if not found: ! msg.answer("%:", ["No", "Sorry, no", "Sorry, but there's no"], "help about that", [".", "!"]) ! else: ! msg.answer("%:", ["Sorry, you", "You"], ["can't", "are not allowed to"], "ask for help", [".", "!"]) ! return 0 ! ! def mm_register_help(self, defret, pattern, text): ! self.data.append((re.compile(pattern, re.I), text)) ! def mm_unregister_help(self, defret, text): ! for i in range(len(self.data)-1,-1,-1): ! if self.data[i][1] == text: ! del self.data[i] *************** *** 79,89 **** def __loadmodule__(bot): ! global help ! help = Help(bot) def __unloadmodule__(bot): ! global help ! help.unload() ! del help ! # vim:ts=4:sw=4:nowrap --- 79,89 ---- def __loadmodule__(bot): ! global help ! help = Help(bot) def __unloadmodule__(bot): ! global help ! help.unload() ! del help ! # vim:ts=4:sw=4:et Index: ignore.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/ignore.py,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** ignore.py 2001/11/02 17:20:24 1.1.1.1 --- ignore.py 2001/12/04 00:57:38 1.2 *************** *** 21,111 **** class Ignore: ! def __init__(self, bot): ! self.ignoredata = options.gethard("Ignore.ignore", []) ! hooks.register("Message", self.message_ignore, 100) ! hooks.register("Message", self.message) ! ! def unload(self): ! hooks.unregister("Message", self.message_ignore, 100) ! hooks.unregister("Message", self.message) ! def message_ignore(self, msg): ! if self.isignored(msg.server.servername, msg.target, msg.user) and \ ! not mm.hasperm(0, msg.server.servername, msg.target, msg.user, None): ! return -1 ! def message(self, msg): ! var = [] ! if msg.match(var, 5, "%", "ignore", [("user", 0, "~"), None], [(["on", "at", None], [(1, "~this", "channel"), ("channel", 2, "^[#&+!][^,^G]+$")]), None], [(["on", "at", None], [(3, "~this", "server"), ("server", 4, "~")]), None], ["!", ".", None]): ! if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "ignore"): ! if var[0] or var[1] or var[2] or var[3] or var[4]: ! if var[1]: ! channel = msg.target ! server = msg.server.servername ! else: ! channel = var[2] ! if var[3]: ! server = msg.server.servername ! else: ! server = var[4] ! if var[0]: ! user = User() ! user.setstring(var[0]) ! else: ! user = None ! self.ignore(server,channel,user) ! msg.answer("%:", ["Done!", "Ignored!", "No problems, sir!", "Ok, sir!"]) ! else: ! msg.answer("%:", ["Sorry, you", "Sir, you", "You"], ["can't ignore.", "don't have this power."]) ! return 0 ! if msg.match(var, 5, "%", "don't", "ignore", [("user", 0, "~"), None], [(["on", "at", None], [(1, "~this", "channel"), ("channel", 2, "^[#&+!][^,^G]+$")]), None], [(["on", "at", None], [(3, "~this", "server"), ("server", 4, "~")]), None], ["!", ".", None]): ! if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "ignore"): ! if var[0] or var[1] or var[2] or var[3] or var[4]: ! if var[1]: ! channel = msg.target ! server = msg.server.servername ! else: ! channel = var[2] ! if var[3]: ! server = msg.server.servername ! else: ! server = var[4] ! if var[0]: ! user = User() ! user.setstring(var[0]) ! else: ! user = None ! self.dontignore(server,channel,user) ! msg.answer("%:", ["Done, sir!", "No problems!", "Ok!", "Right now!", "Right now, sir!"]) ! else: ! msg.answer("%:", ["Sorry, you", "Sir, you", "You"], "don't have this power.") ! return 0 ! def ignore(self, server, channel, user): ! self.ignoredata.append((server,channel,user)) ! ! def dontignore(self, server, channel, user): ! for tup in self.ignoredata: ! if (tup[0] == None or tup[0] == server) and \ ! (tup[1] == None or tup[1] == channel) and \ ! (tup[2] == None or user.match(tup[2].nick, tup[2].username, tup[2].host)): ! self.ignoredata.remove(tup) ! return 1 ! ! def isignored(self, server, channel, user): ! for tup in self.ignoredata: ! if (tup[0] == None or tup[0] == server) and \ ! (tup[1] == None or tup[1] == channel) and \ ! (tup[2] == None or user.match(tup[2].nick, tup[2].username, tup[2].host)): ! return 1 def __loadmodule__(bot): ! global ignore ! ignore = Ignore(bot) def __unloadmodule__(bot): ! global ignore ! ignore.unload() ! del ignore ! # vim:ts=4:sw=4 --- 21,111 ---- class Ignore: ! def __init__(self, bot): ! self.ignoredata = options.gethard("Ignore.ignore", []) ! hooks.register("Message", self.message_ignore, 100) ! hooks.register("Message", self.message) ! ! def unload(self): ! hooks.unregister("Message", self.message_ignore, 100) ! hooks.unregister("Message", self.message) ! def message_ignore(self, msg): ! if self.isignored(msg.server.servername, msg.target, msg.user) and \ ! not mm.hasperm(0, msg.server.servername, msg.target, msg.user, None): ! return -1 ! def message(self, msg): ! var = [] ! if msg.match(var, 5, "%", "ignore", [("user", 0, "~"), None], [(["on", "at", None], [(1, "~this", "channel"), ("channel", 2, "^[#&+!][^,^G]+$")]), None], [(["on", "at", None], [(3, "~this", "server"), ("server", 4, "~")]), None], ["!", ".", None]): ! if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "ignore"): ! if var[0] or var[1] or var[2] or var[3] or var[4]: ! if var[1]: ! channel = msg.target ! server = msg.server.servername ! else: ! channel = var[2] ! if var[3]: ! server = msg.server.servername ! else: ! server = var[4] ! if var[0]: ! user = User() ! user.setstring(var[0]) ! else: ! user = None ! self.ignore(server,channel,user) ! msg.answer("%:", ["Done!", "Ignored!", "No problems, sir!", "Ok, sir!"]) ! else: ! msg.answer("%:", ["Sorry, you", "Sir, you", "You"], ["can't ignore.", "don't have this power."]) ! return 0 ! if msg.match(var, 5, "%", "don't", "ignore", [("user", 0, "~"), None], [(["on", "at", None], [(1, "~this", "channel"), ("channel", 2, "^[#&+!][^,^G]+$")]), None], [(["on", "at", None], [(3, "~this", "server"), ("server", 4, "~")]), None], ["!", ".", None]): ! if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "ignore"): ! if var[0] or var[1] or var[2] or var[3] or var[4]: ! if var[1]: ! channel = msg.target ! server = msg.server.servername ! else: ! channel = var[2] ! if var[3]: ! server = msg.server.servername ! else: ! server = var[4] ! if var[0]: ! user = User() ! user.setstring(var[0]) ! else: ! user = None ! self.dontignore(server,channel,user) ! msg.answer("%:", ["Done, sir!", "No problems!", "Ok!", "Right now!", "Right now, sir!"]) ! else: ! msg.answer("%:", ["Sorry, you", "Sir, you", "You"], "don't have this power.") ! return 0 ! def ignore(self, server, channel, user): ! self.ignoredata.append((server,channel,user)) ! ! def dontignore(self, server, channel, user): ! for tup in self.ignoredata: ! if (tup[0] == None or tup[0] == server) and \ ! (tup[1] == None or tup[1] == channel) and \ ! (tup[2] == None or user.match(tup[2].nick, tup[2].username, tup[2].host)): ! self.ignoredata.remove(tup) ! return 1 ! ! def isignored(self, server, channel, user): ! for tup in self.ignoredata: ! if (tup[0] == None or tup[0] == server) and \ ! (tup[1] == None or tup[1] == channel) and \ ! (tup[2] == None or user.match(tup[2].nick, tup[2].username, tup[2].host)): ! return 1 def __loadmodule__(bot): ! global ignore ! ignore = Ignore(bot) def __unloadmodule__(bot): ! global ignore ! ignore.unload() ! del ignore ! # vim:ts=4:sw=4:et Index: infopack.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/infopack.py,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** infopack.py 2001/11/02 17:20:24 1.1.1.1 --- infopack.py 2001/12/04 00:57:38 1.2 *************** *** 23,254 **** class Info: ! def __init__(self, phrase="", action=0, notice=0, tonick=0): ! self.phrase = phrase ! self.action = action ! self.notice = notice ! self.tonick = tonick class Infopack: ! def __init__(self, filename): ! self.__filename = filename ! self.__info = {} ! self.__triggers = [] ! self.__masks = [] ! self.__defaults = [] ! ! def load(self): ! self.__info = {} ! self.__triggers = [] ! self.__masks = [] ! values = [] ! file = open(self.__filename) ! for line in file.xreadlines(): ! if line and line[0] != "#": ! if line[0] == "K": ! if values != []: ! values = [] ! self.__info[line[2:].rstrip()] = values ! elif line[0] == "V": ! value = line[2:].split(":", 1) ! value[1] = value[1].rstrip() ! values.append(value) ! elif line[0] == "T": ! pattern = re.compile(line[2:].rstrip()) ! self.__triggers.append(pattern) ! elif line[0] == "M": ! self.__masks.append(line[2:].rstrip()) ! elif line[0] == "D": ! value = line[2:].split(":", 1) ! value[1] = value[1].rstrip() ! self.__defaults.append(value) ! file.close() ! ! def loadcore(self): ! self.__info = {} ! self.__triggers = [] ! self.__masks = [] ! values = [] ! file = open(self.__filename) ! for line in file.xreadlines(): ! if line and line[0] != "#": ! if line[0] == "T": ! pattern = re.compile(line[2:].rstrip()) ! self.__triggers.append(pattern) ! elif line[0] == "M": ! self.__masks.append(line[2:].rstrip()) ! elif line[0] == "D": ! value = line[2:].split(":", 1) ! value[1] = value[1].rstrip() ! self.__defaults.append(value) ! else: ! break ! file.close() ! ! def unload(self): ! self.__info = {} ! self.__triggers = [] ! self.__phrases = [] ! ! def reload(self): ! hasinfo = self.__info != {} ! self.unload() ! if hasinfo: ! self.load() ! else: ! self.loadcore() ! ! def getinfo(self, findkey): ! values = [] ! found = 0 ! file = open(self.__filename) ! for line in file.xreadlines(): ! if line and line[0] != "#": ! if not found: ! if line[0] == "K": ! key = line[2:].rstrip() ! if key == findkey: ! found = 1 ! foundvalue = 0 ! else: ! if line[0] == "V": ! foundvalue = 1 ! value = line[2:].split(":", 1) ! value[1] = value[1].rstrip() ! values.append(value) ! elif foundvalue: ! break ! file.close() ! return values ! ! ! def get(self, line): ! for trigger in self.__triggers: ! m = trigger.match(line) ! if m: ! key = m.group(1).lower() ! if self.__info: ! values = self.__info.get(key) ! else: ! values = self.getinfo(key) ! if values: ! value = values[randrange(len(values))] ! elif self.__defaults: ! value = self.__defaults[randrange(len(self.__defaults))] ! else: ! break ! flags = value[0] ! info = Info() ! info.action = "a" in flags ! info.notice = "n" in flags ! info.tonick = "t" in flags ! if "m" in flags: ! mask = self.__masks[randrange(len(self.__masks))] ! info.phrase = mask%value[1] ! else: ! info.phrase = value[1] ! return info class InfopackModule: ! def __init__(self): ! self.loadpacks = options.gethard("Infopack.loadpacks", []) ! self.packs = {} ! hooks.register("Message", self.message) ! # Load infopacks ! for (name, inmemory) in self.loadpacks: ! infopackdir = config.get("infopack", "infopackdir") ! packname = "%s/%s.info" % (infopackdir, name) ! if os.path.isfile(packname): ! pack = Infopack(packname) ! self.packs[name] = pack ! if inmemory: ! pack.load() ! else: ! pack.loadcore() ! ! # Match '[load|reload|unload] infopack <name> [in memory] [.|!]' ! self.re1 = re.compile(r"(?P<action>re|un)?load\s+infopack\s+(?P<name>\w+)(?P<inmemory>\s+in\s+memory)?\s*[.!]*$", re.I) ! # Match 'show infopacks' ! self.re2 = re.compile(r"show\s+infopacks\s*[!.]*$", re.I) ! ! def unload(self): ! hooks.unregister("Message", self.message) ! ! def message(self, msg): ! if msg.forme: ! m = self.re1.match(msg.line) ! if m: ! if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "infopackadmin"): ! name = m.group("name") ! action = m.group("action") ! infopackdir = config.get("infopack", "infopackdir") ! packname = "%s/%s.info" % (infopackdir, name) ! if not action: ! # Load infopack ! if self.packs.has_key(name): ! msg.answer("%:", ["Oops!", "Sorry!"], "This infopack is already loaded", [".", "!"]) ! else: ! if os.path.isfile(packname): ! inmemory = m.group("inmemory") ! pack = Infopack(packname) ! self.packs[name] = pack ! self.loadpacks.append((name, inmemory)) ! if inmemory: ! pack.load() ! else: ! pack.loadcore() ! msg.answer("%:", ["Loaded", "Done", "Ok"], [".", "!"]) ! else: ! msg.answer("%:", ["Infopack not found", "I can't find this infopack"], [".", "!"]) ! elif action == "re": ! # Reload infopack ! if not self.packs.has_key(name): ! msg.answer("%:", ["Oops!", "Sorry!"], "This infopack is not loaded", [".", "!"]) ! else: ! if os.path.isfile(packname): ! self.packs[name].reload() ! msg.answer("%:", ["Reloaded", "Done", "Ok"], [".", "!"]) ! else: ! ... [truncated message content] |
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] |
From: Gustavo N. <nie...@us...> - 2001-12-04 00:57:41
|
Update of /cvsroot/pybot/pybot/pybot/util In directory usw-pr-cvs1:/tmp/cvs-serv32496/pybot/util Modified Files: SOAP.py Log Message: - Implemented new startup system. - Converted tabs to spaces so people using other editors feel confortable as well (suggested by John Thingstad). Index: SOAP.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/util/SOAP.py,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** SOAP.py 2001/11/02 17:20:36 1.1.1.1 --- SOAP.py 2001/12/04 00:57:38 1.2 *************** *** 3968,3969 **** --- 3968,3971 ---- self.registerFunction(MethodSig(function,keywords=1), namespace, funcName) + + # vim:ts=4:sw=4:et |