"""Commands for populating and retrieving markov chains, for silly chatter.""" import logging from urllib.parse import quote from hitomi import bot from hitomi.backends import dr_botzo, DrBotzoError logger = logging.getLogger(__name__) @bot.listen(name='on_message') async def on_message_learn(message): """Learn lines, potentially also respond to them.""" if hasattr(message.channel, 'guild'): target = f'{message.channel.guild.name} ({message.channel.guild.id})' else: target = f'{message.author.name} ({message.author.id})' logger.info("learning to %s: '%s'", target, message.clean_content) try: response = dr_botzo.post('/markov/rpc/context/{context}/learn/'.format(context=quote(target)), json={'line': message.clean_content}) logger.debug("succeeded to learn '%s'", response.json()['line']) except DrBotzoError as drex: logger.exception("received an error from dr.botzo attempting to learn to %s: %s", target, drex) @bot.listen(name='on_message') async def on_message_reply(message): """Learn lines, potentially also respond to them.""" if hasattr(message.channel, 'guild'): target = f'{message.channel.guild.name} ({message.channel.guild.id})' else: target = f'{message.author.name} ({message.author.id})' if bot.user in message.mentions: logger.info("I was addressed, going to reply with chatter") await message.channel.trigger_typing() try: response = dr_botzo.post('/markov/rpc/context/{context}/generate/' ''.format(context=quote(target)), json={'topics': message.clean_content.split(' ')}) reply = response.json()['generated_line'] logger.info("replying to %s with '%s'", message.channel, reply) await message.channel.send(reply) except DrBotzoError as drex: logger.exception("received an error from dr.botzo attempting to reply to %s: %s", message.clean_content, drex)