Пример #1
0
        public void SendMessageToUser(string userId, string message)
        {
            var signalRPublisher   = new SignalRPublisher();
            var inMemoryRepository = new InMemoryUserRepository();

            var currentUser = inMemoryRepository.Get(Guid.Parse(Context.ConnectionId));
            var toUser      = inMemoryRepository.Get(Guid.Parse(userId));

            signalRPublisher.Send(currentUser.Id, BuildChatReceived(currentUser, toUser, message));
            signalRPublisher.Send(toUser.Id, BuildChatReceived(currentUser, toUser, message));
        }
        private async Task HandleUserIdPrompt(IDialogContext context, IAwaitable <string> result)
        {
            Debug.WriteLine("UnknownUserRootDialog.HandleUserIdPrompt > Start");
            try {
                var userName = await result;

                Debug.WriteLine("UnknownUserRootDialog.HandleUserIdPrompt > Before context.PostAsync");
                await context.PostAsync($"Welcome {userId}!");

                Debug.WriteLine("UnknownUserRootDialog.HandleUserIdPrompt > After context.PostAsync");

                var userRepository = InMemoryUserRepository.Get();
                userId = userRepository.RegisterChannelUser(context.Activity.From.Id, userName);

                context.UserData.SetValue(ConversationStorageKeys.UserNameId, userId);
            }
            catch (TooManyAttemptsException)
            {
            }

            Debug.WriteLine("UnknownUserRootDialog.HandleUserIdPrompt > Before context.Wait");
            context.Wait(this.MessageReceivedAsync);
            Debug.WriteLine("UnknownUserRootDialog.HandleUserIdPrompt > After context.Wait");
        }
Пример #3
0
        private Activity HandleSystemMessage(Activity message)
        {
            Debug.WriteLine("MessagesController.HandleSystemMessage");
            if (message.Type == ActivityTypes.DeleteUserData)
            {
                Debug.WriteLine("MessagesController.HandleSystemMessage > DeleteUserData");
                // Implement user deletion here
                // If we handle user deletion, return a real message
            }
            else if (message.Type == ActivityTypes.ConversationUpdate)
            {
                Debug.WriteLine("MessagesController.HandleSystemMessage > ConversationUpdate");
                // Handle conversation state changes, like members being added and removed
                // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info
                // Not available in all channels

                //https://docs.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-state?view=azure-bot-service-3.0

                StateClient stateClient = message.GetStateClient();
                BotData     userData    = stateClient.BotState.GetUserData(message.ChannelId, message.From.Id);

                IConversationUpdateActivity update = message;
                if (update.MembersAdded != null && update.MembersAdded.Any())
                {
                    Debug.WriteLine($"MessagesController.HandleSystemMessage > ConversationUpdate > ServiceUrl: {message.ServiceUrl}, ChannelId: {message.ChannelId}, From: {message.From.Id}");
                    var client = new ConnectorClient(new Uri(message.ServiceUrl), new MicrosoftAppCredentials());
                    foreach (var newMember in update.MembersAdded)
                    {
                        if (newMember.Id != message.Recipient.Id)
                        {
                            var reply          = message.CreateReply();
                            var userRepository = InMemoryUserRepository.Get();
                            if (!userRepository.ChannelUserExists(newMember.Id))
                            {
                                reply.Text = BotAnswers.WelcomeMessageForNewUser(newMember.Name);

                                userData.SetProperty <bool>("IsKnownUser", false);
                                Debug.WriteLine($"MessagesController.HandleSystemMessage > ConversationUpdate > IsKnownUser = {userData.GetProperty<bool>(UserStorageKeys.IsKnownUser)}");
                            }
                            else
                            {
                                reply.Text = BotAnswers.WelcomeMessageForKnownUser(newMember.Name);

                                userData.SetProperty <bool>("IsKnownUser", true);
                                Debug.WriteLine($"MessagesController.HandleSystemMessage > ConversationUpdate > IsKnownUser = {userData.GetProperty<bool>(UserStorageKeys.IsKnownUser)}");
                            }
                            client.Conversations.ReplyToActivityAsync(reply);

                            //https://stackoverflow.com/questions/43371605/botframework-privateconversationdata-or-userdata-becomes-empty
                            stateClient.BotState.SetUserData(message.ChannelId, message.From.Id, userData);
                        }
                    }
                }
            }
            else if (message.Type == ActivityTypes.ContactRelationUpdate)
            {
                Debug.WriteLine("MessagesController.HandleSystemMessage > ContactRelationUpdate");
                // Handle add/remove from contact lists
                // Activity.From + Activity.Action represent what happened
            }
            else if (message.Type == ActivityTypes.Typing)
            {
                Debug.WriteLine("MessagesController.HandleSystemMessage > Typing");
                // Handle knowing that the user is typing
            }
            else if (message.Type == ActivityTypes.Ping)
            {
                Debug.WriteLine("MessagesController.HandleSystemMessage > Ping");
            }

            return(null);
        }