public virtual bool AddParty(string serviceUrl, string channelId, ChannelAccount channelAccount, ConversationAccount conversationAccount, bool isUser = true) { Party newParty = new PartyWithTimestamps(serviceUrl, channelId, channelAccount, conversationAccount); return(AddParty(newParty, isUser)); }
/// <summary> /// Tries to establish 1:1 chat between the two given parties. /// /// Note that the conversation owner will have a new separate party in the created /// conversation, if a new direct conversation is created. /// </summary> /// <param name="conversationOwnerParty">The party who owns the conversation (e.g. customer service agent).</param> /// <param name="conversationClientParty">The other party in the conversation.</param> /// <param name="createNewDirectConversation">If true, will try to create a new direct conversation between /// the bot and the conversation owner (e.g. agent) where the messages from the other (client) party are routed. /// Note that this will result in the conversation owner having a new separate party in the created connection /// (for the new direct conversation).</param> /// <returns>The result of the operation.</returns> public async Task <MessageRouterResult> ConnectAsync( Party conversationOwnerParty, Party conversationClientParty, bool createNewDirectConversation) { if (conversationOwnerParty == null || conversationClientParty == null) { throw new ArgumentNullException( $"Neither of the arguments ({nameof(conversationOwnerParty)}, {nameof(conversationClientParty)}) can be null"); } MessageRouterResult result = new MessageRouterResult() { ConversationOwnerParty = conversationOwnerParty, ConversationClientParty = conversationClientParty }; Party botParty = RoutingDataManager.FindBotPartyByChannelAndConversation( conversationOwnerParty.ChannelId, conversationOwnerParty.ConversationAccount); if (botParty != null) { if (createNewDirectConversation) { ConnectorClient connectorClient = new ConnectorClient(new Uri(conversationOwnerParty.ServiceUrl)); ConversationResourceResponse conversationResourceResponse = null; try { conversationResourceResponse = await connectorClient.Conversations.CreateDirectConversationAsync( botParty.ChannelAccount, conversationOwnerParty.ChannelAccount); } catch (Exception) { // Do nothing here as we fallback (continue without creating a direct conversation) } if (conversationResourceResponse != null && !string.IsNullOrEmpty(conversationResourceResponse.Id)) { // The conversation account of the conversation owner for this 1:1 chat is different - // thus, we need to re-create the conversation owner instance ConversationAccount directConversationAccount = new ConversationAccount(id: conversationResourceResponse.Id); conversationOwnerParty = new PartyWithTimestamps( conversationOwnerParty.ServiceUrl, conversationOwnerParty.ChannelId, conversationOwnerParty.ChannelAccount, directConversationAccount); RoutingDataManager.AddParty(conversationOwnerParty); RoutingDataManager.AddParty(new PartyWithTimestamps( botParty.ServiceUrl, botParty.ChannelId, botParty.ChannelAccount, directConversationAccount), false); result.ConversationResourceResponse = conversationResourceResponse; } } result = RoutingDataManager.ConnectAndClearPendingRequest(conversationOwnerParty, conversationClientParty); } else { result.Type = MessageRouterResultType.Error; result.ErrorMessage = "Failed to find the bot instance"; } return(result); }