Scopes
IN DEVELOPMENT. You can enter/leave scope
What's scopes?
If you want to ask user something, you need to use scope. Scope - an isolated place for the user, in which the handlers of ordinary controllers don't work, but only the handlers described in the scope work
How it works?
You call the .scope
answer method. Then all custom updates are handled by scope handlers, other handlers don't. You can leave at any time, just call the .unscope answer method
Example
import { Module } from 'nestgram';
import { AppService } from './app.service';
import { AppController } from './app.controller';
import { NameModule } from './scopes/name/name.module';
@Module({
imports: [NameModule],
controllers: [AppController],
services: [AppService],
})
export class AppModule {}
import { Answer, Controller, GetAnswer, Keyboard, KeyboardTypes, MessageSend, OnClick, OnCommand } from 'nestgram';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService?: AppService) {}
@OnCommand('start')
async start(@GetAnswer() answer: Answer) {
try {
return new MessageSend(
'Hello! Do you want to enter your name?',
new Keyboard(KeyboardTypes.underTheMessage)
.btn('Enter my name', 'scope'),
);
} catch (e) {
console.error(e);
}
}
@OnClick('scope')
async enterScope(@GetAnswer() answer: Answer) {
await answer.scope('name');
return 'Enter your name';
}
}
import { Module } from 'nestgram';
import { NameScope } from './name.scope';
import { NameService } from './name.service';
@Module({
scopes: [NameScope],
services: [NameService],
})
export class NameModule {}
import { Answer, GetAnswer, Keyboard, KeyboardTypes, MessageSend, OnClick, OnText, Scope, Text } from 'nestgram';
@Scope()
export class NameScope {
@OnText()
onNameSend(@Text() name: string) {
return new MessageSend(
`Hello, ${name}!`,
new Keyboard(KeyboardTypes.underTheMessage)
.btn('Leave scope', 'leave'),
);
}
@OnClick('leave')
async leaveScope(@GetAnswer() answer: Answer) {
await answer.unscope();
return 'Unscope';
}
}
On scope enter event
You can handle when the user enters the scope with the @OnEnter decorator
import { Answer, Controller, GetAnswer, Keyboard, KeyboardTypes, MessageSend, OnClick, OnCommand } from 'nestgram';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService?: AppService) {}
@OnCommand('start')
async start(@GetAnswer() answer: Answer) {
try {
return new MessageSend(
'Hello! Do you want to enter your name?',
new Keyboard(KeyboardTypes.underTheMessage)
.btn('Enter my name', 'scope'),
);
} catch (e) {
console.error(e);
}
}
@OnClick('scope')
async enterScope(@GetAnswer() answer: Answer) {
await answer.scope('name');
}
}
import { Answer, GetAnswer, Keyboard, KeyboardTypes, MessageSend, OnClick, OnEnter, OnText, Scope, Text } from 'nestgram';
@Scope()
export class NameScope {
@OnEnter()
onScopeEnter() {
return 'Enter your name';
}
@OnText()
onNameSend(@Text() name: string) {
return new MessageSend(
`Hello, ${name}!`,
new Keyboard(KeyboardTypes.underTheMessage)
.btn('Leave scope', 'leave'),
);
}
@OnClick('leave')
async leaveScope(@GetAnswer() answer: Answer) {
await answer.unscope();
return 'Unscope';
}
}
Last updated