NestJS Telegram 봇의 FactsGeneratorModule에 대해 다른 다국어 설정 추가
29901 단어 telegramfactsnestjskaufmanbot
연결
https://github.com/EndyKaufman/kaufman-bot - 봇의 소스 코드
https://telegram.me/DevelopKaufmanBot - 전보의 현재 봇
- 커스텀 인젝터 시리즈
작품 설명
팩트 생성기는 ScraperModule을 기반으로 하며, 이 모듈에 다른 언어에 대한 다른 구성을 지원하는 논리를 도입하지 않습니다.
다른 언어로 작업하기 위한 다른 옵션의 경우 다른 구성으로 중복 ScraperModule 가져오기를 추가하고 언어별 명령 처리기를 생성합니다.
서로 다른 두 ScraperModule의 로직이 겹치지 않도록 하기 위해 CustomInjectorModule.forFeature에서 가져오기를 래핑합니다.
팩트 생성기 업데이트
러시아어용 새 서비스 만들기
libs/facts-generator/server/src/lib/facts-generator-services/ru-facts-generator.service.ts
import {
BotCommandsEnum,
BotCommandsProvider,
BotCommandsProviderActionMsg,
BotCommandsProviderActionResultType,
BotСommandsToolsService,
} from '@kaufman-bot/core/server';
import { ScraperService } from '@kaufman-bot/html-scraper/server';
import { Injectable } from '@nestjs/common';
@Injectable()
export class RuFactsGeneratorService implements BotCommandsProvider {
constructor(
private readonly scraperService: ScraperService,
private readonly botСommandsToolsService: BotСommandsToolsService
) {}
async onHelp<
TMsg extends BotCommandsProviderActionMsg = BotCommandsProviderActionMsg
>(msg: TMsg) {
const locale = msg.from?.language_code;
if (!locale?.includes('ru')) {
return null;
}
return await this.scraperService.onHelp(msg);
}
async onMessage<
TMsg extends BotCommandsProviderActionMsg = BotCommandsProviderActionMsg
>(msg: TMsg): Promise<BotCommandsProviderActionResultType<TMsg>> {
const locale = msg.from?.language_code;
if (!locale?.includes('ru')) {
return null;
}
if (
this.botСommandsToolsService.checkCommands(
msg.text,
[...Object.keys(BotCommandsEnum)],
locale
)
) {
const result = await this.scraperService.onMessage(msg);
try {
if (result?.type === 'text') {
return {
type: 'text',
text: result.text.split('\\"').join('"').split('\n').join(' '),
};
}
return result;
} catch (err) {
console.debug(result);
console.error(err, err.stack);
throw err;
}
}
return null;
}
}
영어에 대한 이전 서비스 업데이트
libs/facts-generator/server/src/lib/facts-generator-services/facts-generator.service.ts
import {
BotCommandsEnum,
BotCommandsProvider,
BotCommandsProviderActionMsg,
BotCommandsProviderActionResultType,
BotСommandsToolsService,
} from '@kaufman-bot/core/server';
import { ScraperService } from '@kaufman-bot/html-scraper/server';
import { Injectable } from '@nestjs/common';
@Injectable()
export class FactsGeneratorService implements BotCommandsProvider {
constructor(
private readonly scraperService: ScraperService,
private readonly botСommandsToolsService: BotСommandsToolsService
) {}
async onHelp<
TMsg extends BotCommandsProviderActionMsg = BotCommandsProviderActionMsg
>(msg: TMsg) {
const locale = msg.from?.language_code;
if (locale?.includes('ru')) {
return null;
}
return await this.scraperService.onHelp(msg);
}
async onMessage<
TMsg extends BotCommandsProviderActionMsg = BotCommandsProviderActionMsg
>(msg: TMsg): Promise<BotCommandsProviderActionResultType<TMsg>> {
const locale = msg.from?.language_code;
if (locale?.includes('ru')) {
return null;
}
if (
this.botСommandsToolsService.checkCommands(
msg.text,
[...Object.keys(BotCommandsEnum)],
locale
)
) {
const result = await this.scraperService.onMessage(msg);
try {
if (result?.type === 'text') {
return {
type: 'text',
text: result.text
.replace('\n\nTweet [http://twitter.com/share]', '')
.split('\\"')
.join('"')
.split('\n')
.join(' '),
};
}
return result;
} catch (err) {
console.debug(result);
console.error(err, err.stack);
throw err;
}
}
return null;
}
}
FactsGeneratorModule 업데이트
libs/facts-generator/server/src/lib/facts-generator.module.ts
import {
BotCommandsModule,
BOT_COMMANDS_PROVIDER,
} from '@kaufman-bot/core/server';
import { ScraperModule } from '@kaufman-bot/html-scraper/server';
import { DynamicModule, Module } from '@nestjs/common';
import { getText } from 'class-validator-multi-lang';
import { CustomInjectorModule } from 'nestjs-custom-injector';
import { TranslatesModule } from 'nestjs-translates';
import { FactsGeneratorService } from './facts-generator-services/facts-generator.service';
import { RuFactsGeneratorService } from './facts-generator-services/ru-facts-generator.service';
@Module({
imports: [TranslatesModule, BotCommandsModule],
exports: [TranslatesModule, BotCommandsModule],
})
export class FactsGeneratorModule {
static forRoot(): DynamicModule {
return {
module: FactsGeneratorModule,
imports: [
CustomInjectorModule.forFeature({
imports: [
ScraperModule.forRoot({
name: getText('Facts generator'),
descriptions: getText(
'Command to generate text with a random fact'
),
usage: [getText('get facts'), getText('facts help')],
contentSelector: '#z',
spyWords: [getText('facts')],
removeWords: [getText('get'), getText('please')],
uri: 'http://randomfactgenerator.net/',
}),
],
providers: [
{
provide: BOT_COMMANDS_PROVIDER,
useClass: FactsGeneratorService,
},
],
exports: [ScraperModule],
}),
CustomInjectorModule.forFeature({
imports: [
ScraperModule.forRoot({
name: getText('Facts generator'),
descriptions: getText(
'Command to generate text with a random fact'
),
usage: [getText('get facts'), getText('facts help')],
contentSelector: '#fact > table > tbody > tr > td',
spyWords: [getText('facts')],
removeWords: [getText('get'), getText('please')],
uri: 'https://randstuff.ru/fact/',
contentCodepage: 'utf8',
}),
],
providers: [
{
provide: BOT_COMMANDS_PROVIDER,
useClass: RuFactsGeneratorService,
},
],
exports: [ScraperModule],
}),
],
};
}
}
파일 준비 및 필요한 경우 번역 추가
npm run generate
변경된 사항이 없으므로 코드를 커밋하고 텔레그램에서 테스트할 수 있습니다.
텔레그램 봇의 새로운 로직 확인
일반적인 도움말 메시지
러시아어로 된 일반적인 도움말 메시지
영어로 사실 확인
러시아어로 사실 확인
다음 게시물에서는 영어와 러시아어에 대한 사람들의 인용구와 농담을 추가하겠습니다...
Reference
이 문제에 관하여(NestJS Telegram 봇의 FactsGeneratorModule에 대해 다른 다국어 설정 추가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/endykaufman/add-different-multilingual-settings-for-factsgeneratormodule-in-nestjs-telegram-bot-102i텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)