wip crack handler
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
import { LoadConfigResponse2 } from "../response/loadConfig2";
|
||||
|
||||
export function loadConfig2(res: LoadConfigResponse2) {
|
||||
const buf = Buffer.alloc(0x230);
|
||||
const buf = Buffer.alloc(0x0230);
|
||||
|
||||
buf.writeInt16LE(0x0065, 0x0000);
|
||||
buf.writeInt16LE(0x00ac, 0x0000);
|
||||
buf.writeInt8(res.status, 0x0002);
|
||||
|
||||
return buf;
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
import { CreateTeamRequest } from "../request/createTeam";
|
||||
import { LoadTeamRequest } from "../request/loadTeam";
|
||||
import { CreateTeamResponse } from "../response/createTeam";
|
||||
import { LoadTeamResponse } from "../response/loadTeam";
|
||||
import { World } from "../world";
|
||||
|
||||
export function _team(
|
||||
w: World,
|
||||
req: CreateTeamRequest | LoadTeamRequest
|
||||
): CreateTeamResponse | LoadTeamResponse {
|
||||
const bits = {
|
||||
name: "ASS GENTLEMEN",
|
||||
members: [
|
||||
{
|
||||
name: "てすと",
|
||||
lv: 69,
|
||||
monthPoints: 1234,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
if (req.type === "create_team_req") {
|
||||
return { type: "create_team_res", ...bits };
|
||||
} else {
|
||||
return { type: "load_team_res", ...bits };
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
import { AccountLockRequest } from "../request/accountLock";
|
||||
import { AccountLockResponse } from "../response/accountLock";
|
||||
import { World } from "../world";
|
||||
|
||||
export function accountLock(
|
||||
w: World,
|
||||
req: AccountLockRequest
|
||||
): AccountLockResponse {
|
||||
return {
|
||||
type: "account_lock_res",
|
||||
field_0018: 1,
|
||||
field_001A: -1,
|
||||
field_001C: new Date(Date.now() + 3600000),
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
import { AccountUnlockRequest } from "../request/accountUnlock";
|
||||
import { AccountUnlockResponse } from "../response/accountUnlock";
|
||||
import { World } from "../world";
|
||||
|
||||
export function accountUnlock(
|
||||
w: World,
|
||||
req: AccountUnlockRequest
|
||||
): AccountUnlockResponse {
|
||||
return {
|
||||
type: "account_unlock_res",
|
||||
status: 1,
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
import { CreateProfileRequest } from "../request/createProfile";
|
||||
import { GenericResponse } from "../response/generic";
|
||||
import { World } from "../world";
|
||||
|
||||
export function createProfile(
|
||||
w: World,
|
||||
req: CreateProfileRequest
|
||||
): GenericResponse {
|
||||
return {
|
||||
type: "generic_res",
|
||||
status: 1,
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
import { DiscoverProfileRequest } from "../request/discoverProfile";
|
||||
import { DiscoverProfileResponse } from "../response/discoverProfile";
|
||||
import { World } from "../world";
|
||||
|
||||
export function discoverProfile(
|
||||
w: World,
|
||||
req: DiscoverProfileRequest
|
||||
): DiscoverProfileResponse {
|
||||
return {
|
||||
type: "discover_profile_res",
|
||||
result: true,
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
import { Request } from "../request";
|
||||
import { Response } from "../response";
|
||||
import { World } from "../world";
|
||||
import { accountLock } from "./accountLock";
|
||||
import { accountUnlock } from "./accountUnlock";
|
||||
import { createProfile } from "./createProfile";
|
||||
import { _team } from "./_team";
|
||||
import { load2on2 } from "./load2on2";
|
||||
import { loadConfig } from "./loadConfig";
|
||||
import { loadConfig2 } from "./loadConfig2";
|
||||
import { discoverProfile } from "./discoverProfile";
|
||||
import { loadGeneralReward } from "./loadGeneralReward";
|
||||
import { loadProfile } from "./loadProfile";
|
||||
import { loadReward as loadRewardTable } from "./loadRewardTable";
|
||||
import { loadServerList } from "./loadServerList";
|
||||
import { loadStocker } from "./loadStocker";
|
||||
import { saveExpedition } from "./saveExpedition";
|
||||
import { updateProvisionalStoreRank } from "./updateProvisionalStoreRank";
|
||||
import { saveProfile } from "./saveProfile";
|
||||
import { saveSettings } from "./saveSettings";
|
||||
import { updateStoryClearNum } from "./updateStoryClearNum";
|
||||
import { saveTopic } from "./saveTopic";
|
||||
|
||||
export function dispatch(w: World, req: Request): Response {
|
||||
switch (req.type) {
|
||||
case "account_lock_req":
|
||||
return accountLock(w, req);
|
||||
|
||||
case "account_unlock_req":
|
||||
return accountUnlock(w, req);
|
||||
|
||||
case "create_profile_req":
|
||||
return createProfile(w, req);
|
||||
|
||||
case "create_team_req":
|
||||
return _team(w, req);
|
||||
|
||||
case "load_2on2_req":
|
||||
return load2on2(w, req);
|
||||
|
||||
case "load_config_req":
|
||||
return loadConfig(w, req);
|
||||
|
||||
case "load_config_v2_req":
|
||||
return loadConfig2(w, req);
|
||||
|
||||
case "discover_profile_req":
|
||||
return discoverProfile(w, req);
|
||||
|
||||
case "load_general_reward_req":
|
||||
return loadGeneralReward(w, req);
|
||||
|
||||
case "load_profile_req":
|
||||
return loadProfile(w, req);
|
||||
|
||||
case "load_reward_table_req":
|
||||
return loadRewardTable(w, req);
|
||||
|
||||
case "load_server_list_req":
|
||||
return loadServerList(w, req);
|
||||
|
||||
case "load_stocker_req":
|
||||
return loadStocker(w, req);
|
||||
|
||||
case "load_team_req":
|
||||
return _team(w, req);
|
||||
|
||||
case "save_expedition_req":
|
||||
return saveExpedition(w, req);
|
||||
|
||||
case "update_provisional_store_rank_req":
|
||||
return updateProvisionalStoreRank(w, req);
|
||||
|
||||
case "save_profile_req":
|
||||
return saveProfile(w, req);
|
||||
|
||||
case "save_settings_req":
|
||||
return saveSettings(w, req);
|
||||
|
||||
case "update_story_clear_num_req":
|
||||
return updateStoryClearNum(w, req);
|
||||
|
||||
case "save_topic_req":
|
||||
return saveTopic(w, req);
|
||||
|
||||
default:
|
||||
const exhaustCheck: never = req;
|
||||
|
||||
throw new Error(`Unhandled message ${req["type"]}`);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
import { Load2on2Request } from "../request/load2on2";
|
||||
import { Load2on2Response } from "../response/load2on2";
|
||||
import { World } from "../world";
|
||||
|
||||
export function load2on2(w: World, req: Load2on2Request): Load2on2Response {
|
||||
return {
|
||||
type: "load_2on2_res",
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
import { LoadConfigRequest } from "../request/loadConfig";
|
||||
import { LoadConfigResponse } from "../response/loadConfig";
|
||||
import { World } from "../world";
|
||||
|
||||
export function loadConfig(
|
||||
w: World,
|
||||
req: LoadConfigRequest
|
||||
): LoadConfigResponse {
|
||||
return {
|
||||
type: "load_config_res",
|
||||
status: 1,
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
import { LoadConfigRequest2 } from "../request/loadConfig2";
|
||||
import { LoadConfigResponse2 } from "../response/loadConfig2";
|
||||
import { World } from "../world";
|
||||
|
||||
export function loadConfig2(
|
||||
w: World,
|
||||
req: LoadConfigRequest2
|
||||
): LoadConfigResponse2 {
|
||||
return {
|
||||
type: "load_config_v2_res",
|
||||
status: 1,
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
import { LoadGeneralRewardRequest } from "../request/loadGeneralReward";
|
||||
import { GenericResponse } from "../response/generic";
|
||||
import { World } from "../world";
|
||||
|
||||
export function loadGeneralReward(
|
||||
w: World,
|
||||
req: LoadGeneralRewardRequest
|
||||
): GenericResponse {
|
||||
// A non-generic response is also accepted, but why bother
|
||||
return {
|
||||
type: "generic_res",
|
||||
status: 1, // not even checked but let's be consistent
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
import { LoadProfileRequest } from "../request/loadProfile";
|
||||
import { LoadProfileResponse2 } from "../response/loadProfile2";
|
||||
import { World } from "../world";
|
||||
|
||||
export function loadProfile(
|
||||
w: World,
|
||||
req: LoadProfileRequest
|
||||
): LoadProfileResponse2 {
|
||||
return {
|
||||
type: "load_profile_v2_res",
|
||||
name: "てすと",
|
||||
profileId: 0x11223344,
|
||||
lv: 69,
|
||||
fame: 1234,
|
||||
dpoint: 54321,
|
||||
teamId: 0x22334455,
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
import { LoadRewardTableRequest } from "../request/loadRewardTable";
|
||||
import { LoadRewardTableResponse } from "../response/loadRewardTable";
|
||||
import { World } from "../world";
|
||||
|
||||
export function loadReward(
|
||||
w: World,
|
||||
req: LoadRewardTableRequest
|
||||
): LoadRewardTableResponse {
|
||||
return {
|
||||
type: "load_reward_table_res",
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
import { hostname } from "os";
|
||||
|
||||
import { LoadServerListRequest } from "../request/loadServerList";
|
||||
import { LoadServerListResponse } from "../response/loadServerList";
|
||||
import { World } from "../world";
|
||||
|
||||
export function loadServerList(
|
||||
w: World,
|
||||
req: LoadServerListRequest
|
||||
): LoadServerListResponse {
|
||||
const myHost = hostname();
|
||||
|
||||
return {
|
||||
type: "load_server_list_res",
|
||||
status: 1,
|
||||
userDb: {
|
||||
addr: myHost,
|
||||
tcp: 10000,
|
||||
http: 10001,
|
||||
},
|
||||
matchAddr: myHost,
|
||||
matchPort: {
|
||||
tcp: 10002,
|
||||
udpSend: 10003,
|
||||
udpRecv: 10004,
|
||||
},
|
||||
tagMatchPort: {
|
||||
tcp: 10005,
|
||||
udpSend: 10006,
|
||||
udpRecv: 10007,
|
||||
},
|
||||
event: {
|
||||
addr: myHost,
|
||||
tcp: 10008,
|
||||
},
|
||||
screenshot: {
|
||||
addr: myHost,
|
||||
tcp: 10009,
|
||||
},
|
||||
pingReturn: myHost,
|
||||
echo1: {
|
||||
addr: myHost,
|
||||
udp: 10010,
|
||||
},
|
||||
echo2: {
|
||||
addr: myHost,
|
||||
udp: 10011,
|
||||
},
|
||||
newsUrl: `http://${myHost}:10012/news`,
|
||||
reportErrorUrl: `http://${myHost}:10013/error`,
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
import { LoadStockerRequest } from "../request/loadStocker";
|
||||
import { LoadStockerResponse } from "../response/loadStocker";
|
||||
import { World } from "../world";
|
||||
|
||||
export function loadStocker(
|
||||
w: World,
|
||||
req: LoadStockerRequest
|
||||
): LoadStockerResponse {
|
||||
return {
|
||||
type: "load_stocker_res",
|
||||
status: 1,
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
import { SaveExpeditionRequest } from "../request/saveExpedition";
|
||||
import { GenericResponse } from "../response/generic";
|
||||
import { SaveExpeditionResponse } from "../response/saveExpedition";
|
||||
import { World } from "../world";
|
||||
|
||||
export function saveExpedition(
|
||||
w: World,
|
||||
req: SaveExpeditionRequest
|
||||
): GenericResponse | SaveExpeditionResponse {
|
||||
if (req.field_0004 === 0) {
|
||||
return {
|
||||
type: "generic_res",
|
||||
status: 0,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
type: "save_expedition_res",
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
import { SaveProfileRequest } from "../request/saveProfile";
|
||||
import { GenericResponse } from "../response/generic";
|
||||
import { World } from "../world";
|
||||
|
||||
export function saveProfile(
|
||||
w: World,
|
||||
req: SaveProfileRequest
|
||||
): GenericResponse {
|
||||
return {
|
||||
type: "generic_res",
|
||||
status: 1,
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
import { SaveSettingsRequest } from "../request/saveSettings";
|
||||
import { GenericResponse } from "../response/generic";
|
||||
import { World } from "../world";
|
||||
|
||||
export function saveSettings(
|
||||
w: World,
|
||||
req: SaveSettingsRequest
|
||||
): GenericResponse {
|
||||
return {
|
||||
type: "generic_res",
|
||||
status: 1, // ignored but whatever
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
import { SaveTopicRequest } from "../request/saveTopic";
|
||||
import { SaveTopicResponse } from "../response/saveTopic";
|
||||
import { World } from "../world";
|
||||
|
||||
export function saveTopic(w: World, req: SaveTopicRequest): SaveTopicResponse {
|
||||
return {
|
||||
type: "save_topic_res",
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
import { UpdateProvisionalStoreRankRequest } from "../request/updateProvisionalStoreRank";
|
||||
import { UpdateProvisionalStoreRankResponse } from "../response/updateProvisionalStoreRank";
|
||||
import { World } from "../world";
|
||||
|
||||
export function updateProvisionalStoreRank(
|
||||
w: World,
|
||||
req: UpdateProvisionalStoreRankRequest
|
||||
): UpdateProvisionalStoreRankResponse {
|
||||
return {
|
||||
type: "update_provisional_store_rank_res",
|
||||
rows: [],
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
import { UpdateStoryClearNumRequest } from "../request/updateStoryClearNum";
|
||||
import { UpdateStoryClearNumResponse } from "../response/updateStoryClearNum";
|
||||
import { World } from "../world";
|
||||
|
||||
export function updateStoryClearNum(
|
||||
w: World,
|
||||
req: UpdateStoryClearNumRequest
|
||||
): UpdateStoryClearNumResponse {
|
||||
return {
|
||||
type: "update_story_clear_num_res",
|
||||
};
|
||||
}
|
||||
+5
-227
@@ -1,8 +1,10 @@
|
||||
import { Socket } from "net";
|
||||
import { hostname } from "os";
|
||||
|
||||
import { dispatch } from "./handler";
|
||||
import setup from "./setup";
|
||||
import { Response } from "./response";
|
||||
import { World } from "./world";
|
||||
|
||||
const world = new World();
|
||||
|
||||
export default async function idz(socket: Socket) {
|
||||
const { input, output } = setup(socket);
|
||||
@@ -11,231 +13,7 @@ export default async function idz(socket: Socket) {
|
||||
|
||||
try {
|
||||
for await (const req of input) {
|
||||
let res: Response;
|
||||
|
||||
switch (req.type) {
|
||||
case "account_lock_req":
|
||||
res = {
|
||||
type: "account_lock_res",
|
||||
field_0018: 1,
|
||||
field_001A: -1,
|
||||
field_001C: new Date(Date.now() + 3600000),
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "account_unlock_req":
|
||||
res = {
|
||||
type: "account_unlock_res",
|
||||
status: 1,
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "create_profile_req":
|
||||
res = {
|
||||
type: "generic_res",
|
||||
status: 1,
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "create_team_req":
|
||||
res = {
|
||||
type: "create_team_res",
|
||||
name: "ASS GENTLEMEN",
|
||||
members: [],
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "load_2on2_req":
|
||||
res = {
|
||||
type: "load_2on2_res",
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "load_config_req":
|
||||
res = {
|
||||
type: "load_config_res",
|
||||
status: 1,
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "load_config_v2_req":
|
||||
res = {
|
||||
type: "load_config_v2_res",
|
||||
status: 1,
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "discover_profile_req":
|
||||
res = {
|
||||
type: "discover_profile_res",
|
||||
result: true,
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "load_general_reward_req":
|
||||
// A non-generic response is also accepted, but why bother?
|
||||
res = {
|
||||
type: "generic_res",
|
||||
status: 1, // not even checked but let's be consistent
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "load_profile_req":
|
||||
res = {
|
||||
type: "load_profile_v2_res",
|
||||
name: "てすと",
|
||||
profileId: 0x11223344,
|
||||
lv: 69,
|
||||
fame: 1234,
|
||||
dpoint: 54321,
|
||||
teamId: 0x22334455,
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "load_reward_table_req":
|
||||
res = {
|
||||
type: "load_reward_table_res",
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "load_server_list_req":
|
||||
const myHost = hostname();
|
||||
|
||||
res = {
|
||||
type: "load_server_list_res",
|
||||
status: 1,
|
||||
userDb: {
|
||||
addr: myHost,
|
||||
tcp: 10000,
|
||||
http: 10001,
|
||||
},
|
||||
matchAddr: myHost,
|
||||
matchPort: {
|
||||
tcp: 10002,
|
||||
udpSend: 10003,
|
||||
udpRecv: 10004,
|
||||
},
|
||||
tagMatchPort: {
|
||||
tcp: 10005,
|
||||
udpSend: 10006,
|
||||
udpRecv: 10007,
|
||||
},
|
||||
event: {
|
||||
addr: myHost,
|
||||
tcp: 10008,
|
||||
},
|
||||
screenshot: {
|
||||
addr: myHost,
|
||||
tcp: 10009,
|
||||
},
|
||||
pingReturn: myHost,
|
||||
echo1: {
|
||||
addr: myHost,
|
||||
udp: 10010,
|
||||
},
|
||||
echo2: {
|
||||
addr: myHost,
|
||||
udp: 10011,
|
||||
},
|
||||
newsUrl: `http://${myHost}:10012/news`,
|
||||
reportErrorUrl: `http://${myHost}:10013/error`,
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "load_stocker_req":
|
||||
res = {
|
||||
type: "load_stocker_res",
|
||||
status: 1,
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "load_team_req":
|
||||
res = {
|
||||
type: "load_team_res",
|
||||
name: "ASS GENTLEMEN",
|
||||
members: [
|
||||
{
|
||||
name: "てすと",
|
||||
lv: 69,
|
||||
monthPoints: 1234,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "save_expedition_req":
|
||||
if (req.field_0004 === 0) {
|
||||
res = {
|
||||
type: "generic_res",
|
||||
status: 0,
|
||||
};
|
||||
} else {
|
||||
res = {
|
||||
type: "save_expedition_res",
|
||||
};
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case "update_provisional_store_rank_req":
|
||||
res = {
|
||||
type: "update_provisional_store_rank_res",
|
||||
rows: [],
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "save_profile_req":
|
||||
res = {
|
||||
type: "generic_res",
|
||||
status: 1,
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "save_settings_req":
|
||||
res = {
|
||||
type: "generic_res",
|
||||
status: 1, // ignored but whatever
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "update_story_clear_num_req":
|
||||
res = {
|
||||
type: "update_story_clear_num_res",
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
case "save_topic_req":
|
||||
res = {
|
||||
type: "save_topic_res",
|
||||
};
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
const exhaustCheck: never = req;
|
||||
|
||||
throw new Error(`Unhandled message ${req["type"]}`);
|
||||
}
|
||||
|
||||
output.write(res);
|
||||
output.write(dispatch(world, req));
|
||||
}
|
||||
} catch (e) {
|
||||
console.log("Idz: Error", e);
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
export class World {
|
||||
// Hand out references to some sort of backing store Repository objects here.
|
||||
}
|
||||
Reference in New Issue
Block a user