From a26256700d93392dfc92bfc6dc6842dac842cc15 Mon Sep 17 00:00:00 2001 From: Simponic Date: Wed, 1 Feb 2023 17:36:39 -0700 Subject: [PATCH] Do not send notifications when game is over & fix promotion screen (#15) --- lib/chessh/discord/notifier.ex | 32 ++++++++++++++---------------- lib/chessh/ssh/client/game/game.ex | 26 ++++++++++++++---------- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/lib/chessh/discord/notifier.ex b/lib/chessh/discord/notifier.ex index 683519e..6d7bd46 100644 --- a/lib/chessh/discord/notifier.ex +++ b/lib/chessh/discord/notifier.ex @@ -55,28 +55,26 @@ defmodule Chessh.DiscordNotifier do |> Keyword.take([:game_move_notif_delay_ms, :discord_game_move_notif_webhook]) |> Keyword.values() - case Repo.get(Game, game_id) do - nil -> - nil - - game -> - %Game{ - dark_player: %Player{discord_id: dark_player_discord_id}, - light_player: %Player{discord_id: light_player_discord_id}, - turn: turn, - updated_at: last_updated, - moves: move_count, - status: status - } = Repo.preload(game, [:dark_player, :light_player]) - + case Repo.get(Game, game_id) |> Repo.preload([:dark_player, :light_player]) do + %Game{ + dark_player: %Player{discord_id: dark_player_discord_id}, + light_player: %Player{discord_id: light_player_discord_id}, + turn: turn, + updated_at: last_updated, + moves: move_count, + status: :continue + } -> delta_t = NaiveDateTime.diff(NaiveDateTime.utc_now(), last_updated, :millisecond) - if delta_t >= min_delta_t && status == :continue do + if delta_t >= min_delta_t do post_discord( discord_game_move_notif_webhook, "<@#{if turn == :light, do: light_player_discord_id, else: dark_player_discord_id}> it is your move in Game #{game_id} (move #{move_count})." ) end + + _ -> + nil end end @@ -99,10 +97,10 @@ defmodule Chessh.DiscordNotifier do message = case {is_nil(light_player), is_nil(dark_player)} do {true, false} -> - "#{pingable_mention}, <@#{dark_player.discord_id}> is looking for an opponent to play as light in Game #{game_id}" + "#{pingable_mention}, <@#{dark_player.discord_id}> is looking for an opponent to play with light pieces in Game #{game_id}" {false, true} -> - "#{pingable_mention}, <@#{light_player.discord_id}> is looking for an opponent to play as dark in Game #{game_id}" + "#{pingable_mention}, <@#{light_player.discord_id}> is looking for an opponent to play with dark pieces in Game #{game_id}" _ -> false diff --git a/lib/chessh/ssh/client/game/game.ex b/lib/chessh/ssh/client/game/game.ex index fc48d6f..d6b0b5b 100644 --- a/lib/chessh/ssh/client/game/game.ex +++ b/lib/chessh/ssh/client/game/game.ex @@ -262,22 +262,21 @@ defmodule Chessh.SSH.Client.Game do do: Renderer.flip({new_cursor.y, new_cursor.x}), else: {new_cursor.y, new_cursor.x} - piece_type = - :binbo_position.get_piece( - :binbo_board.notation_to_index(Renderer.to_chess_coord(maybe_flipped_cursor_tup)), - :binbo.game_state(binbo_pid) - ) - {new_move_from, move_to} = if action == :return do coords = {new_cursor.y, new_cursor.x} case move_from do nil -> - if piece_type != 0 do - {coords, nil} - else + if :binbo_position.get_piece( + :binbo_board.notation_to_index( + Renderer.to_chess_coord(maybe_flipped_cursor_tup) + ), + :binbo.game_state(binbo_pid) + ) == 0 do {move_from, nil} + else + {coords, nil} end _ -> @@ -307,10 +306,15 @@ defmodule Chessh.SSH.Client.Game do }) if move_from && move_to do - maybe_flipped_to = if flipped, do: Renderer.flip(move_to), else: move_to + [maybe_flipped_to, maybe_flipped_from] = + [move_to, move_from] + |> Enum.map(fn coord -> if flipped, do: Renderer.flip(coord), else: coord end) promotion_possible = - case piece_type do + case :binbo_position.get_piece( + :binbo_board.notation_to_index(Renderer.to_chess_coord(maybe_flipped_from)), + :binbo.game_state(binbo_pid) + ) do 1 -> # Light pawn {y, _} = maybe_flipped_to