-
Notifications
You must be signed in to change notification settings - Fork 9
User and Session state
It is possible to store user and session state.
Official documentation you can find here: https://yandex.ru/dev/dialogs/alice/doc/session-persistence-docpage/
Imagine you want to save user name in user state storage and last answer in session state storage. For that purpose you should create two classes:
public class UserState
{
public string Name { get; set; }
}
public class SessionState
{
public string LastAnswer { get; set; }
}
To make skill remember this data you need to return objects of these classes in response:
[HttpPost]
public IActionResult Get(AliceRequest aliceRequest)
{
var response = new AliceResponse(aliceRequest, "Hello")
{
SessionState = new SessionState() { LastAnswer = "some value" },
UserStateUpdate = new UserState() { Name = "Alex" }
};
return Ok(response);
}
SessionState
and UserStateUpdate
are of object
type.
You can use generic version of
AliceResponse
class (can be used in unit test for example). In this case above example will look like:
[HttpPost]
public IActionResult Get(AliceRequest aliceRequest)
{
var response = new AliceResponse<SessionState, UserState>(aliceRequest, "Hello")
{
SessionState = new SessionState() { LastAnswer = "some value" },
UserStateUpdate = new UserState() { Name = "Alex" }
};
return Ok(response);
}
After you returned state data to skill it will save this data and send in the next request.
{
...
"state": {
"session": {
"lastAnswer": "some value"
},
"user": {
"name": "Alex"
}
},
...
}
Fortunatelly you already has models for session and user state. You need only to use generic version of AliceRequest
class which accepts three generic parameters: AliceRequest<TIntents, TSession, TUser>
[HttpPost]
public IActionResult Get(AliceRequest<object, SessionState, UserState> aliceRequest)
{
SessionState sessionState = aliceRequest.State.Session;
UserState userState = aliceRequest.State.User;
...
}
You can still use
AliceRequest
class and convert session and user state to any object you use:
[HttpPost]
public IActionResult Get(AliceRequest aliceRequest)
{
SessionState sessionState = aliceRequest.State.TryGetSession<SessionState>();
UserState userState = aliceRequest.State.TryGetUser<UserState>();
...
}