适配星铁抽卡记录导入导出,修正“留影叙佳期”正则 (#274)
* 修正留影叙佳期正则,降低触发频率 * 适配星铁抽卡记录导出 * 适配Github - biuuu原神/星铁抽卡导出工具的抽卡记录导入 --------- Co-authored-by: James <qgj087388718@163.com> Co-authored-by: Kokomi <102026640+yoimiya-kokomi@users.noreply.github.com>
This commit is contained in:
parent
18e8a8efa1
commit
60a82526cd
|
@ -20,15 +20,15 @@ export class gcLog extends plugin {
|
||||||
fnc: 'logUrl'
|
fnc: 'logUrl'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
reg: '^#txt日志文件导入记录$',
|
reg: '#txt(日志)?(文件)?导入记录',
|
||||||
fnc: 'logFile'
|
fnc: 'logFile'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
reg: '^#xlsx文件导入记录$',
|
reg: '#*(原神|星铁)?(xlsx|excel)(文件)?导入记录',
|
||||||
fnc: 'logXlsx'
|
fnc: 'logXlsx'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
reg: '^#json文件导入记录$',
|
reg: '#*(原神|星铁)?json(文件)?导入记录',
|
||||||
fnc: 'logJson'
|
fnc: 'logJson'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -36,7 +36,7 @@ export class gcLog extends plugin {
|
||||||
fnc: 'getLog'
|
fnc: 'getLog'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
reg: '^#*导出记录(excel|xlsx|json)*$',
|
reg: '^#*(原神|星铁)?导出记录(excel|xlsx|json)*$',
|
||||||
fnc: 'exportLog'
|
fnc: 'exportLog'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -160,26 +160,46 @@ export class gcLog extends plugin {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.e.file) {
|
const gsTips = `注:不支持https://github.com/biuuu/genshin-wish-export项目导出的excel文件,如果是该项目的文件请发送任意消息,取消excel导入后,使用【#json导入记录】`;
|
||||||
await this.e.reply('请发送xlsx文件')
|
const srTips = `注:适配https://github.com/biuuu/star-rail-warp-export项目导出的excel文件`;
|
||||||
return true
|
|
||||||
|
await this.e.reply(`请发送xlsx文件,该文件需要以${this.e?.isSr ? '*' : '#'}的uid命名,如:100000000.xlsx\n否则可能无法正确识别,如果误触可发送任意消息取消导入\n${this.e?.isSr ? srTips : gsTips}`);
|
||||||
|
this.setContext('importLogXlsx');
|
||||||
}
|
}
|
||||||
|
|
||||||
await new ExportLog(this.e).logXlsx()
|
async importLogXlsx() {
|
||||||
|
if (!this.e.file) {
|
||||||
|
await this.e.reply(`未检测到excel文件,操作已取消,请重新发送【${this.e?.isSr ? '*' : '#'}excel导入记录】`);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.e.isSr = this.getContext()?.importLogXlsx.isSr;
|
||||||
|
await new ExportLog(this.e).logXlsx();
|
||||||
|
}
|
||||||
|
this.finish('importLogXlsx');
|
||||||
}
|
}
|
||||||
|
|
||||||
async logJson() {
|
async logJson() {
|
||||||
if (!this.e.isPrivate) {
|
if (!this.e.isPrivate) {
|
||||||
await this.e.reply('请私聊发送Json文件', false, { at: true })
|
await this.e.reply('请私聊发送日志文件', false, { at: true })
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const gsTips = `注:适配https://github.com/biuuu/genshin-wish-export项目导出的json文件`;
|
||||||
|
const srTips = `注:适配https://github.com/biuuu/star-rail-warp-export项目导出的json文件`;
|
||||||
|
|
||||||
|
await this.e.reply(`请发送json文件,该文件需要以${this.e?.isSr ? '*' : '#'}的uid命名\n如:100000000.json,否则可能无法正确识别,如果误触可发送任意消息取消导入\n${this.e?.isSr ? srTips : gsTips}`);
|
||||||
|
this.setContext('importLogJson');
|
||||||
|
}
|
||||||
|
|
||||||
|
async importLogJson() {
|
||||||
|
this.e.isSr = this.getContext()?.importLogJson.isSr;
|
||||||
if (!this.e.file) {
|
if (!this.e.file) {
|
||||||
await this.e.reply('请发送Json文件')
|
await this.e.reply(`未检测到json文件,操作已取消,请重新发送【${this.e?.isSr ? '*' : '#'}json导入记录】`);
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
await new ExportLog(this.e).logJson()
|
await new ExportLog(this.e).logJson();
|
||||||
|
}
|
||||||
|
this.finish('importLogJson');
|
||||||
}
|
}
|
||||||
|
|
||||||
async help() {
|
async help() {
|
||||||
|
|
|
@ -17,19 +17,37 @@ export default class ExportLog extends base {
|
||||||
/** 绑定的uid */
|
/** 绑定的uid */
|
||||||
this.uidKey = `Yz:genshin:mys:qq-uid:${this.userId}`
|
this.uidKey = `Yz:genshin:mys:qq-uid:${this.userId}`
|
||||||
|
|
||||||
this.path = `./data/gachaJson/${this.e.user_id}/`
|
this.path = this.e.isSr ? `./data/srJson/${this.e.user_id}/` : `./data/gachaJson/${this.e.user_id}/`
|
||||||
|
|
||||||
this.pool = [
|
const gsPool = [
|
||||||
{ type: 301, typeName: '角色活动' },
|
{ type: 301, typeName: '角色活动' },
|
||||||
{ type: 302, typeName: '武器活动' },
|
{ type: 302, typeName: '武器活动' },
|
||||||
{ type: 200, typeName: '常驻' }
|
{ type: 200, typeName: '常驻' }
|
||||||
]
|
];
|
||||||
|
|
||||||
this.typeName = {
|
const srPool = [
|
||||||
|
{ type: 11, typeName: '角色活动' },
|
||||||
|
{ type: 12, typeName: '武器活动' },
|
||||||
|
{ type: 2, typeName: '新手活动' },
|
||||||
|
{ type: 1, typeName: '常驻' }
|
||||||
|
];
|
||||||
|
|
||||||
|
this.pool = this.e.isSr ? srPool : gsPool;
|
||||||
|
|
||||||
|
const gsTypeName = {
|
||||||
301: '角色',
|
301: '角色',
|
||||||
302: '武器',
|
302: '武器',
|
||||||
200: '常驻'
|
200: '常驻'
|
||||||
}
|
};
|
||||||
|
|
||||||
|
const srTypeName = {
|
||||||
|
11: '角色',
|
||||||
|
12: '武器',
|
||||||
|
2: '新手',
|
||||||
|
1: '常驻'
|
||||||
|
};
|
||||||
|
|
||||||
|
this.typeName = this.e.isSr ? srTypeName : gsTypeName;
|
||||||
}
|
}
|
||||||
|
|
||||||
async initXlsx() {
|
async initXlsx() {
|
||||||
|
@ -234,13 +252,36 @@ export default class ExportLog extends base {
|
||||||
let list = xlsx.parse(textPath)
|
let list = xlsx.parse(textPath)
|
||||||
list = lodash.keyBy(list, 'name')
|
list = lodash.keyBy(list, 'name')
|
||||||
|
|
||||||
if (!list['原始数据']) {
|
// 适配StarRailExport导出的xlsx,该xlsx没有原始数据表.
|
||||||
|
let rawData = list['原始数据'] ? list['原始数据'] : list['rawData'];
|
||||||
|
if (!list['原始数据'] && list['rawData']) {
|
||||||
|
// 获取rawData的time字段(第9列)的索引
|
||||||
|
const timeIndex = 8;
|
||||||
|
|
||||||
|
// 对rawData进行排序(按照time字段,除第一行外)
|
||||||
|
const headerRow = rawData.data[0]; // 保存标题行
|
||||||
|
const dataToSort = rawData.data.slice(1); // 除第一行外的数据
|
||||||
|
|
||||||
|
dataToSort.sort((a, b) => {
|
||||||
|
return moment(a[timeIndex]).format('x') - moment(b[timeIndex]).format('x');
|
||||||
|
});
|
||||||
|
|
||||||
|
// 重新构建rawData的数据,包括标题行
|
||||||
|
rawData.data = [headerRow, ...dataToSort];
|
||||||
|
|
||||||
|
// 将数据写回原文件,重新读取
|
||||||
|
fs.writeFileSync(textPath, xlsx.build([rawData]));
|
||||||
|
list = lodash.keyBy(xlsx.parse(textPath), 'name');
|
||||||
|
rawData = list['rawData'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!rawData) {
|
||||||
this.e.reply('xlsx文件内容错误:非统一祈愿记录标准')
|
this.e.reply('xlsx文件内容错误:非统一祈愿记录标准')
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 处理xlsx数据 */
|
/** 处理xlsx数据 */
|
||||||
let data = this.dealXlsx(list['原始数据'].data)
|
let data = this.dealXlsx(rawData.data);
|
||||||
if (!data) return false
|
if (!data) return false
|
||||||
|
|
||||||
/** 保存json */
|
/** 保存json */
|
||||||
|
@ -272,6 +313,11 @@ export default class ExportLog extends base {
|
||||||
field[list[0][i]] = i
|
field[list[0][i]] = i
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 适配StarRailExport导出的xlsx,该xlsx没有uigf_gacha_type字段.
|
||||||
|
if (!field['uigf_gacha_type'] && field['gacha_type']) {
|
||||||
|
field['uigf_gacha_type'] = field['gacha_type']
|
||||||
|
}
|
||||||
|
|
||||||
/** 判断字段 */
|
/** 判断字段 */
|
||||||
for (let v of reqField) {
|
for (let v of reqField) {
|
||||||
if (!field[v]) {
|
if (!field[v]) {
|
||||||
|
@ -370,12 +416,22 @@ export default class ExportLog extends base {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 对json进行排序(按照time字段)
|
||||||
|
list.sort((a, b) => {
|
||||||
|
return moment(a.time).format('x') - moment(b.time).format('x');
|
||||||
|
});
|
||||||
|
|
||||||
/** 倒序 */
|
/** 倒序 */
|
||||||
if (moment(list[0].time).format('x') < moment(list[list.length - 1].time).format('x')) {
|
if (moment(list[0].time).format('x') < moment(list[list.length - 1].time).format('x')) {
|
||||||
list = list.reverse()
|
list = list.reverse()
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let v of list) {
|
for (let v of list) {
|
||||||
|
// 适配StarRailExport导出的json,该json没有uigf_gacha_type字段.
|
||||||
|
if (!v['uigf_gacha_type'] && v['gacha_type']) {
|
||||||
|
v['uigf_gacha_type'] = v['gacha_type']
|
||||||
|
}
|
||||||
|
|
||||||
if (!data[v.uigf_gacha_type]) data[v.uigf_gacha_type] = []
|
if (!data[v.uigf_gacha_type]) data[v.uigf_gacha_type] = []
|
||||||
data[v.uigf_gacha_type].push(v)
|
data[v.uigf_gacha_type].push(v)
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,27 +10,27 @@ export default class GachaLog extends base {
|
||||||
super(e)
|
super(e)
|
||||||
this.model = 'gachaLog'
|
this.model = 'gachaLog'
|
||||||
|
|
||||||
|
if (!e.isSr && e.msg) e.isSr = /\/(common|hkrpg)\//.test(e.msg)
|
||||||
|
|
||||||
this.urlKey = `${this.prefix}url:`
|
this.urlKey = `${this.prefix}url:`
|
||||||
/** 绑定的uid */
|
/** 绑定的uid */
|
||||||
this.uidKey = `Yz:genshin:mys:qq-uid:${this.userId}`
|
this.uidKey = this.e.isSr ? `Yz:srJson:mys:qq-uid:${this.userId}` : `Yz:genshin:mys:qq-uid:${this.userId}`;
|
||||||
this.path = `./data/gachaJson/${this.e.user_id}/`
|
this.path = this.e.isSr ? `./data/srJson/${this.e.user_id}/` : `./data/gachaJson/${this.e.user_id}/`;
|
||||||
this.pool = [
|
|
||||||
|
const gsPool = [
|
||||||
{ type: 301, typeName: '角色' },
|
{ type: 301, typeName: '角色' },
|
||||||
{ type: 302, typeName: '武器' },
|
{ type: 302, typeName: '武器' },
|
||||||
{ type: 200, typeName: '常驻' }
|
{ type: 200, typeName: '常驻' }
|
||||||
]
|
];
|
||||||
|
|
||||||
if (!e.isSr && e.msg) e.isSr = /\/(common|hkrpg)\//.test(e.msg)
|
const srPool = [
|
||||||
if (e.isSr) {
|
|
||||||
this.uidKey = `Yz:srJson:mys:qq-uid:${this.userId}`
|
|
||||||
this.path = `./data/srJson/${this.e.user_id}/`
|
|
||||||
this.pool = [
|
|
||||||
{ type: 11, typeName: '角色' },
|
{ type: 11, typeName: '角色' },
|
||||||
{ type: 12, typeName: '光锥' },
|
{ type: 12, typeName: '光锥' },
|
||||||
{ type: 1, typeName: '常驻' },
|
{ type: 1, typeName: '常驻' },
|
||||||
{ type: 2, typeName: '新手' }
|
{ type: 2, typeName: '新手' }
|
||||||
]
|
];
|
||||||
}
|
|
||||||
|
this.pool = e.isSr ? srPool : gsPool;
|
||||||
}
|
}
|
||||||
|
|
||||||
async logUrl () {
|
async logUrl () {
|
||||||
|
@ -409,7 +409,7 @@ export default class GachaLog extends base {
|
||||||
logData.push(data)
|
logData.push(data)
|
||||||
}
|
}
|
||||||
if (logData.length === 0) {
|
if (logData.length === 0) {
|
||||||
this.e.reply('暂无抽卡记录\n#记录帮助,查看配置说明', false, { at: true })
|
this.e.reply(`暂无抽卡记录\n${this.e?.isSr ? '*' : '#'}记录帮助,查看配置说明`, false, { at: true })
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
for (let i of logData) {
|
for (let i of logData) {
|
||||||
|
|
Loading…
Reference in New Issue