@techtalkers/codechef
Version:
A package to extract codechef metadata.
52 lines (51 loc) • 2.74 kB
JavaScript
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 };