private void DoLeave(BingoPlayer player)
 {
     _data.Players.Remove(player);
     if (_data.Players.Count == 0)
     {
         EndGame();
     }
 }
        private string DoFormat(BingoPlayer player, string argument)
        {
            var format = argument?.ToLowerInvariant() ?? "";

            switch (format)
            {
            case "table":
            case "csv":
            case "tsv":
                player.Format = format;
                return($"Your format has been set to {format}");

            default:
                return($"Your current format is {player.Format}.  You can specify another format with one of the following commands:\r\n\r\n    /bingo format table        -- A table displayed inline in Slack\r\n\r\n    /bingo format csv          -- Comma-separated display\r\n\r\n    /bingo format tsv          -- Tab-separated display, for pasting directly into Excel or the like");
            }
        }
        private string DoJoin()
        {
            var player = new BingoPlayer {
                UserName = _userName, DisplayName = _displayName
            };

            _data.Players.Add(player);

            if (!_data.Started.HasValue)
            {
                return(null);
            }

            player.Card = GenerateCard();
            return(DoCard(player));
        }
        private string DoCard(BingoPlayer player)
        {
            var response = new StringBuilder("Your card is:\r\n```");

            response.Append(CreateTable(player.Format, player.Card));
            response.Append("```\r\n\r\n\r\nThe words which have been called so far are:\r\n`");

            for (var i = 0; i < _data.NextIndex; i++)
            {
                if (i > 0)
                {
                    response.Append("`, `");
                }
                response.Append(_data.WordSet[i]);
            }

            response.Append("`");

            return(response.ToString());
        }