119 lines
5.1 KiB
Python
119 lines
5.1 KiB
Python
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)")
|