Esempio n. 1
0
        /// <summary>
        /// Finds all active games and ends every game that is 1 day old or older
        /// </summary>
        private async Task EndOldGames()
        {
            var activeGames = await _gameReaderWriter.GetActiveGamesAsync();

            foreach (var activeGame in activeGames)
            {
                var elapsedTime = DateTime.Now - activeGame.ThreadTimeStamp;
                if (elapsedTime.TotalDays >= 1.0)
                {
                    _gameReaderWriter.EndGame(activeGame.Id);
                }
            }
        }
        public async Task <PrintMessage> ProcessMessage(NewMessage message)
        {
            // Check Global Commands
            switch (message.text.ToLower().Trim())
            {
            case "wiki-bot: leaders":
            case "wiki-bot leaders":
            case "wiki-bot: leaderboard":
            case "wiki-bot leaderboard":
            case "wiki-bot leader board":
            case "wiki-bot: leader board":
                var leaderboardString = _leaderBoardGenerator.GenerateLeaderBoardString();
                if (string.IsNullOrEmpty(leaderboardString))
                {
                    return(new PrintMessage {
                        IsReply = false, MessageText = "No players are playering; Cannot generate leaderboard"
                    });
                }
                else
                {
                    return(new PrintMessage {
                        IsReply = false, MessageText = leaderboardString
                    });
                }
            }

            // Check if a new game has started
            GameStartData gameStartData = GetGameStartData(message);

            if (gameStartData.IsValid)
            {
                Console.WriteLine("New Game Started");
                _gameReaderWriter.CreateNewGame(gameStartData);
                return(new PrintMessage {
                    IsReply = true, MessageText = $"New Game Started! To end game, type \n> wiki-bot: end game", ThreadTs = message.ts
                });
            }
            else
            {
                var game = _gameReaderWriter.GetGame(message);

                if (game != null)
                {
                    switch (message.text.ToLower().Trim())
                    {
                    case "wiki-bot stats":
                    case "wiki-bot: stats":
                        var stats = _gameReaderWriter.GetGameStatistics(game.Id);
                        return(PrintStats(stats, game.Id));

                    case "wiki-bot end":
                    case "wiki-bot end game":
                    case "wiki-bot endgame":
                    case "wiki-bot: end":
                    case "wiki-bot: end game":
                    case "wiki-bot: endgame":
                        return(_gameReaderWriter.EndGame(game.Id));

                    default:
                        break;
                    }

                    var pathValidationOutput = await FindAndProcessPath(game, message);

                    // Only process valid messages as determined by validator output
                    if (pathValidationOutput != null && pathValidationOutput.IsValid)
                    {
                        var responce = _gameReaderWriter.AddGameEntry(new GameEntry
                        {
                            LinkCount = pathValidationOutput.PathLength,
                            User      = message.user,
                            RawText   = message.text,
                            UserName  = message.username,
                            GameId    = game.Id
                        });

                        if (responce == LoaderResponse.Success)
                        {
                            return(new PrintMessage {
                                IsReply = true, MessageText = $"{message.username}'s Entry Received! Number of clicks: {pathValidationOutput.PathLength}", ThreadTs = message.thread_ts
                            });
                        }
                        else
                        {
                            return(new PrintMessage {
                                IsReply = true, MessageText = $"You have already played this round. You only get one chance per game", ThreadTs = message.thread_ts
                            });
                        }
                    }
                    else
                    {
                        if (pathValidationOutput != null)
                        {
                            return(new PrintMessage {
                                IsReply = true, MessageText = pathValidationOutput.ValidationMessage, ThreadTs = message.thread_ts
                            });
                        }
                    }
                }
            }
            return(null);
        }