68 lines
2.1 KiB
TypeScript
Raw Normal View History

2023-05-05 21:27:40 +08:00
// messageHandler.ts
import * as vscode from 'vscode';
import '../command/loadCommands';
2023-05-16 14:35:01 +08:00
import '../context/loadContexts';
2023-05-09 10:34:33 +08:00
import { logger } from '../util/logger';
import { on } from 'events';
import { isWaitForApiKey, onApiKey } from './historyMessages';
import { checkOpenaiApiKey } from '../contributes/commands';
2023-05-05 21:27:40 +08:00
2023-05-09 10:34:33 +08:00
export class MessageHandler {
2023-05-16 14:35:01 +08:00
private handlers: { [command: string]: (message: any, panel: vscode.WebviewPanel|vscode.WebviewView) => Promise<void> } = {};
2023-05-05 21:27:40 +08:00
constructor() {
}
2023-05-16 14:35:01 +08:00
registerHandler(command: string, handler: (message: any, panel: vscode.WebviewPanel|vscode.WebviewView) => Promise<void>): void {
2023-05-05 21:27:40 +08:00
this.handlers[command] = handler;
}
2023-05-16 14:35:01 +08:00
async handleMessage(message: any, panel: vscode.WebviewPanel|vscode.WebviewView): Promise<void> {
2023-05-10 17:56:56 +08:00
let isNeedSendResponse = false;
if (message.command === 'sendMessage') {
try {
const messageText = message.text;
const messageObject = JSON.parse(messageText);
2023-05-16 14:35:01 +08:00
if (messageObject && messageObject.user && messageObject.user === 'merico-devchat') {
2023-05-10 17:56:56 +08:00
message = messageObject;
isNeedSendResponse = true;
}
} catch (e) {
}
}
if (message.command === 'sendMessage') {
if (await isWaitForApiKey() && !await checkOpenaiApiKey()) {
onApiKey(message.text, panel);
return;
}
}
2023-05-10 17:56:56 +08:00
2023-05-05 21:27:40 +08:00
const handler = this.handlers[message.command];
if (handler) {
2023-05-09 10:34:33 +08:00
logger.channel()?.info(`Handling command "${message.command}"`);
2023-05-05 21:27:40 +08:00
await handler(message, panel);
2023-05-09 10:34:33 +08:00
logger.channel()?.info(`Handling command "${message.command}" done`);
2023-05-05 21:27:40 +08:00
} else {
2023-05-09 10:34:33 +08:00
logger.channel()?.error(`No handler found for command "${message.command}"`);
logger.channel()?.show();
2023-05-05 21:27:40 +08:00
}
2023-05-10 17:56:56 +08:00
if (isNeedSendResponse) {
MessageHandler.sendMessage(panel, { command: 'receiveMessage', text: 'finish', hash: '', user: '', date: 1, isError: false });
}
2023-05-05 21:27:40 +08:00
}
2023-05-16 14:35:01 +08:00
public static sendMessage(panel: vscode.WebviewPanel|vscode.WebviewView, message: object, log: boolean = true): void {
2023-05-09 10:34:33 +08:00
if (log) {
logger.channel()?.info(`Sending message "${JSON.stringify(message)}"`);
}
panel.webview.postMessage(message);
2023-05-05 21:27:40 +08:00
}
}
export const messageHandler = new MessageHandler();
export default messageHandler.handleMessage.bind(messageHandler);