Update JSDOC and url names

pull/81/head
MillenniumEarl 2021-03-05 13:04:43 +01:00
parent 0a57d2b2ec
commit ca11a442ed
12 changed files with 86 additions and 52 deletions

View File

@ -1,27 +1,27 @@
export declare const urls: { export declare const urls: {
F95_BASE_URL: string; BASE: string;
F95_2FA_LOGIN: string; LOGIN_2FA: string;
F95_SEARCH_URL: string; SEARCH: string;
F95_LATEST_UPDATES: string; LATEST_UPDATES: string;
F95_THREADS: string; THREADS: string;
F95_LOGIN_URL: string; LOGIN: string;
F95_WATCHED_THREADS: string; WATCHED_THREADS: string;
F95_LATEST_PHP: string; LATEST_PHP: string;
F95_BOOKMARKS: string; BOOKMARKS: string;
/** /**
* Add the unique ID of the post to * Add the unique ID of the post to
* get the thread page where the post * get the thread page where the post
* is present. * is present.
*/ */
F95_POSTS: string; POSTS: string;
/** /**
* @todo * @todo
*/ */
F95_CONVERSATIONS: string; CONVERSATIONS: string;
/** /**
* @todo * @todo
*/ */
F95_ALERTS: string; ALERTS: string;
F95_POSTS_NUMBER: string; POSTS_NUMBER: string;
F95_MEMBERS: string; MEMBERS: string;
}; };

View File

