2
2
import { Context , Service } from 'cordis' ;
3
3
import superagent from 'superagent' ;
4
4
import { config } from '../config' ;
5
- import { Logger , mongoId , sleep } from '../utils' ;
5
+ import { fs , Logger , mongoId , sleep } from '../utils' ;
6
+ import path from 'node:path' ;
6
7
7
8
const logger = new Logger ( 'fetcher' ) ;
8
9
const fetch = ( url : string , type : 'get' | 'post' = 'get' ) => {
@@ -57,6 +58,7 @@ class BasicFetcher extends Service implements IBasicFetcher {
57
58
const first = await this . contestInfo ( ) ;
58
59
if ( first ) await this . teamInfo ( ) ;
59
60
await this . balloonInfo ( first ) ;
61
+ await this . printInfo ( first ) ;
60
62
}
61
63
62
64
async contestInfo ( ) {
@@ -81,6 +83,14 @@ class BasicFetcher extends Service implements IBasicFetcher {
81
83
async setBalloonDone ( bid ) {
82
84
this . logger . debug ( `Balloon ${ bid } set done` ) ;
83
85
}
86
+
87
+ async printInfo ( all ) {
88
+ this . logger . debug ( 'Found 0 prints in Server Mode' ) ;
89
+ }
90
+
91
+ async setPrintDone ( pid ) {
92
+ this . logger . debug ( `Print ${ pid } set done` ) ;
93
+ }
84
94
}
85
95
86
96
class DOMjudgeFetcher extends BasicFetcher {
@@ -177,6 +187,7 @@ class HydroFetcher extends BasicFetcher {
177
187
}
178
188
const contest = body . tdoc ;
179
189
contest . freeze_time = contest . lockAt ;
190
+ delete contest . content ;
180
191
const old = this ?. contest ?. id ;
181
192
this . contest = {
182
193
info : contest , id : contest . _id , name : contest . title , domainId,
@@ -252,6 +263,39 @@ class HydroFetcher extends BasicFetcher {
252
263
await fetch ( `/d/${ this . contest . domainId } /contest/${ this . contest . id } /balloon` , 'post' ) . send ( { operation : 'done' , balloon : bid } ) ;
253
264
this . logger . debug ( `Balloon ${ bid } set done` ) ;
254
265
}
266
+
267
+ async printInfo ( all ) {
268
+ const doFetch = async ( ) => {
269
+ const { body } = await fetch ( `/d/${ this . contest . domainId } /contest/${ this . contest . id } /print` , 'post' ) . send ( { operation : 'allocate_print_task' } ) ;
270
+ return body ;
271
+ }
272
+ let { task, udoc } = await doFetch ( ) ;
273
+ let cnt = 0 ;
274
+ while ( task ) {
275
+ const res = await this . ctx . db . code . insert ( {
276
+ id : task . _id ,
277
+ tid : task . owner ,
278
+ team : `${ udoc . school ? `${ udoc . school } : ` : '' } ${ udoc . displayName || udoc . uname } ` ,
279
+ location : udoc . studentId ,
280
+ filename : task . title ,
281
+ lang : task . title . split ( '.' ) . pop ( ) || 'txt' ,
282
+ createdAt : new Date ( parseInt ( task . _id . substring ( 0 , 8 ) , 16 ) * 1000 ) . getTime ( ) ,
283
+ printer : '' ,
284
+ done : task . status === 'printed' ? 1 : 0 ,
285
+ } ) ;
286
+ await fs . ensureDir ( path . resolve ( process . cwd ( ) , 'data/codes' ) ) ;
287
+ await fs . writeFile ( path . resolve ( process . cwd ( ) , 'data/codes' , `${ task . owner } #${ res . _id } ` ) , task . content ) ;
288
+ logger . info ( `Team(${ task . owner } ): ${ udoc . displayName || udoc . uname } submitted code. Code Print ID: ${ task . owner } #${ res . _id } ` ) ;
289
+ cnt ++ ;
290
+ ( { task, udoc } = await doFetch ( ) ) ;
291
+ }
292
+ await this . ctx . parallel ( 'print/newTask' , cnt ) ;
293
+ }
294
+
295
+ async setPrintDone ( pid ) {
296
+ await fetch ( `/d/${ this . contest . domainId } /contest/${ this . contest . id } /print` , 'post' ) . send ( { operation : 'update_print_task' , taskId : pid , status : 'printed' } ) ;
297
+ this . logger . debug ( `Print ${ pid } set done` ) ;
298
+ }
255
299
}
256
300
257
301
const fetcherList = {
0 commit comments