class Main(Module): pattern = re.compile(u'^\s*(nb|notes?)(?:\s+(.*)$)?') require_addressing = True dbname = u'note' help = u'notes|nb <nick> show notes associated to a nick (staff only)\n\ notes|nb <nick> <note> add a note to a nick (staff only)' def init(self): self.learn = Learn(madcow=self.madcow) self.staff = Staff(madcow=self.madcow) def set(self, nick, target_nick, note): d = datetime.now() # append notes, don't overwrite old_notes = self.learn.lookup(self.dbname, target_nick) notes = old_notes if old_notes else "" self.learn.set( self.dbname, target_nick.lower(), notes + '\n[' + d.strftime("%D") + '] [' + nick + '] ' + note) def get(self, target_nick): return self.learn.lookup(self.dbname, target_nick) def response(self, nick, args, kwargs): cmd = args[0] target_nick = False note = False params = [] if args[1]: params = args[1].partition(' ') try: target_nick = params[0] except IndexError: target_nick = False try: note = params[2] except IndexError: note = False """ if nick passed, set user as staff """ if target_nick and (self.staff.is_staff(nick) or settings.OWNER_NICK == nick): if note: self.set(nick=nick, target_nick=target_nick, note=note) return u'%s: Note added to %s\'s record.' % (nick, target_nick) else: notes = self.get(target_nick=target_nick) if notes: return u'%s: Staff notes on %s\n%s' % (nick, target_nick, notes) else: return u'%s: No notes found for %s' % (nick, target_nick)
class Main(Module): pattern = re.compile(u'^\s*(nb|notes?)(?:\s+(.*)$)?') require_addressing = True dbname = u'note' help = u'notes|nb <nick> show notes associated to a nick (staff only)\n\ notes|nb <nick> <note> add a note to a nick (staff only)' def init(self): self.learn = Learn(madcow=self.madcow) self.staff = Staff(madcow=self.madcow) def set(self, nick, target_nick, note): d = datetime.now() # append notes, don't overwrite old_notes = self.learn.lookup(self.dbname, target_nick) notes = old_notes if old_notes else "" self.learn.set(self.dbname, target_nick.lower(), notes + '\n[' + d.strftime("%D") + '] [' + nick + '] ' + note) def get(self, target_nick): return self.learn.lookup(self.dbname, target_nick) def response(self, nick, args, kwargs): cmd = args[0] target_nick = False note = False params = [] if args[1]: params = args[1].partition(' ') try: target_nick = params[0] except IndexError: target_nick = False try: note = params[2] except IndexError: note = False """ if nick passed, set user as staff """ if target_nick and (self.staff.is_staff(nick) or settings.OWNER_NICK == nick): if note: self.set(nick=nick, target_nick=target_nick, note=note) return u'%s: Note added to %s\'s record.' % (nick, target_nick) else: notes = self.get(target_nick=target_nick) if notes: return u'%s: Staff notes on %s\n%s' % (nick, target_nick, notes) else: return u'%s: No notes found for %s' % (nick, target_nick)
class Karma(Base): """Infobot style karma""" _adjust_pattern = re.compile(r"^\s*(.*?)[+-]([+-]+)\s*$") _query_pattern = re.compile(r"^\s*karma\s+(\S+)\s*\?*\s*$") _dbname = "karma" def __init__(self, madcow): self.learn = Learn(madcow) def process(self, nick, input): kr = KarmaResponse(reply=None, matched=False) # see if someone is trying to adjust karma try: target, adjustment = Karma._adjust_pattern.search(input).groups() # don't let people adjust their own karma ;p if nick.lower() != target.lower(): self.adjust(nick=target, adjustment=adjustment) kr.matched = True except: pass # detect a query for someone's karma try: target = Karma._query_pattern.search(input).group(1) karma = self.query(nick=target) kr.matched = True kr.reply = "%s: %s's karma is %s" % (nick, target, karma) except: pass return kr def set(self, nick, karma): self.learn.set(Karma._dbname, nick.lower(), str(karma)) def adjust(self, nick, adjustment): karma = self.query(nick) adjustment, size = adjustment[0], len(adjustment) exec("karma " + adjustment + "= size") self.set(nick=nick, karma=karma) def query(self, nick): karma = self.learn.lookup(Karma._dbname, nick.lower()) if karma is None: karma = 0 self.set(nick=nick, karma=karma) return int(karma)
class Karma(object): """Infobot style karma""" _adjust_pattern = re.compile(r'^\s*(.*?)[+-]([+-]+)\s*$') _query_pattern = re.compile(r'^\s*karma\s+(\S+)\s*\?*\s*$') _dbname = u'karma' def __init__(self, madcow): self.learn = Learn(madcow) def process(self, nick, input): kr = KarmaResponse(reply=None, matched=False) # see if someone is trying to adjust karma try: target, adjustment = Karma._adjust_pattern.search(input).groups() # don't let people adjust their own karma ;p if nick.lower() != target.lower(): self.adjust(nick=target, adjustment=adjustment) kr.matched = True except AttributeError: pass # detect a query for someone's karma try: target = Karma._query_pattern.search(input).group(1) karma = self.query(nick=target) kr.matched = True kr.reply = u"%s: %s's karma is %s" % (nick, target, karma) except AttributeError: pass return kr def set(self, nick, karma): self.learn.set(Karma._dbname, nick.lower(), unicode(karma)) def adjust(self, nick, adjustment): karma = self.query(nick) adjustment, size = adjustment[0], len(adjustment) exec(u'karma ' + adjustment + u'= size') self.set(nick=nick, karma=karma) def query(self, nick): karma = self.learn.lookup(Karma._dbname, nick.lower()) if karma is None: karma = 0 self.set(nick=nick, karma=karma) return int(karma)
class Main(Module): pattern = re.compile(u'^\s*(names?)(?:\s+(.*)$)?') require_addressing = False dbname = u'realname' help = u'names show list of associated nicks and names (staff only)\n\ name <nick> show real name associated with user (staff only)\n\ name <nick> <real_name> set real name for user (staff only)' def init(self): self.learn = Learn(madcow=self.madcow) self.staff = Staff(madcow=self.madcow) def set(self, nick, name): self.learn.set(self.dbname, nick.lower(), name) def unset(self, nick): dbm = self.learn.dbm(self.dbname) try: key = encode(nick.lower()) if dbm.has_key(nick): del dbm[nick] return True return False finally: dbm.close() def get_names(self): name_db = self.learn.get_db('realname'); return name_db def has_name(self, nick): name_db = self.get_names() return nick in name_db def get(self, nick): return self.learn.lookup(self.dbname, nick) def response(self, nick, args, kwargs): cmd = args[0] target_nick = False real_name = False params = [] if args[1]: params = args[1].partition(' ') try: target_nick = params[0] except IndexError: target_nick = False try: real_name = params[2] except IndexError: real_name = False # only staff members & bot owner are allowed to get & set real_name data if self.staff.is_staff(nick) or settings.OWNER_NICK == nick: if target_nick: if real_name: self.set(target_nick, real_name) return u'%s: Setting name for %s to %s' % ( nick, target_nick, real_name ) else: name = self.get(nick=target_nick) if name: return u'%s: %s is %s' % ( nick, target_nick, name ) else: return u'%s: Sorry, I don\'t who %s is.' % ( nick, target_nick ) else: name_list = "\n\nRecorded names:\n" for user_nick, name in self.get_names().iteritems(): name_list = name_list + user_nick + ": " + name + "\n" return u'%s: %s' % (nick, name_list)
class Main(Module): pattern = re.compile(u'^\s*(staff)(?:\s+(.*)$)?') require_addressing = False dbname = u'staff' help = u'staff list staff members\n\ staff <nick> check if specific user is a staff member\n\ staff <nick> add/remove add/remove user from staff list (staff only)' def init(self): self.learn = Learn(madcow=self.madcow) def set(self, nick): self.learn.set(self.dbname, nick.lower(), True) def unset(self, nick): dbm = self.learn.dbm(self.dbname) try: key = encode(nick.lower()) if dbm.has_key(key): del dbm[key] return True return False finally: dbm.close() def get_staff(self): staff_db = self.learn.get_db('staff') return staff_db def is_staff(self, nick): staff_db = self.get_staff() return nick in staff_db def response(self, nick, args, kwargs): cmd = args[0] target_nick = False action = False params = [] if args[1]: params = args[1].split() try: target_nick = params[0] except IndexError: target_nick = False try: action = params[1] except IndexError: action = False """ if nick passed, set user as staff """ if target_nick: # if an action is passed, and requesting user is staff or owner, perform the action if action and (self.is_staff(nick) or settings.OWNER_NICK == nick): if action == 'remove': self.unset(nick=target_nick) return u'%s: %s is no longer marked as staff' % ( nick, target_nick) elif action == "add": self.set(nick=target_nick) return u'%s: %s is now marked as staff' % (nick, target_nick) else: return u'%s: I\'m not sure what you want me to do here. \'%s\' is not a valid staff action.' % ( nick, action) # otherwise, respond with staff membership status for nick, ignoring the action if self.is_staff(target_nick): return u'%s: Yes, %s is a staff member' % (nick, target_nick) else: return u'%s: No, %s is not a staff member' % (nick, target_nick) else: staff_db = self.get_staff() staff_nicks = staff_db.keys() if len(staff_nicks): return u'%s: Staff members are: %s' % (nick, ", ".join(staff_nicks)) else: return u'%s: There are currently no users marked as staff members.' % ( nick)
class Main(Module): pattern = re.compile(u'^\s*(compan[y|ies])(?:\s+(.*)$)?') require_addressing = False dbname = u'company' help = u'companies list all company/nick associations (staff only)\n\ company <nick> show company associated with user (staff only)\n\ company <nick> <company_name> set company information for user (staff only)' def init(self): self.learn = Learn(madcow=self.madcow) self.staff = Staff(madcow=self.madcow) def set(self, nick, company): self.learn.set(self.dbname, nick.lower(), company) def unset(self, nick): dbm = self.learn.dbm(self.dbname) try: key = encode(nick.lower()) if dbm.has_key(nick): del dbm[nick] return True return False finally: dbm.close() def get_companies(self): company_db = self.learn.get_db('company'); return company_db def has_company(self, nick): company_db = self.get_companies() return nick in company_db def get(self, nick): return self.learn.lookup(self.dbname, nick) def response(self, nick, args, kwargs): cmd = args[0] target_nick = False company = False params = [] if args[1]: params = args[1].partition(' ') try: target_nick = params[0] except IndexError: target_nick = False try: company = params[2] except IndexError: company = False # only staff members & bot owner are allowed to get & set company data if self.staff.is_staff(nick) or settings.OWNER_NICK == nick: if target_nick: if company: self.set(target_nick, company) return u'%s: setting company for %s to %s' % ( nick, target_nick, company ) else: company_name = self.get(target_nick) if company_name: return u'%s: %s works at %s' % ( nick, target_nick, company_name ) else: return u'%s: I don\'t know where %s works' % ( nick, target_nick ) else: company_list = "\n\nRecorded companies:\n" for user_nick, company_name in self.get_companies().iteritems(): company_list = company_list + user_nick + " works at " + company_name + "\n" return u'%s: %s' % (nick, company_list)
class Main(Module): pattern = re.compile(u'^\s*(names?)(?:\s+(.*)$)?') require_addressing = False dbname = u'realname' help = u'names show list of associated nicks and names (staff only)\n\ name <nick> show real name associated with user (staff only)\n\ name <nick> <real_name> set real name for user (staff only)' def init(self): self.learn = Learn(madcow=self.madcow) self.staff = Staff(madcow=self.madcow) def set(self, nick, name): self.learn.set(self.dbname, nick.lower(), name) def unset(self, nick): dbm = self.learn.dbm(self.dbname) try: key = encode(nick.lower()) if dbm.has_key(nick): del dbm[nick] return True return False finally: dbm.close() def get_names(self): name_db = self.learn.get_db('realname') return name_db def has_name(self, nick): name_db = self.get_names() return nick in name_db def get(self, nick): return self.learn.lookup(self.dbname, nick) def response(self, nick, args, kwargs): cmd = args[0] target_nick = False real_name = False params = [] if args[1]: params = args[1].partition(' ') try: target_nick = params[0] except IndexError: target_nick = False try: real_name = params[2] except IndexError: real_name = False # only staff members & bot owner are allowed to get & set real_name data if self.staff.is_staff(nick) or settings.OWNER_NICK == nick: if target_nick: if real_name: self.set(target_nick, real_name) return u'%s: Setting name for %s to %s' % ( nick, target_nick, real_name) else: name = self.get(nick=target_nick) if name: return u'%s: %s is %s' % (nick, target_nick, name) else: return u'%s: Sorry, I don\'t who %s is.' % ( nick, target_nick) else: name_list = "\n\nRecorded names:\n" for user_nick, name in self.get_names().iteritems(): name_list = name_list + user_nick + ": " + name + "\n" return u'%s: %s' % (nick, name_list)
class Main(Module): pattern = re.compile(u'^\s*(compan[y|ies])(?:\s+(.*)$)?') require_addressing = False dbname = u'company' help = u'companies list all company/nick associations (staff only)\n\ company <nick> show company associated with user (staff only)\n\ company <nick> <company_name> set company information for user (staff only)' def init(self): self.learn = Learn(madcow=self.madcow) self.staff = Staff(madcow=self.madcow) def set(self, nick, company): self.learn.set(self.dbname, nick.lower(), company) def unset(self, nick): dbm = self.learn.dbm(self.dbname) try: key = encode(nick.lower()) if dbm.has_key(nick): del dbm[nick] return True return False finally: dbm.close() def get_companies(self): company_db = self.learn.get_db('company') return company_db def has_company(self, nick): company_db = self.get_companies() return nick in company_db def get(self, nick): return self.learn.lookup(self.dbname, nick) def response(self, nick, args, kwargs): cmd = args[0] target_nick = False company = False params = [] if args[1]: params = args[1].partition(' ') try: target_nick = params[0] except IndexError: target_nick = False try: company = params[2] except IndexError: company = False # only staff members & bot owner are allowed to get & set company data if self.staff.is_staff(nick) or settings.OWNER_NICK == nick: if target_nick: if company: self.set(target_nick, company) return u'%s: setting company for %s to %s' % ( nick, target_nick, company) else: company_name = self.get(target_nick) if company_name: return u'%s: %s works at %s' % (nick, target_nick, company_name) else: return u'%s: I don\'t know where %s works' % ( nick, target_nick) else: company_list = "\n\nRecorded companies:\n" for user_nick, company_name in self.get_companies().iteritems( ): company_list = company_list + user_nick + " works at " + company_name + "\n" return u'%s: %s' % (nick, company_list)
class Main(Module): pattern = re.compile(u'^\s*(link|shortcut)s?(?:\s+(.*)$)?') require_addressing = False dbname = u'links' help = u'shortcuts show list of resource shortcuts\n\ link <shortcut> show link for specified shortcut \n\ link <shortcut> <url> set link for specified shortcut (staff only)\n\ link <shortcut> delete remove link for specified shortcut (staff only)' def init(self): self.learn = Learn(madcow=self.madcow) self.staff = Staff(madcow=self.madcow) def set(self, shortcut, url): self.learn.set(self.dbname, shortcut.lower(), url) def unset(self, shortcut): dbm = self.learn.dbm(self.dbname) try: key = encode(shortcut.lower()) if dbm.has_key(shortcut): del dbm[shortcut] return True return False finally: dbm.close() def get_shortcuts(self): link_db = self.learn.get_db(self.dbname) return link_db def has_name(self, shortcut): link_db = self.get_shortcuts() return shortcut in link_db def get(self, shortcut): return self.learn.lookup(self.dbname, shortcut) def response(self, nick, args, kwargs): cmd = args[0] shortcut = False link = False params = [] if args[1]: params = args[1].partition(' ') try: shortcut = params[0] except IndexError: shortcut = False try: link = params[2] except IndexError: link = False # only staff members & bot owner are allowed to set/change shortcuts if shortcut and link and (self.staff.is_staff(nick) or settings.OWNER_NICK == nick): if link == "delete": self.unset(shortcut) return u'%s: Okay, I\'ve deleted the link for %s. It used to be %s, and now it\'s nothing. How sad.' % ( nick, shortcut, link) else: self.set(shortcut, link) return u'%s: Okay, I\'ve set the link for %s to %s' % ( nick, shortcut, link) elif shortcut: link_url = self.get(shortcut) if link_url: return u'%s: %s - %s' % (nick, shortcut, link_url) else: return u'%s: Sorry, there is no \'%s\' shortcut.' % (nick, shortcut) else: kwargs['req'].make_private( ) # don't spam the channel with all the links. there could be a lot of them. links = self.get_shortcuts() if len(links): link_list = "Here are all the current shortcuts:\n" for shortcut, url in links.iteritems(): link_list = link_list + shortcut + ": " + url + "\n" return u'%s' % (link_list) else: return u'Sorry, no shortcuts have been defined yet.'
class Main(Module): pattern = re.compile(u'^\s*(staff)(?:\s+(.*)$)?') require_addressing = False dbname = u'staff' help = u'staff list staff members\n\ staff <nick> check if specific user is a staff member\n\ staff <nick> add/remove add/remove user from staff list (staff only)' def init(self): self.learn = Learn(madcow=self.madcow) def set(self, nick): self.learn.set(self.dbname, nick.lower(), True) def unset(self, nick): dbm = self.learn.dbm(self.dbname) try: key = encode(nick.lower()) if dbm.has_key(key): del dbm[key] return True return False finally: dbm.close() def get_staff(self): staff_db = self.learn.get_db('staff'); return staff_db def is_staff(self, nick): staff_db = self.get_staff() return nick in staff_db def response(self, nick, args, kwargs): cmd = args[0] target_nick = False action = False params = [] if args[1]: params = args[1].split() try: target_nick = params[0] except IndexError: target_nick = False try: action = params[1] except IndexError: action = False """ if nick passed, set user as staff """ if target_nick: # if an action is passed, and requesting user is staff or owner, perform the action if action and (self.is_staff(nick) or settings.OWNER_NICK == nick): if action == 'remove': self.unset(nick=target_nick) return u'%s: %s is no longer marked as staff' % (nick, target_nick) elif action == "add": self.set(nick=target_nick) return u'%s: %s is now marked as staff' % (nick, target_nick) else: return u'%s: I\'m not sure what you want me to do here. \'%s\' is not a valid staff action.' %(nick, action) # otherwise, respond with staff membership status for nick, ignoring the action if self.is_staff(target_nick): return u'%s: Yes, %s is a staff member' %(nick, target_nick) else: return u'%s: No, %s is not a staff member' %(nick, target_nick) else: staff_db = self.get_staff() staff_nicks = staff_db.keys() if len(staff_nicks): return u'%s: Staff members are: %s' % (nick, ", ".join(staff_nicks)) else: return u'%s: There are currently no users marked as staff members.' % (nick)
class Main(Module): pattern = re.compile(u'^\s*(link|shortcut)s?(?:\s+(.*)$)?') require_addressing = False dbname = u'links' help = u'shortcuts show list of resource shortcuts\n\ link <shortcut> show link for specified shortcut \n\ link <shortcut> <url> set link for specified shortcut (staff only)\n\ link <shortcut> delete remove link for specified shortcut (staff only)' def init(self): self.learn = Learn(madcow=self.madcow) self.staff = Staff(madcow=self.madcow) def set(self, shortcut, url): self.learn.set(self.dbname, shortcut.lower(), url) def unset(self, shortcut): dbm = self.learn.dbm(self.dbname) try: key = encode(shortcut.lower()) if dbm.has_key(shortcut): del dbm[shortcut] return True return False finally: dbm.close() def get_shortcuts(self): link_db = self.learn.get_db(self.dbname); return link_db def has_name(self, shortcut): link_db = self.get_shortcuts() return shortcut in link_db def get(self, shortcut): return self.learn.lookup(self.dbname, shortcut) def response(self, nick, args, kwargs): cmd = args[0] shortcut = False link = False params = [] if args[1]: params = args[1].partition(' ') try: shortcut = params[0] except IndexError: shortcut = False try: link = params[2] except IndexError: link = False # only staff members & bot owner are allowed to set/change shortcuts if shortcut and link and (self.staff.is_staff(nick) or settings.OWNER_NICK == nick): if link == "delete": self.unset(shortcut) return u'%s: Okay, I\'ve deleted the link for %s. It used to be %s, and now it\'s nothing. How sad.' % ( nick, shortcut, link ) else: self.set(shortcut, link) return u'%s: Okay, I\'ve set the link for %s to %s' % ( nick, shortcut, link ) elif shortcut: link_url = self.get(shortcut) if link_url: return u'%s: %s - %s' % (nick, shortcut, link_url) else: return u'%s: Sorry, there is no \'%s\' shortcut.' % (nick, shortcut) else: kwargs['req'].make_private() # don't spam the channel with all the links. there could be a lot of them. links = self.get_shortcuts() if len(links): link_list = "Here are all the current shortcuts:\n" for shortcut, url in links.iteritems(): link_list = link_list + shortcut + ": " + url + "\n" return u'%s' % (link_list) else: return u'Sorry, no shortcuts have been defined yet.'