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", level = 10) 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, level = 10) 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, level = 10) 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", level = 10) 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", level = 10) 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), level = 10) 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", level = 10) # 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), level = 10) 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), level = 10) 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))