From fb5977dfd571661dbbb579dbee5b150e5dfab72f Mon Sep 17 00:00:00 2001 From: Gareth Latty Date: Sat, 12 Dec 2015 18:37:24 +0000 Subject: [PATCH] Added catch-up events to mitigate missing events from before the client joined. --- client/src/MassiveDecks/Actions/Action.elm | 16 +++++++++++++--- client/src/MassiveDecks/Actions/Event.elm | 15 +++++++++++++++ client/src/MassiveDecks/States/Playing/UI.elm | 2 ++ client/src/MassiveDecks/States/Start.elm | 5 +++-- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/client/src/MassiveDecks/Actions/Action.elm b/client/src/MassiveDecks/Actions/Action.elm index 00b48d7..8d495c9 100644 --- a/client/src/MassiveDecks/Actions/Action.elm +++ b/client/src/MassiveDecks/Actions/Action.elm @@ -6,7 +6,7 @@ import Effects import MassiveDecks.Models.State exposing (InitialState) import MassiveDecks.Models.Game exposing (Lobby, LobbyAndHand) import MassiveDecks.Models.Player as Player -import MassiveDecks.Actions.Event exposing (Event, events) +import MassiveDecks.Actions.Event exposing (Event, events, catchUpEvents) type APICall a @@ -37,8 +37,18 @@ type Action eventEffects : Lobby -> Lobby -> Effects.Effects Action -eventEffects oldLobby newLobby - = events oldLobby newLobby +eventEffects oldLobby newLobby = + events oldLobby newLobby |> eventsToEffects + + +catchUpEffects : Lobby -> Effects.Effects Action +catchUpEffects lobby = + catchUpEvents lobby |> eventsToEffects + + +eventsToEffects : List Event -> Effects.Effects Action +eventsToEffects events + = events |> List.map GameEvent |> List.map Task.succeed |> List.map Effects.task diff --git a/client/src/MassiveDecks/Actions/Event.elm b/client/src/MassiveDecks/Actions/Event.elm index d6a5da4..c9eea27 100644 --- a/client/src/MassiveDecks/Actions/Event.elm +++ b/client/src/MassiveDecks/Actions/Event.elm @@ -23,6 +23,18 @@ events oldLobby newLobby = List.concat ] +{-| Generate events when joining an in-progress lobby to catch up. -} +catchUpEvents : Lobby -> List Event +catchUpEvents lobby = + case lobby.round of + Just round -> + case round.responses of + Hidden count -> [ roundPlayed count ] + Revealed _ -> [] + Nothing -> + [] + + diffPlayers : List Player -> List Player -> List Event diffPlayers oldPlayers newPlayers = List.concatMap (diffPlayer oldPlayers) newPlayers @@ -53,6 +65,9 @@ diffRound oldRound newRound = List.filterMap identity [ Maybe.map roundEnd oldRound , Maybe.map roundStart newRound + , newRound `Maybe.andThen` (\newRound -> case newRound.responses of + Hidden count -> Just (roundPlayed count) + Revealed _ -> Nothing) ] else Maybe.map2 changedRound oldRound newRound |> Maybe.withDefault [] diff --git a/client/src/MassiveDecks/States/Playing/UI.elm b/client/src/MassiveDecks/States/Playing/UI.elm index e1cd57e..3932c27 100644 --- a/client/src/MassiveDecks/States/Playing/UI.elm +++ b/client/src/MassiveDecks/States/Playing/UI.elm @@ -68,6 +68,7 @@ roundContents address data round = ] ] + consideringView : Signal.Address Action -> Int -> List Response -> Bool -> Html consideringView address considering consideringCards isCzar = let @@ -76,6 +77,7 @@ consideringView address considering consideringCards isCzar = ol [ class "considering" ] (List.append (List.map (\card -> li [] [ (playedResponse card) ]) consideringCards) extra) + winnerContentsAndHeader : Signal.Address Action -> FinishedRound -> List Player -> (List Html, List Html) winnerContentsAndHeader address round players = let diff --git a/client/src/MassiveDecks/States/Start.elm b/client/src/MassiveDecks/States/Start.elm index 3ce4a28..6220fea 100644 --- a/client/src/MassiveDecks/States/Start.elm +++ b/client/src/MassiveDecks/States/Start.elm @@ -7,7 +7,7 @@ import Html exposing (Html) import MassiveDecks.API as API import MassiveDecks.Models.State exposing (Model, State(..)) -import MassiveDecks.Actions.Action exposing (Action(..), APICall(..)) +import MassiveDecks.Actions.Action exposing (Action(..), APICall(..), catchUpEffects) import MassiveDecks.Models.State exposing (State(..), StartData, PlayingData, Error, Global) import MassiveDecks.States.Start.UI as UI import MassiveDecks.States.Config as Config @@ -47,7 +47,8 @@ update action global data = case action of case lobbyAndHand.lobby.round of Just _ -> (Playing.modelSub global lobbyId secret - (PlayingData lobbyAndHand.lobby lobbyAndHand.hand secret [] Nothing Nothing []), Effects.none) + (PlayingData lobbyAndHand.lobby lobbyAndHand.hand secret [] Nothing Nothing []), + catchUpEffects lobbyAndHand.lobby) Nothing -> (Config.modelSub global lobbyId secret