def tell(event, bot): """ tell target msg. Will tell a user <target> a message <msg>.""" target, msg = argumentSplit(event.argument, 2) if not target: return bot.say(functionHelp(tell)) if not msg: return bot.say("Need something to tell (%s)" % target) users, unknown, dupes, hasself = _generate_users(bot, target, USERS_MODULE.get_username(bot, event.nick)) if not users: if hasself: return bot.say("Use notepad.") else: return bot.say("Sorry, don't know (%s)." % target) cmd = event.command.lower() targets = [] for user, target in users: #cmd user msg imsg = "%s %s %s" % (event.command, target, msg) # TODO: do we do an alias lookup on event.nick also? bot.dbQuery('''INSERT INTO tell(user, telltime, source, msg) VALUES (?,?,?,?);''', (user, int(timegm(gmtime())), event.nick, imsg)) targets.append(target) # check if we need to warn about too many tell pastebin # https://github.com/Clam-/pyBurlyBot/issues/29 #~ n = bot.dbQuery('''SELECT COUNT(id) AS C FROM tell WHERE user = ? AND delivered = ? AND telltime < ?;''', (user, 0, time()), fetchone)['C'] #~ if n > 3: #~ print "GUNNA WARNING" if len(users) > 1: bot.say(RPLFORMAT % (event.nick, PASSON if cmd == "tell" else ASKTHAT, english_list(targets), "are", UNKNOWN % english_list(unknown) if unknown else "", URSELF if hasself else "", MULTIUSER % "Telling" if dupes else "")) else: bot.say(RPLFORMAT % (event.nick, PASSON if cmd == "tell" else ASKTHAT, english_list(targets), "is", UNKNOWN % english_list(unknown) if unknown else "", URSELF if hasself else "", MULTIUSER % "Telling" if dupes else ""))
def tell(event, bot): """ tell target msg. Will tell a user <target> a message <msg>.""" target, msg = argumentSplit(event.argument, 2) if not target: return bot.say(bot.say(functionHelp(tell))) if not msg: return bot.say("Need something to tell (%s)" % target) users, unknown, dupes, hasself = _generate_users(bot, target, USERS_MODULE.get_username(bot, event.nick)) if not users: if hasself: return bot.say("Use notepad.") else: return bot.say("Sorry, don't know (%s)." % target) cmd = event.command.lower() targets = [] for user, target in users: #cmd user msg imsg = "%s %s %s" % (event.command, target, msg) # TODO: do we do an alias lookup on event.nick also? bot.dbQuery('''INSERT INTO tell(user, telltime, source, msg) VALUES (?,?,?,?);''', (user, int(timegm(gmtime())), event.nick, imsg)) targets.append(target) # check if we need to warn about too many tell pastebin # https://github.com/Clam-/pyBurlyBot/issues/29 #~ n = bot.dbQuery('''SELECT COUNT(id) AS C FROM tell WHERE user = ? AND delivered = ? AND telltime < ?;''', (user, 0, time()), fetchone)['C'] #~ if n > 3: #~ print "GUNNA WARNING" if len(users) > 1: bot.say(RPLFORMAT % (event.nick, PASSON if cmd == "tell" else ASKTHAT, english_list(targets), "are", UNKNOWN % english_list(unknown) if unknown else "", URSELF if hasself else "", MULTIUSER % "Telling" if dupes else "")) else: bot.say(RPLFORMAT % (event.nick, PASSON if cmd == "tell" else ASKTHAT, english_list(targets), "is", UNKNOWN % english_list(unknown) if unknown else "", URSELF if hasself else "", MULTIUSER % "Telling" if dupes else ""))
def do_commands(obj, *args, **kwargs): """ Lists all commands. Synopsis: commands @commands """ obj.notify('Commands listing:') i = 0 for f in commands.values(): if obj.access >= f.access: i += 1 obj.notify('%s: %s' % (util.english_list(f.name.split(), and_string = 'or').capitalize(), getdoc(f).strip().split('\n')[0])) obj.notify('Commands: %s.' % i) return True
def alert(event, bot): """ alert target datespec msg. Alert a user <target> about a message <msg> at <datespec> time. datespec can be relative (in) or calendar/day based (on), e.g. 'in 5 minutes'""" target, dtime1, dtime2, msg = argumentSplit(event.argument, 4) if not target: return bot.say(functionHelp(alert)) if dtime1.lower() == "tomorrow": target, dtime1, msg = argumentSplit(event.argument, 3) # reparse is easiest way I guess... resolves #30 if need to readdress dtime2 = "" else: if not (dtime1 and dtime2): return bot.say("Need time to alert.") if not msg: return bot.say("Need something to alert (%s)" % target) origuser = USERS_MODULE.get_username(bot, event.nick) users, unknown, dupes, _ = _lookup_users(bot, target, origuser, False) if not users: return bot.say("Sorry, don't know (%s)." % target) dtime = "%s %s" % (dtime1, dtime2) # user location aware destination times locmod = None goomod = None timelocale = False try: locmod = bot.getModule("pbm_location") goomod = bot.getModule("pbm_googleapi") timelocale = True except ConfigException: pass origin_time = timegm(gmtime()) alocal_time = localtime(origin_time) local_offset = timegm(alocal_time) - origin_time if locmod and goomod: t = origin_time loc = locmod.getlocation(bot.dbQuery, origuser) if not loc: timelocale = False t = alocal_time else: tz = goomod.google_timezone(loc[1], loc[2], t) if not tz: timelocale = False t = alocal_time else: t = gmtime(t + tz[2] + tz[3]) #[2] dst [3] timezone offset else: t = alocal_time ntime = parseDateTime(dtime, t) if not ntime: return bot.say("Don't know what time and/or day and/or date (%s) is." % dtime) # go on, change it. I dare you. if timelocale: t = timegm(t) - tz[2] - tz[3] ntime = ntime - tz[2] - tz[3] else: t = timegm(t) - local_offset ntime = ntime - local_offset if ntime < t or ntime > (t + MAX_REMIND_TIME): return bot.say("Don't sass me with your back to the future alerts.") if ntime < (t + 5): return bot.say("2fast") targets = [] for user, target in users: if user == origuser: source_user = None else: source_user = event.nick if event.isPM(): chan_or_user = event.nick else: chan_or_user = event.target bot.dbQuery('''INSERT INTO alert(target_user, alert_time, created_time, source, source_user, msg) VALUES (?,?,?,?,?,?);''', (user, int(ntime), int(origin_time), chan_or_user, source_user, msg)) if ntime < (t + LOOP_INTERVAL): Timers.restarttimer(TIMER_NAME) if not source_user: targets.append("you") else: targets.append(target) bot.say(RPL_ALERT_FORMAT % (event.nick, english_list(targets), distance_of_time_in_words(ntime, t), UNKNOWN % english_list(unknown) if unknown else "", MULTIUSER % "Alerting" if dupes else ""))
def remind(event, bot): """ remind target datespec msg. Will remind a user <target> about a message <msg> at <datespec> time. datespec can be relative (in) or calendar/day based (on), e.g. 'in 5 minutes'""" target, dtime1, dtime2, msg = argumentSplit(event.argument, 4) if not target: return bot.say(functionHelp(tell)) if dtime1.lower() == "tomorrow": target, dtime1, msg = argumentSplit(event.argument, 3) # reparse is easiest way I guess... resolves #30 if need to readdress dtime2 = "" else: if not (dtime1 and dtime2): return bot.say("Need time to remind.") if not msg: return bot.say("Need something to remind (%s)" % target) origuser = USERS_MODULE.get_username(bot, event.nick) users, unknown, dupes, _ = _generate_users(bot, target, origuser, False) if not users: return bot.say("Sorry, don't know (%s)." % target) dtime = "%s %s" % (dtime1, dtime2) # user location aware destination times locmod = None goomod = None timelocale = False try: locmod = bot.getModule("pbm_location") goomod = bot.getModule("pbm_googleapi") timelocale = True except ConfigException: pass origintime = timegm(gmtime()) alocaltime = localtime(origintime) localoffset = timegm(alocaltime) - origintime if locmod and goomod: t = origintime loc = locmod.getlocation(bot.dbQuery, origuser) if not loc: timelocale = False t = alocaltime else: tz = goomod.google_timezone(loc[1], loc[2], t) if not tz: timelocale = False t = alocaltime else: t = gmtime(t + tz[2] + tz[3]) #[2] dst [3] timezone offset else: t = alocaltime ntime = parseDateTime(dtime, t) if not ntime: return bot.say("Don't know what time and/or day and/or date (%s) is." % dtime) # go on, change it. I dare you. if timelocale: t = timegm(t) - tz[2] - tz[3] ntime = ntime - tz[2] - tz[3] else: t = timegm(t) - localoffset ntime = ntime - localoffset if ntime < t or ntime > t+MAX_REMIND_TIME: return bot.say("Don't sass me with your back to the future reminds.") targets = [] for user, target in users: if user == origuser: source = None else: source = event.nick bot.dbQuery('''INSERT INTO tell(user, telltime, origintime, remind, source, msg) VALUES (?,?,?,?,?,?);''', (user, int(ntime), int(origintime), 1, source, msg)) if not source: targets.append("you") else: targets.append(target) bot.say(RPLREMINDFORMAT % (event.nick, english_list(targets), distance_of_time_in_words(ntime, t), UNKNOWN % english_list(unknown) if unknown else "", MULTIUSER % "Reminding" if dupes else ""))
def test_english_list(): assert util.english_list([]) == '' assert util.english_list(['hello']) == 'hello' assert util.english_list(['hello', 'world']) == 'hello, and world' assert util.english_list(['fruit', 'nut', 'cream']) == 'fruit, nut, and cream' assert util.english_list(['male', 'female'], and_string = 'or') == 'male, or female'