pybot-commits Mailing List for pybot (Page 6)
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...> - 2003-05-09 21:33:56
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory sc8-pr-cvs1:/tmp/cvs-serv22471/pybot/modules Modified Files: pong.py Log Message: Do not ping the console! Index: pong.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/pong.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** pong.py 9 May 2002 15:55:41 -0000 1.3 --- pong.py 9 May 2003 21:33:53 -0000 1.4 *************** *** 34,38 **** def ping(self): for server in servers.getall(): ! server.sendcmd("", "PING", server.user.nick) def __loadmodule__(bot): --- 34,39 ---- def ping(self): for server in servers.getall(): ! if server.servername != "console": ! server.sendcmd("", "PING", server.user.nick) def __loadmodule__(bot): |
From: Gustavo N. <nie...@us...> - 2003-05-09 21:32:09
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory sc8-pr-cvs1:/tmp/cvs-serv20181/pybot/modules Modified Files: freshmeat.py help.py infopack.py log.py messages.py modulecontrol.py options.py permission.py plock.py repeat.py social.py testadora.py uptime.py userdata.py xmlrpc.py Log Message: Added new triggers option in register_help(). Now the "help" command alone also shows items the user can ask for help on. Index: freshmeat.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/freshmeat.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** freshmeat.py 9 May 2003 15:27:44 -0000 1.6 --- freshmeat.py 9 May 2003 21:32:06 -0000 1.7 *************** *** 48,53 **** 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): --- 48,53 ---- 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) ! # freshmeat [news] ! mm.register_help(0, "freshmeat(?:\s+news)?", HELP, "freshmeat") def unload(self): Index: help.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/help.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** help.py 4 Dec 2001 00:57:38 -0000 1.3 --- help.py 9 May 2003 21:32:06 -0000 1.4 *************** *** 18,21 **** --- 18,22 ---- from pybot import hooks, mm, options + from types import ListType import re *************** *** 29,32 **** --- 30,34 ---- def __init__(self, bot): self.data = options.getsoft("Help.data", []) + self.triggers = options.getsoft("Help.triggers", {}) mm.register("register_help", self.mm_register_help) mm.register("unregister_help", self.mm_unregister_help) *************** *** 49,53 **** if something: found = 0 ! for pattern, text in self.data: if pattern.match(something): found = 1 --- 51,55 ---- if something: found = 0 ! for pattern, text, triggers in self.data: if pattern.match(something): found = 1 *************** *** 58,61 **** --- 60,71 ---- for line in HELP: msg.answer("%:", *line) + alltriggers = [] + for pattern, text, triggers in self.data: + alltriggers.extend(triggers) + if alltriggers: + alltriggers.sort() + s = "At least the following help items are known: " + s += ", ".join(alltriggers) + msg.answer("%:", s) if not found: msg.answer("%:", ["No", "Sorry, no", "Sorry, but there's no"], "help about that", [".", "!"]) *************** *** 63,69 **** 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): --- 73,83 ---- msg.answer("%:", ["Sorry, you", "You"], ["can't", "are not allowed to"], "ask for help", [".", "!"]) return 0 ! ! def mm_register_help(self, defret, pattern, text, triggers=None): ! if not triggers: ! triggers = [] ! elif type(triggers) is not ListType: ! triggers = [triggers] ! self.data.append((re.compile(pattern, re.I), text, triggers)) def mm_unregister_help(self, defret, text): *************** *** 71,75 **** if self.data[i][1] == text: del self.data[i] - # Make sure it is loaded first to let mm.register_help() --- 85,88 ---- Index: infopack.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/infopack.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** infopack.py 17 Jun 2002 20:33:40 -0000 1.3 --- infopack.py 9 May 2003 21:32:06 -0000 1.4 *************** *** 240,245 **** if found: return 0 - - def __loadmodule__(bot): --- 240,243 ---- Index: log.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/log.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** log.py 9 May 2003 15:27:44 -0000 1.8 --- log.py 9 May 2003 21:32:06 -0000 1.9 *************** *** 32,36 **** 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.\ --- 32,36 ---- HELP_SEARCH = [ ("""\ ! You may search the log files with "[show|search] (log[s]|message[s]) \ [with] /<regexp>/'. You must have the "logsearch" permission for \ this to work.\ *************** *** 131,145 **** hooks.register("OutCTCP", self.log_outctcp, 150) ! # 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+|search\s+)?(?:log|message)s?\s+(?:with\s+|search\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): --- 131,146 ---- hooks.register("OutCTCP", self.log_outctcp, 150) ! # [have you] seen <nick> [!?] self.re1 = re.compile(r"(?:have\s+you\s+)?seen\s+(?P<nick>[^\s!?]+)\s*[!?]*$", re.I) ! # [show|search] (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) ! # seen ! mm.register_help(0, "seen", HELP_SEEN, "seen") ! # log|(search|show) (log[s]|message[s]) ! mm.register_help(0, "log|(?:search|show)\s+(?:log|message)s?", ! HELP_SEARCH, "log") def unload(self): Index: messages.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/messages.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** messages.py 3 Apr 2002 23:24:07 -0000 1.5 --- messages.py 9 May 2003 21:32:06 -0000 1.6 *************** *** 36,44 **** self.strip_nick = re.compile(r"^[\W_]*([^\W_]+)[\W_]*$") ! # Match '[priv[ate]] message (to|for) <nick>: <message>' self.re1 = re.compile(r"(?P<private>priv(?:ate)?\s+)?message\s+(?:to|for)\s+(?P<nick>\S+?)\s*:\s+(?P<message>.*)$", re.I) ! # Match '[leav(e|ing)] message[s]' ! mm.register_help(0, "(?:leav(?:e|ing)\s+)?messages?", HELP) def unload(self): --- 36,44 ---- self.strip_nick = re.compile(r"^[\W_]*([^\W_]+)[\W_]*$") ! # [priv[ate]] message (to|for) <nick>: <message> self.re1 = re.compile(r"(?P<private>priv(?:ate)?\s+)?message\s+(?:to|for)\s+(?P<nick>\S+?)\s*:\s+(?P<message>.*)$", re.I) ! # [leav(e|ing)] message[s] ! mm.register_help(0, "(?:leav(?:e|ing)\s+)?messages?", HELP, "messages") def unload(self): Index: modulecontrol.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/modulecontrol.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** modulecontrol.py 9 May 2003 15:27:44 -0000 1.6 --- modulecontrol.py 9 May 2003 21:32:06 -0000 1.7 *************** *** 33,44 **** modls.loadlist(self.modules) ! # Match '[re|un]load [the] [module] <module>' self.re1 = re.compile("(?P<command>(?:re|un)?load)(?:\s+the)?(?:\s+module)?\s+(?P<module>[\w_-]+)\s*[.!]*$", re.I) ! # Match '(show|list) [loaded] modules' self.re2 = re.compile("(?:show|list)(?:\s+loaded)\s+modules\s*[.!]*$", re.I) ! # Match '[[un|re]load] module[s]' ! mm.register_help(0, "(?:(?:un|re)?load\s+)?modules?", HELP) def unload(self): --- 33,44 ---- modls.loadlist(self.modules) ! # [re|un]load [the] [module] <module> self.re1 = re.compile("(?P<command>(?:re|un)?load)(?:\s+the)?(?:\s+module)?\s+(?P<module>[\w_-]+)\s*[.!]*$", re.I) ! # (show|list) [loaded] modules self.re2 = re.compile("(?:show|list)(?:\s+loaded)\s+modules\s*[.!]*$", re.I) ! # [[un|re]load] module[s] ! mm.register_help(0, "(?:(?:un|re)?load\s+)?modules?", HELP, "modules") def unload(self): Index: options.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/options.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** options.py 9 May 2003 20:18:36 -0000 1.3 --- options.py 9 May 2003 21:32:06 -0000 1.4 *************** *** 17,21 **** # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import mm, hooks, options from types import * import os --- 17,21 ---- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import mm, hooks, options, config from types import * import os Index: permission.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/permission.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** permission.py 9 May 2003 20:18:36 -0000 1.7 --- permission.py 9 May 2003 21:32:06 -0000 1.8 *************** *** 63,67 **** # perm[ission][s] [system] ! mm.register_help(0, "perm(?:ission)?s?(?:\s+system)?", HELP) def unload(self): --- 63,68 ---- # perm[ission][s] [system] ! mm.register_help(0, "perm(?:ission)?s?(?:\s+system)?", HELP, ! "premissions") def unload(self): Index: plock.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/plock.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** plock.py 9 May 2003 15:27:44 -0000 1.7 --- plock.py 9 May 2003 21:32:06 -0000 1.8 *************** *** 68,88 **** hooks.register("Message", self.message) ! # Match '[force] plock <package> [,<package>] [!|.]' self.re1 = re.compile(r"(?P<force>force\s+)?plock\s+(?P<package>[\w_\.-]+(?:(?:\s*,?\s*and\s+|[, ]+)[\w_\.-]+)*)\s*[!.]*$") ! # Match '[force] (unplock|punlock) <package> [,<package>] [!|.]' self.re2 = re.compile(r"(?P<force>force\s+)?(?:unplock|punlock)\s+(?P<package>[\w_\.-]+(?:(?:\s*,?\s*and\s+|[, ]+)[\w_\.-]+)*)\s*[!.]*$") ! # Match '(my plocks|plocks of <user>) [?]' self.re3 = re.compile(r"(?:(?P<my>my)\s+plocks|plocks\s+of\s+(?P<user>[\w\.@_-]+))\s*(?:!*\?[?!]*)?$") ! # Match '([who] [has] plocked|plocker [of]) <package> [,<package>] [?]' self.re4 = re.compile(r"(?:(?:who\s+)?(?:has\s+)plocked|plocker\s+(?:of\s+)?)(?P<package>[\w_\.-]+(?:(?:\s*,?\s*and\s+|[, ]+)[\w_\.-]+)*)\s*(?:!*\?[?!]*)?$") ! # Match 'plock <package> [,<package>] ?' self.re5 = re.compile(r"plock\s+(?P<package>[\w_\.-]+(?:(?:\s*,?\s*and\s+|[, ]+)[\w_\.-]+)*)\s*(?:!*\?[?!]*)$") ! # Match '[un]plock[ing] | <package|pkg> lock[ing] ! mm.register_help(0, "(?:un)?plock(?:ing)?|(?:package|pkg)\s+lock(?:ing)?", HELP) def unload(self): --- 68,89 ---- hooks.register("Message", self.message) ! # [force] plock <package> [,<package>] [!|.] self.re1 = re.compile(r"(?P<force>force\s+)?plock\s+(?P<package>[\w_\.-]+(?:(?:\s*,?\s*and\s+|[, ]+)[\w_\.-]+)*)\s*[!.]*$") ! # [force] (unplock|punlock) <package> [,<package>] [!|.] self.re2 = re.compile(r"(?P<force>force\s+)?(?:unplock|punlock)\s+(?P<package>[\w_\.-]+(?:(?:\s*,?\s*and\s+|[, ]+)[\w_\.-]+)*)\s*[!.]*$") ! # (my plocks|plocks of <user>) [?] self.re3 = re.compile(r"(?:(?P<my>my)\s+plocks|plocks\s+of\s+(?P<user>[\w\.@_-]+))\s*(?:!*\?[?!]*)?$") ! # ([who] [has] plocked|plocker [of]) <package> [,<package>] [?] self.re4 = re.compile(r"(?:(?:who\s+)?(?:has\s+)plocked|plocker\s+(?:of\s+)?)(?P<package>[\w_\.-]+(?:(?:\s*,?\s*and\s+|[, ]+)[\w_\.-]+)*)\s*(?:!*\?[?!]*)?$") ! # plock <package> [,<package>] ? self.re5 = re.compile(r"plock\s+(?P<package>[\w_\.-]+(?:(?:\s*,?\s*and\s+|[, ]+)[\w_\.-]+)*)\s*(?:!*\?[?!]*)$") ! # [un]plock[ing] | <package|pkg> lock[ing] ! mm.register_help(0, "(?:un)?plock(?:ing)?|(?:package|pkg)\s+lock(?:ing)?", ! HELP, "plock") def unload(self): Index: repeat.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/repeat.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** repeat.py 4 Dec 2001 00:57:38 -0000 1.2 --- repeat.py 9 May 2003 21:32:06 -0000 1.3 *************** *** 42,46 **** hooks.register("Message", self.message) ! # Match: '[don[']t|do not] repeat [each <n> seconds] (to|at|on) [channel|user] <target> [[on|at] server <server>] [/me|/notice] ...' self.re1 = re.compile(r"(?:(?P<dont>don'?t|do\s+not)\s+)?repeat(?:\s+each\s+(?P<interval>[0-9]+)\s*(?P<intervalunit>se?c?o?n?d?s?|mi?n?u?t?e?s?|ho?u?r?s?))?(?:\s+(?:to|at|on)(?:\s+(?:channel|user))?\s+(?P<target>\S+))?(?:\s+(?:on|at)?\s+server\s+(?P<server>\S+))?\s+(?P<action>/me\s)?(?P<notice>/notice\s)?(?P<phrase>.*)$") --- 42,46 ---- hooks.register("Message", self.message) ! # [don[']t|do not] repeat [each <n> seconds] (to|at|on) [channel|user] <target> [[on|at] server <server>] [/me|/notice] ... self.re1 = re.compile(r"(?:(?P<dont>don'?t|do\s+not)\s+)?repeat(?:\s+each\s+(?P<interval>[0-9]+)\s*(?P<intervalunit>se?c?o?n?d?s?|mi?n?u?t?e?s?|ho?u?r?s?))?(?:\s+(?:to|at|on)(?:\s+(?:channel|user))?\s+(?P<target>\S+))?(?:\s+(?:on|at)?\s+server\s+(?P<server>\S+))?\s+(?P<action>/me\s)?(?P<notice>/notice\s)?(?P<phrase>.*)$") Index: social.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/social.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** social.py 17 Jun 2002 20:33:41 -0000 1.5 --- social.py 9 May 2003 21:32:06 -0000 1.6 *************** *** 27,55 **** hooks.register("UnhandledMessage", self.unhandled_message) ! # Match '(hi|hello) [there|everybody|all|guys|folks|pybot] [!|.]' self.re1 = re.compile(r'(?:hi|hello)(?:\s+(?:there|everybody|all|guys|folks|(?P<nick>\w+)))?\s*[!.]*$', re.I) ! # Match 'pybot!' self.re2 = re.compile(r'(?P<nick>\w+)\s*!+$', re.I) ! # 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]?' self.re4 = re.compile(r'(?:are\s+you\s+ok|how\s+are\s+you(?:\s+doing)?)\s*[!?]*$', re.I) ! # Match 'pybot?' self.re5 = re.compile(r'!*\?[?!]*$', re.I) ! # Match 'never mind [!|.]' self.re6 = re.compile(r'never\s+mind\s*[!.]*$', re.I) ! # Match '[very|pretty] (nice|good|great) [.|!]' self.re7 = re.compile(r'(?:(?:very|pretty)\s+)?(?:nice|good|great)\s*[.!]*$', re.I) ! # Match ' (gay|stupid|fuck|idiot|imbecile|cretin) ' self.re8 = re.compile(r'.*(?:gay|stupid|fuck|idiot|imbecile|cretin)', re.I) ! # Match 'h[e|u|a]h' self.re9 = re.compile(r'h[eua]h', re.I) --- 27,55 ---- hooks.register("UnhandledMessage", self.unhandled_message) ! # (hi|hello) [there|everybody|all|guys|folks|pybot] [!|.] self.re1 = re.compile(r'(?:hi|hello)(?:\s+(?:there|everybody|all|guys|folks|(?P<nick>\w+)))?\s*[!.]*$', re.I) ! # pybot! self.re2 = re.compile(r'(?P<nick>\w+)\s*!+$', re.I) ! # [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) ! # are you ok?|how are you [doing]? self.re4 = re.compile(r'(?:are\s+you\s+ok|how\s+are\s+you(?:\s+doing)?)\s*[!?]*$', re.I) ! # pybot? self.re5 = re.compile(r'!*\?[?!]*$', re.I) ! # never mind [!|.] self.re6 = re.compile(r'never\s+mind\s*[!.]*$', re.I) ! # [very|pretty] (nice|good|great) [.|!] self.re7 = re.compile(r'(?:(?:very|pretty)\s+)?(?:nice|good|great)\s*[.!]*$', re.I) ! # (gay|stupid|fuck|idiot|imbecile|cretin) self.re8 = re.compile(r'.*(?:gay|stupid|fuck|idiot|imbecile|cretin)', re.I) ! # h[e|u|a]h self.re9 = re.compile(r'h[eua]h', re.I) Index: testadora.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/testadora.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** testadora.py 8 May 2003 16:43:29 -0000 1.1 --- testadora.py 9 May 2003 21:32:06 -0000 1.2 *************** *** 30,34 **** HELP_TESTADORA = [ ("""\ ! Use "help compile time" to get help on the available testadora commands.\ """,)] --- 30,35 ---- HELP_TESTADORA = [ ("""\ ! For now, only the "compile time" command is available. Use "help compile \ ! time" for more information on this command.\ """,)] *************** *** 46,50 **** # testadora ! mm.register_help(0, "testadora", HELP_TESTADORA) def unload(self): --- 47,51 ---- # testadora ! mm.register_help(0, "testadora", HELP_TESTADORA, "testadora") def unload(self): Index: uptime.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/uptime.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** uptime.py 4 Dec 2001 00:57:38 -0000 1.3 --- uptime.py 9 May 2003 21:32:06 -0000 1.4 *************** *** 22,25 **** --- 22,30 ---- import re + HELP = [ + ("""\ + The "uptime" command shows you for how much time I'm online.\ + """,)] + class Uptime: def __init__(self, bot): *************** *** 27,38 **** hooks.register("Message", self.message) ! # Match '[show|display] uptime [!|.|?]' self.re1 = re.compile(r"(?:(?:show|display)\s+)?uptime\s*[!.?]*$") ! # Match 'reset uptime [!|.]' self.re2 = re.compile(r"reset\s+uptime\s*[!.]*$") def unload(self): hooks.unregister("Message", self.message) def days_in_last_month(self, tuple): --- 32,47 ---- hooks.register("Message", self.message) ! # [show|display] uptime [!|.|?] self.re1 = re.compile(r"(?:(?:show|display)\s+)?uptime\s*[!.?]*$") ! # reset uptime [!|.] self.re2 = re.compile(r"reset\s+uptime\s*[!.]*$") + + # uptime + mm.register_help(0, "uptime", HELP, "uptime") def unload(self): hooks.unregister("Message", self.message) + mm.unregister_help(0, HELP) def days_in_last_month(self, tuple): Index: userdata.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/userdata.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** userdata.py 9 May 2003 15:27:44 -0000 1.3 --- userdata.py 9 May 2003 21:32:06 -0000 1.4 *************** *** 91,98 **** # [un]register|identify ! mm.register_help(0, "(?:un)?register|ident(?:ify)?", HELP_REGISTER) # set|unset|add|remove ! mm.register_help(0, "set|unset|add|remove", HELP_SET) def unload(self): --- 91,99 ---- # [un]register|identify ! mm.register_help(0, "(?:un)?register|ident(?:ify)?", HELP_REGISTER, ! "register") # set|unset|add|remove ! mm.register_help(0, "set|unset|add|remove", HELP_SET, ["set","unset"]) def unload(self): Index: xmlrpc.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/xmlrpc.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** xmlrpc.py 5 May 2003 20:47:24 -0000 1.1 --- xmlrpc.py 9 May 2003 21:32:06 -0000 1.2 *************** *** 92,96 **** # xmlrpc ! mm.register_help(0, "xmlrpc", HELP) def unload(self): --- 92,96 ---- # xmlrpc ! mm.register_help(0, "xmlrpc", HELP, "xmlrpc") def unload(self): |
From: Gustavo N. <nie...@us...> - 2003-05-09 21:32:08
|
Update of /cvsroot/pybot/pybot In directory sc8-pr-cvs1:/tmp/cvs-serv20181 Modified Files: ChangeLog Log Message: Added new triggers option in register_help(). Now the "help" command alone also shows items the user can ask for help on. Index: ChangeLog =================================================================== RCS file: /cvsroot/pybot/pybot/ChangeLog,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** ChangeLog 9 May 2003 20:18:36 -0000 1.12 --- ChangeLog 9 May 2003 21:32:05 -0000 1.13 *************** *** 9,12 **** --- 9,15 ---- * core.py: Removed (why was it still here?). * modules/options.py: Get filename from configuration file. + * modules/*: Added new triggers option in register_help(). Now + the "help" command alone also shows items the user can ask + for help on. 2003-05-08 Gustavo Niemeyer <nie...@co...> |
From: Gustavo N. <nie...@us...> - 2003-05-09 20:18:39
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory sc8-pr-cvs1:/tmp/cvs-serv16526/pybot/modules Modified Files: options.py permission.py servercontrol.py Log Message: - modules/userdata.py,modules/permission.py: A much better userdata registry and permission system was developed. - misc.py: Increased maximum line size to 400 characters. - server.py,runner.py,modules/permission.py: Implemented a pybot console, allowing one to talk to pybot locally. - scripts/*: Removed setup scripts. They're not needed anymore now that we have a console. - core.py: Removed (why was it still here?). - modules/options.py: Get filename from configuration file. Index: options.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/options.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** options.py 4 Dec 2001 00:57:38 -0000 1.2 --- options.py 9 May 2003 20:18:36 -0000 1.3 *************** *** 28,31 **** --- 28,32 ---- hooks.register("Reboot", self.write, 1000) hooks.register("Quit", self.write, 1000) + self.path = config.get("options", "path") self.read() self.safe_env = {"__builtins__": {}, "None": None} *************** *** 38,48 **** def write(self): ! file = open("options", "w") cPickle.dump(options.getharddict(), file, 1) file.close() def read(self): ! if os.path.exists("options"): ! file = open("options") newoption = cPickle.load(file) oldoption = options.getharddict() --- 39,49 ---- def write(self): ! file = open(self.path, "w") cPickle.dump(options.getharddict(), file, 1) file.close() def read(self): ! if os.path.exists(self.path): ! file = open(self.path) newoption = cPickle.load(file) oldoption = options.getharddict() Index: permission.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/permission.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** permission.py 9 May 2003 15:27:44 -0000 1.6 --- permission.py 9 May 2003 20:18:36 -0000 1.7 *************** *** 162,165 **** --- 162,167 ---- def mm_hasperm(self, defret, servername, channel, user, perm): + if servername == "console": + return 1 if (servername, mm.loggednick(0, servername, user)) in \ self.staticadmins: Index: servercontrol.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/servercontrol.py,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** servercontrol.py 2 Nov 2001 17:20:22 -0000 1.1.1.1 --- servercontrol.py 9 May 2003 20:18:36 -0000 1.2 *************** *** 146,150 **** else: msg.answer("%:", ["I'm connecting, sir!", "I'm going there!", "At your order, sir!", "No problems!", "Right now!", "Ok!"]) ! self.servers[var[0]] = ["pybot", "pybot", "0", "PyBot", []] servers.add(var[0]) else: --- 146,150 ---- else: msg.answer("%:", ["I'm connecting, sir!", "I'm going there!", "At your order, sir!", "No problems!", "Right now!", "Ok!"]) ! self.servers[var[0]] = ["pybot", "pybot", "0", "PyBot", {}] servers.add(var[0]) else: |
From: Gustavo N. <nie...@us...> - 2003-05-09 20:18:39
|
Update of /cvsroot/pybot/pybot/scripts In directory sc8-pr-cvs1:/tmp/cvs-serv16526/scripts Removed Files: pybotopt.py pybotsetup.py Log Message: - modules/userdata.py,modules/permission.py: A much better userdata registry and permission system was developed. - misc.py: Increased maximum line size to 400 characters. - server.py,runner.py,modules/permission.py: Implemented a pybot console, allowing one to talk to pybot locally. - scripts/*: Removed setup scripts. They're not needed anymore now that we have a console. - core.py: Removed (why was it still here?). - modules/options.py: Get filename from configuration file. --- pybotopt.py DELETED --- --- pybotsetup.py DELETED --- |
From: Gustavo N. <nie...@us...> - 2003-05-09 20:18:39
|
Update of /cvsroot/pybot/pybot/pybot In directory sc8-pr-cvs1:/tmp/cvs-serv16526/pybot Modified Files: main.py runner.py server.py Removed Files: core.py Log Message: - modules/userdata.py,modules/permission.py: A much better userdata registry and permission system was developed. - misc.py: Increased maximum line size to 400 characters. - server.py,runner.py,modules/permission.py: Implemented a pybot console, allowing one to talk to pybot locally. - scripts/*: Removed setup scripts. They're not needed anymore now that we have a console. - core.py: Removed (why was it still here?). - modules/options.py: Get filename from configuration file. Index: main.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/main.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** main.py 4 Dec 2001 00:57:38 -0000 1.3 --- main.py 9 May 2003 20:18:36 -0000 1.4 *************** *** 33,40 **** 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) --- 33,37 ---- self.reboot = 0 self.quit = 0 ! signal.signal(signal.SIGQUIT, self.signalhandler) signal.signal(signal.SIGTERM, self.signalhandler) Index: runner.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/runner.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** runner.py 4 Dec 2001 00:57:38 -0000 1.1 --- runner.py 9 May 2003 20:18:36 -0000 1.2 *************** *** 19,24 **** # 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. --- 19,24 ---- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! import sys, os ! import getopt # Add upper directory to search path in case we are in development tree. *************** *** 28,63 **** 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 --- 28,94 ---- 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 ! ! USAGE = """\ ! Usage: pybot.py [OPTIONS] ! ! Options: ! -c Enable console ! -d Enable debug mode ! -h Show this message ! ! Examples: ! repsys submit https://repos/svn/cnc/snapshot/foo 14800 ! repsys submit -l https://repos ! """ ! ! def parse_options(): ! try: ! opts, args = getopt.getopt(sys.argv[1:], "cdh", ["help"]) ! except getopt.GetoptError, e: ! sys.exit("error: "+e.msg) ! class Options: pass ! obj = Options() ! obj.console = 0 ! obj.debug = 0 ! for opt, val in opts: ! if opt == "-c": ! obj.console = 1 ! elif opt == "-d": ! obj.debug = 1 ! elif opt in ["-h", "--help"]: ! sys.stdout.write(USAGE) ! sys.exit(1) ! return obj def main(): ! pybot.init() # Initialize globaly acessible data ! opts = parse_options() ! if opts.console: ! pybot.servers.add_console() ! if opts.debug: ! 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: server.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/server.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** server.py 4 Dec 2001 00:57:38 -0000 1.2 --- server.py 9 May 2003 20:18:36 -0000 1.3 *************** *** 18,25 **** from errno import EINPROGRESS, EALREADY, EWOULDBLOCK ! from thread import allocate_lock from select import select from string import split ! from time import time import socket --- 18,25 ---- from errno import EINPROGRESS, EALREADY, EWOULDBLOCK ! from thread import allocate_lock, start_new_thread from select import select from string import split ! from time import time, sleep import socket *************** *** 36,41 **** def add(self, servername): ! self.servers.append(Server(self, servername)) def remove(self, servername): for i in range(len(self.servers)): --- 36,44 ---- def add(self, servername): ! self.servers.append(Server(servername)) + def add_console(self): + self.servers.append(ConsoleServer()) + def remove(self, servername): for i in range(len(self.servers)): *************** *** 51,60 **** 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() --- 54,100 ---- return self.servers ! class BaseServer: ! def __init__(self, servername): ! self.servername = servername ! self.killed = 0 ! self._inlines = [] ! self.user = User() ! ! def interaction(self): ! pass ! ! def changeserver(self, servername): ! pass ! ! def kill(self): ! pass ! ! def reconnect(self): ! pass ! ! def sendcmd(self, prefix, cmd, *params, **kw): ! pass ! ! def sendmsg(self, target, nick, *params, **kw): ! pass ! ! 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 ! ! class Server(BaseServer): ! def __init__(self, servername): ! BaseServer.__init__(self, servername) ! self.changeserver(servername) self._inbuffer = "" self._outlines = [] self._outlines_lock = allocate_lock() *************** *** 64,75 **** 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 --- 104,113 ---- self._socket.setblocking(0) self._timeout = 0 self._connect = 1 self._reconnect = 0 ! self._connected = 0 def interaction(self): ! if not self._connected: if self._timeout: self._timeout = self._timeout-1 *************** *** 84,88 **** self._disconnect() return ! self.connected = 1 pybot.hooks.call("Connected", self) else: --- 122,126 ---- self._disconnect() return ! self._connected = 1 pybot.hooks.call("Connected", self) else: *************** *** 157,161 **** except: pass ! self.connected = 0 self._outlines = [] --- 195,199 ---- except: pass ! self._connected = 0 self._outlines = [] *************** *** 165,184 **** 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. --- 203,210 ---- def reconnect(self): ! if self._connected: self._reconnect = 1 self._timeout = CONNECTDELAY def sendline(self, line, priority=50, outhooks=1): """Send one line for the server. *************** *** 231,234 **** --- 257,310 ---- subline = linemask%subline self.sendline(subline, priority, outhooks) + + from cmd import Cmd + + class ConsoleServer(BaseServer, Cmd): + def __init__(self): + BaseServer.__init__(self, "console") + self.user.set("pybot", "pybot", "console") + + Cmd.__init__(self) + self.prompt = "pybot> " + start_new_thread(self.cmdloop, ()) + del Cmd.do_help + + self._outlines = [] + self._outlines_lock = allocate_lock() + + def sendcmd(self, prefix, cmd, *params, **kw): + outline = "[CMD] %s %s" % \ + (cmd, buildanswer(params, None, self.user.nick)) + self._outlines_lock.acquire() + self._outlines.append(outline) + self._outlines_lock.release() + + def sendmsg(self, target, nick, *params, **kw): + outline = "[MSG] %s" % buildanswer(params, target, nick) + self._outlines_lock.acquire() + self._outlines.append(outline) + self._outlines_lock.release() + + def show_lines(self): + self._outlines_lock.acquire() + for line in self._outlines: + print line + self._outlines = [] + self._outlines_lock.release() + + def default(self, line): + if line == "EOF": + print + return 1 + inline = ":master!master@console PRIVMSG pybot :%s" % line + self._inlines.append(inline) + sleep(0.5) + self.show_lines() + + def emptyline(self): + pass + + def postloop(self): + pybot.main.quit = 1 # vim:ts=4:sw=4:et --- core.py DELETED --- |
From: Gustavo N. <nie...@us...> - 2003-05-09 20:18:39
|
Update of /cvsroot/pybot/pybot In directory sc8-pr-cvs1:/tmp/cvs-serv16526 Modified Files: ChangeLog TODO pybot.conf pybot.py Log Message: - modules/userdata.py,modules/permission.py: A much better userdata registry and permission system was developed. - misc.py: Increased maximum line size to 400 characters. - server.py,runner.py,modules/permission.py: Implemented a pybot console, allowing one to talk to pybot locally. - scripts/*: Removed setup scripts. They're not needed anymore now that we have a console. - core.py: Removed (why was it still here?). - modules/options.py: Get filename from configuration file. Index: ChangeLog =================================================================== RCS file: /cvsroot/pybot/pybot/ChangeLog,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** ChangeLog 9 May 2003 15:27:43 -0000 1.11 --- ChangeLog 9 May 2003 20:18:36 -0000 1.12 *************** *** 3,6 **** --- 3,12 ---- registry and permission system was developed. * misc.py: Increased maximum line size to 400 characters. + * server.py,runner.py,modules/permission.py: Implemented a + pybot console, allowing one to talk to pybot locally. + * scripts/*: Removed setup scripts. They're not needed anymore + now that we have a console. + * core.py: Removed (why was it still here?). + * modules/options.py: Get filename from configuration file. 2003-05-08 Gustavo Niemeyer <nie...@co...> Index: TODO =================================================================== RCS file: /cvsroot/pybot/pybot/TODO,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** TODO 9 May 2003 15:27:43 -0000 1.4 --- TODO 9 May 2003 20:18:36 -0000 1.5 *************** *** 4,9 **** - A better website for pybot. - - Documentation!! Please, write documentation. :-) - - Include every module in the online help system. --- 4,7 ---- *************** *** 18,19 **** --- 16,26 ---- - Remove the parameter from __loadmodule() and __unloadmodule__(), and convert them to use a general "mod" name for the instance. + + - Cross identification between servers. + + - Include help topics when registering a help entry. + + - Include help for permissions. + + - Perhaps move all option system to sqlite. + Index: pybot.conf =================================================================== RCS file: /cvsroot/pybot/pybot/pybot.conf,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** pybot.conf 9 May 2003 15:27:43 -0000 1.5 --- pybot.conf 9 May 2003 20:18:36 -0000 1.6 *************** *** 18,26 **** ; system (send "help permission" to pybot for more information), or just ; append an entry here and restart pybot. ! admins = niemeyer@i.conectiva.com.br [userdata] ; 30min login_timeout = 1800 [infopack] --- 18,29 ---- ; system (send "help permission" to pybot for more information), or just ; append an entry here and restart pybot. ! admins = nie...@ir... [userdata] ; 30min login_timeout = 1800 + + [options] + path = %(datadir)s/options [infopack] Index: pybot.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** pybot.py 8 May 2003 19:11:34 -0000 1.2 --- pybot.py 9 May 2003 20:18:36 -0000 1.3 *************** *** 30,35 **** sys.exit("error: couldn't find module pybot.runner") module[0].close() while 1: ! ret = os.system("python "+module[1]) if ret != 0: break --- 30,36 ---- sys.exit("error: couldn't find module pybot.runner") module[0].close() + args = ' '.join(["'%s'"%x for x in sys.argv[1:]]) while 1: ! ret = os.system("python %s %s" % (module[1], args)) if ret != 0: break |
From: Gustavo N. <nie...@us...> - 2003-05-09 15:27:48
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory sc8-pr-cvs1:/tmp/cvs-serv11697/pybot/modules Modified Files: freshmeat.py log.py modulecontrol.py permission.py plock.py userdata.py Log Message: - modules/userdata.py,modules/permission.py: A much better userdata registry and permission system was developed. - misc.py: Increased maximum line size to 400 characters. - Miscelaneous bugfixes. Index: freshmeat.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/freshmeat.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** freshmeat.py 8 May 2003 19:11:34 -0000 1.5 --- freshmeat.py 9 May 2003 15:27:44 -0000 1.6 *************** *** 43,47 **** 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>]] [!|.]' --- 43,47 ---- self.fetch_lock = thread.allocate_lock() hooks.register("Message", self.message) ! mm.hooktimer(0, self.interval*60, self.checknews, ()) # Match '[don[']t|do not] show freshmeat news [(to|on|at|for) [channel|user] <target> [[on|at] server <server>]] [!|.]' Index: log.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/log.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** log.py 8 May 2003 19:11:34 -0000 1.7 --- log.py 9 May 2003 15:27:44 -0000 1.8 *************** *** 39,43 **** class LogMsg: def __init__(self, data): ! self.time = int(data.time) self.servername = data.servername self.type = data.type --- 39,43 ---- class LogMsg: def __init__(self, data): ! self.time = int(data.timestamp) self.servername = data.servername self.type = data.type *************** *** 104,108 **** def search(self, regexp, max, searchline): p = re.compile(regexp, re.I) - file = open(self.logname) l = [] cursor = db.cursor() --- 104,107 ---- Index: modulecontrol.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/modulecontrol.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** modulecontrol.py 8 May 2003 19:11:34 -0000 1.5 --- modulecontrol.py 9 May 2003 15:27:44 -0000 1.6 *************** *** 55,60 **** if command == "load" and isloaded: msg.answer("%:", ["Sorry sir, but", "Sir,", "Oops, I think that"], "this module is already loaded.") - elif not isloaded: - msg.answer("%:", ["Sorry sir, but", "Sir,", "Oops, I think that"], "this module is not loaded.") elif command == "load": if modls.load(module): --- 55,58 ---- *************** *** 63,66 **** --- 61,66 ---- else: msg.answer("%:", ["Something wrong happened while", "Something bad happened while", "There was a problem"], "loading the module", ["!", "."]) + elif not isloaded: + msg.answer("%:", ["Sorry sir, but", "Sir,", "Oops, I think that"], "this module is not loaded.") elif command == "reload": if modls.reload(module): Index: permission.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/permission.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** permission.py 8 May 2003 16:43:29 -0000 1.5 --- permission.py 9 May 2003 15:27:44 -0000 1.6 *************** *** 17,22 **** # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import mm, hooks, options from pybot.user import User import re --- 17,23 ---- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import mm, hooks, options, config from pybot.user import User + from types import StringType import re *************** *** 26,31 **** 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>].\ """,), ("""\ --- 27,34 ---- 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>|nick <nick>] [on|at] [this \ ! channel|channel <channel>] [on|at|to] [this server|server <server>]". \ ! When using <nick>, it must be registered and logged to have the \ ! permission.\ """,), ("""\ *************** *** 38,44 **** class Permission: ! def __init__(self, bot): self.perm = options.gethard("Permission.perm", {}) - self.gosh = options.gethard("Permission.gosh", []) mm.register("hasperm", self.mm_hasperm) mm.register("setperm", self.mm_setperm) --- 41,46 ---- class Permission: ! def __init__(self): self.perm = options.gethard("Permission.perm", {}) mm.register("hasperm", self.mm_hasperm) mm.register("setperm", self.mm_setperm) *************** *** 46,56 **** hooks.register("Message", self.message) ! # Matches '(give|remove|del|delete|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|remove|del|delete|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) --- 48,66 ---- hooks.register("Message", self.message) ! self.staticadmins = [] ! if config.has_option("permission", "admins"): ! for userhost in config.get("permission", "admins").split(): ! pair = userhost.split("@") ! if len(pair) == 2: ! pair.reverse() ! self.staticadmins.append(tuple(pair)) ! # (give|remove|del|delete|take) perm[ission] <perm> [to|from] [user <user>|nick <nick>] [on|at] [this channel|channel <channel>] [on|at|to] [this server|server <server>] ! self.re1 = re.compile("(?P<command>give|remove|del|delete|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+nick\s+(?P<nick>\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) ! ! # (show|list) perm[ission][s] [<perm>] self.re2 = re.compile("(?:show|list)\s+perm(?:ission)?s?(?:\s+(?P<perm>\w+))?\s*[!.]*$", re.I) ! # perm[ission][s] [system] mm.register_help(0, "perm(?:ission)?s?(?:\s+system)?", HELP) *************** *** 66,70 **** 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 --- 76,80 ---- m = self.re1.match(msg.line) if m: ! if self.mm_msg_hasperm(0, msg, None): if m.group("thischannel"): found = 1 *************** *** 92,96 **** user.setstring(userstr) else: ! user = None perm = m.group("perm1") or m.group("perm2") if m.group("command").lower() == "give": --- 102,106 ---- user.setstring(userstr) else: ! user = m.group("nick") perm = m.group("perm1") or m.group("perm2") if m.group("command").lower() == "give": *************** *** 108,115 **** 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: --- 118,126 ---- m = self.re2.match(msg.line) if m: ! if self.mm_msg_hasperm(0, msg, None): perm = m.group("perm") if perm: ! perms = self.perm.get(perm) ! if not perms: msg.answer("%:", "Nobody has this permission", [".", "!"]) else: *************** *** 120,124 **** tup = perms[i] if tup[2] is not None: ! s += tup[2].string if tup[1] is not None: join = "" --- 131,138 ---- tup = perms[i] if tup[2] is not None: ! if type(tup[2]) is StringType: ! s += tup[2] ! else: ! s += tup[2].string if tup[1] is not None: join = "" *************** *** 147,163 **** 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): --- 161,190 ---- return 0 ! def mm_hasperm(self, defret, servername, channel, user, perm): ! if (servername, mm.loggednick(0, servername, user)) in \ ! self.staticadmins: ! return 1 if self.perm.has_key(perm): for tup in self.perm[perm]: ! isnick = type(tup[2]) is StringType ! if (tup[0] is None or tup[0] == servername) and \ (tup[1] is None or tup[1] == channel) and \ ! (tup[2] is None or ! (isnick and (tup[2] == mm.loggednick(0, servername, user)) or ! (not isnick and user.match(tup[2].nick, ! tup[2].username, ! tup[2].host)))): return 1 if perm != "admin": ! return self.mm_hasperm(defret, servername, channel, user, "admin") return 0 + def mm_msg_hasperm(self, defret, msg, perm): + return self.mm_hasperm(defret, + msg.server.servername, + msg.target, + msg.user, + perm) + def mm_setperm(self, defret, server, channel, user, perm): if not self.perm.has_key(perm): *************** *** 171,177 **** _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: --- 198,209 ---- _perm = self.perm[perm] for tup in _perm: + isnick = type(tup[2]) is StringType if (tup[0] is None or tup[0] == server) and \ (tup[1] is None or tup[1] == channel) and \ ! (tup[2] is None or ! (isnick and (tup[2] == mm.loggednick(0, servername, user)) or ! (not isnick and user.match(tup[2].nick, ! tup[2].username, ! tup[2].host)))): _perm.remove(tup) if len(_perm) == 0: *************** *** 182,192 **** def __loadmodule__(bot): ! global permission ! permission = Permission(bot) def __unloadmodule__(bot): ! global permission ! permission.unload() ! del permission # vim:ts=4:sw=4:et --- 214,224 ---- def __loadmodule__(bot): ! global mod ! mod = Permission() def __unloadmodule__(bot): ! global mod ! mod.unload() ! del mod # vim:ts=4:sw=4:et Index: plock.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/plock.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** plock.py 8 May 2003 19:11:34 -0000 1.6 --- plock.py 9 May 2003 15:27:44 -0000 1.7 *************** *** 30,35 **** """,), ("""\ ! Note that to be able to work with plocks, you must first register an \ ! email with "register email your@email".\ """,)] --- 30,36 ---- """,), ("""\ ! Note that to be able to work with plocks, you must first register yourself \ ! with me, and then register an email with "set email your@email". For more \ ! information use "help register".\ """,)] *************** *** 66,70 **** self.pdir = config.get("plock", "dirpath") hooks.register("Message", self.message) - options.gethard("UserData.type", {}).setdefault("email", "~") # Match '[force] plock <package> [,<package>] [!|.]' --- 67,70 ---- *************** *** 90,98 **** mm.unregister_help(0, HELP) ! def getnick(self, server, email): ! emails = mm.getuserdataall({}, server, "email") ! for _nick, _email in emails.items(): ! if _email == email: ! return _nick def message(self, msg): --- 90,100 ---- mm.unregister_help(0, HELP) ! def getnick(self, servername, email): ! data = options.gethard("UserData.data", {}) ! for pair in data: ! if pair[0] == servername: ! if data[pair].get("email") == email: ! return nick ! return None def message(self, msg): *************** *** 102,106 **** if m: if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "plock"): ! email = mm.getuserdata(None, msg.server, msg.user.nick, "email") if not email: msg.answer("%:", ["Hummm...", "Nope!", "Sorry!"], "You must register an email (with 'register email <email>')", ["!", "."]) --- 104,108 ---- if m: if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "plock"): ! email = mm.getuserdata(0, msg.server, msg.user.nick, "email") if not email: msg.answer("%:", ["Hummm...", "Nope!", "Sorry!"], "You must register an email (with 'register email <email>')", ["!", "."]) *************** *** 135,139 **** if m: if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "plock"): ! email = mm.getuserdata(None, msg.server, msg.user.nick, "email") if not email: msg.answer("%:", ["Hummm...", "Nope!", "Sorry!"], "You must register an email", ["!", "."]) --- 137,141 ---- if m: if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "plock"): ! email = mm.getuserdata(0, msg.server, msg.user.nick, "email") if not email: msg.answer("%:", ["Hummm...", "Nope!", "Sorry!"], "You must register an email", ["!", "."]) *************** *** 174,182 **** user = m.group("user") if my: ! email = mm.getuserdata(None, msg.server, msg.user.nick, "email") if not email: msg.answer("%:", ["Hummm...", "Nope!", "Sorry!"], "You must register an email", ["!", "."]) elif "@" not in user: ! email = mm.getuserdata(None, msg.server, user, "email") if not email: msg.answer("%:", ["Hummm...", "Nope!", "Sorry!"], "No email registered for this nick", ["!", "."]) --- 176,184 ---- user = m.group("user") if my: ! email = mm.getuserdata(0, msg.server, msg.user.nick, "email") if not email: msg.answer("%:", ["Hummm...", "Nope!", "Sorry!"], "You must register an email", ["!", "."]) elif "@" not in user: ! email = mm.getuserdata(0, msg.server, user, "email") if not email: msg.answer("%:", ["Hummm...", "Nope!", "Sorry!"], "No email registered for this nick", ["!", "."]) *************** *** 221,229 **** fstr = " on %Y/%m/%d at %H:%M." when = time.strftime(fstr, ptime) ! email = mm.getuserdata(None, msg.server, msg.user.nick, "email") if locker == email: msg.answer("%:", "You have plocked "+package+when) else: ! nick = self.getnick(msg.server, locker) if nick: locker = nick msg.answer("%:", locker+" has plocked "+package+when) --- 223,231 ---- fstr = " on %Y/%m/%d at %H:%M." when = time.strftime(fstr, ptime) ! email = mm.getuserdata(0, msg.server, msg.user.nick, "email") if locker == email: msg.answer("%:", "You have plocked "+package+when) else: ! nick = self.getnick(msg.server.servername, locker) if nick: locker = nick msg.answer("%:", locker+" has plocked "+package+when) Index: userdata.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/userdata.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** userdata.py 4 Dec 2001 00:57:38 -0000 1.2 --- userdata.py 9 May 2003 15:27:44 -0000 1.3 *************** *** 17,83 **** # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import mm, hooks, options class UserData: ! def __init__(self, bot): hooks.register("Message", self.message) mm.register("getuserdata", self.mm_getuserdata) - mm.register("getuserdataall", self.mm_getuserdataall) mm.register("setuserdata", self.mm_setuserdata) self.data = options.gethard("UserData.data", {}) ! self.type = options.gethard("UserData.type", {}) ! self.type.setdefault("password", "~") def unload(self): hooks.unregister("Message", self.message) mm.unregister("getuserdata") - mm.unregister("getuserdataall") mm.unregister("setuserdata") def message(self, msg): ! var = [] ! for name, matchstr in self.type.items(): ! if msg.match(var, 2, "%", ["with", None], [("password", 0, "~"), None], "register", name, 1, matchstr): ! password = self.mm_getuserdata(None, msg.server, msg.user.nick, "password") ! if not password or password == var[0]: ! self.mm_setuserdata(None, msg.server, msg.user.nick, name, var[1]) ! msg.answer("%:", ["Done", "Registered", "Sure", "No problems"], ["!", "."]) else: ! msg.answer("%:", ["Oops...", "Sorry!"], ["Wrong password", "This is not your password"], ["!", "."]) return 0 ! elif msg.match(var, 2, "%", ["with", None], [("password", 0, "~"), None], "unregister", name, ["!", ".", None]): ! password = self.mm_getuserdata(None, msg.server, msg.user.nick, "password") ! if not password or password == var[0]: ! self.mm_setuserdata(None, msg.server, msg.user.nick, name, None) ! msg.answer("%:", ["Done", "Unregistered", "Sure", "No problems"], ["!", "."]) else: ! msg.answer("%:", ["Oops...", "Sorry!"], ["Wrong password", "This is not your password"], ["!", "."]) return 0 def mm_getuserdata(self, defret, server, nick, name): ! usr = self.data.get((server.servername, name)) ! if usr: ! return usr.get(nick) ! def mm_getuserdataall(self, defret, server, name): ! return self.data.get((server.servername, name)) ! def mm_setuserdata(self, defret, server, nick, name, value): ! usr = self.data.setdefault((server.servername, name), {}) ! if value != None: ! usr[nick] = value else: ! del usr[nick] ! if not usr: ! del usr def __loadmodule__(bot): ! global userdata ! userdata = UserData(bot) def __unloadmodule__(bot): ! global userdata ! userdata.unload() ! del userdata # vim:ts=4:sw=4:et --- 17,302 ---- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import mm, hooks, options, config ! import time ! import re ! ! HELP_REGISTER = [ ! ("""\ ! You may register yourself with "register [nick] <password>". After that, \ ! you can identify yourself with "ident[ify] [nick] <password>". You can \ ! also configure your nick to be automatically identified with "add identity \ ! nick!user@host" ('*' is accepted). Be careful since anyone matching \ ! this identity will have access to your nick's information and permissions.\ ! """,), ! ("""\ ! After using identify, you can make me forget about you using \ ! "unident[ify]|forget me". This is useful to protect your nick if you can't \ ! ensure that your IP won't be used by some malicious user before the login \ ! timeout period.\ ! """,), ! ("""\ ! To change your password, use "set password <newpassword>" (for more \ ! information on "set" and "add" use "help set"), and to unregister your \ ! nick, use "unregister [nick] <password>". For more information on the \ ! "add identity" command, check "help add".\ ! """,)] ! ! HELP_SET = [ ! ("""\ ! You can manage information linked to your registered nick (check "help \ ! register") using the command "(set|add) <type> <value>" and "(unset \ ! <type>|remove <type> <value>". The 'set' command will set the given \ ! information type to <value>, while 'add' will append the given value \ ! to the information type (if accepted).\ ! """,), ! ("""\ ! For example, "add identity *!name@host" will automatically identify \ ! you when you're logged (you and anyone) with any nick, with name 'name', \ ! and server 'host', and "remove identity *!name@host" will remove it \ ! (unset would remove all identities). Another example is the command \ ! "set email my...@ex...", which will set your email, while \ ! "unset email" will unset it.\ ! """,)] class UserData: ! def __init__(self): hooks.register("Message", self.message) mm.register("getuserdata", self.mm_getuserdata) mm.register("setuserdata", self.mm_setuserdata) + mm.register("loggednick", self.mm_loggednick) + mm.register("islogged", self.mm_loggednick) + mm.register("isregistered", self.mm_isregistered) self.data = options.gethard("UserData.data", {}) ! self.type = options.getsoft("UserData.type", {}) ! self.type["password"] = "str" ! self.type["identity"] = "list" ! self.type["email"] = "str" ! ! self.login_timeout = config.getint("userdata", "login_timeout") ! self.last_cleanup = 0 ! ! self.logins = options.gethard("UserData.logins", {}) ! ! # ([un]register|ident[ify]) [with] [[nick] <nick> [and]] [password] <passwd> ! self.re1 = re.compile(r"(?P<cmd>(?:un)?register|ident(?:ify)?)\s+(?:with\s+)?(?:(?:nick\s+)?(?P<nick>\S+)\s+(?:and\s+)?)?(?:password\s+)?(?P<passwd>\S+)\s*[!.]?$", re.I) ! ! # (set|add) <type> <value> ! self.re2 = re.compile(r"(?P<cmd>set|add)\s+(?P<type>\S+)\s+(?P<value>.*?)\s*$", re.I) ! ! # unset <type>|remove <type> <value> ! self.re3 = re.compile(r"unset\s+(?P<type1>\S+)\s*|remove\s+(?P<type2>\S+)\s+(?P<value>.*?)\s*$", re.I) ! ! # unident[ify]|forget me ! self.re4 = re.compile(r"unident(?:ify)?|forget\s+me", re.I) ! ! # [un]register|identify ! mm.register_help(0, "(?:un)?register|ident(?:ify)?", HELP_REGISTER) ! ! # set|unset|add|remove ! mm.register_help(0, "set|unset|add|remove", HELP_SET) def unload(self): hooks.unregister("Message", self.message) mm.unregister("getuserdata") mm.unregister("setuserdata") + mm.unregister("loggednick") + mm.unregister("islogged") + + mm.unregister_help(0, HELP_REGISTER) + mm.unregister_help(0, HELP_SET) + + def logins_add(self, nick, servername, user): + keypair = (servername, user.string) + valuepair = (nick, int(time.time())) + self.logins[keypair] = valuepair + + def logins_maintain(self, msg): + keypair = (msg.server.servername, msg.user.string) + valuepair = self.logins.get(keypair) + curtime = time.time() + if valuepair: + nick, lasttime = valuepair + if lasttime < curtime-self.login_timeout: + del self.logins[keypair] + else: + self.logins[keypair] = (nick, curtime) + if self.last_cleanup < curtime-self.login_timeout: + self.last_cleanup = curtime + self.logins_cleanup() + + def logins_cleanup(self): + curtime = time.time() + for keypair in self.logins.keys(): + nick, lasttime = self.logins.get(keypair) + if lasttime < curtime-self.login_timeout: + del self.logins[keypair] def message(self, msg): ! self.logins_maintain(msg) ! ! if msg.forme: ! m = self.re1.match(msg.line) ! if m: ! cmd = m.group("cmd") ! passwd = m.group("passwd") ! nick = m.group("nick") or msg.user.nick ! curpass = self.mm_getuserdata(0, msg.server, nick, "password") ! if cmd == "register": ! if curpass: ! msg.answer("%:", ["Oops...", "Sorry!"], ! ["Nick", "This nick is"], ! "already registered", ["!", "."]) ! else: ! self.mm_setuserdata(0, msg.server, nick, ! "password", passwd) ! msg.answer("%:", ["Done", "Registered", "Sure", ! "No problems"], ["!", "."]) ! elif cmd == "unregister": ! if passwd != curpass: ! msg.answer("%:", ["Oops...", "Sorry!"], ! ["Wrong password", ! "This is not your password"], ! ["!", "."]) ! else: ! self.mm_unsetuserdata(0, msg.server, msg.user.nick) ! msg.answer("%:", ["Done", "Unregistered", "Sure", ! "No problems"], ["!", "."]) else: ! if passwd != curpass: ! msg.answer("%:", ["Oops...", "Sorry!"], ! ["Wrong password", ! "This is not your password"], ! ["!", "."]) ! else: ! msg.answer("%:", ["Welcome back", "Identified", ! "Sure", "No problems"], ! [".", "!"]) ! self.logins_add(nick, msg.server.servername, ! msg.user) return 0 ! ! m = self.re2.match(msg.line) ! if m: ! nick = self.mm_loggednick(0, msg.server.servername, msg.user) ! if not nick: ! msg.answer("%:", ["Identify yourself!", ! "Who are you?"]) ! return 0 ! type = m.group("type") ! value = m.group("value") ! append = m.group("cmd") != "set" ! datatype = self.type.get(type) ! if not datatype: ! msg.answer("%:", ["I don't know anything about '%s'!" % type, ! "What is '%s'?" % type, ! "I've never heard about '%s' before." % type]) else: ! self.mm_setuserdata(0, msg.server, nick, ! type, value, append=append) ! msg.answer("%:", ["Done", "Set", "Sure", "Of course", ! "Ok", "No problems"], ["!", "."]) return 0 + + m = self.re3.match(msg.line) + if m: + nick = self.mm_loggednick(0, msg.server.servername, msg.user) + if not nick: + msg.answer("%:", ["Identify yourself!", + "Who are you?"]) + return 0 + type = m.group("type1") or m.group("type2") + value = m.group("value") + if type == "password": + msg.answer("%:", ["Cannot unset password", + "Not for passwords", + "Oops.. no", "Heh"], [".", "!"]) + else: + self.mm_unsetuserdata(0, msg.server, nick, type, value) + msg.answer("%:", ["Done", "Unset", "Sure", "Of course", + "Ok", "No problems"], ["!", "."]) + return 0 + + m = self.re4.match(msg.line) + if m: + nick = self.mm_loggednick(0, msg.server.servername, msg.user) + if not nick: + msg.answer("%:", ["I don't even know who you are!", + "What are you talking about?"]) + else: + del self.logins[(msg.server.servername, msg.user.string)] + msg.answer("%:", ["Done", "Just forgot", "Sure", + "Right now", "Ok", "No problems"], + ["!", "."]) + return 0 + + def mm_loggednick(self, defret, servername, user): + valuepair = self.logins.get((servername, user.string)) + if valuepair: + nick, lasttime = valuepair + if lasttime > time.time()-self.login_timeout: + return nick + for pair in self.data: + if pair[0] == servername: + for ident in self.data[pair].get("identity", []): + if user.matchstr(ident): + nick = pair[1] + self.logins_add(nick, servername, user) + return nick + return None + + def mm_isregistered(self, defret, servername, nick): + return bool(self.data.get((servername, nick))) def mm_getuserdata(self, defret, server, nick, name): ! data = self.data.get((server.servername, nick)) ! if data: ! return data.get(name) ! return None ! def mm_setuserdata(self, defret, server, nick, name, value, append=0): ! tuple = (server.servername, nick) ! data = self.data.setdefault(tuple, {}) ! type = self.type.get(name) ! if type: ! if type == "list": ! if append and data.get(name): ! data[name].append(value) ! else: ! data[name] = [value] ! else: ! data[name] = value ! def mm_unsetuserdata(self, defret, server, nick, ! name=None, value=None, append=0): ! tuple = (server.servername, nick) ! if name is None: ! try: ! del self.data[tuple] ! except KeyError: ! pass else: ! data = self.data.setdefault(tuple, {}) ! if value is None: ! try: ! del data[name] ! except KeyError: ! pass ! if not data: ! del self.data[tuple] ! else: ! if self.type.get(name) == "list": ! try: ! data[name].remove(value) ! except ValueError: ! pass def __loadmodule__(bot): ! global mod ! mod = UserData() def __unloadmodule__(bot): ! global mod ! mod.unload() ! del mod # vim:ts=4:sw=4:et |
From: Gustavo N. <nie...@us...> - 2003-05-09 15:27:47
|
Update of /cvsroot/pybot/pybot/pybot In directory sc8-pr-cvs1:/tmp/cvs-serv11697/pybot Modified Files: misc.py Log Message: - modules/userdata.py,modules/permission.py: A much better userdata registry and permission system was developed. - misc.py: Increased maximum line size to 400 characters. - Miscelaneous bugfixes. Index: misc.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/misc.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** misc.py 4 Dec 2001 00:57:38 -0000 1.2 --- misc.py 9 May 2003 15:27:44 -0000 1.3 *************** *** 23,27 **** __all__ = ["buildanswer", "breakline"] ! MAXLINESIZE = 250 def buildanswer(pattern, target=None, nick=None): --- 23,27 ---- __all__ = ["buildanswer", "breakline"] ! MAXLINESIZE = 400 def buildanswer(pattern, target=None, nick=None): |
From: Gustavo N. <nie...@us...> - 2003-05-09 15:27:47
|
Update of /cvsroot/pybot/pybot In directory sc8-pr-cvs1:/tmp/cvs-serv11697 Modified Files: ChangeLog TODO pybot.conf Log Message: - modules/userdata.py,modules/permission.py: A much better userdata registry and permission system was developed. - misc.py: Increased maximum line size to 400 characters. - Miscelaneous bugfixes. Index: ChangeLog =================================================================== RCS file: /cvsroot/pybot/pybot/ChangeLog,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** ChangeLog 8 May 2003 19:11:33 -0000 1.10 --- ChangeLog 9 May 2003 15:27:43 -0000 1.11 *************** *** 1,2 **** --- 1,7 ---- + 2003-05-09 Gustavo Niemeyer <nie...@co...> + * modules/userdata.py,modules/permission.py: A much better userdata + registry and permission system was developed. + * misc.py: Increased maximum line size to 400 characters. + 2003-05-08 Gustavo Niemeyer <nie...@co...> * modules/xmlrpc.py: New xmlrpc module. Index: TODO =================================================================== RCS file: /cvsroot/pybot/pybot/TODO,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** TODO 5 May 2003 20:47:14 -0000 1.3 --- TODO 9 May 2003 15:27:43 -0000 1.4 *************** *** 14,21 **** the code. - - 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. --- 14,17 ---- Index: pybot.conf =================================================================== RCS file: /cvsroot/pybot/pybot/pybot.conf,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** pybot.conf 8 May 2003 19:11:34 -0000 1.4 --- pybot.conf 9 May 2003 15:27:43 -0000 1.5 *************** *** 9,12 **** --- 9,27 ---- ; ~/.pybot/config -> ~/.pybot/data/ + [permission] + ; This will tell pybot who should have unrestricted access to all + ; permissions. You should register the nicks you put here as soon as + ; possible (send "help register" to pybot for more information). + ; + ; After you have admin powers, you can also give others admin powers + ; on-the-fly, by giving the "admin" permission through the permission + ; system (send "help permission" to pybot for more information), or just + ; append an entry here and restart pybot. + admins = niemeyer@i.conectiva.com.br + + [userdata] + ; 30min + login_timeout = 1800 + [infopack] infopackdir = %(datadir)s/infopacks *************** *** 23,27 **** interval = 10 ! [plocks] dirpath = /cnc/distro/plocks/ --- 38,42 ---- interval = 10 ! [plock] dirpath = /cnc/distro/plocks/ |
From: Gustavo N. <nie...@us...> - 2003-05-08 19:11:37
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory sc8-pr-cvs1:/tmp/cvs-serv4664/pybot/modules Modified Files: freshmeat.py log.py modulecontrol.py plock.py Log Message: - Fixed bugs in the recently introduced functionality. - Made plock.py and freshmeat.py get configuration from the config file. Index: freshmeat.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/freshmeat.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** freshmeat.py 3 Apr 2002 23:32:06 -0000 1.4 --- freshmeat.py 8 May 2003 19:11:34 -0000 1.5 *************** *** 17,21 **** # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import mm, hooks, options, servers import urllib import thread --- 17,21 ---- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import mm, hooks, options, servers, config import urllib import thread *************** *** 30,40 **** """,)] - URL = "http://freshmeat.net/backend/recentnews.txt" - PROXY = None - # PROXY = {"http":"http://proxy.url.com:3128"} - FETCHINTERVAL = 10 - class Freshmeat: def __init__(self, bot): self.newslast = options.gethard("Freshmeat.newslast", [None]) self.newstargets = options.gethard("Freshmeat.newstargets", []) --- 30,41 ---- """,)] class Freshmeat: def __init__(self, bot): + self.url = config.get("freshmeat", "url") + if config.has_option("freshmeat", "proxy"): + self.proxy = config.get("freshmeat", "proxy") + else: + self.proxy = None + self.interval = config.getint("freshmeat", "interval") self.newslast = options.gethard("Freshmeat.newslast", [None]) self.newstargets = options.gethard("Freshmeat.newstargets", []) *************** *** 52,56 **** def unload(self): hooks.unregister("Message", self.message) ! mm.unhooktimer(0, FETCHINTERVAL*60, self.checknews, ()) mm.unregister_help(0, HELP) --- 53,57 ---- def unload(self): hooks.unregister("Message", self.message) ! mm.unhooktimer(0, self.interval*60, self.checknews, ()) mm.unregister_help(0, HELP) *************** *** 74,81 **** def fetchnews(self): urlopener = urllib.URLopener() ! if PROXY: ! urlopener.proxies.update(PROXY) try: ! url = urlopener.open(URL) except: pass --- 75,83 ---- def fetchnews(self): urlopener = urllib.URLopener() ! if self.proxy: ! proxy = {"http": self.proxy} ! urlopener.proxies.update(proxy) try: ! url = urlopener.open(self.url) except: pass Index: log.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/log.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** log.py 8 May 2003 18:30:59 -0000 1.6 --- log.py 8 May 2003 19:11:34 -0000 1.7 *************** *** 38,42 **** class LogMsg: ! def __init__(self, data) self.time = int(data.time) self.servername = data.servername --- 38,42 ---- class LogMsg: ! def __init__(self, data): self.time = int(data.time) self.servername = data.servername *************** *** 107,111 **** l = [] cursor = db.cursor() ! cursor.execute("select * from log where src != '' and dest != ''") row = cursor.fetchone() while row: --- 107,112 ---- l = [] cursor = db.cursor() ! cursor.execute("select * from log where src != '' and dest != '' " ! "order by timestamp desc") row = cursor.fetchone() while row: *************** *** 196,200 **** else: target = msg.target ! self.log.append(msg.server.servername, "MESSAGE", msg.user.nick(), msg.user.string, target, msg.rawline) --- 197,201 ---- else: target = msg.target ! self.log.append(msg.server.servername, "MESSAGE", msg.user.nick, msg.user.string, target, msg.rawline) *************** *** 205,209 **** else: target = msg.target ! self.log.append(msg.server.servername, "ACTION", msg.user.nick(), msg.user.string, target, msg.rawline) --- 206,210 ---- else: target = msg.target ! self.log.append(msg.server.servername, "ACTION", msg.user.nick, msg.user.string, target, msg.rawline) Index: modulecontrol.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/modulecontrol.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** modulecontrol.py 8 May 2003 18:30:59 -0000 1.4 --- modulecontrol.py 8 May 2003 19:11:34 -0000 1.5 *************** *** 89,93 **** msg.answer("%:", ["There are no", "No"], "loaded modules", [".", "!"]) else: ! msg.answer("%:", ["These are the loaded modules:", "The following modules are loaded:", ", ".join(self.modules)) else: msg.answer("%:", ["You're not that good", "You are not able to work with modules", "No, you can't do this"], [".", "!",". I'm sorry!"]) --- 89,93 ---- msg.answer("%:", ["There are no", "No"], "loaded modules", [".", "!"]) else: ! msg.answer("%:", ["These are the loaded modules:", "The following modules are loaded:"], ", ".join(self.modules)) else: msg.answer("%:", ["You're not that good", "You are not able to work with modules", "No, you can't do this"], [".", "!",". I'm sorry!"]) Index: plock.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/plock.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** plock.py 19 Mar 2002 18:32:06 -0000 1.5 --- plock.py 8 May 2003 19:11:34 -0000 1.6 *************** *** 17,21 **** # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import mm, hooks, options import time import sys --- 17,21 ---- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import mm, hooks, options, config import time import sys *************** *** 37,41 **** def __init__(self, dir, name): self.name = name ! self.file = dir + name self.line = None self.isfile = os.path.isfile(self.file) --- 37,41 ---- def __init__(self, dir, name): self.name = name ! self.file = os.path.join(dir, name) self.line = None self.isfile = os.path.isfile(self.file) *************** *** 64,85 **** class PLock: def __init__(self, bot): ! self.pdir = "/cnc/distro/locks/" hooks.register("Message", self.message) options.gethard("UserData.type", {}).setdefault("email", "~") # Match '[force] plock <package> [,<package>] [!|.]' ! self.re1 = re.compile(r"(?P<force>force\s+)?plock\s+(?P<package>[\w_-]+(?:(?:\s*,?\s*and\s+|[, ]+)[\w_-]+)*)\s*[!.]*$") # Match '[force] (unplock|punlock) <package> [,<package>] [!|.]' ! self.re2 = re.compile(r"(?P<force>force\s+)?(?:unplock|punlock)\s+(?P<package>[\w_-]+(?:(?:\s*,?\s*and\s+|[, ]+)[\w_-]+)*)\s*[!.]*$") # Match '(my plocks|plocks of <user>) [?]' ! self.re3 = re.compile(r"(?:(?P<my>my)\s+plocks|plocks\s+of\s+(?P<user>[\w.@_-]+))\s*(?:!*\?[?!]*)?$") # Match '([who] [has] plocked|plocker [of]) <package> [,<package>] [?]' ! self.re4 = re.compile(r"(?:(?:who\s+)?(?:has\s+)plocked|plocker\s+(?:of\s+)?)(?P<package>[\w_-]+(?:(?:\s*,?\s*and\s+|[, ]+)[\w_-]+)*)\s*(?:!*\?[?!]*)?$") # Match 'plock <package> [,<package>] ?' ! self.re5 = re.compile(r"plock\s+(?P<package>[\w_-]+(?:(?:\s*,?\s*and\s+|[, ]+)[\w_-]+)*)\s*(?:!*\?[?!]*)$") # Match '[un]plock[ing] | <package|pkg> lock[ing] --- 64,85 ---- class PLock: def __init__(self, bot): ! self.pdir = config.get("plock", "dirpath") hooks.register("Message", self.message) options.gethard("UserData.type", {}).setdefault("email", "~") # Match '[force] plock <package> [,<package>] [!|.]' ! self.re1 = re.compile(r"(?P<force>force\s+)?plock\s+(?P<package>[\w_\.-]+(?:(?:\s*,?\s*and\s+|[, ]+)[\w_\.-]+)*)\s*[!.]*$") # Match '[force] (unplock|punlock) <package> [,<package>] [!|.]' ! self.re2 = re.compile(r"(?P<force>force\s+)?(?:unplock|punlock)\s+(?P<package>[\w_\.-]+(?:(?:\s*,?\s*and\s+|[, ]+)[\w_\.-]+)*)\s*[!.]*$") # Match '(my plocks|plocks of <user>) [?]' ! self.re3 = re.compile(r"(?:(?P<my>my)\s+plocks|plocks\s+of\s+(?P<user>[\w\.@_-]+))\s*(?:!*\?[?!]*)?$") # Match '([who] [has] plocked|plocker [of]) <package> [,<package>] [?]' ! self.re4 = re.compile(r"(?:(?:who\s+)?(?:has\s+)plocked|plocker\s+(?:of\s+)?)(?P<package>[\w_\.-]+(?:(?:\s*,?\s*and\s+|[, ]+)[\w_\.-]+)*)\s*(?:!*\?[?!]*)?$") # Match 'plock <package> [,<package>] ?' ! self.re5 = re.compile(r"plock\s+(?P<package>[\w_\.-]+(?:(?:\s*,?\s*and\s+|[, ]+)[\w_\.-]+)*)\s*(?:!*\?[?!]*)$") # Match '[un]plock[ing] | <package|pkg> lock[ing] |
From: Gustavo N. <nie...@us...> - 2003-05-08 19:11:37
|
Update of /cvsroot/pybot/pybot/pybot In directory sc8-pr-cvs1:/tmp/cvs-serv4664/pybot Modified Files: __init__.py sqlitedb.py Log Message: - Fixed bugs in the recently introduced functionality. - Made plock.py and freshmeat.py get configuration from the config file. Index: __init__.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/__init__.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** __init__.py 8 May 2003 18:30:59 -0000 1.4 --- __init__.py 8 May 2003 19:11:34 -0000 1.5 *************** *** 41,55 **** defaults = config.defaults() - db = SQLiteDB() - 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() --- 41,55 ---- 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/config")): ! config.read(os.path.expanduser("~/.pybot/config")) defaults["datadir"] = os.path.expanduser("~/.pybot/data") elif os.path.isfile("/etc/pybot.conf"): config.read("/etc/pybot.conf") ! defaults["datadir"] = ("/var/lib/pybot") ! ! db = SQLiteDB() main = Main() Index: sqlitedb.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/sqlitedb.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** sqlitedb.py 8 May 2003 18:30:59 -0000 1.1 --- sqlitedb.py 8 May 2003 19:11:34 -0000 1.2 *************** *** 17,26 **** # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import config import sqlite class SQLiteDB: def __init__(self): ! self._path = config.get("sqlite", "path") self._conn = sqlite.connect(self._path) self._conn.autocommit = 1 --- 17,26 ---- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! import pybot import sqlite class SQLiteDB: def __init__(self): ! self._path = pybot.config.get("sqlite", "path") self._conn = sqlite.connect(self._path) self._conn.autocommit = 1 |
From: Gustavo N. <nie...@us...> - 2003-05-08 19:11:37
|
Update of /cvsroot/pybot/pybot In directory sc8-pr-cvs1:/tmp/cvs-serv4664 Modified Files: ChangeLog pybot.conf pybot.py Log Message: - Fixed bugs in the recently introduced functionality. - Made plock.py and freshmeat.py get configuration from the config file. Index: ChangeLog =================================================================== RCS file: /cvsroot/pybot/pybot/ChangeLog,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** ChangeLog 8 May 2003 18:30:59 -0000 1.9 --- ChangeLog 8 May 2003 19:11:33 -0000 1.10 *************** *** 10,13 **** --- 10,15 ---- * modules/modulecontrol.py: Adopted re system, and added a command to show loaded modules. + * modules/{freshmeat.py,plock.py}: Get static configuration from + config file. 2002-06-19 Gustavo Niemeyer <nie...@co...> Index: pybot.conf =================================================================== RCS file: /cvsroot/pybot/pybot/pybot.conf,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** pybot.conf 8 May 2003 18:30:59 -0000 1.3 --- pybot.conf 8 May 2003 19:11:34 -0000 1.4 *************** *** 1,3 **** ! [DEFAULT] [infopack] --- 1,11 ---- ! ; In this file are maintained the static configurations of pybot. ! ; ! ; %(datadir)s is dependent on the path pybot.conf is found: ! ; ! ; pybot.conf %(datadir)s ! ; --------------- -------------- ! ; /etc/pybot.conf -> /var/lib/pybot/ ! ; ./pybot.conf -> ./data/ ! ; ~/.pybot/config -> ~/.pybot/data/ [infopack] *************** *** 8,10 **** [sqlite] ! logfile = %(datadir)s/sqlite.db --- 16,28 ---- [sqlite] ! path = %(datadir)s/sqlite.db ! ! [freshmeat] ! url = http://freshmeat.net/backend/recentnews.txt ! proxy = http://proxy.conectiva:3128 ! interval = 10 ! ! [plocks] ! dirpath = /cnc/distro/plocks/ ! ! ; vim:ft=dosini Index: pybot.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** pybot.py 4 Dec 2001 00:57:37 -0000 1.1 --- pybot.py 8 May 2003 19:11:34 -0000 1.2 *************** *** 22,25 **** --- 22,26 ---- import sys import os + import time def main(): *************** *** 33,36 **** --- 34,38 ---- if ret != 0: break + time.sleep(5) if __name__ == "__main__": |
From: Gustavo N. <nie...@us...> - 2003-05-08 18:31:03
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory sc8-pr-cvs1:/tmp/cvs-serv15913/pybot/modules Modified Files: log.py modulecontrol.py Log Message: - New xmlrpc module. - New testadora module, supporting compile time command, for now. This is useful for Conectiva only. - Accept "(remove|delete|del) permission" as well. - Implemented sqlite db storage. - Use sqlite storage to maintain logs. - Adopted re system, and added a command to show loaded modules. Index: log.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/log.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** log.py 20 Jun 2002 17:37:16 -0000 1.5 --- log.py 8 May 2003 18:30:59 -0000 1.6 *************** *** 17,21 **** # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import config, options, hooks, mm, servers from pybot.user import User import time --- 17,21 ---- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import config, options, hooks, mm, servers, db from pybot.user import User import time *************** *** 38,49 **** 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() --- 38,49 ---- class LogMsg: ! def __init__(self, data) ! self.time = int(data.time) ! self.servername = data.servername ! self.type = data.type ! self.src = data.src ! self.dest = data.dest ! self.line = data.line ! def __str__(self): src = User() *************** *** 66,114 **** return s 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() 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, 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 == "-": ! continue ! 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 --- 66,122 ---- return s + STRIPNICK = re.compile(r"^[\W_]*([^\W_]+)[\W_]*$") class Log: def __init__(self): ! self.create_database() ! def create_database(self): ! cursor = db.cursor() ! try: ! cursor.execute("create table log " ! "(timestamp, servername, type," ! " nick, src, dest, line)") ! except db.error: ! pass ! ! def xformnick(self, nick): ! return STRIPNICK.sub(r"\1", nick.lower()) ! ! def append(self, servername, type, nick, src, dest, line): ! nick = self.xformnick(nick) ! cursor = db.cursor() ! values = (int(time.time()), servername, type, nick, src, dest, line) ! places = ','.join(['%s']*len(values)) ! cursor.execute("insert into log values (%s)" % places, values) def seen(self, nick): ! nick = self.xformnick(nick) ! cursor = db.cursor() ! cursor.execute("select * from log where nick=%s and src != '' " ! "and dest != '' order by timestamp desc limit 1", ! (nick,)) ! row = cursor.fetchone() ! if row: ! return LogMsg(row) ! return None def search(self, regexp, max, searchline): p = re.compile(regexp, re.I) ! file = open(self.logname) l = [] ! cursor = db.cursor() ! cursor.execute("select * from log where src != '' and dest != ''") ! row = cursor.fetchone() ! while row: ! if p.search(row.line): ! l.append(LogMsg(row)) if len(l) > max+1: l.pop(0) + row = cursor.fetchone() if l and l[-1].line == searchline: l.pop() elif len(l) > max: l.pop(0) return l *************** *** 184,214 **** 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 --- 192,228 ---- def log_message(self, msg): ! if msg.direct: ! target = "" ! else: ! target = msg.target ! self.log.append(msg.server.servername, "MESSAGE", msg.user.nick(), ! msg.user.string, target, msg.rawline) def log_ctcp(self, msg): if msg.ctcp == "ACTION": ! if msg.direct: ! target = "" ! else: ! target = msg.target ! self.log.append(msg.server.servername, "ACTION", msg.user.nick(), ! 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 mod ! mod = LogModule() def __unloadmodule__(bot): ! global mod ! mod.unload() ! del mod # vim:ts=4:sw=4:et Index: modulecontrol.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/modulecontrol.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** modulecontrol.py 4 Dec 2001 00:57:38 -0000 1.3 --- modulecontrol.py 8 May 2003 18:30:59 -0000 1.4 *************** *** 1,3 **** ! # Copyright (c) 2000-2001 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. --- 1,3 ---- ! # Copyright (c) 2000-2002 Gustavo Niemeyer <nie...@co...> # # This file is part of pybot. *************** *** 18,21 **** --- 18,29 ---- from pybot import mm, hooks, options, modls + import re + + HELP = [ + ("""\ + You can load, unload, and reload modules with "[re|un]load module <module>". \ + I can also show you which modules are loaded at the moment with "show \ + [loaded] modules".\ + """,)] class ModuleControl: *************** *** 24,27 **** --- 32,44 ---- hooks.register("Message", self.message) modls.loadlist(self.modules) + + # Match '[re|un]load [the] [module] <module>' + self.re1 = re.compile("(?P<command>(?:re|un)?load)(?:\s+the)?(?:\s+module)?\s+(?P<module>[\w_-]+)\s*[.!]*$", re.I) + + # Match '(show|list) [loaded] modules' + self.re2 = re.compile("(?:show|list)(?:\s+loaded)\s+modules\s*[.!]*$", re.I) + + # Match '[[un|re]load] module[s]' + mm.register_help(0, "(?:(?:un|re)?load\s+)?modules?", HELP) def unload(self): *************** *** 30,77 **** def message(self, msg): var = [] ! if msg.match(var, 1, "%", "reload", [(["the", None], "module"), None], 0, "~", [".", "!", None]): ! if mm.hasperm(1, msg.server.servername, msg.target, msg.user, None): ! if modls.isloaded(var[0]): ! if modls.reload(var[0]): ! msg.answer("%:", ["Reloaded", "Done", "Ready"], ["!", ", sir!"]) ! else: ! # If it was able to unload, remove it from our list. ! if not modls.isloaded(var[0]): ! self.modules.remove(var[0]) ! msg.answer("%:", ["Something wrong happened while", "Something bad happened while", "There was a problem"], "reloading the module", ["!", "."]) ! else: ! msg.answer("%:", ["Sorry sir, but", "Sir,", "Oops, I think that"], "this module is not loaded.") ! else: ! msg.answer("%:", ["You're not that good", "You are not able to reload modules", "No, you can't do this"], [".", "!",". I'm sorry!"]) ! return 0 ! elif msg.match(var, 1, "%", "load", [(["the", None], "module"), None], 0, "~", [".", "!", None]): ! if mm.hasperm(1, msg.server.servername, msg.target, msg.user, None): ! if not modls.isloaded(var[0]): ! if modls.load(var[0]): ! self.modules.append(var[0]) ! msg.answer("%:", ["Loaded", "Done", "Ready"], ["!", "."]) else: ! msg.answer("%:", ["Something wrong happened while", "Something bad happened while", "There was a problem"], "loading the module", ["!", "."]) ! else: ! msg.answer("%:", ["Sorry sir, but", "Sir,", "Oops, I think that"], "this module is already loaded.") ! else: ! msg.answer("%:", ["You're not that good", "You are not able to load modules", "No, you can't do this"], [".", "!",". I'm sorry!"]) ! return 0 ! elif msg.match(var, 1, "%", "unload", [(["the", None], "module"), None], 0, "~", [".", "!", None]): ! if mm.hasperm(1, msg.server.servername, msg.target, msg.user, None): ! if modls.isloaded(var[0]): ! if var[0] in self.modules: ! self.modules.remove(var[0]) ! if modls.unload(var[0]): ! msg.answer("%:", ["Unloaded", "Done", "Ready"], ["!", "."]) else: ! msg.answer("%:", ["Something wrong happened while", "Something bad happened while", "There was a problem"], "unloading the module", ["!", "."]) else: ! msg.answer("%:", ["Sorry, but", "Oops, I think that"], "this module can't be unloaded.") else: ! msg.answer("%:", ["Sorry, but", "Oops, I think that"], "this module is not loaded.") ! else: ! msg.answer("%:", ["You're not that good", "You are not able to unload modules", "No, you can't do this"], [".", "!",". I'm sorry!"]) ! return 0 def __loadmodule__(bot): --- 47,96 ---- def message(self, msg): var = [] ! if msg.forme: ! m = self.re1.match(msg.line) ! if m: ! if mm.hasperm(1, msg.server.servername, msg.target, msg.user, None): ! command, module = m.group("command", "module") ! isloaded = modls.isloaded(module) ! if command == "load" and isloaded: ! msg.answer("%:", ["Sorry sir, but", "Sir,", "Oops, I think that"], "this module is already loaded.") ! elif not isloaded: ! msg.answer("%:", ["Sorry sir, but", "Sir,", "Oops, I think that"], "this module is not loaded.") ! elif command == "load": ! if modls.load(module): ! self.modules.append(module) ! msg.answer("%:", ["Loaded", "Done", "Ready"], ["!", "."]) ! else: ! msg.answer("%:", ["Something wrong happened while", "Something bad happened while", "There was a problem"], "loading the module", ["!", "."]) ! elif command == "reload": ! if modls.reload(module): ! msg.answer("%:", ["Reloaded", "Done", "Ready"], ["!", ", sir!"]) ! else: ! if not modls.isloaded(module): ! self.modules.remove(module) ! msg.answer("%:", ["Something wrong happened while", "Something bad happened while", "There was a problem"], "reloading the module", ["!", "."]) else: ! if module in self.modules: ! self.modules.remove(module) ! if modls.unload(module): ! msg.answer("%:", ["Unloaded", "Done", "Ready"], ["!", "."]) ! else: ! msg.answer("%:", ["Something wrong happened while", "Something bad happened while", "There was a problem"], "unloading the module", ["!", "."]) else: ! msg.answer("%:", ["Sorry, but", "Oops, I think that"], "this module can't be unloaded.") ! else: ! msg.answer("%:", ["You're not that good", "You are not able to work with modules", "No, you can't do this"], [".", "!",". I'm sorry!"]) ! return 0 ! ! m = self.re2.match(msg.line) ! if m: ! if mm.hasperm(1, msg.server.servername, msg.target, msg.user, None): ! if not self.modules: ! msg.answer("%:", ["There are no", "No"], "loaded modules", [".", "!"]) else: ! msg.answer("%:", ["These are the loaded modules:", "The following modules are loaded:", ", ".join(self.modules)) else: ! msg.answer("%:", ["You're not that good", "You are not able to work with modules", "No, you can't do this"], [".", "!",". I'm sorry!"]) ! return 0 def __loadmodule__(bot): |
From: Gustavo N. <nie...@us...> - 2003-05-08 18:31:03
|
Update of /cvsroot/pybot/pybot In directory sc8-pr-cvs1:/tmp/cvs-serv15913 Modified Files: ChangeLog pybot.conf Log Message: - New xmlrpc module. - New testadora module, supporting compile time command, for now. This is useful for Conectiva only. - Accept "(remove|delete|del) permission" as well. - Implemented sqlite db storage. - Use sqlite storage to maintain logs. - Adopted re system, and added a command to show loaded modules. Index: ChangeLog =================================================================== RCS file: /cvsroot/pybot/pybot/ChangeLog,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** ChangeLog 8 May 2003 16:50:56 -0000 1.8 --- ChangeLog 8 May 2003 18:30:59 -0000 1.9 *************** *** 6,9 **** --- 6,13 ---- * modules/permission.py: Accept "(remove|delete|del) permission" as well. + * sqlitedb.py,__init__.py: Implemented sqlite db storage. + * modules/log.py: Use sqlite storage to maintain logs. + * modules/modulecontrol.py: Adopted re system, and added a command + to show loaded modules. 2002-06-19 Gustavo Niemeyer <nie...@co...> Index: pybot.conf =================================================================== RCS file: /cvsroot/pybot/pybot/pybot.conf,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** pybot.conf 19 Jun 2002 20:05:37 -0000 1.2 --- pybot.conf 8 May 2003 18:30:59 -0000 1.3 *************** *** 4,7 **** infopackdir = %(datadir)s/infopacks ! [log] ! logfile = %(datadir)s/logs/pybot.log --- 4,10 ---- infopackdir = %(datadir)s/infopacks ! [testadora] ! mondir = /cnc/testadora/mon ! ! [sqlite] ! logfile = %(datadir)s/sqlite.db |
From: Gustavo N. <nie...@us...> - 2003-05-08 18:31:03
|
Update of /cvsroot/pybot/pybot/pybot In directory sc8-pr-cvs1:/tmp/cvs-serv15913/pybot Modified Files: __init__.py Added Files: sqlitedb.py Log Message: - New xmlrpc module. - New testadora module, supporting compile time command, for now. This is useful for Conectiva only. - Accept "(remove|delete|del) permission" as well. - Implemented sqlite db storage. - Use sqlite storage to maintain logs. - Adopted re system, and added a command to show loaded modules. --- NEW FILE: sqlitedb.py --- # 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 from pybot import config import sqlite class SQLiteDB: def __init__(self): self._path = config.get("sqlite", "path") self._conn = sqlite.connect(self._path) self._conn.autocommit = 1 self.error = sqlite.DatabaseError def cursor(self): return self._conn.cursor() # vim:ts=4:sw=4:et Index: __init__.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/__init__.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** __init__.py 5 May 2003 20:47:18 -0000 1.3 --- __init__.py 8 May 2003 18:30:59 -0000 1.4 *************** *** 23,31 **** from pybot.hook import Hooks from pybot.main import Main from ConfigParser import ConfigParser import os ! global main, modls, servers, options, hooks, mm, rm, config hooks = Hooks() --- 23,32 ---- from pybot.hook import Hooks from pybot.main import Main + from pybot.sqlitedb import SQLiteDB from ConfigParser import ConfigParser import os ! global main, modls, servers, options, hooks, mm, rm, config, db hooks = Hooks() *************** *** 39,42 **** --- 40,45 ---- config = ConfigParser() defaults = config.defaults() + + db = SQLiteDB() if os.path.isfile("./pybot.conf") and os.path.isdir("pybot"): |
From: Gustavo N. <nie...@us...> - 2003-05-08 16:50:59
|
Update of /cvsroot/pybot/pybot In directory sc8-pr-cvs1:/tmp/cvs-serv3192 Modified Files: ChangeLog Log Message: Updated. Index: ChangeLog =================================================================== RCS file: /cvsroot/pybot/pybot/ChangeLog,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** ChangeLog 20 Jun 2002 01:17:47 -0000 1.7 --- ChangeLog 8 May 2003 16:50:56 -0000 1.8 *************** *** 1,2 **** --- 1,10 ---- + 2003-05-08 Gustavo Niemeyer <nie...@co...> + * modules/xmlrpc.py: New xmlrpc module. + * modules/testadora.py: New testadora module, supporting + compile time command, for now. This is useful for Conectiva + only. + * modules/permission.py: Accept "(remove|delete|del) permission" + as well. + 2002-06-19 Gustavo Niemeyer <nie...@co...> * scripts/pybotsetup.py: Adopted new admin permission working. |
From: Gustavo N. <nie...@us...> - 2003-05-08 16:43:32
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory sc8-pr-cvs1:/tmp/cvs-serv30692 Modified Files: permission.py Added Files: testadora.py Log Message: - New testadora module, supporting compile time command, for now. - Accept "(remove|delete|del) permission" as well. --- NEW FILE: testadora.py --- # 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 from pybot import mm, hooks, config from string import join import re import os HELP_COMPILETIME = [ ("""\ You can verify the compile time for a given package in testadora \ using "[show] (compiletime|compile time) [for] <package>".\ """,)] HELP_TESTADORA = [ ("""\ Use "help compile time" to get help on the available testadora commands.\ """,)] class Testadora: def __init__(self): self.mondir = config.get("testadora", "mondir") hooks.register("Message", self.message) # [show] (compiletime|compile time) [for] <package> self.re1 = re.compile(r"(?:show\s+)?compile\s*time\s+(?:for\s+)?(?P<package>\S+)$") # (compiletime|compile time) mm.register_help(0, "compile\s*time", HELP_COMPILETIME) # testadora mm.register_help(0, "testadora", HELP_TESTADORA) def unload(self): hooks.unregister("Message", self.message) mm.unregister_help(0, HELP_COMPILETIME) mm.unregister_help(0, HELP_TESTADORA) def get_compiletime(self, package): file = open(os.path.join(self.mondir, "timelog.txt")) for line in file.readlines(): tokens = line.split() if len(tokens) > 1 and tokens[1] == package: try: return int(tokens[0]) except ValueError: pass return None def delta_string(self, seconds): field = ["year","month","day","hour","minute","second"] fieldsize = [31536000, 2592000, 86400, 3600, 60, 1] fieldvalue = [0]*6 for n in range(6): fieldvalue[n] = seconds/fieldsize[n] seconds -= fieldvalue[n]*fieldsize[n] assert seconds == 0 str = "" for n in range(6): value = fieldvalue[n] if value: s = (value > 1) and "s" or "" if str: str += ", " if not filter(bool, fieldvalue[n+1:]): str += "and " str += "%d %s%s" % (value, field[n], s) return str 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, "compiletime"): try: seconds = self.get_compiletime(m.group("package")) except IOError: msg.answer("%", "Couldn't open data file.") if not seconds: msg.answer("%", "No time information for that package.") else: str = self.delta_string(seconds) msg.answer("%", ["The %s package compiles in" % m.group("package"), "This package compiles in", "The compile time for that package is"], str, [".", "!"]) else: msg.answer("%", ["Sorry, but you", "No! You"], ["can't verify compile times", "are not able to check compile times", "will have to check this by yourself"], [".", "!"]) return 0 def __loadmodule__(bot): global mod mod = Testadora() def __unloadmodule__(bot): global mod mod.unload() del mod # vim:ts=4:sw=4:et Index: permission.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/permission.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** permission.py 20 Jun 2002 01:17:48 -0000 1.4 --- permission.py 8 May 2003 16:43:29 -0000 1.5 *************** *** 46,51 **** 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>]' --- 46,51 ---- hooks.register("Message", self.message) ! # Matches '(give|remove|del|delete|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|remove|del|delete|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>]' |
From: Gustavo N. <nie...@us...> - 2003-05-05 20:47:52
|
Update of /cvsroot/pybot/pybot In directory sc8-pr-cvs1:/tmp/cvs-serv17260 Modified Files: TODO Log Message: Created xmlrpc module, including xmlrpc support for pybot. Index: TODO =================================================================== RCS file: /cvsroot/pybot/pybot/TODO,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** TODO 3 Apr 2002 23:08:54 -0000 1.2 --- TODO 5 May 2003 20:47:14 -0000 1.3 *************** *** 19,20 **** --- 19,23 ---- - Develop a README explaining how to do the basic setup of pybot. + + - Remove the parameter from __loadmodule() and __unloadmodule__(), and convert + them to use a general "mod" name for the instance. |
From: Gustavo N. <nie...@us...> - 2003-05-05 20:47:27
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory sc8-pr-cvs1:/tmp/cvs-serv17260/pybot/modules Modified Files: soap.py Added Files: xmlrpc.py Log Message: Created xmlrpc module, including xmlrpc support for pybot. --- NEW FILE: xmlrpc.py --- # 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 from pybot import hooks, mm, rm, options, servers from SimpleXMLRPCServer import SimpleXMLRPCServer from types import StringType import xmlrpclib import traceback import re HELP = [ ("""\ The xmlrpc service is based on method names and permissions. If you \ want to allow a given user to run a method, first you must create \ a xmlrpc user for him, with "(add|create) xmlrpc user <username> \ with pass[word] <password>".\ """,), ("""\ Then, you can give or remove permissions for that user with \ "[don't|do not] allow xmlrpc (func[tion]|method) <func> [(to|for) user \ <xmlrpcuser>] [(to|for|on|at) [user|channel] <target>] [[and] [on|at] \ server <server>]".\ """,), ("""\ To remove a given xmlrpc user, just use "(del[ete]|remove) xmlrpc \ user <user>".\ """,)] class XmlRpcObject: def __init__(self, funcs, hasperm): self.__funcs = funcs self.__hasperm = hasperm def _dispatch(self, name, args): func = self.__funcs.get(name) if not func: return xmlrpclib.Fault(2, "no such method") auth = args[0] if type(auth) is not dict: return xmlrpclib.Fault(1, "invalid authorization") try: if self.__hasperm(name, auth): ret = func(*args) if ret is None: ret = 0 return ret else: return xmlrpclib.Fault(3, "method not allowed") except: traceback.print_exc() return xmlrpclib.Fault(4, "pybot error") class XmlRpc: def __init__(self, bot): self.user = options.gethard("XmlRpc.users", {}) self.perm = options.gethard("XmlRpc.permissions", {}) self.server = SimpleXMLRPCServer(("0.0.0.0", 8460)) self.server.socket.setblocking(0) rm.register("sendmsg", self.rm_sendmsg) xro = XmlRpcObject(rm.get_methods(), self.hasperm) self.server.register_instance(xro) hooks.register("Message", self.message) hooks.register("Loop", self.loop) # (add|create) xmlrpc user <user> with [pass|password] <passwd> [!.] self.re1 = re.compile(r"(?:add|create)\s+xmlrpc\s+user\s+(?P<user>\S+)\s+with\s+(?:password|pass)\s+(?P<passwd>\S+)\s*[.!]*$") # (del|delete|remove) xmlrpc user <user> self.re2 = re.compile(r"(?:del|delete|remove)\s+xmlrpc\s+user\s+(?P<user>\S+)\s*[.!]*$") # [don[']t|do not] allow xmlrpc (func[tion]|method) <func> [(to|for) user <user>] [(to|for|on|at) [user|channel] <target>] [[and] [on|at] server <server>] self.re3 = re.compile(r"(?P<dont>don'?t\s+|do not\s+)?allow\s+xmlrpc\s+(?:func(?:tion)?|method)\s+(?P<func>\S+)(?:\s+(?:to\s+|for\s+)user\s+(?P<user>\S+))?(?:\s+(?:to|for|on|at)\s+(?:user\s+|channel\s+)?(?P<target>\S+))?(?:\s+(?:and\s+)?(?:on\s+|at\s+)?server\s+(?P<server>\S+))?\s*[.!]*$") # xmlrpc mm.register_help(0, "xmlrpc", HELP) def unload(self): hooks.unregister("Message", self.message) hooks.unregister("Loop", self.loop) self.server.server_close() rm.unregister("sendmsg") mm.unregister_help(0, HELP) def loop(self): self.server.handle_request() 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, "xmlrpc"): user = m.group("user") if self.user.has_key(user): msg.answer("%:", ["I can't do this!", "Sorry!"], ["This user already exists", "This user is already registered"], [".", "!"]) else: self.user[user] = m.group("passwd") msg.answer("%:", ["User added", "Ok", "User created", "Done"], [".", "!"]) else: msg.answer("%:", ["Sorry, you", "You"], ["can't add xmlrpc users.", "don't have this power."]) return 0 m = self.re2.match(msg.line) if m: if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "xmlrpc"): try: del self.user[m.group("user")] except KeyError: msg.answer("%:", ["Oops!", "Sorry!"], ["There's no such user", "I haven't found this user"], [".", "!"]) else: msg.answer("%:", ["User removed", "No problems", "User deleted", "Done"], [".", "!"]) else: msg.answer("%:", ["Sorry, you", "You"], ["can't add xmlrpc users.", "don't have this power."]) return 0 m = self.re3.match(msg.line) if m: if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "xmlrpc"): func = m.group("func") tuple = (m.group("user"), m.group("server"), m.group("target")) if m.group("dont"): try: funcperm = self.perm[func] funcperm.index(tuple) except (KeyError, ValueError): msg.answer("%:", ["Sorry!", "Oops!", "Can't do this!"], ["Nobody has this permission", "This permission doesn't exist"], [".", "!"]) else: funcperm.remove(tuple) if not funcperm: del self.perm[func] msg.answer("%:", ["Ok", "No problems", "Right now", "Permission removed"], [".", "!"]) else: funcperm = self.perm.setdefault(func, []) try: funcperm.index(tuple) except ValueError: funcperm.append(tuple) msg.answer("%:", ["Ok", "No problems", "Right now"], [".", "!"]) else: msg.answer("%:", ["Oops!", "It's not necessary!", "I don't have to!"], "This permission already exists", [".", "!"]) else: msg.answer("%:", ["Sorry, you", "You"], ["can't work with xmlrpc permissions.", "don't have this power."]) return 0 def hasperm(self, funcname, auth): user = auth.get("username") passwd = auth.get("password") server = auth.get("server") target = auth.get("target") if passwd == self.user.get(user): funcperm = self.perm.get(funcname, []) for _user, _server, _target in funcperm: if (not _user or user == _user) and \ (not _server or not server or _server == server) and \ (not _target or not target or _target == target): return 1 def rm_sendmsg(self, auth, msg, notice=0, ctcp=None): server = servers.get(auth["server"]) if server: if type(msg) == StringType: server.sendmsg(auth["target"], None, msg, notice=notice, ctcp=ctcp) else: server.sendmsg(auth["target"], None, notice=notice, ctcp=ctcp, *msg) def __loadmodule__(bot): global mod mod = XmlRpc(bot) def __unloadmodule__(bot): global mod mod.unload() del mod # vim:ts=4:sw=4:et Index: soap.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/soap.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** soap.py 4 Dec 2001 00:57:38 -0000 1.2 --- soap.py 5 May 2003 20:47:23 -0000 1.3 *************** *** 17,21 **** # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import hooks, mm, sm, options, servers from inspect import ismethod, getargspec import pybot.util.SOAP as SOAP --- 17,21 ---- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! from pybot import hooks, mm, rm, options, servers from inspect import ismethod, getargspec import pybot.util.SOAP as SOAP *************** *** 74,80 **** self.server = SOAP.SOAPServer(("0.0.0.0", 8450)) ! sm.register("sendmsg", self.sm_sendmsg) ! so = SoapObject(sm.get_methods(), self.hasperm) self.server.registerObject(so) --- 74,80 ---- self.server = SOAP.SOAPServer(("0.0.0.0", 8450)) ! rm.register("sendmsg", self.sm_sendmsg) ! so = SoapObject(rm.get_methods(), self.hasperm) self.server.registerObject(so) *************** *** 95,99 **** hooks.unregister("Loop", self.loop) self.server.server_close() ! sm.unregister("sendmsg") def loop(self): --- 95,99 ---- hooks.unregister("Loop", self.loop) self.server.server_close() ! rm.unregister("sendmsg") def loop(self): |
From: Gustavo N. <nie...@us...> - 2003-05-05 20:47:26
|
Update of /cvsroot/pybot/pybot/pybot In directory sc8-pr-cvs1:/tmp/cvs-serv17260/pybot Modified Files: __init__.py module.py Log Message: Created xmlrpc module, including xmlrpc support for pybot. Index: __init__.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/__init__.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** __init__.py 4 Dec 2001 00:57:37 -0000 1.2 --- __init__.py 5 May 2003 20:47:18 -0000 1.3 *************** *** 18,22 **** def init(): ! from pybot.module import Modules, ModuleMethods, SoapMethods from pybot.option import Options from pybot.server import Servers --- 18,22 ---- def init(): ! from pybot.module import Modules, ModuleMethods, RemoteMethods from pybot.option import Options from pybot.server import Servers *************** *** 27,31 **** import os ! global main, modls, servers, options, hooks, mm, sm, config hooks = Hooks() --- 27,31 ---- import os ! global main, modls, servers, options, hooks, mm, rm, config hooks = Hooks() *************** *** 35,39 **** modls = Modules() mm = ModuleMethods() ! sm = SoapMethods() config = ConfigParser() --- 35,39 ---- modls = Modules() mm = ModuleMethods() ! rm = RemoteMethods() config = ConfigParser() Index: module.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/module.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** module.py 4 Dec 2001 00:57:38 -0000 1.3 --- module.py 5 May 2003 20:47:20 -0000 1.4 *************** *** 121,125 **** del self.__methods[name] ! class SoapMethods: def __init__(self): self.__func = {} --- 121,125 ---- del self.__methods[name] ! class RemoteMethods: def __init__(self): self.__func = {} |
From: Gustavo N. <nie...@us...> - 2003-05-05 17:42:15
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory sc8-pr-cvs1:/tmp/cvs-serv4956/pybot/modules Modified Files: eval.py Log Message: Transform evaluation result to string before checking length. Index: eval.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/eval.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** eval.py 4 Dec 2001 00:57:38 -0000 1.2 --- eval.py 5 May 2003 17:42:10 -0000 1.3 *************** *** 63,67 **** 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"], [".", "!"]) --- 63,67 ---- if mm.hasperm(0, msg.server.servername, msg.target, msg.user, "eval"): try: ! answer = str(eval(m.group("expr"), self.dict)) except: msg.answer("%:", ["Can't evaluate this", "There's something wrong with this expression"], [".", "!"]) |
From: Gustavo N. <nie...@us...> - 2002-06-20 17:37:21
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory usw-pr-cvs1:/tmp/cvs-serv15389 Modified Files: forward.py ignore.py log.py Log Message: Changed priorities, but keeped ordering. Index: forward.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/forward.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** forward.py 4 Dec 2001 00:57:38 -0000 1.2 --- forward.py 20 Jun 2002 17:37:15 -0000 1.3 *************** *** 24,35 **** 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) --- 24,35 ---- def __init__(self, bot): self.data = options.gethard("Forward.data", []) ! hooks.register("Message", self.message_forward, 100) ! hooks.register("OutMessage", self.message_forward, 100) ! hooks.register("Notice", self.notice_forward, 100) ! hooks.register("OutNotice", self.notice_forward, 100) ! hooks.register("CTCP", self.ctcp_forward, 100) ! hooks.register("OutCTCP", self.ctcp_forward, 100) ! hooks.register("UserJoined", self.joined_forward, 100) ! hooks.register("UserParted", self.parted_forward, 100) hooks.register("Message", self.message) *************** *** 41,52 **** 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) --- 41,52 ---- def unload(self): ! hooks.unregister("Message", self.message_forward, 100) ! hooks.unregister("OutMessage", self.message_forward, 100) ! hooks.unregister("Notice", self.notice_forward, 100) ! hooks.unregister("OutNotice", self.notice_forward, 100) ! hooks.unregister("CTCP", self.ctcp_forward, 100) ! hooks.unregister("OutCTCP", self.ctcp_forward, 100) ! hooks.unregister("UserJoined", self.joined_forward, 100) ! hooks.unregister("UserParted", self.parted_forward, 100) hooks.unregister("Message", self.message) Index: ignore.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/ignore.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** ignore.py 4 Dec 2001 00:57:38 -0000 1.2 --- ignore.py 20 Jun 2002 17:37:16 -0000 1.3 *************** *** 23,31 **** 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) --- 23,31 ---- def __init__(self, bot): self.ignoredata = options.gethard("Ignore.ignore", []) ! hooks.register("Message", self.message_ignore, 200) hooks.register("Message", self.message) def unload(self): ! hooks.unregister("Message", self.message_ignore, 200) hooks.unregister("Message", self.message) Index: log.py =================================================================== RCS file: /cvsroot/pybot/pybot/pybot/modules/log.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** log.py 20 Jun 2002 01:12:55 -0000 1.4 --- log.py 20 Jun 2002 17:37:16 -0000 1.5 *************** *** 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> [!?]' --- 118,125 ---- hooks.register("Message", self.message) ! hooks.register("Message", self.log_message, 150) ! hooks.register("CTCP", self.log_ctcp, 150) ! hooks.register("OutMessage", self.log_outmessage, 150) ! hooks.register("OutCTCP", self.log_outctcp, 150) # Match '[have you] seen <nick> [!?]' *************** *** 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) --- 137,144 ---- def unload(self): hooks.unregister("Message", self.message) ! hooks.unregister("Message", self.log_message, 150) ! hooks.unregister("CTCP", self.log_ctcp, 150) ! hooks.unregister("OutMessage", self.log_outmessage, 150) ! hooks.unregister("OutCTCP", self.log_outctcp, 150) mm.unregister_help(0, HELP_SEEN) |
From: Gustavo N. <nie...@us...> - 2002-06-20 16:01:44
|
Update of /cvsroot/pybot/pybot/pybot/modules In directory usw-pr-cvs1:/tmp/cvs-serv20295 Removed Files: ctcp.py Log Message: Removed obsolete module. --- ctcp.py DELETED --- |
From: Gustavo N. <nie...@us...> - 2002-06-20 01:47:29
|
Update of /cvsroot/pybot/pybot/scripts In directory usw-pr-cvs1:/tmp/cvs-serv20723 Modified Files: pybotsetup.py Log Message: Oops! Left out some commented lines. Index: pybotsetup.py =================================================================== RCS file: /cvsroot/pybot/pybot/scripts/pybotsetup.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** pybotsetup.py 20 Jun 2002 01:17:48 -0000 1.4 --- pybotsetup.py 20 Jun 2002 01:47:26 -0000 1.5 *************** *** 78,83 **** 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 --- 78,83 ---- 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 |