Skip to content

User and Session state

alexvolchetsky edited this page Jul 23, 2020 · 1 revision

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/

Configuration

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

Response

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

Request

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>();
    ...
}
Clone this wiki locally