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