/* eslint-disable @typescript-eslint/no-unsafe-return */ /* eslint-disable @typescript-eslint/member-delimiter-style */ /* eslint-disable prefer-arrow/prefer-arrow-functions */ import { relativeDate } from './datetime'; import { parseAction } from './twitter'; function parseCmd(message: string): { cmd: string; args: string[]; } { message = message.trim(); message = message.replace('\\\\', '\\0x5c'); message = message.replace('\\\"', '\\0x22'); message = message.replace('\\\'', '\\0x27'); const strs = message.match(/'[\s\S]*?'|(?:\S+=)?"[\s\S]*?"|\S+/mg); const cmd = strs?.length ? strs[0].length ? strs[0].substring(0, 1) === '/' ? strs[0].substring(1) : '' : '' : ''; const args = (strs ?? []).slice(1).map(arg => { arg = arg.replace(/^(\S+=)?["']+(?!.*=)|["']+$/g, '$1'); arg = arg.replace('\\0x27', '\\\''); arg = arg.replace('\\0x22', '\\\"'); arg = arg.replace('\\0x5c', '\\\\'); return arg; }); return { cmd, args, }; } function sub(chat: IChat, args: string[], reply: (msg: string) => any, lock: ILock, lockfile: string ): void { if (chat.chatType === ChatType.Temp) { return reply('请先添加机器人为好友。'); } const index = lock.subscribers.findIndex(({chatID, chatType}) => chat.chatID === chatID && chat.chatType === chatType ); if (index > -1) return reply('此聊天已订阅 IDOLY PRIDE BWIKI 更新提醒。'); lock.subscribers.push(chat); reply('已为此聊天订阅 IDOLY PRIDE BWIKI 更新提醒。'); } function unsub(chat: IChat, args: string[], reply: (msg: string) => any, lock: ILock, lockfile: string ): void { if (chat.chatType === ChatType.Temp) { return reply('请先添加机器人为好友。'); } const index = lock.subscribers.findIndex(({chatID, chatType}) => chat.chatID === chatID && chat.chatType === chatType ); if (index === -1) return reply('此聊天未订阅 IDOLY PRIDE BWIKI 更新提醒。'); lock.subscribers.splice(index, 1); reply('已为此聊天退订 IDOLY PRIDE BWIKI 更新提醒。'); } function status(chat: IChat, _: string[], reply: (msg: string) => any, lock: ILock): void { const lastAction = lock.lastActions.sort( (a1, a2) => Date.parse(a2.timestamp) - Date.parse(a1.timestamp) )[0]; reply(`IDOLY PRIDE 官方推特追踪情况: 上次更新时间:${relativeDate(lastAction.timestamp || '')} 上次更新内容:${parseAction(lastAction)} 上次检查时间:${relativeDate(lock.updatedAt || '')}`); } export { parseCmd, sub, unsub, status };