[pybot-commits] CVS: pybot/pybot/modules freshmeat.py,1.5,1.6 log.py,1.7,1.8 modulecontrol.py,1.5,1.
Brought to you by:
niemeyer
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 |