UNPKG

@techtalkers/codechef

Version:

A package to extract codechef metadata.

52 lines (51 loc) 2.74 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import * as cheerio from 'cheerio'; function fetchCodechefData(name) { return __awaiter(this, void 0, void 0, function* () { const url = `https://www.codechef.com/users/${name}`; const data = yield fetch(url); if (!data.ok) { throw new Error(`Error in getting codeChef data for ${name} ${data.status} ${url} ${data.statusText}`); } else { let content = yield data.text(); let $ = cheerio.load(content); const codeChefMetadata = { name: $("h1[class='h2-style']").text().trim(), rating: Number($("span[class='rating']").text().trim()[0]), codeChef_rating: Number($("div[class='rating-number']").contents().first().text().trim().replace("?", "")), codechef_username: $("span.m-username--link").text().trim(), image_url: $("img[class='profileImage']").attr("src"), institution: $("li:contains('Institution:') span").text().trim(), designation: $("li:contains('Student/Professional:') span").text().toString().trim(), country: $("li:contains('Country:') span.user-country-name").text().trim(), global_rank: Number($("a[href='/ratings/all']").text().trim()), country_rank: Number($("li:contains('Country Rank') strong").text().trim()) }; if (codeChefMetadata.name === "") { throw new Error(`User ${name} does not exist on codeChef`); } return codeChefMetadata; } }); } function checkCodeChefUsername(username) { return __awaiter(this, void 0, void 0, function* () { const url = `https://www.codechef.com/users/${username}`; const data = yield fetch(url); if (!data.ok) { console.log(`Error in getting codeChef data for ${username} ${data.status} ${url} ${data.statusText}`); return false; } return true; }); } export { fetchCodechefData, checkCodeChefUsername };