command.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. /* eslint-disable @typescript-eslint/no-unsafe-return */
  2. /* eslint-disable @typescript-eslint/member-delimiter-style */
  3. /* eslint-disable prefer-arrow/prefer-arrow-functions */
  4. import { Message } from './koishi';
  5. import { queryByRegExp } from './twitter';
  6. function parseCmd(message: string): {
  7. cmd: string;
  8. args: string[];
  9. } {
  10. message = message.trim();
  11. message = message.replace('\\\\', '\\0x5c');
  12. message = message.replace('\\\"', '\\0x22');
  13. message = message.replace('\\\'', '\\0x27');
  14. const strs = message.match(/'[\s\S]*?'|(?:\S+=)?"[\s\S]*?"|\S+/mg);
  15. const cmd = strs?.length ? strs[0].length ? strs[0].substring(0, 1) === '/' ? strs[0].substring(1) : '' : '' : '';
  16. const args = (strs ?? []).slice(1).map(arg => {
  17. arg = arg.replace(/^(\S+=)?["']+(?!.*=)|["']+$/g, '$1');
  18. arg = arg.replace('\\0x27', '\\\'');
  19. arg = arg.replace('\\0x22', '\\\"');
  20. arg = arg.replace('\\0x5c', '\\\\');
  21. return arg;
  22. });
  23. return {
  24. cmd,
  25. args,
  26. };
  27. }
  28. function view(_chat: IChat, args: string[], reply: (msg: string) => any): void {
  29. let query = Number(args[0]);
  30. if (args[0] && !Number.isInteger(query)) return reply('查询格式有误。\n格式:/nanatsuu_view [〈整数〉]');
  31. queryByRegExp('t7s_staff', /今週の『それゆけ!ナナスタ☆通信』第(\d+)話はこちら!/, 360)
  32. .then(match => {
  33. if (!match) throw Error();
  34. if (!args[0]) query = Number(match[1]);
  35. if (query < 0) query += Number(match[1]);
  36. if (query < 0 || query > Number(match[1])) {
  37. return reply(`查询取值范围有误。当前可用的取值范围:${- Number(match[1])}~${Number(match[1])}`);
  38. }
  39. reply(`第 ${query} 话:\n` +
  40. Message.Image(`https://d2n19nac4w0gh6.cloudfront.net/resource/images/webview/comic/story/comic_${
  41. String(query).padStart(3, '0')
  42. }.jpg`)
  43. );
  44. }).catch((err: Error) => reply(`查询失败,请稍后重试。${err.message ? `原因:${err}`: ''}`));
  45. }
  46. export { parseCmd, view };