Example #1
0
        static async Task <JObject> GetNextMatchToPlayAsync(
            TourneyDal tourneyDal, HashSet <string> playedMatchIds)
        {
            JArray openMatches = await tourneyDal.GetOpenMatchesAsync();

            IList <JToken> nonMessagedMatches =
                openMatches.Where(match =>
                                  !playedMatchIds.Contains(match["match"]["id"].Value <string>())).ToList();
            IList <JToken> sortedNonMessagedMatches =
                nonMessagedMatches.OrderBy(openMatch =>
                                           openMatch["match"]["suggested_play_order"].Value <int>()).ToList();

            return((JObject)sortedNonMessagedMatches.First());
        }
Example #2
0
        public static async Task <HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]
            HttpRequest req, ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            var data = await req.ReadAsStringAsync();

            var formValues = data.Split('&')
                             .Select(value => value.Split('='))
                             .ToDictionary(pair => Uri.UnescapeDataString(pair[0]).Replace("+", " "),
                                           pair => Uri.UnescapeDataString(pair[1]).Replace("+", " "));

            string senderNumber = "+" + formValues["From"].Substring(1);

            if (formValues["Body"].Trim().ToLower() != "i won")
            {
                var error = new MessagingResponse()
                            .Message($"DON'T @ ME!!  You sent {formValues["Body"]}.  I only respect 'I won' (no quotes)");
                var errorTwiml = error.ToString();
                errorTwiml = errorTwiml.Replace("utf-16", "utf-8");

                return(new HttpResponseMessage
                {
                    Content = new StringContent(errorTwiml.ToString(), Encoding.UTF8, "application/xml")
                });
            }

            string accountId = Environment.GetEnvironmentVariable("accountId");
            string authToken = Environment.GetEnvironmentVariable("authToken");
            var    myNumber  = new PhoneNumber(Environment.GetEnvironmentVariable("myNumber"));

            // lookup the sender

            string tourneyId  = Environment.GetEnvironmentVariable("ChallongeTournamentId");
            string apiKey     = Environment.GetEnvironmentVariable("ChallongeApiKey");
            var    tourneyDal = new TourneyDal(apiKey, tourneyId);
            var    mongoDal   = new MongoDal();

            Participant senderParticipant = await mongoDal.GetParticipantByPhoneNumberAsync(senderNumber);

            // get the sender's game
            JArray openGamesForSender = await tourneyDal.GetOpenMatchesAsync(senderParticipant.ChallongeId);

            var senderGame = (JObject)openGamesForSender.Single();

            string loserId;
            string orderedScore;

            if (senderGame["match"]["player1_id"].Value <string>() == senderParticipant.ChallongeId)
            {
                loserId      = senderGame["match"]["player2_id"].Value <string>();
                orderedScore = "2-0";
            }
            else
            {
                loserId      = senderGame["match"]["player1_id"].Value <string>();
                orderedScore = "0-2";
            }

            // get the loser to send them a message
            Participant loserParticipant = await mongoDal.GetParticipantByChallongeIdAsync(loserId);

            // assume sender won and update that game
            await tourneyDal.UpdateWinnerAsync(
                senderGame["match"]["id"].Value <string>(),
                senderParticipant.ChallongeId,
                orderedScore);

            // get matches that have been notified before
            Matches matches = await mongoDal.GetMatchesAsync();

            var notifiedMatchIds = new HashSet <string> (matches.MatchIds, StringComparer.OrdinalIgnoreCase);

            JObject nextMatch = await GetNextMatchToPlayAsync(tourneyDal, notifiedMatchIds);

            Participant player1 = await mongoDal.GetParticipantByChallongeIdAsync(
                nextMatch["match"]["player1_id"].Value <string>());

            Participant player2 = await mongoDal.GetParticipantByChallongeIdAsync(
                nextMatch["match"]["player2_id"].Value <string>());

            // text next players
            var nextPlayer1 = new PhoneNumber(player1.PhoneNumber);
            var nextPlayer2 = new PhoneNumber(player2.PhoneNumber);

            TwilioClient.Init(accountId, authToken);

            var congrats = MessageResource.Create(
                body: $"Congrats on winning! :D",
                from: myNumber,
                to: new PhoneNumber(senderNumber));

            var sorry = MessageResource.Create(
                body: $"Tough match :/",
                from: myNumber,
                to: new PhoneNumber(loserParticipant.PhoneNumber));

            var p2notification = MessageResource.Create(
                body: $"You're up now against {player1.Name}. Please go find the open TV.",
                from: myNumber,
                to: nextPlayer2);

            var p1notification = MessageResource.Create(
                body: $"You're up now against {player2.Name}. Please go find the open TV.",
                from: myNumber,
                to: nextPlayer1);

            TwilioClient.Invalidate();

            // update database
            await mongoDal.UpdateMatchListAsync(matches, nextMatch["match"]["id"].Value <string>());

            return(new HttpResponseMessage
            {
            });
        }