com3d2_updates.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import request from "request-promise-native";
  2. import { Response } from "request";
  3. import { IAggregator, INewsItem } from "./aggregator";
  4. import { getRepository } from "typeorm";
  5. import { AggroNewsItem } from "@shared/db/entity/AggroNewsItem";
  6. import cheerio from "cheerio";
  7. import { logger } from "src/logging";
  8. const updatePage = "http://com3d2.jp/update/";
  9. const changeLogPattern = /\[\s*([^\s\]]+)\s*\]\s*((・.*)\s+)+/gim;
  10. const FEED_NAME = "com3d2-jp-updates";
  11. function getVersionNumber(verStr: string) {
  12. let verPart = verStr.replace(/[.\s]/g, "");
  13. if(verPart.length < 4)
  14. verPart += "0";
  15. return +verPart;
  16. }
  17. async function aggregate() {
  18. const repo = getRepository(AggroNewsItem);
  19. let lastPost = await repo.findOne({
  20. select: [ "newsId" ],
  21. where: { feedName: FEED_NAME },
  22. order: { newsId: "DESC" }
  23. });
  24. if(!lastPost)
  25. lastPost = repo.create({
  26. newsId: 0
  27. });
  28. try {
  29. const mainPageRes = await request(updatePage, {resolveWithFullResponse: true}) as Response;
  30. if(mainPageRes.statusCode != 200)
  31. return;
  32. const rootNode = cheerio.load(mainPageRes.body);
  33. const readme = rootNode("div.readme");
  34. if(!readme) {
  35. logger.error("[COM3D2 JP UPDATE] Failed to find listing!");
  36. return [];
  37. }
  38. const latestVersionChangelog = changeLogPattern.exec(readme.text());
  39. if(!latestVersionChangelog)
  40. return [];
  41. const version = getVersionNumber(latestVersionChangelog[1]);
  42. const text = latestVersionChangelog[0];
  43. if(version <= lastPost.newsId)
  44. return [];
  45. return [{
  46. feedId: FEED_NAME,
  47. newsId: version,
  48. link: updatePage,
  49. title: latestVersionChangelog[1],
  50. author: "COM3D2 UPDATE",
  51. contents: text,
  52. embedColor: 0xcccccc,
  53. needsTranslation: true
  54. }] as INewsItem[];
  55. } catch(err) {
  56. logger.error("Failed to parse com3d2 update site", err);
  57. return [];
  58. }
  59. }
  60. export default {
  61. aggregate: aggregate
  62. } as IAggregator;