refactor: 收敛QQBot核心与NapCat模块
This commit is contained in:
parent
ff8e3908f4
commit
e17d1f89ab
@ -17,6 +17,6 @@
|
||||
| Admin/Auth/Platform Config | `src/admin/example` if no active route evidence; empty old admin subdirectories | auth/user/role/menu/dept/component/dict/notice/system-log/timezone moved into `src/modules/admin/**`; duplicate old imports removed | route paths and public DTO class names kept | `rg '@/admin/' src test` returns no source hits; admin focused Jest passes |
|
||||
| Blog/WordPress/Asset | old `src/blog`, `src/wordpress`, `src/minio`; legacy module wrappers after local imports replaced | MinIO internal files renamed into Asset module; Blog and WordPress controller/service/entity files moved under target modules | existing route decorators and response DTO behavior | `rg '@/blog/|@/wordpress/|@/minio/' src test` has no hits; Blog/WordPress/Asset focused tests pass |
|
||||
| Runtime/Common | none yet | none yet | current files before migration | baseline only |
|
||||
| QQBot Core/NapCat | none yet | none yet | current files before migration | baseline only |
|
||||
| Plugin Platform/Plugins | none yet | none yet | current files before migration | baseline only |
|
||||
| QQBot Core/NapCat | old `src/qqbot/qqbot.module.ts`; old core and napcat roots after moves | account/command/config/connection/dashboard/dedupe/event/message/mqtt/permission/rule/send moved into `src/modules/qqbot/core`; NapCat login/container/persistence moved into `src/modules/qqbot/napcat` | route decorators, command parsing, send queue, device persistence, captcha, new-device, and manual QR semantics | core and NapCat focused Jest pass; `rg '@/qqbot/' src/modules/qqbot/core src/modules/qqbot/napcat` has no hits |
|
||||
| Plugin Platform/Plugins | none in Task 4; old `src/qqbot/plugin` intentionally remains as Task 5 debt | none in Task 4; Task 5 will move plugin registry/controller/runtime contracts into `src/modules/qqbot/plugin-platform/**`, then delete old `src/qqbot` root | plugin HTTP routes, platform plugin keys, and legacy key compatibility | current architecture convergence spec remains red only because `src/qqbot/plugin` is still pending for Task 5 |
|
||||
| Admin UI | none yet | none yet | current files before migration | baseline only |
|
||||
|
||||
@ -5,7 +5,7 @@ import {
|
||||
KtDateTime,
|
||||
KtUpdateDateColumn,
|
||||
} from '@/common';
|
||||
import type { QqbotAccountAbilityType } from '../qqbot.types';
|
||||
import type { QqbotAccountAbilityType } from '../contract/qqbot.types';
|
||||
|
||||
@Entity('qqbot_account_ability')
|
||||
@Index('uk_qqbot_account_ability', ['accountId', 'abilityType', 'abilityKey'], {
|
||||
@ -20,7 +20,7 @@ import {
|
||||
QqbotAccountUpdateDto,
|
||||
} from './qqbot-account.dto';
|
||||
import { QqbotAccountService } from './qqbot-account.service';
|
||||
import { QqbotNapcatLoginService } from './qqbot-napcat-login.service';
|
||||
import { QqbotNapcatLoginService } from '../../napcat/login/qqbot-napcat-login.service';
|
||||
import { QqbotReverseWsService } from '../connection/qqbot-reverse-ws.service';
|
||||
|
||||
@ApiTags('QQBot - 账号连接')
|
||||
@ -1,5 +1,5 @@
|
||||
import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger';
|
||||
import type { QqbotConnectionMode } from '../qqbot.types';
|
||||
import type { QqbotConnectionMode } from '../contract/qqbot.types';
|
||||
|
||||
export class QqbotAccountBodyDto {
|
||||
@ApiPropertyOptional({ default: 'reverse-ws' })
|
||||
@ -10,7 +10,7 @@ import type {
|
||||
QqbotConnectionMode,
|
||||
QqbotConnectionRole,
|
||||
QqbotConnectionStatus,
|
||||
} from '../qqbot.types';
|
||||
} from '../contract/qqbot.types';
|
||||
|
||||
@Entity('qqbot_account')
|
||||
export class QqbotAccount {
|
||||
@ -16,19 +16,19 @@ import type {
|
||||
QqbotAccountQueryDto,
|
||||
QqbotAccountUpdateDto,
|
||||
} from './qqbot-account.dto';
|
||||
import { QqbotAccountNapcat } from '../napcat/qqbot-account-napcat.entity';
|
||||
import { QqbotNapcatContainer } from '../napcat/qqbot-napcat-container.entity';
|
||||
import { QqbotNapcatContainerService } from '../napcat/qqbot-napcat-container.service';
|
||||
import { QqbotAccountNapcat } from '../../napcat/infrastructure/persistence/qqbot-account-napcat.entity';
|
||||
import { QqbotNapcatContainer } from '../../napcat/infrastructure/persistence/qqbot-napcat-container.entity';
|
||||
import { QqbotNapcatContainerService } from '../../napcat/qqbot-napcat-container.service';
|
||||
import {
|
||||
QQBOT_DEFAULT_PAGE_NO,
|
||||
QQBOT_DEFAULT_PAGE_SIZE,
|
||||
} from '../qqbot.constants';
|
||||
} from '../contract/qqbot.constants';
|
||||
import type {
|
||||
QqbotAccountAbilityType,
|
||||
QqbotAccountListItem,
|
||||
QqbotConnectionRole,
|
||||
QqbotNapcatRuntimeStatusSnapshot,
|
||||
} from '../qqbot.types';
|
||||
} from '../contract/qqbot.types';
|
||||
|
||||
const NAPCAT_RUNTIME_CHECK_TTL_MS = 30_000;
|
||||
const NAPCAT_AUTO_LOGIN_CLEANUP_FAILED_MESSAGE =
|
||||
@ -1,7 +1,7 @@
|
||||
import { Injectable, Logger } from '@nestjs/common';
|
||||
import { ToolsService } from '@/common';
|
||||
import { QqbotPluginRegistryService } from '../plugin/qqbot-plugin-registry.service';
|
||||
import type { QqbotNormalizedMessage } from '../qqbot.types';
|
||||
import { QqbotPluginRegistryService } from '../../../../qqbot/plugin/qqbot-plugin-registry.service';
|
||||
import type { QqbotNormalizedMessage } from '../contract/qqbot.types';
|
||||
import { QqbotSendService } from '../send/qqbot-send.service';
|
||||
import type { QqbotCommandTestDto } from './qqbot-command.dto';
|
||||
import type { QqbotCommand } from './qqbot-command.entity';
|
||||
@ -5,8 +5,8 @@ import {
|
||||
KtDateTime,
|
||||
KtUpdateDateColumn,
|
||||
} from '@/common';
|
||||
import type { QqbotMessageType } from '../qqbot.types';
|
||||
import type { QqbotCommandLogStatus } from '../qqbot.types';
|
||||
import type { QqbotMessageType } from '../contract/qqbot.types';
|
||||
import type { QqbotCommandLogStatus } from '../contract/qqbot.types';
|
||||
|
||||
@Entity('qqbot_command_log')
|
||||
export class QqbotCommandLog {
|
||||
@ -1,7 +1,7 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { DictService } from '@/modules/admin/platform-config/dict/dict.service';
|
||||
import type { QqbotCommand } from './qqbot-command.entity';
|
||||
import type { QqbotNormalizedMessage } from '../qqbot.types';
|
||||
import type { QqbotNormalizedMessage } from '../contract/qqbot.types';
|
||||
import {
|
||||
buildQqbotFf14MarketCatalog,
|
||||
buildQqbotFf14MarketCatalogFromTree,
|
||||
@ -13,7 +13,7 @@ import {
|
||||
splitQqbotFf14WorldPath,
|
||||
} from '@/modules/qqbot/plugins/ff14Market/qqbot-ff14-worlds';
|
||||
import type { QqbotFf14MarketCatalog } from '@/modules/qqbot/plugins/ff14Market/qqbot-ff14-market.types';
|
||||
import type { QqbotCommandMatchResult } from '../qqbot.types';
|
||||
import type { QqbotCommandMatchResult } from '../contract/qqbot.types';
|
||||
|
||||
@Injectable()
|
||||
export class QqbotCommandParserService {
|
||||
@ -5,7 +5,7 @@ import type {
|
||||
QqbotCommandParserType,
|
||||
QqbotMessageType,
|
||||
QqbotRuleTargetType,
|
||||
} from '../qqbot.types';
|
||||
} from '../contract/qqbot.types';
|
||||
|
||||
export class QqbotCommandQueryDto implements KtPageQuery {
|
||||
@ApiPropertyOptional()
|
||||
@ -9,7 +9,7 @@ import {
|
||||
import type {
|
||||
QqbotCommandParserType,
|
||||
QqbotRuleTargetType,
|
||||
} from '../qqbot.types';
|
||||
} from '../contract/qqbot.types';
|
||||
|
||||
@Entity('qqbot_command')
|
||||
export class QqbotCommand {
|
||||
@ -4,22 +4,22 @@ import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Not, Repository } from 'typeorm';
|
||||
import { throwVbenError, ToolsService } from '@/common';
|
||||
import { QqbotAccountService } from '../account/qqbot-account.service';
|
||||
import { QqbotPluginRegistryService } from '../plugin/qqbot-plugin-registry.service';
|
||||
import { QqbotPluginRegistryService } from '../../../../qqbot/plugin/qqbot-plugin-registry.service';
|
||||
import {
|
||||
QQBOT_DEFAULT_PAGE_NO,
|
||||
QQBOT_DEFAULT_PAGE_SIZE,
|
||||
} from '../qqbot.constants';
|
||||
} from '../contract/qqbot.constants';
|
||||
import type {
|
||||
QqbotCommandParserType,
|
||||
QqbotNormalizedMessage,
|
||||
QqbotRuleTargetType,
|
||||
} from '../qqbot.types';
|
||||
} from '../contract/qqbot.types';
|
||||
import type {
|
||||
QqbotCommandBodyDto,
|
||||
QqbotCommandQueryDto,
|
||||
QqbotCommandUpdateDto,
|
||||
} from './qqbot-command.dto';
|
||||
import { isWithinCooldown } from '../qqbot-cooldown.policy';
|
||||
import { isWithinCooldown } from '../domain/qqbot-cooldown.policy';
|
||||
import { QqbotCommandLog } from './qqbot-command-log.entity';
|
||||
import { QqbotCommand } from './qqbot-command.entity';
|
||||
|
||||
@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { QqbotConfig } from './qqbot-config.entity';
|
||||
import type { QqbotPermissionConfig } from '../qqbot.types';
|
||||
import type { QqbotPermissionConfig } from '../contract/qqbot.types';
|
||||
|
||||
const QQBOT_PERMISSION_CONFIG_KEYS = {
|
||||
allowlistEnabled: 'permission.allowlistEnabled',
|
||||
@ -10,13 +10,13 @@ import { ConfigService } from '@nestjs/config';
|
||||
import { HttpAdapterHost, ModuleRef } from '@nestjs/core';
|
||||
import { WebSocket, WebSocketServer } from 'ws';
|
||||
import { ToolsService } from '@/common';
|
||||
import { QQBOT_MQTT_TOPICS, QQBOT_REVERSE_WS_PATH } from '../qqbot.constants';
|
||||
import { QQBOT_MQTT_TOPICS, QQBOT_REVERSE_WS_PATH } from '../contract/qqbot.constants';
|
||||
import type {
|
||||
QqbotConnectionRole,
|
||||
QqbotOneBotActionResponse,
|
||||
QqbotOneBotEvent,
|
||||
QqbotPendingAction,
|
||||
} from '../qqbot.types';
|
||||
} from '../contract/qqbot.types';
|
||||
import { QqbotAccountService } from '../account/qqbot-account.service';
|
||||
import { QqbotEventService } from '../event/qqbot-event.service';
|
||||
import { QqbotBusService } from '../mqtt/qqbot-bus.service';
|
||||
@ -1,8 +1,8 @@
|
||||
import type { QrcodeLookupOptions } from '@/common/types';
|
||||
import type { QqbotAccount } from './account/qqbot-account.entity';
|
||||
import type { QqbotCommand } from './command/qqbot-command.entity';
|
||||
import type { QqbotAllowlist } from './permission/qqbot-allowlist.entity';
|
||||
import type { QqbotBlocklist } from './permission/qqbot-blocklist.entity';
|
||||
import type { QqbotAccount } from '../account/qqbot-account.entity';
|
||||
import type { QqbotCommand } from '../command/qqbot-command.entity';
|
||||
import type { QqbotAllowlist } from '../permission/qqbot-allowlist.entity';
|
||||
import type { QqbotBlocklist } from '../permission/qqbot-blocklist.entity';
|
||||
|
||||
export type { QrcodeLookupOptions } from '@/common/types';
|
||||
|
||||
@ -3,7 +3,7 @@ import type {
|
||||
QqbotMessageType,
|
||||
QqbotNormalizedMessage,
|
||||
QqbotOneBotEvent,
|
||||
} from '../qqbot.types';
|
||||
} from '../contract/qqbot.types';
|
||||
|
||||
export function isOneBotMessageEvent(
|
||||
payload: QqbotOneBotEvent,
|
||||
@ -4,11 +4,11 @@ import {
|
||||
SystemNoticePublisher,
|
||||
ToolsService,
|
||||
} from '@/common';
|
||||
import { QQBOT_MQTT_TOPICS } from '../qqbot.constants';
|
||||
import { QQBOT_MQTT_TOPICS } from '../contract/qqbot.constants';
|
||||
import { QqbotDedupeService } from '../dedupe/qqbot-dedupe.service';
|
||||
import { QqbotMessageService } from '../message/qqbot-message.service';
|
||||
import { QqbotBusService } from '../mqtt/qqbot-bus.service';
|
||||
import type { QqbotOneBotEvent } from '../qqbot.types';
|
||||
import type { QqbotOneBotEvent } from '../contract/qqbot.types';
|
||||
import {
|
||||
buildDedupeKey,
|
||||
getOneBotOfflineReason,
|
||||
@ -6,7 +6,7 @@ import {
|
||||
KtDateTimeColumn,
|
||||
KtUpdateDateColumn,
|
||||
} from '@/common';
|
||||
import type { QqbotMessageType } from '../qqbot.types';
|
||||
import type { QqbotMessageType } from '../contract/qqbot.types';
|
||||
|
||||
@Entity('qqbot_conversation')
|
||||
@Index('idx_qqbot_conversation_target', ['selfId', 'targetType', 'targetId'])
|
||||
@ -1,5 +1,5 @@
|
||||
import { ApiPropertyOptional } from '@nestjs/swagger';
|
||||
import type { QqbotMessageType } from '../qqbot.types';
|
||||
import type { QqbotMessageType } from '../contract/qqbot.types';
|
||||
|
||||
export class QqbotConversationQueryDto {
|
||||
@ApiPropertyOptional({ default: 1 })
|
||||
@ -6,7 +6,7 @@ import {
|
||||
KtDateTimeColumn,
|
||||
KtUpdateDateColumn,
|
||||
} from '@/common';
|
||||
import type { QqbotMessageDirection, QqbotMessageType } from '../qqbot.types';
|
||||
import type { QqbotMessageDirection, QqbotMessageType } from '../contract/qqbot.types';
|
||||
|
||||
@Entity('qqbot_message')
|
||||
@Index('idx_qqbot_message_self_message', ['selfId', 'messageId'])
|
||||
@ -8,11 +8,11 @@ import type {
|
||||
QqbotConversationQueryDto,
|
||||
QqbotMessageQueryDto,
|
||||
} from './qqbot-message.dto';
|
||||
import type { QqbotMessageType, QqbotNormalizedMessage } from '../qqbot.types';
|
||||
import type { QqbotMessageType, QqbotNormalizedMessage } from '../contract/qqbot.types';
|
||||
import {
|
||||
QQBOT_DEFAULT_PAGE_NO,
|
||||
QQBOT_DEFAULT_PAGE_SIZE,
|
||||
} from '../qqbot.constants';
|
||||
} from '../contract/qqbot.constants';
|
||||
|
||||
@Injectable()
|
||||
export class QqbotMessageService {
|
||||
@ -8,7 +8,7 @@ import {
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
import * as mqtt from 'mqtt';
|
||||
import type { MqttClient } from 'mqtt';
|
||||
import type { QqbotBusHandler } from '../qqbot.types';
|
||||
import type { QqbotBusHandler } from '../contract/qqbot.types';
|
||||
|
||||
@Injectable()
|
||||
export class QqbotBusService implements OnModuleInit, OnModuleDestroy {
|
||||
@ -5,7 +5,7 @@ import {
|
||||
KtDateTime,
|
||||
KtUpdateDateColumn,
|
||||
} from '@/common';
|
||||
import type { QqbotPermissionTargetType } from '../qqbot.types';
|
||||
import type { QqbotPermissionTargetType } from '../contract/qqbot.types';
|
||||
|
||||
@Entity('qqbot_allowlist')
|
||||
export class QqbotAllowlist {
|
||||
@ -5,7 +5,7 @@ import {
|
||||
KtDateTime,
|
||||
KtUpdateDateColumn,
|
||||
} from '@/common';
|
||||
import type { QqbotPermissionTargetType } from '../qqbot.types';
|
||||
import type { QqbotPermissionTargetType } from '../contract/qqbot.types';
|
||||
|
||||
@Entity('qqbot_blocklist')
|
||||
export class QqbotBlocklist {
|
||||
@ -1,5 +1,5 @@
|
||||
import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger';
|
||||
import type { QqbotPermissionTargetType } from '../qqbot.types';
|
||||
import type { QqbotPermissionTargetType } from '../contract/qqbot.types';
|
||||
|
||||
export class QqbotPermissionConfigDto {
|
||||
@ApiPropertyOptional({ default: false })
|
||||
@ -14,12 +14,12 @@ import { QqbotConfigService } from '../config/qqbot-config.service';
|
||||
import {
|
||||
QQBOT_DEFAULT_PAGE_NO,
|
||||
QQBOT_DEFAULT_PAGE_SIZE,
|
||||
} from '../qqbot.constants';
|
||||
} from '../contract/qqbot.constants';
|
||||
import type {
|
||||
QqbotNormalizedMessage,
|
||||
QqbotPermissionEntity,
|
||||
QqbotPermissionKind,
|
||||
} from '../qqbot.types';
|
||||
} from '../contract/qqbot.types';
|
||||
|
||||
@Injectable()
|
||||
export class QqbotPermissionService {
|
||||
@ -3,47 +3,45 @@ import { ConfigModule } from '@nestjs/config';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { AdminAuthGuardModule } from '@/modules/admin/identity/auth/admin-auth-guard.module';
|
||||
import { DictModule } from '@/modules/admin/platform-config/dict/dict.module';
|
||||
import { QqbotAccountAbility } from '@/qqbot/account/qqbot-account-ability.entity';
|
||||
import { QqbotAccountController } from '@/qqbot/account/qqbot-account.controller';
|
||||
import { QqbotAccount } from '@/qqbot/account/qqbot-account.entity';
|
||||
import { QqbotAccountService } from '@/qqbot/account/qqbot-account.service';
|
||||
import { QqbotNapcatLoginService } from '@/qqbot/account/qqbot-napcat-login.service';
|
||||
import { QqbotNapcatWatchdogService } from '@/qqbot/account/qqbot-napcat-watchdog.service';
|
||||
import { QqbotCommandController } from '@/qqbot/command/qqbot-command.controller';
|
||||
import { QqbotCommand } from '@/qqbot/command/qqbot-command.entity';
|
||||
import { QqbotCommandEngineService } from '@/qqbot/command/qqbot-command-engine.service';
|
||||
import { QqbotCommandLog } from '@/qqbot/command/qqbot-command-log.entity';
|
||||
import { QqbotCommandParserService } from '@/qqbot/command/qqbot-command-parser.service';
|
||||
import { QqbotCommandService } from '@/qqbot/command/qqbot-command.service';
|
||||
import { QqbotReplyTemplateService } from '@/qqbot/command/qqbot-reply-template.service';
|
||||
import { QqbotReverseWsService } from '@/qqbot/connection/qqbot-reverse-ws.service';
|
||||
import { QqbotConfig } from '@/qqbot/config/qqbot-config.entity';
|
||||
import { QqbotConfigService } from '@/qqbot/config/qqbot-config.service';
|
||||
import { QqbotDashboardController } from '@/qqbot/dashboard/qqbot-dashboard.controller';
|
||||
import { QqbotDashboardService } from '@/qqbot/dashboard/qqbot-dashboard.service';
|
||||
import { QqbotDedupe } from '@/qqbot/dedupe/qqbot-dedupe.entity';
|
||||
import { QqbotDedupeService } from '@/qqbot/dedupe/qqbot-dedupe.service';
|
||||
import { QqbotEventService } from '@/qqbot/event/qqbot-event.service';
|
||||
import { QqbotAccountAbility } from '@/modules/qqbot/core/account/qqbot-account-ability.entity';
|
||||
import { QqbotAccountController } from '@/modules/qqbot/core/account/qqbot-account.controller';
|
||||
import { QqbotAccount } from '@/modules/qqbot/core/account/qqbot-account.entity';
|
||||
import { QqbotAccountService } from '@/modules/qqbot/core/account/qqbot-account.service';
|
||||
import { QqbotNapcatLoginService } from '@/modules/qqbot/napcat/login/qqbot-napcat-login.service';
|
||||
import { QqbotNapcatWatchdogService } from '@/modules/qqbot/napcat/login/qqbot-napcat-watchdog.service';
|
||||
import { QqbotCommandController } from '@/modules/qqbot/core/command/qqbot-command.controller';
|
||||
import { QqbotCommand } from '@/modules/qqbot/core/command/qqbot-command.entity';
|
||||
import { QqbotCommandEngineService } from '@/modules/qqbot/core/command/qqbot-command-engine.service';
|
||||
import { QqbotCommandLog } from '@/modules/qqbot/core/command/qqbot-command-log.entity';
|
||||
import { QqbotCommandParserService } from '@/modules/qqbot/core/command/qqbot-command-parser.service';
|
||||
import { QqbotCommandService } from '@/modules/qqbot/core/command/qqbot-command.service';
|
||||
import { QqbotReplyTemplateService } from '@/modules/qqbot/core/command/qqbot-reply-template.service';
|
||||
import { QqbotReverseWsService } from '@/modules/qqbot/core/connection/qqbot-reverse-ws.service';
|
||||
import { QqbotConfig } from '@/modules/qqbot/core/config/qqbot-config.entity';
|
||||
import { QqbotConfigService } from '@/modules/qqbot/core/config/qqbot-config.service';
|
||||
import { QqbotDashboardController } from '@/modules/qqbot/core/dashboard/qqbot-dashboard.controller';
|
||||
import { QqbotDashboardService } from '@/modules/qqbot/core/dashboard/qqbot-dashboard.service';
|
||||
import { QqbotDedupe } from '@/modules/qqbot/core/dedupe/qqbot-dedupe.entity';
|
||||
import { QqbotDedupeService } from '@/modules/qqbot/core/dedupe/qqbot-dedupe.service';
|
||||
import { QqbotEventService } from '@/modules/qqbot/core/event/qqbot-event.service';
|
||||
import { QqbotPluginHttpClientService } from '@/modules/qqbot/plugin-platform/sdk';
|
||||
import {
|
||||
NapcatDeviceIdentity,
|
||||
NapcatDeviceIdentityService,
|
||||
} from '@/modules/qqbot/napcat';
|
||||
import { QqbotConversation } from '@/qqbot/message/qqbot-conversation.entity';
|
||||
import { QqbotMessageController } from '@/qqbot/message/qqbot-message.controller';
|
||||
import { QqbotMessage } from '@/qqbot/message/qqbot-message.entity';
|
||||
import { QqbotMessageService } from '@/qqbot/message/qqbot-message.service';
|
||||
import { QqbotBusService } from '@/qqbot/mqtt/qqbot-bus.service';
|
||||
import { QqbotAccountNapcat } from '@/qqbot/napcat/qqbot-account-napcat.entity';
|
||||
import { QqbotNapcatContainer } from '@/qqbot/napcat/qqbot-napcat-container.entity';
|
||||
import { QqbotNapcatContainerService } from '@/qqbot/napcat/qqbot-napcat-container.service';
|
||||
import { QqbotAllowlist } from '@/qqbot/permission/qqbot-allowlist.entity';
|
||||
import { QqbotBlocklist } from '@/qqbot/permission/qqbot-blocklist.entity';
|
||||
import { QqbotPermissionController } from '@/qqbot/permission/qqbot-permission.controller';
|
||||
import { QqbotPermissionService } from '@/qqbot/permission/qqbot-permission.service';
|
||||
import { QqbotEventPluginRegistryService } from '@/qqbot/plugin/qqbot-event-plugin-registry.service';
|
||||
import { QqbotPluginController } from '@/qqbot/plugin/qqbot-plugin.controller';
|
||||
import { QqbotPluginRegistryService } from '@/qqbot/plugin/qqbot-plugin-registry.service';
|
||||
import { NapcatDeviceIdentity } from '@/modules/qqbot/napcat/device/napcat-device-identity.entity';
|
||||
import { NapcatDeviceIdentityService } from '@/modules/qqbot/napcat/device/napcat-device-identity.service';
|
||||
import { QqbotConversation } from '@/modules/qqbot/core/message/qqbot-conversation.entity';
|
||||
import { QqbotMessageController } from '@/modules/qqbot/core/message/qqbot-message.controller';
|
||||
import { QqbotMessage } from '@/modules/qqbot/core/message/qqbot-message.entity';
|
||||
import { QqbotMessageService } from '@/modules/qqbot/core/message/qqbot-message.service';
|
||||
import { QqbotBusService } from '@/modules/qqbot/core/mqtt/qqbot-bus.service';
|
||||
import { QqbotAccountNapcat } from '@/modules/qqbot/napcat/infrastructure/persistence/qqbot-account-napcat.entity';
|
||||
import { QqbotNapcatContainer } from '@/modules/qqbot/napcat/infrastructure/persistence/qqbot-napcat-container.entity';
|
||||
import { QqbotNapcatContainerService } from '@/modules/qqbot/napcat/qqbot-napcat-container.service';
|
||||
import { QqbotAllowlist } from '@/modules/qqbot/core/permission/qqbot-allowlist.entity';
|
||||
import { QqbotBlocklist } from '@/modules/qqbot/core/permission/qqbot-blocklist.entity';
|
||||
import { QqbotPermissionController } from '@/modules/qqbot/core/permission/qqbot-permission.controller';
|
||||
import { QqbotPermissionService } from '@/modules/qqbot/core/permission/qqbot-permission.service';
|
||||
import { QqbotEventPluginRegistryService } from '../../../qqbot/plugin/qqbot-event-plugin-registry.service';
|
||||
import { QqbotPluginController } from '../../../qqbot/plugin/qqbot-plugin.controller';
|
||||
import { QqbotPluginRegistryService } from '../../../qqbot/plugin/qqbot-plugin-registry.service';
|
||||
import { QqbotBangDreamClientService } from '@/modules/qqbot/plugins/bangDream/application/bangdream-client.service';
|
||||
import { TsuguApplicationService } from '@/modules/qqbot/plugins/bangDream/application/bangdream-application.service';
|
||||
import { QqbotBangDreamRendererService } from '@/modules/qqbot/plugins/bangDream/application/bangdream-renderer.facade';
|
||||
@ -53,14 +51,14 @@ import { QqbotFf14MarketPluginService } from '@/modules/qqbot/plugins/ff14Market
|
||||
import { QqbotFflogsClientService } from '@/modules/qqbot/plugins/fflogs/qqbot-fflogs-client.service';
|
||||
import { QqbotFflogsPluginService } from '@/modules/qqbot/plugins/fflogs/qqbot-fflogs.plugin';
|
||||
import { QqbotRepeaterPluginService } from '@/modules/qqbot/plugins/repeater/qqbot-repeater.plugin';
|
||||
import { QqbotRuleController } from '@/qqbot/rule/qqbot-rule.controller';
|
||||
import { QqbotRule } from '@/qqbot/rule/qqbot-rule.entity';
|
||||
import { QqbotRuleEngineService } from '@/qqbot/rule/qqbot-rule-engine.service';
|
||||
import { QqbotRuleService } from '@/qqbot/rule/qqbot-rule.service';
|
||||
import { QqbotRateLimitService } from '@/qqbot/send/qqbot-rate-limit.service';
|
||||
import { QqbotSendController } from '@/qqbot/send/qqbot-send.controller';
|
||||
import { QqbotSendLog } from '@/qqbot/send/qqbot-send-log.entity';
|
||||
import { QqbotSendService } from '@/qqbot/send/qqbot-send.service';
|
||||
import { QqbotRuleController } from '@/modules/qqbot/core/rule/qqbot-rule.controller';
|
||||
import { QqbotRule } from '@/modules/qqbot/core/rule/qqbot-rule.entity';
|
||||
import { QqbotRuleEngineService } from '@/modules/qqbot/core/rule/qqbot-rule-engine.service';
|
||||
import { QqbotRuleService } from '@/modules/qqbot/core/rule/qqbot-rule.service';
|
||||
import { QqbotRateLimitService } from '@/modules/qqbot/core/send/qqbot-rate-limit.service';
|
||||
import { QqbotSendController } from '@/modules/qqbot/core/send/qqbot-send.controller';
|
||||
import { QqbotSendLog } from '@/modules/qqbot/core/send/qqbot-send-log.entity';
|
||||
import { QqbotSendService } from '@/modules/qqbot/core/send/qqbot-send.service';
|
||||
|
||||
export { QQBOT_CORE_DOMAIN_CONTRACT } from './qqbot-core.contract';
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import { Injectable, Logger } from '@nestjs/common';
|
||||
import { ToolsService } from '@/common';
|
||||
import type { QqbotNormalizedMessage } from '../qqbot.types';
|
||||
import type { QqbotNormalizedMessage } from '../contract/qqbot.types';
|
||||
import { QqbotCommandEngineService } from '../command/qqbot-command-engine.service';
|
||||
import { QqbotPermissionService } from '../permission/qqbot-permission.service';
|
||||
import { QqbotRepeaterPluginService } from '@/modules/qqbot/plugins/repeater/qqbot-repeater.plugin';
|
||||
@ -1,5 +1,5 @@
|
||||
import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger';
|
||||
import type { QqbotRuleMatchType, QqbotRuleTargetType } from '../qqbot.types';
|
||||
import type { QqbotRuleMatchType, QqbotRuleTargetType } from '../contract/qqbot.types';
|
||||
|
||||
export class QqbotRuleBodyDto {
|
||||
@ApiPropertyOptional()
|
||||
@ -6,7 +6,7 @@ import {
|
||||
KtDateTimeColumn,
|
||||
KtUpdateDateColumn,
|
||||
} from '@/common';
|
||||
import type { QqbotRuleMatchType, QqbotRuleTargetType } from '../qqbot.types';
|
||||
import type { QqbotRuleMatchType, QqbotRuleTargetType } from '../contract/qqbot.types';
|
||||
|
||||
@Entity('qqbot_rule')
|
||||
export class QqbotRule {
|
||||
@ -14,12 +14,12 @@ import type {
|
||||
QqbotNormalizedMessage,
|
||||
QqbotRuleMatchType,
|
||||
QqbotRuleTargetType,
|
||||
} from '../qqbot.types';
|
||||
} from '../contract/qqbot.types';
|
||||
import {
|
||||
QQBOT_DEFAULT_PAGE_NO,
|
||||
QQBOT_DEFAULT_PAGE_SIZE,
|
||||
} from '../qqbot.constants';
|
||||
import { isWithinCooldown } from '../qqbot-cooldown.policy';
|
||||
} from '../contract/qqbot.constants';
|
||||
import { isWithinCooldown } from '../domain/qqbot-cooldown.policy';
|
||||
|
||||
@Injectable()
|
||||
export class QqbotRuleService {
|
||||
@ -5,7 +5,7 @@ import {
|
||||
KtDateTime,
|
||||
KtUpdateDateColumn,
|
||||
} from '@/common';
|
||||
import type { QqbotMessageType, QqbotSendStatus } from '../qqbot.types';
|
||||
import type { QqbotMessageType, QqbotSendStatus } from '../contract/qqbot.types';
|
||||
|
||||
@Entity('qqbot_send_log')
|
||||
@Index('idx_qqbot_send_log_target', ['selfId', 'targetType', 'targetId'])
|
||||
@ -1,5 +1,5 @@
|
||||
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
|
||||
import type { QqbotMessageType, QqbotSendStatus } from '../qqbot.types';
|
||||
import type { QqbotMessageType, QqbotSendStatus } from '../contract/qqbot.types';
|
||||
|
||||
export class QqbotSendPrivateDto {
|
||||
@ApiPropertyOptional()
|
||||
@ -4,17 +4,17 @@ import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { throwVbenError, ToolsService } from '@/common';
|
||||
import { QqbotAccountService } from '../account/qqbot-account.service';
|
||||
import { QQBOT_MQTT_TOPICS } from '../qqbot.constants';
|
||||
import { QQBOT_MQTT_TOPICS } from '../contract/qqbot.constants';
|
||||
import { QqbotBusService } from '../mqtt/qqbot-bus.service';
|
||||
import { QqbotMessageService } from '../message/qqbot-message.service';
|
||||
import type {
|
||||
QqbotMessageType,
|
||||
QqbotReverseActionSender,
|
||||
} from '../qqbot.types';
|
||||
} from '../contract/qqbot.types';
|
||||
import {
|
||||
QQBOT_DEFAULT_PAGE_NO,
|
||||
QQBOT_DEFAULT_PAGE_SIZE,
|
||||
} from '../qqbot.constants';
|
||||
} from '../contract/qqbot.constants';
|
||||
import { QqbotRateLimitService } from './qqbot-rate-limit.service';
|
||||
import { QqbotSendLog } from './qqbot-send-log.entity';
|
||||
import type {
|
||||
@ -1,6 +1,11 @@
|
||||
export * from './container/napcat-docker-device-options';
|
||||
export * from './device/napcat-device-identity.entity';
|
||||
export * from './device/napcat-device-identity.service';
|
||||
export * from './infrastructure/persistence/qqbot-account-napcat.entity';
|
||||
export * from './infrastructure/persistence/qqbot-napcat-container.entity';
|
||||
export * from './integration/napcat-login-api.client';
|
||||
export * from './login/napcat-login-state-machine';
|
||||
export * from './login/qqbot-napcat-login.service';
|
||||
export * from './login/qqbot-napcat-watchdog.service';
|
||||
export * from './persistence';
|
||||
export * from './qqbot-napcat-container.service';
|
||||
|
||||
@ -6,7 +6,7 @@ import {
|
||||
KtDateTimeColumn,
|
||||
KtUpdateDateColumn,
|
||||
} from '@/common';
|
||||
import type { QqbotAccountNapcatBindStatus } from '../qqbot.types';
|
||||
import type { QqbotAccountNapcatBindStatus } from '../../../core/contract/qqbot.types';
|
||||
|
||||
@Entity('qqbot_account_napcat')
|
||||
@Index('idx_qqbot_account_napcat_account', ['accountId', 'isDeleted'])
|
||||
@ -6,7 +6,7 @@ import {
|
||||
KtDateTimeColumn,
|
||||
KtUpdateDateColumn,
|
||||
} from '@/common';
|
||||
import type { QqbotNapcatContainerStatus } from '../qqbot.types';
|
||||
import type { QqbotNapcatContainerStatus } from '../../../core/contract/qqbot.types';
|
||||
|
||||
@Entity('qqbot_napcat_container')
|
||||
@Index('uk_qqbot_napcat_container_name', ['name'], { unique: true })
|
||||
@ -5,7 +5,7 @@ import { Injectable } from '@nestjs/common';
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
import { Observable } from 'rxjs';
|
||||
import { throwVbenError, ToolsService } from '@/common';
|
||||
import { NapcatLoginApiClient } from '@/modules/qqbot/napcat';
|
||||
import { NapcatLoginApiClient } from '../integration/napcat-login-api.client';
|
||||
import type {
|
||||
NapcatApiResponse,
|
||||
NapcatCaptchaLoginResult,
|
||||
@ -23,9 +23,9 @@ import type {
|
||||
QqbotNapcatRuntime,
|
||||
QrcodeLookupOptions,
|
||||
QrcodeRefreshOptions,
|
||||
} from '../qqbot.types';
|
||||
import { QqbotNapcatContainerService } from '../napcat/qqbot-napcat-container.service';
|
||||
import { QqbotAccountService } from './qqbot-account.service';
|
||||
} from '../../core/contract/qqbot.types';
|
||||
import { QqbotAccountService } from '../../core/account/qqbot-account.service';
|
||||
import { QqbotNapcatContainerService } from '../qqbot-napcat-container.service';
|
||||
|
||||
@Injectable()
|
||||
export class QqbotNapcatLoginService {
|
||||
@ -5,7 +5,7 @@ import {
|
||||
OnModuleInit,
|
||||
} from '@nestjs/common';
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
import { QqbotAccountService } from './qqbot-account.service';
|
||||
import { QqbotAccountService } from '../../core/account/qqbot-account.service';
|
||||
|
||||
const DEFAULT_INTERVAL_MS = 120_000;
|
||||
const MIN_INTERVAL_MS = 30_000;
|
||||
@ -1,4 +1,6 @@
|
||||
import { NapcatDeviceIdentity } from './device/napcat-device-identity.entity';
|
||||
import { QqbotAccountNapcat } from './infrastructure/persistence/qqbot-account-napcat.entity';
|
||||
import { QqbotNapcatContainer } from './infrastructure/persistence/qqbot-napcat-container.entity';
|
||||
|
||||
export const NAPCAT_RUNTIME_DOMAIN_CONTRACT = {
|
||||
tables: [
|
||||
@ -11,4 +13,8 @@ export const NAPCAT_RUNTIME_DOMAIN_CONTRACT = {
|
||||
],
|
||||
} as const;
|
||||
|
||||
export const NAPCAT_RUNTIME_ENTITIES = [NapcatDeviceIdentity];
|
||||
export const NAPCAT_RUNTIME_ENTITIES = [
|
||||
NapcatDeviceIdentity,
|
||||
QqbotAccountNapcat,
|
||||
QqbotNapcatContainer,
|
||||
];
|
||||
|
||||
@ -8,13 +8,13 @@ import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { throwVbenError, ToolsService } from '@/common';
|
||||
import {
|
||||
NapcatDeviceIdentityService,
|
||||
toNapcatDockerDeviceOptions,
|
||||
type NapcatDockerDeviceOptions,
|
||||
} from '@/modules/qqbot/napcat';
|
||||
import { QqbotAccount } from '../account/qqbot-account.entity';
|
||||
import { QqbotAccountNapcat } from './qqbot-account-napcat.entity';
|
||||
import { QqbotNapcatContainer } from './qqbot-napcat-container.entity';
|
||||
} from './container/napcat-docker-device-options';
|
||||
import { NapcatDeviceIdentityService } from './device/napcat-device-identity.service';
|
||||
import { QqbotAccount } from '../core/account/qqbot-account.entity';
|
||||
import { QqbotAccountNapcat } from './infrastructure/persistence/qqbot-account-napcat.entity';
|
||||
import { QqbotNapcatContainer } from './infrastructure/persistence/qqbot-napcat-container.entity';
|
||||
import type {
|
||||
NapcatApiResponse,
|
||||
NapcatCredential,
|
||||
@ -22,7 +22,7 @@ import type {
|
||||
QqbotNapcatRuntime,
|
||||
QqbotNapcatRuntimeLoginStatus,
|
||||
QqbotNapcatRuntimeStatusSnapshot,
|
||||
} from '../qqbot.types';
|
||||
} from '../core/contract/qqbot.types';
|
||||
|
||||
type NapcatLoginLogState = 'offline' | 'online' | 'unknown';
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { formatKtDateTime, ToolsService } from '@/common';
|
||||
import type { QqbotIntegrationPlugin } from '@/qqbot/qqbot.types';
|
||||
import type { QqbotIntegrationPlugin } from '@/modules/qqbot/core/contract/qqbot.types';
|
||||
import {
|
||||
BANGDREAM_INPUT_SCHEMA,
|
||||
BANGDREAM_OUTPUT_SCHEMA,
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { formatKtDateTime, ToolsService } from '@/common';
|
||||
import type { QqbotIntegrationPlugin } from '@/qqbot/qqbot.types';
|
||||
import type { QqbotIntegrationPlugin } from '@/modules/qqbot/core/contract/qqbot.types';
|
||||
import { QqbotFf14ClientService } from './qqbot-ff14-client.service';
|
||||
|
||||
@Injectable()
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { formatKtDateTime, ToolsService } from '@/common';
|
||||
import type { QqbotIntegrationPlugin } from '@/qqbot/qqbot.types';
|
||||
import type { QqbotIntegrationPlugin } from '@/modules/qqbot/core/contract/qqbot.types';
|
||||
import { QqbotFflogsClientService } from './qqbot-fflogs-client.service';
|
||||
|
||||
@Injectable()
|
||||
|
||||
@ -1,14 +1,14 @@
|
||||
import { Injectable, Logger } from '@nestjs/common';
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
import { ToolsService } from '@/common';
|
||||
import { QqbotAccountService } from '@/qqbot/account/qqbot-account.service';
|
||||
import { QqbotAccountService } from '@/modules/qqbot/core/account/qqbot-account.service';
|
||||
import type {
|
||||
QqbotEventPluginDefinition,
|
||||
QqbotEventPluginSummary,
|
||||
QqbotNormalizedMessage,
|
||||
QqbotRepeaterConversationState,
|
||||
} from '@/qqbot/qqbot.types';
|
||||
import { QqbotSendService } from '@/qqbot/send/qqbot-send.service';
|
||||
} from '@/modules/qqbot/core/contract/qqbot.types';
|
||||
import { QqbotSendService } from '@/modules/qqbot/core/send/qqbot-send.service';
|
||||
|
||||
const QQBOT_REPEATER_VERSION = '1.0.0';
|
||||
const QQBOT_REPEATER_PLUGIN_KEY = 'repeater';
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { formatKtDateTime, throwVbenError } from '@/common';
|
||||
import { QqbotAccountService } from '../account/qqbot-account.service';
|
||||
import { QqbotAccountService } from '@/modules/qqbot/core/account/qqbot-account.service';
|
||||
import { QqbotRepeaterPluginService } from '@/modules/qqbot/plugins/repeater/qqbot-repeater.plugin';
|
||||
import type {
|
||||
QqbotEventPluginDefinition,
|
||||
QqbotPluginHealth,
|
||||
QqbotPluginOperationSummary,
|
||||
} from '../qqbot.types';
|
||||
} from '@/modules/qqbot/core/contract/qqbot.types';
|
||||
|
||||
@Injectable()
|
||||
export class QqbotEventPluginRegistryService {
|
||||
|
||||
@ -9,7 +9,7 @@ import type {
|
||||
QqbotPluginOperationContext,
|
||||
QqbotPluginOperationSummary,
|
||||
QqbotPluginSummary,
|
||||
} from '../qqbot.types';
|
||||
} from '@/modules/qqbot/core/contract/qqbot.types';
|
||||
|
||||
@Injectable()
|
||||
export class QqbotPluginRegistryService implements OnModuleInit {
|
||||
|
||||
@ -12,7 +12,7 @@ import { JwtAuthGuard } from '@/modules/admin/identity/auth/jwt-auth.guard';
|
||||
import { vbenSuccess } from '@/common';
|
||||
import { QqbotEventPluginRegistryService } from './qqbot-event-plugin-registry.service';
|
||||
import { QqbotPluginRegistryService } from './qqbot-plugin-registry.service';
|
||||
import type { QqbotPluginTriggerMode } from '../qqbot.types';
|
||||
import type { QqbotPluginTriggerMode } from '@/modules/qqbot/core/contract/qqbot.types';
|
||||
|
||||
@ApiTags('QQBot - 插件能力')
|
||||
@Controller('qqbot/plugin')
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { QqbotCoreModule } from '@/modules/qqbot/core/qqbot-core.module';
|
||||
|
||||
@Module({
|
||||
imports: [QqbotCoreModule],
|
||||
exports: [QqbotCoreModule],
|
||||
})
|
||||
export class QqbotModule {}
|
||||
@ -1,22 +1,3 @@
|
||||
jest.mock('@/qqbot/qqbot.module', () => ({
|
||||
QqbotModule: class QqbotModule {},
|
||||
}));
|
||||
jest.mock('@/qqbot/plugin/qqbot-event-plugin-registry.service', () => ({
|
||||
QqbotEventPluginRegistryService: class QqbotEventPluginRegistryService {},
|
||||
}));
|
||||
jest.mock(
|
||||
'../../../../src/qqbot/plugin/qqbot-event-plugin-registry.service',
|
||||
() => ({
|
||||
QqbotEventPluginRegistryService: class QqbotEventPluginRegistryService {},
|
||||
}),
|
||||
);
|
||||
jest.mock('@/qqbot/plugin/qqbot-plugin-registry.service', () => ({
|
||||
QqbotPluginRegistryService: class QqbotPluginRegistryService {},
|
||||
}));
|
||||
jest.mock('../../../../src/qqbot/plugin/qqbot-plugin-registry.service', () => ({
|
||||
QqbotPluginRegistryService: class QqbotPluginRegistryService {},
|
||||
}));
|
||||
|
||||
import { QQBOT_CORE_DOMAIN_CONTRACT } from '../../../../src/modules/qqbot/core/qqbot-core.contract';
|
||||
import { readRefactorV3SqlSchema } from '../../../helpers/sql-schema.helper';
|
||||
|
||||
|
||||
@ -5,12 +5,6 @@ jest.mock('@/modules/admin/identity/auth/jwt-auth.guard', () => ({
|
||||
}
|
||||
},
|
||||
}));
|
||||
jest.mock('@/qqbot/plugin/qqbot-plugin-registry.service', () => ({
|
||||
QqbotPluginRegistryService: class QqbotPluginRegistryService {},
|
||||
}));
|
||||
jest.mock('../../../../src/qqbot/plugin/qqbot-plugin-registry.service', () => ({
|
||||
QqbotPluginRegistryService: class QqbotPluginRegistryService {},
|
||||
}));
|
||||
|
||||
import type { INestApplication } from '@nestjs/common';
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
@ -19,19 +13,24 @@ import { Test } from '@nestjs/testing';
|
||||
import * as request from 'supertest';
|
||||
import { DictService } from '../../../../src/modules/admin/platform-config/dict/dict.service';
|
||||
import { ToolsService } from '../../../../src/common';
|
||||
import { QqbotAccountService } from '../../../../src/qqbot/account/qqbot-account.service';
|
||||
import { QqbotCommandController } from '../../../../src/qqbot/command/qqbot-command.controller';
|
||||
import { QqbotCommand } from '../../../../src/qqbot/command/qqbot-command.entity';
|
||||
import { QqbotCommandEngineService } from '../../../../src/qqbot/command/qqbot-command-engine.service';
|
||||
import { QqbotCommandLog } from '../../../../src/qqbot/command/qqbot-command-log.entity';
|
||||
import { QqbotCommandParserService } from '../../../../src/qqbot/command/qqbot-command-parser.service';
|
||||
import { QqbotCommandService } from '../../../../src/qqbot/command/qqbot-command.service';
|
||||
import { QqbotReplyTemplateService } from '../../../../src/qqbot/command/qqbot-reply-template.service';
|
||||
import { QqbotPluginRegistryService } from '../../../../src/qqbot/plugin/qqbot-plugin-registry.service';
|
||||
import { QqbotSendService } from '../../../../src/qqbot/send/qqbot-send.service';
|
||||
import { QqbotAccountService } from '../../../../src/modules/qqbot/core/account/qqbot-account.service';
|
||||
import { QqbotCommandController } from '../../../../src/modules/qqbot/core/command/qqbot-command.controller';
|
||||
import { QqbotCommand } from '../../../../src/modules/qqbot/core/command/qqbot-command.entity';
|
||||
import { QqbotCommandEngineService } from '../../../../src/modules/qqbot/core/command/qqbot-command-engine.service';
|
||||
import { QqbotCommandLog } from '../../../../src/modules/qqbot/core/command/qqbot-command-log.entity';
|
||||
import { QqbotCommandParserService } from '../../../../src/modules/qqbot/core/command/qqbot-command-parser.service';
|
||||
import { QqbotCommandService } from '../../../../src/modules/qqbot/core/command/qqbot-command.service';
|
||||
import { QqbotReplyTemplateService } from '../../../../src/modules/qqbot/core/command/qqbot-reply-template.service';
|
||||
import { QQBOT_CORE_PROVIDERS } from '../../../../src/modules/qqbot/core/qqbot-core.module';
|
||||
import { QqbotSendService } from '../../../../src/modules/qqbot/core/send/qqbot-send.service';
|
||||
|
||||
describe('QQBot core command local smoke', () => {
|
||||
let app: INestApplication;
|
||||
type ProviderClass = new (...args: never[]) => unknown;
|
||||
const qqbotPluginRegistryProvider = QQBOT_CORE_PROVIDERS.find(
|
||||
(provider) =>
|
||||
(provider as { name?: string }).name === 'QqbotPluginRegistryService',
|
||||
) as ProviderClass;
|
||||
|
||||
const command = {
|
||||
aliases: '["查歌"]',
|
||||
@ -104,7 +103,7 @@ describe('QQBot core command local smoke', () => {
|
||||
},
|
||||
},
|
||||
{
|
||||
provide: QqbotPluginRegistryService,
|
||||
provide: qqbotPluginRegistryProvider,
|
||||
useValue: pluginRegistry,
|
||||
},
|
||||
{
|
||||
|
||||
@ -1,21 +1,3 @@
|
||||
const mockQqbotEventPluginRegistryService = class QqbotEventPluginRegistryService {};
|
||||
const mockQqbotPluginRegistryService = class QqbotPluginRegistryService {};
|
||||
|
||||
jest.mock('@/qqbot/plugin/qqbot-event-plugin-registry.service', () => ({
|
||||
QqbotEventPluginRegistryService: mockQqbotEventPluginRegistryService,
|
||||
}));
|
||||
jest.mock(
|
||||
'../../../../src/qqbot/plugin/qqbot-event-plugin-registry.service',
|
||||
() => ({
|
||||
QqbotEventPluginRegistryService: mockQqbotEventPluginRegistryService,
|
||||
}),
|
||||
);
|
||||
jest.mock('@/qqbot/plugin/qqbot-plugin-registry.service', () => ({
|
||||
QqbotPluginRegistryService: mockQqbotPluginRegistryService,
|
||||
}));
|
||||
jest.mock('../../../../src/qqbot/plugin/qqbot-plugin-registry.service', () => ({
|
||||
QqbotPluginRegistryService: mockQqbotPluginRegistryService,
|
||||
}));
|
||||
jest.mock(
|
||||
'@/modules/qqbot/plugins/bangDream/application/bangdream-client.service',
|
||||
() => ({
|
||||
@ -59,6 +41,8 @@ jest.mock('@/modules/qqbot/plugins/repeater/qqbot-repeater.plugin', () => ({
|
||||
QqbotRepeaterPluginService: class QqbotRepeaterPluginService {},
|
||||
}));
|
||||
|
||||
import { existsSync } from 'fs';
|
||||
import { join } from 'path';
|
||||
import { MODULE_METADATA } from '@nestjs/common/constants';
|
||||
import { ConfigModule } from '@nestjs/config';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
@ -66,15 +50,13 @@ import { getMetadataArgsStorage } from 'typeorm';
|
||||
import { AdminAuthGuardModule } from '../../../../src/modules/admin/identity/auth/admin-auth-guard.module';
|
||||
import { DictModule } from '../../../../src/modules/admin/platform-config/dict/dict.module';
|
||||
import { AppModule } from '../../../../src/app.module';
|
||||
import { QqbotAccountController } from '../../../../src/qqbot/account/qqbot-account.controller';
|
||||
import { QqbotCommandController } from '../../../../src/qqbot/command/qqbot-command.controller';
|
||||
import { QqbotDashboardController } from '../../../../src/qqbot/dashboard/qqbot-dashboard.controller';
|
||||
import { QqbotMessageController } from '../../../../src/qqbot/message/qqbot-message.controller';
|
||||
import { QqbotPermissionController } from '../../../../src/qqbot/permission/qqbot-permission.controller';
|
||||
import { QqbotPluginController } from '../../../../src/qqbot/plugin/qqbot-plugin.controller';
|
||||
import { QqbotModule } from '../../../../src/qqbot/qqbot.module';
|
||||
import { QqbotRuleController } from '../../../../src/qqbot/rule/qqbot-rule.controller';
|
||||
import { QqbotSendController } from '../../../../src/qqbot/send/qqbot-send.controller';
|
||||
import { QqbotAccountController } from '../../../../src/modules/qqbot/core/account/qqbot-account.controller';
|
||||
import { QqbotCommandController } from '../../../../src/modules/qqbot/core/command/qqbot-command.controller';
|
||||
import { QqbotDashboardController } from '../../../../src/modules/qqbot/core/dashboard/qqbot-dashboard.controller';
|
||||
import { QqbotMessageController } from '../../../../src/modules/qqbot/core/message/qqbot-message.controller';
|
||||
import { QqbotPermissionController } from '../../../../src/modules/qqbot/core/permission/qqbot-permission.controller';
|
||||
import { QqbotRuleController } from '../../../../src/modules/qqbot/core/rule/qqbot-rule.controller';
|
||||
import { QqbotSendController } from '../../../../src/modules/qqbot/core/send/qqbot-send.controller';
|
||||
import {
|
||||
QQBOT_CORE_CONTROLLERS,
|
||||
QQBOT_CORE_ENTITIES,
|
||||
@ -157,12 +139,20 @@ describe('QQBot core module contract', () => {
|
||||
});
|
||||
|
||||
it('routes QQBot through the core module as the owning Nest boundary', () => {
|
||||
expect(getModuleMetadata(AppModule, MODULE_METADATA.IMPORTS)).toEqual(
|
||||
const legacyWrapperName = ['Qqbot', 'Module'].join('');
|
||||
const legacyWrapperPath = join(
|
||||
process.cwd(),
|
||||
'src',
|
||||
'qqbot',
|
||||
['qqbot', 'module.ts'].join('.'),
|
||||
);
|
||||
const appImports = getModuleMetadata(AppModule, MODULE_METADATA.IMPORTS);
|
||||
|
||||
expect(appImports).toEqual(
|
||||
expect.arrayContaining([QqbotCoreModule]),
|
||||
);
|
||||
expect(getModuleMetadata(AppModule, MODULE_METADATA.IMPORTS)).not.toEqual(
|
||||
expect.arrayContaining([QqbotModule]),
|
||||
);
|
||||
expect(getNames(appImports)).not.toContain(legacyWrapperName);
|
||||
expect(existsSync(legacyWrapperPath)).toBe(false);
|
||||
|
||||
const coreImports = getModuleMetadata(
|
||||
QqbotCoreModule,
|
||||
@ -176,7 +166,7 @@ describe('QQBot core module contract', () => {
|
||||
(item) => (item as { module?: unknown }).module === TypeOrmModule,
|
||||
),
|
||||
).toBe(true);
|
||||
expect(coreImports).not.toEqual(expect.arrayContaining([QqbotModule]));
|
||||
expect(getNames(coreImports)).not.toContain(legacyWrapperName);
|
||||
|
||||
expect(
|
||||
getModuleMetadata(QqbotCoreModule, MODULE_METADATA.CONTROLLERS),
|
||||
@ -187,12 +177,6 @@ describe('QQBot core module contract', () => {
|
||||
expect(getModuleMetadata(QqbotCoreModule, MODULE_METADATA.EXPORTS)).toEqual(
|
||||
expect.arrayContaining(QQBOT_CORE_EXPORTS),
|
||||
);
|
||||
expect(getModuleMetadata(QqbotModule, MODULE_METADATA.IMPORTS)).toEqual(
|
||||
expect.arrayContaining([QqbotCoreModule]),
|
||||
);
|
||||
expect(getModuleMetadata(QqbotModule, MODULE_METADATA.EXPORTS)).toEqual(
|
||||
expect.arrayContaining([QqbotCoreModule]),
|
||||
);
|
||||
});
|
||||
|
||||
it('makes the legacy QQBot controllers, providers and entities explicit', () => {
|
||||
@ -203,11 +187,13 @@ describe('QQBot core module contract', () => {
|
||||
QqbotDashboardController,
|
||||
QqbotMessageController,
|
||||
QqbotPermissionController,
|
||||
QqbotPluginController,
|
||||
QqbotRuleController,
|
||||
QqbotSendController,
|
||||
]),
|
||||
);
|
||||
expect(getNames(QQBOT_CORE_CONTROLLERS)).toEqual(
|
||||
expect.arrayContaining(['QqbotPluginController']),
|
||||
);
|
||||
expect(getNames(QQBOT_CORE_PROVIDERS)).toEqual(
|
||||
expect.arrayContaining([
|
||||
'QqbotAccountService',
|
||||
|
||||
@ -1,22 +1,3 @@
|
||||
jest.mock('@/qqbot/qqbot.module', () => ({
|
||||
QqbotModule: class QqbotModule {},
|
||||
}));
|
||||
jest.mock('@/qqbot/plugin/qqbot-event-plugin-registry.service', () => ({
|
||||
QqbotEventPluginRegistryService: class QqbotEventPluginRegistryService {},
|
||||
}));
|
||||
jest.mock(
|
||||
'../../../../src/qqbot/plugin/qqbot-event-plugin-registry.service',
|
||||
() => ({
|
||||
QqbotEventPluginRegistryService: class QqbotEventPluginRegistryService {},
|
||||
}),
|
||||
);
|
||||
jest.mock('@/qqbot/plugin/qqbot-plugin-registry.service', () => ({
|
||||
QqbotPluginRegistryService: class QqbotPluginRegistryService {},
|
||||
}));
|
||||
jest.mock('../../../../src/qqbot/plugin/qqbot-plugin-registry.service', () => ({
|
||||
QqbotPluginRegistryService: class QqbotPluginRegistryService {},
|
||||
}));
|
||||
|
||||
import { QQBOT_CORE_DOMAIN_CONTRACT } from '../../../../src/modules/qqbot/core/qqbot-core.contract';
|
||||
import { readRefactorV3SqlSchema } from '../../../helpers/sql-schema.helper';
|
||||
|
||||
|
||||
@ -1,22 +1,3 @@
|
||||
jest.mock('@/qqbot/qqbot.module', () => ({
|
||||
QqbotModule: class QqbotModule {},
|
||||
}));
|
||||
jest.mock('@/qqbot/plugin/qqbot-event-plugin-registry.service', () => ({
|
||||
QqbotEventPluginRegistryService: class QqbotEventPluginRegistryService {},
|
||||
}));
|
||||
jest.mock(
|
||||
'../../../../src/qqbot/plugin/qqbot-event-plugin-registry.service',
|
||||
() => ({
|
||||
QqbotEventPluginRegistryService: class QqbotEventPluginRegistryService {},
|
||||
}),
|
||||
);
|
||||
jest.mock('@/qqbot/plugin/qqbot-plugin-registry.service', () => ({
|
||||
QqbotPluginRegistryService: class QqbotPluginRegistryService {},
|
||||
}));
|
||||
jest.mock('../../../../src/qqbot/plugin/qqbot-plugin-registry.service', () => ({
|
||||
QqbotPluginRegistryService: class QqbotPluginRegistryService {},
|
||||
}));
|
||||
|
||||
import { QQBOT_CORE_DOMAIN_CONTRACT } from '../../../../src/modules/qqbot/core/qqbot-core.contract';
|
||||
import { readRefactorV3SqlSchema } from '../../../helpers/sql-schema.helper';
|
||||
|
||||
|
||||
@ -7,7 +7,7 @@ import {
|
||||
NAPCAT_RUNTIME_ENTITIES,
|
||||
toNapcatDockerDeviceOptions,
|
||||
} from '../../../../src/modules/qqbot/napcat';
|
||||
import { QqbotNapcatContainerService } from '../../../../src/qqbot/napcat/qqbot-napcat-container.service';
|
||||
import { QqbotNapcatContainerService } from '../../../../src/modules/qqbot/napcat/qqbot-napcat-container.service';
|
||||
import { readRefactorV3SqlSchema } from '../../../helpers/sql-schema.helper';
|
||||
|
||||
type EntityClass = new (...args: never[]) => unknown;
|
||||
|
||||
@ -27,7 +27,7 @@ import { QqbotFflogsPluginService } from '../../../../src/modules/qqbot/plugins/
|
||||
import { QqbotEventPluginRegistryService } from '../../../../src/qqbot/plugin/qqbot-event-plugin-registry.service';
|
||||
import { QqbotPluginController } from '../../../../src/qqbot/plugin/qqbot-plugin.controller';
|
||||
import { QqbotPluginRegistryService } from '../../../../src/qqbot/plugin/qqbot-plugin-registry.service';
|
||||
import type { QqbotIntegrationPlugin } from '../../../../src/qqbot/qqbot.types';
|
||||
import type { QqbotIntegrationPlugin } from '../../../../src/modules/qqbot/core/contract/qqbot.types';
|
||||
|
||||
const createPlugin = (
|
||||
key: string,
|
||||
|
||||
@ -12,7 +12,7 @@ jest.mock('@/modules/qqbot/plugins/fflogs/qqbot-fflogs.plugin', () => ({
|
||||
}));
|
||||
|
||||
import { QqbotPluginRegistryService } from '../../../../src/qqbot/plugin/qqbot-plugin-registry.service';
|
||||
import type { QqbotIntegrationPlugin } from '../../../../src/qqbot/qqbot.types';
|
||||
import type { QqbotIntegrationPlugin } from '../../../../src/modules/qqbot/core/contract/qqbot.types';
|
||||
|
||||
const asPluginService = (plugin: QqbotIntegrationPlugin) =>
|
||||
({
|
||||
|
||||
@ -5,23 +5,23 @@ jest.mock('@/modules/admin/identity/auth/jwt-auth.guard', () => ({
|
||||
}
|
||||
},
|
||||
}));
|
||||
jest.mock('@/qqbot/account/qqbot-account.service', () => ({
|
||||
jest.mock('@/modules/qqbot/core/account/qqbot-account.service', () => ({
|
||||
QqbotAccountService: class {},
|
||||
}));
|
||||
jest.mock('@/qqbot/account/qqbot-napcat-login.service', () => ({
|
||||
jest.mock('@/modules/qqbot/napcat/login/qqbot-napcat-login.service', () => ({
|
||||
QqbotNapcatLoginService: class {},
|
||||
}));
|
||||
jest.mock('@/qqbot/connection/qqbot-reverse-ws.service', () => ({
|
||||
jest.mock('@/modules/qqbot/core/connection/qqbot-reverse-ws.service', () => ({
|
||||
QqbotReverseWsService: class {},
|
||||
}));
|
||||
|
||||
import * as request from 'supertest';
|
||||
import { Test } from '@nestjs/testing';
|
||||
import type { INestApplication } from '@nestjs/common';
|
||||
import { QqbotAccountController } from '@/qqbot/account/qqbot-account.controller';
|
||||
import { QqbotAccountService } from '@/qqbot/account/qqbot-account.service';
|
||||
import { QqbotNapcatLoginService } from '@/qqbot/account/qqbot-napcat-login.service';
|
||||
import { QqbotReverseWsService } from '@/qqbot/connection/qqbot-reverse-ws.service';
|
||||
import { QqbotAccountController } from '@/modules/qqbot/core/account/qqbot-account.controller';
|
||||
import { QqbotAccountService } from '@/modules/qqbot/core/account/qqbot-account.service';
|
||||
import { QqbotNapcatLoginService } from '@/modules/qqbot/napcat/login/qqbot-napcat-login.service';
|
||||
import { QqbotReverseWsService } from '@/modules/qqbot/core/connection/qqbot-reverse-ws.service';
|
||||
|
||||
describe('QqbotAccountController', () => {
|
||||
let app: INestApplication;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import { ToolsService } from '@/common';
|
||||
import { QqbotAccountService } from '@/qqbot/account/qqbot-account.service';
|
||||
import { QqbotAccountService } from '@/modules/qqbot/core/account/qqbot-account.service';
|
||||
|
||||
describe('QqbotAccountService', () => {
|
||||
it('stores NapCat login password as encrypted secret and never persists the transport field', async () => {
|
||||
|
||||
@ -13,9 +13,9 @@ jest.mock('@/common', () => {
|
||||
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
import { ToolsService } from '@/common';
|
||||
import { QqbotAccountService } from '@/qqbot/account/qqbot-account.service';
|
||||
import { QqbotNapcatLoginService } from '@/qqbot/account/qqbot-napcat-login.service';
|
||||
import { QqbotNapcatContainerService } from '@/qqbot/napcat/qqbot-napcat-container.service';
|
||||
import { QqbotAccountService } from '@/modules/qqbot/core/account/qqbot-account.service';
|
||||
import { QqbotNapcatLoginService } from '@/modules/qqbot/napcat/login/qqbot-napcat-login.service';
|
||||
import { QqbotNapcatContainerService } from '@/modules/qqbot/napcat/qqbot-napcat-container.service';
|
||||
|
||||
describe('QqbotNapcatLoginService', () => {
|
||||
const toolsService = new ToolsService();
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
import { QqbotNapcatWatchdogService } from '@/qqbot/account/qqbot-napcat-watchdog.service';
|
||||
import { QqbotNapcatWatchdogService } from '@/modules/qqbot/napcat/login/qqbot-napcat-watchdog.service';
|
||||
|
||||
function buildService(
|
||||
configValues: Record<string, string | undefined>,
|
||||
|
||||
@ -27,8 +27,8 @@ jest.mock(
|
||||
);
|
||||
|
||||
import { DictService } from '@/modules/admin/platform-config/dict/dict.service';
|
||||
import type { QqbotCommand } from '@/qqbot/command/qqbot-command.entity';
|
||||
import { QqbotCommandParserService } from '@/qqbot/command/qqbot-command-parser.service';
|
||||
import type { QqbotCommand } from '@/modules/qqbot/core/command/qqbot-command.entity';
|
||||
import { QqbotCommandParserService } from '@/modules/qqbot/core/command/qqbot-command-parser.service';
|
||||
|
||||
describe('QqbotCommandParserService FFLogs parser', () => {
|
||||
const command = {
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
jest.mock('@/qqbot/event/qqbot-event.service', () => ({
|
||||
jest.mock('@/modules/qqbot/core/event/qqbot-event.service', () => ({
|
||||
QqbotEventService: class {},
|
||||
}));
|
||||
|
||||
import { EventEmitter } from 'events';
|
||||
import { ToolsService } from '@/common';
|
||||
import { QqbotReverseWsService } from '@/qqbot/connection/qqbot-reverse-ws.service';
|
||||
import { QqbotReverseWsService } from '@/modules/qqbot/core/connection/qqbot-reverse-ws.service';
|
||||
|
||||
class FakeWebSocket extends EventEmitter {
|
||||
closed: Array<{ code?: number; reason?: string }> = [];
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
jest.mock('@/qqbot/rule/qqbot-rule-engine.service', () => ({
|
||||
jest.mock('@/modules/qqbot/core/rule/qqbot-rule-engine.service', () => ({
|
||||
QqbotRuleEngineService: class QqbotRuleEngineService {},
|
||||
}));
|
||||
|
||||
import { QqbotEventService } from '@/qqbot/event/qqbot-event.service';
|
||||
import { QqbotEventService } from '@/modules/qqbot/core/event/qqbot-event.service';
|
||||
|
||||
describe('QqbotEventService', () => {
|
||||
it('marks account offline with reason when NapCat reports kicked offline notice', async () => {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import { ToolsService } from '@/common';
|
||||
import { QqbotNapcatContainerService } from '@/qqbot/napcat/qqbot-napcat-container.service';
|
||||
import { QqbotNapcatContainerService } from '@/modules/qqbot/napcat/qqbot-napcat-container.service';
|
||||
|
||||
describe('QqbotNapcatContainerService captcha logs', () => {
|
||||
it('extracts captcha url from recent runtime logs', async () => {
|
||||
|
||||
@ -9,7 +9,7 @@ jest.mock('@/common', () => {
|
||||
});
|
||||
|
||||
import { ToolsService } from '@/common';
|
||||
import { QqbotNapcatContainerService } from '@/qqbot/napcat/qqbot-napcat-container.service';
|
||||
import { QqbotNapcatContainerService } from '@/modules/qqbot/napcat/qqbot-napcat-container.service';
|
||||
|
||||
describe('QqbotNapcatContainerService runtime status', () => {
|
||||
const createService = (repository: {
|
||||
|
||||
@ -13,7 +13,7 @@ jest.mock('@/common', () => {
|
||||
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
import { ToolsService } from '@/common';
|
||||
import { QqbotNapcatContainerService } from '@/qqbot/napcat/qqbot-napcat-container.service';
|
||||
import { QqbotNapcatContainerService } from '@/modules/qqbot/napcat/qqbot-napcat-container.service';
|
||||
|
||||
describe('QqbotNapcatContainerService', () => {
|
||||
it('removes previous account containers when binding a new primary container', async () => {
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import { ToolsService } from '@/common';
|
||||
import { QqbotRepeaterPluginService } from '@/modules/qqbot/plugins/repeater/qqbot-repeater.plugin';
|
||||
import type { QqbotNormalizedMessage } from '@/qqbot/qqbot.types';
|
||||
import type { QqbotNormalizedMessage } from '@/modules/qqbot/core/contract/qqbot.types';
|
||||
|
||||
function createMessage(text: string): QqbotNormalizedMessage {
|
||||
return {
|
||||
|
||||
@ -2,7 +2,7 @@ import { formatKtDateTime, KtDateTime, KtDateTimeColumn } from '@/common';
|
||||
import {
|
||||
getEffectiveCooldownMs,
|
||||
isWithinCooldown,
|
||||
} from '@/qqbot/qqbot-cooldown.policy';
|
||||
} from '@/modules/qqbot/core/domain/qqbot-cooldown.policy';
|
||||
|
||||
class CooldownEntityFixture {
|
||||
@KtDateTimeColumn()
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import { ToolsService } from '@/common';
|
||||
import { QqbotRuleService } from '@/qqbot/rule/qqbot-rule.service';
|
||||
import { QqbotRuleService } from '@/modules/qqbot/core/rule/qqbot-rule.service';
|
||||
|
||||
function createService(config: Record<string, number | string | undefined>) {
|
||||
return new (QqbotRuleService as any)(
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import { QqbotRateLimitService } from '@/qqbot/send/qqbot-rate-limit.service';
|
||||
import { QqbotRateLimitService } from '@/modules/qqbot/core/send/qqbot-rate-limit.service';
|
||||
|
||||
function createService(config: Record<string, number | string | undefined>) {
|
||||
return new QqbotRateLimitService({
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
import { ToolsService } from '@/common';
|
||||
import { QqbotSendService } from '@/qqbot/send/qqbot-send.service';
|
||||
import { QqbotSendService } from '@/modules/qqbot/core/send/qqbot-send.service';
|
||||
|
||||
describe('QqbotSendService', () => {
|
||||
it('stores summarized CQ image payloads while sending the original message', async () => {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user