Skip to content

Commit 35525e1

Browse files
committed
fix fetcher service
1 parent 0077afe commit 35525e1

File tree

5 files changed

+46
-14
lines changed

5 files changed

+46
-14
lines changed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
"packages/*"
77
],
88
"scripts": {
9-
"start:client": "node -r ./register.js packages/client/index.ts",
10-
"start:server": "node -r ./register.js packages/server/index.ts",
9+
"start:client": "node -r ./register.js packages/client/index.ts --debug",
10+
"start:server": "node -r ./register.js packages/server/index.ts --debug",
1111
"lint": "eslint packages --ext js,ts,tsx,jsx",
1212
"build": "yarn build:ui:prod && node -r ./register.js build.ts",
1313
"build:pkg": "yarn build:ui:prod && node -r ./register.js build.ts && pkg dist/xcpc-tools.js --targets linux,macos,win --out-path dist/pkg"

packages/server/config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,4 @@ export const saveConfig = () => {
8585

8686
logger.info(`Config loaded from ${configPath}`);
8787
logger.info(`xcpc-tools version: ${version}`);
88-
if (!isClient && !exit) logger.info(`Server View User Info: admin/${config.viewPass}`);
88+
if (!isClient && !exit) logger.info(`Server View User Info: admin / ${config.viewPass}`);

packages/server/index.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,8 @@ try {
2424
async function applyServer(ctx: Context) {
2525
ctx.plugin(require('./service/server'));
2626
ctx.plugin((require('./service/db')).default);
27-
if (config.type !== 'server') {
28-
logger.info('Fetch mode: ', config.type);
29-
ctx.plugin(require('./service/fetcher').fetchers[config.type]);
30-
}
31-
ctx.inject(['server', 'dbservice'], (c) => {
27+
ctx.plugin(require('./service/fetcher'));
28+
ctx.inject(['server', 'dbservice', 'fetcher'], (c) => {
3229
c.plugin(require('./handler/misc'));
3330
c.plugin(require('./handler/printer'));
3431
c.plugin(require('./handler/monitor'));

packages/server/service/fetcher.ts

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,15 @@ import { Logger } from '../utils';
77
const logger = new Logger('fetcher');
88
const fetch = (url: string, type: 'get' | 'post' = 'get') => superagent[type](new URL(url, config.server).toString())
99
.set('Authorization', config.token).set('Accept', 'application/json');
10-
11-
class DomJudgeFetcher extends Service {
10+
export interface IBasicFetcher {
11+
contest: Record<string, any>
12+
cron(): Promise<void>
13+
contestInfo(): Promise<boolean>
14+
teamInfo?(): Promise<void>
15+
balloonInfo?(all: boolean): Promise<void>
16+
setBalloonDone?(bid: string): Promise<void>
17+
}
18+
class BasicFetcher extends Service implements IBasicFetcher {
1219
contest: any;
1320
constructor(ctx: Context) {
1421
super(ctx, 'fetcher', true);
@@ -23,6 +30,27 @@ class DomJudgeFetcher extends Service {
2330
await this.balloonInfo(first);
2431
}
2532

33+
async contestInfo() {
34+
const old = this?.contest?.id;
35+
this.contest = { name: 'No Contest', id: 'server-mode' };
36+
return old === this.contest.id;
37+
}
38+
39+
async teamInfo() {
40+
logger.debug('Found 0 teams');
41+
}
42+
43+
async balloonInfo(all) {
44+
logger.debug(all ? 'Sync all balloons...' : 'Sync new balloons...');
45+
logger.debug('Found 0 balloons in Server Mode');
46+
}
47+
48+
async setBalloonDone(bid) {
49+
logger.debug(`Balloon ${bid} set done`);
50+
}
51+
}
52+
53+
class DomJudgeFetcher extends BasicFetcher {
2654
async contestInfo() {
2755
const { body } = await fetch('/api/v4/contests?onlyActive=true');
2856
if (!body || !body.length) {
@@ -46,7 +74,7 @@ class DomJudgeFetcher extends Service {
4674
for (const team of teams) {
4775
await this.ctx.db.teams.update({ id: team.id }, { $set: team }, { upsert: true });
4876
}
49-
logger.info(`Found ${teams.length} teams`);
77+
logger.debug(`Found ${teams.length} teams`);
5078
}
5179

5280
async balloonInfo(all) {
@@ -84,19 +112,25 @@ class DomJudgeFetcher extends Service {
84112
},
85113
}, { upsert: true });
86114
}
87-
logger.info(`Found ${balloons.length} balloons`);
115+
logger.debug(`Found ${balloons.length} balloons`);
88116
}
89117

90118
async setBalloonDone(bid) {
91119
await fetch(`/api/v4/contests/${this.contest.id}/balloons/${bid}/done`, 'post');
92-
logger.info(`Balloon ${bid} set done`);
120+
logger.debug(`Balloon ${bid} set done`);
93121
}
94122
}
95123

96124
const fetcherList = {
125+
server: BasicFetcher,
97126
domjudge: DomJudgeFetcher,
127+
hydro: BasicFetcher, // TODO: HydroFetcher
98128
};
99129

100130
export async function apply(ctx) {
101-
if (config.token && config.server) ctx.plugin(fetcherList[config.type]);
131+
if (config.type !== 'server') {
132+
logger.info('Fetch mode: ', config.type);
133+
}
134+
ctx.provide('fetcher', undefined, true);
135+
ctx.fetcher = await new fetcherList[config.type](ctx);
102136
}

packages/server/utils.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ export async function remoteRunner(user: string, target: string, targetPort: str
133133
}
134134

135135
export function decodeBinary(file: string) {
136+
if (process.env.NODE_ENV === 'development') return Buffer.from(file, 'base64');
136137
const buf = decode(file);
137138
return gunzipSync(buf);
138139
}

0 commit comments

Comments
 (0)