Browse Source

Merge branch 'instagram' into stories

Mike L 3 years ago
parent
commit
478dd0c5b4
6 changed files with 95 additions and 84 deletions
  1. 16 9
      dist/koishi.js
  2. 5 6
      dist/main.js
  3. 27 27
      dist/twitter.js
  4. 16 9
      src/koishi.ts
  5. 5 6
      src/main.ts
  6. 26 27
      src/twitter.ts

+ 16 - 9
dist/koishi.js

@@ -134,15 +134,17 @@ class default_1 {
                             groupString = `${groupItem.groupName}(${groupId})`;
                         return test;
                     })) {
-                        session.bot.handleFriendRequest(session.messageId, true);
-                        return logger.info(`accepted friend request from ${userString} (from group ${groupString})`);
+                        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}`); });
                     }
                     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;
+                            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;
@@ -157,8 +159,9 @@ class default_1 {
                 logger.debug(`detected group invitation event: ${groupString}}`);
                 return session.bot.getFriendList().then(friendList => {
                     if (friendList.some(friendItem => friendItem.userId = session.userId)) {
-                        session.bot.handleGroupRequest(session.messageId, true);
-                        return logger.info(`accepted group invitation from ${userString} (friend)`);
+                        return session.bot.handleGroupRequest(session.messageId, true)
+                            .then(() => { 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');
@@ -167,7 +170,11 @@ class default_1 {
             this.app.middleware((session) => __awaiter(this, void 0, void 0, function* () {
                 const chat = yield this.getChat(session);
                 const cmdObj = command_1.parseCmd(session.content);
-                const reply = (msg) => __awaiter(this, void 0, void 0, function* () { return session.sendQueued(msg); });
+                const reply = (msg) => __awaiter(this, void 0, void 0, function* () {
+                    const userString = `${session.username}(${session.userId})`;
+                    return session.sendQueued(msg)
+                        .catch(error => { logger.error(`error replying to message from ${userString}, error: ${error}`); });
+                });
                 switch (cmdObj.cmd) {
                     case 'igstory_view':
                     case 'igstory_get':
@@ -191,7 +198,7 @@ class default_1 {
 /igstory - 查询当前聊天中的 Instagram Stories 动态订阅
 /igstory_subscribe〈链接|用户名〉- 订阅 Instagram Stories 搬运
 /igstory_unsubscribe〈链接|用户名〉- 退订 Instagram Stories 媒体搬运
-/igstory_view〈链接〉- 查看该用户所有 Stories
+/igstory_view〈链接|用户名〉- 查看该用户所有 Stories\
 ${chat.chatType === "temp" ?
                                 '\n(当前游客模式下无法使用订阅功能,请先添加本账号为好友。)' : ''}`);
                         }

+ 5 - 6
dist/main.js

@@ -73,12 +73,11 @@ optionalFields.forEach(key => {
         config[key] = `${config.ig_username}.${key.replace('_lockfile', '.lock')}`;
     }
 });
