mirror of
https://github.com/laochan-eacnet/backend.git
synced 2026-09-28 01:37:56 +03:00
bugfix, add db stuff
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
import { Binary } from "mongodb";
|
||||
|
||||
export interface PlayerInfo {
|
||||
_id: string;
|
||||
rivals: string[];
|
||||
pointCount: number;
|
||||
customize: {
|
||||
2: string;
|
||||
3: string;
|
||||
4: string;
|
||||
5: string;
|
||||
6: string;
|
||||
7: string;
|
||||
8: string;
|
||||
11: string;
|
||||
10: string;
|
||||
},
|
||||
otherCustomize: {
|
||||
1: string;
|
||||
2: string;
|
||||
3: string;
|
||||
4: string;
|
||||
5: string;
|
||||
}
|
||||
}
|
||||
|
||||
export interface PlayerPlayData {
|
||||
_id: string;
|
||||
pdata: Binary;
|
||||
checksum: string;
|
||||
}
|
||||
|
||||
export interface PlayerMusicData {
|
||||
player: string;
|
||||
musicId: string;
|
||||
clearFlag: {
|
||||
spb: number;
|
||||
spn: number;
|
||||
sph: number;
|
||||
spa: number;
|
||||
spl: number;
|
||||
dpb: number;
|
||||
dpn: number;
|
||||
dph: number;
|
||||
dpa: number;
|
||||
dpl: number;
|
||||
};
|
||||
score: {
|
||||
spb: number;
|
||||
spn: number;
|
||||
sph: number;
|
||||
spa: number;
|
||||
spl: number;
|
||||
dpb: number;
|
||||
dpn: number;
|
||||
dph: number;
|
||||
dpa: number;
|
||||
dpl: number;
|
||||
};
|
||||
missCount: {
|
||||
spb: number;
|
||||
spn: number;
|
||||
sph: number;
|
||||
spa: number;
|
||||
spl: number;
|
||||
dpb: number;
|
||||
dpn: number;
|
||||
dph: number;
|
||||
dpa: number;
|
||||
dpl: number;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,257 @@
|
||||
export interface Pdata {
|
||||
bit: Bit;
|
||||
dan: Dan;
|
||||
effector: Effector;
|
||||
mission: Mission;
|
||||
option: Option;
|
||||
player: Player;
|
||||
rival: Rival;
|
||||
stats: Stats;
|
||||
version: string;
|
||||
}
|
||||
|
||||
export interface Bit {
|
||||
boost_expire_date: number;
|
||||
consume_bit: number;
|
||||
total_bit: number;
|
||||
}
|
||||
|
||||
export interface Dan {
|
||||
dp: SPClass;
|
||||
sp: SPClass;
|
||||
}
|
||||
|
||||
export interface SPClass {
|
||||
kind: Kind[];
|
||||
}
|
||||
|
||||
export interface Kind {
|
||||
id: number;
|
||||
}
|
||||
|
||||
export interface Effector {
|
||||
effect_type: number;
|
||||
filter: number;
|
||||
hi_eq: number;
|
||||
hi_mid_eq: number;
|
||||
low_eq: number;
|
||||
low_mid_eq: number;
|
||||
play_volume: number;
|
||||
vefx: number;
|
||||
}
|
||||
|
||||
export interface Mission {
|
||||
frame_list: FrameList;
|
||||
mission_list: History;
|
||||
}
|
||||
|
||||
export interface FrameList {
|
||||
frame0: Frame;
|
||||
frame1: Frame;
|
||||
frame2: Frame;
|
||||
}
|
||||
|
||||
export interface Frame {
|
||||
expire_date: number;
|
||||
}
|
||||
|
||||
export interface Option {
|
||||
anykey_dp: number;
|
||||
anykey_sp: number;
|
||||
auto_scrach_disp_type_dp: number;
|
||||
auto_scrach_disp_type_sp: number;
|
||||
autoscratch_dp: number;
|
||||
autoscratch_sp: number;
|
||||
classic_hispeed_dp: number;
|
||||
classic_hispeed_sp: number;
|
||||
disp_judge_dp: boolean;
|
||||
disp_judge_sp: boolean;
|
||||
enable_auto_adjust_dp: boolean;
|
||||
enable_auto_adjust_sp: boolean;
|
||||
fivekeys_dp: number;
|
||||
fivekeys_sp: number;
|
||||
floating_hispeed_dp: number;
|
||||
floating_hispeed_sp: number;
|
||||
gauge_disp_type_dp: number;
|
||||
gauge_disp_type_sp: number;
|
||||
gauge_dp: number;
|
||||
gauge_sp: number;
|
||||
ghost_score_dp: number;
|
||||
ghost_score_sp: number;
|
||||
ghost_type_dp: number;
|
||||
ghost_type_sp: number;
|
||||
graph_no_dp: number;
|
||||
graph_no_sp: number;
|
||||
graph_position: number;
|
||||
graph_score_type_dp: number;
|
||||
graph_score_type_sp: number;
|
||||
hidden_dp: number;
|
||||
hidden_sp: number;
|
||||
hispeed_dp: number;
|
||||
hispeed_sp: number;
|
||||
hispeed_type: number;
|
||||
judge_adjust_dp: number;
|
||||
judge_adjust_sp: number;
|
||||
judge_place_dp: number;
|
||||
judge_place_sp: number;
|
||||
key_config: KeyConfig;
|
||||
keyassist_dp: number;
|
||||
keyassist_sp: number;
|
||||
lane_brigntness_dp: number;
|
||||
lane_brigntness_sp: number;
|
||||
legacy_dp: number;
|
||||
legacy_sp: number;
|
||||
lift_dp: number;
|
||||
lift_length_dp: number;
|
||||
lift_length_sp: number;
|
||||
lift_sp: number;
|
||||
mirror_dp: number;
|
||||
mirror_dp_2p: number;
|
||||
mirror_sp: number;
|
||||
movie_type_dp: number;
|
||||
movie_type_sp: number;
|
||||
music_sort_type_dp: number;
|
||||
music_sort_type_sp: number;
|
||||
notes_disp_time_dp: number;
|
||||
notes_disp_time_sp: number;
|
||||
option_style_dp: number;
|
||||
option_style_sp: number;
|
||||
pacemaker_dp: number;
|
||||
pacemaker_sp: number;
|
||||
random_dp: number;
|
||||
random_dp_2p: number;
|
||||
random_sp: number;
|
||||
sd_length_dp: number;
|
||||
sd_length_sp: number;
|
||||
sd_type_dp: number;
|
||||
sd_type_sp: number;
|
||||
sub_graph_no_dp: number;
|
||||
sub_graph_no_sp: number;
|
||||
sudden_dp: number;
|
||||
sudden_sp: number;
|
||||
timing_disp_split_dp: number;
|
||||
timing_disp_split_sp: number;
|
||||
timing_type_dp: number;
|
||||
timing_type_sp: number;
|
||||
}
|
||||
|
||||
export interface KeyConfig {
|
||||
sw_0: number;
|
||||
sw_1: number;
|
||||
sw_10: number;
|
||||
sw_11: number;
|
||||
sw_12: number;
|
||||
sw_13: number;
|
||||
sw_14: number;
|
||||
sw_15: number;
|
||||
sw_16: number;
|
||||
sw_17: number;
|
||||
sw_18: number;
|
||||
sw_19: number;
|
||||
sw_2: number;
|
||||
sw_20: number;
|
||||
sw_21: number;
|
||||
sw_22: number;
|
||||
sw_23: number;
|
||||
sw_24: number;
|
||||
sw_25: number;
|
||||
sw_26: number;
|
||||
sw_27: number;
|
||||
sw_28: number;
|
||||
sw_29: number;
|
||||
sw_3: number;
|
||||
sw_30: number;
|
||||
sw_31: number;
|
||||
sw_32: number;
|
||||
sw_33: number;
|
||||
sw_34: number;
|
||||
sw_35: number;
|
||||
sw_4: number;
|
||||
sw_5: number;
|
||||
sw_6: number;
|
||||
sw_7: number;
|
||||
sw_8: number;
|
||||
sw_9: number;
|
||||
}
|
||||
|
||||
export interface Player {
|
||||
achievement_dp: number;
|
||||
achievement_sp: number;
|
||||
djname: string;
|
||||
grade_id_dp: number;
|
||||
grade_id_sp: number;
|
||||
infinitas_id: string;
|
||||
play_num_dp: number;
|
||||
play_num_sp: number;
|
||||
pref_id: number;
|
||||
}
|
||||
|
||||
export interface Rival {
|
||||
challenge_crush_num_dp: number;
|
||||
challenge_crush_num_sp: number;
|
||||
}
|
||||
|
||||
export interface Stats {
|
||||
dp: StatsDP;
|
||||
left: Side;
|
||||
right: Side;
|
||||
sp: SP;
|
||||
}
|
||||
|
||||
export interface StatsDP {
|
||||
djpoint_hist: History;
|
||||
grade_hist: History;
|
||||
mrank_hist: History;
|
||||
play_time: DPPlayTime;
|
||||
}
|
||||
|
||||
export interface History {
|
||||
[name: string]: {
|
||||
time: number;
|
||||
val: number;
|
||||
};
|
||||
}
|
||||
|
||||
export interface DPPlayTime {
|
||||
hist: History;
|
||||
last_end: number;
|
||||
last_start: number;
|
||||
max: number;
|
||||
total: number;
|
||||
}
|
||||
|
||||
export interface Side {
|
||||
ctrl_count: number;
|
||||
ctrl_hit: CtrlHit;
|
||||
ctrl_type: number;
|
||||
}
|
||||
|
||||
export interface CtrlHit {
|
||||
sw_01: number;
|
||||
sw_02: number;
|
||||
sw_03: number;
|
||||
sw_04: number;
|
||||
sw_05: number;
|
||||
sw_06: number;
|
||||
sw_07: number;
|
||||
sw_08: number;
|
||||
sw_09: number;
|
||||
sw_10: number;
|
||||
sw_11: number;
|
||||
tt_mv: number;
|
||||
}
|
||||
|
||||
export interface SP {
|
||||
djpoint_hist: History;
|
||||
grade_hist: History;
|
||||
mrank_hist: History;
|
||||
play_time: SPPlayTime;
|
||||
}
|
||||
|
||||
export interface SPPlayTime {
|
||||
hist: History;
|
||||
last_end: number;
|
||||
last_start: number;
|
||||
max: number;
|
||||
total: number;
|
||||
}
|
||||
@@ -124,8 +124,6 @@ export function eacnet(topName: string, encoding: 'UTF-8' | 'SHIFT_JIS' = 'UTF-8
|
||||
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);
|
||||
|
||||
@@ -58,9 +58,13 @@ function parseValue(node: { $__type: string; $__count?: unknown }): any {
|
||||
};
|
||||
}
|
||||
|
||||
function kxmlToObject(node: Record<string, unknown>): any {
|
||||
function kxmlToObject(node: Record<string, unknown> | unknown[] | string): any {
|
||||
if (node instanceof Array) {
|
||||
return node.map((v) => kxmlToObject(v));
|
||||
return node.map((v) => kxmlToObject(v as Record<string, unknown>));
|
||||
}
|
||||
|
||||
if (typeof node === 'string') {
|
||||
return {};
|
||||
}
|
||||
|
||||
if ('$__type' in node) {
|
||||
@@ -110,7 +114,7 @@ export async function eacnet(ctx: Context, next: Next): Promise<any> {
|
||||
return next();
|
||||
}
|
||||
|
||||
if(xmlResult[game].params) {
|
||||
if (xmlResult[game].params) {
|
||||
ctx.body = xmlResult.p2d.params;
|
||||
} else {
|
||||
ctx.body = {};
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
import { Context } from '../types.js';
|
||||
import { eacnet } from '../decorators/eacnet.js';
|
||||
import { v } from '../utils/kxml-value.js';
|
||||
import { singleton } from 'tsyringe';
|
||||
|
||||
@singleton()
|
||||
export class DefaultService {
|
||||
async default(ctx: Context) {
|
||||
const descriptor = {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -4,6 +4,14 @@ import config from '../../utils/config.js';
|
||||
import { v } from '../../utils/kxml-value.js';
|
||||
|
||||
export class Service {
|
||||
@eacnet('p2d')
|
||||
async sendLog() {
|
||||
return {
|
||||
status: v.s32(0),
|
||||
error: v.s32(0),
|
||||
};
|
||||
}
|
||||
|
||||
@eacnet('p2d')
|
||||
async getServerState() {
|
||||
return {
|
||||
@@ -168,7 +176,7 @@ export class Service {
|
||||
{
|
||||
service_name: v.str(`getDownloadResource`),
|
||||
url: v.str(
|
||||
'https://d1rc4pwxnc0pe0.cloudfront.net/v2/resource/distribution/ondemand',
|
||||
'https://d1rc4pwxnc0pe0.cloudfront.net/',
|
||||
),
|
||||
},
|
||||
{
|
||||
|
||||
+70
-25
@@ -1,10 +1,20 @@
|
||||
import { Binary, Db } from "mongodb";
|
||||
import { eacnet } from "../../decorators/eacnet.js";
|
||||
import { Context } from "../../types.js";
|
||||
import { v } from "../../utils/kxml-value.js";
|
||||
import { MUSIC_LIST } from "./index.js";
|
||||
import { ITEM_LIST, MUSIC_LIST } from "./index.js";
|
||||
import { PlayerMusicData, PlayerPlayData } from "../../database/index.js";
|
||||
|
||||
export class User {
|
||||
userDataSaveTemp = new Map<string, { pdata: Buffer, checksum: string }>();
|
||||
db: Db;
|
||||
|
||||
get playDataCol() {
|
||||
return this.db.collection<PlayerPlayData>('player_play_data');
|
||||
}
|
||||
|
||||
get playMusicCol() {
|
||||
return this.db.collection<PlayerMusicData>('player_music_data');
|
||||
}
|
||||
|
||||
@eacnet('p2d')
|
||||
async getCustomizeSetting() {
|
||||
@@ -12,8 +22,24 @@ export class User {
|
||||
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') },],
|
||||
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') }
|
||||
],
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -64,7 +90,13 @@ export class User {
|
||||
const uid = ctx.token;
|
||||
const { pdata, checksum } = ctx.body as { pdata: Buffer, checksum: string };
|
||||
|
||||
this.userDataSaveTemp.set(uid, { pdata, checksum });
|
||||
await this.playDataCol
|
||||
.updateOne({ _id: uid }, {
|
||||
$set: {
|
||||
pdata: new Binary(pdata),
|
||||
checksum: checksum,
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
status: v.s32(0),
|
||||
@@ -76,20 +108,21 @@ export class User {
|
||||
async getPlayData(ctx: Context) {
|
||||
const uid = ctx.token;
|
||||
|
||||
if (!this.userDataSaveTemp.has(uid)) {
|
||||
const result = await this.playDataCol
|
||||
.findOne({ _id: uid });
|
||||
|
||||
if (!result) {
|
||||
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),
|
||||
pdata: v.bin(result.pdata.buffer),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -99,7 +132,10 @@ export class User {
|
||||
const uid = ctx.token;
|
||||
const { pdata, checksum } = ctx.body as { pdata: Buffer, checksum: string };
|
||||
|
||||
this.userDataSaveTemp.set(uid, { pdata, checksum });
|
||||
await this.playDataCol
|
||||
.insertOne({ _id: uid, pdata: new Binary(pdata), checksum });
|
||||
|
||||
// this.userDataSaveTemp.set(uid, { pdata, checksum });
|
||||
|
||||
return {
|
||||
status: v.s32(0),
|
||||
@@ -112,7 +148,11 @@ export class User {
|
||||
return {
|
||||
status: v.s32(0),
|
||||
error: v.s32(0),
|
||||
result: {},
|
||||
result: {
|
||||
rival_data: [{
|
||||
|
||||
}]
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -123,7 +163,7 @@ export class User {
|
||||
error: v.s32(0),
|
||||
result: {
|
||||
status: v.s32(0),
|
||||
check_sum: v.str('d4980d5c3436638d4802314993e66a1790075e13022b36979b081c494536d6aa'),
|
||||
check_sum: v.str('f57959c468c9c59c47a4cead973f59fbec72eaa53a790c5b792222148e69c19d'),
|
||||
music_list: {
|
||||
music_num: v.s32(MUSIC_LIST.length),
|
||||
music: MUSIC_LIST,
|
||||
@@ -149,21 +189,30 @@ export class User {
|
||||
status: v.s32(0),
|
||||
error: v.s32(0),
|
||||
play_style: v.s32(play_style),
|
||||
result: {},
|
||||
result: {
|
||||
music: MUSIC_LIST.map(music => ({
|
||||
music_id: music.music_id,
|
||||
score: v.s32([9999, 9999, 9999, 9999]),
|
||||
clear_flag: v.s32([7, 7, 7, 7]),
|
||||
miss_count: v.s32([0, 0, 0, 0]),
|
||||
play_num: v.s32([1, 1, 1 ,1]),
|
||||
clear_num: v.s32([1, 1, 1 ,1]),
|
||||
}))
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@eacnet('p2d')
|
||||
async checkPlayData(ctx: Context) {
|
||||
const exists = this.userDataSaveTemp.has(ctx.token)
|
||||
const count = await this.playDataCol.countDocuments({ _id: 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),
|
||||
valid: v.bool(count),
|
||||
is_exist: v.bool(count),
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -175,16 +224,12 @@ export class User {
|
||||
error: v.s32(0),
|
||||
result: {
|
||||
item_list: {
|
||||
item_num: v.s32(2),
|
||||
item: [{
|
||||
item_id: v.str('I1000000'),
|
||||
not_free_count: v.s32(0),
|
||||
item_num: v.s32(ITEM_LIST.length),
|
||||
item: ITEM_LIST.map(id => ({
|
||||
item_id: v.str(id),
|
||||
not_free_count: v.s32(1000),
|
||||
free_count: v.s32(1000),
|
||||
}, {
|
||||
item_id: v.str('I1000001'),
|
||||
not_free_count: v.s32(0),
|
||||
free_count: v.s32(1000),
|
||||
}]
|
||||
}))
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
+2
-1
@@ -19,7 +19,8 @@
|
||||
"noImplicitThis": false,
|
||||
"strictNullChecks": false,
|
||||
"experimentalDecorators": true,
|
||||
"emitDecoratorMetadata": true
|
||||
"emitDecoratorMetadata": true,
|
||||
"resolveJsonModule": true,
|
||||
},
|
||||
"include": ["src/**/*", "__tests__/**/*"]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user