UNPKG

@techtalkers/codeforces

Version:

A package to extract codeforeces metadata

49 lines (48 loc) 2.58 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 fetchCodeForcesData(name) { return __awaiter(this, void 0, void 0, function* () { const url = `https://codeforces.com/profile/${name}`; const data = yield fetch(url); if (!data.ok) { throw new Error(`Error in getting codeforces data for ${name} ${data.status} ${url} ${data.statusText}`); } else { let content = yield data.text(); let $ = cheerio.load(content); const CodeForcesMetadata = { username: $("h1 > a.rated-user").text().toString().trim(), rank: $("div[class='user-rank']").text().toString().trim(), rating: Number($("li:contains('Contest rating:') span[style='font-weight:bold;']").first().text().trim()), max_rating: Number($("span.smaller span[style='font-weight:bold;']").last().text().trim()), contributions: $("li:contains('Contribution:') span").text().toString().trim(), friend_of: $("li:contains('Friend of:')").text().toString().trim().split(':')[1].trim(), image_url: $("div[style*='float:right'] img").attr("src"), last_visit: $("li:contains('Last visit:') span").text().trim(), created_at: $("li:contains('Registered:') span").text().trim(), }; return CodeForcesMetadata; } }); } ; function checkCodeForcesUsername(username) { return __awaiter(this, void 0, void 0, function* () { const url = `https://codeforces.com/profile/${username}`; const data = yield fetch(url); if (!data.ok) { console.log(`Error in getting codeforces data for ${username} ${data.status} ${url} ${data.statusText}`); return false; } return true; }); } export { fetchCodeForcesData, checkCodeForcesUsername };