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 |
|
| 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 |
|
||||||
|
|||||||
@ -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'], {
|
||||||
@ -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 - 账号连接')
|
||||||
@ -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' })
|
||||||
@ -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 {
|
||||||
@ -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 =
|
||||||
@ -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';
|
||||||
@ -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 {
|
||||||
@ -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 {
|
||||||
@ -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()
|
||||||
@ -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 {
|
||||||
@ -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';
|
||||||
|
|
||||||
@ -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',
|
||||||
@ -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';
|
||||||
@ -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';
|
||||||
|
|
||||||
@ -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,
|
||||||
@ -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,
|
||||||
@ -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'])
|
||||||
@ -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 })
|
||||||
@ -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'])
|
||||||
@ -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 {
|
||||||
@ -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 {
|
||||||
@ -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 {
|
||||||
@ -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 {
|
||||||
@ -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 })
|
||||||
@ -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 {
|
||||||
@ -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';
|
||||||
|
|
||||||
|
|||||||
@ -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';
|
||||||
@ -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()
|
||||||
@ -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 {
|
||||||
@ -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 {
|
||||||
@ -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'])
|
||||||
@ -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()
|
||||||
@ -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 {
|
||||||
@ -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';
|
||||||
|
|||||||
@ -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'])
|
||||||
@ -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 })
|
||||||
@ -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 {
|
||||||
@ -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;
|
||||||
@ -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,
|
||||||
|
];
|
||||||
|
|||||||
@ -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';
|
||||||
|
|
||||||
@ -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,
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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';
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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')
|
||||||
|
|||||||
@ -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 { 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';
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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',
|
||||||
|
|||||||
@ -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';
|
||||||
|
|
||||||
|
|||||||
@ -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';
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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) =>
|
||||||
({
|
({
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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 () => {
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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>,
|
||||||
|
|||||||
@ -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 = {
|
||||||
|
|||||||
@ -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 }> = [];
|
||||||
|
|||||||
@ -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 () => {
|
||||||
|
|||||||
@ -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 () => {
|
||||||
|
|||||||
@ -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: {
|
||||||
|
|||||||
@ -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 () => {
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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)(
|
||||||
|
|||||||
@ -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({
|
||||||
|
|||||||
@ -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 () => {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user