import os, re @plugin class Info(object): def __init__(self, server): self.server = server self.commands = [ "what", "learn", "forget", "fulldb" ] self.server.handle("command", getattr(self, "handle_command"), self.commands) self.server.handle("message", getattr(self, "handle_message")) self.dbfile = "plugins/info.db" self.infodb = {} self.validchars = re.compile("[^A-Za-z0-9_-]") if os.path.isfile(self.dbfile): fh = open(self.dbfile, "r") for line in fh.read().split("\n"): if line == "": continue k,v = line.split("\t") self.infodb[k] = v def __del__(self): fh = open(self.dbfile+".tmp", "w") for k,v in self.infodb.items(): fh.write("%s\t%s\n" % (k,v)) fh.close() os.rename(self.dbfile+".tmp", self.dbfile) def getInfo(self, key): for k,v in self.infodb.items(): if k.lower() == key.lower(): return k,v return None, None def handle_command(self, channel, user, cmd, args, info_silent = False): if cmd == "what": for i in range(0, len(args)): args[i] = self.validchars.sub("", args[i]) ind = 0 for i in range(0, len(args)): if args[i] == "is" or args[i] == "are" or args[i] == "a" or args[i] == "an" or args[i] == "": ind += 1 else: break nargs = [] for i in range(ind, len(args)): if args[i] != "": nargs.append(args[i]) args = nargs if len(args) < 1: if not info_silent: self.server.doMessage(channel, "...what should I tell you about?") return tmp = " ".join(args) k,v = self.getInfo(tmp) if k is not None and v is not None: self.server.doMessage(channel, user + ": " + k + ": " + v) else: if not info_silent: self.server.doMessage(channel, user + ", I don't know what " + tmp + " is.") elif self.server.getPlugin("auth").isMod(user): if cmd == "learn": if len(args) < 1: self.server.doMessage(channel, "...what should I learn?") return tmp = " ".join(args) ind = tmp.find(" as ") size = 4 if ind == -1: ind = tmp.find(" as: ") size = 5 if ind == -1: self.server.doMessage(channel, "...what should I learn " + tmp + " as?") return val = tmp[ind+size:] key = tmp[0:ind] key = key.replace("\t", "") k,v = self.getInfo(key) if k is not None and v is not None: self.server.doMessage(channel, "I already know what " + k + " is.") return self.infodb[key] = val self.server.doMessage(channel, "Ok, I learned what " + key + " is.") elif cmd == "forget": if len(args) < 1: self.server.doMessage(channel, "...what should I forget?") return key = "" tmp = " ".join(args) if tmp[:-1] == " ": tmp.pop() for k,v in self.infodb.items(): if k.lower() == tmp.lower(): del self.infodb[k] key = k if key != "": self.server.doMessage(channel, "Hmm, I can't seem to remember what "+key+" is anymore.") else: self.server.doMessage(channel, "I don't know what "+tmp+" is.") elif cmd == "fulldb": self.server.doMessage(channel, user+": My database contains (separated by '#'): "+" # ".join(self.infodb.keys())) def handle_message(self, channel, user, message): if message.lower().startswith("what"): args = message.split(" ")[1:] self.handle_command(channel, user, "what", args, True)