Skip to content

Commit bfc994a

Browse files
committed
ddr support wip
1 parent e4ea4a5 commit bfc994a

File tree

15 files changed

+20891
-7986
lines changed

15 files changed

+20891
-7986
lines changed

src/controllers/ddr/index.ts

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import { singleton } from "tsyringe";
2+
import { Combine } from "../../utils/combine.js";
3+
import { generic } from "../../decorators/eacnet.js";
4+
import { Serializable, v } from "../../utils/kxml-value.js";
5+
import config from "../../utils/config.js";
6+
import { EacGeneric } from "../eac-generic.js";
7+
import * as data from '../../datas/ddr.js'
8+
9+
@singleton()
10+
export default class extends Combine(EacGeneric) {
11+
@generic()
12+
async getItemList(): Promise<Serializable> {
13+
return {
14+
status: v.s32(0),
15+
error_code: v.s32(0),
16+
response: {
17+
item_num: v.s32(1),
18+
item: {
19+
item_id: v.str('DDR_TICKET'),
20+
not_free_count: v.s32(0),
21+
free_count: v.s32(114514),
22+
buyable_point: v.s32(0),
23+
},
24+
}
25+
};
26+
}
27+
28+
@generic()
29+
async log_2_save(): Promise<Serializable> {
30+
return {
31+
status: v.s32(0),
32+
error_code: v.s32(0),
33+
xrpc_status_code: v.s32(0),
34+
xrpc_fault_code: v.s32(0),
35+
response: {
36+
log_2: {
37+
$status: 0,
38+
}
39+
}
40+
}
41+
}
42+
43+
// Get Preview
44+
@generic()
45+
async getprev(): Promise<Serializable> {
46+
return {
47+
status: v.s32(0),
48+
error_code: v.s32(0),
49+
xrpc_status_code: v.s32(0),
50+
xrpc_fault_code: v.s32(0),
51+
response: {
52+
fileinfo_2: {
53+
$status: 0,
54+
soundinfo: data.soundInfos,
55+
}
56+
}
57+
};
58+
}
59+
60+
@generic()
61+
async getmusic(): Promise<Serializable> {
62+
return {
63+
status: v.s32(0),
64+
error_code: v.s32(0),
65+
xrpc_status_code: v.s32(0),
66+
xrpc_fault_code: v.s32(0),
67+
response: {
68+
data_2: {
69+
$status: 0,
70+
mdb: {
71+
music: data.musics,
72+
}
73+
}
74+
}
75+
};
76+
}
77+
}

src/controllers/ddr/user.ts

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import { generic } from "../../decorators/eacnet.js";
2+
import { Context } from "../../types.js";
3+
import { Serializable, v } from "../../utils/kxml-value.js";
4+
import { musicPackMax } from "../../datas/ddr.js";
5+
import { constants } from "node:fs";
6+
7+
export class User {
8+
async _usernew(token: string): Promise<Serializable> {
9+
return {};
10+
}
11+
12+
async _userload(token: string): Promise<Serializable> {
13+
return {};
14+
}
15+
16+
async _ghostload(token: string): Promise<Serializable> {
17+
return {};
18+
}
19+
20+
async _usersave(token: string, data: any): Promise<Serializable> {
21+
return {};
22+
}
23+
24+
async _rivalload(token: string, data: any): Promise<Serializable> {
25+
return {};
26+
}
27+
28+
async _inheritance(token: string, data: any): Promise<Serializable> {
29+
return {};
30+
}
31+
32+
async _arcadeload(token: string, data: any): Promise<Serializable> {
33+
return {};
34+
}
35+
36+
async _linkage_pre_playable(token: string, data: any): Promise<Serializable> {
37+
return {};
38+
}
39+
40+
async _mpackload() {
41+
return {
42+
mpacklist: new Array(musicPackMax).map(() => ({
43+
pre_playable_id: v.str(''),
44+
permit_freeplay: v.bool(false),
45+
is_purchased: v.bool(true),
46+
})),
47+
}
48+
}
49+
50+
@generic()
51+
async usergamedata_advanced(ctx: Context): Promise<Serializable> {
52+
const { data: { mode } } = ctx.body as {
53+
data: {
54+
mode: string,
55+
refid: string,
56+
}
57+
};
58+
59+
return {
60+
status: v.s32(0),
61+
error_code: v.s32(0),
62+
xrpc_status_code: v.s32(0),
63+
xrpc_fault_code: v.s32(0),
64+
response: {
65+
playerdata_2: await {
66+
'usernew': this._usernew,
67+
'userload': this._userload,
68+
'ghostload': this._ghostload,
69+
'usersave': this._usersave,
70+
'rivalload': this._rivalload,
71+
'inheritance': this._inheritance,
72+
'arcadeload': this._arcadeload,
73+
'mpackload': this._mpackload,
74+
'linkage_pre_playable': this._linkage_pre_playable,
75+
}[mode].apply(this, [ctx.token, ctx.body]),
76+
}
77+
}
78+
}
79+
}

