@@ -3,9 +3,16 @@ import path from 'path';
33import * as drpy from '../libs/drpyS.js' ;
44
55// 工具函数:生成 JSON 数据
6- async function generateSiteJSON ( jsDir , requestHost ) {
6+ async function generateSiteJSON ( jsDir , requestHost , sub ) {
77 const files = readdirSync ( jsDir ) ;
8- const valid_files = files . filter ( ( file ) => file . endsWith ( '.js' ) && ! file . startsWith ( '_' ) ) ; // 筛选出不是 "_" 开头的 .js 文件
8+ let valid_files = files . filter ( ( file ) => file . endsWith ( '.js' ) && ! file . startsWith ( '_' ) ) ; // 筛选出不是 "_" 开头的 .js 文件
9+ if ( sub ) {
10+ if ( sub . mode === 0 ) {
11+ valid_files = valid_files . filter ( it => ( new RegExp ( sub . reg || '.*' ) ) . test ( it ) ) ;
12+ } else if ( sub . mode === 1 ) {
13+ valid_files = valid_files . filter ( it => ! ( new RegExp ( sub . reg || '.*' ) ) . test ( it ) ) ;
14+ }
15+ }
916 let sites = [ ] ;
1017 for ( const file of valid_files ) {
1118 const baseName = path . basename ( file , '.js' ) ; // 去掉文件扩展名
@@ -81,6 +88,17 @@ function generateParseJSON(jxDir, requestHost) {
8188 return { parses} ;
8289}
8390
91+ function getSubs ( subFilePath ) {
92+ let subs = [ ] ;
93+ try {
94+ const subContent = readFileSync ( subFilePath ) ;
95+ subs = JSON . parse ( subContent )
96+ } catch ( e ) {
97+ log ( `读取订阅失败:${ e . message } ` ) ;
98+ }
99+ return subs
100+ }
101+
84102export default ( fastify , options , done ) => {
85103
86104 fastify . get ( '/index' , async ( request , reply ) => {
@@ -96,18 +114,30 @@ export default (fastify, options, done) => {
96114 // 接口:返回配置 JSON,同时写入 index.json
97115 fastify . get ( '/config*' , async ( request , reply ) => {
98116 let t1 = ( new Date ( ) ) . getTime ( ) ;
117+ const query = request . query ; // 获取 query 参数
118+ const sub_code = query . sub || '' ;
99119 const cfg_path = request . params [ '*' ] ; // 捕获整个路径
100- console . log ( cfg_path ) ;
101120 try {
102121 // 获取主机名,协议及端口
103122 const protocol = request . headers [ 'x-forwarded-proto' ] || ( request . socket . encrypted ? 'https' : 'http' ) ; // http 或 https
104123 const hostname = request . hostname ; // 主机名,不包含端口
105124 const port = request . socket . localPort ; // 获取当前服务的端口
106- console . log ( 'port:' , port ) ;
125+ console . log ( `cfg_path: ${ cfg_path } , port: ${ port } ` ) ;
107126 let requestHost = cfg_path === '/1' ? `${ protocol } ://${ hostname } ` : `http://127.0.0.1:${ options . PORT } ` ; // 动态生成根地址
108- const siteJSON = await generateSiteJSON ( options . jsDir , requestHost ) ;
127+ let sub = null ;
128+ if ( sub_code ) {
129+ let subs = getSubs ( options . subFilePath ) ;
130+ sub = subs . find ( it => it . code === sub_code ) ;
131+ console . log ( 'sub:' , sub ) ;
132+ if ( sub && sub . status === 0 ) {
133+ return reply . status ( 500 ) . send ( { error : `此订阅码:【${ sub_code } 】已禁用` } ) ;
134+ }
135+ }
136+
137+ const siteJSON = await generateSiteJSON ( options . jsDir , requestHost , sub ) ;
109138 const parseJSON = generateParseJSON ( options . jxDir , requestHost ) ;
110- const configObj = { ...siteJSON , ...parseJSON } ;
139+ const configObj = { sites_count : siteJSON . sites . length , ...siteJSON , ...parseJSON } ;
140+ // console.log(configObj);
111141 const configStr = JSON . stringify ( configObj , null , 2 ) ;
112142 if ( ! process . env . VERCEL ) { // Vercel 环境不支持写文件,关闭此功能
113143 writeFileSync ( options . indexFilePath , configStr , 'utf8' ) ; // 写入 index.json
0 commit comments