diff --git a/packages/vjudge/package.json b/packages/vjudge/package.json index 5ea0a9708..f8e380346 100644 --- a/packages/vjudge/package.json +++ b/packages/vjudge/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/vjudge", - "version": "1.5.0-next.1", + "version": "1.5.0-next.2", "description": "Submit problems to remote oj", "main": "package.json", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/vjudge/src/model.ts b/packages/vjudge/src/model.ts index dc3bfa506..eb723b0c5 100644 --- a/packages/vjudge/src/model.ts +++ b/packages/vjudge/src/model.ts @@ -23,7 +23,7 @@ class Service { this.api = new Provider(account, async (data) => { await coll.updateOne({ _id: account._id }, { $set: data }); }); - this.main(); + this.main().catch((e) => logger.error(`Error occured in ${account.type}/${account.handle}`, e)); } async judge(task) { @@ -36,6 +36,7 @@ class Service { await next({ status: STATUS.STATUS_JUDGING, message: `ID = ${rid}` }); await this.api.waitForSubmission(rid, next, end); } catch (e) { + if (process.env.DEV) logger.error(e); end({ status: STATUS.STATUS_SYSTEM_ERROR, message: e.message }); } } diff --git a/packages/vjudge/src/providers/codeforces.ts b/packages/vjudge/src/providers/codeforces.ts index 53e0c9aac..06e0ec934 100644 --- a/packages/vjudge/src/providers/codeforces.ts +++ b/packages/vjudge/src/providers/codeforces.ts @@ -57,6 +57,8 @@ export default class CodeforcesProvider implements IBasicProvider { async getPage() { const page = await this.puppeteer.newPage(); + const url = await page.openPortal(); + logger.info('portal=', url); for (const str of this.cookie) { const [name, value] = str.split(';')[0].split('='); await page.setCookie({ name, value, domain: 'codeforces.com' }); @@ -65,7 +67,11 @@ export default class CodeforcesProvider implements IBasicProvider { } async clearPage(page: Page) { - const cookies = await page.cookies(); + let cookies = await page.cookies(); + while (!cookies.find((i) => i.name === 'evercookie_etag').value) { + await sleep(1000); + cookies = await page.cookies(); + } this.cookie = cookies.map((i) => `${i.name}=${i.value}`); await this.save({ cookie: this.cookie }); await page.close(); @@ -106,11 +112,19 @@ export default class CodeforcesProvider implements IBasicProvider { async checkLogin() { await this.ensureBrowser(); const page = await this.getPage(); - await page.goto(`${this.account.endpoint}/enter`); + await page.goto(`${this.account.endpoint}/enter`, { waitUntil: 'networkidle2' }); const html = await page.content(); - const cookies = await page.cookies(); - this.cookie = cookies.map((i) => `${i.name}=${i.value}`); - await this.save({ cookie: this.cookie }); + let cookies = await page.cookies(); + let c = 0; + while (!cookies.find((i) => i.name === 'evercookie_etag').value && c <= 60) { + await sleep(1000); + cookies = await page.cookies(); + c++; + } + if (c < 60) { + this.cookie = cookies.map((i) => `${i.name}=${i.value}`); + await this.save({ cookie: this.cookie }); + } const ftaa = cookies.find((i) => i.name === '70a7c28f3de')?.value; const bfaa = /_bfaa = "(.{32})"/.exec(html)?.[1]; await page.close(); @@ -164,7 +178,7 @@ export default class CodeforcesProvider implements IBasicProvider { async puppeteerLogin() { if (!this.puppeteer) return false; const page = await this.puppeteer.newPage(); - await page.goto(`${this.account.endpoint}/enter`); + await page.goto(`${this.account.endpoint}/enter`, { waitUntil: 'networkidle2' }); const url = await page.openPortal(); logger.info(`Login portal opened: ${url}`); await page.waitForRequest((req) => { @@ -184,6 +198,7 @@ export default class CodeforcesProvider implements IBasicProvider { logger.info('retry normal login'); await this.normalLogin(); if (await this.loggedIn) return true; + if (!this.puppeteer) return false; logger.info('starting puppeteer login'); await this.puppeteerLogin(); if (await this.loggedIn) return true;