Ver código fonte

update typescript, fix webshot promise

Mike L 3 anos atrás
pai
commit
330820d0f9
8 arquivos alterados com 49 adições e 57 exclusões
  1. 9 9
      dist/command.js
  2. 7 7
      dist/koishi.js
  3. 1 1
      dist/loggers.js
  4. 6 6
      dist/main.js
  5. 12 12
      dist/twitter.js
  6. 8 12
      dist/webshot.js
  7. 1 1
      package.json
  8. 5 9
      src/webshot.ts

+ 9 - 9
dist/command.js

@@ -6,7 +6,7 @@ const path = require("path");
 const datetime_1 = require("./datetime");
 const loggers_1 = require("./loggers");
 const twitter_1 = require("./twitter");
-const logger = loggers_1.getLogger('command');
+const logger = (0, loggers_1.getLogger)('command');
 function parseCmd(message) {
     message = message.trim();
     message = message.replace('\\\\', '\\0x5c');
@@ -28,7 +28,7 @@ function parseCmd(message) {
 }
 exports.parseCmd = parseCmd;
 function linkFinder(userName, chat, lock) {
-    const normalizedLink = twitter_1.linkBuilder({ userName });
+    const normalizedLink = (0, twitter_1.linkBuilder)({ userName });
     const link = Object.keys(lock.threads).find(realLink => normalizedLink === realLink.replace(/\/@/, '/').toLowerCase());
     if (!link)
         return [null, -1];
@@ -42,7 +42,7 @@ function sub(chat, args, reply, lock, lockfile) {
     if (args.length === 0) {
         return reply('找不到要订阅 Instagram 限时动态的链接。');
     }
-    const matched = twitter_1.parseLink(args[0]);
+    const matched = (0, twitter_1.parseLink)(args[0]);
     if (!matched) {
         return reply(`订阅链接格式错误:
 示例:
@@ -77,7 +77,7 @@ https://www.instagram.com/tomoyo_kurosawa_/`);
         return false;
     };
     const newSub = (userName) => {
-        const link = twitter_1.linkBuilder(matched);
+        const link = (0, twitter_1.linkBuilder)(matched);
         subscribeTo(link, { id: Number(userName.split(':')[1]) });
     };
     if (!tryFindSub(matched.userName)) {
@@ -113,7 +113,7 @@ function unsub(chat, args, reply, lock, lockfile) {
     if (args.length === 0) {
         return reply('找不到要退订 Instagram 限时动态的链接。');
     }
-    const match = (_a = twitter_1.parseLink(args[0])) === null || _a === void 0 ? void 0 : _a.userName;
+    const match = (_a = (0, twitter_1.parseLink)(args[0])) === null || _a === void 0 ? void 0 : _a.userName;
     if (!match) {
         return reply('链接格式有误。');
     }
@@ -135,7 +135,7 @@ function list(chat, _, reply, lock) {
     const links = [];
     Object.keys(lock.threads).forEach(key => {
         if (lock.threads[key].subscribers.find(({ chatID, chatType }) => chat.chatID === chatID && chat.chatType === chatType))
-            links.push(`${key} ${datetime_1.relativeDate(lock.threads[key].updatedAt)}`);
+            links.push(`${key} ${(0, datetime_1.relativeDate)(lock.threads[key].updatedAt)}`);
     });
     return reply('此聊天中订阅的 Instagram 限时动态动态链接:\n' + links.join('\n'));
 }
@@ -152,7 +152,7 @@ function view(chat, args, reply) {
     if (args.length === 0) {
         return reply('找不到要查看 Instagram 限时动态的链接。');
     }
-    const match = twitter_1.parseLink(args[0]);
+    const match = (0, twitter_1.parseLink)(args[0]);
     if (!(match === null || match === void 0 ? void 0 : match.userName)) {
         return reply('链接格式有误。');
     }
@@ -183,12 +183,12 @@ function query(chat, args, reply) {
     if (args.length === 0) {
         return reply('找不到要查询 Instagram 限时动态的用户。');
     }
-    const match = (_a = twitter_1.parseLink(args[0])) === null || _a === void 0 ? void 0 : _a.userName;
+    const match = (_a = (0, twitter_1.parseLink)(args[0])) === null || _a === void 0 ? void 0 : _a.userName;
     if (!match) {
         return reply('链接格式有误。');
     }
     try {
-        twitter_1.sendTimeline(match, chat);
+        (0, twitter_1.sendTimeline)(match, chat);
     }
     catch (e) {
         logger.error(`error querying timeline, error: ${e}`);

+ 7 - 7
dist/koishi.js

@@ -15,7 +15,7 @@ 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 logger = (0, loggers_1.getLogger)('qqbot');
 const cqUrlFix = (factory) => (...args) => factory(...args).replace(/(?<=\[CQ:.*)url=(?=(base64|file|https?):\/\/)/, 'file=');
 exports.Message = {
     Image: cqUrlFix(koishi_1.segment.image),
@@ -51,7 +51,7 @@ class default_1 {
             var _a, _b;
             let wasEmpty = false;
             const queue = (_a = this.messageQueues)[_b = `${type}:${id}`] || (_a[_b] = (() => { wasEmpty = true; return []; })());
-            queue.push(() => koishi_1.sleep(200).then(resolver));
+            queue.push(() => (0, koishi_1.sleep)(200).then(resolver));
             logger.debug(`no. of message currently queued for ${type}:${id}: ${queue.length}`);
             if (wasEmpty)
                 this.next(type, id);
@@ -139,7 +139,7 @@ class default_1 {
                             .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 ||
+                    (0, utils_1.chainPromises)(groupList.map(groupItem => (done) => Promise.resolve(done ||
                         this.bot.getGroupMember(groupItem.groupId, session.userId).then(() => {
                             groupString = `${groupItem.groupName}(${groupItem.groupId})`;
                             return session.bot.handleFriendRequest(session.messageId, true)
@@ -170,7 +170,7 @@ 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 cmdObj = (0, command_1.parseCmd)(session.content);
                 const reply = (msg) => __awaiter(this, void 0, void 0, function* () {
                     const userString = `${session.username}(${session.userId})`;
                     return (chat.chatType === "group" ? this.sendToGroup : this.sendToUser)(chat.chatID.toString(), msg)
@@ -179,11 +179,11 @@ class default_1 {
                 switch (cmdObj.cmd) {
                     case 'igstory_view':
                     case 'igstory_get':
-                        command_1.view(chat, cmdObj.args, reply);
+                        (0, command_1.view)(chat, cmdObj.args, reply);
                         break;
                     case 'igstory_query':
                     case 'igstory_gettimeline':
-                        command_1.query(chat, cmdObj.args, reply);
+                        (0, command_1.query)(chat, cmdObj.args, reply);
                         break;
                     case 'igstory_sub':
                     case 'igstory_subscribe':
@@ -222,7 +222,7 @@ ${chat.chatType === "temp" ?
             }
             catch (err) {
                 logger.error(`error connecting to bot provider at ${this.app.options.server}, will retry in 2.5s...`);
-                yield koishi_1.sleep(2500);
+                yield (0, koishi_1.sleep)(2500);
                 yield this.listen('retry connecting...');
             }
         });

+ 1 - 1
dist/loggers.js

@@ -4,7 +4,7 @@ exports.setLogLevels = exports.getLogger = void 0;
 const log4js_1 = require("log4js");
 const loggers = [];
 function getLogger(category) {
-    const l = log4js_1.getLogger(category);
+    const l = (0, log4js_1.getLogger)(category);
     l.level = 'info';
     loggers.push(l);
     return l;

+ 6 - 6
dist/main.js

@@ -9,7 +9,7 @@ const command_1 = require("./command");
 const loggers_1 = require("./loggers");
 const koishi_1 = require("./koishi");
 const twitter_1 = require("./twitter");
-const logger = loggers_1.getLogger();
+const logger = (0, loggers_1.getLogger)();
 const sections = [
     {
         header: 'GoCQHTTP Instagram Bot',
@@ -78,7 +78,7 @@ 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);
+(0, loggers_1.setLogLevels)(config.loglevel);
 const deserialized = {
     lockfile: {
         workon: 0,
@@ -122,10 +122,10 @@ const qq = new koishi_1.default({
     host: config.cq_ws_host,
     port: config.cq_ws_port,
     bot_id: config.cq_bot_qq,
-    list: (c, a, cb) => command_1.list(c, a, cb, lock),
-    sub: (c, a, cb) => command_1.sub(c, a, cb, lock, config.lockfile),
-    unsub: (c, a, cb) => command_1.unsub(c, a, cb, lock, config.lockfile),
-    unsubAll: (c, a, cb) => command_1.unsubAll(c, a, cb, lock, config.lockfile),
+    list: (c, a, cb) => (0, command_1.list)(c, a, cb, lock),
+    sub: (c, a, cb) => (0, command_1.sub)(c, a, cb, lock, config.lockfile),
+    unsub: (c, a, cb) => (0, command_1.unsub)(c, a, cb, lock, config.lockfile),
+    unsubAll: (c, a, cb) => (0, command_1.unsubAll)(c, a, cb, lock, config.lockfile),
 });
 const worker = new twitter_1.default({
     sessionLockfile: config.ig_session_lockfile,

+ 12 - 12
dist/twitter.js

@@ -66,7 +66,7 @@ class SessionManager {
                     logger.warn('attempting to retry after 1 minute...');
                     if (fs.existsSync(filePath))
                         fs.unlinkSync(filePath);
-                    util_1.promisify(setTimeout)(60000).then(this.init);
+                    (0, util_1.promisify)(setTimeout)(60000).then(this.init);
                 });
             }
         };
@@ -76,7 +76,7 @@ class SessionManager {
             logger.info(`/confirm-2fa?code=<the code you received>&token=${token}`);
             let working;
             const server = http.createServer((req, res) => {
-                const { pathname, query } = url_1.parse(req.url, true);
+                const { pathname, query } = (0, url_1.parse)(req.url, true);
                 if (!working && pathname === '/confirm-2fa' && query.token === token &&
                     typeof (query.code) === 'string' && /^\d{6}$/.test(query.code)) {
                     const code = query.code;
@@ -153,7 +153,7 @@ let sendAllStories = (username, receiver, startIndex, count) => {
     throw Error();
 };
 exports.sendAllStories = sendAllStories;
-const logger = loggers_1.getLogger('instagram');
+const logger = (0, loggers_1.getLogger)('instagram');
 const maxTrials = 3;
 const retryInterval = 1500;
 const ordinal = (n) => {
@@ -233,7 +233,7 @@ class default_1 {
             if (this.isInactiveTime)
                 return;
             logger.debug(`current cache: ${JSON.stringify(this.cache)}`);
-            utils_1.chainPromises(Object.entries(this.lock.threads).map(([feed, thread]) => () => {
+            (0, utils_1.chainPromises)(Object.entries(this.lock.threads).map(([feed, thread]) => () => {
                 const id = thread.id;
                 const userName = parseLink(feed).userName;
                 logger.debug(`preparing to add user @${userName} to next pull task...`);
@@ -243,7 +243,7 @@ class default_1 {
                         item.pullOrder = -1;
                     return Promise.resolve();
                 }
-                return util_1.promisify(setTimeout)((Math.random() * 2 + 1) * 5000).then(() => this.client.user.info(id).then(({ pk, username, full_name }) => {
+                return (0, util_1.promisify)(setTimeout)((Math.random() * 2 + 1) * 5000).then(() => this.client.user.info(id).then(({ pk, username, full_name }) => {
                     this.cache[id] = { user: { pk, username, full_name }, stories: {}, pullOrder: -1 };
                     fs.writeFileSync(path.resolve(this.cachefile), JSON.stringify(this.cache));
                     logger.info(`initialized cache item for user ${full_name} (@${username})`);
@@ -253,10 +253,10 @@ class default_1 {
                 const userIdCache = Object.values(this.cache).some(item => item.pullOrder < 0) ?
                     this.pullOrders = utils_1.Arr.shuffle(Object.keys(this.cache)).map(Number) :
                     this.pullOrders;
-                return utils_1.chainPromises(utils_1.Arr.chunk(userIdCache, 20).map(userIds => () => {
+                return (0, utils_1.chainPromises)(utils_1.Arr.chunk(userIdCache, 20).map(userIds => () => {
                     logger.info(`pulling stories from users:${userIds.map(id => ` @${this.cache[id].user.username}`)}`);
                     return this.client.feed.reelsMedia({ userIds }).request()
-                        .then(({ reels }) => utils_1.chainPromises(Object.keys(reels).map(userId => this.cache[userId]).map(({ user, stories }) => () => this.queryUserObject(user.username)
+                        .then(({ reels }) => (0, utils_1.chainPromises)(Object.keys(reels).map(userId => this.cache[userId]).map(({ user, stories }) => () => this.queryUserObject(user.username)
                         .catch((error) => {
                         if (error instanceof instagram_private_api_1.IgExactUserNotFoundError) {
                             return this.client.user.info(user.pk)
@@ -276,7 +276,7 @@ class default_1 {
                             }
                         });
                     });
-                }), (lp1, lp2) => () => lp1().then(() => util_1.promisify(setTimeout)(this.workInterval * 1000 / this.lock.feed.length).then(lp2)));
+                }), (lp1, lp2) => () => lp1().then(() => (0, util_1.promisify)(setTimeout)(this.workInterval * 1000 / this.lock.feed.length).then(lp2)));
             })
                 .catch((error) => {
                 if (error instanceof instagram_private_api_1.IgNetworkError) {
@@ -453,13 +453,13 @@ class default_1 {
                         .sort((i1, i2) => -utils_1.BigNumOps.compare(i2.pk, i1.pk));
                     if (storyItems.length === 0)
                         return reply(`当前用户 (@${userName}) 没有可用的 Instagram 限时动态。`);
-                    return reply('#. 编号:发送时间\n' + storyItems.map(({ original }, index) => `\n${index + 1}. ${original.pk}: ${datetime_1.relativeDate(original.taken_at * 1000)}`).join(''))
+                    return reply('#. 编号:发送时间\n' + storyItems.map(({ original }, index) => `\n${index + 1}. ${original.pk}: ${(0, datetime_1.relativeDate)(original.taken_at * 1000)}`).join(''))
                         .then(() => reply(`请使用 /igstory_view ${userName} skip=<#-1> count=1
 或 /igstory_view https://www.instagram.com/stories/${userName}/<编号>/
 查看指定的限时动态。`));
                 },
                 reply,
-                retryAction: () => exports.sendTimeline(rawUserName, receiver),
+                retryAction: () => (0, exports.sendTimeline)(rawUserName, receiver),
             });
         };
         exports.sendStory = (rawUserName, storyId, receiver) => {
@@ -473,7 +473,7 @@ class default_1 {
                     return this.workOnMedia([this.cache[userId].stories[storyId]], sender);
                 },
                 reply,
-                retryAction: () => exports.sendStory(rawUserName, storyId, receiver),
+                retryAction: () => (0, exports.sendStory)(rawUserName, storyId, receiver),
             });
         };
         exports.sendAllStories = (rawUserName, receiver, startIndex = 0, count = 10) => {
@@ -499,7 +499,7 @@ class default_1 {
                         .then(() => reply(`已显示当前用户 ${storyItems.length} 条可用限时动态中的第 ${sendRangeText} 条。`));
                 },
                 reply,
-                retryAction: () => exports.sendAllStories(rawUserName, receiver, startIndex, count)
+                retryAction: () => (0, exports.sendAllStories)(rawUserName, receiver, startIndex, count)
             });
         };
     }

+ 8 - 12
dist/webshot.js

@@ -19,13 +19,13 @@ const typeInZH = {
     photo: ZHType('图片'),
     video: ZHType('视频'),
 };
-const logger = loggers_1.getLogger('webshot');
+const logger = (0, loggers_1.getLogger)('webshot');
 class Webshot extends CallableInstance {
     constructor(_wsUrl, _mode, onready) {
         super('webshot');
         this.fetchMedia = (url) => new Promise((resolve, reject) => {
             logger.info(`fetching ${url}`);
-            axios_1.default({
+            (0, axios_1.default)({
                 method: 'get',
                 url,
                 responseType: 'arraybuffer',
@@ -45,7 +45,7 @@ class Webshot extends CallableInstance {
             });
         }).then(data => (ext => {
             const mediaTempFilePath = temp.path({ suffix: `.${ext}` });
-            fs_1.writeFileSync(mediaTempFilePath, Buffer.from(data));
+            (0, fs_1.writeFileSync)(mediaTempFilePath, Buffer.from(data));
             const path = `file://${mediaTempFilePath}`;
             switch (ext) {
                 case 'jpg':
@@ -60,13 +60,9 @@ class Webshot extends CallableInstance {
         onready();
     }
     webshot(mediaItems, callback, webshotDelay) {
-        let promise = new Promise(resolve => {
-            resolve();
-        });
-        mediaItems.forEach(item => {
-            promise = promise.then(() => {
-                logger.info(`working on ${item.user.username}/${item.code}`);
-            });
+        const promises = mediaItems.map(item => {
+            let promise = Promise.resolve();
+            logger.info(`working on ${item.user.username}/${item.code}`);
             let messageChain = '';
             const author = `${item.user.full_name} (@${item.user.username}):\n`;
             const date = `${new Date(item.taken_at * 1000)}\n`;
@@ -92,13 +88,13 @@ class Webshot extends CallableInstance {
                     return fetchBestCandidate(item.image_versions2.candidates, type(item));
                 }
             });
-            promise.then(() => {
+            return promise.then(() => {
                 logger.info(`done working on ${item.user.username}/${item.code}, message chain:`);
                 logger.info(JSON.stringify(koishi_1.Message.ellipseBase64(messageChain)));
                 callback(messageChain, xmlEntities.decode(item.caption), author);
             });
         });
-        return promise;
+        return Promise.all(promises).then();
     }
 }
 exports.default = Webshot;

+ 1 - 1
package.json

@@ -44,7 +44,7 @@
     "sharp": "^0.25.4",
     "socks-proxy-agent": "^5.0.0",
     "temp": "^0.9.1",
-    "typescript": "^4.2.3"
+    "typescript": "^4.5.5"
   },
   "devDependencies": {
     "@types/command-line-usage": "^5.0.1",

+ 5 - 9
src/webshot.ts

@@ -70,13 +70,9 @@ class Webshot extends CallableInstance<[MediaItem[], (...args) => void, number],
     callback: (msgs: string, text: string, author: string) => void,
     webshotDelay: number
   ): Promise<void> {
-    let promise = new Promise<void>(resolve => {
-      resolve();
-    });
-    mediaItems.forEach(item => {
-      promise = promise.then(() => {
-        logger.info(`working on ${item.user.username}/${item.code}`);
-      });
+    const promises = mediaItems.map(item => {
+      let promise = Promise.resolve();
+      logger.info(`working on ${item.user.username}/${item.code}`);
       let messageChain = '';
 
       // text processing
@@ -110,13 +106,13 @@ class Webshot extends CallableInstance<[MediaItem[], (...args) => void, number],
           return fetchBestCandidate(item.image_versions2.candidates, type(item));
         }
       });
-      promise.then(() => {
+      return promise.then(() => {
         logger.info(`done working on ${item.user.username}/${item.code}, message chain:`);
         logger.info(JSON.stringify(Message.ellipseBase64(messageChain)));
         callback(messageChain, xmlEntities.decode(item.caption), author);
       });
     });
-    return promise;
+    return Promise.all(promises).then();
   }
 }