コード例 #1
0
        /// <summary>
        /// Send event card
        /// </summary>
        /// <param name="eventMessages">List of EventMessage</param>
        /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
        private async Task SendEventCard(List <EventMessage> eventMessages)
        {
            var tasks = Task.Run(() =>
            {
                Parallel.ForEach(eventMessages, new ParallelOptions {
                    MaxDegreeOfParallelism = MaxParallelism
                }, async(eventMessage) =>
                {
                    var activity  = eventMessage.Activity;
                    HeroCard card = null;
                    switch (eventMessage.MessageType)
                    {
                    case MessageType.Event:
                        card = CelebrationCard.GetEventCard(activity);
                        break;

                    case MessageType.Preview:
                        card = CelebrationCard.GetPreviewCard(activity);
                        break;
                    }

                    var task = this.connectorServiceHelper.SendPersonalMessageAsync(string.Empty, new List <Attachment> {
                        card.ToAttachment()
                    }, activity.ConversationId);

                    RetryWithExponentialBackoff retryBackOff = new RetryWithExponentialBackoff();
                    await retryBackOff.RunAsync(task, eventMessage, this.SuccessCallback, this.FailureCallback);
                });
            });

            await tasks;
        }
コード例 #2
0
 /// <summary>
 /// Gets the card to send
 /// </summary>
 /// <returns>The card to send</returns>
 public Attachment GetCard()
 {
     return(CelebrationCard.GetEventCard(this.Event, this.User.DisplayName).ToAttachment());
 }
コード例 #3
0
        /// <summary>
        /// Process and send all the due events in a team.
        /// </summary>
        /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
        private async Task ProcessEvents()
        {
            foreach (var teamId in this.teamsEventsDictionary.Keys)
            {
                List <string> eventIds = new List <string>();
                this.teamsEventsDictionary.TryGetValue(teamId, out eventIds);
                List <Attachment>   cardAttachments            = new List <Attachment>();
                List <EventMessage> eventMessages              = new List <EventMessage>();
                const int           maxEventPerCarousel        = 6;
                const int           minEventToSendIndividually = 3;
                int counter = 0;
                List <EventNotificationCardPayload> eventNotificationCardPayloadList = new List <EventNotificationCardPayload>();
                List <Entity> entities = new List <Entity>();
                foreach (var eventId in eventIds)
                {
                    counter++;
                    var recurringEvent   = this.recurringEvents.Where(x => x.EventId == eventId).FirstOrDefault();
                    var celebrationEvent = this.celebrationEvents.Where(x => x.Id == eventId).FirstOrDefault();

                    // Get event owner information.
                    var user = this.users.Where(x => x.AadObjectId == celebrationEvent.OwnerAadObjectId).FirstOrDefault();

                    // Add an Entry to Messages collection.
                    EventMessage eventMessage = await this.AddEntryToEventMessagesCollection(teamId, recurringEvent, celebrationEvent, user);

                    eventMessages.Add(eventMessage);

                    // Get Hero card for event.
                    HeroCard card = CelebrationCard.GetEventCard(eventMessage.Activity);

                    EventNotificationCardPayload eventNotificationCardPayload = new EventNotificationCardPayload()
                    {
                        UserName    = user.UserName,
                        UserTeamsId = user.TeamsId,
                        Message     = $"<at>{user.UserName}</at> is celebrating {celebrationEvent.Title}",
                        Attachment  = card.ToAttachment(),
                    };

                    eventNotificationCardPayloadList.Add(eventNotificationCardPayload);

                    if (eventIds.Count > minEventToSendIndividually && (counter % maxEventPerCarousel == 0 || counter == eventIds.Count))
                    {
                        eventNotificationCardPayloadList = eventNotificationCardPayloadList.OrderBy(x => x.UserName).ToList();

                        string message = "Stop the presses! Today ";
                        foreach (var notificationPayload in eventNotificationCardPayloadList)
                        {
                            message = message + notificationPayload.Message + ",";
                            cardAttachments.Add(notificationPayload.Attachment);

                            AddMentionedEntities(entities, notificationPayload);
                        }

                        message = message.TrimEnd(',');
                        int position = message.LastIndexOf(',');
                        message = (message.Substring(0, position) + " and " + message.Substring(position + 1)).Replace(",", ", ") + ". That’s a lot of merrymaking for one day—pace yourselves! \n\n";

                        // Do not send separate message in case of 1 event.
                        if (eventNotificationCardPayloadList.Count == 1)
                        {
                            message = string.Empty;
                        }

                        // send event notification in team.
                        this.logProvider.LogInfo("Sending event message in team", new Dictionary <string, string>()
                        {
                            { "EventId", celebrationEvent.Id },
                            { "TeamId", teamId },
                            { "Attachment", cardAttachments.ToString() },
                            { "Message", message },
                        });
                        await this.SendEventCard(message, cardAttachments, teamId, eventMessages, entities);

                        // Reset list
                        cardAttachments = new List <Attachment>();
                        eventMessages   = new List <EventMessage>();
                        eventNotificationCardPayloadList = new List <EventNotificationCardPayload>();
                        entities = new List <Entity>();
                    }
                    else if (eventIds.Count <= minEventToSendIndividually)
                    {
                        this.logProvider.LogInfo("Sending event message in team", new Dictionary <string, string>()
                        {
                            { "EventId", celebrationEvent.Id },
                            { "TeamId", teamId },
                            { "Attachment", cardAttachments.ToString() },
                            { "Message", string.Empty },
                        });
                        await this.SendEventCard(string.Empty, new List <Attachment> {
                            eventNotificationCardPayload.Attachment
                        }, teamId, eventMessages);

                        // Reset list
                        cardAttachments = new List <Attachment>();
                        eventMessages   = new List <EventMessage>();
                        eventNotificationCardPayloadList = new List <EventNotificationCardPayload>();
                        entities = new List <Entity>();
                    }
                }
            }

            // Delete entry from occurrences collection.
            foreach (var recurringEvent in this.recurringEvents)
            {
                this.logProvider.LogInfo("Deleting recurring event", new Dictionary <string, string>()
                {
                    { "EventId", recurringEvent.EventId },
                    { "RecurringEventId", recurringEvent.Id },
                });
                await this.eventHelper.DeleteRecurringEventAsync(recurringEvent.Id, recurringEvent.EventId);
            }
        }