Browse Source

fix accepting group member's friend request

Mike L 3 years ago
parent
commit
e49c0763dc
2 changed files with 50 additions and 8 deletions
  1. 25 4
      dist/koishi.js
  2. 25 4
      src/koishi.ts

+ 25 - 4
dist/koishi.js

@@ -14,6 +14,7 @@ const koishi_1 = require("koishi");
 require("koishi-adapter-onebot");
 const command_1 = require("./command");
 const loggers_1 = require("./loggers");
+const utils_1 = require("./utils");
 const logger = loggers_1.getLogger('qqbot');
 const cqUrlFix = (factory) => (...args) => factory(...args).replace(/(?<=\[CQ:.*)url=(?=(base64|file|https?):\/\/)/, 'file=');
 exports.Message = {
@@ -33,6 +34,7 @@ exports.Message = {
 class default_1 {
     constructor(opt) {
         this.messageQueues = {};
+        this.tempSenders = {};
         this.next = (type, id) => {
             const queue = this.messageQueues[`${type}:${id}`];
             if (queue && queue.length) {
@@ -60,6 +62,7 @@ class default_1 {
                     if (session.sender.groupId) {
                         const friendList = yield session.bot.getFriendList();
                         if (!friendList.some(friendItem => friendItem.userId === session.userId)) {
+                            this.tempSenders[session.userId] = session.sender.groupId;
                             return {
                                 chatID: {
                                     qq: Number(session.userId),
@@ -119,15 +122,33 @@ class default_1 {
             });
             this.app.on('friend-request', (session) => __awaiter(this, void 0, void 0, function* () {
                 const userString = `${session.username}(${session.userId})`;
-                const groupString = `${session.groupName}(${session.groupId})`;
+                let groupId;
+                let groupString;
+                if (session.username in this.tempSenders)
+                    groupId = this.tempSenders[session.userId].toString();
                 logger.debug(`detected new friend request event: ${userString}`);
                 return session.bot.getGroupList().then(groupList => {
-                    if (groupList.some(groupItem => groupItem.groupId === session.groupId)) {
+                    if (groupList.some(groupItem => {
+                        const test = groupItem.groupId === groupId;
+                        if (test)
+                            groupString = `${groupItem.groupName}(${groupId})`;
+                        return test;
+                    })) {
                         session.bot.handleFriendRequest(session.messageId, true);
                         return logger.info(`accepted friend request from ${userString} (from group ${groupString})`);
                     }
-                    logger.warn(`received friend request from ${userString} (from group ${groupString})`);
-                    logger.warn('please manually accept this friend request');
+                    utils_1.chainPromises(groupList.map(groupItem => (done) => Promise.resolve(done ||
+                        this.bot.getGroupMember(groupItem.groupId, session.userId).then(() => {
+                            groupString = `${groupItem.groupName}(${groupItem.groupId})`;
+                            session.bot.handleFriendRequest(session.messageId, true);
+                            logger.info(`accepted friend request from ${userString} (found in group ${groupString})`);
+                            return true;
+                        }).catch(() => false)))).then(done => {
+                        if (done)
+                            return;
+                        logger.warn(`received friend request from ${userString} (stranger)`);
+                        logger.warn('please manually accept this friend request');
+                    });
                 });
             }));
             this.app.on('group-request', (session) => __awaiter(this, void 0, void 0, function* () {

+ 25 - 4
src/koishi.ts

@@ -4,6 +4,7 @@ import { Message as CQMessage, SenderInfo } from 'koishi-adapter-onebot';
 
 import { parseCmd, query, view } from './command';
 import { getLogger } from './loggers';
+import { chainPromises } from './utils';
 
 const logger = getLogger('qqbot');
 
@@ -45,6 +46,7 @@ export default class {
   public bot: Bot;
 
   private messageQueues: {[key: string]: (() => Promise<void>)[]} = {};
+  private tempSenders: {[key: number]: number} = {};
 
   private next = (type: 'private' | 'group', id: string) => {
     const queue = this.messageQueues[`${type}:${id}`];
@@ -71,6 +73,7 @@ export default class {
         if (session.sender.groupId) { // temp message
           const friendList = await session.bot.getFriendList();
           if (!friendList.some(friendItem => friendItem.userId === session.userId)) {
+            this.tempSenders[session.userId] = session.sender.groupId;
             return {
               chatID: {
                 qq: Number(session.userId),
@@ -137,15 +140,33 @@ export default class {
 
     this.app.on('friend-request', async session => {
       const userString = `${session.username}(${session.userId})`;
-      const groupString = `${session.groupName}(${session.groupId})`;
+      let groupId: string;
+      let groupString: string;
+      if (session.username in this.tempSenders) groupId = this.tempSenders[session.userId as unknown as number].toString();
       logger.debug(`detected new friend request event: ${userString}`);
       return session.bot.getGroupList().then(groupList => {
-        if (groupList.some(groupItem => groupItem.groupId === session.groupId)) {
+        if (groupList.some(groupItem => {
+          const test = groupItem.groupId === groupId;
+          if (test) groupString = `${groupItem.groupName}(${groupId})`;
+          return test;
+        })) {
           session.bot.handleFriendRequest(session.messageId, true);
           return logger.info(`accepted friend request from ${userString} (from group ${groupString})`);
         }
-        logger.warn(`received friend request from ${userString} (from group ${groupString})`);
-        logger.warn('please manually accept this friend request');
+        chainPromises(groupList.map(groupItem =>
+          (done: boolean) => Promise.resolve(done ||
+            this.bot.getGroupMember(groupItem.groupId, session.userId).then(() => {
+              groupString = `${groupItem.groupName}(${groupItem.groupId})`;
+              session.bot.handleFriendRequest(session.messageId, true);
+              logger.info(`accepted friend request from ${userString} (found in group ${groupString})`);
+              return true;
+            }).catch(() => false)
+          )
+        )).then(done => {
+          if (done) return;
+          logger.warn(`received friend request from ${userString} (stranger)`);
+          logger.warn('please manually accept this friend request');
+        });
       });
     });