import logger from "debug"; import { createAutoTeam1, createAutoTeam2, loadTeam1, loadTeam2, } from "./_team"; import { checkTeamName1, checkTeamName2 } from "./checkTeamName"; import { createProfile1, createProfile2 } from "./createProfile"; import { createTeam1, createTeam2 } from "./createTeam"; import { discoverProfile1, discoverProfile2 } from "./discoverProfile"; import { generic } from "./generic"; import { lockProfile1, lockProfile2 } from "./lockProfile"; import { lockProfileExtend1, lockProfileExtend2 } from "./lockProfileExtend"; import { load2on2RankingPoints1, load2on2Info1, load2on2RankingPoints2, load2on2Info2, } from "./load2on2"; import { loadConfigA_1, loadConfigB_1, loadConfigA_2, loadConfigB_2, } from "./loadConfig"; import { loadEventInfo1, loadEventInfo2 } from "./loadEventInfo"; import { loadGacha1, loadGacha2 } from "./loadGacha"; import { loadGarage1, loadGarage2 } from "./loadGarage"; import { loadGeneralReward } from "./loadGeneralReward"; import { loadGhost } from "./loadGhost"; import { loadProfile2 } from "./loadProfile2"; import { loadProfile3 } from "./loadProfile3"; import { loadProfile4 } from "./loadProfile4"; import { loadRewardTable } from "./loadRewardTable"; import { loadServerList } from "./loadServerList"; import { loadStocker1, loadStocker2 } from "./loadStocker"; import { loadTeamRanking1, loadTeamRanking2 } from "./loadTeamRanking"; import { loadTopTen } from "./loadTopTen1"; import { loadTopTen2 } from "./loadTopTen2"; import { saveExpedition1, saveExpedition2 } from "./saveExpedition"; import { saveGarage1, saveGarage2 } from "./saveGarage"; import { saveNewCar1, saveNewCar2 } from "./saveNewCar"; import { saveTimeAttack1, saveTimeAttack2 } from "./saveTimeAttack"; import { saveTopic1, saveTopic2 } from "./saveTopic"; import { unlockProfile1, unlockProfile2 } from "./unlockProfile"; import { updateProvisionalStoreRank1, updateProvisionalStoreRank2, } from "./updateProvisionalStoreRank"; import { updateStoryClearNum1, updateStoryClearNum2, updateStoryClearNum3, } from "./updateStoryClearNum"; import { updateTeamLeader1, updateTeamLeader2 } from "./updateTeamLeader"; import { updateTeamMember1, updateTeamMember2 } from "./updateTeamMember"; import { Response } from "../response"; import { ClientHello } from "../../common"; const debug = logger("app:idz:userdb:encoder"); function encode110(res: Response): Buffer { switch (res.type) { case "check_team_name_res": return checkTeamName1(res); case "create_auto_team_res": return createAutoTeam1(res); case "create_profile_res": return createProfile1(res); case "create_team_res": return createTeam1(res); case "discover_profile_res": return discoverProfile1(res); case "generic_res": return generic(res); case "load_2on2_ranking_points_res": return load2on2RankingPoints1(res); case "load_2on2_info_res": return load2on2Info1(res); case "load_config_A_res": return loadConfigA_1(res); case "load_config_B_res": return loadConfigB_1(res); case "load_event_info_res": return loadEventInfo1(res); case "load_gacha_res": return loadGacha1(res); case "load_garage_res": return loadGarage1(res); case "load_general_reward_res": return loadGeneralReward(res); case "load_ghost_res": return loadGhost(res); case "load_profile_res": return loadProfile2(res); case "load_reward_table_res": return loadRewardTable(res); case "load_server_list_res": return loadServerList(res); case "load_stocker_res": return loadStocker1(res); case "load_team_res": return loadTeam1(res); case "load_team_ranking_res": return loadTeamRanking1(res); case "load_top_ten_res": return loadTopTen(res); case "lock_profile_extend_res": return lockProfileExtend1(res); case "lock_profile_res": return lockProfile1(res); case "save_expedition_res": return saveExpedition1(res); case "save_garage_res": return saveGarage1(res); case "save_new_car_res": return saveNewCar1(res); case "save_time_attack_res": return saveTimeAttack1(res); case "unlock_profile_res": return unlockProfile1(res); case "update_provisional_store_rank_res": return updateProvisionalStoreRank1(res); case "update_story_clear_num_res": return updateStoryClearNum1(res); case "update_team_leader_res": return updateTeamLeader1(res); case "update_team_member_res": return updateTeamMember1(res); case "save_topic_res": return saveTopic1(res); default: const exhaustCheck: never = res; throw new Error(`No writer fn for ${res["type"]}`); } } function encode130(res: Response): Buffer { switch (res.type) { case "check_team_name_res": return checkTeamName1(res); case "create_auto_team_res": return createAutoTeam1(res); case "create_profile_res": return createProfile1(res); case "create_team_res": return createTeam1(res); case "discover_profile_res": return discoverProfile1(res); case "generic_res": return generic(res); case "load_2on2_ranking_points_res": return load2on2RankingPoints1(res); case "load_2on2_info_res": return load2on2Info1(res); case "load_config_A_res": return loadConfigA_1(res); case "load_config_B_res": return loadConfigB_1(res); case "load_event_info_res": return loadEventInfo2(res); case "load_gacha_res": return loadGacha2(res); case "load_garage_res": return loadGarage2(res); case "load_general_reward_res": return loadGeneralReward(res); case "load_ghost_res": return loadGhost(res); case "load_profile_res": return loadProfile3(res); case "load_reward_table_res": return loadRewardTable(res); case "load_server_list_res": return loadServerList(res); case "load_stocker_res": return loadStocker2(res); case "load_team_res": return loadTeam2(res); case "load_team_ranking_res": return loadTeamRanking2(res); case "load_top_ten_res": return loadTopTen(res); case "lock_profile_extend_res": return lockProfileExtend2(res); case "lock_profile_res": return lockProfile2(res); case "save_expedition_res": return saveExpedition2(res); case "save_garage_res": return saveGarage1(res); case "save_new_car_res": return saveNewCar2(res); case "save_time_attack_res": return saveTimeAttack1(res); case "unlock_profile_res": return unlockProfile2(res); case "update_provisional_store_rank_res": return updateProvisionalStoreRank2(res); case "update_story_clear_num_res": return updateStoryClearNum2(res); case "update_team_leader_res": return updateTeamLeader2(res); case "update_team_member_res": return updateTeamMember2(res); case "save_topic_res": return saveTopic2(res); default: const exhaustCheck: never = res; throw new Error(`No writer fn for ${res["type"]}`); } } function encode210(res: Response): Buffer { switch (res.type) { case "check_team_name_res": return checkTeamName2(res); case "create_auto_team_res": return createAutoTeam2(res); case "create_profile_res": return createProfile2(res); case "create_team_res": return createTeam2(res); case "discover_profile_res": return discoverProfile2(res); case "generic_res": return generic(res); case "load_2on2_ranking_points_res": return load2on2RankingPoints2(res); case "load_2on2_info_res": return load2on2Info2(res); case "load_config_A_res": return loadConfigA_2(res); case "load_config_B_res": return loadConfigB_2(res); case "load_event_info_res": return loadEventInfo1(res); case "load_gacha_res": return loadGacha1(res); case "load_garage_res": return loadGarage1(res); case "load_general_reward_res": return loadGeneralReward(res); case "load_ghost_res": return loadGhost(res); case "load_profile_res": return loadProfile4(res); case "load_reward_table_res": return loadRewardTable(res); case "load_server_list_res": return loadServerList(res); case "load_stocker_res": return loadStocker1(res); case "load_team_res": return loadTeam1(res); case "load_team_ranking_res": return loadTeamRanking1(res); case "load_top_ten_res": return loadTopTen2(res); case "lock_profile_extend_res": return lockProfileExtend1(res); case "lock_profile_res": return lockProfile1(res); case "save_expedition_res": return saveExpedition2(res); case "save_garage_res": return saveGarage2(res); case "save_new_car_res": return saveNewCar1(res); case "save_time_attack_res": return saveTimeAttack2(res); case "unlock_profile_res": return unlockProfile1(res); case "update_provisional_store_rank_res": return updateProvisionalStoreRank1(res); case "update_story_clear_num_res": return updateStoryClearNum3(res); case "update_team_leader_res": return updateTeamLeader1(res); case "update_team_member_res": return updateTeamMember1(res); case "save_topic_res": return saveTopic1(res); default: const exhaustCheck: never = res; throw new Error(`No writer fn for ${res["type"]}`); } } function encode(res: Response, clientHello: ClientHello) { switch (clientHello.protocol) { case "110": return encode110(res); case "130": return encode130(res); case "210": return encode210(res); default: throw new Error(`Unsupported protocol version ${clientHello.protocol}`); } } export default function writeResponse( res: Response, clientHello: ClientHello ) { debug("Object: %j", res); const buf = encode(res, clientHello); if (debug.enabled) { debug("Encoded: %s", buf.toString("hex")); } if (buf.readInt16LE(0) === 0) { throw new Error("Programming error: missing message type code"); } return buf; }