eacnet framework

This commit is contained in:
GEEKiDoS
2024-04-08 20:30:45 +08:00
parent 6fc9a884f9
commit 7803d4bc85
31 changed files with 759 additions and 837 deletions
-52
View File
@@ -1,52 +0,0 @@
import { serviceKxml } from "../../decorators/to-kxml.js";
// import { v } from "../../utils/kxml-value.js";
const resp = serviceKxml('IIDX31music');
export default class {
@resp('crate')
async crate() {
return {
$expire: 1800,
c: [
// v.s32('114514', { mid: 11451 }),
],
};
}
@resp('reg')
async reg() {
return {
$clid: 0,
$crate: 0,
$frate: 0,
$mid: 0,
$rankside: 0,
$status: 0,
shopdata: {
$rank: 252,
},
ranklist: {
$total_user_num: 1,
data: [{
$clflg: 4,
$dgrade: -1,
$sgrade: -1,
$iidx_id: '114514',
$myFlg: '0',
$name: 'MK_',
$opname: '雷窝',
$pid: 0,
$rnum: 0,
$score: 0,
$update: 0,
$body: 0,
$face: 0,
$hair: 0,
$hand: 0,
$head: 0,
}]
}
}
}
}
-194
View File
@@ -1,194 +0,0 @@
import { serviceKxml } from "../../decorators/to-kxml.js";
import { Context } from "../../types.js";
import { v } from "../../utils/kxml-value.js";
interface GetPCDataCall {
ccode: string,
cid: string,
ctype: string,
did: string,
lid: string,
pid: string,
rid: string,
}
const resp = serviceKxml('IIDX31pc');
export default class {
@resp('common')
async common() {
return {
system_voice_phase: {
$phase: 0,
},
ir: {
$beat: 0,
},
vip_pass_black: {},
common_evnet: {
$flg: -1,
},
play_video: {},
music_retry: {},
display_asio_logo: {},
lane_gacha: {},
tourism_booster: {},
cm_movie_info: {
$type: 3,
},
monthly_mranking: v.u16([]),
total_mranking: v.u16([]),
hitchart: [{
$kind: 0,
$period: 0,
ranking: [{
$music_id: 31021,
$rank: 1
}]
}],
$expire: 180,
};
}
@resp('get')
get(ctx: Context) {
const { cid } = ctx.body as GetPCDataCall;
return {
pcdata: this.getPlayerPcData(cid),
bind_eaappli: {},
secret: {
flg1: v.s64([-1, -1, 1048575]),
flg2: v.s64([-1, -1, 0]),
flg3: v.s64([-1, -1, 0]),
flg4: v.s64([-1, -1, 0]),
},
favorite: {
sp_mlist: v.bin(Buffer.alloc(1, 0)),
sp_clist: v.bin(Buffer.alloc(1, 0)),
dp_mlist: v.bin(Buffer.alloc(1, 0)),
dp_clist: v.bin(Buffer.alloc(1, 0)),
},
extra_favorite: [{
$folder_id: 0,
sp_mlist: v.bin(Buffer.alloc(1, 0)),
sp_clist: v.bin(Buffer.alloc(1, 0)),
dp_mlist: v.bin(Buffer.alloc(1, 0)),
dp_clist: v.bin(Buffer.alloc(1, 0)),
}, {
$folder_id: 0,
sp_mlist: v.bin(Buffer.alloc(1, 0)),
sp_clist: v.bin(Buffer.alloc(1, 0)),
dp_mlist: v.bin(Buffer.alloc(1, 0)),
dp_clist: v.bin(Buffer.alloc(1, 0)),
}],
grade: {
$dgid: -1,
$sgid: -1,
g: v.u8([0, 13, 3, 58]),
},
skin: v.s16(new Array(20).fill(0)),
tdjskin: v.s16([0, 0, 0, 0]),
qprodata: v.s16([0, 0, 0, 0, 0]),
spdp_rival: {
$flg: 1,
},
rlist: {},
ex: {},
secret_course_data: {},
weekly: {
$mid: 31048,
$wid: 2041,
},
weekly_score: [],
visitor: {
$anum: 1,
$pnum: 1,
$snum: 1,
$vs_flg: 0,
},
step: {
}
}
}
private getPlayerPcData(id: string) {
const data = {
d_auto_adjust: 0,
d_auto_scrach: 0,
d_camera_layout: 0,
d_classic_hispeed: 0,
d_disp_judge: 0,
d_gauge_disp: 0,
d_ghost_score: 0,
d_gno: 0,
d_graph_score: 0,
d_gtype: 0,
d_hispeed: 0.000000,
d_judge: 0,
d_judgeAdj: 0,
d_lane_brignt: 0,
d_liflen: 0,
d_notes: 0.000000,
d_opstyle: 0,
d_pace: 0,
d_sdlen: 0,
d_sdtype: 0,
d_sorttype: 0,
d_sub_gno: 0,
d_timing: 0,
d_timing_split: 0,
d_tsujigiri_disp: 0,
d_visualization: 0,
dach: 0,
dp_opt: 1048577,
dp_opt2: 1048577,
dpnum: 0,
gpos: 0,
id: 0,
idstr: '00000000',
mode: 3,
name: 'MK_',
ngrade: 0,
pid: 48,
player_kind: 0,
pmode: 0,
rtype: 0,
s_auto_adjust: 1,
s_auto_scrach: 0,
s_camera_layout: 0,
s_classic_hispeed: 0,
s_disp_judge: 1,
s_gauge_disp: 0,
s_ghost_score: 0,
s_gno: 0,
s_graph_score: 0,
s_gtype: 1,
s_hispeed: 7.888014,
s_judge: 0,
s_judgeAdj: -22,
s_lane_brignt: 0,
s_liflen: 90,
s_notes: 28.497925,
s_opstyle: 2,
s_pace: 0,
s_sdlen: 258,
s_sdtype: 1,
s_sorttype: 0,
s_sub_gno: 0,
s_timing: 1,
s_timing_split: 1,
s_tsujigiri_disp: 0,
s_visualization: 0,
sach: 49,
sp_opt: 17180950528,
spnum: 2,
cardid: id,
};
return Object.fromEntries(
Object.entries(data).map(v => ['$' + v[0], v[1]])
);
}
}
-22
View File
@@ -1,22 +0,0 @@
import { serviceKxml } from "../../decorators/to-kxml.js";
const resp = serviceKxml('IIDX31shop');
export default class {
@resp('getname')
async getname() {
return {
$cls_opt: 14400,
$expire: 0,
$opname: '原神, 启动',
$pid: 30,
};
}
@resp('sentinfo')
async sentinfo() {
return {
$status: 0,
};
}
}
-13
View File
@@ -1,13 +0,0 @@
import { serviceKxml } from "../../decorators/to-kxml.js";
const resp = serviceKxml('IIDX31streaming');
export default class {
@resp('common')
common() {
return {
$expire: Math.floor(new Date().valueOf() / 1000) + 259200,
cm_info: {},
};
}
}
-58
View File
@@ -1,58 +0,0 @@
import { serviceKxml } from "../../decorators/to-kxml.js";
import { Context } from "../../types.js";
interface CardInquire {
cardid: string,
cardtype: string,
}
interface CardAuth {
pass: string,
refid: string,
}
interface GetRefId {
cardid: string,
passwd: string;
}
const resp = serviceKxml('cardmng');
export default class {
@resp('authpass')
authpass(ctx: Context) {
const { refid, pass } = ctx.body as CardAuth;
ctx.logger.info('auth %s with pass %s', refid, pass);
return {
$status: 0,
};
}
@resp('getrefid')
getrefid(ctx: Context) {
const { cardid, passwd } = ctx.body as GetRefId;
ctx.logger.info('registering %s with passwd %s.', cardid, passwd);
return {
$dataid: cardid,
$refid: cardid,
}
}
@resp('inquire')
inquire(ctx: Context) {
const { cardid, cardtype } = ctx.body as CardInquire;
ctx.logger.info('card %s (type %d) inquire', cardid, cardtype);
return {
$binded: 1,
$newflag: 0,
$ecflag: 1,
$expired: 0,
$dataid: cardid,
$refid: cardid,
$status: 0,
};
}
}
+14 -8
View File
@@ -1,14 +1,20 @@
import { Context } from '../types.js';
import { kxml } from '../decorators/to-kxml.js';
import { eacnet } from '../decorators/eacnet.js';
import { v } from '../utils/kxml-value.js';
export class DefaultService {
@kxml()
async default(ctx: Context) {
return {
[ctx.service.name]: {
$method: ctx.service.method,
status: '0',
}
}
const descriptor = {
value: () => ({
status: v.s32(0),
error: v.s32(0),
result: {
dummy: v.u8(0),
}
})
};
eacnet(ctx.service.name)(undefined, undefined, descriptor);
return descriptor.value();
}
}
-29
View File
@@ -1,29 +0,0 @@
import { serviceKxml } from "../../decorators/to-kxml.js";
import { v } from "../../utils/kxml-value.js";
const resp = serviceKxml('eacoin');
export default class {
@resp('checkin')
checkin() {
return {
$status: 0,
balance: v.s32(114514),
sessid: v.str('0000000000000000'),
acstatus: v.u8(0),
sequence: v.s16(1),
acid: v.str('0000000000000000'),
acname: v.str('0000000000000000'),
}
}
@resp('consume')
consume() {
return {
$status: 0,
autocharge: v.u8(0),
acstatus: v.u8(0),
balance: v.u8(114514),
}
}
}
-62
View File
@@ -1,62 +0,0 @@
import { kxmlTemplate } from '../../decorators/render-kxml.js';
import { singleton } from 'tsyringe';
@singleton()
export default class {
@kxmlTemplate('facility/get')
async get(): Promise<object> {
return {
status: 0,
location: {
id: 'EA000000',
type: 0,
country: 'JP',
region: 'JP-0',
name: 'LaoChan Test',
countryName: 'LaoChan',
countryJName: '老禅',
regionName: 'BianYu',
regionJName: '變魚',
customerCode: 'LaoChan',
companyCode: 'LaoChan',
latitude: 0,
longitude: 0,
accuracy: 0,
},
line: {
id: '0',
class: 8,
upClass: 8,
rtt: 22,
},
portfw: {
globalIp: '127.0.0.1',
globalPort: 5700,
privatePort: 5700,
},
public: {
flag: 0,
name: 'LaoChan Test',
latitude: '0',
longitude: '0',
},
share: {
url: '老禅 LaoChan LaoChan 老禅',
eapass: 365,
eacoin: {
notchAmount: 0,
notchCount: 0,
supplyLimit: 100000,
},
},
calendar: {
year: 2024,
holiday: [
0, 1, 8, 41, 53, 79, 118, 122, 123, 124, 197, 222, 260, 265, 281, 306,
326, 365, 372, 406, 407, 418, 444, 484, 488, 489, 490, 491, 561, 588,
589, 624, 630, 631, 652, 672, 673, 692,
],
},
};
}
}
-13
View File
@@ -1,13 +0,0 @@
import { serviceKxml } from '../../decorators/to-kxml.js';
const resp = serviceKxml('message');
export default class {
@resp('get')
async get(): Promise<object> {
return {
$status: 0,
$expire: 60,
};
}
}
+21
View File
@@ -0,0 +1,21 @@
import { Service } from "./service.js";
function Combine(...modules: ({ new(): any })[]) {
class Modules {
constructor() {
modules.forEach(v => Object.assign(this, new v()));
}
}
modules.forEach(v => {
Object.getOwnPropertyNames(v.prototype)
.filter(p => p != 'constructor')
.forEach(p => Modules.prototype[p] = v.prototype[p])
});
return Modules;
}
export default class extends Combine(Service) {
}
+379
View File
@@ -0,0 +1,379 @@
import { eacnet } from '../../decorators/eacnet.js';
import { Context } from '../../types.js';
import config from '../../utils/config.js';
import { v } from '../../utils/kxml-value.js';
export class Service {
@eacnet('p2d')
async getServerState() {
return {
status: v.s32(0),
error: v.s32(0),
result: {
server_state: v.s32(1),
mainte_start_clock: v.u64(0),
mainte_end_clock: v.u64(0),
}
}
}
@eacnet('p2d')
async getServerClock() {
return {
status: v.s32(0),
error: v.s32(0),
result: {
server_clock: v.u64(new Date().valueOf()),
}
}
}
@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 {
status: v.s32(0),
error: v.s32(0),
result: {
state: v.s32(1),
next_clock: v.u64(new Date().valueOf() + 36e5),
token: ctx.token,
time_remain: v.s32(0x7fffffff),
subscription_status: v.s32(1),
}
};
}
@eacnet('p2d')
async checkSendLogAvailable() {
return {
status: v.s32(0),
error: v.s32(0),
result: {
status: v.s32(1),
daily_count: v.s32(999),
}
};
}
@eacnet('p2d')
async getServices() {
return {
status: v.s32(0),
error: v.s32(0),
result: {
service_num: v.s32(63),
service: [
{
service_name: v.str(`addPoint`),
url: v.str(`${config.selfUrl}/needAuth/AddPoint`),
},
{
service_name: v.str(`addPointDirect`),
url: v.str(`${config.selfUrl}/needAuth/AddPointDirect`),
},
{
service_name: v.str(`cancelReserveChangePoint`),
url: v.str(
`${config.selfUrl}/needAuth/CancelReserveChangePoint`,
),
},
{
service_name: v.str(`cancelReserveConsumeItem`),
url: v.str(
`${config.selfUrl}/needAuth/CancelReserveConsumeItem`,
),
},
{
service_name: v.str(`checkChampionshipInfo`),
url: v.str(
`${config.selfUrl}/needlessAuth/CheckChampionshipInfo`,
),
},
{
service_name: v.str(`checkGameStart`),
url: v.str(`${config.selfUrl}/preProcess/CheckGameStart`),
},
{
service_name: v.str(`checkGameVersion`),
url: v.str(`${config.selfUrl}/needlessAuth/CheckGameVersion`),
},
{
service_name: v.str(`checkPlayData`),
url: v.str(`${config.selfUrl}/needAuth/CheckPlayData`),
},
{
service_name: v.str(`checkPlayableMusicList`),
url: v.str(
`${config.selfUrl}/needAuth/CheckPlayableMusicList`,
),
},
{
service_name: v.str(`checkSendLogAvailable`),
url: v.str(
`${config.selfUrl}/needlessAuth/CheckSendLogAvailable`,
),
},
{
service_name: v.str(`checkTakeover`),
url: v.str(`${config.selfUrl}/needAuth/CheckTakeover`),
},
{
service_name: v.str(`checkUpdate`),
url: v.str(`${config.selfUrl}/needlessAuth/CheckUpdate`),
},
{
service_name: v.str(`checkVersion`),
url: v.str(
`${config.selfUrl}/needlessAuth/CheckLauncherVersion`,
),
},
{
service_name: v.str(`consumeItem`),
url: v.str(`${config.selfUrl}/needAuth/ConsumeItem`),
},
{
service_name: v.str(`gameEnd`),
url: v.str(`${config.selfUrl}/needAuth/GameEnd`),
},
{
service_name: v.str(`getAdvertise`),
url: v.str(`${config.selfUrl}/needlessAuth/GetAdvertise`),
},
{
service_name: v.str(`getChampionshipInfo`),
url: v.str(
`${config.selfUrl}/needlessAuth/GetChampionshipInfo`,
),
},
{
service_name: v.str(`getChampionshipRank`),
url: v.str(`${config.selfUrl}/needAuth/GetChampionshipRank`),
},
{
service_name: v.str(`getChampionshipRecord`),
url: v.str(`${config.selfUrl}/needAuth/GetChampionshipRecord`),
},
{
service_name: v.str(`getClearRate`),
url: v.str(`${config.selfUrl}/needlessAuth/GetClearRate`),
},
{
service_name: v.str(`getCompeScoreData`),
url: v.str(`${config.selfUrl}/needAuth/GetCompeScoreData`),
},
{
service_name: v.str(`getCustomizeSetting`),
url: v.str(`${config.selfUrl}/needAuth/GetCustomizeSetting`),
},
{
service_name: v.str(`getDownloadResource`),
url: v.str(
'https://d1rc4pwxnc0pe0.cloudfront.net/v2/resource/distribution/ondemand',
),
},
{
service_name: v.str(`getGoodsList`),
url: v.str(`${config.selfUrl}/needlessAuth/GetGoodsList`),
},
{
service_name: v.str(`getHash`),
url: v.str(`${config.selfUrl}/needlessAuth/GetHash`),
},
{
service_name: v.str(`getInformation`),
url: v.str(`${config.selfUrl}/needlessAuth/GetInformation`),
},
{
service_name: v.str(`getItemList`),
url: v.str(`${config.selfUrl}/needAuth/GetItemList`),
},
{
service_name: v.str(`getItemNum`),
url: v.str(`${config.selfUrl}/needAuth/GetItemNum`),
},
{
service_name: v.str(`getMusicData`),
url: v.str(`${config.selfUrl}/needAuth/GetMusicData`),
},
{
service_name: v.str(`getMusicGhost`),
url: v.str(`${config.selfUrl}/needAuth/GetMusicGhost`),
},
{
service_name: v.str(`getMusicList`),
url: v.str(`${config.selfUrl}/needAuth/GetMusicList`),
},
{
service_name: v.str(`getPackageList`),
url: v.str(`${config.selfUrl}/needlessAuth/GetPackageList`),
},
{
service_name: v.str(`getPlayData`),
url: v.str(`${config.selfUrl}/needAuth/GetPlayData`),
},
{
service_name: v.str(`getPlayableMusicList`),
url: v.str(`${config.selfUrl}/needAuth/GetPlayableMusicList`),
},
{
service_name: v.str(`getPointList`),
url: v.str(`${config.selfUrl}/needAuth/GetPointList`),
},
{
service_name: v.str(`getPrivilegeClient`),
url: v.str(`${config.selfUrl}/needAuth/GetPrivilegeClient`),
},
{
service_name: v.str(`getPrivilegeServer`),
url: v.str(`${config.selfUrl}/needAuth/GetPrivilegeServer`),
},
{
service_name: v.str(`getResourceInfo`),
url: v.str(`${config.selfUrl}/needlessAuth/GetFile`),
},
{
service_name: v.str(`getRival`),
url: v.str(`${config.selfUrl}/needAuth/GetRival`),
},
{
service_name: v.str(`getRivalChallenge`),
url: v.str(`${config.selfUrl}/needAuth/GetRivalChallenge`),
},
{
service_name: v.str(`getRivalInfo`),
url: v.str(`${config.selfUrl}/needAuth/GetRivalInfo`),
},
{
service_name: v.str(`getServerClock`),
url: v.str(`${config.selfUrl}/preProcess/GetServerClock`),
},
{
service_name: v.str(`getServerState`),
url: v.str(`${config.selfUrl}/preProcess/GetServerState`),
},
{
service_name: v.str(`getServerValues`),
url: v.str(`${config.selfUrl}/needlessAuth/GetServerValues`),
},
{
service_name: v.str(`getServices`),
url: v.str(`${config.selfUrl}/preProcess/GetServices`),
},
{
service_name: v.str(`getTemporaryFiles`),
url: v.str(`${config.selfUrl}/needlessAuth/GetTemporaryFiles`),
},
{
service_name: v.str(`heartbeat`),
url: v.str(`${config.selfUrl}/needAuth/Heartbeat`),
},
{
service_name: v.str(`loginEX`),
url: v.str(
'https://p.eagate.573.jp/game/eac2dx/infinitas/API/page/loginEX.html',
),
},
{
service_name: v.str(`registPlayer`),
url: v.str(`${config.selfUrl}/needAuth/RegistPlayer`),
},
{
service_name: v.str(`reportMusicResult`),
url: v.str(`${config.selfUrl}/needAuth/ReportMusicResult`),
},
{
service_name: v.str(`reserveChangePoint`),
url: v.str(`${config.selfUrl}/needAuth/ReserveChangePoint`),
},
{
service_name: v.str(`reserveConsumeItem`),
url: v.str(`${config.selfUrl}/needAuth/ReserveConsumeItem`),
},
{
service_name: v.str(`saveChampionshipRecord`),
url: v.str(
`${config.selfUrl}/needAuth/SaveChampionshipRecord`,
),
},
{
service_name: v.str(`savePlayData`),
url: v.str(`${config.selfUrl}/needAuth/SavePlayData`),
},
{
service_name: v.str(`sendGradeCertificationLog`),
url: v.str(
`${config.selfUrl}/needAuth/SendGradeCertificationLog`,
),
},
{
service_name: v.str(`sendLog`),
url: v.str(`${config.selfUrl}/needlessAuth/SendLog`),
},
{
service_name: v.str(`unlockMusic`),
url: v.str(`${config.selfUrl}/needAuth/UnlockMusic`),
},
{
service_name: v.str(`uploadFile`),
url: v.str(
`${config.selfUrl}/needlessAuth/UploadFileMultipart`,
),
},
{
service_name: v.str(`urlAgreement`),
url: v.str(
'https://p.eagate.573.jp/game/infinitas/2/jump/agreement.html',
),
},
{
service_name: v.str(`urlEaShop`),
url: v.str('https://p.eagate.573.jp/game/eac2dx/jump/eashop.html'),
},
{
service_name: v.str(`urlKAC5th`),
url: v.str(
'http://p.eagate.573.jp/game/kac5th/detail.html?id=infinitas&amp;group=outline&amp;lang=ja',
),
},
{
service_name: v.str(`usePoint`),
url: v.str(`${config.selfUrl}/needAuth/UsePoint`),
},
{
service_name: v.str(`usePointDirect`),
url: v.str(`${config.selfUrl}/needAuth/UsePointDirect`),
},
],
},
};
}
}
-5
View File
@@ -1,5 +0,0 @@
import { DefaultService } from '../default.js';
export default class extends DefaultService {
list = this.default;
}
-5
View File
@@ -1,5 +0,0 @@
import { DefaultService } from '../default.js';
export default class extends DefaultService {
put = this.default;
}
-15
View File
@@ -1,15 +0,0 @@
import { serviceKxml } from '../../decorators/to-kxml.js';
const resp = serviceKxml('pcbtracker');
export default class {
@resp('alive')
async alive(): Promise<object> {
return {
$ecenable: 1,
$expire: 3600,
$status: 0,
$time: Math.floor(new Date().valueOf() / 1000),
};
}
}
-39
View File
@@ -1,39 +0,0 @@
import { singleton } from 'tsyringe';
import config from '../../utils/config.js';
import { serviceKxml } from '../../decorators/to-kxml.js';
const resp = serviceKxml('services');
@singleton()
export default class {
@resp('get')
async get() {
const selfServices = [
'services', 'dlstatus', 'cardmng',
'eacoin', 'userdata', 'userid', 'pcbtracker', 'pcbevent',
'message', 'facility', 'apsmanager', 'sidmgr', 'package',
'uploaders', 'local', 'local2', 'lobby',
]
return {
$expire: 43200,
$mode: 'operation',
$product_domain: 1,
$statuc: 0,
item: [
{
$name: 'keepalive',
$url: 'ping://127.0.0.1/?pa=127.0.0.1&ia=127.0.0.1&ga=127.0.0.1ma=127.0.0.1&t1=2&t2=15&rt=2',
},
{
$name: 'ntp',
$url: config.ntpUrl,
},
...selfServices.map(v => ({
$name: v,
$url: config.selfUrl,
}))
]
};
}
}