| 4692 | |
| 4693 | class ImageFeature extends BaseFeatureHandler { |
| 4694 | readonly name = "图片生成"; |
| 4695 | readonly command = "image"; |
| 4696 | readonly description = "生成图片"; |
| 4697 | |
| 4698 | private aiService: AIService; |
| 4699 | private messageUtils: MessageUtils; |
| 4700 | private httpClient: HttpClient; |
| 4701 | |
| 4702 | constructor( |
| 4703 | aiService: AIService, |
| 4704 | configManagerPromise: Promise<ConfigManager>, |
| 4705 | httpClient: HttpClient, |
| 4706 | ) { |
| 4707 | super(configManagerPromise); |
| 4708 | this.aiService = aiService; |
| 4709 | this.messageUtils = new MessageUtils(configManagerPromise, httpClient); |
| 4710 | this.httpClient = httpClient; |
| 4711 | } |
| 4712 | |
| 4713 | async execute( |
| 4714 | msg: Api.Message, |
| 4715 | args: string[], |
| 4716 | _prefixes: string[], |
| 4717 | ): Promise<void> { |
| 4718 | const prefixes = getPrefixes(); |
| 4719 | const configManager = await this.getConfigManager(); |
| 4720 | const config = configManager.getConfig(); |
| 4721 | const replyMsg = await safeGetReplyMessage(msg); |
| 4722 | const replyToId = replyMsg?.id; |
| 4723 | |
| 4724 | const subCommand = args[1]?.toLowerCase(); |
| 4725 | if (subCommand === "preview") { |
| 4726 | const state = args[2]?.toLowerCase(); |
| 4727 | if (!state) { |
| 4728 | await this.editMessage( |
| 4729 | msg, |
| 4730 | `🖼️ <b>图片预览状态:</b>\n\n📄 当前状态: ${config.imagePreview ? "开启" : "关闭"}`, |
| 4731 | ); |
| 4732 | return; |
| 4733 | } |
| 4734 | requireUser(state === "on" || state === "off", "参数必须是 on 或 off"); |
| 4735 | await configManager.updateConfig((cfg) => { |
| 4736 | cfg.imagePreview = state === "on"; |
| 4737 | }); |
| 4738 | await this.editMessage( |
| 4739 | msg, |
| 4740 | `✅ 图片预览已${state === "on" ? "开启" : "关闭"}`, |
| 4741 | ); |
| 4742 | return; |
| 4743 | } |
| 4744 | |
| 4745 | const promptInput = args.slice(1).join(" ").trim(); |
| 4746 | const replyText = getMessageText(replyMsg).trim(); |
| 4747 | const replyImageParts = await getMessageImageParts(replyMsg); |
| 4748 | const messageImageParts = await getMessageImageParts(msg); |
| 4749 | const imageParts = [...replyImageParts, ...messageImageParts]; |
| 4750 | |
| 4751 | const hasPrompt = !!promptInput || !!replyText; |
nothing calls this directly
no outgoing calls
no test coverage detected