@ -148,7 +148,7 @@ export default class PlatformUser {
if (!this.id && this.id < 1) throw new Error("Invalid user ID"); if (!this.id && this.id < 1) throw new Error("Invalid user ID");
// Prepare the URL // Prepare the URL
const url = new URL(this.id.toString(), `${urls.F95_MEMBERS}/`).toString(); const url = new URL(this.id.toString(), `${urls.MEMBERS}/`).toString();
// Fetch the page // Fetch the page
const htmlResponse = await fetchHTML(url); const htmlResponse = await fetchHTML(url);

View File

@ -96,7 +96,7 @@ export default class Post {
*/ */
public async fetch(): Promise<void> { public async fetch(): Promise<void> {
// Fetch HTML page containing the post // Fetch HTML page containing the post
const url = new URL(this.id.toString(), urls.F95_POSTS).toString(); const url = new URL(this.id.toString(), urls.POSTS).toString();
const htmlResponse = await fetchHTML(url); const htmlResponse = await fetchHTML(url);
if (htmlResponse.isSuccess()) { if (htmlResponse.isSuccess()) {

View File

@ -139,7 +139,7 @@ export default class Thread {
}; };
// Send POST request // Send POST request
const response = await fetchPOSTResponse(urls.F95_POSTS_NUMBER, params); const response = await fetchPOSTResponse(urls.POSTS_NUMBER, params);
if (response.isFailure()) throw response.value; if (response.isFailure()) throw response.value;
} }
@ -238,7 +238,7 @@ export default class Thread {
*/ */
public async fetch(): Promise<void> { public async fetch(): Promise<void> {
// Prepare the url // Prepare the url
this._url = new URL(this.id.toString(), urls.F95_THREADS).toString(); this._url = new URL(this.id.toString(), urls.THREADS).toString();
// Fetch the HTML source // Fetch the HTML source
const htmlResponse = await fetchHTML(this.url); const htmlResponse = await fetchHTML(this.url);

View File

@ -105,7 +105,7 @@ export default class UserProfile extends PlatformUser {
private async fetchUserID(): Promise<number> { private async fetchUserID(): Promise<number> {
// Local variables // Local variables
const url = new URL(urls.F95_BASE_URL).toString(); const url = new URL(urls.BASE).toString();
// fetch and parse page // fetch and parse page
const htmlResponse = await fetchHTML(url); const htmlResponse = await fetchHTML(url);
@ -120,7 +120,7 @@ export default class UserProfile extends PlatformUser {
private async fetchWatchedThread(): Promise<IWatchedThread[]> { private async fetchWatchedThread(): Promise<IWatchedThread[]> {
// Prepare and fetch URL // Prepare and fetch URL
const url = new URL(urls.F95_WATCHED_THREADS); const url = new URL(urls.WATCHED_THREADS);
url.searchParams.set("unread", "0"); url.searchParams.set("unread", "0");
const htmlResponse = await fetchHTML(url.toString()); const htmlResponse = await fetchHTML(url.toString());
@ -177,10 +177,7 @@ export default class UserProfile extends PlatformUser {
.map((idx, el) => { .map((idx, el) => {
// Parse the URL // Parse the URL
const partialURL = $(el).find(WATCHED_THREAD.URL).attr("href"); const partialURL = $(el).find(WATCHED_THREAD.URL).attr("href");
const url = new URL( const url = new URL(partialURL.replace("unread", ""), `${urls.BASE}`).toString();
partialURL.replace("unread", ""),
`${urls.F95_BASE_URL}`
).toString();
return { return {
url: url.toString(), url: url.toString(),

View File

@ -110,7 +110,7 @@ export default class LatestSearchQuery implements IQuery {
*/ */
private prepareGETurl(): URL { private prepareGETurl(): URL {
// Create the URL // Create the URL
const url = new URL(urls.F95_LATEST_PHP); const url = new URL(urls.LATEST_PHP);
url.searchParams.set("cmd", "list"); url.searchParams.set("cmd", "list");
// Set the category // Set the category

View File

@ -88,7 +88,7 @@ export default class ThreadSearchQuery implements IQuery {
const params = this.preparePOSTParameters(); const params = this.preparePOSTParameters();
// Return the POST response // Return the POST response
return fetchPOSTResponse(urls.F95_SEARCH_URL, params); return fetchPOSTResponse(urls.SEARCH, params);
} }
//#endregion Public methods //#endregion Public methods

View File

@ -4,29 +4,66 @@
// https://opensource.org/licenses/MIT // https://opensource.org/licenses/MIT
export const urls = { export const urls = {
F95_BASE_URL: "https://f95zone.to", /**
F95_2FA_LOGIN: "https://f95zone.to/login/two-step", * Page with the list of alerts for the user currently logged.
F95_SEARCH_URL: "https://f95zone.to/search/search/", */
F95_LATEST_UPDATES: "https://f95zone.to/latest", ALERTS: "https://f95zone.to/account/alerts",
F95_THREADS: "https://f95zone.to/threads/", /**
F95_LOGIN_URL: "https://f95zone.to/login/login", * Basic URL of the platform.
F95_WATCHED_THREADS: "https://f95zone.to/watched/threads", */
F95_LATEST_PHP: "https://f95zone.to/new_latest.php", BASE: "https://f95zone.to",
F95_BOOKMARKS: "https://f95zone.to/account/bookmarks", /**
* Page with the list of favorite posts of the user currently logged.
*/
BOOKMARKS: "https://f95zone.to/account/bookmarks",
/**
* Page with the list of conversations of the currently logged user.
*/
CONVERSATIONS: "https://f95zone.to/conversations/",
/**
* URL of the script used for searching for content
* in the "Latest Updates" section of the platform.
*/
LATEST_PHP: "https://f95zone.to/new_latest.php",
/**
* Page with the latest updated platform content.
*/
LATEST_UPDATES: "https://f95zone.to/latest",
/**
* Page used for user login.
*/
LOGIN: "https://f95zone.to/login/login",
/**
* Page used for entering the OTP code in the case of two-factor authentication.
*/
LOGIN_2FA: "https://f95zone.to/login/two-step",
/**
* Summary page of users registered on the platform.
* Used for the search for a specific member through ID.
*/
MEMBERS: "https://f95zone.to/members",
/** /**
* Add the unique ID of the post to * Add the unique ID of the post to
* get the thread page where the post * get the thread page where the post
* is present. * is present.
*/ */
F95_POSTS: "https://f95zone.to/posts/", POSTS: "https://f95zone.to/posts/",
/** /**
* @todo * URL used to send a POST request and change
* the number of posts that can be viewed per
* page of a specific thread.
*/ */
F95_CONVERSATIONS: "https://f95zone.to/conversations/", POSTS_NUMBER: "https://f95zone.to/account/dpp-update",
/** /**
* @todo * URL used to search the platform by POST request.
*/ */
F95_ALERTS: "https://f95zone.to/account/alerts", SEARCH: "https://f95zone.to/search/search/",
F95_POSTS_NUMBER: "https://f95zone.to/account/dpp-update", /**
F95_MEMBERS: "https://f95zone.to/members" * Add the unique ID of the thread to get it's page.
*/
THREADS: "https://f95zone.to/threads/",
/**
* Page with the list of watched threads of the currently logged user.
*/
WATCHED_THREADS: "https://f95zone.to/watched/threads"
}; };

View File

@ -41,7 +41,7 @@ export default async function fetchLatestHandiworkURLs(
data.map((e, idx) => { data.map((e, idx) => {
if (fetchedResults < limit) { if (fetchedResults < limit) {
const gameURL = new URL(e.thread_id.toString(), urls.F95_THREADS).href; const gameURL = new URL(e.thread_id.toString(), urls.THREADS).href;
resultURLs.push(gameURL); resultURLs.push(gameURL);
fetchedResults += 1; fetchedResults += 1;

View File

@ -58,7 +58,7 @@ export default async function fetchPlatformData(): Promise<void> {
// Check if the data are cached // Check if the data are cached
if (!readCache(shared.cachePath)) { if (!readCache(shared.cachePath)) {
// Load the HTML // Load the HTML
const html = await fetchHTML(f95url.F95_LATEST_UPDATES); const html = await fetchHTML(f95url.LATEST_UPDATES);
// Parse data // Parse data
if (html.isSuccess()) { if (html.isSuccess()) {

View File

@ -77,7 +77,7 @@ function extractLinkFromResult(selector: cheerio.Cheerio): string {
const partialLink = selector.find(THREAD_SEARCH.THREAD_TITLE).attr("href").trim(); const partialLink = selector.find(THREAD_SEARCH.THREAD_TITLE).attr("href").trim();
// Compose and return the URL // Compose and return the URL
return new URL(partialLink, f95urls.F95_BASE_URL).toString(); return new URL(partialLink, f95urls.BASE).toString();
} }
//#endregion Private methods //#endregion Private methods

View File

@ -98,7 +98,7 @@ export async function authenticate(
throw new InvalidF95Token(`Invalid token for auth: ${credentials.token}`); throw new InvalidF95Token(`Invalid token for auth: ${credentials.token}`);
// Secure the URL // Secure the URL
const secureURL = enforceHttpsUrl(urls.F95_LOGIN_URL); const secureURL = enforceHttpsUrl(urls.LOGIN);
// Prepare the parameters to send to the platform to authenticate // Prepare the parameters to send to the platform to authenticate
const params = { const params = {
@ -117,7 +117,7 @@ export async function authenticate(
let authResult: LoginResult = null; let authResult: LoginResult = null;
try { try {
// Fetch the response to the login request // Fetch the response to the login request
const response = await fetchPOSTResponse(urls.F95_LOGIN_URL, params, force); const response = await fetchPOSTResponse(urls.LOGIN, params, force);
// Parse the response // Parse the response
const result = response.applyOnSuccess((r) => manageLoginPOSTResponse(r)); const result = response.applyOnSuccess((r) => manageLoginPOSTResponse(r));
@ -149,7 +149,7 @@ export async function send2faCode(
): Promise<Result<GenericAxiosError, LoginResult>> { ): Promise<Result<GenericAxiosError, LoginResult>> {
// Prepare the parameters to send via POST request // Prepare the parameters to send via POST request
const params = { const params = {
_xfRedirect: urls.F95_BASE_URL, _xfRedirect: urls.BASE,
_xfRequestUri: "/login/two-step?_xfRedirect=https%3A%2F%2Ff95zone.to%2F&remember=1", _xfRequestUri: "/login/two-step?_xfRedirect=https%3A%2F%2Ff95zone.to%2F&remember=1",
_xfResponseType: "json", _xfResponseType: "json",
_xfToken: token, _xfToken: token,
@ -162,7 +162,7 @@ export async function send2faCode(
}; };
// Send 2FA params // Send 2FA params
const response = await fetchPOSTResponse(urls.F95_2FA_LOGIN, params); const response = await fetchPOSTResponse(urls.LOGIN_2FA, params);
return response.applyOnSuccess((r: AxiosResponse<any>) => { return response.applyOnSuccess((r: AxiosResponse<any>) => {
// r.data.status is 'ok' if the authentication is successful // r.data.status is 'ok' if the authentication is successful
const result = r.data.status === "ok"; const result = r.data.status === "ok";
@ -182,7 +182,7 @@ export async function send2faCode(
*/ */
export async function getF95Token(): Promise<string> { export async function getF95Token(): Promise<string> {
// Fetch the response of the platform // Fetch the response of the platform
const response = await fetchGETResponse(urls.F95_LOGIN_URL); const response = await fetchGETResponse(urls.LOGIN);
if (response.isSuccess()) { if (response.isSuccess()) {
// The response is a HTML page, we need to find the <input> with name "_xfToken" // The response is a HTML page, we need to find the <input> with name "_xfToken"
@ -274,7 +274,7 @@ export function enforceHttpsUrl(url: string): string {
* Check if the url belongs to the domain of the F95 platform. * Check if the url belongs to the domain of the F95 platform.
*/ */
export function isF95URL(url: string): boolean { export function isF95URL(url: string): boolean {
return url.toString().startsWith(urls.F95_BASE_URL); return url.toString().startsWith(urls.BASE);
} }
/** /**
@ -358,7 +358,7 @@ function manageLoginPOSTResponse(response: AxiosResponse<any>) {
const $ = cheerio.load(response.data as string); const $ = cheerio.load(response.data as string);
// Check if 2 factor authentication is required // Check if 2 factor authentication is required
if (response.config.url.startsWith(urls.F95_2FA_LOGIN)) { if (response.config.url.startsWith(urls.LOGIN_2FA)) {
return new LoginResult( return new LoginResult(
false, false,
LoginResult.REQUIRE_2FA, LoginResult.REQUIRE_2FA,