22import { Context , Service } from 'cordis' ;
33import superagent from 'superagent' ;
44import { config } from '../config' ;
5- import { Logger , mongoId , sleep } from '../utils' ;
5+ import { fs , Logger , mongoId , sleep } from '../utils' ;
6+ import path from 'node:path' ;
67
78const logger = new Logger ( 'fetcher' ) ;
89const fetch = ( url : string , type : 'get' | 'post' = 'get' ) => {
@@ -57,6 +58,7 @@ class BasicFetcher extends Service implements IBasicFetcher {
5758 const first = await this . contestInfo ( ) ;
5859 if ( first ) await this . teamInfo ( ) ;
5960 await this . balloonInfo ( first ) ;
61+ await this . printInfo ( first ) ;
6062 }
6163
6264 async contestInfo ( ) {
@@ -81,6 +83,14 @@ class BasicFetcher extends Service implements IBasicFetcher {
8183 async setBalloonDone ( bid ) {
8284 this . logger . debug ( `Balloon ${ bid } set done` ) ;
8385 }
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+ }
8494}
8595
8696class DOMjudgeFetcher extends BasicFetcher {
@@ -177,6 +187,7 @@ class HydroFetcher extends BasicFetcher {
177187 }
178188 const contest = body . tdoc ;
179189 contest . freeze_time = contest . lockAt ;
190+ delete contest . content ;
180191 const old = this ?. contest ?. id ;
181192 this . contest = {
182193 info : contest , id : contest . _id , name : contest . title , domainId,
@@ -252,6 +263,39 @@ class HydroFetcher extends BasicFetcher {
252263 await fetch ( `/d/${ this . contest . domainId } /contest/${ this . contest . id } /balloon` , 'post' ) . send ( { operation : 'done' , balloon : bid } ) ;
253264 this . logger . debug ( `Balloon ${ bid } set done` ) ;
254265 }
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+ }
255299}
256300
257301const fetcherList = {
0 commit comments