-(k => {
-    if (!config[k] || config[k] < 2048 || config[k] > 65536) {
-        logger.warn(`invalid value of config.${k}, use ${exampleConfig[k]} as default`);
-        config[k] = exampleConfig[k];
-    }
-})('ig_2fa_code_receiver_port');
+const k = 'ig_2fa_code_receiver_port';
+if (!config[k] || config[k] < 2048 || config[k] > 65536) {
+    logger.warn(`invalid value of config.${k}, use ${exampleConfig[k]} as default`);
+    config[k] = exampleConfig[k];
+}
 loggers_1.setLogLevels(config.loglevel);
 let lock;
 if (fs.existsSync(path.resolve(config.lockfile))) {

+ 27 - 27
dist/twitter.js

@@ -226,26 +226,24 @@ class default_1 {
             }))
                 .then(() => {
                 logger.debug(`pulling stories for users: ${Object.values(idToUserMap).map(user => user.username)}`);
-                this.client.feed.reelsMedia({
-                    userIds: Object.keys(idToUserMap),
-                }).items()
+                return this.client.feed.reelsMedia({ userIds: Object.keys(idToUserMap) }).items()
                     .then(storyItems => storyItems.forEach(item => {
                     if (!(item.pk in this.cache[idToUserMap[item.user.pk].username].stories)) {
                         this.cache[idToUserMap[item.user.pk].username].stories[item.pk] = item;
                     }
-                }))
-                    .catch((error) => {
-                    if (error instanceof instagram_private_api_1.IgNetworkError) {
-                        logger.warn(`error on fetching stories for all: ${JSON.stringify(error.cause)}`);
-                    }
-                    else if (error instanceof instagram_private_api_1.IgLoginRequiredError) {
-                        logger.warn('login required, logging in again...');
-                        this.session.login().then(this.workForAll);
-                    }
-                    else {
-                        logger.error(`unhandled error on fetching media for all: ${error}`);
-                    }
-                });
+                }));
+            })
+                .catch((error) => {
+                if (error instanceof instagram_private_api_1.IgNetworkError) {
+                    logger.warn(`error on fetching stories for all: ${JSON.stringify(error.cause)}`);
+                }
+                else if (error instanceof instagram_private_api_1.IgLoginRequiredError) {
+                    logger.warn('login required, logging in again...');
+                    this.session.login().then(this.workForAll);
+                }
+                else {
+                    logger.error(`unhandled error on fetching media for all: ${error}`);
+                }
             });
         };
         this.work = () => {
@@ -273,18 +271,20 @@ class default_1 {
             logger.debug(`searching for new items from ${currentFeed} in cache`);
             const promise = new Promise(resolve => {
                 const match = /https:\/\/www\.instagram\.com\/([^\/]+)/.exec(currentFeed);
-                if (match) {
-                    const cachedFeed = this.cache[match[1]];
-                    if (!cachedFeed) {
-                        setTimeout(this.work, this.workInterval * 1000);
-                        resolve([]);
-                    }
-                    const newer = (item) => utils_1.BigNumOps.compare(item.pk, lock.threads[currentFeed].offset) > 0;
-                    resolve(Object.values(cachedFeed.stories)
-                        .filter(newer)
-                        .map(story => (Object.assign(Object.assign({}, story), { user: cachedFeed.user })))
-                        .sort((i1, i2) => utils_1.BigNumOps.compare(i2.pk, i1.pk)));
+                if (!match) {
+                    logger.error(`current feed "${currentFeed}" is invalid, please remove this feed manually`);
+                    return resolve([]);
+                }
+                const cachedFeed = this.cache[match[1]];
+                if (!cachedFeed) {
+                    setTimeout(this.work, this.workInterval * 1000);
+                    return resolve([]);
                 }
+                const newer = (item) => utils_1.BigNumOps.compare(item.pk, lock.threads[currentFeed].offset) > 0;
+                resolve(Object.values(cachedFeed.stories)
+                    .filter(newer)
+                    .map(story => (Object.assign(Object.assign({}, story), { user: cachedFeed.user })))
+                    .sort((i1, i2) => utils_1.BigNumOps.compare(i2.pk, i1.pk)));
             });
             promise.then((mediaItems) => {
                 const currentThread = lock.threads[currentFeed];

+ 16 - 9
src/koishi.ts

@@ -150,16 +150,18 @@ export default class {
           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})`);
+          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}`); });
         }
         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;
