in src/JetBrains.Space.Samples.App/WebHooks/CateringWebHookHandler.cs [85:244]
public override async Task<AppUserActionExecutionResult> HandleMessageActionAsync(MessageActionPayload payload)
{
Sessions.TryGetValue(payload.UserId, out var cateringSession);
// Start session
if (payload.ActionId == ActionId.Skip) return AppUserActionExecutionResult.Success();
if (cateringSession == null)
{
cateringSession = new CateringSession();
Sessions[payload.UserId] = cateringSession;
}
// Store choices
if (payload.ActionId == ActionId.Food)
{
cateringSession.SelectedFood = payload.ActionValue;
}
if (payload.ActionId == ActionId.Drinks)
{
cateringSession.SelectedDrinks = payload.ActionValue;
}
if (payload.ActionId == ActionId.DrinkAdditions)
{
cateringSession.SelectedDrinkAdditions = payload.ActionValue;
}
// More choices to make?
if (string.IsNullOrEmpty(cateringSession.SelectedFood))
{
await SendOrEditMessageAsync(
channelIdentifier: ChannelIdentifier.Profile(ProfileIdentifier.Id(payload.UserId)),
recipient: MessageRecipient.Member(ProfileIdentifier.Id(payload.UserId)),
content: ChatMessage.Block(
outline: new MessageOutline("Would you prefer chicken or pasta?"),
messageData: "Would you prefer chicken or pasta?",
sections: new()
{
MessageSectionElement.MessageSection(
elements: new()
{
MessageBlockElement.MessageText("JetBrains Space - Catering", size: MessageTextSize.SMALL),
MessageBlockElement.MessageText("Would you prefer chicken or pasta?"),
MessageBlockElement.MessageControlGroup(new List<MessageControlElement>
{
MessageControlElement.MessageButton("Chicken", MessageButtonStyle.REGULAR,
MessageAction.Post(ActionId.Food, "🍗 Chicken")),
MessageControlElement.MessageButton("Pasta", MessageButtonStyle.REGULAR,
MessageAction.Post(ActionId.Food, "🍝 Pasta")),
MessageControlElement.MessageButton("No food", MessageButtonStyle.REGULAR,
MessageAction.Post(ActionId.Food, "🤷 None"))
})
})
},
style: MessageStyle.PRIMARY),
cateringSession: cateringSession);
}
else if (string.IsNullOrEmpty(cateringSession.SelectedDrinks))
{
await SendOrEditMessageAsync(
channelIdentifier: ChannelIdentifier.Profile(ProfileIdentifier.Id(payload.UserId)),
recipient: MessageRecipient.Member(ProfileIdentifier.Id(payload.UserId)),
content: ChatMessage.Block(
outline: new MessageOutline("Any drinks? Coffee or tea?"),
messageData: "Any drinks? Coffee or tea?",
sections: new()
{
MessageSectionElement.MessageSection(
elements: new()
{
MessageBlockElement.MessageText("JetBrains Space - Catering", size: MessageTextSize.SMALL),
MessageBlockElement.MessageText("Any drinks? Coffee or tea?"),
MessageBlockElement.MessageControlGroup(new List<MessageControlElement>
{
MessageControlElement.MessageButton("Water", MessageButtonStyle.REGULAR,
MessageAction.Post(ActionId.Drinks, "🥛 Water")),
MessageControlElement.MessageButton("Coffee", MessageButtonStyle.REGULAR,
MessageAction.Post(ActionId.Drinks, "☕ Coffee")),
MessageControlElement.MessageButton("Tea", MessageButtonStyle.REGULAR,
MessageAction.Post(ActionId.Drinks, "☕ Tea")),
MessageControlElement.MessageButton("Juice", MessageButtonStyle.REGULAR,
MessageAction.Post(ActionId.Drinks, "🧃 Juice")),
MessageControlElement.MessageButton("No drinks", MessageButtonStyle.REGULAR,
MessageAction.Post(ActionId.Drinks, "🤷 None"))
})
})
},
style: MessageStyle.PRIMARY),
cateringSession: cateringSession);
}
else if (!string.IsNullOrEmpty(cateringSession.SelectedDrinks)
&& cateringSession.SelectedDrinks.Contains("coffee", StringComparison.OrdinalIgnoreCase)
&& string.IsNullOrEmpty(cateringSession.SelectedDrinkAdditions))
{
await SendOrEditMessageAsync(
channelIdentifier: ChannelIdentifier.Profile(ProfileIdentifier.Id(payload.UserId)),
recipient: MessageRecipient.Member(ProfileIdentifier.Id(payload.UserId)),
content: ChatMessage.Block(
outline: new MessageOutline("How would you like your coffee?"),
messageData: "How would you like your coffee?",
sections: new()
{
MessageSectionElement.MessageSection(
elements: new()
{
MessageBlockElement.MessageText("JetBrains Space - Catering", size: MessageTextSize.SMALL),
MessageBlockElement.MessageText("How would you like your coffee?"),
MessageBlockElement.MessageControlGroup(new List<MessageControlElement>
{
MessageControlElement.MessageButton("Milk", MessageButtonStyle.REGULAR,
MessageAction.Post(ActionId.DrinkAdditions, "🥛 with milk")),
MessageControlElement.MessageButton("Sugar", MessageButtonStyle.REGULAR,
MessageAction.Post(ActionId.DrinkAdditions, "🍁 with sugar")),
MessageControlElement.MessageButton("Milk & sugar", MessageButtonStyle.REGULAR,
MessageAction.Post(ActionId.DrinkAdditions, "🥛🍁 with milk and sugar")),
MessageControlElement.MessageButton("No additions", MessageButtonStyle.REGULAR,
MessageAction.Post(ActionId.DrinkAdditions, "🤷 no additions"))
})
})
},
style: MessageStyle.PRIMARY),
cateringSession: cateringSession);
}
else
{
await SendOrEditMessageAsync(
channelIdentifier: ChannelIdentifier.Profile(ProfileIdentifier.Id(payload.UserId)),
recipient: MessageRecipient.Member(ProfileIdentifier.Id(payload.UserId)),
content: ChatMessage.Block(
outline: new MessageOutline("Thank you, we'll be right there!"),
messageData: "Thank you, we'll be right there!",
sections: new()
{
MessageSectionElement.MessageSection(
elements: new()
{
MessageBlockElement.MessageText("JetBrains Space - Catering", size: MessageTextSize.SMALL),
MessageBlockElement.MessageText("Thank you, we'll be right there!"),
MessageBlockElement.MessageFields(new List<MessageFieldElement>
{
MessageFieldElement.MessageField("Food choice:", cateringSession.SelectedFood),
MessageFieldElement.MessageField("Drinks choice:", cateringSession.SelectedDrinks
+ (cateringSession.SelectedDrinkAdditions != null
? " (" + cateringSession.SelectedDrinkAdditions + ")"
: ""))
})
})
},
style: MessageStyle.PRIMARY),
cateringSession: cateringSession);
Sessions.TryRemove(payload.UserId, out _);
}
return AppUserActionExecutionResult.Success();
}