bugfix, add more p2d apis.

status: in-game now
This commit is contained in:
GEEKiDoS
2024-04-08 23:13:13 +08:00
parent 7803d4bc85
commit 7a1e4bbf4c
5 changed files with 321 additions and 32 deletions
+4 -1
View File
@@ -20,7 +20,7 @@ function serializeValue(value: any, type: string): string {
return value.toString();
}
if (['b', 'bool'].includes('type')) {
if (['b', 'bool'].includes(type)) {
return value ? '1' : '0';
}
@@ -123,6 +123,9 @@ export function eacnet(topName: string, encoding: 'UTF-8' | 'SHIFT_JIS' = 'UTF-8
const obj = await orig.apply(this, args);
const xml =
`<?xml version="1.0" encoding="${encoding}"?>` + serializeObject(obj, topName);
console.log(xml);
const kxml = to_bin(xml);
const compressed = LZ77.compress(kxml.data);
const result = Buffer.allocUnsafe(compressed.length + 0x2E);
+116
View File
@@ -0,0 +1,116 @@
import { eacnet } from "../../decorators/eacnet.js";
import { Context } from "../../types.js";
import { v } from "../../utils/kxml-value.js";
export class Game {
@eacnet('p2d')
async getChampionshipInfo() {
return {
status: v.s32(0),
error: v.s32(0),
result: {
championship_id: v.s32(-1),
championship_state: v.s32(0),
championship_name: v.str(''),
entry_begin_clock: v.u64(0),
championship_begin_clock: v.u64(0),
championship_end_clock: v.u64(0),
is_possible_play: v.bool(0),
repertoire_list: {
repertoire_num: v.s32(0),
}
}
}
}
@eacnet('p2d')
async getServerValues() {
return {
status: v.s32(0),
error: v.s32(0),
result: {
bit_boost_magnification: v.str('2'),
debug_user_force_subscription: v.str('TRUE'),
devline_ignore_maintenance: v.str('FALSE'),
enable_file_upload: v.str('TRUE'),
frame_bit_magnification: v.str('1'),
open_bemani_linkage_hinabita2023: v.str('FALSE'),
open_bemani_linkage_knst2024sp: v.str('FALSE'),
open_bemani_linkage_mixup: v.str('FALSE'),
}
}
}
@eacnet('p2d')
async checkGameVersion() {
return {
status: v.s32(0),
error: v.s32(0),
result: {
permission: v.s32(1),
}
};
}
@eacnet('p2d')
async getClearRate(ctx: Context) {
const { play_style } = ctx.body as { play_style: number };
return {
status: v.s32(0),
error: v.s32(0),
play_style: v.s32(play_style),
result: {},
}
}
@eacnet('p2d')
async getGoodsList() {
const goods = [{
goods_id: v.str('G1000000'),
item_id: v.str('I1000000'),
use_priority: v.s32(1),
price: v.s32(1),
}, {
goods_id: v.str('G2000000'),
item_id: v.str('I1000000'),
use_priority: v.s32(1),
price: v.s32(1),
}, {
goods_id: v.str('G2000001'),
item_id: v.str('I1000000'),
use_priority: v.s32(1),
price: v.s32(1),
}, {
goods_id: v.str('G2000002'),
item_id: v.str('I1000000'),
use_priority: v.s32(1),
price: v.s32(1),
}, {
goods_id: v.str('G1000001'),
item_id: v.str('I1000000'),
use_priority: v.s32(1),
price: v.s32(1),
}, {
goods_id: v.str('G3000000'),
item_id: v.str('I1000000'),
use_priority: v.s32(1),
price: v.s32(1),
}, {
goods_id: v.str('G3000001'),
item_id: v.str('I1000001'),
use_priority: v.s32(1),
price: v.s32(1),
}];
return {
status: v.s32(0),
error: v.s32(0),
result: {
goods_list: {
goods_num: v.s32(goods.length),
goods,
}
}
};
}
}
File diff suppressed because one or more lines are too long
+1 -30
View File
@@ -28,35 +28,6 @@ export class Service {
}
}
@eacnet('p2d')
async getServerValues() {
return {
status: v.s32(0),
error: v.s32(0),
result: {
bit_boost_magnification: v.str('2'),
debug_user_force_subscription: v.str('TRUE'),
devline_ignore_maintenance: v.str('TRUE'),
enable_file_upload: v.str('TRUE'),
frame_bit_magnification: v.str('TRUE'),
open_bemani_linkage_hinabita2023: v.str('TRUE'),
open_bemani_linkage_knst2024sp: v.str('TRUE'),
open_bemani_linkage_mixup: v.str('TRUE'),
}
}
}
@eacnet('p2d')
async checkGameVersion() {
return {
status: v.s32(0),
error: v.s32(0),
result: {
permission: v.s32(1),
}
};
}
@eacnet('p2d')
async heartbeat(ctx: Context) {
return {
@@ -65,7 +36,7 @@ export class Service {
result: {
state: v.s32(1),
next_clock: v.u64(new Date().valueOf() + 36e5),
token: ctx.token,
token: v.str(ctx.token),
time_remain: v.s32(0x7fffffff),
subscription_status: v.s32(1),
}
+192
View File
@@ -0,0 +1,192 @@
import { eacnet } from "../../decorators/eacnet.js";
import { Context } from "../../types.js";
import { v } from "../../utils/kxml-value.js";
import { MUSIC_LIST } from "./index.js";
export class User {
userDataSaveTemp = new Map<string, { pdata: Buffer, checksum: string }>();
@eacnet('p2d')
async getCustomizeSetting() {
return {
status: v.s32(0),
error: v.s32(0),
result: {
customize: [{ item_category: v.s32(2), item_id: v.str('I1100000') }, { item_category: v.s32(3), item_id: v.str('I1200000') }, { item_category: v.s32(4), item_id: v.str('I1300000') }, { item_category: v.s32(5), item_id: v.str('I1400000') }, { item_category: v.s32(6), item_id: v.str('I1500000') }, { item_category: v.s32(7), item_id: v.str('I1600000') }, { item_category: v.s32(8), item_id: v.str('I1700000') }, { item_category: v.s32(11), item_id: v.str('I1300000') }, { item_category: v.s32(10), item_id: v.str('I1900000') }],
other_customize: [{ item_category: v.s32(1), item_id: v.str('C1000000') }, { item_category: v.s32(2), item_id: v.str('C1100000') }, { item_category: v.s32(3), item_id: v.str('C1200000') }, { item_category: v.s32(4), item_id: v.str('C1300000') }, { item_category: v.s32(5), item_id: v.str('C1400000') },],
}
}
}
@eacnet('p2d')
async gameEnd() {
return {
status: v.s32(0),
error: v.s32(0),
}
}
@eacnet('p2d')
async getPointList() {
return {
status: v.s32(0),
error: v.s32(0),
result: {
point_count: v.s32(114514),
}
}
}
@eacnet('p2d')
async getPrivilegeClient() {
return {
status: v.s32(0),
error: v.s32(0),
result: {
list_num: v.s32(0),
}
}
}
@eacnet('p2d')
async getPrivilegeServer() {
return {
status: v.s32(0),
error: v.s32(0),
result: {
list_num: v.s32(0),
}
}
}
@eacnet('p2d')
async savePlayData(ctx: Context) {
const uid = ctx.token;
const { pdata, checksum } = ctx.body as { pdata: Buffer, checksum: string };
this.userDataSaveTemp.set(uid, { pdata, checksum });
return {
status: v.s32(0),
error: v.s32(0),
}
}
@eacnet('p2d')
async getPlayData(ctx: Context) {
const uid = ctx.token;
if (!this.userDataSaveTemp.has(uid)) {
return {
status: v.s32(1),
error: v.s32(404),
}
}
const { pdata } = this.userDataSaveTemp.get(uid);
return {
status: v.s32(0),
error: v.s32(0),
result: {
pdata: v.bin(pdata),
}
}
}
@eacnet('p2d')
async registPlayer(ctx: Context) {
const uid = ctx.token;
const { pdata, checksum } = ctx.body as { pdata: Buffer, checksum: string };
this.userDataSaveTemp.set(uid, { pdata, checksum });
return {
status: v.s32(0),
error: v.s32(0),
}
}
@eacnet('p2d')
async getRivalInfo() {
return {
status: v.s32(0),
error: v.s32(0),
result: {},
}
}
@eacnet('p2d')
async getMusicList() {
return {
status: v.s32(0),
error: v.s32(0),
result: {
status: v.s32(0),
check_sum: v.str('d4980d5c3436638d4802314993e66a1790075e13022b36979b081c494536d6aa'),
music_list: {
music_num: v.s32(MUSIC_LIST.length),
music: MUSIC_LIST,
}
},
}
}
@eacnet('p2d')
async getCompeScoreData() {
return {
status: v.s32(0),
error: v.s32(0),
result: {},
}
}
@eacnet('p2d')
async getMusicData(ctx: Context) {
const { play_style } = ctx.body as { play_style: number };
return {
status: v.s32(0),
error: v.s32(0),
play_style: v.s32(play_style),
result: {},
}
}
@eacnet('p2d')
async checkPlayData(ctx: Context) {
const exists = this.userDataSaveTemp.has(ctx.token)
return {
status: v.s32(0),
error: v.s32(0),
result: {
infinitas_id: v.str(ctx.token),
valid: v.bool(exists),
is_exist: v.bool(exists),
}
};
}
@eacnet('p2d')
async getItemList() {
return {
status: v.s32(0),
error: v.s32(0),
result: {
item_list: {
item_num: v.s32(2),
item: [{
item_id: v.str('I1000000'),
not_free_count: v.s32(0),
free_count: v.s32(1000),
}, {
item_id: v.str('I1000001'),
not_free_count: v.s32(0),
free_count: v.s32(1000),
}]
}
}
};
}
}