diff --git a/src/main/database_module/guess_dao.py b/src/main/database_module/guess_dao.py index e896333..a586451 100644 --- a/src/main/database_module/guess_dao.py +++ b/src/main/database_module/guess_dao.py @@ -81,4 +81,23 @@ class GuessDAO(): .query(Guess)\ .order_by(Guess.difference)\ .limit(num_to_fetch) - ) \ No newline at end of file + ) + + def get_closest_on_play(self, play): + session = DatabaseSession.session + + # TODO: Make this a MAX query for ties + converted_guesses = self.__convert_all__( + session + .query(Guess) + .filter(Guess.play_id == play) + .order_by(Guess.difference) + .limit(1) + ) + + if len(converted_guesses) > 1: + raise AssertionError("More than one best guess! Can't continue!") + elif len(converted_guesses) == 0: + return None + else: + return converted_guesses[0] \ No newline at end of file diff --git a/src/main/discord_module/bot_runner.py b/src/main/discord_module/bot_runner.py index 9e606d4..5d35283 100644 --- a/src/main/discord_module/bot_runner.py +++ b/src/main/discord_module/bot_runner.py @@ -5,7 +5,7 @@ import uuid import datetime from src.main.configs import Configs -from src.main.database_module.guess_dao import GuessDAO, GUESSED_NUMBER, MEMBER_ID, MEMBER_NAME +from src.main.database_module.guess_dao import GuessDAO, GUESSED_NUMBER, MEMBER_ID, MEMBER_NAME, DIFFERENCE from src.main.database_module.play_dao import PlayDAO, PLAY_ID, CREATION_DATE from src.main.db_session import DatabaseSession from src.main.discord_module.leaderboard_config import LeaderboardConfig @@ -14,6 +14,7 @@ play_dao = None guess_dao = None bot = discord.Client() + @bot.event async def on_ready(): print('Logged in as') @@ -21,6 +22,7 @@ async def on_ready(): print(bot.user.id) print('------') + @bot.event async def on_message(message): if message.author == bot.user: @@ -35,16 +37,16 @@ async def on_message(message): if play_dao.is_active_play(): await message.channel.send("There's already an active play. Could you close that one first, please?") else: - play_object = {PLAY_ID : uuid.uuid4(), CREATION_DATE : datetime.datetime.now()} + play_object = {PLAY_ID: uuid.uuid4(), CREATION_DATE: datetime.datetime.now()} play_dao.insert(play_object) - await message.channel.send( "@flappyball, pitch is in! Send me your guesses with a !guess command.") + await message.channel.send("@flappyball, pitch is in! Send me your guesses with a !guess command.") if content.startswith("!guess"): guess_value = __parse_guess__(content) if not play_dao.is_active_play(): - await message.channel.send( "Hey, there's no active play! Start one up first with !ghostball.") + await message.channel.send("Hey, there's no active play! Start one up first with !ghostball.") else: play = play_dao.get_active_play() guess_object = {PLAY_ID: play['play_id'], @@ -60,19 +62,22 @@ async def on_message(message): # try: pitch_value = __parse_resolve_play__(content) if pitch_value is None: - await message.channel.send( "Hey " + "<@" + str(message.author.id) + ">, I'm not sure what you meant. " - "You need real, numeric, values for this command to work. " - "Use !resolve and try again.") + await message.channel.send("Hey " + "<@" + str(message.author.id) + ">, I'm not sure what you meant. " + "You need real, numeric, values for this command to work. " + "Use !resolve and try again.") # Check if we have an active play if not play_dao.is_active_play(): - await message.channel.send( "You confused me. There's no active play so I have nothing to close!") + await message.channel.send("You confused me. There's no active play so I have nothing to close!") else: play = play_dao.resolve_play(pitch_value) guess_dao.set_differences(pitch_value, play['play_id']) + closest_guess = guess_dao.get_closest_on_play(play['play_id']) await message.channel.send( - "You got it boss. Closed this play, no further guesses allowed!") + "Closed this play! " + "<@" + str(closest_guess[MEMBER_ID]) + + "> was the closest with a guess of " + closest_guess[GUESSED_NUMBER] + + " resulting in a difference of " + closest_guess[DIFFERENCE] + ".") # Likely due to too few parameters but could be any number of things # except : @@ -90,29 +95,34 @@ async def on_message(message): for i, value in enumerate(values): string_to_send += str(i + 1) + ': ' + value['member_name'] + ', ' + value['difference'] + '\n' - await message.channel.send( string_to_send) + await message.channel.send(string_to_send) elif leaderboard_config.should_sort_by_best_average(): pass else: - await message.channel.send( "I don't understand that leaderboard command, sorry! I know it's a little confusing, so send me" - " a !help message if you want the full rundown for how to make this work!") + await message.channel.send( + "I don't understand that leaderboard command, sorry! I know it's a little confusing, so send me" + " a !help message if you want the full rundown for how to make this work!") + + if content.startswith("!points"): + pass #TODO if content.startswith('!help'): help_message = __get_help_message__() recipient = await bot.fetch_user(message.author.id) await recipient.send(help_message) + def __get_help_message__(): # Start message with person who asked for help - help_message = "Hey! I can be instructed to do any number of things! Use the following commands: \n" \ - "!guess --- This will add your guess to the currently active play. " \ - "I will give you a thumbs up if everything worked!\n" \ - "!ghostball --- Starts a new play. I'll let you know if this didn't work for some reason!\n" \ - "!help --- You just asked for this. If you ask for it again, I'll repeat myself.\n" \ - "!resolve --- Uses the pitch number and real swing number " \ - "to figure out who was closest and ends the active play.\n" \ - "\n" + help_message = "Hey! I can be instructed to do any number of things! Use the following commands: \n" \ + "!guess --- This will add your guess to the currently active play. " \ + "I will give you a thumbs up if everything worked!\n" \ + "!ghostball --- Starts a new play. I'll let you know if this didn't work for some reason!\n" \ + "!help --- You just asked for this. If you ask for it again, I'll repeat myself.\n" \ + "!resolve --- Uses the pitch number and real swing number " \ + "to figure out who was closest and ends the active play.\n" \ + "\n" return help_message @@ -120,6 +130,7 @@ def __get_help_message__(): def __parse_leaderboard_message__(message_content): return LeaderboardConfig(message_content) + def __parse_guess__(message_content): pieces = message_content.split(' ') try: @@ -127,6 +138,7 @@ def __parse_guess__(message_content): except TypeError: return None + def __parse_resolve_play__(message_content): pieces = message_content.split(' ') try: @@ -134,6 +146,7 @@ def __parse_resolve_play__(message_content): except TypeError: return None + if __name__ == '__main__': args = sys.argv token = args[1] @@ -144,4 +157,4 @@ if __name__ == '__main__': play_dao = PlayDAO() guess_dao = GuessDAO() - bot.run(token) \ No newline at end of file + bot.run(token)