feat: split finish game methods

This commit is contained in:
Nikita Mikhalev 2025-01-19 20:32:34 +03:00
parent 03963987a4
commit bcc72a6261

View file

@ -111,7 +111,7 @@ func chooseWinner(round Round, countWinners int) []Answer {
for i := 1; i < len(answers) && len(winners) < countWinners; i++ {
var currentVote = len(answers[i].votes)
if lastVote == currentVote {
countWinners++
countWinners++ // todo: Могут возникнуть проблемы, надо протестировать
}
lastVote = currentVote
winners = append(winners, answers[i])
@ -224,7 +224,7 @@ func AskQuestion(roomId string, question string) bool {
sendMessageToPlayer(question, player)
}
// todo: Не забыть про ннс
// todo: Не забыть про nns
// todo: Добавить списание токенов за создание вопроса
setRoom(ctx, &room)
@ -326,7 +326,6 @@ func GetWinner(roomId string) bool {
return false // Zero winners, because no answer
}
// todo: Надо подумать с увеличением количества, там в методе расписана проблема, но вроде все должно работать нормально с такой реализацией
var winners = chooseWinner(round, room.CountWinners)
var result string
for i, winner := range winners {
@ -353,7 +352,7 @@ func VoteToFinishGame(roomId string) bool {
return false // Host cannot vote to finish game
}
var count = 0
var voted = 0
var isFound = false
for i, p := range room.Players {
if p.Wallet.Equals(wallet) {
@ -365,24 +364,28 @@ func VoteToFinishGame(roomId string) bool {
}
if p.isVotedToFinish {
count++ // Count voted players for finish the game
voted++ // Count voted players for finish the game
}
}
if count == len(room.Players) && isFound {
// todo: Можно добавить notify для уведомления, сколько людей проголосовало за завершение игры
/* todo: Тут можно вызывать finishGame, но тогда надо сделать какую то защиту, например HostFinish будет
* проверять, что sender хост и вызывать основной метод finish, а тут будет вызван PlayersFinish, без проверки.
*/
return true
if !isFound {
return false // Player was not found in the room
}
return false // Player not found in the room
// todo: Можно добавить notify для уведомления, сколько людей проголосовало за завершение игры
return automaticFinishGame(ctx, &room, voted)
}
func FinishGame(roomId string) bool {
func automaticFinishGame(ctx storage.Context, room *Room, voted int) bool {
if voted != len(room.Players) {
return false // All players must voted for finish the game
}
return finishGame(ctx, room)
}
func ManuallyFinishGame(roomId string) bool {
var ctx = storage.GetContext()
var room = getRoom(ctx, roomId)
@ -390,11 +393,16 @@ func FinishGame(roomId string) bool {
return false // Only host can finish game, room status must be game is going
}
// todo победитель всей игры? итоги? что нибудь еще?
// todo добавить вилку, что если ВСЕ участники согласились закончить игру - заканчиваем
return finishGame(ctx, &room)
}
func finishGame(ctx storage.Context, room *Room) bool {
// todo: Отправка награды победителям и хосту
// todo: Нотификация результатов всей игры
room.Status = RoomStatusFinished
setRoom(ctx, &room)
setRoom(ctx, room)
return true
}