From 62cc229724b25739e47cf75f12bb370736457c45 Mon Sep 17 00:00:00 2001 From: undefined Date: Mon, 28 Jun 2021 12:02:52 +0800 Subject: [PATCH] vjudge: allow proxy --- packages/vjudge/package.json | 8 +++++--- packages/vjudge/src/interface.ts | 1 + packages/vjudge/src/model.ts | 16 +++++++++++++--- packages/vjudge/src/providers/codeforces.ts | 17 +++++++++++++---- 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/packages/vjudge/package.json b/packages/vjudge/package.json index a242a8cb0..c8c480ac2 100644 --- a/packages/vjudge/package.json +++ b/packages/vjudge/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/vjudge", - "version": "1.0.14", + "version": "1.0.15", "description": "Submit problems to remote oj", "main": "package.json", "repository": "https://github.com/hydro-dev/Hydro.git", @@ -10,9 +10,11 @@ "dependencies": { "@hydrooj/utils": "workspace:*", "jsdom": "^16.6.0", - "superagent": "^6.1.0" + "superagent": "^6.1.0", + "superagent-proxy": "^2.1.0" }, "devDependencies": { - "@types/jsdom": "^16.2.11" + "@types/jsdom": "^16.2.11", + "@types/superagent-proxy": "^2.0.0" } } diff --git a/packages/vjudge/src/interface.ts b/packages/vjudge/src/interface.ts index 0cae96675..8aaf8b506 100644 --- a/packages/vjudge/src/interface.ts +++ b/packages/vjudge/src/interface.ts @@ -5,6 +5,7 @@ export interface RemoteAccount { handle: string; password: string; endpoint?: string; + proxy?: string; } declare module 'hydrooj/dist/interface' { interface Collections { diff --git a/packages/vjudge/src/model.ts b/packages/vjudge/src/model.ts index 506b2273a..6914b5f95 100644 --- a/packages/vjudge/src/model.ts +++ b/packages/vjudge/src/model.ts @@ -61,10 +61,20 @@ class Service { } } - async main() { + async login() { const login = await this.api.ensureLogin(); - if (login) logger.info(`${this.account.type}/${this.account.handle}: logged in`); - else return; + if (login) { + logger.info(`${this.account.type}/${this.account.handle}: logged in`); + return true; + } + logger.warn(`${this.account.type}/${this.account.handle}: login fail`); + return false; + } + + async main() { + const res = await this.login(); + if (!res) return; + setInterval(() => this.login(), 1 * 3600 * 1000); TaskModel.consume({ type: 'remotejudge', subType: this.account.type }, this.judge.bind(this)); const ddocs = await DomainModel.getMulti({ mount: this.account.type }).toArray(); for (const ddoc of ddocs) { diff --git a/packages/vjudge/src/providers/codeforces.ts b/packages/vjudge/src/providers/codeforces.ts index 91c8d00b3..df1859971 100644 --- a/packages/vjudge/src/providers/codeforces.ts +++ b/packages/vjudge/src/providers/codeforces.ts @@ -1,5 +1,6 @@ /* eslint-disable no-await-in-loop */ -import superagent from 'superagent'; +import * as superagent from 'superagent'; +import proxy from 'superagent-proxy'; import { JSDOM } from 'jsdom'; import { STATUS } from '@hydrooj/utils/lib/status'; import { sleep } from '@hydrooj/utils/lib/utils'; @@ -9,6 +10,7 @@ import { Logger } from 'hydrooj/dist/logger'; import { PassThrough } from 'stream'; import { IBasicProvider, RemoteAccount } from '../interface'; +proxy(superagent); const logger = new Logger('codeforces'); const VERDICT = { @@ -38,12 +40,18 @@ export default class CodeforcesProvider implements IBasicProvider { get(url: string) { logger.debug('get', url); - return superagent.get(`${this.account.endpoint || 'https://codeforces.com'}${url}`).set('Cookie', this.cookie); + if (!url.includes('//')) url = `${this.account.endpoint || 'https://codeforces.com'}${url}`; + const req = superagent.get(url).set('Cookie', this.cookie); + if (this.account.proxy) return req.proxy(this.account.proxy); + return req; } post(url: string) { logger.debug('post', url, this.cookie); - return superagent.post(`${this.account.endpoint || 'https://codeforces.com'}${url}`).type('form').set('Cookie', this.cookie); + if (!url.includes('//')) url = `${this.account.endpoint || 'https://codeforces.com'}${url}`; + const req = superagent.post(url).type('form').set('Cookie', this.cookie); + if (this.account.proxy) return req.proxy(this.account.proxy); + return req; } tta(_39ce7: string) { @@ -89,6 +97,7 @@ export default class CodeforcesProvider implements IBasicProvider { password: this.account.password, remember: 'on', }); + console.log(res.header); const cookie = res.header['set-cookie']; if (cookie) { await this.save({ cookie }); @@ -130,7 +139,7 @@ export default class CodeforcesProvider implements IBasicProvider { const src = ele.getAttribute('src'); if (!src.startsWith('http')) return; const file = new PassThrough(); - superagent.get(src).pipe(file); + this.get(src).pipe(file); const fid = String.random(8); files[`${fid}.png`] = file; ele.setAttribute('src', `file://${fid}.png`);