/// <summary> /// Routes the message in the given activity, if the sender is connected in a conversation. /// </summary> /// <param name="activity">The activity to handle.</param> /// <param name="addNameToMessage">If true, will add the name of the sender to the beginning of the message.</param> /// <returns>The result of the operation: /// - MessageRouterResultType.NoActionTaken, if no routing rule for the sender is found OR /// - MessageRouterResultType.OK, if the message was routed successfully OR /// - MessageRouterResultType.FailedToForwardMessage in case of an error (see the error message). /// </returns> public virtual async Task <MessageRoutingResult> RouteMessageIfSenderIsConnectedAsync( IMessageActivity activity, bool addNameToMessage = true) { ConversationReference sender = CreateSenderConversationReference(activity); Connection connection = RoutingDataManager.FindConnection(sender); MessageRoutingResult messageRoutingResult = new MessageRoutingResult() { Type = MessageRoutingResultType.NoActionTaken, Connection = connection }; if (connection != null) { ConversationReference recipient = RoutingDataManager.Match(sender, connection.ConversationReference1) ? connection.ConversationReference2 : connection.ConversationReference1; if (recipient != null) { string message = activity.Text; if (addNameToMessage) { string senderName = RoutingDataManager.GetChannelAccount(sender).Name; if (!string.IsNullOrWhiteSpace(senderName)) { message = $"{senderName}: {message}"; } } ResourceResponse resourceResponse = await SendMessageAsync(recipient, message); if (resourceResponse != null) { messageRoutingResult.Type = MessageRoutingResultType.MessageRouted; if (!RoutingDataManager.UpdateTimeSinceLastActivity(connection)) { Logger.Log("Failed to update the time since the last activity property of the connection"); } } else { messageRoutingResult.Type = MessageRoutingResultType.FailedToRouteMessage; messageRoutingResult.ErrorMessage = $"Failed to forward the message to the recipient"; } } else { messageRoutingResult.Type = MessageRoutingResultType.Error; messageRoutingResult.ErrorMessage = "Failed to find the recipient to forward the message to"; } } return(messageRoutingResult); }
/// <summary> /// Disconnects all connections associated with the given conversation reference. /// </summary> /// <param name="conversationReference">The conversation reference connected in a conversation.</param> /// <returns>The results: /// - ConnectionResultType.Disconnected, /// - ConnectionResultType.Error (see the error message for more details). /// </returns> public virtual IList <ConnectionResult> Disconnect(ConversationReference conversationReference) { IList <ConnectionResult> disconnectResults = new List <ConnectionResult>(); bool wasDisconnected = true; while (wasDisconnected) { wasDisconnected = false; Connection connection = RoutingDataManager.FindConnection(conversationReference); if (connection != null) { ConnectionResult disconnectResult = RoutingDataManager.Disconnect(connection); disconnectResults.Add(disconnectResult); if (disconnectResult.Type == ConnectionResultType.Disconnected) { wasDisconnected = true; } } } return(disconnectResults); }