Removed in favour of user-profile.ts
							parent
							
								
									715096bc3b
								
							
						
					
					
						commit
						b2ce7a61b4
					
				| 
						 | 
					@ -1,126 +0,0 @@
 | 
				
			||||||
"use strict";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Public modules from npm
 | 
					 | 
				
			||||||
import cheerio from "cheerio";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Modules from file
 | 
					 | 
				
			||||||
import { fetchHTML } from "../network-helper.js";
 | 
					 | 
				
			||||||
import { selectors as f95Selector } from "../constants/css-selector.js";
 | 
					 | 
				
			||||||
import { urls as f95url } from "../constants/url.js";
 | 
					 | 
				
			||||||
import UserData from "../classes/user-data.js";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Gets user data, such as username, url of watched threads, and profile picture url.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
export async function getUserData(): Promise<UserData> {
 | 
					 | 
				
			||||||
    // Fetch data
 | 
					 | 
				
			||||||
    const data = await fetchUsernameAndAvatar();
 | 
					 | 
				
			||||||
    const urls = await fetchWatchedGameThreadURLs();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Create object
 | 
					 | 
				
			||||||
    const ud = new UserData();
 | 
					 | 
				
			||||||
    ud.username = data.username;
 | 
					 | 
				
			||||||
    ud.avatar = data.source;
 | 
					 | 
				
			||||||
    ud.watched = urls;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return ud;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//#region Private methods
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * It connects to the page and extracts the name 
 | 
					 | 
				
			||||||
 * of the currently logged in user and the URL 
 | 
					 | 
				
			||||||
 * of their profile picture.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
async function fetchUsernameAndAvatar(): Promise<{ [s: string]: string; }> {
 | 
					 | 
				
			||||||
    // Fetch page
 | 
					 | 
				
			||||||
    const html = await fetchHTML(f95url.F95_BASE_URL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (html.isSuccess()) {
 | 
					 | 
				
			||||||
        // Load HTML response
 | 
					 | 
				
			||||||
        const $ = cheerio.load(html.value);
 | 
					 | 
				
			||||||
        const body = $("body");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // Fetch username
 | 
					 | 
				
			||||||
        const username = body.find(f95Selector.UD_USERNAME_ELEMENT).first().text().trim();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // Fetch user avatar image source
 | 
					 | 
				
			||||||
        const source = body.find(f95Selector.UD_AVATAR_PIC).first().attr("src");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return {
 | 
					 | 
				
			||||||
            username,
 | 
					 | 
				
			||||||
            source
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
    } else throw html.value;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Gets the list of URLs of game threads watched by the user.
 | 
					 | 
				
			||||||
 * @returns {Promise<String[]>} List of URLs
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
async function fetchWatchedGameThreadURLs(): Promise<string[]> {
 | 
					 | 
				
			||||||
    // Local variables
 | 
					 | 
				
			||||||
    const watchedGameThreadURLs = [];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Get the first page with the "unread" flag disabled
 | 
					 | 
				
			||||||
    // and searching only the games forum
 | 
					 | 
				
			||||||
    const firstPageURL = new URL(f95url.F95_WATCHED_THREADS);
 | 
					 | 
				
			||||||
    firstPageURL.searchParams.append("unread", "0");
 | 
					 | 
				
			||||||
    firstPageURL.searchParams.append("nodes[0]", "2"); // This is the forum filter
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Set the variable containing the current scraped page
 | 
					 | 
				
			||||||
    let currentURL = firstPageURL.href;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    do {
 | 
					 | 
				
			||||||
        // Fetch page
 | 
					 | 
				
			||||||
        const html = await fetchHTML(currentURL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (html.isSuccess()) {
 | 
					 | 
				
			||||||
            // Load HTML response
 | 
					 | 
				
			||||||
            const $ = cheerio.load(html.value);
 | 
					 | 
				
			||||||
            const body = $("body");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Find the URLs
 | 
					 | 
				
			||||||
            const urls = fetchPageURLs(body);
 | 
					 | 
				
			||||||
            watchedGameThreadURLs.push(...urls);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Find the next page (if any)
 | 
					 | 
				
			||||||
            currentURL = fetchNextPageURL(body);
 | 
					 | 
				
			||||||
        } else throw html.value;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    while (currentURL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return watchedGameThreadURLs;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Gets the URLs of the watched threads on the page.
 | 
					 | 
				
			||||||
 * @param {cheerio.Cheerio} body Page `body` selector
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
function fetchPageURLs(body: cheerio.Cheerio): string[] {
 | 
					 | 
				
			||||||
    const elements = body.find(f95Selector.WT_URLS);
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    return elements.map(function extractURLs(idx, e) {
 | 
					 | 
				
			||||||
        // Obtain the link (replace "unread" only for the unread threads)
 | 
					 | 
				
			||||||
        const partialLink = cheerio(e).attr("href").replace("unread", "");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // Compose and return the URL
 | 
					 | 
				
			||||||
        return new URL(partialLink, f95url.F95_BASE_URL).toString();
 | 
					 | 
				
			||||||
    }).get();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Gets the URL of the next page containing the watched threads 
 | 
					 | 
				
			||||||
 * or `null` if that page does not exist.
 | 
					 | 
				
			||||||
 * @param {cheerio.Cheerio} body Page `body` selector
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
function fetchNextPageURL(body: cheerio.Cheerio): string {
 | 
					 | 
				
			||||||
    const element = body.find(f95Selector.WT_NEXT_PAGE).first();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // No element found
 | 
					 | 
				
			||||||
    if(element.length === 0) return null;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Compose and return the URL
 | 
					 | 
				
			||||||
    return new URL(element.attr("href"), f95url.F95_BASE_URL).toString();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
//#endregion Private methods
 | 
					 | 
				
			||||||
		Loading…
	
		Reference in New Issue