negezor / vk-io

Modern VK API SDK for Node.js
https://npm.im/vk-io
MIT License
549 stars 85 forks source link

Как сделать разные сцены для пользователя и беседы #218

Closed devis-hub closed 5 years ago

devis-hub commented 5 years ago

Заметил такую неясность. Делаю сцену с авторизацией пользователя в боте, т.к нужно сохранять внешние данные, делаю с помощью сцен.

Пишет пользователь в ЛС Боту и закончил на середине сцены где сцена ждет ответа от пользователя, заходит в беседу где уже авторизация была пройдена и пишет туда, в беседе продолжается его авторизация что была остановлена в ЛС и так же наоборот если в беседе начал и не закончил и когда вернулся в ЛС то там сцена продолжилась.

Как я понял сцена сохраняется на ID пользователя, а не на ID чата, это не удобно в таких моментах и как такое можно обойти

mulfyx commented 5 years ago
const sessionManager = new SessionManager({
  getStorageKey: (context) => String(context.peerId)
});
devis-hub commented 5 years ago
const sessionManager = new SessionManager({
  getStorageKey: (context) => String(context.peerId)
});

Туплю возможно уже, попробовал выше, но выдает Error

const sessionManager = new SessionManager({ getStorageKey: (ctx) => String(ctx.peerId) })

Property 'peerId' does not exist on type 'IContext & T'.

{
"resource": "/f:/nodeProjects/Bot/src/class/Bot.ts",
"owner": "typescript",
"code": "2339",
"severity": 8,
"message": "Property 'peerId' does not exist on type 'IContext & T'.",
"source": "ts",
"startLineNumber": 8,
"startColumn": 40,
"endLineNumber": 8,
"endColumn": 46
}
mulfyx commented 5 years ago

А какие свойства вообще есть в ctx?

negezor commented 5 years ago
import { MessageContext } from 'vk-io';

const sessionManager = new SessionManager({
    getStorageKey: (context: MessageContext) => String(context.peerId)
});
devis-hub commented 5 years ago
import { MessageContext } from 'vk-io';

const sessionManager = new SessionManager({
  getStorageKey: (context: MessageContext) => String(context.peerId)
});

vk-io последней версии Уже ничего не понимаю, выдает это:

{
    "resource": "/f:/nodeProjects/Bot/src/class/Bot.ts",
    "owner": "typescript",
    "code": "2322",
    "severity": 8,
    "message": "Type '(context: MessageContext<Record<string, any>>) => string' is not assignable to type '<T = {}>(context: IContext & T) => string'.\n  Types of parameters 'context' and 'context' are incompatible.\n    Type 'IContext' is missing the following properties from type 'MessageContext<Record<string, any>>': $match, text, $filled, loadMessagePayload, and 64 more.",
    "source": "ts",
    "startLineNumber": 9,
    "startColumn": 5,
    "endLineNumber": 9,
    "endColumn": 18,
    "relatedInformation": [
        {
            "startLineNumber": 15,
            "startColumn": 5,
            "endLineNumber": 15,
            "endColumn": 59,
            "message": "The expected type comes from property 'getStorageKey' which is declared here on type 'ISessionManagerOptions'",
            "resource": "/f:/nodeProjects/Bot/node_modules/@vk-io/session/lib/session-manager.d.ts"
        }
    ]
}
negezor commented 5 years ago

Да судя по всему проще добавить @ts-ignore пока. Посмотрю почему такой дженерик не работат.

const sessionManager = new SessionManager({
    getStorageKey<MessageContext>(context) {
        return String(context.peerId);
    }
});
negezor commented 5 years ago

В 0.0.0-alpha.3 теперь можно сделать так:

import { MessageContext } from 'vk-io';

const sessionManager = new SessionManager<MessageContext>({
    getStorageKey: (context) => String(context.peerId)
});