/// <summary> /// Sends the given message to the given recipient. /// </summary> /// <param name="recipient">The conversation reference of the recipient.</param> /// <param name="message">The message to send.</param> /// <returns>A valid resource response instance, if successful. Null in case of an error.</returns> public virtual async Task <ResourceResponse> SendMessageAsync( ConversationReference recipient, string message) { IMessageActivity messageActivity = ConnectorClientMessageBundle.CreateMessageActivity(null, recipient, message); // The sender to the message activity above is resolved in the method here: return(await SendMessageAsync(recipient, messageActivity)); }
/// <summary> /// Sends the given message to the given recipient. /// </summary> /// <param name="recipient">The conversation reference of the recipient.</param> /// <param name="messageActivity">The message activity to send.</param> /// <returns>A valid resource response instance, if successful. Null in case of an error.</returns> public virtual async Task <ResourceResponse> SendMessageAsync( ConversationReference recipient, IMessageActivity messageActivity) { if (recipient == null) { Logger.Log("The conversation reference is null"); return(null); } // We need the bot identity in the SAME CHANNEL/CONVERSATION as the RECIPIENT - // Otherwise, the platform (e.g. Slack) will reject the incoming message as it does not // recognize the sender ConversationReference botInstance = RoutingDataManager.FindBotInstanceForRecipient(recipient); if (botInstance == null || botInstance.Bot == null) { Logger.Log("Failed to find the bot instance"); return(null); } messageActivity.From = botInstance.Bot; messageActivity.Recipient = RoutingDataManager.GetChannelAccount(recipient); // Make sure the message activity contains a valid conversation ID if (messageActivity.Conversation == null) { messageActivity.Conversation = recipient.Conversation; } ConnectorClientMessageBundle bundle = new ConnectorClientMessageBundle( recipient.ServiceUrl, messageActivity, _microsoftAppCredentials); ResourceResponse resourceResponse = null; try { resourceResponse = await bundle.ConnectorClient.Conversations.SendToConversationAsync( (Activity)bundle.MessageActivity); } catch (UnauthorizedAccessException e) { Logger.Log($"Failed to send message: {e.Message}"); } catch (Exception e) { Logger.Log($"Failed to send message: {e.Message}"); } return(resourceResponse); }