-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGameInterruptionService.cs
99 lines (83 loc) · 2.36 KB
/
GameInterruptionService.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using Harmonify.Data;
using Harmonify.Helpers;
using Harmonify.Messages;
using Harmonify.Models;
namespace Harmonify.Services;
public class GameInterruptionService(
IGameRepository gameRepository,
IGameService gameService,
IRoundService roundService,
IWebSocketSenderService webSocketSender
) : IGameInterruptionService
{
public bool TryStartGame(
string id,
StartGameDto data,
out long timestamp,
out string uri,
out string preview_url
)
{
var game = gameRepository.GetGame(id);
if (game?.State != GameState.GameSetup)
{
timestamp = 0;
uri = "";
preview_url = "";
return false;
}
game.Tracks = data.Tracks;
game.DrawnTracks = GameHelper.DrawTracksRandomly(data.Tracks, data.GameSettings.RoundCount);
game.Settings = data.GameSettings;
game.CurrentRound = 1;
gameService.RemoveDisconnectedPlayers(game);
timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
uri = game.CurrentTrack.Uri;
preview_url = game.CurrentTrack.Preview_url;
roundService.StartRound(game, timestamp);
return true;
}
public async Task ResumeGame(string gameId, string hostGuid)
{
var game = gameRepository.GetGame(gameId);
if (game == null || game.Host.Guid != hostGuid || !game.IsPaused)
{
return;
}
game.IsPaused = false;
var response = new Message { Type = MessageType.GameResumed };
await webSocketSender.SendToAllPlayers(gameId, response);
if (game.State == GameState.RoundResult)
{
_ = roundService.WaitAndStartNextRound(game);
}
}
public async Task PauseGame(string gameId, string hostGuid)
{
var game = gameRepository.GetGame(gameId);
if (game == null || game.Host.Guid != hostGuid || game.IsPaused)
{
return;
}
game.IsPaused = true;
game.LastPauseDate = DateTime.Now;
var response = new Message { Type = MessageType.GamePaused };
await webSocketSender.SendToAllPlayers(gameId, response);
}
public async Task<bool> TryEndRoundIfAllGuessessSubmitted(
string gameId,
IList<string> disconnectedPlayersIds
)
{
var game = gameRepository.GetGame(gameId);
if (
game?.State == GameState.RoundPlaying
&& GameHelper.HasEveryPlayerFinished(game, disconnectedPlayersIds)
)
{
await roundService.EndRound(game);
return true;
}
return false;
}
}