Prechádzať zdrojové kódy

rework on message handling, fix temp chat

Mike L 2 rokov pred
rodič
commit
b8cce8b935
2 zmenil súbory, kde vykonal 80 pridanie a 74 odobranie
  1. 42 38
      dist/koishi.js
  2. 38 36
      src/koishi.ts

+ 42 - 38
dist/koishi.js

@@ -14,7 +14,6 @@ const koishi_1 = require("koishi");
 const plugin_adapter_onebot_1 = require("@koishijs/plugin-adapter-onebot");
 const command_1 = require("./command");
 const loggers_1 = require("./loggers");
-const utils_1 = require("./utils");
 const logger = (0, loggers_1.getLogger)('qqbot');
 exports.Message = {
     Image: koishi_1.segment.image,
@@ -137,56 +136,61 @@ class default_1 {
             this.app.plugin(plugin_adapter_onebot_1.default, this.config);
             this.app.on('friend-request', (session) => __awaiter(this, void 0, void 0, function* () {
                 const userString = `${session.username}(${session.userId})`;
-                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.getGuildList().then(groupList => {
-                    if (groupList.some(({ guildName, guildId }) => {
-                        const test = guildId.toString() === groupId;
-                        if (test)
-                            groupString = `${guildName}(${guildId})`;
-                        return test;
-                    })) {
-                        return session.bot.handleFriendRequest(session.messageId, true)
-                            .then(() => { logger.info(`accepted friend request from ${userString} (from group ${groupString})`); })
-                            .catch(error => { logger.error(`error accepting friend request from ${userString}, error: ${error}`); });
+                try {
+                    const isTemp = session.username in this.tempSenders;
+                    const { guildId, guildName } = isTemp ?
+                        yield session.bot.getGuild(this.tempSenders[session.userId].toString()) :
+                        (yield session.bot.getGuildList()).find(({ guildId }) => __awaiter(this, void 0, void 0, function* () {
+                            try {
+                                return yield this.bot.getGuildMember(guildId, session.userId);
+                            }
+                            catch (_b) { }
+                        }));
+                    try {
+                        const groupString = `${guildName}(${guildId})`;
+                        yield session.bot.handleFriendRequest(session.messageId, true);
+                        logger.info(`accepted friend request from ${userString} (${isTemp ? 'from' : 'found in'} group ${groupString})`);
                     }
-                    (0, utils_1.chainPromises)(groupList.map(groupItem => (done) => Promise.resolve(done ||
-                        this.bot.getGuildMember(groupItem.guildId, session.userId).then(() => {
-                            groupString = `${groupItem.guildName}(${groupItem.guildName})`;
-                            return session.bot.handleFriendRequest(session.messageId, true)
-                                .then(() => { logger.info(`accepted friend request from ${userString} (found in group ${groupString})`); })
-                                .catch(error => { logger.error(`error accepting friend request from ${userString}, error: ${error}`); })
-                                .then(() => true);
-                        }).catch(() => false)))).then(done => {
-                        if (done)
-                            return;
-                        logger.warn(`received friend request from ${userString} (stranger)`);
-                        logger.warn('please manually accept this friend request');
-                    });
-                });
+                    catch (error) {
+                        logger.error(`error accepting friend request from ${userString}, error: ${error}`);
+                    }
+                }
+                catch (_a) {
+                    logger.warn(`received friend request from ${userString} (stranger)`);
+                    logger.warn('please manually accept this friend request');
+                }
             }));
             this.app.on('guild-request', (session) => __awaiter(this, void 0, void 0, function* () {
                 const userString = `${session.username}(${session.userId})`;
                 const groupString = `${session.guildName}(${session.guildId})`;
                 logger.debug(`detected group invitation event: ${groupString}}`);
-                return session.bot.getFriendList().then(friendList => {
-                    if (friendList.some(friendItem => friendItem.userId = session.userId)) {
-                        return session.bot.handleGuildRequest(session.messageId, true)
-                            .then(() => { logger.info(`accepted group invitation from ${userString} (friend)`); })
-                            .catch(error => { logger.error(`error accepting group invitation from ${userString}, error: ${error}`); });
+                const friendList = yield session.bot.getFriendList();
+                if (friendList.some(friendItem => friendItem.userId = session.userId)) {
+                    try {
+                        session.bot.handleGuildRequest(session.messageId, true);
+                        logger.info(`accepted group invitation from ${userString} (friend)`);
                     }
-                    logger.warn(`received group invitation from ${userString} (stranger)`);
-                    logger.warn('please manually accept this group invitation');
-                });
+                    catch (error) {
+                        logger.error(`error accepting group invitation from ${userString}, error: ${error}`);
+                    }
+                }
+                logger.warn(`received group invitation from ${userString} (stranger)`);
+                logger.warn('please manually accept this group invitation');
             }));
             this.app.middleware((session) => __awaiter(this, void 0, void 0, function* () {
                 const chat = yield this.getChat(session);
+                let userString = `${session.username}(${session.userId})`;
+                if (chat.chatType === 'temp') {
+                    const group = yield session.bot.getGuild(chat.chatID.group.toString());
+                    userString += ` (from group ${group.guildName}(${group.guildId}))`;
+                }
                 const cmdObj = (0, command_1.parseCmd)(session.content);
                 const reply = (msg) => this.getSender(chat)(msg).catch(error => {
-                    logger.error(`error replying to message from ${session.username}(${session.userId}), error: ${error}`);
+                    if (chat.chatType === 'temp') {
+                        return logger.info(`ignored error while replying to ${userString}`);
+                    }
+                    logger.error(`error replying to message from ${userString}, error: ${error}`);
                 });
                 switch (cmdObj.cmd) {
                     case 'twi_view':

+ 38 - 36
src/koishi.ts

@@ -3,7 +3,6 @@ import onebot, { WsClient, OneBotBot, CQCode } from '@koishijs/plugin-adapter-on
 
 import { parseCmd, query, view, resendLast } from './command';
 import { getLogger } from './loggers';
-import { chainPromises } from './utils';
 
 const logger = getLogger('qqbot');
 
@@ -53,7 +52,7 @@ export default class {
   public bot: OneBotBot;
 
   private messageQueues: {[key: string]: (() => Promise<void>)[]} = {};
-  private tempSenders: {[key: number]: number} = {};
+  private tempSenders: {[key: number | string]: number} = {};
 
   private get config(): onebot.Config & WsClient.Config {
     return {
@@ -162,58 +161,61 @@ export default class {
 
     this.app.on('friend-request', async session => {
       const userString = `${session.username}(${session.userId})`;
-      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.getGuildList().then(groupList => {
-        if (groupList.some(({guildName, guildId}) => {
-          const test = guildId.toString() === groupId;
-          if (test) groupString = `${guildName}(${guildId})`;
-          return test;
-        })) {
-          return session.bot.handleFriendRequest(session.messageId, true)
-            .then(() => { logger.info(`accepted friend request from ${userString} (from group ${groupString})`); })
-            .catch(error => { logger.error(`error accepting friend request from ${userString}, error: ${error}`); });
+      try {
+        const isTemp = session.username in this.tempSenders;
+        const {guildId, guildName} = isTemp ?
+          await session.bot.getGuild(this.tempSenders[session.userId].toString()) :
+            (await session.bot.getGuildList()).find(async ({guildId}) => {
+              try {
+                return await this.bot.getGuildMember(guildId, session.userId);
+              } catch {}
+            });
+        try {
+          const groupString = `${guildName}(${guildId})`;
+          await session.bot.handleFriendRequest(session.messageId, true);
+          logger.info(`accepted friend request from ${userString} (${
+            isTemp ? 'from' : 'found in'
+          } group ${groupString})`);
+        } catch (error) {
+          logger.error(`error accepting friend request from ${userString}, error: ${error}`);
         }
-        chainPromises(groupList.map(groupItem =>
-          (done: boolean) => Promise.resolve(done ||
-            this.bot.getGuildMember(groupItem.guildId, session.userId).then(() => {
-              groupString = `${groupItem.guildName}(${groupItem.guildName})`;
-              return session.bot.handleFriendRequest(session.messageId, true)
-                .then(() => { logger.info(`accepted friend request from ${userString} (found in group ${groupString})`); })
-                .catch(error => { logger.error(`error accepting friend request from ${userString}, error: ${error}`); })
-                .then(() => true);
-            }).catch(() => false)
-          )
-        )).then(done => {
-          if (done) return;
-          logger.warn(`received friend request from ${userString} (stranger)`);
-          logger.warn('please manually accept this friend request');
-        });
-      });
+      } catch {
+        logger.warn(`received friend request from ${userString} (stranger)`);
+        logger.warn('please manually accept this friend request');
+      }
     });
 
     this.app.on('guild-request', async session => {
       const userString = `${session.username}(${session.userId})`;
       const groupString = `${session.guildName}(${session.guildId})`;
       logger.debug(`detected group invitation event: ${groupString}}`);
-      return session.bot.getFriendList().then(friendList => {
+      const friendList = await session.bot.getFriendList();
         if (friendList.some(friendItem => friendItem.userId = session.userId)) {
-          return session.bot.handleGuildRequest(session.messageId, true)
-            .then(() => { logger.info(`accepted group invitation from ${userString} (friend)`); })
-            .catch(error => { logger.error(`error accepting group invitation from ${userString}, error: ${error}`); });
+          try {
+            session.bot.handleGuildRequest(session.messageId, true);
+            logger.info(`accepted group invitation from ${userString} (friend)`);
+          } catch (error) {
+            logger.error(`error accepting group invitation from ${userString}, error: ${error}`);
+          }
         }
         logger.warn(`received group invitation from ${userString} (stranger)`);
         logger.warn('please manually accept this group invitation');
-      });
     });
 
     this.app.middleware(async (session: Session) => {
       const chat = await this.getChat(session);
+      let userString = `${session.username}(${session.userId})`;
+      if (chat.chatType === 'temp') {
+        const group = await session.bot.getGuild(chat.chatID.group.toString());
+        userString += ` (from group ${group.guildName}(${group.guildId}))`;
+      }
       const cmdObj = parseCmd(session.content);
       const reply = (msg: string) => this.getSender(chat)(msg).catch(error => {
-        logger.error(`error replying to message from ${session.username}(${session.userId}), error: ${error}`);
+        if (chat.chatType === 'temp') {
+          return logger.info(`ignored error while replying to ${userString}`);
+        }
+        logger.error(`error replying to message from ${userString}, error: ${error}`);
       });
       switch (cmdObj.cmd) {
         case 'twi_view':