@On, @Once
Hướng dẫn sử dụng @On và @Once decorators để lắng nghe Mezon SDK events.
Tổng quan
@On và @Once decorators cho phép bạn lắng nghe các sự kiện từ Mezon SDK. @On lắng nghe mỗi lần event xảy ra, còn @Once chỉ lắng nghe một lần duy nhất.
Cú pháp
@On(event: string)
@Once(event: string)
@On Decorator
Lắng nghe event mỗi lần nó xảy ra.
Ví dụ cơ bản
import { Injectable } from '@nestjs/common';
import { On, ChannelMessagePayload, MessageContent } from '@n0xgg04/nezon';
import type { Nezon } from '@n0xgg04/nezon';
import { Events } from 'mezon-sdk';
@Injectable()
export class MessageListener {
@On(Events.ChannelMessage)
async onMessage(
@ChannelMessagePayload() payload: Nezon.ChannelMessage,
@MessageContent() content: string | undefined,
) {
console.log('New message:', content);
}
}
Với Channel và User
import { Injectable } from '@nestjs/common';
import {
On,
ChannelMessagePayload,
MessageContent,
Channel,
User,
} from '@n0xgg04/nezon';
import type { Nezon } from '@n0xgg04/nezon';
import { Events } from 'mezon-sdk';
@Injectable()
export class MessageListener {
@On(Events.ChannelMessage)
async onMessage(
@ChannelMessagePayload() payload: Nezon.ChannelMessage,
@MessageContent() content: string | undefined,
@Channel() channel: Nezon.Channel | undefined,
@User() user: Nezon.User | undefined,
) {
const channelName = channel?.name ?? 'unknown';
const userName = user?.username ?? payload.username ?? 'unknown';
console.log(`[${channelName}] ${userName}: ${content}`);
}
}
@Once Decorator
Chỉ lắng nghe event một lần duy nhất, thường dùng cho initialization.
Ví dụ
import { Injectable } from '@nestjs/common';
import { Once } from '@n0xgg04/nezon';
@Injectable()
export class ReadyHandler {
@Once('Ready')
onReady() {
console.log('Bot is ready!');
}
}
Với Client
import { Injectable } from '@nestjs/common';
import { Once, Client } from '@n0xgg04/nezon';
import type { Nezon } from '@n0xgg04/nezon';
@Injectable()
export class ReadyHandler {
@Once('Ready')
async onReady(@Client() client: Nezon.Client) {
console.log('Bot logged in as:', client.user?.username);
// Perform initialization tasks
}
}
Các Events phổ biến
ChannelMessage
Lắng nghe tin nhắn mới trong channel:
@On(Events.ChannelMessage)
async onMessage(
@ChannelMessagePayload() payload: Nezon.ChannelMessage,
@MessageContent() content: string | undefined,
) {
// Handle new message
}
MessageButtonClicked
Lắng nghe khi button được click (thường dùng với @Component):
@On(Events.MessageButtonClicked)
async onButtonClick(
@ComponentPayload() payload: Nezon.ComponentPayload,
) {
// Handle button click
}
TokenSend
Lắng nghe khi có token được gửi:
import { On, EventPayload } from '@n0xgg04/nezon';
import type { Nezon } from '@n0xgg04/nezon';
import { Events } from 'mezon-sdk';
@On(Events.TokenSend)
async onTokenSend(@EventPayload() payload: Nezon.TokenSendPayload) {
console.log('Token sent:', payload);
// payload có type: TokenSentEvent
// Có thể truy cập: payload.from_user_id, payload.to_user_id, payload.amount, etc.
}
Type:
type TokenSendPayload = TokenSentEvent;
// Bao gồm: from_user_id, to_user_id, amount, token_type, etc.
AddClanUser
Lắng nghe khi user được thêm vào clan:
import { On, EventPayload } from '@n0xgg04/nezon';
import type { Nezon } from '@n0xgg04/nezon';
import { Events } from 'mezon-sdk';
@On(Events.AddClanUser)
async onAddClanUser(@EventPayload() payload: Nezon.AddClanUserPayload) {
console.log('User added to clan:', payload.user_id);
console.log('Clan ID:', payload.clan_id);
// payload có type: { user_id: string; clan_id: string; ... }
}
Type:
type AddClanUserPayload = {
user_id: string;
clan_id: string;
[key: string]: unknown;
};
Event Payload Injection
Bạn có thể inject payload trực tiếp:
@On(Events.ChannelMessage)
async onMessage(payload: Nezon.ChannelMessage) {
// payload chứa toàn bộ thông tin message
console.log('Message ID:', payload.message_id);
console.log('Channel ID:', payload.channel_id);
console.log('User ID:', payload.sender_id);
}
Ví dụ hoàn chỉnh
import { Injectable } from '@nestjs/common';
import {
On,
Once,
ChannelMessagePayload,
MessageContent,
Channel,
User,
Client,
AutoContext,
SmartMessage,
} from '@n0xgg04/nezon';
import type { Nezon } from '@n0xgg04/nezon';
import { Events } from 'mezon-sdk';
@Injectable()
export class EventHandlers {
@Once('Ready')
onReady(@Client() client: Nezon.Client) {
console.log('Bot is ready!');
}
@On(Events.ChannelMessage)
async onMessage(
@ChannelMessagePayload() payload: Nezon.ChannelMessage,
@MessageContent() content: string | undefined,
@Channel() channel: Nezon.Channel | undefined,
@User() user: Nezon.User | undefined,
) {
// Log message
const channelName = channel?.name ?? 'unknown';
const userName = user?.username ?? 'unknown';
console.log(`[${channelName}] ${userName}: ${content}`);
// Auto-reply to mentions
if (content?.includes('@bot')) {
const message = await this.getMessage(payload);
if (message) {
await message.reply(SmartMessage.text('You mentioned me!'));
}
}
}
private async getMessage(payload: Nezon.ChannelMessage) {
// Implementation to get message entity
return null;
}
}
Type Definitions
// Events từ mezon-sdk
enum Events {
ChannelMessage = 'ChannelMessage',
MessageButtonClicked = 'MessageButtonClicked',
TokenSend = 'TokenSend',
AddClanUser = 'AddClanUser',
// ... và nhiều events khác
}
Best Practices
-
Sử dụng @Once cho initialization
@Once('Ready')
onReady() {
// Setup tasks
} -
Sử dụng typed decorators cho payload
@ChannelMessagePayload() payload: Nezon.ChannelMessage -
Cache entities để tránh fetch lại
@Channel() channel: Nezon.Channel | undefined
// Channel đã được cache trong cùng request
API Reference
@On()
function On(event: string): MethodDecorator
@Once()
function Once(event: string): MethodDecorator
@ChannelMessagePayload()
function ChannelMessagePayload(): ParameterDecorator
// Trả về: Nezon.ChannelMessage
Xem thêm
- @Command - Text commands
- @Component - Component handlers
- Decorators - Danh sách đầy đủ decorators