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
|