src/controllers/default.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Context } from '../types.js';
2-
import { p2d, sdvx } from '../decorators/eacnet.js';
2+
import { generic, p2d } from '../decorators/eacnet.js';
33
import { v } from '../utils/kxml-value.js';
44
import { singleton } from 'tsyringe';
55

@@ -17,7 +17,7 @@ export class DefaultService {
1717

1818
p2d()(undefined, undefined, descriptor);
1919
return descriptor.value();
20-
} else if (ctx.service.name === 'sdvx') {
20+
} else if (['sdvx', 'ddr'].includes(ctx.service.name)) {
2121
const result = {
2222
status: v.s32(0),
2323
error_code: v.s32(0),
@@ -39,7 +39,7 @@ export class DefaultService {
3939
value: () => result,
4040
};
4141

42-
sdvx()(undefined, undefined, descriptor);
42+
generic()(undefined, undefined, descriptor);
4343
return descriptor.value();
4444
}
4545

src/controllers/eac-generic.ts

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
import { generic } from "../decorators/eacnet.js";
2+
import { Context } from "../types.js";
3+
import config from "../utils/config.js";
4+
import { Serializable, v } from "../utils/kxml-value.js";
5+
import { tokenToCardNumber, tokenToHash, tokenToSnsId } from "../utils/laochan-id.js";
6+
7+
export class EacGeneric {
8+
@generic()
9+
async getGoodsList(): Promise<Serializable> {
10+
return {
11+
status: v.s32(0),
12+
error_code: v.s32(0),
13+
response: {
14+
goods_num: v.s32(0),
15+
}
16+
};
17+
}
18+
19+
@generic()
20+
async getUserIDs(ctx: Context): Promise<Serializable> {
21+
return {
22+
status: v.s32(0),
23+
error_code: v.s32(0),
24+
response: {
25+
card_num: v.str(tokenToCardNumber(ctx.token)),
26+
ref_id: v.str(tokenToHash(ctx.token)),
27+
data_id: v.str(tokenToHash(ctx.token)),
28+
sns_id: v.str(tokenToSnsId(ctx.token)),
29+
}
30+
};
31+
}
32+
33+
@generic()
34+
async getSubscriptionStatus(): Promise<Serializable> {
35+
return {
36+
status: v.s32(0),
37+
error_code: v.s32(0),
38+
response: {
39+
subscription: {
40+
name: v.str([
41+
'eac_ddr_basic',
42+
'EAC_POPNLIVELY',
43+
'eac_sdvx_basic',
44+
'eacgitadora_basic'
45+
]),
46+
},
47+
}
48+
};
49+
}
50+
51+
@generic()
52+
async heartbeat(): Promise<Serializable> {
53+
return {
54+
status: v.s32(0),
55+
error_code: v.s32(0),
56+
response: {
57+
state: v.s32(1),
58+
next_clock: v.u64(new Date().valueOf() + 36e5),
59+
server_state: v.s32(1),
60+
mainte_start_clock: v.u64(0),
61+
mainte_end_clock: v.u64(0),
62+
usta_boot_status: v.s32(1),
63+
usta_time_remain: v.s32(0),
64+
}
65+
};
66+
}
67+
68+
@generic()
69+
async checkVersion(): Promise<Serializable> {
70+
return {
71+
status: v.s32(0),
72+
error_code: v.s32(0),
73+
response: {
74+
permission: v.s32(1),
75+
}
76+
};
77+
}
78+
79+
80+
@generic()
81+
async getServerClock(): Promise<Serializable> {
82+
return {
83+
status: v.s32(0),
84+
error_code: v.s32(0),
85+
response: {
86+
server_clock: v.u64(new Date().valueOf()),
87+
}
88+
}
89+
}
90+
91+
@generic()
92+
async getServerState(): Promise<Serializable> {
93+
return {
94+
status: v.s32(0),
95+
error_code: v.s32(0),
96+
response: {
97+
server_state: v.s32(1),
98+
mainte_start_clock: v.u64(0),
99+
mainte_end_clock: v.u64(0),
100+
}
101+
}
102+
}
103+
104+
@generic()
105+
async getServices(): Promise<Serializable> {
106+
return {
107+
status: v.s32(0),
108+
error_code: v.s32(0),
109+
response: {
110+
service_num: v.s32(18),
111+
service: [
112+
{
113+
service_name: v.str('acRelay'),
114+
url: v.str(`${config.selfUrl}/need_auth/AcRelay`),
115+
},
116+
{
117+
service_name: v.str('cancelReserveConsumeItem'),
118+
url: v.str(`${config.selfUrl}/need_auth/CancelReserveConsumeItem`),
119+
},
120+
{
121+
service_name: v.str('checkGameStart'),
122+
url: v.str(`${config.selfUrl}/need_auth/CheckGameStart`),
123+
},
124+
{
125+
service_name: v.str('checkVersion'),
126+
url: v.str(`${config.selfUrl}/needless_auth/CheckVersion`),
127+
},
128+
{
129+
service_name: v.str('consumeItem'),
130+
url: v.str(`${config.selfUrl}/need_auth/ConsumeItem`),
131+
},
132+
{
133+
service_name: v.str('getGoodsList'),
134+
url: v.str(`${config.selfUrl}/needless_auth/GetGoodsList`),
135+
},
136+
{
137+
service_name: v.str('getHash'),
138+
url: v.str(`${config.selfUrl}/needless_auth/GetHash`),
139+
},
140+
{
141+
service_name: v.str('getItemList'),
142+
url: v.str(`${config.selfUrl}/need_auth/GetItemList`),
143+
},
144+
{
145+
service_name: v.str('getLauncherData'),
146+
url: v.str(`${config.selfUrl}/needless_auth/GetLauncherData`),
147+
},
148+
{
149+
service_name: v.str('getResourceInfo'),
150+
url: v.str(`${config.selfUrl}/needless_auth/GetResourceInfo`),
151+
},
152+
{
153+
service_name: v.str('getServerClock'),
154+
url: v.str(`${config.selfUrl}/pre_process/GetServerClock`),
155+
},
156+
{
157+
service_name: v.str('getServerState'),
158+
url: v.str(`${config.selfUrl}/pre_process/GetServerStatus`),
159+
},
160+
{
161+
service_name: v.str('getServices'),
162+
url: v.str(`${config.selfUrl}/pre_process/GetServices`),
163+
},
164+
{
165+
service_name: v.str('getSubscriptionStatus'),
166+
url: v.str(`${config.selfUrl}/need_auth/GetSubscriptionStatus`),
167+
},
168+
{
169+
service_name: v.str('getUserIDs'),
170+
url: v.str(`${config.selfUrl}/need_auth/GetUserId`),
171+
},
172+
{
173+
service_name: v.str('heartbeat'),
174+
url: v.str(`${config.selfUrl}/need_auth/Heartbeat`),
175+
},
176+
{
177+
service_name: v.str('reserveConsumeItem'),
178+
url: v.str(`${config.selfUrl}/need_auth/ReserveConsumeItem`),
179+
},
180+
{
181+
service_name: v.str('uploadFile'),
182+
url: v.str(`${config.selfUrl}/needless_auth/UploadFile`),
183+
},
184+
185+
],
186+
}
187+
};
188+
}
189+
}

0 commit comments

Comments
 (0)