@@ -296,7 +296,7 @@ export default class mcGachaData {
296296 /** 将 通过 get() 方法获取得到的抽卡记录以 WWGF 保存到本地
297297 * @param {number } qq QQ
298298 * @param {object } gachaDataJson 抽卡记录原始 json {"gachaData": {"1":{}, "2": {}}, "playerId": 101812955, "version": 1 } , 1-7键值为七个卡池的原始记录
299- * @returns {null|string } 保存成功返回 null, 失败返回 str 原因
299+ * @returns {null|string } 保存成功返回 null, 失败返回 str 原因, 其中 ERROR_NO_NEWER_RECORD 表示没有新增记录
300300 */
301301 async update ( qq , gachaDataJson ) {
302302 kuroLogger . debug (
@@ -317,6 +317,14 @@ export default class mcGachaData {
317317 }
318318 }
319319
320+ let path = `${ mcGachaDataPath } /${ qq } -${ gachaDataJson . playerId } .json`
321+ let oldGachaDataInUniform = { }
322+ try {
323+ oldGachaDataInUniform = JSON . parse ( fs . readFileSync ( path , 'utf8' ) )
324+ } catch ( error ) {
325+ kuroLogger . debug ( `不存在旧记录或读取失败,将创建新文件: ${ error . message } ` )
326+ }
327+
320328 // 开始以 WWGF 格式构造抽卡记录对象
321329 let gachaDataInUniform = {
322330 info : {
@@ -328,8 +336,11 @@ export default class mcGachaData {
328336 wwgf_version : 'v0.1b' ,
329337 region_time_zone : Number ( 8 ) ,
330338 } ,
331- list : [ ] ,
339+ list : oldGachaDataInUniform . list || [ ] ,
332340 }
341+
342+ let existingIds = new Set ( gachaDataInUniform . list . map ( item => item . id ) )
343+
333344 kuroLogger . debug (
334345 `准备转换 QQ ${ qq } 的抽卡记录到 WWGF 格式: ${ JSON . stringify (
335346 gachaDataInUniform
@@ -356,76 +367,75 @@ export default class mcGachaData {
356367 i . toString ( ) . padStart ( 4 , '0' ) +
357368 ( timeCount [ data . time ] -- ) . toString ( ) . padStart ( 5 , '0' )
358369
359- kuroLogger . debug (
360- `QQ ${ qq } 的抽卡记录 ${ i } 在时间 ${
361- data . time
362- } 下的物品 ${ JSON . stringify ( data ) } 是第 ${
363- timeCount [ data . time ] + 1
364- } 个, 其 id 为 ${ id } `
365- )
366-
367- let item = {
368- gacha_id : i . toString ( ) . padStart ( 4 , '0' ) ,
369- gacha_type : mcGachaType [ i ] . toString ( ) ,
370- item_id : data . resourceId . toString ( ) ,
371- count : data . count . toString ( ) ,
372- time : data . time . toString ( ) ,
373- name : data . name . toString ( ) ,
374- item_type : data . resourceType . toString ( ) ,
375- rank_type : data . qualityLevel . toString ( ) ,
376- id,
370+ if ( ! existingIds . has ( id ) ) {
371+ let item = {
372+ gacha_id : i . toString ( ) . padStart ( 4 , '0' ) ,
373+ gacha_type : mcGachaType [ i ] . toString ( ) ,
374+ item_id : data . resourceId . toString ( ) ,
375+ count : data . count . toString ( ) ,
376+ time : data . time . toString ( ) ,
377+ name : data . name . toString ( ) ,
378+ item_type : data . resourceType . toString ( ) ,
379+ rank_type : data . qualityLevel . toString ( ) ,
380+ id,
381+ }
382+ gachaDataInUniform . list . push ( item )
377383 }
378- gachaDataInUniform . list . push ( item )
379384 }
380385 }
381386
382- // 保存到本地 TODO: 目前 API 返回的是完整记录, 后续分割记录后应该是增量更新
383- kuroLogger . debug (
384- `QQ ${ qq } 的 WWGF 抽卡记录转换完成: ${ JSON . stringify ( gachaDataInUniform ) } `
385- )
386- let path = `${ mcGachaDataPath } /${ qq } -${ gachaDataJson . playerId } .json`
387- // 使用错误捕获
387+ // 在保存到本地之前,对合并后的记录进行排序, 按照 gacha_id 从小到大, id 从大到小排序
388+ gachaDataInUniform . list . sort ( ( a , b ) => {
389+ if ( a . gacha_id !== b . gacha_id ) {
390+ return parseInt ( a . gacha_id ) - parseInt ( b . gacha_id ) ;
391+ } else {
392+ return parseInt ( b . id ) - parseInt ( a . id ) ;
393+ }
394+ } ) ;
395+
396+ // 保存到本地
388397 try {
389398 fs . writeFileSync ( path , JSON . stringify ( gachaDataInUniform , null , 2 ) )
390399 kuroLogger . debug ( `QQ ${ qq } 的抽卡记录保存成功: ${ path } ` )
391- // return null
392- // 统计每种卡池获取到的数量, 构造json返回, gachatype替换为可读的卡池类型
400+ // 统计每种卡池获取到的新增数量
393401 let gachaCount = { }
394402 for ( let i = 0 ; i < gachaDataInUniform . list . length ; i ++ ) {
395403 let item = gachaDataInUniform . list [ i ]
396- let gachaName = ''
397- switch ( item . gacha_id . replace ( / ^ 0 + / , '' ) ) {
398- case '1' :
399- gachaName = '角色活动'
400- break
401- case '2' :
402- gachaName = '武器活动'
403- break
404- case '3' :
405- gachaName = '角色常驻'
406- break
407- case '4' :
408- gachaName = '武器常驻'
409- break
410- case '5' :
411- gachaName = '新手卡池'
412- break
413- case '6' :
414- gachaName = '新手自选'
415- break
416- case '7' :
417- gachaName = '自选五星'
418- break
419- default :
420- gachaName = `未知(${ item . gacha_id . replace ( / ^ 0 + / , '' ) } )`
421- }
422- if ( ! gachaCount [ gachaName ] ) {
423- gachaCount [ gachaName ] = 0
404+ if ( ! existingIds . has ( item . id ) ) {
405+ let gachaName = ''
406+ switch ( item . gacha_id . replace ( / ^ 0 + / , '' ) ) {
407+ case '1' :
408+ gachaName = '角色活动'
409+ break
410+ case '2' :
411+ gachaName = '武器活动'
412+ break
413+ case '3' :
414+ gachaName = '角色常驻'
415+ break
416+ case '4' :
417+ gachaName = '武器常驻'
418+ break
419+ case '5' :
420+ gachaName = '新手卡池'
421+ break
422+ case '6' :
423+ gachaName = '新手自选'
424+ break
425+ case '7' :
426+ gachaName = '自选五星'
427+ break
428+ default :
429+ gachaName = `未知(${ item . gacha_id . replace ( / ^ 0 + / , '' ) } )`
430+ }
431+ if ( ! gachaCount [ gachaName ] ) {
432+ gachaCount [ gachaName ] = 0
433+ }
434+ gachaCount [ gachaName ] ++
424435 }
425- gachaCount [ gachaName ] ++
426436 }
427437 if ( Object . keys ( gachaCount ) . length === 0 ) {
428- return '抽卡记录为空 '
438+ return 'ERROR_NO_NEWER_RECORD '
429439 }
430440 return gachaCount
431441 } catch ( error ) {
0 commit comments