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"); }
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); }