-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPlayerService.cs
92 lines (77 loc) · 2.32 KB
/
PlayerService.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
using Harmonify.Data;
using Harmonify.Helpers;
using Harmonify.Messages;
using Harmonify.Models;
namespace Harmonify.Services;
public class PlayerService(IGameRepository gameRepository) : IPlayerService
{
public void AddPlayer(string id, Player player)
{
var game = gameRepository.GetGame(id);
if (game == null)
{
return;
}
while (game.Players.Any(p => p.Nickname == player.Nickname))
{
player.Nickname = NameGenerator.GetName();
}
game.Players.Add(player);
}
public bool TryChangeName(string id, string playerGuid, string newNickname)
{
var game = gameRepository.GetGame(id);
if (game?.State != GameState.GameSetup)
{
return false;
}
var player = game.Players.Find(player => player.Guid == playerGuid);
var nicknameAlreadyUsed = game.Players.Any(player => player.Nickname == newNickname);
if (player == null || nicknameAlreadyUsed)
{
return false;
}
player.Nickname = newNickname;
return true;
}
public bool TryEvaluatePlayerGuess(string gameId, string playerGuid, string userGuess)
{
var game = gameRepository.GetGame(gameId);
var player = game?.Players.Find((p) => p.Guid == playerGuid);
if (
game?.State != GameState.RoundPlaying
|| player == null
|| player.RoundResults.Count == game.CurrentRound
)
{
return false;
}
var guessTime =
(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - game.RoundStartTimestamp) / 1000;
var correctGuess = game.CurrentTrack.Guess;
var roundResult = GameHelper.GetRoundResult(guessTime, userGuess, correctGuess);
player.Score += roundResult.Score;
player.RoundResults.Add(roundResult);
return true;
}
public bool IsAuthorized(string gameId, string playerGuid, MessageType messageType)
{
if (messageType == MessageType.StartGame || messageType == MessageType.EndGame)
{
return gameRepository.GetGame(gameId)?.Host.Guid == playerGuid;
}
return true;
}
public void DisconnectPlayer(string gameId, string playerGuid)
{
var player = gameRepository.GetGame(gameId)?.Players.Find((p) => p.Guid == playerGuid);
if (player != null)
{
player.Connected = false;
}
}
public void HandlePlayerReconnect(string playerGuid, string gameId)
{
throw new NotImplementedException();
}
}