Задать вопрос
@Lynatik001

Как передать переменную из одной сцены в другую?

как мне из одной сцены в другую передать переменую? у меня переход приисходить при нажатии на Keyboard кнопку - та что текст в чат печатает при нажатии. дак что каллбека вроде некакого не будет?
Есть варик ложить в сессию в 1 сцене и во второй брать. Но мне кажется есть вариант по изящнее?
  • Вопрос задан
  • 108 просмотров
Подписаться 1 Сложный 2 комментария
Пригласить эксперта
Ответы на вопрос 1
IgorPI
@IgorPI
Сессия и её абстрактное понятие.

Я недавно написал универсального бота, хотя опыта в строение ботов не было.
Так вот, как раз там есть сессия.
Сессия позволяет изменять поведение диалога по ходу пьесы.

Приведу пример моего велосипеда.

Интерфейс сессии
export interface SessionInterface {
    bot: BotInterface;
    state: SessionStateInterface;
    initialState: SessionStateInterface;
    SID: string;
    isNew: boolean;
    inDialog: boolean;
    user: UserInterface;
    send(message: any, options?: any): Promise<any>;
    resetState(): void;
    setState(state: SessionStateInterface): void;
}


Интерфейс состояния сессии
export interface SessionStateInterface {
    [key: string]: any;
}


А это реализация описанных интерфейсов
interface SessionConstructorPropsInterface {
    bot: BotInterface;
    initialState?: SessionStateInterface;
}

export class Session implements SessionInterface {
    bot: BotInterface;
    user: UserInterface;
    state: SessionStateInterface;
    initialState: SessionStateInterface;
    SID: string;
    isNew: boolean;
    inDialog: boolean;
    constructor({  bot, initialState }: SessionConstructorPropsInterface) {
        this.isNew = true;
        this.bot = bot;
        this.initialState = initialState || {};
        this.state = Object.assign({}, initialState);
    }

    send(message: any, options: any): Promise<void> {
        this.isNew = false;
        return this.bot.adapter.send(message, options);
    }

    resetState(): void {
        this.state = Object.assign({}, this.initialState);
    }

    setState(state: SessionStateInterface): void {
        Object.keys(state).forEach((key) => {
            this.state[key] = state[key];
        });
    }
}


Например, в диалоге | обработчике диалога
main.use(/\/login/i, async ({message, session}: BotContextInterface, next) => {

  // Здесь я сохраняю состояние
  session.setState({
    processLogin: true,
    processLoginStep: 'login'
  })

  // Если мне нужно получить состояние
  console.log(session.state.processLogin)

});


Описанный выше код позволяет хранить состояние бота
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы