private async Task SendOrScheduleAnnouncement(string type, IDialogContext context, Activity activity, TeamsChannelData channelData) { // Get all the details for announcement. var details = JsonConvert.DeserializeObject <AnnouncementActionDetails>(activity.Value.ToString()); // Add announcemnet in DB. if (details == null || details.Id == null) { details = JsonConvert.DeserializeObject <TaskModule.BotFrameworkCardValue <AnnouncementActionDetails> > (activity.Value.ToString()).Data; } var campaign = await Cache.Announcements.GetItemAsync(details.Id); if (campaign == null) { // Error: the annoucement was already sent await context.PostAsync("Unable to find this announcement. Please create new announcement."); return; } if (campaign.Status == Status.Sent) { // Error: no recipients await context.PostAsync("This announcement is already sent and can not be resent. Please create new announcement."); return; } else if (type == Constants.SendAnnouncement) { await context.PostAsync("Please wait while we send this announcement to all recipients."); } if (campaign.Recipients.Channels.Count == 0 && campaign.Recipients.Groups.Count == 0) { await context.PostAsync("No recipients. Please select at least one recipient."); return; } // Handle old records. if (string.IsNullOrEmpty(campaign.Recipients.TenantId)) { campaign.Recipients.TenantId = channelData.Tenant.Id; campaign.Recipients.ServiceUrl = activity.ServiceUrl; } // Send or schedule the announcement, depending on what the user clicked if (type == Constants.SendAnnouncement) { await SendAnnouncement(context, activity, channelData, campaign); } else { await ScheduleAnnouncement(context, activity, channelData, campaign); } var oldAnnouncementDetails = context.ConversationData.GetValueOrDefault <PreviewCardMessageDetails>(campaign.Id); if (oldAnnouncementDetails != null) { ConnectorClient connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl)); // Update card. var updateCard = campaign.GetPreviewCard().ToAttachment(); var updateMessage = context.MakeMessage(); updateMessage.Attachments.Add(CardHelper.GetCardToUpdatePreviewCard(updateCard, $"Note: This announcement is { (type == Constants.SendAnnouncement ? "sent" : "scheduled") } successfully.")); await connectorClient.Conversations.UpdateActivityAsync(activity.Conversation.Id, oldAnnouncementDetails.MessageCardId, (Activity)updateMessage); // Update action card. var message = type == Constants.SendAnnouncement ? "We have send this announcement successfully. Please create new announcement to send again." : $"We have scheduled this announcement to be sent at {campaign.Schedule.ScheduledTime.ToString("MM/dd/yyyy hh:mm tt")}. Note that announcements scheduled for past date will be sent immediately."; var updateAnnouncement = CardHelper.GetUpdateMessageCard(message); updateMessage = context.MakeMessage(); updateMessage.Attachments.Add(updateAnnouncement); await connectorClient.Conversations.UpdateActivityAsync(activity.Conversation.Id, oldAnnouncementDetails.MessageActionId, (Activity)updateMessage); context.ConversationData.RemoveValue(campaign.Id); } else if (type == Constants.ScheduleAnnouncement) { var message = $"We have re-scheduled the announcement to be sent at {campaign.Schedule.ScheduledTime.ToString("MM/dd/yyyy hh:mm tt")}."; await context.PostAsync(message); var reply = activity.CreateReply(); reply.Attachments.Add(CardHelper.GetAnnouncementBasicDetails(campaign)); await context.PostAsync(reply); } }