Add post map class

pull/73/head
MillenniumEarl 2021-03-02 11:48:17 +01:00
parent 6e1e86a983
commit 95e9eaedce
1 changed files with 138 additions and 0 deletions

138
src/scripts/classes/post.ts Normal file
View File

@ -0,0 +1,138 @@
"use strict";
// Public modules from npm
import cheerio from "cheerio";
// Modules from file
import PlatformUser from "./platform-user.js";
import { IPostElement, parseF95ThreadPost } from "../scrape-data/post-parse.js";
import { POST, THREAD } from "../constants/css-selector.js";
import { urls } from "../constants/url.js";
import { fetchHTML } from "../network-helper.js";
/**
* Represents a post published by a user on the F95Zone platform.
*/
export default class Post {
//#region Fields
private _id: number;
private _number: number;
private _published: Date;
private _lastEdit: Date;
private _owner: PlatformUser;
private _bookmarked: boolean;
private _message: string;
private _body: IPostElement[];
//#endregion Fields
//#region Getters
/**
* Represents a post published by a user on the F95Zone platform.
*/
public get id() { return this._id; }
/**
* Unique ID of the post within the thread in which it is present.
*/
public get number() { return this._number; }
/**
* Date the post was first published.
*/
public get published() { return this._published; }
/**
* Date the post was last modified.
*/
public get lastEdit() { return this._lastEdit; }
/**
* User who owns the post.
*/
public get owner() { return this._owner; }
/**
* Indicates whether the post has been bookmarked.
*/
public get bookmarked() { return this._bookmarked; }
/**
* Post message text.
*/
public get message() { return this._message; }
/**
* Set of the elements that make up the body of the post.
*/
public get body() { return this._body; }
//#endregion Getters
//#region Public methods
/**
* Gets the post data starting from its unique ID for the entire platform.
*/
public async fetchData(id: number): Promise<void>;
public async fetchData(article: cheerio.Cheerio): Promise<void>;
public async fetchData(arg: number | cheerio.Cheerio): Promise<void> {
if (typeof arg === "number") {
// Fetch HTML page containing the post
const url = new URL(arg.toString(), urls.F95_POSTS).toString();
const htmlResponse = await fetchHTML(url);
if (htmlResponse.isSuccess()) {
// Load cheerio and find post
const $ = cheerio.load(htmlResponse.value);
const post = $(THREAD.POSTS_IN_PAGE).toArray().find((el, idx) => {
// Fetch the ID and check if it is what we are searching
const sid: string = $(el).find(POST.ID).attr("id").replace("post-", "");
const id = parseInt(sid);
if (id === arg) return el;
});
// Finally parse the post
this.parsePost($(post));
} else throw htmlResponse.value;
} else this.parsePost(arg);
}
//#endregion Public methods
//#region Private methods
private parsePost(post: cheerio.Cheerio): void {
// Find post's ID
const sid: string = post.find(POST.ID).attr("id").replace("post-", "");
this._id = parseInt(sid);
// Find post's number
const sNumber: string = post.find(POST.NUMBER).text().replace("#", "");
this._number = parseInt(sNumber);
// Find post's publishing date
const sPublishing: string = post.find(POST.PUBLISH_DATE).attr("datetime");
this._published = new Date(sPublishing);
// Find post's last edit date
const sLastEdit: string = post.find(POST.LAST_EDIT).attr("datetime");
this._lastEdit = new Date(sLastEdit);
// Find post's owner
this._owner = new PlatformUser(0);
// Find if the post is bookmarked
this._bookmarked = post.find(POST.BOOKMARKED).length !== 0;
// Find post's message
this._message = post.find(POST.BODY).text();
// Parse post's body
const $ = cheerio.load(post.html());
this._body = parseF95ThreadPost($, post);
}
//#endregion
}