Update message

This commit is contained in:
HolographicHat
2022-05-29 22:33:34 +08:00
parent 89ab4408d6
commit d285b1c999
9 changed files with 37 additions and 113 deletions

View File

@@ -1,9 +1,13 @@
# 原神成就导出工具
<div align="center">
# YaeAchievement
![GitHub](https://img.shields.io/badge/License-GPL--3.0-brightgreen?style=flat-square) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/HolographicHat/genshin-achievement-export?color=brightgreen&label=Release&style=flat-square) ![GitHub issues](https://img.shields.io/github/issues/HolographicHat/genshin-achievement-export?label=Issues&style=flat-square) ![Downloads](https://img.shields.io/github/downloads/HolographicHat/genshin-achievement-export/total?color=brightgreen&label=Downloads&style=flat-square) ![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)
- 支持导出所有成就
- 支持官服B服与国际服
</div>
- 支持导出所有类别的成就
- 支持官服,渠道服与国际服
- 支持导出至[椰羊](https://cocogoat.work/achievement)、[SnapGenshin](https://github.com/DGP-Studio/Snap.Genshin)、[Paimon.moe](https://paimon.moe/achievement/)、[Seelie.me](https://seelie.me/achievements)和表格文件(csv)
- 没有窗口大小、游戏语言等要求

6
app.js
View File

@@ -2,12 +2,13 @@ const proxy = require("udp-proxy")
const cp = require("child_process")
const appcenter = require("./appcenter")
const regionServer = require("./regionServer")
const cloud = require("./generated/secret")
const {
initConfig, splitPacket, upload, decodeProto, log, setupHost, KPacket, debug, checkUpdate,
brotliCompressSync, brotliDecompressSync, checkGameIsRunning, checkPortIsUsing
} = require("./utils")
const { exportData } = require("./export")
const { enablePrivilege, pause } = require("./native")
const { enablePrivilege, pause } = require("./generated/native")
const onExit = () => {
setupHost(true)
@@ -37,6 +38,7 @@ const onExit = () => {
}
appcenter.startup()
let conf = await initConfig()
cloud.init(conf)
checkPortIsUsing()
checkGameIsRunning()
log("检查更新")
@@ -121,7 +123,7 @@ const onExit = () => {
log(`请求ID: ${response.headers["x-api-requestid"]}`)
log("请联系开发者以获取帮助")
} else {
const proto = await decodeProto(data,"AllAchievement")
const proto = await decodeProto(data, "Notify1")
await exportData(proto)
}
process.exit(0)

View File

@@ -1,7 +1,7 @@
const axios = require("axios")
const crypto = require("crypto")
const { version } = require("./version")
const { getDeviceID, getDeviceInfo } = require("./native")
const { getDeviceID, getDeviceInfo } = require("./generated/native")
const getTimestamp = (d = new Date()) => {
const p = i => i.toString().padStart(2, "0")

View File

@@ -3,7 +3,7 @@ const axios = require("axios")
const readline = require("readline")
const { version } = require("./version")
const { loadCache, log, openUrl } = require("./utils")
const { checkSnapFastcall, copyToClipboard } = require("./native")
const { checkSnapFastcall, copyToClipboard } = require("./generated/native")
const exportToSeelie = proto => {
const out = { achievements: {} }
@@ -76,7 +76,7 @@ const exportToCocogoat = async proto => {
if (retcode > 32) {
log("在浏览器内进行下一步操作")
} else {
log(`导出失败,请联系开发者以获取帮助 (26-3-${retcode})`)
log(`打开此链接以进行下一步操作: https://cocogoat.work/achievement?memo=${response.data.key}`)
}
}

View File

@@ -12,6 +12,7 @@
"src/wmi/wmi.cpp",
"src/wmi/wmi.hpp",
"src/wmi/unistd.h",
"src/VMProtectSDK.h",
"src/wmi/wmiresult.cpp",
"src/wmi/wmiresult.hpp",
"src/wmi/wmiclasses.hpp",
@@ -35,7 +36,12 @@
"AdditionalOptions": [
"-std:c++latest",
"-DUNICODE",
"-sdl"
"-sdl",
"-O2",
"-Ot",
"-Oi",
"-GL",
"-Gw"
]
}
}

View File

@@ -3,7 +3,8 @@
"version": "1.0.0",
"description": "",
"scripts": {
"build": "node-gyp rebuild && copy .\\build\\Release\\native.node ..\\genshin-export\\generated",
"build": "node-gyp build && copy .\\build\\Release\\native.node ..\\genshin-export\\generated",
"rebuild": "node-gyp rebuild && copy .\\build\\Release\\native.node ..\\genshin-export\\generated",
"build-for-win7": "node-gyp rebuild --target=v14.17.0 && copy .\\build\\Release\\native.node ..\\genshin-export\\generated"
},
"gypfile": true,

View File

@@ -1,89 +0,0 @@
syntax = "proto3";
message QueryRegionList {
message SimpleInfo {
string name = 2;
string url = 4;
}
int32 retcode = 1;
repeated SimpleInfo list = 2;
}
message QueryCurRegion {
message ResVersion {
uint32 v = 1;
}
message RegionInfo {
string ip = 1;
uint32 port = 2;
uint32 cdv = 14;
uint32 csv = 18;
ResVersion res = 22;
bytes sec = 23;
}
int32 retcode = 1;
string message = 2;
RegionInfo info = 3;
}
message Req1 {
uint32 t = 1;
string u = 2;
string tk = 3;
uint32 pl = 7;
uint32 ch = 11;
uint32 sc = 12;
}
message Rsp1 {
int32 ret = 1;
string msg = 2;
uint32 uid = 3;
uint64 sd = 11;
bytes rc = 12;
string cv = 22;
}
message Req2 {
string tk = 1;
string cv = 2;
string sv = 3;
string dn = 4;
string du = 5;
uint32 ln = 9;
uint32 at = 10;
string di = 13;
uint32 pf = 14;
string cs = 18;
bytes rc = 21;
uint32 sc = 25;
string cvc = 26;
uint32 cvd = 30;
string cvh = 34;
}
message Notify1 {
message Achievement {
enum Status {
INVALID = 0;
UNFINISHED = 1;
FINISHED = 2;
REWARD_TAKEN = 3;
}
uint32 id = 1;
Status status = 2;
uint32 current = 3;
uint32 require = 4;
uint32 finishTimestamp = 5;
}
repeated Achievement list = 1;
}
message Notify2 { // 4612 HWAvatarReward
repeated uint32 id = 1;
}
message Notify3 { // 4571 HWBGM
repeated uint32 id = 1;
}

View File

@@ -3,7 +3,7 @@ const https = require("https")
const axios = require("axios")
const { decodeProto, encodeProto, debug } = require("./utils")
const path = require("path")
const cert = path.join(__dirname, "./cert/root.p12")
const cert = path.join(__dirname, "./cache/cert/root.p12")
const preparedRegions = {}
let currentProxy = undefined

View File

@@ -2,8 +2,8 @@ const fs = require("fs")
const dns = require("dns")
const ini = require("ini")
const zlib = require("zlib")
const cloud = require("./secret")
const native = require("./native")
const cloud = require("./generated/secret")
const native = require("./generated/native")
const readline = require("readline")
const protobuf = require("protobufjs")
const { version } = require("./version")
@@ -11,17 +11,16 @@ const { promisify } = require("util")
const { createHash } = require("crypto")
const path = require("path")
const { uploadEvent } = require("./appcenter")
const messages = path.join(__dirname, "./proto/Messages.proto")
const encodeProto = (object, name) => protobuf.load(messages).then(r => {
const msgType = r.lookupType(name)
const messages = protobuf.loadSync(path.join(__dirname, "./generated/Messages.proto"))
const encodeProto = (object, name) => {
const msgType = messages.lookupType(name)
const msgInst = msgType.create(object)
return msgType.encode(msgInst).finish()
})
}
const decodeProto = (buf, name) => protobuf.load(messages).then(r => {
return r.lookupType(name).decode(buf)
})
const decodeProto = (buf, name) => messages.lookupType(name).decode(buf)
const checkPath = path => new Promise((resolve, reject) => {
if (!fs.existsSync(`${path}/UnityPlayer.dll`) || !fs.existsSync(`${path}/pkg_version`)) {
@@ -189,7 +188,7 @@ const loadCache = async (fp = "latest-data") => {
}
}
const isDebug = false
const isDebug = true
const debug = (msg, ...params) => {
if (isDebug) log(msg, ...params)
@@ -208,11 +207,12 @@ const upload = async data => {
const checkUpdate = async () => {
const data = (await cloud.fetchBucket("/latest.json")).data
if (data["vc"] !== version.code) {
log(`有可用更新: ${version.name} => ${data["vn"]}`)
log(`更新内容: \n${data["ds"]}`)
log("下载地址: https://github.com/HolographicHat/genshin-achievement-export/releases\n")
console.log(`有可用更新: ${version.name} => ${data["vn"]}`)
console.log(`更新内容: \n${data["ds"]}`)
console.log("下载地址: https://github.com/HolographicHat/YaeAchievement/releases")
}
if (data["fc"] === true) {
console.log(" * 这是一次强制更新")
process.exit(410)
}
}