public RootTopic(IBotContext context) : base(context) { // User state initialization should be done once in the welcome // new user feature. Placing it here until that feature is added. if (context.GetUserState <BotUserState>().Alarms == null) { context.GetUserState <BotUserState>().Alarms = new List <Alarm>(); } }
public override Task OnReceiveActivity(IBotContext context) { if ((context.Request.Type == ActivityTypes.Message) && (context.Request.AsMessageActivity().Text.Length > 0)) { var message = context.Request.AsMessageActivity(); // If the user wants to change the topic of conversation... if (message.Text.ToLowerInvariant() == "add alarm") { // Set the active topic and let the active topic handle this turn. this.SetActiveTopic(ADD_ALARM_TOPIC) .OnReceiveActivity(context); return(Task.CompletedTask); } if (message.Text.ToLowerInvariant() == "delete alarm") { this.SetActiveTopic(DELETE_ALARM_TOPIC, context.GetUserState <BotUserState>().Alarms) .OnReceiveActivity(context); return(Task.CompletedTask); } if (message.Text.ToLowerInvariant() == "show alarms") { this.ClearActiveTopic(); AlarmsView.ShowAlarms(context, context.GetUserState <BotUserState>().Alarms); return(Task.CompletedTask); } if (message.Text.ToLowerInvariant() == "help") { this.ClearActiveTopic(); this.ShowHelp(context); return(Task.CompletedTask); } // If there is an active topic, let it handle this turn until it completes. if (HasActiveTopic) { ActiveTopic.OnReceiveActivity(context); return(Task.CompletedTask); } ShowDefaultMessage(context); } return(Task.CompletedTask); }
public async Task <bool> FindAlarm(IBotContext context) { var userState = context.GetUserState <UserData>(); // var userState = UserState<UserAlarms>.Get(context); if (userState.Alarms == null) { userState.Alarms = new List <Alarm>(); } // Ensure there are alarms to delete if (userState.Alarms.Count == 0) { DeleteAlarmTopicResponses.ReplyWithNoAlarms(context); return(false); } // Validate title if (!String.IsNullOrWhiteSpace(this.AlarmTitle)) { if (int.TryParse(this.AlarmTitle.Split(' ').FirstOrDefault(), out int index)) { if (index > 0 && index <= userState.Alarms.Count) { index--; // Delete selected alarm and end topic var alarm = userState.Alarms.Skip(index).First(); userState.Alarms.Remove(alarm); DeleteAlarmTopicResponses.ReplyWithDeletedAlarm(context, alarm); return(false); // cancel topic } } else { var parts = this.AlarmTitle.Split(' '); var choices = userState.Alarms.Where(alarm => parts.Any(part => alarm.Title.Contains(part))).ToList(); if (choices.Count == 0) { DeleteAlarmTopicResponses.ReplyWithNoAlarmsFound(context, this.AlarmTitle); return(false); } else if (choices.Count == 1) { // Delete selected alarm and end topic var alarm = choices.First(); userState.Alarms.Remove(alarm); DeleteAlarmTopicResponses.ReplyWithDeletedAlarm(context, alarm); return(false); // cancel topic } } } // Prompt for title DeleteAlarmTopicResponses.ReplyWithTitlePrompt(context, userState.Alarms); return(true); }
public static Task ShowAlarms(IBotContext context) { var userState = context.GetUserState <UserData>(); // var userState = UserState<UserAlarms>.Get(context); if (userState.Alarms == null) { userState.Alarms = new List <Alarm>(); } ShowAlarmsTopicResponses.ReplyWithShowAlarms(context, userState.Alarms); return(Task.CompletedTask); }
public RootTopic(IBotContext context) : base(context) { // User state initialization should be done once in the welcome // new user feature. Placing it here until that feature is added. if (context.GetUserState <BotUserState>().Alarms == null) { context.GetUserState <BotUserState>().Alarms = new List <Alarm>(); } this.SubTopics.Add(ADD_ALARM_TOPIC, (object[] args) => { var addAlarmTopic = new AddAlarmTopic(); addAlarmTopic.Set .OnSuccess((ctx, alarm) => { this.ClearActiveTopic(); ctx.GetUserState <BotUserState>().Alarms.Add(alarm); context.SendActivity($"Added alarm named '{ alarm.Title }' set for '{ alarm.Time }'."); }) .OnFailure((ctx, reason) => { this.ClearActiveTopic(); context.SendActivity("Let's try something else."); this.ShowDefaultMessage(ctx); }); return(addAlarmTopic); }); this.SubTopics.Add(DELETE_ALARM_TOPIC, (object[] args) => { var alarms = (args.Length > 0) ? (List <Alarm>)args[0] : null; var deleteAlarmTopic = new DeleteAlarmTopic(alarms); deleteAlarmTopic.Set .OnSuccess((ctx, value) => { this.ClearActiveTopic(); if (!value.DeleteConfirmed) { context.SendActivity($"Ok, I won't delete alarm '{ value.Alarm.Title }'."); return; } ctx.GetUserState <BotUserState>().Alarms.RemoveAt(value.AlarmIndex); context.SendActivity($"Done. I've deleted alarm '{ value.Alarm.Title }'."); }) .OnFailure((ctx, reason) => { this.ClearActiveTopic(); context.SendActivity("Let's try something else."); this.ShowDefaultMessage(context); }); return(deleteAlarmTopic); }); }
private async Task <bool> ProcessTopicState(IBotContext context) { string utterance = (((Activity)context.Request).Text ?? "").Trim(); var userState = context.GetUserState <UserData>(); // var userState = UserState<UserData>.Get(context); // we ar eusing TopicState to remember what we last asked switch (this.TopicState) { case TopicStates.AddingCard: { dynamic payload = ((Activity)context.Request).Value; if (payload != null) { if (payload.Action == "Submit") { this.Alarm.Title = payload.Title; if (DateTimeOffset.TryParse((string)payload.Day, out DateTimeOffset date)) { if (DateTimeOffset.TryParse((string)payload.Time, out DateTimeOffset time)) { this.Alarm.Time = new DateTimeOffset(date.Year, date.Month, date.Day, time.Hour, time.Minute, time.Second, date.Offset); if (userState.Alarms == null) { userState.Alarms = new List <Alarm>(); } userState.Alarms.Add(this.Alarm); AddAlarmTopicResponses.ReplyWithAddedAlarm(context, this.Alarm); // end topic return(false); } } } else if (payload.Action == "Cancel") { AddAlarmTopicResponses.ReplyWithTopicCanceled(context, this.Alarm); // End current topic return(false); } } } return(true); case TopicStates.CancelConfirmation: { dynamic payload = ((Activity)context.Request).Value; switch ((string)payload.Action) { case "Yes": { AddAlarmTopicResponses.ReplyWithTopicCanceled(context, this.Alarm); // End current topic return(false); } case "No": { this.TopicState = TopicStates.AddingCard; return(await this.ContinueTopic(context)); } default: { AddAlarmTopicResponses.ReplyWithCancelReprompt(context, this.Alarm); return(true); } } } default: return(true); } }
public async Task OnProcessRequest(IBotContext context, MiddlewareSet.NextDelegate next) { var activity = context.Request.AsMessageActivity(); if (activity == null) { await next(); } // Handle the message from functions contains ChatPlus's webhook response if (activity?.Type == ActivityTypes.Event) { Debug.WriteLine("*************************"); Debug.WriteLine("Got event type message"); Debug.WriteLine("*************************"); string userId = "default-user"; // TODO hiroaki-honda remove this line and replace userId used as key to extract ConversationInformation from table storage. ("default-user" is the userId just for Hackfest). // string userId = Deserialize<Visitor>("visitor", (Activity)activity).visitor_id; ConversationReference conversationReference = await GetConversationReferenceByUserId(userId); switch (activity.From.Id) { case "WebhookStartChat": string messageForSuccessToConnect = "Success to make a connection with call center agent. Please let us know what makes you in trouble."; await SendProactiveMessage(context, conversationReference, messageForSuccessToConnect); break; case "WebhookSendMessage": string messageFromAgent = JsonConvert.DeserializeObject <ChatPlusInformation>(activity.Value.ToString()).message.text; await SendProactiveMessage(context, conversationReference, messageFromAgent); break; default: throw new Exception("unexpected event type message"); } } // Enqueue the message to hook the function which passes the message to agent if "IsConnectedToAgent" is true. var userState = context.GetUserState <BotUserState>(); if (userState != null && userState.IsConnectedToAgent) { CloudStorageAccount account = buildStorageAccount(); CloudQueueClient cloudQueueClient = account.CreateCloudQueueClient(); CloudQueue queue = cloudQueueClient.GetQueueReference("message-from-user"); var item = new ConversationInformation() { ConversationReference = JsonConvert.SerializeObject(GetConversationReference((Microsoft.Bot.Schema.Activity)activity)), MessageFromUser = context.Request.Text }; var message = new CloudQueueMessage(JsonConvert.SerializeObject(item)); await queue.AddMessageAsync(message); return; } // Request to make a connection between user and agent if (activity != null && !string.IsNullOrEmpty(activity.Text) && activity.Text.ToLower().Contains(Commands.CommandRequestConnection)) { // Store conversation reference (Use this info when send a proactive message to user after). await StoreConversationInformation(context); // TODO hiroaki-honda Implement the logic to hook the function which request connection to ChatPlus // Status: Ask chatplus to prepare the API which receive the request to connect to agent // Set connecting state true var state = context.GetUserState <BotUserState>(); state.IsConnectedToAgent = true; await context.SendActivity("Now make a request for connection. Please wait a minutes."); } else { await next(); } }