Пример #1
0
        /// <summary>
        /// Tries to reject all pending requests.
        /// </summary>
        /// <param name="messageRouter">The message router.</param>
        /// <param name="messageRouterResultHandler">The message router result handler.</param>
        /// <returns>True, if successful. False otherwise.</returns>
        public async Task <bool> RejectAllPendingRequestsAsync(
            MessageRouter messageRouter, MessageRouterResultHandler messageRouterResultHandler)
        {
            bool wasSuccessful = false;
            IList <ConnectionRequest> connectionRequests = messageRouter.RoutingDataManager.GetConnectionRequests();

            if (connectionRequests.Count > 0)
            {
                IList <ConnectionRequestResult> connectionRequestResults =
                    new List <ConnectionRequestResult>();

                foreach (ConnectionRequest connectionRequest in connectionRequests)
                {
                    connectionRequestResults.Add(
                        messageRouter.RejectConnectionRequest(connectionRequest.Requestor));
                }

                foreach (ConnectionRequestResult connectionRequestResult in connectionRequestResults)
                {
                    await messageRouterResultHandler.HandleResultAsync(connectionRequestResult);
                }

                wasSuccessful = true;
            }

            return(wasSuccessful);
        }
Пример #2
0
        /// <summary>
        /// Tries to accept/reject a pending connection request.
        /// </summary>
        /// <param name="messageRouter">The message router.</param>
        /// <param name="messageRouterResultHandler">The message router result handler.</param>
        /// <param name="sender">The sender party (accepter/rejecter).</param>
        /// <param name="doAccept">If true, will try to accept the request. If false, will reject.</param>
        /// <param name="requestorChannelAccountId">The channel account ID of the user/bot whose request to accept/reject.</param>
        /// <param name="requestorConversationAccountId">The conversation account ID of the user/bot whose request to accept/reject.</param>
        /// <returns>The result.</returns>
        public async Task <AbstractMessageRouterResult> AcceptOrRejectRequestAsync(
            MessageRouter messageRouter, MessageRouterResultHandler messageRouterResultHandler,
            ConversationReference sender, bool doAccept,
            ChannelAccount requestorChannelAccountId, ConversationAccount requestorConversationAccountId)
        {
            AbstractMessageRouterResult messageRouterResult = new ConnectionRequestResult()
            {
                Type = ConnectionRequestResultType.Error
            };

            try {
                ConversationReference requestor =
                    new ConversationReference(
                        null, requestorChannelAccountId, null, requestorConversationAccountId);

                ConnectionRequest connectionRequest =
                    messageRouter.RoutingDataManager.FindConnectionRequest(requestor);

                if (connectionRequest == null)
                {
                    // Try bot
                    requestor.Bot  = requestor.User;
                    requestor.User = null;

                    connectionRequest =
                        messageRouter.RoutingDataManager.FindConnectionRequest(requestor);
                }

                if (connectionRequest != null)
                {
                    Connection connection = null;

                    if (sender != null)
                    {
                        connection = messageRouter.RoutingDataManager.FindConnection(sender);
                    }

                    ConversationReference senderInConnection = null;
                    ConversationReference counterpart        = null;

                    if (connection != null && connection.ConversationReference1 != null)
                    {
                        if (RoutingDataManager.Match(sender, connection.ConversationReference1))
                        {
                            senderInConnection = connection.ConversationReference1;
                            counterpart        = connection.ConversationReference2;
                        }
                        else
                        {
                            senderInConnection = connection.ConversationReference2;
                            counterpart        = connection.ConversationReference1;
                        }
                    }

                    if (doAccept)
                    {
                        if (senderInConnection != null)
                        {
                            // The sender (accepter/rejecter) is ALREADY connected to another party
                            if (counterpart != null)
                            {
                                messageRouterResult.ErrorMessage = string.Format(
                                    Strings.AlreadyConnectedWithUser,
                                    RoutingDataManager.GetChannelAccount(counterpart)?.Name);
                            }
                            else
                            {
                                messageRouterResult.ErrorMessage = Strings.ErrorOccured;
                            }
                        }
                        else
                        {
                            bool createNewDirectConversation =
                                (_noDirectConversationsWithChannels == null ||
                                 !(_noDirectConversationsWithChannels.Contains(sender.ChannelId.ToLower())));

                            // Try to accept
                            messageRouterResult = await messageRouter.ConnectAsync(
                                sender,
                                connectionRequest.Requestor,
                                createNewDirectConversation);
                        }
                    }
                    else
                    {
                        // Note: Rejecting is OK even if the sender is alreay connected
                        messageRouterResult = messageRouter.RejectConnectionRequest(connectionRequest.Requestor, sender);
                    }
                }
                else
                {
                    messageRouterResult.ErrorMessage = Strings.FailedToFindPendingRequest;
                }
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine($"{e.Message}");
            }
            return(messageRouterResult);
        }