[Pybot-commits] CVS: pybot/pybot/modules __init__.py,1.1.1.1,1.2 appwatch.py,1.1.1.1,1.2 ctcp.py,1.1
Brought to you by:
niemeyer
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] |