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