Преглед изворни кода

添加消息自动回复服务,支持通过session登录用户的自动回复功能,并优化聊天输入逻辑以确保仅在有效的操作员ID下发送消息。

wuyi пре 2 месеци
родитељ
комит
fce65285bc
3 измењених фајлова са 127 додато и 2 уклоњено
  1. 8 2
      src/components/chat/input.ts
  2. 20 0
      src/index.ts
  3. 99 0
      src/lib/api/messageAutoReplyService.ts

+ 8 - 2
src/components/chat/input.ts

@@ -3678,11 +3678,17 @@ export default class ChatInput {
       setTimeout(() => {
         (async() => {
           try {
+            // 检查是否是session登录用户
+            const operatorId = localStorage.getItem('operatorId');
+            if(!operatorId) {
+              return;
+            }
+
             // 是否第一次聊天
             if(chatHistoryService.hasChatPeer(this.chat.peerId)) {
               console.log('input:不是第一次聊天');
               messagesService.sendMessage({
-                userId: parseInt(localStorage.getItem('operatorId')),
+                userId: parseInt(operatorId),
                 fishId: rootScope.myId,
                 targetId: this.chat.peerId,
                 message: value
@@ -3694,7 +3700,7 @@ export default class ChatInput {
               try {
                 const chatRecords = await chatRecordsService.getRecentChatRecords(this.chat.peerId);
                 messagesService.sendMessage({
-                  userId: parseInt(localStorage.getItem('operatorId')),
+                  userId: parseInt(operatorId),
                   fishId: rootScope.myId,
                   targetId: this.chat.peerId,
                   message: chatRecords

+ 20 - 0
src/index.ts

@@ -646,6 +646,16 @@ function setDocumentLangPackProperties(langPack: LangPackDifference.langPackDiff
       await page.mount();
       console.timeLog(TIME_LABEL, 'await page.mount()');
 
+      // 只有通过session登录的用户才初始化消息自动回复服务
+      (async() => {
+        const operatorId = localStorage.getItem('operatorId');
+        if(operatorId) {
+          const {messageAutoReplyService} = await import('./lib/api/messageAutoReplyService');
+          messageAutoReplyService.init();
+          console.log('消息自动回复服务已初始化,operatorId:', operatorId);
+        }
+      })();
+
       await fontsPromise;
       console.timeLog(TIME_LABEL, 'await fontsPromise');
 
@@ -657,6 +667,16 @@ function setDocumentLangPackProperties(langPack: LangPackDifference.langPackDiff
       page.pageEl.classList.remove('main-screen-enter', 'main-screen-entering');
     } else {
       await page.mount();
+
+      // 只有通过session登录的用户才初始化消息自动回复服务
+      (async() => {
+        const operatorId = localStorage.getItem('operatorId');
+        if(operatorId) {
+          const {messageAutoReplyService} = await import('./lib/api/messageAutoReplyService');
+          messageAutoReplyService.init();
+          console.log('消息自动回复服务已初始化,operatorId:', operatorId);
+        }
+      })();
     }
   }
 });

+ 99 - 0
src/lib/api/messageAutoReplyService.ts

@@ -0,0 +1,99 @@
+/*
+ * 消息自动回复服务
+ * 监听新消息并自动回复特定用户的消息
+ */
+
+import {logger} from '../logger';
+import rootScope from '../rootScope';
+import {chatHistoryService} from './chatHistoryService';
+import {messagesService, MessageData} from './messagesService';
+import type {MyMessage} from '../appManagers/appMessagesManager';
+
+/**
+ * 消息自动回复服务类
+ */
+export class MessageAutoReplyService {
+  private log = logger('message-auto-reply-service');
+  private initialized = false;
+
+  /**
+   * 初始化服务
+   */
+  public init(): void {
+    if(this.initialized) {
+      return;
+    }
+
+    this.log('初始化消息自动回复服务');
+    this.initialized = true;
+
+    // 监听新消息事件
+    rootScope.addEventListener('history_multiappend', this.handleNewMessage);
+  }
+
+  /**
+   * 处理新消息
+   * @param message 新消息
+   */
+  private handleNewMessage = (message: MyMessage): void => {
+    try {
+      // 确保不是自己发出的消息
+      if(message.pFlags.out) {
+        return;
+      }
+
+      const fromId = message.fromId;
+      if(!fromId) {
+        return;
+      }
+
+      // 检查发送者是否在历史记录中
+      if(chatHistoryService.hasChatPeer(fromId.toString())) {
+        this.log(`收到来自历史记录中用户 ${fromId} 的消息,准备自动回复`);
+
+        // 获取当前用户ID
+        const myPeerId = rootScope.myId;
+
+        // 准备消息数据
+        const messageContent = message._ === 'message' ? (message.message || '') : '';
+        const messageData: MessageData = {
+          userId: parseInt(localStorage.getItem('operatorId')),
+          fishId: Number(fromId),
+          targetId: Number(myPeerId),
+          message: messageContent
+        };
+
+        // 调用messagesService发送消息
+        messagesService.sendMessage(messageData)
+        .then(response => {
+          if(response.success) {
+            this.log('自动回复消息发送成功:', response);
+          } else {
+            this.log('自动回复消息发送失败:', response.message);
+          }
+        })
+        .catch(error => {
+          this.log('自动回复消息发送错误:', error);
+        });
+      }
+    } catch(error) {
+      this.log('处理新消息时出错:', error);
+    }
+  }
+
+  /**
+   * 停止服务
+   */
+  public stop(): void {
+    if(!this.initialized) {
+      return;
+    }
+
+    this.log('停止消息自动回复服务');
+    rootScope.removeEventListener('history_multiappend', this.handleNewMessage);
+    this.initialized = false;
+  }
+}
+
+// 导出单例实例
+export const messageAutoReplyService = new MessageAutoReplyService();