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:
Felix 2016-08-09 19:45:36 +02:00
parent 6ef63b02f4
commit f776496bd2
21 changed files with 551 additions and 323 deletions

View File

@ -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";

View File

@ -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

View File

@ -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) => {

View File

@ -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);

View 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()
);
}

View 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()
);
}

View File

@ -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
})
];

View File

@ -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
})

View File

@ -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
})
]
}));
});

View File

@ -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
});

View File

@ -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()

View 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()
);
}

View 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()
);
}

View 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()
);
}

View 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()
);
}

View 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()
);
}

View File

@ -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";

View File

@ -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);
});
});
});
}

View File

@ -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
View 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);
});
}