diff --git a/contracts/room_contract.go b/contracts/room_contract.go index 7c7824b..6ac09e7 100644 --- a/contracts/room_contract.go +++ b/contracts/room_contract.go @@ -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 }