@@ -825,6 +825,7 @@ export interface ScoreboardView<T extends { [key: string]: keyof BuiltinInput |
825825 cacheTime ?: number ; // in seconds
826826 args : T ;
827827 display : ( this : ContestScoreboardHandler , args : ParseArgs < T > ) => Promise < void > ;
828+ checker ?: ( this : ContestScoreboardHandler ) => boolean ;
828829}
829830
830831export class ContestScoreboardHandler extends ContestDetailBaseHandler {
@@ -884,26 +885,29 @@ class ScoreboardService extends Service {
884885
885886 addView < T extends { [ key : string ] : keyof BuiltinInput | AnyFunction | Type < any > } > (
886887 id : string , name : string , args : T ,
887- { display, supportedRules, cacheTime } : {
888+ { display, supportedRules, cacheTime, checker } : {
888889 display : ( this : ContestScoreboardHandler , args : ParseArgs < T > ) => Promise < void > ;
889890 supportedRules : string [ ] ;
890891 cacheTime ?: number ;
892+ checker ?: ( this : ContestScoreboardHandler ) => boolean ;
891893 } ,
892894 ) {
893895 if ( this . views [ id ] ) throw new Error ( `View ${ id } already exists` ) ;
894896 this . ctx . effect ( ( ) => {
895897 this . views [ id ] = {
896- id, name, args, display, supportedRules, cacheTime,
898+ id, name, args, display, supportedRules, cacheTime, checker ,
897899 } ;
898900 return ( ) => {
899901 delete this . views [ id ] ;
900902 } ;
901903 } ) ;
902904 }
903905
904- getAvailableViews ( rule : string ) {
905- return Object . fromEntries ( Object . values ( this . views ) . filter ( ( i ) => i . supportedRules . includes ( rule ) || i . supportedRules . includes ( '*' ) )
906- . map ( ( i ) => [ i . id , i . name ] ) ) ;
906+ getAvailableViews ( rule : string , handler : ContestScoreboardHandler ) {
907+ return Object . fromEntries ( Object . values ( this . views ) . filter ( ( i ) => (
908+ ( i . supportedRules . includes ( rule ) || i . supportedRules . includes ( '*' ) )
909+ && ( ! i . checker || i . checker . call ( handler ) )
910+ ) ) . map ( ( i ) => [ i . id , i . name ] ) ) ;
907911 }
908912
909913 getView ( id : string ) {
@@ -963,7 +967,7 @@ export async function apply(ctx: Context) {
963967 const page_name = tdoc . rule === 'homework'
964968 ? 'homework_scoreboard'
965969 : 'contest_scoreboard' ;
966- const availableViews = scoreboard . getAvailableViews ( tdoc . rule ) ;
970+ const availableViews = scoreboard . getAvailableViews ( tdoc . rule , this ) ;
967971 this . response . body = {
968972 tdoc : this . tdoc , tsdoc : this . tsdocAsPublic ( ) , rows, udict, pdict, page_name, groups, availableViews,
969973 } ;
0 commit comments