import plugin, time, requests from jsonpath import jsonpath from pluralslib import plural from bot import IRCLine BOT = None def say(target,msg): if not BOT: return None BOT.socket.send(IRCLine("PRIVMSG",target,":"+msg)) def query(jpath,reducer=lambda x: x[0]): def _query(stats): return reducer(jsonpath(stats,jpath)) return _query QUERIES = dict( users = query("$.usercount"), channels = query("$.channelcount") ) NOUNS = dict( users="user", channels="channel" ) def time_secs(): return time.time() def grab_stats(): r = requests.get("https://tilde.chat/stats.json") r.raise_for_status() return r.json() LAST_GRAB = time_secs() _stats = grab_stats() def stats(): global LAST_GRAB,_stats if (time_secs()-LAST_GRAB)>=(5*60): # cache for 5 minutes LAST_GRAB = time_secs() _stats = grab_stats() return _stats USAGE_STR = "<{}>".format("/".join(QUERIES.keys())) def stat(bot,channel,nick,subcmd): if subcmd not in QUERIES.keys(): say(channel,("{}: ".format(nick) if channel.startswith("#") else " ".strip())+"Usage: !stats {}".format(USAGE_STR)) return st = stats() res = plural(QUERIES.get(subcmd,lambda x: 0)(st),NOUNS.get(subcmd,"fuck")) say(channel,": ".join(([nick] if channel.startswith("#") else [])+[res])) def on_stats(event): if not BOT: return None channel = event.target if event.target.startswith("#") else event.hostmask.nick try: stat(BOT,channel,event.hostmask.nick,*event.parts) except TypeError: say(channel,"Usage: !stats <{}>".format("/".join(QUERIES.keys()))) except Exception as e: traceback.print_exc() def register(bot): global BOT BOT=bot bot.event_manager.on("command_stats",on_stats)