173 lines
7.6 KiB
Python
173 lines
7.6 KiB
Python
import asyncio
|
||
import discord
|
||
|
||
class GameLoops():
|
||
def __init__(self,bot):
|
||
self.bot = bot
|
||
|
||
|
||
# Deletes a message
|
||
async def deleteMessage(self, imageLocation,channel):
|
||
try:
|
||
with open("resources/games/oldImages/"+imageLocation, "r") as f:
|
||
messages = f.read().splitlines()
|
||
|
||
for message in messages:
|
||
oldMessage = await channel.fetch_message(int(message))
|
||
self.bot.log("Deleting old message")
|
||
await oldMessage.delete()
|
||
except:
|
||
oldMessage = ""
|
||
|
||
return oldMessage
|
||
|
||
# Runs connect four
|
||
async def connectFour(self, ctx, command, user = None, channelId = None):
|
||
if user is None:
|
||
user = "#"+str(ctx.author.id)
|
||
|
||
if channelId is None:
|
||
channelId = str(ctx.channel_id)
|
||
|
||
response, showImage, deleteImage, gameDone, gwendoTurn = self.bot.games.connectFour.parseconnectFour(command,channelId, user)
|
||
|
||
if hasattr(ctx, "send"):
|
||
await ctx.send(response)
|
||
else:
|
||
await ctx.channel.send(response)
|
||
self.bot.log(response, channelId)
|
||
if showImage:
|
||
if deleteImage:
|
||
oldImage = await self.deleteMessage("connectFour"+channelId,ctx.channel)
|
||
oldImage = await ctx.channel.send(file = discord.File("resources/games/connect4Boards/board"+channelId+".png"))
|
||
if gameDone == False:
|
||
if gwendoTurn:
|
||
response, showImage, deleteImage, gameDone, gwendoTurn = await self.bot.games.connectFour.connectFourAI(channelId)
|
||
await ctx.channel.send(response)
|
||
self.bot.log(response,channelId)
|
||
if showImage:
|
||
if deleteImage:
|
||
await oldImage.delete()
|
||
oldImage = await ctx.channel.send(file = discord.File("resources/games/connect4Boards/board"+channelId+".png"))
|
||
if gameDone == False:
|
||
with open("resources/games/oldImages/connectFour"+channelId, "w") as f:
|
||
f.write(str(oldImage.id))
|
||
try:
|
||
reactions = ["1️⃣","2️⃣","3️⃣","4️⃣","5️⃣","6️⃣","7️⃣"]
|
||
for reaction in reactions:
|
||
await oldImage.add_reaction(reaction)
|
||
|
||
except:
|
||
self.bot.log("Image deleted before I could react to all of them")
|
||
|
||
else:
|
||
with open("resources/games/oldImages/connectFour"+channelId, "w") as f:
|
||
f.write(str(oldImage.id))
|
||
try:
|
||
reactions = ["1️⃣","2️⃣","3️⃣","4️⃣","5️⃣","6️⃣","7️⃣"]
|
||
for reaction in reactions:
|
||
await oldImage.add_reaction(reaction)
|
||
except:
|
||
self.bot.log("Image deleted before I could react to all of them")
|
||
|
||
if gameDone:
|
||
game = self.bot.database["connect 4 games"].find_one({"_id":channelId})
|
||
|
||
try:
|
||
with open("resources/games/oldImages/connectFour"+channelId, "r") as f:
|
||
oldImage = await channel.fetch_message(int(f.read()))
|
||
|
||
await oldImage.delete()
|
||
except:
|
||
self.bot.log("The old image was already deleted")
|
||
|
||
winner = game["winner"]
|
||
difficulty = int(game["difficulty"])
|
||
reward = difficulty**2 + 5
|
||
if winner != 0:
|
||
if game["players"][winner-1].lower() != "gwendolyn":
|
||
self.bot.money.addMoney(game["players"][winner-1].lower(),reward)
|
||
|
||
self.bot.databaseFuncs.deleteGame("connect 4 games",channelId)
|
||
|
||
async def runHangman(self,channel,user,command = "start", ctx = None):
|
||
try:
|
||
response, showImage, deleteImage, remainingLetters = self.bot.games.hangman.parseHangman(str(channel.id),user,command)
|
||
except:
|
||
self.bot.log("Error parsing command (error code 1701)")
|
||
if response != "":
|
||
if ctx is None:
|
||
await channel.send(response)
|
||
else:
|
||
await ctx.send(response)
|
||
self.bot.log(response,str(channel.id))
|
||
if showImage:
|
||
if deleteImage:
|
||
await self.deleteMessage("hangman"+str(channel.id),channel)
|
||
oldImage = await channel.send(file = discord.File("resources/games/hangmanBoards/hangmanBoard"+str(channel.id)+".png"))
|
||
|
||
if len(remainingLetters) > 15:
|
||
otherMessage = await channel.send("_ _")
|
||
reactionMessages = {oldImage : remainingLetters[:15],otherMessage : remainingLetters[15:]}
|
||
else:
|
||
otherMessage = ""
|
||
reactionMessages = {oldImage : remainingLetters}
|
||
|
||
oldMessages = str(oldImage.id)
|
||
if otherMessage != "":
|
||
oldMessages += "\n"+str(otherMessage.id)
|
||
with open("resources/games/oldImages/hangman"+str(channel.id), "w") as f:
|
||
f.write(oldMessages)
|
||
|
||
try:
|
||
for message, letters in reactionMessages.items():
|
||
for letter in letters:
|
||
emoji = chr(ord(letter)+127397)
|
||
await message.add_reaction(emoji)
|
||
except:
|
||
self.bot.log("Image deleted before adding all reactions")
|
||
|
||
# Runs Hex
|
||
async def runHex(self,ctx,command,user):
|
||
channelId = ctx.channel_id
|
||
try:
|
||
response, showImage, deleteImage, gameDone, gwendoTurn = self.bot.games.hex.parseHex(command,str(channelId),user)
|
||
except:
|
||
self.bot.log("Error parsing command (error code 1510)")
|
||
|
||
await ctx.send(response)
|
||
|
||
self.bot.log(response,str(channelId))
|
||
if showImage:
|
||
if deleteImage:
|
||
try:
|
||
oldImage = await self.deleteMessage("hex"+str(channelId),ctx.channel)
|
||
except:
|
||
self.bot.log("Error deleting old image (error code 1501)")
|
||
oldImage = await ctx.channel.send(file = discord.File("resources/games/hexBoards/board"+str(channelId)+".png"))
|
||
if gwendoTurn and not gameDone:
|
||
try:
|
||
response, showImage, deleteImage, gameDone, gwendoTurn = self.bot.games.hex.hexAI(str(channelId))
|
||
except:
|
||
response, showImage, deleteImage, gameDone, gwendoTurn = "An AI error ocurred",False,False,False,False
|
||
self.bot.log("AI error (error code 1520)")
|
||
await ctx.channel.send(response)
|
||
self.bot.log(response,str(channelId))
|
||
if showImage:
|
||
if deleteImage:
|
||
await oldImage.delete()
|
||
oldImage = await ctx.channel.send(file = discord.File("resources/games/hexBoards/board"+str(channelId)+".png"))
|
||
if not gameDone:
|
||
with open("resources/games/oldImages/hex"+str(channelId), "w") as f:
|
||
f.write(str(oldImage.id))
|
||
|
||
if gameDone:
|
||
game = self.bot.database["hex games"].find_one({"_id":str(channelId)})
|
||
|
||
winner = game["winner"]
|
||
if winner != 0 and game["players"][0] != game["players"][1]: # player1 != player2
|
||
winnings = game["difficulty"]*10
|
||
self.bot.money.addMoney(game["players"][winner-1].lower(),winnings)
|
||
|
||
self.bot.databaseFuncs.deleteGame("hex games",str(channelId))
|