+              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 => {
@@ -176,8 +178,9 @@ export default class {
       logger.debug(`detected group invitation event: ${groupString}}`);
       return session.bot.getFriendList().then(friendList => {
         if (friendList.some(friendItem => friendItem.userId = session.userId)) {
-          session.bot.handleGroupRequest(session.messageId, true);
-          return logger.info(`accepted group invitation from ${userString} (friend)`);
+          return session.bot.handleGroupRequest(session.messageId, true)
+            .then(() => { 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');
@@ -187,7 +190,11 @@ export default class {
     this.app.middleware(async (session: CQSession) => {
       const chat = await this.getChat(session);
       const cmdObj = parseCmd(session.content);
-      const reply = async msg => session.sendQueued(msg);
+      const reply = async msg => {
+        const userString = `${session.username}(${session.userId})`;
+        return session.sendQueued(msg)
+          .catch(error => { logger.error(`error replying to message from ${userString}, error: ${error}`); });
+      };
       switch (cmdObj.cmd) {
         case 'igstory_view':
         case 'igstory_get':
@@ -211,7 +218,7 @@ export default class {
 /igstory - 查询当前聊天中的 Instagram Stories 动态订阅
 /igstory_subscribe〈链接|用户名〉- 订阅 Instagram Stories 搬运
 /igstory_unsubscribe〈链接|用户名〉- 退订 Instagram Stories 媒体搬运
-/igstory_view〈链接〉- 查看该用户所有 Stories
+/igstory_view〈链接|用户名〉- 查看该用户所有 Stories\
 ${chat.chatType === ChatType.Temp ?
     '\n(当前游客模式下无法使用订阅功能,请先添加本账号为好友。)' : ''
 }`);

+ 5 - 6
src/main.ts

@@ -87,12 +87,11 @@ optionalFields.forEach(key => {
   }
 });
 
-(k => {
-  if (!config[k] || config[k] < 2048 || config[k] > 65536) {
-    logger.warn(`invalid value of config.${k}, use ${exampleConfig[k]} as default`);
-    config[k] = exampleConfig[k];
-  }
-})('ig_2fa_code_receiver_port');
+const k = 'ig_2fa_code_receiver_port';
+if (!config[k] || config[k] < 2048 || config[k] > 65536) {
+  logger.warn(`invalid value of config.${k}, use ${exampleConfig[k]} as default`);
+  config[k] = exampleConfig[k];
+}
 
 setLogLevels(config.loglevel);
 

+ 26 - 27
src/twitter.ts

@@ -349,24 +349,22 @@ export default class {
     }))
       .then(() => {
         logger.debug(`pulling stories for users: ${Object.values(idToUserMap).map(user => user.username)}`);
-        this.client.feed.reelsMedia({
-          userIds: Object.keys(idToUserMap),
-        }).items()
+        return this.client.feed.reelsMedia({userIds: Object.keys(idToUserMap)}).items()
           .then(storyItems => storyItems.forEach(item => {
             if (!(item.pk in this.cache[idToUserMap[item.user.pk].username].stories)) {
               this.cache[idToUserMap[item.user.pk].username].stories[item.pk] = item;
             }
-          }))
-          .catch((error: IgClientError & Partial<RequestError>) => {
-            if (error instanceof IgNetworkError) {
-              logger.warn(`error on fetching stories for all: ${JSON.stringify(error.cause)}`);
-            } else if (error instanceof IgLoginRequiredError) {
-              logger.warn('login required, logging in again...');
-              this.session.login().then(this.workForAll);
-            } else {
-              logger.error(`unhandled error on fetching media for all: ${error}`);
-            }
-          });
+          }));
+      })
+      .catch((error: IgClientError & Partial<RequestError>) => {
+        if (error instanceof IgNetworkError) {
+          logger.warn(`error on fetching stories for all: ${JSON.stringify(error.cause)}`);
+        } else if (error instanceof IgLoginRequiredError) {
+          logger.warn('login required, logging in again...');
+          this.session.login().then(this.workForAll);
+        } else {
+          logger.error(`unhandled error on fetching media for all: ${error}`);
+        }
       });
   };
 
@@ -395,20 +393,21 @@ export default class {
 
     const promise = new Promise<MediaItem[]>(resolve => {
       const match = /https:\/\/www\.instagram\.com\/([^\/]+)/.exec(currentFeed);
-      if (match) {
-        const cachedFeed = this.cache[match[1]];
-        if (!cachedFeed) {
-          setTimeout(this.work, this.workInterval * 1000);
-          resolve([]);
-        }
-        const newer = (item: MediaItem) =>
-          BigNumOps.compare(item.pk, lock.threads[currentFeed].offset) > 0;
-        resolve(Object.values(cachedFeed.stories)
-          .filter(newer)
-          .map(story => ({...story, user: cachedFeed.user}))
-          .sort((i1, i2) => BigNumOps.compare(i2.pk, i1.pk))
-        );
+      if (!match) {
+        logger.error(`current feed "${currentFeed}" is invalid, please remove this feed manually`);
+        return resolve([]);
+      }
+      const cachedFeed = this.cache[match[1]];
+      if (!cachedFeed) {
+        setTimeout(this.work, this.workInterval * 1000);
+        return resolve([]);
       }
+      const newer = (item: MediaItem) => BigNumOps.compare(item.pk, lock.threads[currentFeed].offset) > 0;
+      resolve(Object.values(cachedFeed.stories)
+        .filter(newer)
+        .map(story => ({...story, user: cachedFeed.user}))
+        .sort((i1, i2) => BigNumOps.compare(i2.pk, i1.pk))
+      );
     });
 
     promise.then((mediaItems: MediaItem[]) => {