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
|