Skip to content

Commit a4bec7c

Browse files
committed
feat: 增量更新鸣潮抽卡记录
1 parent 1e510a7 commit a4bec7c

File tree

2 files changed

+73
-59
lines changed

2 files changed

+73
-59
lines changed

apps/mcGacha.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,10 @@ export class mcGachaApp extends plugin {
257257
let gacha = new mcGachaData(e)
258258
let gachaRecord = await gacha.get(gachaLink, e.user_id)
259259
if (typeof gachaRecord === 'string') {
260+
if (gachaRecord == 'ERROR_NO_NEWER_RECORD') {
261+
e.reply(`未获取到更新的抽卡记录, 晚点再来试试吧~`)
262+
return true
263+
}
260264
e.reply(`抽卡记录更新失败: \n${gachaRecord} \n请检查链接是否正确 `)
261265
return true
262266
} else {

model/mcGachaData.js

Lines changed: 69 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)