示例#1
0
        public async Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = default(CancellationToken))
        {
            Activity activity = turnContext.Activity;

            if (activity.Type is ActivityTypes.Message)
            {
                //Add User Context in the turn context
                ConversationReference selfConversation = activity.GetConversationReference();
                ChatUserContext       userContext      = ChatUserContext.FromConversation(selfConversation);
                if (activity.ChannelId.ToLower() != _config.AdminChannel ||
                    !UserRoleCache.UserRoles.ContainsKey(userContext.Id))
                {
                    userContext.Role = ChatUserRole.Consumer;
                }
                else
                {
                    userContext.Role = UserRoleCache.UserRoles[userContext.Id];
                }
                selfConversation.User.Role = userContext.Role.ToString();
                turnContext.TurnState.Add(typeof(ChatUserContext).FullName, userContext);

                //Add Message router in the turn context
                ConnectorClient connectorClient = turnContext.TurnState.Get <ConnectorClient>(typeof(IConnectorClient).FullName);
                MessageRouter   messageRouter   = new MessageRouter(connectorClient, activity, _logger);
                turnContext.TurnState.Add(typeof(MessageRouter).FullName, messageRouter);

                //Ensure that each user only has one conversation active, and notify the other sessions where a conversation replaced it.
                IEnumerable <ConversationReference> otherConversations = await _routingDataManager.GetConversationsFromUser(selfConversation.User.Id);

                //Remove current conversation
                otherConversations = _routingDataManager.RemoveSelfConversation(otherConversations, selfConversation);
                //Send a notification to all old conversations
                if (otherConversations.Count() > 0)
                {
                    foreach (var otherConversation in otherConversations)
                    {
                        await messageRouter.SendErrorMessageAsync(otherConversation, "You were disconnected from this instance.");
                    }
                }
                //Store the new conversation
                await _routingDataManager.SaveConversationReference(selfConversation);

                //Leave this middleware
                await next(cancellationToken).ConfigureAwait(false);
            }
            if (activity.Type is ActivityTypes.EndOfConversation)
            {
                ConversationReference selfConversation = activity.GetConversationReference();
                _logger.LogInformation($"Conversation Ended: {selfConversation.Conversation.Id}");
            }
        }