import json import nio import simplematrixbotlib as botlib import commands #TODO move state functionality entirely to features.py data = json.loads(open('data.json').read()) dfaq = data["faq"] userstate = data['users'] faq_text = dfaq["header"] + "".join(["\n"+q["question"]+"\n"+q["answer"] for q in dfaq["questions"]]) + "\n\n"+dfaq["footer"] creds = botlib.Creds( data["homeserver"], data['username'], data['password'] ) bot = botlib.Bot(creds) PREFIX = '!' def load_faq(): dfaq = json.loads(open('data.json').read())["faq"] return dfaq["header"] + "".join(["\n"+q["question"]+"\n"+q["answer"] for q in dfaq["questions"]]) + "\n\n"+dfaq["footer"] def save_userstate(): with open('data.json','w') as f: f.write(json.dumps(data,indent=4)) @bot.listener.on_message_event async def faq(room, message): if message.sender not in userstate: userstate[message.sender] = {"state":[]} save_userstate() state = userstate[message.sender]['state'] result = commands.handle_command(state,message.sender,message.body) if result['response']!= None: state = result['state'] userstate[message.sender]['state'] = result['state'] save_userstate() await bot.api.send_markdown_message( room.room_id, result['response'] ) match = botlib.MessageMatch(room, message, bot, PREFIX) #print(f"{message.sender} : {message.body}") if match.is_not_from_this_bot() and match.prefix() and match.command( "faq"): await bot.api.send_markdown_message( room.room_id, load_faq()) @bot.listener.on_custom_event(nio.InviteMemberEvent) async def example(room, event): if event.membership == "join": await bot.api.send_markdown_message( room.room_id, load_faq() ) def get_questions(): return json.loads(open('data.json').read())["faq"]["questions"] @bot.listener.on_message_event async def faqresponse(room, message): match = botlib.MessageMatch(room, message, bot, PREFIX) if match.is_not_from_this_bot(): response = "" questions = get_questions() for q in questions: if sum([ 1 for kp in q["key_phrases"] if kp in message.body]) == len(q["key_phrases"]): response += q["question"] + "\n" + q["answer"]+"\n" if response != "": await bot.api.send_markdown_message( room.room_id, response + dfaq["footer"] ) bot.run()