import json import urllib import random import asyncio class Trivia(): def __init__(self, bot): self.bot = bot # Starts a game of trivia. Downloads a question with answers, shuffles the wrong answers with the # correct answer and returns the questions and answers. Also saves the question in the games.json file. def triviaStart(self, channel : str): question = self.bot.database["trivia questions"].find_one({"_id":channel}) self.bot.log("Trying to find a trivia question for "+channel) if question == None: with urllib.request.urlopen("https://opentdb.com/api.php?amount=10&type=multiple") as response: data = json.loads(response.read()) self.bot.log("Found the question \""+data["results"][0]["question"]+"\"") answers = data["results"][0]["incorrect_answers"] answers.append(data["results"][0]["correct_answer"]) random.shuffle(answers) correctAnswer = answers.index(data["results"][0]["correct_answer"]) + 97 self.bot.database["trivia questions"].insert_one({"_id":channel,"answer" : str(chr(correctAnswer)),"players" : {}}) replacements = {"'": "\'", """: "\"", "“": "\"", "”": "\"", "é": "é"} question = data["results"][0]["question"] for key, value in replacements.items(): question = question.replace(key,value) for answer in answers: for key, value in replacements.items(): answer = answer.replace(key,value) return question, answers, correctAnswer else: self.bot.log("There was already a trivia question for that channel (error code 1106)") return "There's already a trivia question going on. Try again in like, a minute (error code 1106)", "", "" # Lets players answer a trivia question def triviaAnswer(self, user : str, channel : str, command : str): question = self.bot.database["trivia questions"].find_one({"_id":channel}) if command in ["a","b","c","d"]: if question != None: if user not in question["players"]: self.bot.log(user+" answered the question in "+channel) self.bot.database["trivia questions"].update_one({"_id":channel},{"$set":{"players."+user : command}}) return "Locked in "+user+"'s answer" else: self.bot.log(user+" has already answered this question (error code 1105)") return user+" has already answered this question (error code 1105)" else: self.bot.log("There's no question right now (error code 1104)") return "There's no question right now (error code 1104)" else: self.bot.log("I didn't quite understand that (error code 1103)") return "I didn't quite understand that (error code 1103)" # Adds 1 GwendoBuck to each player that got the question right and deletes question from games.json. def triviaCountPoints(self, channel : str): question = self.bot.database["trivia questions"].find_one({"_id":channel}) self.bot.log("Counting points for question in "+channel) if question != None: for player, answer in question["players"].items(): if answer == question["answer"]: self.bot.money.addMoney(player,1) else: self.bot.log("Couldn't find the question (error code 1102)") return None async def triviaParse(self, ctx, answer): await self.bot.defer(ctx) if answer == "": question, options, correctAnswer = self.triviaStart(str(ctx.channel_id)) if options != "": results = "**"+question+"**\n" for x, option in enumerate(options): results += chr(x+97) + ") "+option+"\n" await ctx.send(results) await asyncio.sleep(60) self.triviaCountPoints(str(ctx.channel_id)) self.bot.databaseFuncs.deleteGame("trivia questions",str(ctx.channel_id)) self.bot.log("Time's up for the trivia question",str(ctx.channel_id)) await ctx.send("Time's up The answer was \"*"+chr(correctAnswer)+") "+options[correctAnswer-97]+"*\". Anyone who answered that has gotten 1 GwendoBuck") else: await ctx.send(question, hidden=True) elif answer in ["a","b","c","d"]: response = self.triviaAnswer("#"+str(ctx.author.id), str(ctx.channel_id), answer) if response.startswith("Locked in "): await ctx.send(f"{ctx.author.display_name} answered **{answer}**") else: await ctx.send(response) else: self.bot.log("I didn't understand that (error code 1101)",str(ctx.channel_id)) await ctx.send("I didn't understand that (error code 1101)")