From d90a203194bbf97d06c66f1f6325c4576c8f8dde Mon Sep 17 00:00:00 2001 From: Simba Zhang Date: Sun, 14 Aug 2016 23:42:48 -0700 Subject: [PATCH] Dev merge to master, PR (#3971) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adding plugin support (#2679) * Adding plugin support * Adding an empty __init__.py * Moving the base task to the project root (#2702) * Moving the base task to the project root * Moving the base class more * Changing the import again * Adding a heartbeat to the analytics (#2709) * Adding a heartbeat to the analytics * Heartbeat every 30 seconds, not every 5 * Don't double track clients * Fix 'local variable 'bot' referenced before assignment' * Providing an error if tasks don't work for the given api (#2732) * Fix for utf8 encoding when catching lured pokemon (#2720) * Fixing lure pokestop encoding * fixing lure encoding * Fix For catchable not being displayed on the web (#2719) * Fix For catchable not being displayed on the web * Update catch_visible_pokemon.py * Added encrypt.so compilation process to Dockerfile (#2695) * OS Detection for encrypt lib (#2768) Fix 32bit check, darwin and linux use the same file Make it a function Check if file exists, if not show error Define file_name first Fix return Check if file exists, if not show error Print info about paths Fix for 32/64bit detection * Fix Typo in unexpected_response_retry (#2531) fixes #2525 #2523 * Revert "changing license from MIT to GPLv3" This reverts commit 69fb64f2bf7c12e28c2bb6d2b636c6af55822448. * When the google analytics domain is blocked the bot crashed. (#2764) With a simple try / except this can be solved. Fix dirty catch all * Fixes #2698 - Prevents "Possibly searching too often" error after re-login. (#2771) * Fixes #2698 - Added api.activate_signature call to prevent issue after re-login. - Also replaced deprecated log call with event_manager emit to prevent exception being thrown. * Modified to use OS detected library path as per PR #2768 * Support loading plugins from .zip files (#2766) * Keep track of how many pokemon released (#2884) * Setting Library path to work with encrypt.so (#2899) Setting LD_LIBRARY_PATH on Dockerfile * :sparkles: Added login and username to available stats (#2494) Added a player_data property in PokemonGoBot to access player data from outside Added unit tests for login and username stats Added tests for call args when updating the window title Added a platform-specific test for window title updating on win32 platform * [dev] small fixes (#2912) * Fixed emit_event typo * Update CONTRIBUTORS.md * Changed initialization location for "bot" We use bot in main exception on 128 * Update pokecli.py * Rename load_path to load_plugin (#2947) * Adding some logic for pulling plugins from github (#2967) * flush after title update (#2977) * correctly re-raise exception to keep backtrace (#2944) * Update MoveToMapPokemon to use events instead of logger. (#2913) * Config/encrypt.so (#2964) * Add config option for libencrypt.so * Correctly set the config value and check for the file in said dir * Fixed mispelling for "formatted" variable (#2984) * Loading plugins from Github (#2992) * Checking github plugin file existence * Loading plugins from github * Fixed #3000 (#3003) Fixed syntax error on "move_to_map_pokemon.py" that makes the client crash when using this feature. * Added MaxPotion inventory count to summary. (#3015) Short Description: The Max Potion count was missing from the inventory summary. Was #2456 * Added cleanup of download and files for encrypt.so after they are no longer needed (#3011) * Fix bot not returning back after telepoting (#3014) * Fix typo: last_long -> last_lon * Whitespace cleanup * Fix bug introduced by #3037: bot not returning back * Fix Dockerfile installation (#3057) * Fix for #3045 (#3055) * Added request to check configuration (#3089) * Fixed Dockerfile - missing \ on command lines (#3096) * Fixed mispelling for "formatted" variable * Docker commands missing trailing \ * Fix for FileIO slowing bot performance.This puts the map writing into a thread and makes sure it only executes once. (#3100) * Change word usage: "fled" to "escaped" (#3118) "fled" is confusing to lot of people and is easily confused with pokemon vanishing. "escaped" is a better term. * Update the example config file (#3120) * Add config option for libencrypt.so * Add config option for libencrypt.so * Add config option for libencrypt.so * Add config option for libencrypt.so * Rename path.example.json to path.json.example * typo: logrmation -> information (#2601) Fix a typo. I assume that it was "information" initially, but became "logrmation" when someone used replace all functionality to replace all infos with logs. But I might be totally wrong at this point, idk. Just didn't like the word and wanted to fix that typo. * Change fled to escaped (#3129) Fix an issue after PR #3118 * When JSON parsing fails, give a rough indication of why (#3137) * When JSON parsing fails, give a rough indication of why * Use the official package instead of SHA1 commit * Handle Github Download Zip Format (#3108) * Checking github plugin file existence * Loading plugins from github * Starting install code for github plugins * Updating GithubPlugin to support extracting folders * Handling github zip formats by extracting to the correct location * Refactor catch worker (#2527) * refactor catch worker * fix * few renames * add to contributors * fix * add missing behavior * fix encounter events * don't make events about ignored pokemon * Added Run-Loop (#3143) * Add files via upload modified run script wich let you run the boot in a loop(if it crashes it restarts) * Integreated Loop into run.sh modified run.sh to loop the script so that even if it crashes it automaticly restarts. * fixing loop in spin fort task (#3165) * Some love for the vim users (#3154) * Updated README with link to desktop version (#3208) * Fix for #3190 (#3197) * MoveToMap: Add minimum balls to run (#3166) * added config to ignore item count for Spin and MoveToFort (#3160) * [Inventory Management] Add a central class for caching/parsing inventory & static data (#2528) * new class to centralize inventory management * use new inventory class in evolve_pokemon * use new inventory to display # candy after catch * Keeping a cache of gym information (#3236) * New Option: "dont_nickname_favorite" (#2496) * New Option: "dont_nickname_favorite" This change (line 19) adds the option, that the user can choose, whether their favorite pokemons should also get a new nickname or not. If a user want this, then he or she has to add the line ("dont_nickname_favorite" = true) after ("nickname_template": " ... ",). * Update nickname_pokemon.py * Update * Put change to line 30 This reduce the reduce the runtime, because favorite pokemon won't be added to the list. * Restart the loop when catching pokemon and there are more to catch (#3242) * fixed NameError: global name 'pokemon_name' is not defined (#3244) resolves ```traceback (most recent call last): File "pokecli.py", line 521, in main() File "pokecli.py", line 95, in main bot.tick() File "/usr/src/app/pokemongo_bot/__init__.py", line 451, in tick if worker.work() == WorkerResult.RUNNING: File "/usr/src/app/pokemongo_bot/cell_workers/evolve_pokemon.py", line 38, in work self._execute_pokemon_evolve(pokemon, cache) File "/usr/src/app/pokemongo_bot/cell_workers/evolve_pokemon.py", line 117, in _execute_pokemon_evolve cache[pokemon.name] = 1 NameError: global name 'pokemon_name' is not defined``` * Stop fetching gym details (#3245) * Checking all forts for lured pokemon (#3163) * Fix flooding of keep_best_release (#3223) * Fix flooding of keep_best_release * Fix flooding of keep_best_release * [Feature] Recycle Threshold (#2465) * Add Threshold Option * Add Threshold Option to Example Configs * Add Name to Contributors * Change config name and message * Remove logger * Add option to run when storage less than something * Change Message * Fix * Error fixes, message improvement * Config Changes and Remove Option * Call heartbeat on step_walker even if speed is higher than distance (#2513) * Return an empty list if no pokemon are available. (#3259) The changes introduced in 4c95259 expose this bug. * Allow UpdateTitleStats to emit events instead of rewriting the console (#3264) * Updating our issue and PR templates to be more helpful (#3262) * Dev (#3277) * * adding enhanced sniping capabilities for move_to_map_pokemon * Adding enhanced sniping capabilities for move_to_map_pokemon * Update pgoapi to a newer version (#3241) This should hopefully fix issues like #3181, #3098, #2874 and potentially more. Needs testing/verification. I am running now, but it does take about an hour to trigger. * Fix unexpected egg incubation retry (#3276) incubator['used'] flag is set but not used in IncubateEggs._apply_incubators * has_next_evolution is a function not a property (#3284) * Powerful setup.sh (#3263) * Rewrite run.sh Very powerful run.sh with lots of function. 1.install(make .so) 2.update 3.config generator 4.config backup 5.run loop make it never down It should run like run.sh *.json or other opinion. See -help. * Update run.sh * Update run.sh OK problem solved * Delete setup.py * Rename run.sh to setup.sh * Create run.sh * Update setup.sh * Update install.sh * Update setup.sh * Update run.sh * Update setup.sh Some small fix. * Added +x to run.sh * Added a configuration option "path_startmode" (conflict merge #2489) (#3270) * Upstream update and merge, with path_startmode configuration * Removed logger and fixed base task path * As per request, path_startmode is now path_start_mode * Removed all logging * Adding documentation for how to use and write plugins (#3254) * Adding documentation for how to use and write plugins * Adding a link to the plugins docs in the Readme * Updating link to the plugin docs in the readme * Checking config file exists in run.sh (#3326) * Improve and update pokemon.json (#3331) 1. Unminify for simplier edits 2. Add BaseAttack, BaseDefense, BaseStamina, CaptureRate, FleeRate, Fast/Special Attack(s) * Made paths to .json files absolute so pokecli.py can be called from CRON (#3157) * Made paths to .json files absolute so pokecli.py can be called from CRON * made file paths abs in inventory fixed incorrect dict reference, changed to .get() as felt this was intended * Add fast & charged moves data from #2117 (originally by @iananass) (#3336) Data for pokemon quick & slow attacks * Upgrade pgoapi to the b4bf0e089dfe09903f8dda37dae56910e01f94cc commit(latest for now). (#3337) * Revert "Upgrade pgoapi to the b4bf0e089dfe09903f8dda37dae56910e01f94cc commit…" (#3340) * Added map_path configuration for move_to_map. (#3339) * Log stats on terminal (#3312) * added _log_on_terminal function * Added logic to toggle terminal logging functionality from config file * Added possibility to disable title changes, refactor code * Refactor tuples * Refactor ifs to clearer syntax * changes to improve event system based on new web ui devs requests * typo :D * let's use dict.get a bit to avoid errors * keeping the account in the remote command response * Add ColoredLoggingHandler (#3198) * Update TransferPokemon to use new Inventory Class (#3320) * Update TransferPokemon to use new Inventory Class * Use base_dir * Don't release pokemon if bot is on test mode * Some text fixes for setup.sh (#3390) Minor text fix. * Fix path of shells in install.sh (#3393) * Update install.sh Fix path * Update setup.sh fix path * Update run.sh fix path * Fix evolution error in pokemon.json (#3344) Fix evolution error in pokemon.json * Improve formatting consistency in transfer_pokemon.py (#3397) Improve formatting consistency * Remove unnecessary file * Put info on the next line in run.sh (#3422) * Update setup.sh fix typo * Update run.sh fix typo * Fix Struct() argument 1 must be string, not unicode. (#3375) * Give the possibility to disable a task without removing it (#3417) * Give the possiblity to disable a task in config without removing it from the config file * Put exmple only in nickname task * Add Unit testing * typo * Use enabled false as exemple * fix config creation (#3482) Changed auth to be more specifik and added right permissions. * Remove unused IV calculation from evolve_pokemon (#3487) Previously IV was computed in each worker. Now its fetched from inventory. This was left over and not called in the worker at all. * Don't show Inventory full event if we set "ignore_item_count" (#3440) * Fix showing the date in run.sh (#3433) fix the logic of showing the date * Typo fix: show new catch rate after berry throw. (#3521) * Fix stdout is not a terminal (#3511) * Ensure recycling happens if bag is over capacity. (#3531) Short Description: Ensures you that item Recycling happens if you have more items than the total bag capacity. When you level up, you are awarded items which can cause the bag to be over the capacity. * Better inventory: attacks & movesets, IV CP perfection, pokemon level, etc.. (#3455) * Add "level to CP multiplier" data Data is from justinleewells/pogo-optimizer: https://github.com/justinleewells/pogo-optimizer/blob/edd692d/data/game/level-to-cpm.json * Many improvements & additions for the inventory logic - LevelToCPm, FastAttacks, ChargedAttacks, Movesets - More info for each pokemon: attacks data, percent to max cp, IV CP perfection * Add PyCharm/IDEA *.iml (project file) to ignored * Fixes, improvements & refactoring for inventory.py - Return inadvertently deleted pieces of code (thanks to @achretien) - Evolution logic fixes - Other minor fixes - Moveset logic moved to Moveset class * Fix data for pokemons & charged moves * Inventory tests: pokemon data, LevelToCPm, attacks * Fix travis build * Fix info for Hitmonlee & Hitmonchan * Revert "Better inventory: attacks & movesets, IV CP perfection, pokemon level, etc.." (#3549) * run.bat for windows (#3542) run.bat with persistent loop * Fix error when MoveToFort called from handle_soft_ban.py (#3500) * Fix error when MoveToFort called from handle_soft_ban.py * Added myself to CONTRIBUTORS.md * Fixed list of charged attacks for Venonat (#3548) + BaseDefense/BaseStamina info fix (#3550) * Revert "Revert "Better inventory: attacks & movesets, IV CP perfection, pokemon level, etc.." (#3549)" This reverts commit e9b229ec0fd14a4814ea7431b1256850e907cfbf. * Fix BaseDefense/BaseStamina and type info Fixed BaseDefense/BaseStamina info (was mixed up) Fixed type info for Mr. Mime, Clefairy, Clefable, Jigglypuff, Wigglytuff Added check for correctness of exact CP value calculation * Fixed list of charged attacks for Venonat * Don't kill bot in case of unexpected moveset, use fallback + better error message * Blacklisting tejado from getting mentioned by the mention-bot * Moving wiki pages to docs folder * UpdateTitleStats -> UpdateLiveStats, new stat, refactoring (#3467) * Renamed UpdateTitleStats to UpdateLiveStats * Cleaned worker documentation * Added documentation for terminal_log and terminal_title * Fixed https://github.com/PokemonGoF/PokemonGo-Bot/pull/3312#issuecomment-238672978 * Made some refactoring * Added captures_per_hour stat that shows estimated pokemon captures per hour * Added a captures_per_hour method in metrics.py * Added unit tests for features added in https://github.com/PokemonGoF/PokemonGo-Bot/pull/3312 * Added unit tests for captures_per_hour * Avoid useless overhead when no output configured * Added default config values in documentation * Fixed issue with title updating on Windows * See https://github.com/PokemonGoF/PokemonGo-Bot/pull/3472 * Update installation docs to reflect setup sh changes (#3567) * Fixed chmod in setup.sh (#3565) * forgot to include the config location * fixed setup files * Updated readme to have better readability (#3569) * Made the READ me more read friendly and compactor. * Update README.md * Update README.md * Update README.md * Update README.md * Update faq.md * More documentation changes making it noob proof(er) (#3575) * added information on what what does * add a link to the docker hub for NAS users. * Update Readme to point to the latest wiki and documentation (#3579) * Improve Docker Image and `docker-compose.yml` (#3583) - Use the non-`onbuild` variant of the python base image to better make use of Docker image caching - Update some volumes in `docker-compose.yml` for pogoweb * Small fixes and improvments in setup.sh (#3585) Adding -p to mkdir - it will not show "already exist folder" error. And adding to backup *gpx and path files. * Remove the "evolve_captured" flag in favor of the EvolveTask (#3530) * Remove the "evolve_captured" flag in favor of the EvolveTask * Remove unused event * Warn the user instead of stopping the bot * Improved documentation (#3604) - Improved read flow - Added volume sharing of cache folder * Update installation.md (#3618) * Update installation.md Changed the linux Section and the Ubuntu example, for easyer access (if anyone now how to make a code block collapsable feel free) * Update installation.md removed pastebin link (cause i put it there in the first place) because it's not needed edittet linux section to Installation Linux on the example of Ubuntu (merged it with ubuntu install section) i hope i didn't miss anything will check on mac and windows in the next 24h. I will make a new pr for that and link it here * moving_to_fort and moving_to_lured_fort now also emit current_position (#3614) arrived_at_fort emits position * Fix handle soft ban (#3629) * Fix `MoveToFort.config` None to Empty {} dict Whenever the bot ticks, `config.get('enable', True)` is required * Add new contributor * [config] new tasks in example files (#3457) * add UpdateTitleStats to config examples * add UpdateTitleStats to config examples * add SleepSchedule to config examples all config files are missing SleepSchedule from task see https://github.com/PokemonGoF/PokemonGo-Bot/pokemongo_bot/cell_workers/sleep_schedule.py for more info , { "type": "SleepSchedule", "config": { "time": "22:54", "duration":"7:46", "time_random_offset": "00:24", "duration_random_offset": "00:43" } }, * Forgot one * fix for changes in #3467 * disable new tasks by default, removed duplicate * Revert "moving_to_fort and moving_to_lured_fort now also emit current_position" (#3640) * Return RUNNING if there are more forts to spin (#3412) * Correct colored logging (#3637) * Rewrite colered logging handler to use python logging * Add all terminal colors and a format reset * Add name to contributors list * Allow to set throw quality and spin odds (#2534) * Allow to set throw quality and spin odds * Throw Parameter : add example * Throw parameter example : update indentation * sending location update if distance to move is smaller than step size * removing useless comma * removing old catch randomizer stuff * Improved item recycling (#2482) * Now recycling only if less than 5 space left in inventory Now trying to recycle before moving to/spinning fort if bags are almost full Refactored recycle_items * Removed recycling before moving to/spinning fort if bags are almost full * Removed recycling before moving to/spinning fort if bags are almost full * Removed unused import * Now recycling only if less than 5 space left in inventory Now trying to recycle before moving to/spinning fort if bags are almost full Refactored recycle_items * Removed recycling before moving to/spinning fort if bags are almost full * Added documentation Replace all `logger.log` calls with events! (#2173) * Deleted change on files not concerned * Deleted change on files not concerned * The inner class is now "private" * new class to centralize inventory management * use new inventory class in evolve_pokemon * use new inventory to display # candy after catch * Now using the new inventory (#2528) * Fixed #3256 * Merge branch 'dev' of https://github.com/PokemonGoF/PokemonGo-Bot into PokemonGoF-dev # Conflicts: # pokemongo_bot/cell_workers/recycle_items.py Added methods in the inventory manager needed for the recycle_items task * Fixed error if item_count result is false * Now keeps track of item inventory * Moved inventory update in request_recycle method * Minor comment change * Fixed not running if had more item than inventory size (#3531) * Added to the inventory class the necessary to keep trace of items * Now using the new inventory class properly * Decoupled when to recycle an item from how to do it. * Moved the recycler in the services folder * remove Debian python-protobuf dependency (#3670) - during installation of pgoapi, protobuf will automatically be a dependency (confirmed with `pip show pgoapi`) - Even for Ubuntu 16.04 LTS, python-protobuf version is 2.6.1-1.3, which is too old + confirmed with `apt-cache show python-protobuf` + see issue #1815 (https://github.com/PokemonGoF/PokemonGo-Bot/issues/1815) * First basic features of the pokemon optimizer (#2956) * catching every single pokemon nearby * catch lured pokemon in all forts nearby * adding run_interval to some tasks to avoid running all the time and minimum tick time of 5 seconds Tasks inheriting from BaseTask should use `self._update_last_ran` and `_time_to_run` if they want to implement the time based running. The config to set a custom timer is named `run_interval`. * added config to ignore item count for Spin and MoveToFort this works good with the `run_interval` configuration added to TransferPokemon and RecycleItem * spinning all pokestops in range * fixing loop in spin fort task * First basic features of the pokemon optimizer * For now, dry run only * Add cygwin to supported platform and improved log readability (#2948) * Add cygwin to supported platform and improved log readability * fixed formatting * - Add dry_run and use_lucky_egg in config - Evolve all pokemons together and only if enough for a full lucky egg (90). - Keep enough candies for consecutive evolutions of best pokemons - Only evolve the lowest rank of a family * Add lucky egg support when enough pokemon to evolve * fixing returns * - Support Eevee evolution scheme - Rename "use_lucky_egg" parameter in the more accurate "evolve_only_with_lucky_egg" * Revert "Merge remote-tracking branch 'origin/faeture/xp-improvements' into pokemon_optimizer" This reverts commit ff1f5e4bd3ec66b904625ec26b969f57ae6aaeb8, reversing changes made to e8fd90137e53409e87f8fdcf341916cf6d551481. * - Fix an issue in evolve_pokemon task - Use common inventory - Add configuration example * Add missing inventory refresh at the end of the process * Add missing inventory refresh after catching a pokemon * Add parameters "transfer" and "evolve" to activate/deactivate corresponding action. If both false, this is equivalent to a dry_run. Add parameters "use_lucky_egg" to allow task to use a lucky egg before evolve. Add parameter "minimum_evolve_for_lucky_egg" to add a requirement on the number of evolution before using a lucky egg. * Move some functions around * Default lucky egg to false + had again parameter "evolve_only_with_lucky_egg" * Fix qn issue with egg counting Add configuration parameter to allow customization of how pokemons are ranked in a family * Update configuration example * Upgrade to latest inventory * Fix bug * NicknamePokemon: Format iv_pct on 3 digits (#3698) For better sorting on pokemon's name, format iv_pct on 3 digits. * Config/encrypt fix (#3707) * Fix typo in config * Fix all configs * Fixed __init__.py thanks to @hklcf * Fixed EventManager handlers to be list instead of tuple (#3734) * Heaps of updates to docs and other small errors in running the bot. (#3593) * Update setup.sh * fixed for mac creating encrypt.so * for now just do wget or curl * this is all in the setup.sh * updated instructions to reflect setup.sh changes * Update installation.md * Update CONTRIBUTORS.md * Update setup.sh * Update installation.md * Update installation.md * Update installation.md * added missing submodule update * Update installation.md * Update installation.md * Update installation.md * Delete install.sh * Update .gitignore * Update installation.md * Update setup.sh * Update installation.md * Update run.sh add `source bin/activate` if someone forget to use virtualenv. * Update docker.md * Modify pokemon_catch_worker.py to use Inventory class and fix #3411 (#3496) * Fix #3411. Update inventory info before every catch try otherwise old values used * Revert "Fix #3411. Update inventory info before every catch try otherwise old values used" This reverts commit f7678da0f68573a7397c4c55a9804ee22dcbd53e. * Modify pokemon_catch_worker.py to use Inventory class * Fix forgotten line * Fix one more forgotten line * Added check if we really used berry or not * Fix KeyError in inventory.py When we have no items of type, there are no "count" key in the dict. * Revert "Fix KeyError in inventory.py" This reverts commit ed2769c51820381044332f9e95e759bda6dc587e. * Revert "Added check if we really used berry or not" This reverts commit 42e9d9cc2c0335da0bed2adabc797f154ecc1596. * Revert "Fix one more forgotten line" This reverts commit 5fda3c49ea6483ad16bf2582dee0aed14ed34b6b. * Revert "Fix forgotten line" This reverts commit a8edc5723a1b88334beead9cd863291b894a0a49. * Revert "Modify pokemon_catch_worker.py to use Inventory class" This reverts commit 5b6e4d39bccbae6a825274080727bd7ef62b6d98. * Modify pokemon_catch_worker.py to use Inventory class and fix #3411 * Use Ultraball If No Other Balls (With Constraint) (#3421) * Add Use Ultraball (#1) * Add `use_ultraball` event to Event Manager * Add use ultraball if pokeball + greatball = 0 * Add Use Ultraball if No Other Balls (#2) * Add `use_ultraball` event to Event Manager * Add use ultraball if pokeball + greatball = 0 * Add New Contributor * Revert "Add Use Ultraball" (#4) * Use Ultraball If No Other Balls (#3) * Add `use_ultraball` event to Event Manager * Add use ultraball if pokeball + greatball = 0 * Add New Contributor * Remove 'use_ultraball' event. * Remove `use_ultraball` event call * Update & add avoid catching Pokemon if no pokeball * Update conflict contributors * Add get `min_ultraball_to_keep` from config file * Improved `min_ultraball_to_keep` with condition * Added `min_ultraball_to_keep` option * Added `min_ultraball_to_keep` option * Added `min_ultraball_to_keep` option * Added `min_ultraball_to_keep` option * Add `min_ultraball_to_keep` option * Remove count all pokeballs * Resolved Conflicts * Add and Remove pokemon from the inventory cache when catch, release and evolve (#3738) * Add and Remove pokemon from the inventory cache when catch and release * Add dealing with evolved pokemon also * Add the evolved pokemon * Update configuration_files.md (#3742) MoveToMapPokemon behavior related to issue #3736 (discussed with @k4n30) * Cache recent forts (for forts.max_circle_size) (#3556) * added bool option to cache recent forts -crf --forts.cache_recent_forts (default true) saves recent_forts in data/recent-forts-{username}.json on spin loads recent_forts from same file on start up bot doesn't start a new recent_forts on every reset * forgot contributor * typo fix no_cached_forts * changed all events related to caching forts to debug level * caching of forts happens on sigterm/exception handling of SIGTERM -Note handling of SIGTERM in python2.7 with multi threads is not reliable. Child thread can recieve SIGTERM and it is not handled in pokecli.py; pokecli.py continues to run. * Update use ultraball with constraint (#3760) * Add Use Ultraball (#1) * Add `use_ultraball` event to Event Manager * Add use ultraball if pokeball + greatball = 0 * Add Use Ultraball if No Other Balls (#2) * Add `use_ultraball` event to Event Manager * Add use ultraball if pokeball + greatball = 0 * Add New Contributor * Revert "Add Use Ultraball" (#4) * Use Ultraball If No Other Balls (#3) * Add `use_ultraball` event to Event Manager * Add use ultraball if pokeball + greatball = 0 * Add New Contributor * Remove 'use_ultraball' event. * Remove `use_ultraball` event call * Update & add avoid catching Pokemon if no pokeball * Update conflict contributors * Add get `min_ultraball_to_keep` from config file * Improved `min_ultraball_to_keep` with condition * Added `min_ultraball_to_keep` option * Added `min_ultraball_to_keep` option * Added `min_ultraball_to_keep` option * Added `min_ultraball_to_keep` option * Add `min_ultraball_to_keep` option * Remove count all pokeballs * Resolved Conflicts * Change from `items_stock` to `ball_count` * Rewrite NicknamePokemon for new Inventory sysem + a lot of new keys for 'nickname_template' option (#3756) * Add type information and classes - New classes: Type, Types - Usage of new classes anywhere in the Inventory - Tests coverage * Improve API for pokemons in Inventory - Added new class PokemonInfo for the static information loaded from json - API improved, added capture_rate and flee_rate - All covered with tests * Minor refactoring of inventory.py - Item class (moved to other instance classes) to keep file structure - Code style * Rewrite NicknamePokemon to use new Inventory sysem + add a lot of new keys for 'nickname_template' option + tests & documentation * Update documentaion for the new NicknamePokemon * Update documentaion for the new NicknamePokemon (again :) * Added Procfile to deploy to Heroku (#3719) * Update installation.md (#3764) editet Manual install Mac section * Writing the location file to fix the web ui (#3767) * Revert #3500 Fix error when MoveToFort called from handle_soft_ban.py (#3772) Useless since #3629 was merged * Clean old catch parameters (#3776) * `catch_randomize_reticle_factor` * `catch_randomize_spin_factor` * Fix incorrect variable name in pokemon_catch_worker that makes bot unusable (#3780) * added action_delay when recycling items (#3799) * Pokemon optimizer enhancements (#3743) * catching every single pokemon nearby * catch lured pokemon in all forts nearby * adding run_interval to some tasks to avoid running all the time and minimum tick time of 5 seconds Tasks inheriting from BaseTask should use `self._update_last_ran` and `_time_to_run` if they want to implement the time based running. The config to set a custom timer is named `run_interval`. * added config to ignore item count for Spin and MoveToFort this works good with the `run_interval` configuration added to TransferPokemon and RecycleItem * spinning all pokestops in range * fixing loop in spin fort task * First basic features of the pokemon optimizer * For now, dry run only * Add cygwin to supported platform and improved log readability (#2948) * Add cygwin to supported platform and improved log readability * fixed formatting * - Add dry_run and use_lucky_egg in config - Evolve all pokemons together and only if enough for a full lucky egg (90). - Keep enough candies for consecutive evolutions of best pokemons - Only evolve the lowest rank of a family * Add lucky egg support when enough pokemon to evolve * fixing returns * - Support Eevee evolution scheme - Rename "use_lucky_egg" parameter in the more accurate "evolve_only_with_lucky_egg" * Revert "Merge remote-tracking branch 'origin/faeture/xp-improvements' into pokemon_optimizer" This reverts commit ff1f5e4bd3ec66b904625ec26b969f57ae6aaeb8, reversing changes made to e8fd90137e53409e87f8fdcf341916cf6d551481. * - Fix an issue in evolve_pokemon task - Use common inventory - Add configuration example * Add missing inventory refresh at the end of the process * Add missing inventory refresh after catching a pokemon * Add parameters "transfer" and "evolve" to activate/deactivate corresponding action. If both false, this is equivalent to a dry_run. Add parameters "use_lucky_egg" to allow task to use a lucky egg before evolve. Add parameter "minimum_evolve_for_lucky_egg" to add a requirement on the number of evolution before using a lucky egg. * Move some functions around * Default lucky egg to false + had again parameter "evolve_only_with_lucky_egg" * Fix qn issue with egg counting Add configuration parameter to allow customization of how pokemons are ranked in a family * Update configuration example * Upgrade to latest inventory * Fix bug * Add parameter "use_candies_for_xp" to activate/deactivate usage of candies to maximize xp Add comments in the configuration example * Add dps, dps_attack and dps_defense in available sorting keys. So you can now keep the best move. Add more comments in config Display ncp and dps for released and evolved pokemons * Update inventory when releasing and evolving pokemons * Display Pokemon Bag count update * small fix in VOLUME in Dockerfile (#3779) * Fix looping between equidstant pokestops (#3787) * Fix looping between equidstant pokestops * :D * Revert "Fix looping between equidstant pokestops" (#3848) * configuration_files.md - Update nicknaming sample usages (#3833) * Format iv_pct on 3 digits For better sorting on pokemon's name, format iv_pct on 3 digits. * Fix Nicknaming documentation sample usage Fix some nicknaming samble usage around the iv_pct which it now formatted on 3 digits. * Now track inventory when spinning a fort (#3774) * Ignoring compiled test python file of PyCharm * Now spinning fort keeps track of cached inventory * Now the pokemon_catch_worker keeps track of cached ITEMS (and only items, not pokemon) inventory * Minor improvements of the new inventory * Fixed key error * Minor improvements of the new inventory * Fixed attribute non existent * Removed duplicated import * [Feature] added locale support for NicknamePokemon (#2539) * added locale support for NicknamePokemon added pokemon_de.json beautyfied pokemon.json * fallback to en instead of throwing runtime error * remove log * added locales: fr, ja, pt_br, ru, zh * minor fix * Windows batch files and documentation fixes (#3781) * Update installation.md * Create manual_installation.md * Update installation.md * Update manual_installation.md * Update manual_installation.md * Update manual_installation.md * Update manual_installation.md * Update manual_installation.md * Update manual_installation.md * Update manual_installation.md * Update manual_installation.md * Update manual_installation.md * Update manual_installation.md * Update manual_installation.md * Update manual_installation.md * added windows deps Hopefully it works I don’t have windows. * Update manual_installation.md * Update manual_installation.md * Update manual_installation.md * Update manual_installation.md * docker merged Added docker too * Update manual_installation.md * Update installation.md * Update installation.md * Update installation.md * Update installation.md * Update installation.md * Update installation.md * Update manual_installation.md * Update installation.md * Update installation.md * rename dir * v2 windows bat * Update manual_installation.md * Update installation.md * Update nicknaming configuration documentation (#3880) * Format iv_pct on 3 digits For better sorting on pokemon's name, format iv_pct on 3 digits. * Fix Nicknaming documentation sample usage Fix some nicknaming samble usage around the iv_pct which it now formatted on 3 digits. * Update nicknaming documentation Add missing options in the nicknaming documentation. * Updated RecycleItems config documentation (#3887) * Updated RecycleItems config documentations * Updated RecycleItems config documentations. Removed outdated informations * Update README.md (#3895) Clarified support channels, added feature hub details * Update setup.sh (#3836) Support more system. A user-friendly way to use virtualenv. * fix divide by zero bug; add distance logging when speed == 0 (#3819) * fix divide by zero bug; add distance logging when speed == 0 * refactor last position distance; add rules to .gitignore * remove file user_web_catchable that was added by mistake * Fix items discarding smiling message (#3790) * Improved documentation (#3921) * Added documentation to the inventory * Added documentation to the inventory * Added/improved documentation * Fix wrong teleport message (#3935) * fix wrong log message * fix log message- Walking * Nickname Pokemon IVs in hex (0..F) #3803 (#3869) * pokemon IVs in HEX * using regex to convert only keys to lowercase, leaving the format specifier alone * Detect and alert for permaban (#3944) * #3932 - Fix nicknaming task exception with non ascii characters (#3951) Fix ticket #3932 when the nicknaming task throw an exception with pokemon's name containing non ascii characters. * fixes buggy behaviour in for loop when removing forts with timeout from forts (#3936) * added account name to WindowTitle (#3876) * add account name to WindowTitle add account name to the WindowTitle in "UpdateLiveStats" task, easier to manage multiple bots and their outputs. * Update config.json.example * updated Removed blank space & line * Refactored SIGINT handler so it catches SIGINT during relog loop (#3867) * Refactored SIGINT handler so it catches SIGINT during relog loop * typo fix * recycle items in cascading (#3930) * recycle items in cascading * revert the changes of Improved documentation * revert the missing change in Improved documentation * fix incorrect maximum variables issue * Removed unnecessary parameters * updates removed unnecessary parameters * If we think we are softbanned then set the flag so we can get unbanned (#3847) * Revert "recycle items in cascading" (#3956) --- .gitignore | 2 + CONTRIBUTORS.md | 1 + README.md | 11 +- configs/config.json.example | 2 +- docs/configuration_files.md | 1 + pokecli.py | 27 +++- pokemongo_bot/__init__.py | 1 + pokemongo_bot/api_wrapper.py | 11 ++ pokemongo_bot/cell_workers/follow_path.py | 23 +++- pokemongo_bot/cell_workers/follow_spiral.py | 41 ++++--- .../cell_workers/nickname_pokemon.py | 11 +- .../cell_workers/pokemon_catch_worker.py | 1 + pokemongo_bot/cell_workers/recycle_items.py | 31 +++-- pokemongo_bot/cell_workers/spin_fort.py | 2 +- pokemongo_bot/inventory.py | 115 +++++++++++++++++- pokemongo_bot/services/item_recycle_worker.py | 12 +- pokemongo_bot/step_walker.py | 5 +- setup.sh | 58 ++++++--- tests/nickname_test.py | 5 + 19 files changed, 286 insertions(+), 74 deletions(-) diff --git a/.gitignore b/.gitignore index 3c504a3774..550648c7b6 100644 --- a/.gitignore +++ b/.gitignore @@ -109,6 +109,8 @@ web/ data/last-location*.json data/cells-*.json data/map-caught-*.json +data/recent-forts-*.json +user_web_catchable # Multiple config configs/* diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index c363f3d804..33aee29d31 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -69,3 +69,4 @@ * extink * Quantra * pmquan + * net8q diff --git a/README.md b/README.md index 1c0fa41910..bc81fa9858 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,16 @@ # PokemonGo-Bot PokemonGo bot is a project created by the [PokemonGoF](https://github.com/PokemonGoF) team. -The project is currently setup in two main branches. `dev` also known as `beta` and `master` also known as `stable`. Submit your PR's to `dev`. +The project is currently setup in two main branches. `dev` also known as `beta` and `master` also known as `stable`. Make sure to submit your PR's to `dev`. -If you need any help please don't create an issue here on github we have a great community on Slack, [Click here to join the chat!](https://pokemongo-bot.herokuapp.com). You can count on the community in #help channel. +## Support +Configuration issues/help - If you need any help please don't create an issue as we have a great community on Slack. You can count on the community in #help channel. + - [Click here to signup (first time only)](https://pokemongo-bot.herokuapp.com) + - [Join if you're already a member](https://pokemongo-bot.slack.com/messages/general/). + +[Bugs / Issues](https://github.com/PokemonGoF/PokemonGo-Bot/issues?q=is%3Aissue+sort%3Aupdated-desc) - If you discover a bug in the bot, please [search our issue tracker first](https://github.com/PokemonGoF/PokemonGo-Bot/issues?q=is%3Aissue+sort%3Aupdated-desc). If it hasn't been reported, please [create a new issue](https://github.com/PokemonGoF/PokemonGo-Bot/issues/new) and ensure you follow the template so that our team can assist you as quickly as possible + +[Feature Requests](http://feathub.com/PokemonGoF/PokemonGo-Bot) - If you have a great idea to improve the bot don't create an issue, use our [feature hub](http://feathub.com/PokemonGoF/PokemonGo-Bot). While you're there vote on other features to let the devs know what is most important to you ## Table of Contents - [Installation](https://github.com/PokemonGoF/PokemonGo-Bot/blob/dev/docs/installation.md) diff --git a/configs/config.json.example b/configs/config.json.example index 838acc1d4b..7727fd0c8b 100644 --- a/configs/config.json.example +++ b/configs/config.json.example @@ -33,7 +33,7 @@ "config": { "enabled": false, "min_interval": 10, - "stats": ["uptime", "stardust_earned", "xp_earned", "xp_per_hour", "stops_visited"], + "stats": ["username", "uptime", "stardust_earned", "xp_earned", "xp_per_hour", "stops_visited"], "terminal_log": true, "terminal_title": true } diff --git a/docs/configuration_files.md b/docs/configuration_files.md index 8bb944da33..f1338a09d5 100644 --- a/docs/configuration_files.md +++ b/docs/configuration_files.md @@ -226,6 +226,7 @@ Key | Info **{iv_defense}** | Individial Defense *(0-15)* of the current specific pokemon **{iv_stamina}** | Individial Stamina *(0-15)* of the current specific pokemon **{iv_ads}** | Joined IV values in `(attack)/(defense)/(stamina)` format (*e.g. 4/12/9*, matches web UI format -- A/D/S) +**{iv_ads_hex}** | Joined IV values of `(attack)(defense)(stamina)` in HEX (*e.g. 4C9* for A/D/S = 4/12/9) **{iv_sum}** | Sum of the Individial Values *(0-45, e.g. 45 when 3 perfect 15 IVs)* | **Basic Values of the pokemon (identical for all of one kind)** **{base_attack}** | Basic Attack *(40-284)* of the current pokemon kind diff --git a/pokecli.py b/pokecli.py index 064c87c9ba..e88b21c55b 100644 --- a/pokecli.py +++ b/pokecli.py @@ -43,6 +43,7 @@ from pokemongo_bot.base_dir import _base_dir from pokemongo_bot.health_record import BotEvent from pokemongo_bot.plugin_loader import PluginLoader +from pokemongo_bot.api_wrapper import PermaBannedException try: from demjson import jsonlint @@ -64,11 +65,11 @@ class SIGINTRecieved(Exception): pass def main(): bot = False - try: - def handle_sigint(*args): - raise SIGINTRecieved - signal.signal(signal.SIGINT, handle_sigint) + def handle_sigint(*args): + raise SIGINTRecieved + signal.signal(signal.SIGINT, handle_sigint) + try: logger.info('PokemonGO Bot v1.0') sys.stdout = codecs.getwriter('utf8')(sys.stdout) sys.stderr = codecs.getwriter('utf8')(sys.stderr) @@ -102,7 +103,7 @@ def handle_sigint(*args): while True: bot.tick() - except (KeyboardInterrupt, SIGINTRecieved): + except KeyboardInterrupt: bot.event_manager.emit( 'bot_exit', sender=bot, @@ -137,8 +138,24 @@ def handle_sigint(*args): ) time.sleep(30) + except PermaBannedException: + bot.event_manager.emit( + 'api_error', + sender=bot, + level='info', + formatted='Probably permabanned, Game Over ! Play again at https://club.pokemon.com/us/pokemon-trainer-club/sign-up/' + ) except GeocoderQuotaExceeded: raise Exception("Google Maps API key over requests limit.") + except SIGINTRecieved: + if bot: + bot.event_manager.emit( + 'bot_interrupted', + sender=bot, + level='info', + formatted='Bot caught SIGINT. Shutting down.' + ) + report_summary(bot) except Exception as e: # always report session summary and then raise exception if bot: diff --git a/pokemongo_bot/__init__.py b/pokemongo_bot/__init__.py index ff5257c043..27ce65f8e4 100644 --- a/pokemongo_bot/__init__.py +++ b/pokemongo_bot/__init__.py @@ -150,6 +150,7 @@ def _register_events(self): self.event_manager.register_event('bot_start') self.event_manager.register_event('bot_exit') + self.event_manager.register_event('bot_interrupted') # sleep stuff self.event_manager.register_event( diff --git a/pokemongo_bot/api_wrapper.py b/pokemongo_bot/api_wrapper.py index 7224b0b4e4..2c51f32ff2 100644 --- a/pokemongo_bot/api_wrapper.py +++ b/pokemongo_bot/api_wrapper.py @@ -10,6 +10,9 @@ from human_behaviour import sleep +class PermaBannedException(Exception): + pass + class ApiWrapper(PGoApi): def __init__(self): PGoApi.__init__(self) @@ -77,6 +80,14 @@ def is_response_valid(self, result, request_callers): if not isinstance(result['responses'], dict): return False + try: + # Permaban symptom is empty response to GET_INVENTORY and status_code = 3 + if result['status_code'] == 3 and 'GET_INVENTORY' in request_callers and not result['responses']['GET_INVENTORY']: + raise PermaBannedException + except KeyError: + # Still wrong + return False + # the response can still programatically be valid at this point # but still be wrong. we need to check if the server did sent what we asked it for request_caller in request_callers: diff --git a/pokemongo_bot/cell_workers/follow_path.py b/pokemongo_bot/cell_workers/follow_path.py index 1532695bd8..a99e8623ed 100644 --- a/pokemongo_bot/cell_workers/follow_path.py +++ b/pokemongo_bot/cell_workers/follow_path.py @@ -19,7 +19,7 @@ def initialize(self): if self.path_start_mode == 'closest': self.ptr = self.find_closest_point_idx(self.points) - + else: self.ptr = 0 @@ -83,7 +83,7 @@ def find_closest_point_idx(self, points): botlng = self.bot.api._position_lng lat = float(point['lat']) lng = float(point['lng']) - + dist = distance( botlat, botlng, @@ -98,6 +98,9 @@ def find_closest_point_idx(self, points): return return_idx def work(self): + last_lat = self.bot.api._position_lat + last_lng = self.bot.api._position_lng + point = self.points[self.ptr] lat = float(point['lat']) lng = float(point['lng']) @@ -115,11 +118,11 @@ def work(self): is_at_destination = True else: - self.bot.api.set_position(lat, lng) + self.bot.api.set_position(lat, lng, 0) dist = distance( - self.bot.api._position_lat, - self.bot.api._position_lng, + last_lat, + last_lng, lat, lng ) @@ -132,4 +135,14 @@ def work(self): else: self.ptr += 1 + self.emit_event( + 'position_update', + formatted="Walking from {last_position} to {current_position} ({distance} {distance_unit})", + data={ + 'last_position': (last_lat, last_lng, 0), + 'current_position': (lat, lng, 0), + 'distance': dist, + 'distance_unit': 'm' + } + ) return [lat, lng] diff --git a/pokemongo_bot/cell_workers/follow_spiral.py b/pokemongo_bot/cell_workers/follow_spiral.py index f175369e45..1e6afef9d8 100644 --- a/pokemongo_bot/cell_workers/follow_spiral.py +++ b/pokemongo_bot/cell_workers/follow_spiral.py @@ -66,9 +66,19 @@ def _generate_spiral(starting_lat, starting_lng, step_size, step_limit): return coords def work(self): + last_lat = self.bot.api._position_lat + last_lng = self.bot.api._position_lng + point = self.points[self.ptr] self.cnt += 1 + dist = distance( + last_lat, + last_lng, + point['lat'], + point['lng'] + ) + if self.bot.config.walk > 0: step_walker = StepWalker( self.bot, @@ -77,19 +87,12 @@ def work(self): point['lng'] ) - dist = distance( - self.bot.api._position_lat, - self.bot.api._position_lng, - point['lat'], - point['lng'] - ) - if self.cnt == 1: self.emit_event( 'position_update', formatted="Walking from {last_position} to {current_position} ({distance} {distance_unit})", data={ - 'last_position': self.bot.position, + 'last_position': (last_lat, last_lng, 0), 'current_position': (point['lat'], point['lng'], 0), 'distance': dist, 'distance_unit': 'm' @@ -99,14 +102,20 @@ def work(self): if step_walker.step(): step_walker = None else: - self.bot.api.set_position(point['lat'], point['lng']) - - if distance( - self.bot.api._position_lat, - self.bot.api._position_lng, - point['lat'], - point['lng'] - ) <= 1 or (self.bot.config.walk > 0 and step_walker == None): + self.bot.api.set_position(point['lat'], point['lng'], 0) + + self.emit_event( + 'position_update', + formatted="Teleported from {last_position} to {current_position} ({distance} {distance_unit})", + data={ + 'last_position': (last_lat, last_lng, 0), + 'current_position': (point['lat'], point['lng'], 0), + 'distance': dist, + 'distance_unit': 'm' + } + ) + + if dist <= 1 or (self.bot.config.walk > 0 and step_walker == None): if self.ptr + self.direction >= len(self.points) or self.ptr + self.direction <= -1: self.direction *= -1 if len(self.points) != 1: diff --git a/pokemongo_bot/cell_workers/nickname_pokemon.py b/pokemongo_bot/cell_workers/nickname_pokemon.py index c396723c73..cb5ab8e741 100644 --- a/pokemongo_bot/cell_workers/nickname_pokemon.py +++ b/pokemongo_bot/cell_workers/nickname_pokemon.py @@ -1,9 +1,14 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + import os import json from pokemongo_bot.base_task import BaseTask from pokemongo_bot.human_behaviour import sleep from pokemongo_bot.inventory import pokemons, Pokemon, Attack +import re + DEFAULT_IGNORE_FAVORITES = False DEFAULT_GOOD_ATTACK_THRESHOLD = 0.7 @@ -82,6 +87,7 @@ class NicknamePokemon(BaseTask): {iv_pct2} IV perfection (in 00-99 format - 2 chars) So 99 is best (it's a 100% perfection) {iv_pct1} IV perfection (in 0-9 format - 1 char) + {iv_ads_hex} Joined IV values in HEX (e.g. 4C9) # Basic Values of the pokemon (identical for all of one kind) {base_attack} Basic Attack (40-284) of the current pokemon kind @@ -291,7 +297,8 @@ def _generate_new_nickname(self, pokemon, template): """ # Filter template - template = template.lower().strip() + # only convert the keys to lowercase, leaving the format specifier alone + template = re.sub(r"{[\w_\d]*", lambda x:x.group(0).lower(), template).strip() # Individial Values of the current specific pokemon (different for each) iv_attack = pokemon.iv_attack @@ -341,6 +348,8 @@ def _generate_new_nickname(self, pokemon, template): iv_stamina=iv_stamina, # Joined IV values like: 4/12/9 iv_ads='/'.join(map(str, iv_list)), + # Joined IV values in HEX like: 4C9 + iv_ads_hex = ''.join(map(lambda x: format(x, 'X'), iv_list)), # Sum of the Individial Values iv_sum=iv_sum, # IV perfection (in 000-100 format - 3 chars) diff --git a/pokemongo_bot/cell_workers/pokemon_catch_worker.py b/pokemongo_bot/cell_workers/pokemon_catch_worker.py index d30718eaea..49a96690fe 100644 --- a/pokemongo_bot/cell_workers/pokemon_catch_worker.py +++ b/pokemongo_bot/cell_workers/pokemon_catch_worker.py @@ -217,6 +217,7 @@ def _use_berry(self, berry_id, berry_count, encounter_id, catch_rate_by_ball, cu # softban? else: new_catch_rate_by_ball = catch_rate_by_ball + self.bot.softban = True self.emit_event( 'softban', level='warning', diff --git a/pokemongo_bot/cell_workers/recycle_items.py b/pokemongo_bot/cell_workers/recycle_items.py index e48dff3cd8..79c9e9efc4 100644 --- a/pokemongo_bot/cell_workers/recycle_items.py +++ b/pokemongo_bot/cell_workers/recycle_items.py @@ -12,8 +12,6 @@ DEFAULT_MIN_EMPTY_SPACE = 6 class RecycleItems(BaseTask): - SUPPORTED_TASK_API_VERSION = 1 - """ Recycle undesired items if there is less than five space in inventory. You can use either item's name or id. For the full list of items see ../../data/items.json @@ -40,6 +38,8 @@ class RecycleItems(BaseTask): } } """ + SUPPORTED_TASK_API_VERSION = 1 + def initialize(self): self.items_filter = self.config.get('item_filter', {}) @@ -73,42 +73,41 @@ def should_run(self): def work(self): """ - Discard items if necessary. - :return: Returns wether or not the task went well + Start the process of recycling items if necessary. + :return: Returns whether or not the task went well :rtype: WorkerResult """ - # TODO: Use new inventory everywhere and then remove the inventory update - # Updating inventory + + # TODO: Use new inventory everywhere and then remove this inventory update inventory.refresh_inventory() + worker_result = WorkerResult.SUCCESS if self.should_run(): - # For each user's item in inventory recycle it if needed for item_in_inventory in inventory.items().all(): - amount_to_recycle = self.get_amount_to_recycle(item_in_inventory) - if self.item_should_be_recycled(item_in_inventory, amount_to_recycle): + if self.item_should_be_recycled(item_in_inventory): + # Make the bot appears more human action_delay(self.bot.config.action_wait_min, self.bot.config.action_wait_max) - if ItemRecycler(self.bot, item_in_inventory, amount_to_recycle).work() == WorkerResult.ERROR: + # If at any recycling process call we got an error, we consider that the result of this task is error too. + if ItemRecycler(self.bot, item_in_inventory, self.get_amount_to_recycle(item_in_inventory)).work() == WorkerResult.ERROR: worker_result = WorkerResult.ERROR return worker_result - def item_should_be_recycled(self, item, amount_to_recycle): + def item_should_be_recycled(self, item): """ Returns a value indicating whether the item should be recycled. - :param amount_to_recycle: - :param item: + :param item: The Item to test :return: True if the title should be recycled; otherwise, False. :rtype: bool """ - return (item.name in self.items_filter or str( - item.id) in self.items_filter) and amount_to_recycle > 0 + return (item.name in self.items_filter or str(item.id) in self.items_filter) and self.get_amount_to_recycle(item) > 0 def get_amount_to_recycle(self, item): """ Determine the amount to recycle accordingly to user config - :param item: Item to determine the amount to recycle + :param item: Item to determine the amount to recycle. :return: The amount to recycle :rtype: int """ diff --git a/pokemongo_bot/cell_workers/spin_fort.py b/pokemongo_bot/cell_workers/spin_fort.py index eee88525c5..cc25936350 100644 --- a/pokemongo_bot/cell_workers/spin_fort.py +++ b/pokemongo_bot/cell_workers/spin_fort.py @@ -149,7 +149,7 @@ def work(self): def get_forts_in_range(self): forts = self.bot.get_forts(order_by_distance=True) - for fort in forts: + for fort in reversed(forts): if 'cooldown_complete_timestamp_ms' in fort: self.bot.fort_timeouts[fort["id"]] = fort['cooldown_complete_timestamp_ms'] forts.remove(fort) diff --git a/pokemongo_bot/inventory.py b/pokemongo_bot/inventory.py index ccac6f43be..c59ba4b046 100644 --- a/pokemongo_bot/inventory.py +++ b/pokemongo_bot/inventory.py @@ -106,18 +106,46 @@ def captured(self, pokemon_id): return False return self._data[pokemon_id]['times_captured'] > 0 + class Item(object): + """ + Representation of an item. + """ def __init__(self, item_id, item_count): + """ + Initialise an instance of an item + :param item_id: ID of the item + :type item_id: int + :param item_count: Quantity of the item + :type item_count: int + :return: An item + :rtype: Item + """ self.id = item_id self.name = Items.name_for(self.id) self.count = item_count def remove(self, amount): + """ + Remove a specified amount of an item from the cached inventory. + Note that it does **NOT** removes it in the server, it only removes it from the local cached inventory. + :param amount: Amount to remove + :type amount: int + :return: Nothing + :rtype: None + """ if self.count < amount: raise Exception('Tried to remove more {} than you have'.format(self.name)) self.count -= amount def add(self, amount): + """ + Add a specified amount of the item to the local cached inventory + :param amount: Amount to add + :type amount: int + :return: Nothing. + :rtype: None + """ if amount < 0: raise Exception('Must add positive amount of {}'.format(self.name)) self.count += amount @@ -132,15 +160,41 @@ class Items(_BaseInventoryComponent): STATIC_DATA_FILE = os.path.join(_base_dir, 'data', 'items.json') def parse(self, item_data): + """ + Make an instance of an Item from raw item data. + :param item_data: Item data to make an item from + :return: Instance of the Item. + :rtype: Item + """ item_id = item_data.get(Items.ID_FIELD, None) item_count = item_data['count'] if 'count' in item_data else 0 return Item(item_id, item_count) + def all(self): + """ + Get EVERY Item from the cached inventory. + :return: List of evey item in the cached inventory + :rtype: list of Item + """ + return list(self._data.values()) + def get(self, item_id): + """ + Get ONE Item from the cached inventory. + :param item_id: Item's ID to search for. + :return: Instance of the item from the cached inventory + :rtype: Item + """ return self._data.setdefault(item_id, Item(item_id, 0)) @classmethod def name_for(cls, item_id): + """ + Search the name for an item from its ID. + :param item_id: Item's ID to search for. + :return: Item's name. + :rtype: str + """ return cls.STATIC_DATA[str(item_id)] @classmethod @@ -178,6 +232,7 @@ def has_space_for_loot(cls): return cls.get_space_left() >= max_number_of_items_looted_at_stop + class Pokemons(_BaseInventoryComponent): TYPE = 'pokemon_data' ID_FIELD = 'id' @@ -1093,30 +1148,66 @@ def _calc_cp(base_attack, base_defense, base_stamina, # # Usage helpers +# TODO : Complete the doc +# Only type return have been filled for now. It helps the IDE to suggest methods of the class. def init_inventory(bot): + """ + Initialises the cached inventory, retrieves data from the server. + :param bot: Instance of the bot. + :type bot: pokemongo_bot.PokemonGoBot + :return: Nothing. + :rtype: None + """ global _inventory _inventory = Inventory(bot) def refresh_inventory(): + """ + Refreshes the cached inventory, retrieves data from the server. + :return: Nothing. + :rtype: None + """ _inventory.refresh() def get_item_inventory_size(): + """ + Access to the Item inventory size. + :return: Item inventory size. + :rtype: int + """ _inventory.retrieve_item_inventory_size() return _inventory.item_inventory_size def pokedex(): + """ + + :return: + :rtype: Pokedex + """ return _inventory.pokedex def candies(refresh=False): + """ + + :param refresh: + :return: + :rtype: Candies + """ if refresh: refresh_inventory() return _inventory.candy def pokemons(refresh=False): + """ + + :param refresh: + :return: + :rtype: Pokemons + """ if refresh: refresh_inventory() return _inventory.pokemons @@ -1124,24 +1215,44 @@ def pokemons(refresh=False): def items(): """ - Access to the cached item inventory - :return: Instance of the cached item inventory + Access to the cached item inventory. + :return: Instance of the cached item inventory. :rtype: Items """ return _inventory.items def types_data(): + """ + + :return: + :rtype: Types + """ return Types def levels_to_cpm(): + """ + + :return: + :rtype: LevelToCPm + """ return LevelToCPm def fast_attacks(): + """ + + :return: + :rtype: FastAttacks + """ return FastAttacks def charged_attacks(): + """ + + :return: + :rtype: ChargedAttack + """ return ChargedAttacks diff --git a/pokemongo_bot/services/item_recycle_worker.py b/pokemongo_bot/services/item_recycle_worker.py index e59270d4ea..aa02b366a2 100644 --- a/pokemongo_bot/services/item_recycle_worker.py +++ b/pokemongo_bot/services/item_recycle_worker.py @@ -5,16 +5,16 @@ RECYCLE_REQUEST_RESPONSE_SUCCESS = 1 class ItemRecycler(BaseTask): - SUPPORTED_TASK_API_VERSION = 1 """ This class contains details of recycling process. """ + SUPPORTED_TASK_API_VERSION = 1 def __init__(self, bot, item_to_recycle, amount_to_recycle): """ Initialise an instance of ItemRecycler :param bot: The instance of the Bot :param item_to_recycle: The item to recycle - :type item_to_recycle: Item + :type item_to_recycle: inventory.Item :param amount_to_recycle: The amount to recycle :type amount_to_recycle: int :return: Nothing. @@ -27,8 +27,8 @@ def __init__(self, bot, item_to_recycle, amount_to_recycle): def work(self): """ - Recycle an item - :return: Returns wether or not the task went well + Start the recycling process + :return: Returns whether or not the task went well :rtype: WorkerResult """ if self.should_run(): @@ -43,7 +43,7 @@ def work(self): def should_run(self): """ - Returns a value indicating whether or mot the recycler should be run. + Returns a value indicating whether or not the recycler should be run. :return: True if the recycler should be run; otherwise, False. :rtype: bool """ @@ -87,7 +87,7 @@ def _emit_recycle_succeed(self): """ self.emit_event( 'item_discarded', - formatted='Discarded {amount}x {item}).', + formatted='Discarded {amount}x {item}.', data={ 'amount': str(self.amount_to_recycle), 'item': self.item_to_recycle.name, diff --git a/pokemongo_bot/step_walker.py b/pokemongo_bot/step_walker.py index 97a4f14b47..0e7c27bb2b 100644 --- a/pokemongo_bot/step_walker.py +++ b/pokemongo_bot/step_walker.py @@ -25,7 +25,10 @@ def __init__(self, bot, speed, dest_lat, dest_lng): self.destLng = dest_lng self.totalDist = max(1, self.dist) - self.steps = (self.dist + 0.0) / (speed + 0.0) + if speed == 0: + self.steps = 1 + else: + self.steps = (self.dist + 0.0) / (speed + 0.0) if self.dist < speed or int(self.steps) <= 1: self.dLat = 0 diff --git a/setup.sh b/setup.sh index 9535bc7d10..26c0eb4745 100755 --- a/setup.sh +++ b/setup.sh @@ -8,17 +8,18 @@ cd $pokebotpath git pull git submodule update --init --recursive git submodule foreach git pull origin master -virtualenv . source bin/activate +pip install -r requirements.txt --upgrade pip install -r requirements.txt } function Pokebotencrypt () { -echo "Start to make encrypt.so" -if [ "$(uname -s)" == "Darwin" ]; then #Mac platform - curl -O http://pgoapi.com/pgoencrypt.tar.gz -elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then #GNU/Linux platform - wget http://pgoapi.com/pgoencrypt.tar.gz +echo "Start to make encrypt.so." +if [ -x "$(command -v curl)" ] +then +curl -O http://pgoapi.com/pgoencrypt.tar.gz +else +wget http://pgoapi.com/pgoencrypt.tar.gz fi tar -xf pgoencrypt.tar.gz cd pgoencrypt/src/ @@ -43,7 +44,7 @@ Input location read -p "Input gmapkey " gmapkey cp -f configs/config.json.example configs/config.json && chmod 755 configs/config.json -if [ "$auth" = "2" ] +if [ "$auth" = "2" ] || [ "$auth" = "ptc" ] then sed -i "s/google/ptc/g" configs/config.json fi @@ -56,27 +57,42 @@ echo "Edit ./configs/config.json to modify any other config." function Pokebotinstall () { cd $pokebotpath -if [ -f /etc/debian_version ] +if [ "$(uname -s)" == "Darwin" ] +then +echo "You are on Mac os" +sudo brew update +sudo brew install --devel protobuf +elif [ -x "$(command -v apt-get)" ] then echo "You are on Debian/Ubuntu" sudo apt-get update -sudo apt-get -y install python python-pip python-dev build-essential git virtualenv -elif [ -f /etc/redhat-release ] +sudo apt-get -y install python python-pip python-dev gcc make git +elif [ -x "$(command -v yum)" ] then echo "You are on CentOS/RedHat" -sudo yum -y install epel-release -sudo yum -y install python-pip -elif [ "$(uname -s)" == "Darwin" ] +sudo yum -y install epel-release gcc make +sudo yum -y install python-pip python-devel +elif [ -x "$(command -v pacman)" ] then -echo "You are on Mac os" -sudo brew update -sudo brew install --devel protobuf +echo "You are on Arch Linux" +sudo pacman -Sy python2 python2-pip gcc make +elif [ -x "$(command -v dnf)" ] +then +echo "You are on Fedora/RHEL" +sudo dnf update +sudo dnf -y install python-pip python-devel gcc make +elif [ -x "$(command -v zypper)" ] +then +echo "You are on Open SUSE" +sudo zypper update +sudo zypper -y install python-pip python-devel gcc make else -echo "Please check if you have python pip protobuf gcc make installed on your device." +echo "Please check if you have python pip gcc make installed on your device." echo "Wait 5 seconds to continue or Use ctrl+c to interrupt this shell." sleep 5 fi sudo pip install virtualenv +Pokebotreset Pokebotupdate Pokebotencrypt echo "Install complete. Starting to generate config.json." @@ -87,6 +103,12 @@ function Pokebotreset () { cd $pokebotpath git fetch --all git reset --hard origin/dev +if [ -x "$(command -v python2)" ] +then +virtualenv -p python2 . +else +virtualenv . +fi Pokebotupdate } @@ -119,7 +141,7 @@ cp -f $pokebotpath/configs/config*.json $backuppath/ cp -f $pokebotpath/configs/*.gpx $backuppath/ cp -f $pokebotpath/configs/path*.json $backuppath/ cp -f $pokebotpath/web/config/userdata.js $backuppath/ -echo "Backup complete" +echo "Backup complete." ;; --config|-c) Pokebotconfig diff --git a/tests/nickname_test.py b/tests/nickname_test.py index 6d35d55c55..e4dc102d08 100644 --- a/tests/nickname_test.py +++ b/tests/nickname_test.py @@ -18,6 +18,7 @@ def test_nickname_generation(self): self.assertNicks('{iv_defense}', ['4', '14']) self.assertNicks('{iv_stamina}', ['8', '0']) self.assertNicks('{iv_ads}', ['9/4/8', '6/14/0']) + self.assertNicks('{iv_ads_hex}', ['948', '6E0']) self.assertNicks('{iv_sum}', ['21', '20']) self.assertNicks('{iv_pct}', ['047', '044']) self.assertNicks('{iv_pct2}', ['46', '44']) @@ -52,9 +53,13 @@ def test_nickname_generation(self): self.assertNicks('{pokemon.fast_attack.dps:.2f}', ['12.00', '10.91']) self.assertNicks('{pokemon.fast_attack.dps:.0f}', ['12', '11']) self.assertNicks('{iv_pct}_{iv_ads}', ['047_9/4/8', '044_6/14/0']) + self.assertNicks('{iv_pct}_{iv_ads_hex}', ['047_948', '044_6E0']) self.assertNicks( '{ivcp_pct2}_{iv_pct2}_{iv_ads}', ['48_46_9/4/8', '38_44_6/14/0']) + self.assertNicks( + '{ivcp_pct2}_{iv_pct2}_{iv_ads_hex}', + ['48_46_948', '38_44_6E0']) self.assertNicks( '{attack_code}{attack_pct1}{defense_pct1}{ivcp_pct1}{name}', ['Lh474Golbat', 'nn853Rattata'])