mirror of
https://github.com/maierfelix/POGOserver.git
synced 2026-07-03 16:52:41 -05:00
Big update
- Added SfidaActionLogMessage to proto list - Updated readme - Moved requests file - Moved responses into seperate file - Test pokecoins and stardust - Added basic forts - Basic wild encounters - Basic journal (buggy) - Basic level up (buggy)
This commit is contained in:
parent
6ef63b02f4
commit
f776496bd2
2
POGOProtos/POGOProtos.proto
vendored
2
POGOProtos/POGOProtos.proto
vendored
|
|
@ -57,6 +57,7 @@ import public "POGOProtos/Networking/Requests/Messages/SetContactSettingsMessage
|
|||
import public "POGOProtos/Networking/Requests/Messages/SetFavoritePokemonMessage.proto";
|
||||
import public "POGOProtos/Networking/Requests/Messages/SetPlayerTeamMessage.proto";
|
||||
import public "POGOProtos/Networking/Requests/Messages/StartGymBattleMessage.proto";
|
||||
import public "POGOProtos/Networking/Requests/Messages/SfidaActionLogMessage.proto";
|
||||
import public "POGOProtos/Networking/Requests/Messages/UpgradePokemonMessage.proto";
|
||||
import public "POGOProtos/Networking/Requests/Messages/UseIncenseMessage.proto";
|
||||
import public "POGOProtos/Networking/Requests/Messages/UseItemCaptureMessage.proto";
|
||||
|
|
@ -111,6 +112,7 @@ import public "POGOProtos/Networking/Responses/SetContactSettingsResponse.proto"
|
|||
import public "POGOProtos/Networking/Responses/SetFavoritePokemonResponse.proto";
|
||||
import public "POGOProtos/Networking/Responses/SetPlayerTeamResponse.proto";
|
||||
import public "POGOProtos/Networking/Responses/StartGymBattleResponse.proto";
|
||||
import public "POGOProtos/Networking/Responses/SfidaActionLogResponse.proto";
|
||||
import public "POGOProtos/Networking/Responses/UpgradePokemonResponse.proto";
|
||||
import public "POGOProtos/Networking/Responses/UseIncenseResponse.proto";
|
||||
import public "POGOProtos/Networking/Responses/UseItemCaptureResponse.proto";
|
||||
|
|
|
|||
11
README.md
11
README.md
|
|
@ -8,17 +8,10 @@ ______ _____ _____ _____
|
|||
````
|
||||
|
||||
<a href="#">
|
||||
<img src="https://img.shields.io/badge/Pokemon%20GO-0.31.0-blue.svg?style=flat-square" />
|
||||
<img src="https://img.shields.io/badge/Pokemon%20GO-0.33.0-blue.svg?style=flat-square" />
|
||||
</a>
|
||||
<a href="https://discord.gg/M3bdv">
|
||||
<img src="https://img.shields.io/badge/Discord-Join%20Chat%20%E2%86%92-738bd7.svg?style=flat-square" />
|
||||
</a>
|
||||
|
||||
Pokemon GO server emulation
|
||||
|
||||
TODO:
|
||||
- [ ] Auth phase
|
||||
- [ ] Database
|
||||
- [ ] Player objects
|
||||
- [ ] Map server
|
||||
- [ ] Receive GPS data
|
||||
Pokemon GO server emulation
|
||||
|
|
@ -47,7 +47,7 @@ export function getUserByEmail(email) {
|
|||
return new Promise((resolve) => {
|
||||
let collection = this.getUserCollection();
|
||||
collection.find({email: email}).toArray((err, docs) => {
|
||||
resolve(docs);
|
||||
resolve(docs[0]);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
@ -67,9 +67,10 @@ export function createUser(obj) {
|
|||
email: obj.email,
|
||||
position: obj.position,
|
||||
exp: obj.exp,
|
||||
stardust: obj.stardust,
|
||||
pokecoins: obj.pokecoins,
|
||||
avatar: obj.avatar
|
||||
stardust: 1337,
|
||||
pokecoins: 1338,
|
||||
avatar: obj.avatar,
|
||||
contact_settings: obj.contact_settings
|
||||
};
|
||||
|
||||
return new Promise((resolve) => {
|
||||
|
|
@ -89,9 +90,10 @@ export function updateUser(obj) {
|
|||
email: obj.email,
|
||||
position: obj.position,
|
||||
exp: obj.exp,
|
||||
stardust: obj.stardust,
|
||||
pokecoins: obj.pokecoins,
|
||||
avatar: obj.avatar
|
||||
stardust: 1337,
|
||||
pokecoins: 1338,
|
||||
avatar: obj.avatar,
|
||||
contact_settings: obj.contact_settings
|
||||
};
|
||||
|
||||
return new Promise((resolve) => {
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ import * as _setup from "./setup";
|
|||
import * as _cycle from "./cycle";
|
||||
import * as _player from "./player";
|
||||
import * as _request from "./request";
|
||||
import * as _response from "./response";
|
||||
import * as _process from "./process";
|
||||
import * as _database from "./database";
|
||||
|
||||
|
|
@ -118,6 +119,7 @@ inherit(GameServer, _setup);
|
|||
inherit(GameServer, _cycle);
|
||||
inherit(GameServer, _player);
|
||||
inherit(GameServer, _request);
|
||||
inherit(GameServer, _response);
|
||||
inherit(GameServer, _process);
|
||||
inherit(GameServer, _database);
|
||||
|
||||
|
|
|
|||
21
src/packets/Responses.FortDetails.js
Normal file
21
src/packets/Responses.FortDetails.js
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
import * as CFG from "../../cfg";
|
||||
|
||||
import proto from "../proto";
|
||||
|
||||
/**
|
||||
* @param {Object} obj
|
||||
* @return {Object}
|
||||
*/
|
||||
export default function FortDetails(obj) {
|
||||
|
||||
return (
|
||||
new proto.Networking.Responses.FortDetailsResponse({
|
||||
fort_id: "cbb56441628d4a4d88f1c00b5b545684.16",
|
||||
name: "Bauer Vom Lande",
|
||||
image_urls: ["http://lh3.ggpht.com/Pu8QxppOJjm3gNI8wO_--2CcyXmfeOH8CTb3DionlzCpo7stk3pjlV_c9-kMakhtFyygN62WuNJaTsIiTw334UVmHZgEXDCj"],
|
||||
type: proto.Map.Fort.FortType.CHECKPOINT,
|
||||
description: "meow!"
|
||||
}).encode()
|
||||
);
|
||||
|
||||
}
|
||||
32
src/packets/Responses.FortSearch.js
Normal file
32
src/packets/Responses.FortSearch.js
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
import * as CFG from "../../cfg";
|
||||
|
||||
import proto from "../proto";
|
||||
|
||||
/**
|
||||
* @param {Object} obj
|
||||
* @return {Object}
|
||||
*/
|
||||
export default function FortSearch(obj) {
|
||||
|
||||
return (
|
||||
new proto.Networking.Responses.FortSearchResponse({
|
||||
result: proto.Networking.Responses.FortSearchResponse.Result.SUCCESS,
|
||||
items_awarded: [
|
||||
new proto.Inventory.Item.ItemAward({
|
||||
item_id: proto.Inventory.Item.ItemId.ITEM_ULTRA_BALL,
|
||||
item_count: 1
|
||||
}),
|
||||
new proto.Inventory.Item.ItemAward({
|
||||
item_id: proto.Inventory.Item.ItemId.ITEM_GREAT_BALL,
|
||||
item_count: 2
|
||||
})
|
||||
],
|
||||
gems_awarded: 0,
|
||||
pokemon_data_egg: null,
|
||||
experience_awarded: 100,
|
||||
cooldown_complete_timestamp_ms: 1470174535972,
|
||||
chain_hack_sequence_number: 0
|
||||
}).encode()
|
||||
);
|
||||
|
||||
}
|
||||
|
|
@ -9,10 +9,10 @@ export default function GetDownloadUrls() {
|
|||
|
||||
let download_urls = [
|
||||
DownloadUrlEntry({
|
||||
url: "",
|
||||
asset_id: "",
|
||||
size: 0,
|
||||
checksum: 0
|
||||
asset_id: "9649e04b-ccd8-4b1c-b066-cc75ed4c0976/1467338147687000",
|
||||
url: "https://storage.googleapis.com/cloud_assets_pgorelease/bundles/android/pm0101?generation=1467338147687000&GoogleAccessId=pgorelease-service-account@pgorelease.iam.gserviceaccount.com&Expires=1469970173&Signature=CY4YbWipMVMUzyDgHGceoo2NO429spFyH39p%2FSMltBlQOBYLcRD8panRgTH8tuMc3uB65rtp613IkGwUMaMMXx40v0NBECEsRXcggYxYluO2k4waShMyOmWHOomMPKwGXg5ot93wLH6aXFwv0%2FD%2FUaqZDrJYJ9bMRcsF2KlPPy363XbrbcSCcT19otqU3D9yjWU1mDbzRy9yZRqmaCu%2FPtWHKKWnUKiN2f2UqL8Gbulex8BDpm4OKf4lXnOwAKYDpcAMph%2FC3LKVhvoRuryzPRJgXojb1CvfHaY0svUFoKq0N%2FuFl9hzR8RAVLsAPaD%2FpKuql4BUm%2BZtoc%2BWi0lQXA%3D%3D",
|
||||
size: 169205,
|
||||
checksum: 0xbe30d925
|
||||
})
|
||||
];
|
||||
|
||||
|
|
|
|||
|
|
@ -15,28 +15,54 @@ export default function GetInventoryData(obj) {
|
|||
new proto.Inventory.InventoryItem({
|
||||
inventory_item_data: new proto.Inventory.InventoryItemData({
|
||||
"player_stats": new proto.Data.Player.PlayerStats({
|
||||
"level": 99,
|
||||
"experience": 1304364,
|
||||
"prev_level_xp": 900000,
|
||||
"next_level_xp": 1350000,
|
||||
"km_walked": 54.55459213256836,
|
||||
"pokemons_encountered": 3942,
|
||||
"unique_pokedex_entries": 93,
|
||||
"pokemons_captured": 3569,
|
||||
"evolutions": 782,
|
||||
"poke_stop_visits": 3113,
|
||||
"pokeballs_thrown": 5783,
|
||||
"eggs_hatched": 27,
|
||||
"big_magikarp_caught": 11,
|
||||
"battle_attack_won": 36,
|
||||
"battle_attack_total": 44,
|
||||
"level": 3,
|
||||
"experience": 2000,
|
||||
"prev_level_xp": 1000,
|
||||
"next_level_xp": 6000,
|
||||
"km_walked": 0.55459213256836,
|
||||
"pokemons_encountered": 1,
|
||||
"unique_pokedex_entries": 1,
|
||||
"pokemons_captured": 1,
|
||||
"evolutions": 0,
|
||||
"poke_stop_visits": 1,
|
||||
"pokeballs_thrown": 1,
|
||||
"eggs_hatched": 0,
|
||||
"big_magikarp_caught": 0,
|
||||
"battle_attack_won": 0,
|
||||
"battle_attack_total": 0,
|
||||
"battle_defended_won": 0,
|
||||
"battle_training_won": 1,
|
||||
"battle_training_total": 2,
|
||||
"prestige_raised_total": 190,
|
||||
"prestige_dropped_total": 27000,
|
||||
"pokemon_deployed": 2,
|
||||
"small_rattata_caught": 79
|
||||
"battle_training_won": 0,
|
||||
"battle_training_total": 0,
|
||||
"prestige_raised_total": 0,
|
||||
"prestige_dropped_total": 0,
|
||||
"pokemon_deployed": 0,
|
||||
"small_rattata_caught": 0
|
||||
})
|
||||
})
|
||||
}),
|
||||
// player camera
|
||||
new proto.Inventory.InventoryItem({
|
||||
inventory_item_data: new proto.Inventory.InventoryItemData({
|
||||
"player_camera": new proto.Data.Player.PlayerCamera({
|
||||
is_default_camera: true
|
||||
})
|
||||
})
|
||||
}),
|
||||
// player currencies
|
||||
new proto.Inventory.InventoryItem({
|
||||
inventory_item_data: new proto.Inventory.InventoryItemData({
|
||||
"player_currency": new proto.Data.Player.PlayerCurrency({
|
||||
gems: 0
|
||||
})
|
||||
})
|
||||
}),
|
||||
// item
|
||||
new proto.Inventory.InventoryItem({
|
||||
inventory_item_data: new proto.Inventory.InventoryItemData({
|
||||
"item": new proto.Inventory.Item.ItemData({
|
||||
item_id: proto.Inventory.Item.ItemId.ITEM_MASTER_BALL,
|
||||
count: 4,
|
||||
unseen: false
|
||||
})
|
||||
})
|
||||
}),
|
||||
|
|
@ -44,9 +70,9 @@ export default function GetInventoryData(obj) {
|
|||
new proto.Inventory.InventoryItem({
|
||||
inventory_item_data: new proto.Inventory.InventoryItemData({
|
||||
"pokedex_entry": new proto.Data.PokedexEntry({
|
||||
"pokemon_id": 147,
|
||||
"times_encountered": 7,
|
||||
"times_captured": 6,
|
||||
"pokemon_id": 6,
|
||||
"times_encountered": 1,
|
||||
"times_captured": 1,
|
||||
"evolution_stone_pieces": 0,
|
||||
"evolution_stones": 0
|
||||
})
|
||||
|
|
|
|||
|
|
@ -18,27 +18,64 @@ export default function GetMapObjects(request) {
|
|||
new proto.Map.Fort.FortData({
|
||||
id: "wuff",
|
||||
last_modified_timestamp_ms: new Date().getTime() * 1000,
|
||||
latitude: 39.1893730163574220,
|
||||
longitude: -96.5853271484375000,
|
||||
latitude: 39.19047143172651,
|
||||
longitude: -96.58502161502833,
|
||||
owned_by_team: 2,
|
||||
guard_pokemon_id: 150,
|
||||
guard_pokemon_cp: 2000,
|
||||
gym_points: 1000,
|
||||
is_in_battle: false,
|
||||
enabled: true,
|
||||
type: proto.Map.Fort.FortType.GYM,
|
||||
type: proto.Map.Fort.FortType.CHECKPOINT,
|
||||
sponsor: proto.Map.Fort.FortSponsor.MCDONALDS,
|
||||
rendering_type: proto.Map.Fort.FortRenderingType.DEFAULT
|
||||
})
|
||||
],
|
||||
spawn_points: [ ],
|
||||
spawn_points: [],
|
||||
deleted_objects: [ ],
|
||||
is_truncated_list: false,
|
||||
fort_summaries: [ ],
|
||||
decimated_spawn_points: [ ],
|
||||
wild_pokemons: [ ],
|
||||
catchable_pokemons: [ ],
|
||||
nearby_pokemons: [ ]
|
||||
wild_pokemons: [
|
||||
new proto.Map.Pokemon.WildPokemon({
|
||||
encounter_id: 6180230722423979422,
|
||||
last_modified_timestamp_ms: new Date().getTime() * 1e3,
|
||||
latitude: 39.19047143172621,
|
||||
longitude: -96.58502161502838,
|
||||
spawn_point_id: "",
|
||||
pokemon_data: new proto.Data.PokemonData({
|
||||
"move_1": 211,
|
||||
"move_2": 45,
|
||||
"pokemon_id": 21,
|
||||
"height_m": 0.2640344202518463,
|
||||
"stamina_max": 14,
|
||||
"weight_kg": 1.2240252494812012,
|
||||
"individual_defense": 8,
|
||||
"stamina": 14,
|
||||
"individual_stamina": 10,
|
||||
"individual_attack": 12,
|
||||
"cp": 27
|
||||
}),
|
||||
time_till_hidden_ms: 597695
|
||||
})
|
||||
],
|
||||
catchable_pokemons: [
|
||||
new proto.Map.Pokemon.MapPokemon({
|
||||
spawn_point_id: "",
|
||||
encounter_id: 6180230722423979422,
|
||||
pokemon_id: proto.Enums.PokemonId.SPEAROW,
|
||||
expiration_timestamp_ms: (new Date().getTime() + 1e6) * 1e3,
|
||||
latitude: 39.19047143172621,
|
||||
longitude: -96.58502161502838
|
||||
})
|
||||
],
|
||||
nearby_pokemons: [
|
||||
new proto.Map.Pokemon.NearbyPokemon({
|
||||
pokemon_id: proto.Enums.PokemonId.SPEAROW,
|
||||
distance_in_meters: 1.0,
|
||||
encounter_id: 6180230722423979422
|
||||
})
|
||||
]
|
||||
}));
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -18,9 +18,7 @@ function getPlayerDataPacket(obj) {
|
|||
daily_bonus: new proto.Data.Player.DailyBonus({
|
||||
next_defender_bonus_collect_timestamp_ms: 1470174535972
|
||||
}),
|
||||
contact_settings: new proto.Data.Player.ContactSettings({
|
||||
send_marketing_emails: true
|
||||
}),
|
||||
contact_settings: new proto.Data.Player.ContactSettings(obj.contact_settings),
|
||||
currencies: obj.currencies
|
||||
})
|
||||
);
|
||||
|
|
@ -51,6 +49,8 @@ function buildPlayerData(obj) {
|
|||
backpack: 1
|
||||
};
|
||||
|
||||
let contact_settings = obj.contact_settings;
|
||||
|
||||
let tutorial_state = [
|
||||
proto.Enums.TutorialState.LEGAL_SCREEN,
|
||||
proto.Enums.TutorialState.AVATAR_SELECTION,
|
||||
|
|
@ -74,6 +74,7 @@ function buildPlayerData(obj) {
|
|||
username: username,
|
||||
team: team,
|
||||
tutorial_state: tutorial_state,
|
||||
contact_settings: contact_settings,
|
||||
avatar: avatar,
|
||||
currencies: currencies
|
||||
});
|
||||
|
|
|
|||
|
|
@ -13,46 +13,12 @@ export default function ItemTemplates(obj) {
|
|||
success: true,
|
||||
item_templates: new proto.Networking.Responses.DownloadItemTemplatesResponse.ItemTemplate({
|
||||
pokemon_settings: null,
|
||||
// unused but saved here for later use
|
||||
item_settings: new proto.Settings.Master.ItemSettings({
|
||||
"item_id": 702,
|
||||
"item_type": 6,
|
||||
"category": 2,
|
||||
"drop_freq": 0,
|
||||
"drop_trainer_level": 0,
|
||||
"pokeball": null,
|
||||
"potion": null,
|
||||
"revive": null,
|
||||
"battle": null,
|
||||
"food": null,
|
||||
"inventory_upgrade": null,
|
||||
"xp_boost": null,
|
||||
"incense": null,
|
||||
"egg_incubator": null,
|
||||
"fort_modifier": null
|
||||
}),
|
||||
// unused but saved here for later use
|
||||
move_settings: new proto.Settings.Master.MoveSettings({
|
||||
"movement_id": 13,
|
||||
"animation_id": 5,
|
||||
"pokemon_type": 1,
|
||||
"power": 25,
|
||||
"accuracy_chance": 1,
|
||||
"critical_chance": 0.05000000074505806,
|
||||
"heal_scalar": 0,
|
||||
"stamina_loss_scalar": 0.05999999865889549,
|
||||
"trainer_level_min": 1,
|
||||
"trainer_level_max": 100,
|
||||
"vfx_name": "wrap",
|
||||
"duration_ms": 4000,
|
||||
"damage_window_start_ms": 2800,
|
||||
"damage_window_end_ms": 3400,
|
||||
"energy_delta": -20
|
||||
}),
|
||||
// unused but saved here for later use
|
||||
move_sequence_settings: new proto.Settings.Master.MoveSequenceSettings({
|
||||
"sequence": ["anim attacker atk-move", "f2fvfx attacker acid_fast", "sfx attacker 051-0_acid", "wait 0.15", "vfx defender acid_fast_hit", "anim defender damageS01", "wait 0.35", "sys ui-sync", "sys complete"]
|
||||
}),
|
||||
item_settings: null,
|
||||
move_settings: null,
|
||||
move_sequence_settings: null,
|
||||
camera: null,
|
||||
iap_item_display: null,
|
||||
equipped_badges: null,
|
||||
type_effective: new proto.Settings.Master.TypeEffectiveSettings({
|
||||
"attack_scalar": [1, 0.800000011920929, 0.800000011920929, 0.800000011920929, 1, 1, 1, 0.800000011920929, 0.800000011920929, 0.800000011920929, 1, 1.25, 1, 1.25, 1, 1, 1.25, 0.800000011920929],
|
||||
"attack_type": 7
|
||||
|
|
@ -62,25 +28,6 @@ export default function ItemTemplates(obj) {
|
|||
"badge_rank": 4,
|
||||
"targets": [10, 100, 1000]
|
||||
}),
|
||||
// unused but saved here for later use
|
||||
camera: new proto.Settings.Master.CameraSettings({
|
||||
"next_camera": "",
|
||||
"interpolation": [1],
|
||||
"target_type": [12],
|
||||
"ease_in_speed": [0],
|
||||
"east_out_speed": [0],
|
||||
"duration_seconds": [5],
|
||||
"wait_seconds": [0],
|
||||
"transition_seconds": [0.5],
|
||||
"angle_degree": [-20],
|
||||
"angle_offset_degree": [0],
|
||||
"pitch_degree": [20],
|
||||
"pitch_offset_degree": [0],
|
||||
"roll_degree": [0],
|
||||
"distance_meters": [4],
|
||||
"height_percent": [0],
|
||||
"vert_ctr_ratio": [1]
|
||||
}),
|
||||
player_level: new proto.Settings.Master.PlayerLevelSettings({
|
||||
"rank_num": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||||
"required_experience": [0, 1000, 3000, 6000, 10000, 15000, 21000, 28000, 36000, 45000, 55000, 65000, 75000, 85000, 100000, 120000, 140000, 160000, 185000, 210000, 260000, 335000, 435000, 560000, 710000, 900000, 1100000, 1350000, 1650000, 2000000, 2500000, 3000000, 3750000, 4750000, 6000000, 7500000, 9500000, 12000000, 15000000, 20000000],
|
||||
|
|
@ -117,7 +64,6 @@ export default function ItemTemplates(obj) {
|
|||
"nice_throw_threshold": 1,
|
||||
"milestone_threshold": 100
|
||||
}),
|
||||
iap_item_display: null, // seems like useless??
|
||||
iap_settings: new proto.Settings.Master.IapSettings({
|
||||
"daily_bonus_coins": 0,
|
||||
"daily_defender_bonus_per_pokemon": [500, 10],
|
||||
|
|
@ -132,8 +78,7 @@ export default function ItemTemplates(obj) {
|
|||
"allowed_levels_above_player": 2,
|
||||
"candy_cost": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 15, 15],
|
||||
"stardust_cost": [200, 200, 400, 400, 600, 600, 800, 800, 1000, 1000, 1300, 1300, 1600, 1600, 1900, 1900, 2200, 2200, 2500, 2500, 3000, 3000, 3500, 3500, 4000, 4000, 4500, 4500, 5000, 5000, 6000, 6000, 7000, 7000, 8000, 8000, 9000, 9000, 10000, 10000]
|
||||
}),
|
||||
equipped_badges: null // seems like unused
|
||||
})
|
||||
}),
|
||||
timestamp_ms: 1468540960537
|
||||
}).encode()
|
||||
|
|
|
|||
24
src/packets/Responses.LevelUpRewards.js
Normal file
24
src/packets/Responses.LevelUpRewards.js
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
import proto from "../proto";
|
||||
|
||||
import { GetPlayer } from "./";
|
||||
|
||||
/**
|
||||
* @param {Object} obj
|
||||
* @return {Object}
|
||||
*/
|
||||
export default function LevelUpRewards(obj) {
|
||||
|
||||
return (
|
||||
new proto.Networking.Responses.LevelUpRewardsResponse({
|
||||
result: proto.Networking.Responses.LevelUpRewardsResponse.Result.SUCCESS,
|
||||
items_awarded: [
|
||||
new proto.Inventory.Item.ItemAward({
|
||||
item_id: proto.Inventory.Item.ItemId.ITEM_GREAT_BALL,
|
||||
item_count: 2
|
||||
})
|
||||
],
|
||||
items_unlocked: []
|
||||
}).encode()
|
||||
);
|
||||
|
||||
}
|
||||
18
src/packets/Responses.MarkTutorialComplete.js
Normal file
18
src/packets/Responses.MarkTutorialComplete.js
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
import proto from "../proto";
|
||||
|
||||
import { GetPlayer } from "./";
|
||||
|
||||
/**
|
||||
* @param {Player} player
|
||||
* @return {Object}
|
||||
*/
|
||||
export default function MarkTutorialComplete(player) {
|
||||
|
||||
return (
|
||||
new proto.Networking.Respones.MarkTutorialCompleteResponse({
|
||||
success: true,
|
||||
player_data: GetPlayer(player).player_data
|
||||
}).encode()
|
||||
);
|
||||
|
||||
}
|
||||
18
src/packets/Responses.SetAvatar.js
Normal file
18
src/packets/Responses.SetAvatar.js
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
import proto from "../proto";
|
||||
|
||||
import { GetPlayer } from "./";
|
||||
|
||||
/**
|
||||
* @param {Player} player
|
||||
* @return {Object}
|
||||
*/
|
||||
export default function SetAvatar(player) {
|
||||
|
||||
return (
|
||||
new proto.Networking.Responses.SetAvatarResponse({
|
||||
status: proto.Networking.Responses.SetAvatarResponse.Status.SUCCESS,
|
||||
player_data: GetPlayer(player).player_data
|
||||
}).encode()
|
||||
);
|
||||
|
||||
}
|
||||
20
src/packets/Responses.SetContactSettings.js
Normal file
20
src/packets/Responses.SetContactSettings.js
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
import * as CFG from "../../cfg";
|
||||
|
||||
import proto from "../proto";
|
||||
|
||||
import { GetPlayer } from "./";
|
||||
|
||||
/**
|
||||
* @param {Player} player
|
||||
* @return {Object}
|
||||
*/
|
||||
export default function SetContactSettings(player) {
|
||||
|
||||
return (
|
||||
new proto.Networking.Responses.SetContactSettingsResponse({
|
||||
status: proto.Networking.Responses.SetContactSettingsResponse.Status.SUCCESS,
|
||||
player_data: GetPlayer(player).player_data
|
||||
}).encode()
|
||||
);
|
||||
|
||||
}
|
||||
50
src/packets/Responses.SfidaActionLog.js
Normal file
50
src/packets/Responses.SfidaActionLog.js
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
import proto from "../proto";
|
||||
|
||||
import * as CFG from "../../cfg";
|
||||
|
||||
/**
|
||||
* @param {Object} obj
|
||||
* @return {Object}
|
||||
*/
|
||||
export default function SfidaActionLog(obj) {
|
||||
|
||||
return (
|
||||
new proto.Networking.Responses.SfidaActionLogResponse({
|
||||
result: proto.Networking.Responses.SfidaActionLogResponse.Result.SUCCESS,
|
||||
log_entries: [
|
||||
new proto.Data.Logs.ActionLogEntry({
|
||||
timestamp_ms: (new Date().getTime() - 1e4) * 1e3,
|
||||
fort_search: new proto.Data.Logs.FortSearchLogEntry({
|
||||
result: proto.Data.Logs.FortSearchLogEntry.Result.SUCCESS,
|
||||
fort_id: "wurf",
|
||||
items: [
|
||||
new proto.Inventory.Item.ItemData({
|
||||
item_id: proto.Inventory.Item.ItemId.ITEM_MASTER_BALL,
|
||||
count: 2,
|
||||
unseen: false
|
||||
})
|
||||
]
|
||||
})
|
||||
})
|
||||
/*,
|
||||
new proto.Data.Logs.ActionLogEntry({
|
||||
timestamp_ms: (new Date().getTime() - 1e3) * 1e3,
|
||||
catch_pokemon: new proto.Data.Logs.CatchPokemonLogEntry({
|
||||
result: proto.Data.Logs.CatchPokemonLogEntry.Result.SUCCESS,
|
||||
pokemon_id: proto.Enums.PokemonId.PIDGEY,
|
||||
combat_points: 352
|
||||
})
|
||||
}),
|
||||
new proto.Data.Logs.ActionLogEntry({
|
||||
timestamp_ms: (new Date().getTime() - 1e2) * 1e3,
|
||||
catch_pokemon: new proto.Data.Logs.CatchPokemonLogEntry({
|
||||
result: proto.Data.Logs.CatchPokemonLogEntry.Result.SUCCESS,
|
||||
pokemon_id: proto.Enums.PokemonId.CHARIZARD,
|
||||
combat_points: 963
|
||||
})
|
||||
})*/
|
||||
]
|
||||
}).encode()
|
||||
);
|
||||
|
||||
}
|
||||
|
|
@ -7,12 +7,24 @@ export GetInventory from "./Responses.GetInventory";
|
|||
export GetPlayer from "./Responses.GetPlayer";
|
||||
export GetPlayerProfile from "./Responses.GetPlayerProfile";
|
||||
|
||||
export FortDetails from "./Responses.FortDetails";
|
||||
export FortSearch from "./Responses.FortSearch";
|
||||
export GetMapObjects from "./Responses.GetMapObjects";
|
||||
|
||||
export SetContactSettings from "./Responses.SetContactSettings";
|
||||
|
||||
export ItemTemplates from "./Responses.ItemTemplates";
|
||||
export CheckAwardedBadges from "./Responses.CheckAwardedBadges";
|
||||
export GetDownloadUrls from "./Responses.GetDownloadUrls";
|
||||
|
||||
export MarkTutorialComplete from "./Responses.MarkTutorialComplete";
|
||||
|
||||
export LevelUpRewards from "./Responses.LevelUpRewards";
|
||||
|
||||
export SetAvatar from "./Responses.SetAvatar";
|
||||
|
||||
export SfidaActionLog from "./Responses.SfidaActionLog";
|
||||
|
||||
export AuthTicket from "./Envelopes.AuthTicket";
|
||||
export ResponseEnvelope from "./Envelopes.ResponseEnvelope";
|
||||
export ResponseEnvelopeAuth from "./Envelopes.ResponseEnvelope.Auth";
|
||||
112
src/player.js
112
src/player.js
|
|
@ -7,6 +7,8 @@ import {
|
|||
decodeRequestEnvelope
|
||||
} from "./utils";
|
||||
|
||||
import { GetPlayer } from "./packets";
|
||||
|
||||
/**
|
||||
* @class Player
|
||||
*/
|
||||
|
|
@ -26,12 +28,28 @@ class Player {
|
|||
altitude: 0
|
||||
};
|
||||
|
||||
this.contact_settings = {
|
||||
send_marketing_emails: false,
|
||||
send_push_notifications: false
|
||||
};
|
||||
|
||||
this.exp = 0;
|
||||
|
||||
this.stardust = 0;
|
||||
this.pokecoins = 0;
|
||||
this.stardust = 1337;
|
||||
this.pokecoins = 1338;
|
||||
|
||||
this.avatar = {
|
||||
skin: 0,
|
||||
hair: 2,
|
||||
shirt: 1,
|
||||
pants: 2,
|
||||
hat: 0,
|
||||
shoes: 2,
|
||||
eyes: 3,
|
||||
gender: proto.Enums.Gender.MALE,
|
||||
backpack: 1
|
||||
};
|
||||
|
||||
this.avatar = null;
|
||||
this.badges = null;
|
||||
this.pokedex = null;
|
||||
this.inventory = null;
|
||||
|
|
@ -85,9 +103,32 @@ class Player {
|
|||
|
||||
updateAvatar(req) {
|
||||
|
||||
let data = proto.Networking.Requests.Messages.SetAvatarMessage.decode(req.request_message.toBuffer());
|
||||
let data = proto.Networking.Requests.Messages.SetAvatarMessage.decode(req.request_message.toBuffer()).player_avatar;
|
||||
|
||||
this.avatar = data.player_avatar;
|
||||
if (!data) return void 0;
|
||||
|
||||
this.avatar = {
|
||||
skin: data.skin,
|
||||
hair: data.hair,
|
||||
shirt: data.shirt,
|
||||
pants: data.pants,
|
||||
hat: data.hat,
|
||||
shoes: data.shoes,
|
||||
eyes: data.eyes,
|
||||
gender: data.gender,
|
||||
backpack: data.backpack
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
updateContactSettings(req) {
|
||||
|
||||
let data = proto.Networking.Requests.Messages.SetContactSettingsMessage.decode(req.request_message.toBuffer()).contact_settings;
|
||||
|
||||
if (!data) return void 0;
|
||||
|
||||
this.contact_settings.send_marketing_emails = data.send_marketing_emails;
|
||||
this.contact_settings.send_push_notifications = data.send_push_notifications;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -210,6 +251,65 @@ export function savePlayers() {
|
|||
* @param {Player} player
|
||||
*/
|
||||
export function savePlayer(player) {
|
||||
this.updateUser(player);
|
||||
if (player.authenticated) {
|
||||
this.updateUser(player);
|
||||
}
|
||||
//this.print(`${player.remoteAddress} saved into database`, 34);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Object} doc
|
||||
*/
|
||||
export function loginPlayer(doc) {
|
||||
|
||||
let buffer = null;
|
||||
let player = this.player;
|
||||
|
||||
return new Promise((resolve) => {
|
||||
this.getUserByEmail(player.email).then((doc) => {
|
||||
player.updateByObject(doc);
|
||||
buffer = GetPlayer(doc).encode();
|
||||
resolve(buffer);
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
export function forwardPlayer() {
|
||||
|
||||
let player = this.player;
|
||||
|
||||
return new Promise((resolve) => {
|
||||
this.getUserByEmail(player.email).then((doc) => {
|
||||
if (doc === void 0) {
|
||||
this.registerPlayer(doc).then((res) => {
|
||||
resolve(res);
|
||||
});
|
||||
}
|
||||
else {
|
||||
this.loginPlayer(doc).then((res) => {
|
||||
resolve(res);
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Object} doc
|
||||
*/
|
||||
export function registerPlayer(doc) {
|
||||
|
||||
let player = this.player;
|
||||
|
||||
return new Promise((resolve) => {
|
||||
this.createUser(player).then(() => {
|
||||
this.print(`${this.player.email.replace("@gmail.com", "")} registered!`, 36);
|
||||
this.loginPlayer(doc).then((res) => {
|
||||
resolve(res);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
217
src/request.js
217
src/request.js
|
|
@ -2,23 +2,13 @@ import fs from "fs";
|
|||
import proto from "./proto";
|
||||
|
||||
import * as CFG from "../cfg";
|
||||
import { REQUEST } from "../requests";
|
||||
import { REQUEST } from "./requests";
|
||||
|
||||
import {
|
||||
ResponseEnvelope,
|
||||
ResponseEnvelopeAuth,
|
||||
AuthTicket,
|
||||
GetInventory,
|
||||
GetHatchedEggs,
|
||||
CheckAwardedBadges,
|
||||
DownloadSettings,
|
||||
DownloadRemoteConfigVersion,
|
||||
GetPlayer,
|
||||
GetPlayerProfile,
|
||||
ItemTemplates,
|
||||
GetAssetDigest,
|
||||
GetDownloadUrls,
|
||||
GetMapObjects
|
||||
GetInventory
|
||||
} from "./packets";
|
||||
|
||||
import { decodeRequestEnvelope } from "./utils";
|
||||
|
|
@ -41,11 +31,17 @@ export function authenticatePlayer() {
|
|||
let token = request.auth_info;
|
||||
|
||||
if (token.provider === "google") {
|
||||
let decoded = jwtDecode(token.token.contents);
|
||||
player.generateUid(decoded.email);
|
||||
player.email = decoded.email;
|
||||
player.email_verified = decoded.email_verified;
|
||||
this.print(`${player.email.replace("@gmail.com", "")} connected!`, 36);
|
||||
if (token.token !== null) {
|
||||
let decoded = jwtDecode(token.token.contents);
|
||||
player.generateUid(decoded.email);
|
||||
player.email = decoded.email;
|
||||
player.email_verified = decoded.email_verified;
|
||||
this.print(`${player.email.replace("@gmail.com", "")} connected!`, 36);
|
||||
}
|
||||
else {
|
||||
this.removePlayer(player);
|
||||
return void 0;
|
||||
}
|
||||
}
|
||||
|
||||
player.authenticated = true;
|
||||
|
|
@ -112,7 +108,7 @@ export function onRequest(req, res) {
|
|||
* @param {Long} id
|
||||
* @param {Array} response
|
||||
* @param {Boolean} auth
|
||||
* @param {Array} unknown6
|
||||
* @param {Buffer} unknown6
|
||||
* @return {Buffer}
|
||||
*/
|
||||
export function envelopResponse(status, id, response, auth, unknown6) {
|
||||
|
|
@ -137,199 +133,18 @@ export function processRequests(requests) {
|
|||
|
||||
return new Promise((resolve) => {
|
||||
let ii = 0;
|
||||
let counter = 0;
|
||||
let length = requests.length;
|
||||
let body = [];
|
||||
for (; ii < length; ++ii) {
|
||||
this.processRequest(requests[ii]).then((request) => {
|
||||
counter++;
|
||||
this.processResponse(requests[ii]).then((request) => {
|
||||
body.push(request);
|
||||
if (counter >= length) resolve(body);
|
||||
if (ii + 1 >= length) resolve(body);
|
||||
});
|
||||
};
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Object} doc
|
||||
*/
|
||||
export function registerPlayer(doc) {
|
||||
|
||||
let player = this.player;
|
||||
|
||||
return new Promise((resolve) => {
|
||||
this.createUser(player).then(() => {
|
||||
this.print(`${this.player.email.replace("@gmail.com", "")} registered!`, 36);
|
||||
this.loginPlayer(doc).then((res) => {
|
||||
resolve(res);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Object} doc
|
||||
*/
|
||||
export function loginPlayer(doc) {
|
||||
|
||||
let buffer = null;
|
||||
let player = this.player;
|
||||
|
||||
return new Promise((resolve) => {
|
||||
this.getUserByEmail(player.email).then((doc) => {
|
||||
player.updateByObject(doc[0]);
|
||||
buffer = GetPlayer(doc[0]).encode();
|
||||
resolve(buffer);
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
export function forwardPlayer() {
|
||||
|
||||
let player = this.player;
|
||||
|
||||
return new Promise((resolve) => {
|
||||
this.getUserByEmail(player.email).then((doc) => {
|
||||
doc = doc[0];
|
||||
if (doc === void 0) {
|
||||
this.registerPlayer(doc).then((res) => {
|
||||
resolve(res);
|
||||
});
|
||||
}
|
||||
else {
|
||||
this.loginPlayer(doc).then((res) => {
|
||||
resolve(res);
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Request} req
|
||||
* @return {Buffer}
|
||||
*/
|
||||
export function processRequest(request) {
|
||||
|
||||
let buffer = null;
|
||||
let player = this.player;
|
||||
|
||||
return new Promise((resolve) => {
|
||||
|
||||
switch (request.request_type) {
|
||||
case REQUEST.GET_PLAYER:
|
||||
this.forwardPlayer().then((res) => resolve(res));
|
||||
return void 0;
|
||||
break;
|
||||
case REQUEST.GET_HATCHED_EGGS:
|
||||
buffer = GetHatchedEggs();
|
||||
break;
|
||||
case REQUEST.GET_INVENTORY:
|
||||
buffer = GetInventory();
|
||||
break;
|
||||
case REQUEST.CHECK_AWARDED_BADGES:
|
||||
buffer = CheckAwardedBadges();
|
||||
break;
|
||||
case REQUEST.DOWNLOAD_SETTINGS:
|
||||
buffer = DownloadSettings();
|
||||
break;
|
||||
case REQUEST.DOWNLOAD_ITEM_TEMPLATES:
|
||||
buffer = ItemTemplates();
|
||||
break;
|
||||
case REQUEST.DOWNLOAD_REMOTE_CONFIG_VERSION:
|
||||
buffer = DownloadRemoteConfigVersion();
|
||||
break;
|
||||
case REQUEST.GET_ASSET_DIGEST:
|
||||
buffer = GetAssetDigest();
|
||||
break;
|
||||
case REQUEST.GET_PLAYER_PROFILE:
|
||||
buffer = GetPlayerProfile();
|
||||
break;
|
||||
case REQUEST.GET_MAP_OBJECTS:
|
||||
this.player.updatePosition(request);
|
||||
buffer = GetMapObjects(request);
|
||||
this.savePlayer(player);
|
||||
break;
|
||||
case REQUEST.GET_DOWNLOAD_URLS:
|
||||
buffer = GetDownloadUrls();
|
||||
break;
|
||||
case REQUEST.SET_AVATAR:
|
||||
player.updateAvatar(request);
|
||||
buffer = new proto.Networking.Responses.SetAvatarResponse({
|
||||
status: proto.Networking.Responses.SetAvatarResponse.Status.SUCCESS,
|
||||
player_data: GetPlayer({
|
||||
username: "TollNicht",
|
||||
team: 1,
|
||||
pokecoins: 1337,
|
||||
stardust: 1338,
|
||||
avatar: player.avatar
|
||||
}).player_data
|
||||
}).encode();
|
||||
this.savePlayer(player);
|
||||
break;
|
||||
case REQUEST.SFIDA_ACTION_LOG:
|
||||
buffer = new proto.Networking.Responses.SfidaActionLogResponse({
|
||||
result: proto.Networking.Responses.SfidaActionLogResponse.Result.SUCCESS,
|
||||
log_entries: [
|
||||
new proto.Data.Logs.ActionLogEntry({
|
||||
sfida: true,
|
||||
timestamp_ms: new Date().getTime() * 1000,
|
||||
catch_pokemon: new proto.Data.Logs.CatchPokemonLogEntry({
|
||||
result: 1,
|
||||
pokemon_id: proto.Enums.PokemonId.BULBASAUR,
|
||||
combat_points: 10,
|
||||
pokemon_data_id: 1
|
||||
}),
|
||||
fort_search: new proto.Data.Logs.FortSearchLogEntry({
|
||||
result: 1,
|
||||
fort_id: "roflcopter",
|
||||
eggs: 0,
|
||||
items: [
|
||||
new proto.Inventory.Item.ItemData({
|
||||
item_id: proto.Inventory.Item.ItemId.ITEM_POKE_BALL,
|
||||
count: 1,
|
||||
unseen: false
|
||||
})
|
||||
]
|
||||
})
|
||||
})
|
||||
]
|
||||
}).encode();
|
||||
break;
|
||||
case REQUEST.MARK_TUTORIAL_COMPLETE:
|
||||
buffer = new proto.Networking.Respones.MarkTutorialCompleteResponse({
|
||||
success: true,
|
||||
player_data: GetPlayer({
|
||||
username: "TollNicht",
|
||||
team: 1,
|
||||
pokecoins: 1337,
|
||||
stardust: 1338,
|
||||
avatar: player.avatar
|
||||
}).player_data
|
||||
});
|
||||
break;
|
||||
case REQUEST.LEVEL_UP_REWARDS:
|
||||
buffer = new proto.Networking.Responses.LevelUpRewardsResponse({
|
||||
result: proto.Networking.Responses.LevelUpRewardsResponse.Result.SUCCESS,
|
||||
items_awarded: [],
|
||||
items_unlocked: []
|
||||
});
|
||||
break;
|
||||
default:
|
||||
this.print(`Unknown request: ${this.getRequestType(request)}`, 31);
|
||||
break;
|
||||
};
|
||||
|
||||
resolve(buffer);
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Request} req
|
||||
* @return {Boolean}
|
||||
|
|
|
|||
110
src/response.js
Normal file
110
src/response.js
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
import proto from "./proto";
|
||||
|
||||
import * as CFG from "../cfg";
|
||||
import { REQUEST } from "./requests";
|
||||
|
||||
import {
|
||||
GetInventory,
|
||||
GetHatchedEggs,
|
||||
CheckAwardedBadges,
|
||||
DownloadSettings,
|
||||
DownloadRemoteConfigVersion,
|
||||
GetPlayer,
|
||||
GetPlayerProfile,
|
||||
ItemTemplates,
|
||||
GetAssetDigest,
|
||||
GetDownloadUrls,
|
||||
GetMapObjects,
|
||||
SfidaActionLog,
|
||||
FortDetails,
|
||||
FortSearch,
|
||||
SetContactSettings,
|
||||
SetAvatar,
|
||||
MarkTutorialComplete,
|
||||
LevelUpRewards
|
||||
} from "./packets";
|
||||
|
||||
/**
|
||||
* @param {Request} req
|
||||
* @return {Buffer}
|
||||
*/
|
||||
export function processResponse(request) {
|
||||
|
||||
let buffer = null;
|
||||
let player = this.player;
|
||||
|
||||
return new Promise((resolve) => {
|
||||
|
||||
switch (request.request_type) {
|
||||
case REQUEST.GET_PLAYER:
|
||||
this.forwardPlayer().then((res) => resolve(res));
|
||||
return void 0;
|
||||
break;
|
||||
case REQUEST.GET_HATCHED_EGGS:
|
||||
buffer = GetHatchedEggs();
|
||||
break;
|
||||
case REQUEST.GET_INVENTORY:
|
||||
buffer = GetInventory();
|
||||
break;
|
||||
case REQUEST.CHECK_AWARDED_BADGES:
|
||||
buffer = CheckAwardedBadges();
|
||||
break;
|
||||
case REQUEST.DOWNLOAD_SETTINGS:
|
||||
buffer = DownloadSettings();
|
||||
break;
|
||||
case REQUEST.DOWNLOAD_ITEM_TEMPLATES:
|
||||
buffer = ItemTemplates();
|
||||
break;
|
||||
case REQUEST.DOWNLOAD_REMOTE_CONFIG_VERSION:
|
||||
buffer = DownloadRemoteConfigVersion();
|
||||
break;
|
||||
case REQUEST.GET_ASSET_DIGEST:
|
||||
buffer = GetAssetDigest();
|
||||
break;
|
||||
case REQUEST.GET_PLAYER_PROFILE:
|
||||
buffer = GetPlayerProfile();
|
||||
break;
|
||||
case REQUEST.GET_MAP_OBJECTS:
|
||||
this.player.updatePosition(request);
|
||||
buffer = GetMapObjects(request);
|
||||
this.savePlayer(player);
|
||||
break;
|
||||
case REQUEST.GET_DOWNLOAD_URLS:
|
||||
buffer = GetDownloadUrls();
|
||||
break;
|
||||
case REQUEST.SET_AVATAR:
|
||||
player.updateAvatar(request);
|
||||
buffer = SetAvatar(player);
|
||||
this.savePlayer(player);
|
||||
break;
|
||||
case REQUEST.SFIDA_ACTION_LOG:
|
||||
buffer = SfidaActionLog();
|
||||
break;
|
||||
case REQUEST.MARK_TUTORIAL_COMPLETE:
|
||||
buffer = MarkTutorialComplete(player);
|
||||
this.savePlayer(player);
|
||||
break;
|
||||
case REQUEST.LEVEL_UP_REWARDS:
|
||||
buffer = LevelUpRewards();
|
||||
break;
|
||||
case REQUEST.FORT_DETAILS:
|
||||
buffer = FortDetails();
|
||||
break;
|
||||
case REQUEST.FORT_SEARCH:
|
||||
buffer = FortSearch();
|
||||
break;
|
||||
case REQUEST.SET_CONTACT_SETTINGS:
|
||||
player.updateContactSettings(request);
|
||||
buffer = SetContactSettings(player);
|
||||
this.savePlayer(player);
|
||||
break;
|
||||
default:
|
||||
this.print(`Unknown request: ${this.getRequestType(request)}`, 31);
|
||||
break;
|
||||
};
|
||||
|
||||
resolve(buffer);
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user