import html, { HTMLElement } from "node-html-parser"; import request from "request-promise-native"; import { Response } from "request"; import { INewsItem, IAggregator } from "./aggregator"; import { getRepository } from "typeorm"; import { AggroNewsItem } from "../../entity/AggroNewsItem"; const kissDiaryRoot = "https://com3d2.world/r18/notices.php"; const FEED_NAME = "com3d2-world-notices"; async function aggregate() { let repo = getRepository(AggroNewsItem); let lastPost = await repo.findOne({ select: [ "newsId" ], where: { feedName: FEED_NAME }, order: { newsId: "DESC" } }); try { let mainPageRes = await request(kissDiaryRoot, {resolveWithFullResponse: true}) as Response; if(mainPageRes.statusCode != 200) return []; let rootNode = html.parse(mainPageRes.body, { pre: true, script: false, style: false }); if(!(rootNode instanceof HTMLElement)) return; let diaryEntries = rootNode.querySelectorAll("div.frame a"); if(!diaryEntries) { console.log("[COM3D2 WORLD BLOG] Failed to find listing!"); } let result : INewsItem[] = []; let latestEntry = lastPost.newsId; for(let a of diaryEntries) { if(!a.rawAttributes.id) continue; let id = +a.rawAttributes.id; if(id <= lastPost.newsId) continue; if(id > latestEntry) latestEntry = id; let diaryLink = `${kissDiaryRoot}?no=${id}`; let res = await request(diaryLink, {resolveWithFullResponse: true}) as Response; if(res.statusCode != 200) continue; let node = html.parse(res.body, { pre: true, script: false, style: false }); if(!(node instanceof HTMLElement)) continue; let title = node.querySelector("div.frame div.notice_title th"); let contents = node.querySelectorAll("div.frame div")[1]; result.push({ newsId: id, feedId: FEED_NAME, link: diaryLink, title: title.text, author: "com3d2.world", contents: contents.outerHTML, embedColor: 0xa39869 }); } return result; } catch(err) { return []; } } export default { aggregate: aggregate } as IAggregator;