diff --git a/POGOProtos/POGOProtos.proto b/POGOProtos/POGOProtos.proto index 02832a2..260ea50 100644 --- a/POGOProtos/POGOProtos.proto +++ b/POGOProtos/POGOProtos.proto @@ -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"; diff --git a/README.md b/README.md index d341d7d..f57786f 100644 --- a/README.md +++ b/README.md @@ -8,17 +8,10 @@ ______ _____ _____ _____ ```` - + -Pokemon GO server emulation - -TODO: -- [ ] Auth phase -- [ ] Database -- [ ] Player objects -- [ ] Map server -- [ ] Receive GPS data \ No newline at end of file +Pokemon GO server emulation \ No newline at end of file diff --git a/src/database.js b/src/database.js index 1b5243c..bc41e77 100644 --- a/src/database.js +++ b/src/database.js @@ -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) => { diff --git a/src/index.js b/src/index.js index 98307cb..2f4e052 100644 --- a/src/index.js +++ b/src/index.js @@ -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); diff --git a/src/packets/Responses.FortDetails.js b/src/packets/Responses.FortDetails.js new file mode 100644 index 0000000..07e7c52 --- /dev/null +++ b/src/packets/Responses.FortDetails.js @@ -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() + ); + +} \ No newline at end of file diff --git a/src/packets/Responses.FortSearch.js b/src/packets/Responses.FortSearch.js new file mode 100644 index 0000000..5d4fd46 --- /dev/null +++ b/src/packets/Responses.FortSearch.js @@ -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() + ); + +} \ No newline at end of file diff --git a/src/packets/Responses.GetDownloadUrls.js b/src/packets/Responses.GetDownloadUrls.js index 3b08f21..e1a81d6 100644 --- a/src/packets/Responses.GetDownloadUrls.js +++ b/src/packets/Responses.GetDownloadUrls.js @@ -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 }) ]; diff --git a/src/packets/Responses.GetInventory.js b/src/packets/Responses.GetInventory.js index 8141999..1161894 100644 --- a/src/packets/Responses.GetInventory.js +++ b/src/packets/Responses.GetInventory.js @@ -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 }) diff --git a/src/packets/Responses.GetMapObjects.js b/src/packets/Responses.GetMapObjects.js index 7ab27fa..0ca09fc 100644 --- a/src/packets/Responses.GetMapObjects.js +++ b/src/packets/Responses.GetMapObjects.js @@ -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 + }) + ] })); }); diff --git a/src/packets/Responses.GetPlayer.js b/src/packets/Responses.GetPlayer.js index 790b4cf..5b0f126 100644 --- a/src/packets/Responses.GetPlayer.js +++ b/src/packets/Responses.GetPlayer.js @@ -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 }); diff --git a/src/packets/Responses.ItemTemplates.js b/src/packets/Responses.ItemTemplates.js index 0511355..d67eab1 100644 --- a/src/packets/Responses.ItemTemplates.js +++ b/src/packets/Responses.ItemTemplates.js @@ -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() diff --git a/src/packets/Responses.LevelUpRewards.js b/src/packets/Responses.LevelUpRewards.js new file mode 100644 index 0000000..c0a4507 --- /dev/null +++ b/src/packets/Responses.LevelUpRewards.js @@ -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() + ); + +} \ No newline at end of file diff --git a/src/packets/Responses.MarkTutorialComplete.js b/src/packets/Responses.MarkTutorialComplete.js new file mode 100644 index 0000000..da6057a --- /dev/null +++ b/src/packets/Responses.MarkTutorialComplete.js @@ -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() + ); + +} \ No newline at end of file diff --git a/src/packets/Responses.SetAvatar.js b/src/packets/Responses.SetAvatar.js new file mode 100644 index 0000000..79adc87 --- /dev/null +++ b/src/packets/Responses.SetAvatar.js @@ -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() + ); + +} \ No newline at end of file diff --git a/src/packets/Responses.SetContactSettings.js b/src/packets/Responses.SetContactSettings.js new file mode 100644 index 0000000..0a54f7b --- /dev/null +++ b/src/packets/Responses.SetContactSettings.js @@ -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() + ); + +} \ No newline at end of file diff --git a/src/packets/Responses.SfidaActionLog.js b/src/packets/Responses.SfidaActionLog.js new file mode 100644 index 0000000..64e60fb --- /dev/null +++ b/src/packets/Responses.SfidaActionLog.js @@ -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() + ); + +} \ No newline at end of file diff --git a/src/packets/index.js b/src/packets/index.js index 546ca0d..e2c7b57 100644 --- a/src/packets/index.js +++ b/src/packets/index.js @@ -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"; \ No newline at end of file diff --git a/src/player.js b/src/player.js index 8b60291..fb6704b 100644 --- a/src/player.js +++ b/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); + }); + }); + }); + } \ No newline at end of file diff --git a/src/request.js b/src/request.js index 0448021..08dc094 100644 --- a/src/request.js +++ b/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} diff --git a/requests.js b/src/requests.js similarity index 100% rename from requests.js rename to src/requests.js diff --git a/src/response.js b/src/response.js new file mode 100644 index 0000000..4c36c9d --- /dev/null +++ b/src/response.js @@ -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); + + }); + +} \ No newline at end of file