refactor: 收敛QQBot核心与NapCat模块

This commit is contained in:
sunlei 2026-06-15 12:09:15 +08:00
parent ff8e3908f4
commit e17d1f89ab
86 changed files with 206 additions and 277 deletions

View File

@ -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 | | 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 | | 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 | | 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 | | 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 yet | none yet | current files before migration | baseline only | | 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 | | Admin UI | none yet | none yet | current files before migration | baseline only |

View File

@ -5,7 +5,7 @@ import {
KtDateTime, KtDateTime,
KtUpdateDateColumn, KtUpdateDateColumn,
} from '@/common'; } from '@/common';
import type { QqbotAccountAbilityType } from '../qqbot.types'; import type { QqbotAccountAbilityType } from '../contract/qqbot.types';
@Entity('qqbot_account_ability') @Entity('qqbot_account_ability')
@Index('uk_qqbot_account_ability', ['accountId', 'abilityType', 'abilityKey'], { @Index('uk_qqbot_account_ability', ['accountId', 'abilityType', 'abilityKey'], {

View File

@ -20,7 +20,7 @@ import {
QqbotAccountUpdateDto, QqbotAccountUpdateDto,
} from './qqbot-account.dto'; } from './qqbot-account.dto';
import { QqbotAccountService } from './qqbot-account.service'; 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'; import { QqbotReverseWsService } from '../connection/qqbot-reverse-ws.service';
@ApiTags('QQBot - 账号连接') @ApiTags('QQBot - 账号连接')

View File

@ -1,5 +1,5 @@
import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger'; import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger';
import type { QqbotConnectionMode } from '../qqbot.types'; import type { QqbotConnectionMode } from '../contract/qqbot.types';
export class QqbotAccountBodyDto { export class QqbotAccountBodyDto {
@ApiPropertyOptional({ default: 'reverse-ws' }) @ApiPropertyOptional({ default: 'reverse-ws' })

View File

@ -10,7 +10,7 @@ import type {
QqbotConnectionMode, QqbotConnectionMode,
QqbotConnectionRole, QqbotConnectionRole,
QqbotConnectionStatus, QqbotConnectionStatus,
} from '../qqbot.types'; } from '../contract/qqbot.types';
@Entity('qqbot_account') @Entity('qqbot_account')
export class QqbotAccount { export class QqbotAccount {

View File

@ -16,19 +16,19 @@ import type {
QqbotAccountQueryDto, QqbotAccountQueryDto,
QqbotAccountUpdateDto, QqbotAccountUpdateDto,
} from './qqbot-account.dto'; } from './qqbot-account.dto';
import { QqbotAccountNapcat } from '../napcat/qqbot-account-napcat.entity'; import { QqbotAccountNapcat } from '../../napcat/infrastructure/persistence/qqbot-account-napcat.entity';
import { QqbotNapcatContainer } from '../napcat/qqbot-napcat-container.entity'; import { QqbotNapcatContainer } from '../../napcat/infrastructure/persistence/qqbot-napcat-container.entity';
import { QqbotNapcatContainerService } from '../napcat/qqbot-napcat-container.service'; import { QqbotNapcatContainerService } from '../../napcat/qqbot-napcat-container.service';
import { import {
QQBOT_DEFAULT_PAGE_NO, QQBOT_DEFAULT_PAGE_NO,
QQBOT_DEFAULT_PAGE_SIZE, QQBOT_DEFAULT_PAGE_SIZE,
} from '../qqbot.constants'; } from '../contract/qqbot.constants';
import type { import type {
QqbotAccountAbilityType, QqbotAccountAbilityType,
QqbotAccountListItem, QqbotAccountListItem,
QqbotConnectionRole, QqbotConnectionRole,
QqbotNapcatRuntimeStatusSnapshot, QqbotNapcatRuntimeStatusSnapshot,
} from '../qqbot.types'; } from '../contract/qqbot.types';
const NAPCAT_RUNTIME_CHECK_TTL_MS = 30_000; const NAPCAT_RUNTIME_CHECK_TTL_MS = 30_000;
const NAPCAT_AUTO_LOGIN_CLEANUP_FAILED_MESSAGE = const NAPCAT_AUTO_LOGIN_CLEANUP_FAILED_MESSAGE =

View File

@ -1,7 +1,7 @@
import { Injectable, Logger } from '@nestjs/common'; import { Injectable, Logger } from '@nestjs/common';
import { ToolsService } from '@/common'; import { ToolsService } from '@/common';
import { QqbotPluginRegistryService } from '../plugin/qqbot-plugin-registry.service'; import { QqbotPluginRegistryService } from '../../../../qqbot/plugin/qqbot-plugin-registry.service';
import type { QqbotNormalizedMessage } from '../qqbot.types'; import type { QqbotNormalizedMessage } from '../contract/qqbot.types';
import { QqbotSendService } from '../send/qqbot-send.service'; import { QqbotSendService } from '../send/qqbot-send.service';
import type { QqbotCommandTestDto } from './qqbot-command.dto'; import type { QqbotCommandTestDto } from './qqbot-command.dto';
import type { QqbotCommand } from './qqbot-command.entity'; import type { QqbotCommand } from './qqbot-command.entity';

View File

@ -5,8 +5,8 @@ import {
KtDateTime, KtDateTime,
KtUpdateDateColumn, KtUpdateDateColumn,
} from '@/common'; } from '@/common';
import type { QqbotMessageType } from '../qqbot.types'; import type { QqbotMessageType } from '../contract/qqbot.types';
import type { QqbotCommandLogStatus } from '../qqbot.types'; import type { QqbotCommandLogStatus } from '../contract/qqbot.types';
@Entity('qqbot_command_log') @Entity('qqbot_command_log')
export class QqbotCommandLog { export class QqbotCommandLog {

View File

@ -1,7 +1,7 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { DictService } from '@/modules/admin/platform-config/dict/dict.service'; import { DictService } from '@/modules/admin/platform-config/dict/dict.service';
import type { QqbotCommand } from './qqbot-command.entity'; import type { QqbotCommand } from './qqbot-command.entity';
import type { QqbotNormalizedMessage } from '../qqbot.types'; import type { QqbotNormalizedMessage } from '../contract/qqbot.types';
import { import {
buildQqbotFf14MarketCatalog, buildQqbotFf14MarketCatalog,
buildQqbotFf14MarketCatalogFromTree, buildQqbotFf14MarketCatalogFromTree,
@ -13,7 +13,7 @@ import {
splitQqbotFf14WorldPath, splitQqbotFf14WorldPath,
} from '@/modules/qqbot/plugins/ff14Market/qqbot-ff14-worlds'; } from '@/modules/qqbot/plugins/ff14Market/qqbot-ff14-worlds';
import type { QqbotFf14MarketCatalog } from '@/modules/qqbot/plugins/ff14Market/qqbot-ff14-market.types'; 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() @Injectable()
export class QqbotCommandParserService { export class QqbotCommandParserService {

View File

@ -5,7 +5,7 @@ import type {
QqbotCommandParserType, QqbotCommandParserType,
QqbotMessageType, QqbotMessageType,
QqbotRuleTargetType, QqbotRuleTargetType,
} from '../qqbot.types'; } from '../contract/qqbot.types';
export class QqbotCommandQueryDto implements KtPageQuery { export class QqbotCommandQueryDto implements KtPageQuery {
@ApiPropertyOptional() @ApiPropertyOptional()

View File

@ -9,7 +9,7 @@ import {
import type { import type {
QqbotCommandParserType, QqbotCommandParserType,
QqbotRuleTargetType, QqbotRuleTargetType,
} from '../qqbot.types'; } from '../contract/qqbot.types';
@Entity('qqbot_command') @Entity('qqbot_command')
export class QqbotCommand { export class QqbotCommand {

View File

@ -4,22 +4,22 @@ import { InjectRepository } from '@nestjs/typeorm';
import { Not, Repository } from 'typeorm'; import { Not, Repository } from 'typeorm';
import { throwVbenError, ToolsService } from '@/common'; import { throwVbenError, ToolsService } from '@/common';
import { QqbotAccountService } from '../account/qqbot-account.service'; 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 { import {
QQBOT_DEFAULT_PAGE_NO, QQBOT_DEFAULT_PAGE_NO,
QQBOT_DEFAULT_PAGE_SIZE, QQBOT_DEFAULT_PAGE_SIZE,
} from '../qqbot.constants'; } from '../contract/qqbot.constants';
import type { import type {
QqbotCommandParserType, QqbotCommandParserType,
QqbotNormalizedMessage, QqbotNormalizedMessage,
QqbotRuleTargetType, QqbotRuleTargetType,
} from '../qqbot.types'; } from '../contract/qqbot.types';
import type { import type {
QqbotCommandBodyDto, QqbotCommandBodyDto,
QqbotCommandQueryDto, QqbotCommandQueryDto,
QqbotCommandUpdateDto, QqbotCommandUpdateDto,
} from './qqbot-command.dto'; } 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 { QqbotCommandLog } from './qqbot-command-log.entity';
import { QqbotCommand } from './qqbot-command.entity'; import { QqbotCommand } from './qqbot-command.entity';

View File

@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm'; import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { QqbotConfig } from './qqbot-config.entity'; import { QqbotConfig } from './qqbot-config.entity';
import type { QqbotPermissionConfig } from '../qqbot.types'; import type { QqbotPermissionConfig } from '../contract/qqbot.types';
const QQBOT_PERMISSION_CONFIG_KEYS = { const QQBOT_PERMISSION_CONFIG_KEYS = {
allowlistEnabled: 'permission.allowlistEnabled', allowlistEnabled: 'permission.allowlistEnabled',

View File

@ -10,13 +10,13 @@ import { ConfigService } from '@nestjs/config';
import { HttpAdapterHost, ModuleRef } from '@nestjs/core'; import { HttpAdapterHost, ModuleRef } from '@nestjs/core';
import { WebSocket, WebSocketServer } from 'ws'; import { WebSocket, WebSocketServer } from 'ws';
import { ToolsService } from '@/common'; 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 { import type {
QqbotConnectionRole, QqbotConnectionRole,
QqbotOneBotActionResponse, QqbotOneBotActionResponse,
QqbotOneBotEvent, QqbotOneBotEvent,
QqbotPendingAction, QqbotPendingAction,
} from '../qqbot.types'; } from '../contract/qqbot.types';
import { QqbotAccountService } from '../account/qqbot-account.service'; import { QqbotAccountService } from '../account/qqbot-account.service';
import { QqbotEventService } from '../event/qqbot-event.service'; import { QqbotEventService } from '../event/qqbot-event.service';
import { QqbotBusService } from '../mqtt/qqbot-bus.service'; import { QqbotBusService } from '../mqtt/qqbot-bus.service';

View File

@ -1,8 +1,8 @@
import type { QrcodeLookupOptions } from '@/common/types'; import type { QrcodeLookupOptions } from '@/common/types';
import type { QqbotAccount } from './account/qqbot-account.entity'; import type { QqbotAccount } from '../account/qqbot-account.entity';
import type { QqbotCommand } from './command/qqbot-command.entity'; import type { QqbotCommand } from '../command/qqbot-command.entity';
import type { QqbotAllowlist } from './permission/qqbot-allowlist.entity'; import type { QqbotAllowlist } from '../permission/qqbot-allowlist.entity';
import type { QqbotBlocklist } from './permission/qqbot-blocklist.entity'; import type { QqbotBlocklist } from '../permission/qqbot-blocklist.entity';
export type { QrcodeLookupOptions } from '@/common/types'; export type { QrcodeLookupOptions } from '@/common/types';

View File

@ -3,7 +3,7 @@ import type {
QqbotMessageType, QqbotMessageType,
QqbotNormalizedMessage, QqbotNormalizedMessage,
QqbotOneBotEvent, QqbotOneBotEvent,
} from '../qqbot.types'; } from '../contract/qqbot.types';
export function isOneBotMessageEvent( export function isOneBotMessageEvent(
payload: QqbotOneBotEvent, payload: QqbotOneBotEvent,

View File

@ -4,11 +4,11 @@ import {
SystemNoticePublisher, SystemNoticePublisher,
ToolsService, ToolsService,
} from '@/common'; } 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 { QqbotDedupeService } from '../dedupe/qqbot-dedupe.service';
import { QqbotMessageService } from '../message/qqbot-message.service'; import { QqbotMessageService } from '../message/qqbot-message.service';
import { QqbotBusService } from '../mqtt/qqbot-bus.service'; import { QqbotBusService } from '../mqtt/qqbot-bus.service';
import type { QqbotOneBotEvent } from '../qqbot.types'; import type { QqbotOneBotEvent } from '../contract/qqbot.types';
import { import {
buildDedupeKey, buildDedupeKey,
getOneBotOfflineReason, getOneBotOfflineReason,

View File

@ -6,7 +6,7 @@ import {
KtDateTimeColumn, KtDateTimeColumn,
KtUpdateDateColumn, KtUpdateDateColumn,
} from '@/common'; } from '@/common';
import type { QqbotMessageType } from '../qqbot.types'; import type { QqbotMessageType } from '../contract/qqbot.types';
@Entity('qqbot_conversation') @Entity('qqbot_conversation')
@Index('idx_qqbot_conversation_target', ['selfId', 'targetType', 'targetId']) @Index('idx_qqbot_conversation_target', ['selfId', 'targetType', 'targetId'])

View File

@ -1,5 +1,5 @@
import { ApiPropertyOptional } from '@nestjs/swagger'; import { ApiPropertyOptional } from '@nestjs/swagger';
import type { QqbotMessageType } from '../qqbot.types'; import type { QqbotMessageType } from '../contract/qqbot.types';
export class QqbotConversationQueryDto { export class QqbotConversationQueryDto {
@ApiPropertyOptional({ default: 1 }) @ApiPropertyOptional({ default: 1 })

View File

@ -6,7 +6,7 @@ import {
KtDateTimeColumn, KtDateTimeColumn,
KtUpdateDateColumn, KtUpdateDateColumn,
} from '@/common'; } from '@/common';
import type { QqbotMessageDirection, QqbotMessageType } from '../qqbot.types'; import type { QqbotMessageDirection, QqbotMessageType } from '../contract/qqbot.types';
@Entity('qqbot_message') @Entity('qqbot_message')
@Index('idx_qqbot_message_self_message', ['selfId', 'messageId']) @Index('idx_qqbot_message_self_message', ['selfId', 'messageId'])

View File

@ -8,11 +8,11 @@ import type {
QqbotConversationQueryDto, QqbotConversationQueryDto,
QqbotMessageQueryDto, QqbotMessageQueryDto,
} from './qqbot-message.dto'; } from './qqbot-message.dto';
import type { QqbotMessageType, QqbotNormalizedMessage } from '../qqbot.types'; import type { QqbotMessageType, QqbotNormalizedMessage } from '../contract/qqbot.types';
import { import {
QQBOT_DEFAULT_PAGE_NO, QQBOT_DEFAULT_PAGE_NO,
QQBOT_DEFAULT_PAGE_SIZE, QQBOT_DEFAULT_PAGE_SIZE,
} from '../qqbot.constants'; } from '../contract/qqbot.constants';
@Injectable() @Injectable()
export class QqbotMessageService { export class QqbotMessageService {

View File

@ -8,7 +8,7 @@ import {
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import * as mqtt from 'mqtt'; import * as mqtt from 'mqtt';
import type { MqttClient } from 'mqtt'; import type { MqttClient } from 'mqtt';
import type { QqbotBusHandler } from '../qqbot.types'; import type { QqbotBusHandler } from '../contract/qqbot.types';
@Injectable() @Injectable()
export class QqbotBusService implements OnModuleInit, OnModuleDestroy { export class QqbotBusService implements OnModuleInit, OnModuleDestroy {

View File

@ -5,7 +5,7 @@ import {
KtDateTime, KtDateTime,
KtUpdateDateColumn, KtUpdateDateColumn,
} from '@/common'; } from '@/common';
import type { QqbotPermissionTargetType } from '../qqbot.types'; import type { QqbotPermissionTargetType } from '../contract/qqbot.types';
@Entity('qqbot_allowlist') @Entity('qqbot_allowlist')
export class QqbotAllowlist { export class QqbotAllowlist {

View File

@ -5,7 +5,7 @@ import {
KtDateTime, KtDateTime,
KtUpdateDateColumn, KtUpdateDateColumn,
} from '@/common'; } from '@/common';
import type { QqbotPermissionTargetType } from '../qqbot.types'; import type { QqbotPermissionTargetType } from '../contract/qqbot.types';
@Entity('qqbot_blocklist') @Entity('qqbot_blocklist')
export class QqbotBlocklist { export class QqbotBlocklist {

View File

@ -1,5 +1,5 @@
import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger'; import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger';
import type { QqbotPermissionTargetType } from '../qqbot.types'; import type { QqbotPermissionTargetType } from '../contract/qqbot.types';
export class QqbotPermissionConfigDto { export class QqbotPermissionConfigDto {
@ApiPropertyOptional({ default: false }) @ApiPropertyOptional({ default: false })

View File

@ -14,12 +14,12 @@ import { QqbotConfigService } from '../config/qqbot-config.service';
import { import {
QQBOT_DEFAULT_PAGE_NO, QQBOT_DEFAULT_PAGE_NO,
QQBOT_DEFAULT_PAGE_SIZE, QQBOT_DEFAULT_PAGE_SIZE,
} from '../qqbot.constants'; } from '../contract/qqbot.constants';
import type { import type {
QqbotNormalizedMessage, QqbotNormalizedMessage,
QqbotPermissionEntity, QqbotPermissionEntity,
QqbotPermissionKind, QqbotPermissionKind,
} from '../qqbot.types'; } from '../contract/qqbot.types';
@Injectable() @Injectable()
export class QqbotPermissionService { export class QqbotPermissionService {

View File

@ -3,47 +3,45 @@ import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { AdminAuthGuardModule } from '@/modules/admin/identity/auth/admin-auth-guard.module'; import { AdminAuthGuardModule } from '@/modules/admin/identity/auth/admin-auth-guard.module';
import { DictModule } from '@/modules/admin/platform-config/dict/dict.module'; import { DictModule } from '@/modules/admin/platform-config/dict/dict.module';
import { QqbotAccountAbility } from '@/qqbot/account/qqbot-account-ability.entity'; import { QqbotAccountAbility } from '@/modules/qqbot/core/account/qqbot-account-ability.entity';
import { QqbotAccountController } from '@/qqbot/account/qqbot-account.controller'; import { QqbotAccountController } from '@/modules/qqbot/core/account/qqbot-account.controller';
import { QqbotAccount } from '@/qqbot/account/qqbot-account.entity'; import { QqbotAccount } from '@/modules/qqbot/core/account/qqbot-account.entity';
import { QqbotAccountService } from '@/qqbot/account/qqbot-account.service'; import { QqbotAccountService } from '@/modules/qqbot/core/account/qqbot-account.service';
import { QqbotNapcatLoginService } from '@/qqbot/account/qqbot-napcat-login.service'; import { QqbotNapcatLoginService } from '@/modules/qqbot/napcat/login/qqbot-napcat-login.service';
import { QqbotNapcatWatchdogService } from '@/qqbot/account/qqbot-napcat-watchdog.service'; import { QqbotNapcatWatchdogService } from '@/modules/qqbot/napcat/login/qqbot-napcat-watchdog.service';
import { QqbotCommandController } from '@/qqbot/command/qqbot-command.controller'; import { QqbotCommandController } from '@/modules/qqbot/core/command/qqbot-command.controller';
import { QqbotCommand } from '@/qqbot/command/qqbot-command.entity'; import { QqbotCommand } from '@/modules/qqbot/core/command/qqbot-command.entity';
import { QqbotCommandEngineService } from '@/qqbot/command/qqbot-command-engine.service'; import { QqbotCommandEngineService } from '@/modules/qqbot/core/command/qqbot-command-engine.service';
import { QqbotCommandLog } from '@/qqbot/command/qqbot-command-log.entity'; import { QqbotCommandLog } from '@/modules/qqbot/core/command/qqbot-command-log.entity';
import { QqbotCommandParserService } from '@/qqbot/command/qqbot-command-parser.service'; import { QqbotCommandParserService } from '@/modules/qqbot/core/command/qqbot-command-parser.service';
import { QqbotCommandService } from '@/qqbot/command/qqbot-command.service'; import { QqbotCommandService } from '@/modules/qqbot/core/command/qqbot-command.service';
import { QqbotReplyTemplateService } from '@/qqbot/command/qqbot-reply-template.service'; import { QqbotReplyTemplateService } from '@/modules/qqbot/core/command/qqbot-reply-template.service';
import { QqbotReverseWsService } from '@/qqbot/connection/qqbot-reverse-ws.service'; import { QqbotReverseWsService } from '@/modules/qqbot/core/connection/qqbot-reverse-ws.service';
import { QqbotConfig } from '@/qqbot/config/qqbot-config.entity'; import { QqbotConfig } from '@/modules/qqbot/core/config/qqbot-config.entity';
import { QqbotConfigService } from '@/qqbot/config/qqbot-config.service'; import { QqbotConfigService } from '@/modules/qqbot/core/config/qqbot-config.service';
import { QqbotDashboardController } from '@/qqbot/dashboard/qqbot-dashboard.controller'; import { QqbotDashboardController } from '@/modules/qqbot/core/dashboard/qqbot-dashboard.controller';
import { QqbotDashboardService } from '@/qqbot/dashboard/qqbot-dashboard.service'; import { QqbotDashboardService } from '@/modules/qqbot/core/dashboard/qqbot-dashboard.service';
import { QqbotDedupe } from '@/qqbot/dedupe/qqbot-dedupe.entity'; import { QqbotDedupe } from '@/modules/qqbot/core/dedupe/qqbot-dedupe.entity';
import { QqbotDedupeService } from '@/qqbot/dedupe/qqbot-dedupe.service'; import { QqbotDedupeService } from '@/modules/qqbot/core/dedupe/qqbot-dedupe.service';
import { QqbotEventService } from '@/qqbot/event/qqbot-event.service'; import { QqbotEventService } from '@/modules/qqbot/core/event/qqbot-event.service';
import { QqbotPluginHttpClientService } from '@/modules/qqbot/plugin-platform/sdk'; import { QqbotPluginHttpClientService } from '@/modules/qqbot/plugin-platform/sdk';
import { import { NapcatDeviceIdentity } from '@/modules/qqbot/napcat/device/napcat-device-identity.entity';
NapcatDeviceIdentity, import { NapcatDeviceIdentityService } from '@/modules/qqbot/napcat/device/napcat-device-identity.service';
NapcatDeviceIdentityService, import { QqbotConversation } from '@/modules/qqbot/core/message/qqbot-conversation.entity';
} from '@/modules/qqbot/napcat'; import { QqbotMessageController } from '@/modules/qqbot/core/message/qqbot-message.controller';
import { QqbotConversation } from '@/qqbot/message/qqbot-conversation.entity'; import { QqbotMessage } from '@/modules/qqbot/core/message/qqbot-message.entity';
import { QqbotMessageController } from '@/qqbot/message/qqbot-message.controller'; import { QqbotMessageService } from '@/modules/qqbot/core/message/qqbot-message.service';
import { QqbotMessage } from '@/qqbot/message/qqbot-message.entity'; import { QqbotBusService } from '@/modules/qqbot/core/mqtt/qqbot-bus.service';
import { QqbotMessageService } from '@/qqbot/message/qqbot-message.service'; import { QqbotAccountNapcat } from '@/modules/qqbot/napcat/infrastructure/persistence/qqbot-account-napcat.entity';
import { QqbotBusService } from '@/qqbot/mqtt/qqbot-bus.service'; import { QqbotNapcatContainer } from '@/modules/qqbot/napcat/infrastructure/persistence/qqbot-napcat-container.entity';
import { QqbotAccountNapcat } from '@/qqbot/napcat/qqbot-account-napcat.entity'; import { QqbotNapcatContainerService } from '@/modules/qqbot/napcat/qqbot-napcat-container.service';
import { QqbotNapcatContainer } from '@/qqbot/napcat/qqbot-napcat-container.entity'; import { QqbotAllowlist } from '@/modules/qqbot/core/permission/qqbot-allowlist.entity';
import { QqbotNapcatContainerService } from '@/qqbot/napcat/qqbot-napcat-container.service'; import { QqbotBlocklist } from '@/modules/qqbot/core/permission/qqbot-blocklist.entity';
import { QqbotAllowlist } from '@/qqbot/permission/qqbot-allowlist.entity'; import { QqbotPermissionController } from '@/modules/qqbot/core/permission/qqbot-permission.controller';
import { QqbotBlocklist } from '@/qqbot/permission/qqbot-blocklist.entity'; import { QqbotPermissionService } from '@/modules/qqbot/core/permission/qqbot-permission.service';
import { QqbotPermissionController } from '@/qqbot/permission/qqbot-permission.controller'; import { QqbotEventPluginRegistryService } from '../../../qqbot/plugin/qqbot-event-plugin-registry.service';
import { QqbotPermissionService } from '@/qqbot/permission/qqbot-permission.service'; import { QqbotPluginController } from '../../../qqbot/plugin/qqbot-plugin.controller';
import { QqbotEventPluginRegistryService } from '@/qqbot/plugin/qqbot-event-plugin-registry.service'; import { QqbotPluginRegistryService } from '../../../qqbot/plugin/qqbot-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 { QqbotBangDreamClientService } from '@/modules/qqbot/plugins/bangDream/application/bangdream-client.service';
import { TsuguApplicationService } from '@/modules/qqbot/plugins/bangDream/application/bangdream-application.service'; import { TsuguApplicationService } from '@/modules/qqbot/plugins/bangDream/application/bangdream-application.service';
import { QqbotBangDreamRendererService } from '@/modules/qqbot/plugins/bangDream/application/bangdream-renderer.facade'; 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 { QqbotFflogsClientService } from '@/modules/qqbot/plugins/fflogs/qqbot-fflogs-client.service';
import { QqbotFflogsPluginService } from '@/modules/qqbot/plugins/fflogs/qqbot-fflogs.plugin'; import { QqbotFflogsPluginService } from '@/modules/qqbot/plugins/fflogs/qqbot-fflogs.plugin';
import { QqbotRepeaterPluginService } from '@/modules/qqbot/plugins/repeater/qqbot-repeater.plugin'; import { QqbotRepeaterPluginService } from '@/modules/qqbot/plugins/repeater/qqbot-repeater.plugin';
import { QqbotRuleController } from '@/qqbot/rule/qqbot-rule.controller'; import { QqbotRuleController } from '@/modules/qqbot/core/rule/qqbot-rule.controller';
import { QqbotRule } from '@/qqbot/rule/qqbot-rule.entity'; import { QqbotRule } from '@/modules/qqbot/core/rule/qqbot-rule.entity';
import { QqbotRuleEngineService } from '@/qqbot/rule/qqbot-rule-engine.service'; import { QqbotRuleEngineService } from '@/modules/qqbot/core/rule/qqbot-rule-engine.service';
import { QqbotRuleService } from '@/qqbot/rule/qqbot-rule.service'; import { QqbotRuleService } from '@/modules/qqbot/core/rule/qqbot-rule.service';
import { QqbotRateLimitService } from '@/qqbot/send/qqbot-rate-limit.service'; import { QqbotRateLimitService } from '@/modules/qqbot/core/send/qqbot-rate-limit.service';
import { QqbotSendController } from '@/qqbot/send/qqbot-send.controller'; import { QqbotSendController } from '@/modules/qqbot/core/send/qqbot-send.controller';
import { QqbotSendLog } from '@/qqbot/send/qqbot-send-log.entity'; import { QqbotSendLog } from '@/modules/qqbot/core/send/qqbot-send-log.entity';
import { QqbotSendService } from '@/qqbot/send/qqbot-send.service'; import { QqbotSendService } from '@/modules/qqbot/core/send/qqbot-send.service';
export { QQBOT_CORE_DOMAIN_CONTRACT } from './qqbot-core.contract'; export { QQBOT_CORE_DOMAIN_CONTRACT } from './qqbot-core.contract';

View File

@ -1,6 +1,6 @@
import { Injectable, Logger } from '@nestjs/common'; import { Injectable, Logger } from '@nestjs/common';
import { ToolsService } from '@/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 { QqbotCommandEngineService } from '../command/qqbot-command-engine.service';
import { QqbotPermissionService } from '../permission/qqbot-permission.service'; import { QqbotPermissionService } from '../permission/qqbot-permission.service';
import { QqbotRepeaterPluginService } from '@/modules/qqbot/plugins/repeater/qqbot-repeater.plugin'; import { QqbotRepeaterPluginService } from '@/modules/qqbot/plugins/repeater/qqbot-repeater.plugin';

View File

@ -1,5 +1,5 @@
import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger'; 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 { export class QqbotRuleBodyDto {
@ApiPropertyOptional() @ApiPropertyOptional()

View File

@ -6,7 +6,7 @@ import {
KtDateTimeColumn, KtDateTimeColumn,
KtUpdateDateColumn, KtUpdateDateColumn,
} from '@/common'; } from '@/common';
import type { QqbotRuleMatchType, QqbotRuleTargetType } from '../qqbot.types'; import type { QqbotRuleMatchType, QqbotRuleTargetType } from '../contract/qqbot.types';
@Entity('qqbot_rule') @Entity('qqbot_rule')
export class QqbotRule { export class QqbotRule {

View File

@ -14,12 +14,12 @@ import type {
QqbotNormalizedMessage, QqbotNormalizedMessage,
QqbotRuleMatchType, QqbotRuleMatchType,
QqbotRuleTargetType, QqbotRuleTargetType,
} from '../qqbot.types'; } from '../contract/qqbot.types';
import { import {
QQBOT_DEFAULT_PAGE_NO, QQBOT_DEFAULT_PAGE_NO,
QQBOT_DEFAULT_PAGE_SIZE, QQBOT_DEFAULT_PAGE_SIZE,
} from '../qqbot.constants'; } from '../contract/qqbot.constants';
import { isWithinCooldown } from '../qqbot-cooldown.policy'; import { isWithinCooldown } from '../domain/qqbot-cooldown.policy';
@Injectable() @Injectable()
export class QqbotRuleService { export class QqbotRuleService {

View File

@ -5,7 +5,7 @@ import {
KtDateTime, KtDateTime,
KtUpdateDateColumn, KtUpdateDateColumn,
} from '@/common'; } from '@/common';
import type { QqbotMessageType, QqbotSendStatus } from '../qqbot.types'; import type { QqbotMessageType, QqbotSendStatus } from '../contract/qqbot.types';
@Entity('qqbot_send_log') @Entity('qqbot_send_log')
@Index('idx_qqbot_send_log_target', ['selfId', 'targetType', 'targetId']) @Index('idx_qqbot_send_log_target', ['selfId', 'targetType', 'targetId'])

View File

@ -1,5 +1,5 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import type { QqbotMessageType, QqbotSendStatus } from '../qqbot.types'; import type { QqbotMessageType, QqbotSendStatus } from '../contract/qqbot.types';
export class QqbotSendPrivateDto { export class QqbotSendPrivateDto {
@ApiPropertyOptional() @ApiPropertyOptional()

View File

@ -4,17 +4,17 @@ import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { throwVbenError, ToolsService } from '@/common'; import { throwVbenError, ToolsService } from '@/common';
import { QqbotAccountService } from '../account/qqbot-account.service'; 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 { QqbotBusService } from '../mqtt/qqbot-bus.service';
import { QqbotMessageService } from '../message/qqbot-message.service'; import { QqbotMessageService } from '../message/qqbot-message.service';
import type { import type {
QqbotMessageType, QqbotMessageType,
QqbotReverseActionSender, QqbotReverseActionSender,
} from '../qqbot.types'; } from '../contract/qqbot.types';
import { import {
QQBOT_DEFAULT_PAGE_NO, QQBOT_DEFAULT_PAGE_NO,
QQBOT_DEFAULT_PAGE_SIZE, QQBOT_DEFAULT_PAGE_SIZE,
} from '../qqbot.constants'; } from '../contract/qqbot.constants';
import { QqbotRateLimitService } from './qqbot-rate-limit.service'; import { QqbotRateLimitService } from './qqbot-rate-limit.service';
import { QqbotSendLog } from './qqbot-send-log.entity'; import { QqbotSendLog } from './qqbot-send-log.entity';
import type { import type {

View File

@ -1,6 +1,11 @@
export * from './container/napcat-docker-device-options'; export * from './container/napcat-docker-device-options';
export * from './device/napcat-device-identity.entity'; export * from './device/napcat-device-identity.entity';
export * from './device/napcat-device-identity.service'; 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 './integration/napcat-login-api.client';
export * from './login/napcat-login-state-machine'; 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 './persistence';
export * from './qqbot-napcat-container.service';

View File

@ -6,7 +6,7 @@ import {
KtDateTimeColumn, KtDateTimeColumn,
KtUpdateDateColumn, KtUpdateDateColumn,
} from '@/common'; } from '@/common';
import type { QqbotAccountNapcatBindStatus } from '../qqbot.types'; import type { QqbotAccountNapcatBindStatus } from '../../../core/contract/qqbot.types';
@Entity('qqbot_account_napcat') @Entity('qqbot_account_napcat')
@Index('idx_qqbot_account_napcat_account', ['accountId', 'isDeleted']) @Index('idx_qqbot_account_napcat_account', ['accountId', 'isDeleted'])

View File

@ -6,7 +6,7 @@ import {
KtDateTimeColumn, KtDateTimeColumn,
KtUpdateDateColumn, KtUpdateDateColumn,
} from '@/common'; } from '@/common';
import type { QqbotNapcatContainerStatus } from '../qqbot.types'; import type { QqbotNapcatContainerStatus } from '../../../core/contract/qqbot.types';
@Entity('qqbot_napcat_container') @Entity('qqbot_napcat_container')
@Index('uk_qqbot_napcat_container_name', ['name'], { unique: true }) @Index('uk_qqbot_napcat_container_name', ['name'], { unique: true })

View File

@ -5,7 +5,7 @@ import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { throwVbenError, ToolsService } from '@/common'; import { throwVbenError, ToolsService } from '@/common';
import { NapcatLoginApiClient } from '@/modules/qqbot/napcat'; import { NapcatLoginApiClient } from '../integration/napcat-login-api.client';
import type { import type {
NapcatApiResponse, NapcatApiResponse,
NapcatCaptchaLoginResult, NapcatCaptchaLoginResult,
@ -23,9 +23,9 @@ import type {
QqbotNapcatRuntime, QqbotNapcatRuntime,
QrcodeLookupOptions, QrcodeLookupOptions,
QrcodeRefreshOptions, QrcodeRefreshOptions,
} from '../qqbot.types'; } from '../../core/contract/qqbot.types';
import { QqbotNapcatContainerService } from '../napcat/qqbot-napcat-container.service'; import { QqbotAccountService } from '../../core/account/qqbot-account.service';
import { QqbotAccountService } from './qqbot-account.service'; import { QqbotNapcatContainerService } from '../qqbot-napcat-container.service';
@Injectable() @Injectable()
export class QqbotNapcatLoginService { export class QqbotNapcatLoginService {

View File

@ -5,7 +5,7 @@ import {
OnModuleInit, OnModuleInit,
} from '@nestjs/common'; } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; 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 DEFAULT_INTERVAL_MS = 120_000;
const MIN_INTERVAL_MS = 30_000; const MIN_INTERVAL_MS = 30_000;

View File

@ -1,4 +1,6 @@
import { NapcatDeviceIdentity } from './device/napcat-device-identity.entity'; 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 = { export const NAPCAT_RUNTIME_DOMAIN_CONTRACT = {
tables: [ tables: [
@ -11,4 +13,8 @@ export const NAPCAT_RUNTIME_DOMAIN_CONTRACT = {
], ],
} as const; } as const;
export const NAPCAT_RUNTIME_ENTITIES = [NapcatDeviceIdentity]; export const NAPCAT_RUNTIME_ENTITIES = [
NapcatDeviceIdentity,
QqbotAccountNapcat,
QqbotNapcatContainer,
];

View File

@ -8,13 +8,13 @@ import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { throwVbenError, ToolsService } from '@/common'; import { throwVbenError, ToolsService } from '@/common';
import { import {
NapcatDeviceIdentityService,
toNapcatDockerDeviceOptions, toNapcatDockerDeviceOptions,
type NapcatDockerDeviceOptions, type NapcatDockerDeviceOptions,
} from '@/modules/qqbot/napcat'; } from './container/napcat-docker-device-options';
import { QqbotAccount } from '../account/qqbot-account.entity'; import { NapcatDeviceIdentityService } from './device/napcat-device-identity.service';
import { QqbotAccountNapcat } from './qqbot-account-napcat.entity'; import { QqbotAccount } from '../core/account/qqbot-account.entity';
import { QqbotNapcatContainer } from './qqbot-napcat-container.entity'; import { QqbotAccountNapcat } from './infrastructure/persistence/qqbot-account-napcat.entity';
import { QqbotNapcatContainer } from './infrastructure/persistence/qqbot-napcat-container.entity';
import type { import type {
NapcatApiResponse, NapcatApiResponse,
NapcatCredential, NapcatCredential,
@ -22,7 +22,7 @@ import type {
QqbotNapcatRuntime, QqbotNapcatRuntime,
QqbotNapcatRuntimeLoginStatus, QqbotNapcatRuntimeLoginStatus,
QqbotNapcatRuntimeStatusSnapshot, QqbotNapcatRuntimeStatusSnapshot,
} from '../qqbot.types'; } from '../core/contract/qqbot.types';
type NapcatLoginLogState = 'offline' | 'online' | 'unknown'; type NapcatLoginLogState = 'offline' | 'online' | 'unknown';

View File

@ -1,6 +1,6 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { formatKtDateTime, ToolsService } from '@/common'; import { formatKtDateTime, ToolsService } from '@/common';
import type { QqbotIntegrationPlugin } from '@/qqbot/qqbot.types'; import type { QqbotIntegrationPlugin } from '@/modules/qqbot/core/contract/qqbot.types';
import { import {
BANGDREAM_INPUT_SCHEMA, BANGDREAM_INPUT_SCHEMA,
BANGDREAM_OUTPUT_SCHEMA, BANGDREAM_OUTPUT_SCHEMA,

View File

@ -1,6 +1,6 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { formatKtDateTime, ToolsService } from '@/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'; import { QqbotFf14ClientService } from './qqbot-ff14-client.service';
@Injectable() @Injectable()

View File

@ -1,6 +1,6 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { formatKtDateTime, ToolsService } from '@/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'; import { QqbotFflogsClientService } from './qqbot-fflogs-client.service';
@Injectable() @Injectable()

View File

@ -1,14 +1,14 @@
import { Injectable, Logger } from '@nestjs/common'; import { Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { ToolsService } from '@/common'; import { ToolsService } from '@/common';
import { QqbotAccountService } from '@/qqbot/account/qqbot-account.service'; import { QqbotAccountService } from '@/modules/qqbot/core/account/qqbot-account.service';
import type { import type {
QqbotEventPluginDefinition, QqbotEventPluginDefinition,
QqbotEventPluginSummary, QqbotEventPluginSummary,
QqbotNormalizedMessage, QqbotNormalizedMessage,
QqbotRepeaterConversationState, QqbotRepeaterConversationState,
} from '@/qqbot/qqbot.types'; } from '@/modules/qqbot/core/contract/qqbot.types';
import { QqbotSendService } from '@/qqbot/send/qqbot-send.service'; import { QqbotSendService } from '@/modules/qqbot/core/send/qqbot-send.service';
const QQBOT_REPEATER_VERSION = '1.0.0'; const QQBOT_REPEATER_VERSION = '1.0.0';
const QQBOT_REPEATER_PLUGIN_KEY = 'repeater'; const QQBOT_REPEATER_PLUGIN_KEY = 'repeater';

View File

@ -1,12 +1,12 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { formatKtDateTime, throwVbenError } from '@/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 { QqbotRepeaterPluginService } from '@/modules/qqbot/plugins/repeater/qqbot-repeater.plugin';
import type { import type {
QqbotEventPluginDefinition, QqbotEventPluginDefinition,
QqbotPluginHealth, QqbotPluginHealth,
QqbotPluginOperationSummary, QqbotPluginOperationSummary,
} from '../qqbot.types'; } from '@/modules/qqbot/core/contract/qqbot.types';
@Injectable() @Injectable()
export class QqbotEventPluginRegistryService { export class QqbotEventPluginRegistryService {

View File

@ -9,7 +9,7 @@ import type {
QqbotPluginOperationContext, QqbotPluginOperationContext,
QqbotPluginOperationSummary, QqbotPluginOperationSummary,
QqbotPluginSummary, QqbotPluginSummary,
} from '../qqbot.types'; } from '@/modules/qqbot/core/contract/qqbot.types';
@Injectable() @Injectable()
export class QqbotPluginRegistryService implements OnModuleInit { export class QqbotPluginRegistryService implements OnModuleInit {

View File

@ -12,7 +12,7 @@ import { JwtAuthGuard } from '@/modules/admin/identity/auth/jwt-auth.guard';
import { vbenSuccess } from '@/common'; import { vbenSuccess } from '@/common';
import { QqbotEventPluginRegistryService } from './qqbot-event-plugin-registry.service'; import { QqbotEventPluginRegistryService } from './qqbot-event-plugin-registry.service';
import { QqbotPluginRegistryService } from './qqbot-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 - 插件能力') @ApiTags('QQBot - 插件能力')
@Controller('qqbot/plugin') @Controller('qqbot/plugin')

View File

@ -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 {}

View File

@ -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 { QQBOT_CORE_DOMAIN_CONTRACT } from '../../../../src/modules/qqbot/core/qqbot-core.contract';
import { readRefactorV3SqlSchema } from '../../../helpers/sql-schema.helper'; import { readRefactorV3SqlSchema } from '../../../helpers/sql-schema.helper';

View File

@ -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 type { INestApplication } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
@ -19,19 +13,24 @@ import { Test } from '@nestjs/testing';
import * as request from 'supertest'; import * as request from 'supertest';
import { DictService } from '../../../../src/modules/admin/platform-config/dict/dict.service'; import { DictService } from '../../../../src/modules/admin/platform-config/dict/dict.service';
import { ToolsService } from '../../../../src/common'; import { ToolsService } from '../../../../src/common';
import { QqbotAccountService } from '../../../../src/qqbot/account/qqbot-account.service'; import { QqbotAccountService } from '../../../../src/modules/qqbot/core/account/qqbot-account.service';
import { QqbotCommandController } from '../../../../src/qqbot/command/qqbot-command.controller'; import { QqbotCommandController } from '../../../../src/modules/qqbot/core/command/qqbot-command.controller';
import { QqbotCommand } from '../../../../src/qqbot/command/qqbot-command.entity'; import { QqbotCommand } from '../../../../src/modules/qqbot/core/command/qqbot-command.entity';
import { QqbotCommandEngineService } from '../../../../src/qqbot/command/qqbot-command-engine.service'; import { QqbotCommandEngineService } from '../../../../src/modules/qqbot/core/command/qqbot-command-engine.service';
import { QqbotCommandLog } from '../../../../src/qqbot/command/qqbot-command-log.entity'; import { QqbotCommandLog } from '../../../../src/modules/qqbot/core/command/qqbot-command-log.entity';
import { QqbotCommandParserService } from '../../../../src/qqbot/command/qqbot-command-parser.service'; import { QqbotCommandParserService } from '../../../../src/modules/qqbot/core/command/qqbot-command-parser.service';
import { QqbotCommandService } from '../../../../src/qqbot/command/qqbot-command.service'; import { QqbotCommandService } from '../../../../src/modules/qqbot/core/command/qqbot-command.service';
import { QqbotReplyTemplateService } from '../../../../src/qqbot/command/qqbot-reply-template.service'; import { QqbotReplyTemplateService } from '../../../../src/modules/qqbot/core/command/qqbot-reply-template.service';
import { QqbotPluginRegistryService } from '../../../../src/qqbot/plugin/qqbot-plugin-registry.service'; import { QQBOT_CORE_PROVIDERS } from '../../../../src/modules/qqbot/core/qqbot-core.module';
import { QqbotSendService } from '../../../../src/qqbot/send/qqbot-send.service'; import { QqbotSendService } from '../../../../src/modules/qqbot/core/send/qqbot-send.service';
describe('QQBot core command local smoke', () => { describe('QQBot core command local smoke', () => {
let app: INestApplication; 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 = { const command = {
aliases: '["查歌"]', aliases: '["查歌"]',
@ -104,7 +103,7 @@ describe('QQBot core command local smoke', () => {
}, },
}, },
{ {
provide: QqbotPluginRegistryService, provide: qqbotPluginRegistryProvider,
useValue: pluginRegistry, useValue: pluginRegistry,
}, },
{ {

View File

@ -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( jest.mock(
'@/modules/qqbot/plugins/bangDream/application/bangdream-client.service', '@/modules/qqbot/plugins/bangDream/application/bangdream-client.service',
() => ({ () => ({
@ -59,6 +41,8 @@ jest.mock('@/modules/qqbot/plugins/repeater/qqbot-repeater.plugin', () => ({
QqbotRepeaterPluginService: class QqbotRepeaterPluginService {}, QqbotRepeaterPluginService: class QqbotRepeaterPluginService {},
})); }));
import { existsSync } from 'fs';
import { join } from 'path';
import { MODULE_METADATA } from '@nestjs/common/constants'; import { MODULE_METADATA } from '@nestjs/common/constants';
import { ConfigModule } from '@nestjs/config'; import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm'; 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 { AdminAuthGuardModule } from '../../../../src/modules/admin/identity/auth/admin-auth-guard.module';
import { DictModule } from '../../../../src/modules/admin/platform-config/dict/dict.module'; import { DictModule } from '../../../../src/modules/admin/platform-config/dict/dict.module';
import { AppModule } from '../../../../src/app.module'; import { AppModule } from '../../../../src/app.module';
import { QqbotAccountController } from '../../../../src/qqbot/account/qqbot-account.controller'; import { QqbotAccountController } from '../../../../src/modules/qqbot/core/account/qqbot-account.controller';
import { QqbotCommandController } from '../../../../src/qqbot/command/qqbot-command.controller'; import { QqbotCommandController } from '../../../../src/modules/qqbot/core/command/qqbot-command.controller';
import { QqbotDashboardController } from '../../../../src/qqbot/dashboard/qqbot-dashboard.controller'; import { QqbotDashboardController } from '../../../../src/modules/qqbot/core/dashboard/qqbot-dashboard.controller';
import { QqbotMessageController } from '../../../../src/qqbot/message/qqbot-message.controller'; import { QqbotMessageController } from '../../../../src/modules/qqbot/core/message/qqbot-message.controller';
import { QqbotPermissionController } from '../../../../src/qqbot/permission/qqbot-permission.controller'; import { QqbotPermissionController } from '../../../../src/modules/qqbot/core/permission/qqbot-permission.controller';
import { QqbotPluginController } from '../../../../src/qqbot/plugin/qqbot-plugin.controller'; import { QqbotRuleController } from '../../../../src/modules/qqbot/core/rule/qqbot-rule.controller';
import { QqbotModule } from '../../../../src/qqbot/qqbot.module'; import { QqbotSendController } from '../../../../src/modules/qqbot/core/send/qqbot-send.controller';
import { QqbotRuleController } from '../../../../src/qqbot/rule/qqbot-rule.controller';
import { QqbotSendController } from '../../../../src/qqbot/send/qqbot-send.controller';
import { import {
QQBOT_CORE_CONTROLLERS, QQBOT_CORE_CONTROLLERS,
QQBOT_CORE_ENTITIES, QQBOT_CORE_ENTITIES,
@ -157,12 +139,20 @@ describe('QQBot core module contract', () => {
}); });
it('routes QQBot through the core module as the owning Nest boundary', () => { 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.arrayContaining([QqbotCoreModule]),
); );
expect(getModuleMetadata(AppModule, MODULE_METADATA.IMPORTS)).not.toEqual( expect(getNames(appImports)).not.toContain(legacyWrapperName);
expect.arrayContaining([QqbotModule]), expect(existsSync(legacyWrapperPath)).toBe(false);
);
const coreImports = getModuleMetadata( const coreImports = getModuleMetadata(
QqbotCoreModule, QqbotCoreModule,
@ -176,7 +166,7 @@ describe('QQBot core module contract', () => {
(item) => (item as { module?: unknown }).module === TypeOrmModule, (item) => (item as { module?: unknown }).module === TypeOrmModule,
), ),
).toBe(true); ).toBe(true);
expect(coreImports).not.toEqual(expect.arrayContaining([QqbotModule])); expect(getNames(coreImports)).not.toContain(legacyWrapperName);
expect( expect(
getModuleMetadata(QqbotCoreModule, MODULE_METADATA.CONTROLLERS), getModuleMetadata(QqbotCoreModule, MODULE_METADATA.CONTROLLERS),
@ -187,12 +177,6 @@ describe('QQBot core module contract', () => {
expect(getModuleMetadata(QqbotCoreModule, MODULE_METADATA.EXPORTS)).toEqual( expect(getModuleMetadata(QqbotCoreModule, MODULE_METADATA.EXPORTS)).toEqual(
expect.arrayContaining(QQBOT_CORE_EXPORTS), 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', () => { it('makes the legacy QQBot controllers, providers and entities explicit', () => {
@ -203,11 +187,13 @@ describe('QQBot core module contract', () => {
QqbotDashboardController, QqbotDashboardController,
QqbotMessageController, QqbotMessageController,
QqbotPermissionController, QqbotPermissionController,
QqbotPluginController,
QqbotRuleController, QqbotRuleController,
QqbotSendController, QqbotSendController,
]), ]),
); );
expect(getNames(QQBOT_CORE_CONTROLLERS)).toEqual(
expect.arrayContaining(['QqbotPluginController']),
);
expect(getNames(QQBOT_CORE_PROVIDERS)).toEqual( expect(getNames(QQBOT_CORE_PROVIDERS)).toEqual(
expect.arrayContaining([ expect.arrayContaining([
'QqbotAccountService', 'QqbotAccountService',

View File

@ -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 { QQBOT_CORE_DOMAIN_CONTRACT } from '../../../../src/modules/qqbot/core/qqbot-core.contract';
import { readRefactorV3SqlSchema } from '../../../helpers/sql-schema.helper'; import { readRefactorV3SqlSchema } from '../../../helpers/sql-schema.helper';

View File

@ -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 { QQBOT_CORE_DOMAIN_CONTRACT } from '../../../../src/modules/qqbot/core/qqbot-core.contract';
import { readRefactorV3SqlSchema } from '../../../helpers/sql-schema.helper'; import { readRefactorV3SqlSchema } from '../../../helpers/sql-schema.helper';

View File

@ -7,7 +7,7 @@ import {
NAPCAT_RUNTIME_ENTITIES, NAPCAT_RUNTIME_ENTITIES,
toNapcatDockerDeviceOptions, toNapcatDockerDeviceOptions,
} from '../../../../src/modules/qqbot/napcat'; } 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'; import { readRefactorV3SqlSchema } from '../../../helpers/sql-schema.helper';
type EntityClass = new (...args: never[]) => unknown; type EntityClass = new (...args: never[]) => unknown;

View File

@ -27,7 +27,7 @@ import { QqbotFflogsPluginService } from '../../../../src/modules/qqbot/plugins/
import { QqbotEventPluginRegistryService } from '../../../../src/qqbot/plugin/qqbot-event-plugin-registry.service'; import { QqbotEventPluginRegistryService } from '../../../../src/qqbot/plugin/qqbot-event-plugin-registry.service';
import { QqbotPluginController } from '../../../../src/qqbot/plugin/qqbot-plugin.controller'; import { QqbotPluginController } from '../../../../src/qqbot/plugin/qqbot-plugin.controller';
import { QqbotPluginRegistryService } from '../../../../src/qqbot/plugin/qqbot-plugin-registry.service'; 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 = ( const createPlugin = (
key: string, key: string,

View File

@ -12,7 +12,7 @@ jest.mock('@/modules/qqbot/plugins/fflogs/qqbot-fflogs.plugin', () => ({
})); }));
import { QqbotPluginRegistryService } from '../../../../src/qqbot/plugin/qqbot-plugin-registry.service'; 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) => const asPluginService = (plugin: QqbotIntegrationPlugin) =>
({ ({

View File

@ -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 {}, QqbotAccountService: class {},
})); }));
jest.mock('@/qqbot/account/qqbot-napcat-login.service', () => ({ jest.mock('@/modules/qqbot/napcat/login/qqbot-napcat-login.service', () => ({
QqbotNapcatLoginService: class {}, QqbotNapcatLoginService: class {},
})); }));
jest.mock('@/qqbot/connection/qqbot-reverse-ws.service', () => ({ jest.mock('@/modules/qqbot/core/connection/qqbot-reverse-ws.service', () => ({
QqbotReverseWsService: class {}, QqbotReverseWsService: class {},
})); }));
import * as request from 'supertest'; import * as request from 'supertest';
import { Test } from '@nestjs/testing'; import { Test } from '@nestjs/testing';
import type { INestApplication } from '@nestjs/common'; import type { INestApplication } from '@nestjs/common';
import { QqbotAccountController } from '@/qqbot/account/qqbot-account.controller'; import { QqbotAccountController } from '@/modules/qqbot/core/account/qqbot-account.controller';
import { QqbotAccountService } from '@/qqbot/account/qqbot-account.service'; import { QqbotAccountService } from '@/modules/qqbot/core/account/qqbot-account.service';
import { QqbotNapcatLoginService } from '@/qqbot/account/qqbot-napcat-login.service'; import { QqbotNapcatLoginService } from '@/modules/qqbot/napcat/login/qqbot-napcat-login.service';
import { QqbotReverseWsService } from '@/qqbot/connection/qqbot-reverse-ws.service'; import { QqbotReverseWsService } from '@/modules/qqbot/core/connection/qqbot-reverse-ws.service';
describe('QqbotAccountController', () => { describe('QqbotAccountController', () => {
let app: INestApplication; let app: INestApplication;

View File

@ -1,5 +1,5 @@
import { ToolsService } from '@/common'; import { ToolsService } from '@/common';
import { QqbotAccountService } from '@/qqbot/account/qqbot-account.service'; import { QqbotAccountService } from '@/modules/qqbot/core/account/qqbot-account.service';
describe('QqbotAccountService', () => { describe('QqbotAccountService', () => {
it('stores NapCat login password as encrypted secret and never persists the transport field', async () => { it('stores NapCat login password as encrypted secret and never persists the transport field', async () => {

View File

@ -13,9 +13,9 @@ jest.mock('@/common', () => {
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { ToolsService } from '@/common'; import { ToolsService } from '@/common';
import { QqbotAccountService } from '@/qqbot/account/qqbot-account.service'; import { QqbotAccountService } from '@/modules/qqbot/core/account/qqbot-account.service';
import { QqbotNapcatLoginService } from '@/qqbot/account/qqbot-napcat-login.service'; import { QqbotNapcatLoginService } from '@/modules/qqbot/napcat/login/qqbot-napcat-login.service';
import { QqbotNapcatContainerService } from '@/qqbot/napcat/qqbot-napcat-container.service'; import { QqbotNapcatContainerService } from '@/modules/qqbot/napcat/qqbot-napcat-container.service';
describe('QqbotNapcatLoginService', () => { describe('QqbotNapcatLoginService', () => {
const toolsService = new ToolsService(); const toolsService = new ToolsService();

View File

@ -1,5 +1,5 @@
import { ConfigService } from '@nestjs/config'; 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( function buildService(
configValues: Record<string, string | undefined>, configValues: Record<string, string | undefined>,

View File

@ -27,8 +27,8 @@ jest.mock(
); );
import { DictService } from '@/modules/admin/platform-config/dict/dict.service'; import { DictService } from '@/modules/admin/platform-config/dict/dict.service';
import type { QqbotCommand } from '@/qqbot/command/qqbot-command.entity'; import type { QqbotCommand } from '@/modules/qqbot/core/command/qqbot-command.entity';
import { QqbotCommandParserService } from '@/qqbot/command/qqbot-command-parser.service'; import { QqbotCommandParserService } from '@/modules/qqbot/core/command/qqbot-command-parser.service';
describe('QqbotCommandParserService FFLogs parser', () => { describe('QqbotCommandParserService FFLogs parser', () => {
const command = { const command = {

View File

@ -1,10 +1,10 @@
jest.mock('@/qqbot/event/qqbot-event.service', () => ({ jest.mock('@/modules/qqbot/core/event/qqbot-event.service', () => ({
QqbotEventService: class {}, QqbotEventService: class {},
})); }));
import { EventEmitter } from 'events'; import { EventEmitter } from 'events';
import { ToolsService } from '@/common'; 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 { class FakeWebSocket extends EventEmitter {
closed: Array<{ code?: number; reason?: string }> = []; closed: Array<{ code?: number; reason?: string }> = [];

View File

@ -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 {}, QqbotRuleEngineService: class QqbotRuleEngineService {},
})); }));
import { QqbotEventService } from '@/qqbot/event/qqbot-event.service'; import { QqbotEventService } from '@/modules/qqbot/core/event/qqbot-event.service';
describe('QqbotEventService', () => { describe('QqbotEventService', () => {
it('marks account offline with reason when NapCat reports kicked offline notice', async () => { it('marks account offline with reason when NapCat reports kicked offline notice', async () => {

View File

@ -1,5 +1,5 @@
import { ToolsService } from '@/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 captcha logs', () => { describe('QqbotNapcatContainerService captcha logs', () => {
it('extracts captcha url from recent runtime logs', async () => { it('extracts captcha url from recent runtime logs', async () => {

View File

@ -9,7 +9,7 @@ jest.mock('@/common', () => {
}); });
import { ToolsService } from '@/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', () => { describe('QqbotNapcatContainerService runtime status', () => {
const createService = (repository: { const createService = (repository: {

View File

@ -13,7 +13,7 @@ jest.mock('@/common', () => {
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { ToolsService } from '@/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', () => { describe('QqbotNapcatContainerService', () => {
it('removes previous account containers when binding a new primary container', async () => { it('removes previous account containers when binding a new primary container', async () => {

View File

@ -1,6 +1,6 @@
import { ToolsService } from '@/common'; import { ToolsService } from '@/common';
import { QqbotRepeaterPluginService } from '@/modules/qqbot/plugins/repeater/qqbot-repeater.plugin'; 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 { function createMessage(text: string): QqbotNormalizedMessage {
return { return {

View File

@ -2,7 +2,7 @@ import { formatKtDateTime, KtDateTime, KtDateTimeColumn } from '@/common';
import { import {
getEffectiveCooldownMs, getEffectiveCooldownMs,
isWithinCooldown, isWithinCooldown,
} from '@/qqbot/qqbot-cooldown.policy'; } from '@/modules/qqbot/core/domain/qqbot-cooldown.policy';
class CooldownEntityFixture { class CooldownEntityFixture {
@KtDateTimeColumn() @KtDateTimeColumn()

View File

@ -1,5 +1,5 @@
import { ToolsService } from '@/common'; 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>) { function createService(config: Record<string, number | string | undefined>) {
return new (QqbotRuleService as any)( return new (QqbotRuleService as any)(

View File

@ -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>) { function createService(config: Record<string, number | string | undefined>) {
return new QqbotRateLimitService({ return new QqbotRateLimitService({

View File

@ -1,5 +1,5 @@
import { ToolsService } from '@/common'; import { ToolsService } from '@/common';
import { QqbotSendService } from '@/qqbot/send/qqbot-send.service'; import { QqbotSendService } from '@/modules/qqbot/core/send/qqbot-send.service';
describe('QqbotSendService', () => { describe('QqbotSendService', () => {
it('stores summarized CQ image payloads while sending the original message', async () => { it('stores summarized CQ image payloads while sending the original message', async () => {