com3d2_updates.ts 2.2 KB

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