A Discord helper bot for Pokemon Go communities.
Meowth is a Discord bot written in Python 3.6.1+ built with discord.py v1.0.0
Meowth assists with organising Pokemon Go communities with support for:
- Team assignments
- Server greetings
- Wild Pokemon reporting
- Raid reporting and RSVP
- Research reporting
- Pokebattler integration for raid counters
- Silph card integration
- Gym matching extension for self-hosters
- NEW:
- NovaBot, Huntr, PokeAlarm, etc. support for automatic raid and wild reporting
- Nest reporting and listing
- Uses DMs instead of roles, which saves on server roles
- Allows all pokemon forms
- Pokestop matching
You can join the Meowth Discord Support Server for updates, setup help, feature requests, or just to test out the bot before you add it:
https://discord.gg/z44MV4X
Go here for details on how to install Python 3.6.
For all future CLI commands, replace the command name python3
with the relevant interpreter command name for your system (such as the common py
command name on Windows). See details here.
If you intend to fork Meowth and alter any code, ensure you keep up to date with any breaking changes that might occur in this branch of discord.py.
python3 -m pip install -U discord.py
PyNaCl is not installed, voice will NOT be supported
To clone the files from our repository or your own forked repository on GitHub, you will need to have git
installed.
Download the Git for Windows software.
On install, ensure the following:
Windows Explorer integration
component (and all sub-components) is selected.Use Git from the Windows Command Prompt
is selected in the PATH adjustment step.Checkout as-is, commit Unix-style line endings
is selected in the line ending config step.
First check if it's already installed with:
git --version
If it's not already installed, use your relevant package manager to install it.
For Debian and Ubuntu, it would usually be:
sudo apt-get install git
Linux:
python3 -m pip install "requests>=2.18.4" "hastebin.py>=0.2" "python-dateutil>=2.6.1" "fuzzywuzzy>=0.15.1" "dateparser>=0.6.0"
python-Levenshtein
is an optional package that increases the speed of fuzzy matching strings, which we use for matching up pokemon names, gym names and possibly other things in future. It also removes the Using slow pure-python SequenceMatcher
warning emitted from the fuzzywuzzy
python package, which can otherwise be ignored.
python3 -m pip install python-Levenshtein
The above may not be supported on all systems. You can sometimes find a suitable wheel here to install with, or you may have to look around for details suitable for your specific system.
-
Create a Bot user in the Discord Developers panel:
- Click
New App
- Add an App Name, Description and App Icon (which will be intial bot avatar image)
- Click
Create App
- Click
Create a Bot User
- Copy down your Client ID in the App Details box at the very top
- In the App Bot User box, click to reveal Token and copy it down
- Optional: Tick the Public Bot tickbox if you want to allow others to invite your bot to their own server.
- Click
-
Download the files in this repository, or your own fork if you intend to modify source
-
Copy the bot config template
config_blank.json
, rename toconfig.json
and edit it:bot_token
is the Token you copied down earlier from the Discord Developers page and requires quotes as it's a string.default_prefix
is the prefix the bot will use by default until a guild specifies otherwise with theset prefix
commandmaster
is your personal discord account ID. This should be a long set of numbers like174764205927432192
and should not have quotes around it, as it's anint
not a string.- You can get your ID by enabling Developer Mode on the Discord Client, in
User Settings
>Appearance
>Advanced
, which then enables you to right-click your username in chat and select the optionCopy ID
- Another method is to mention yourself in chat and add
\
directly behind the mention for it to escape the mention string that's created, revealing your ID.
- You can get your ID by enabling Developer Mode on the Discord Client, in
type_id_dict
specifies what Pokemon Type emojis to use for your bot.- By default, it assumes you have the emojis in your own discord guild, and doesn't use the specific external emoji format. If you intend to allow the bot on multiple guilds, you will want to setup the external emoji strings.
-
Invite your Bot's User to your guild:
- Get the Client ID you copied earlier from the Discord Developers page and replace the text
<CLIENT_ID>
with it in the following URL:
https://discordapp.com/oauth2/authorize?client_id=<CLIENT_ID>&scope=bot&permissions=268822608
- Go to the URL, select your server and click
Authorize
- Verify you aren't a robot (if the captcha doesn't appear, disable your adblocker)
- Get the Client ID you copied earlier from the Discord Developers page and replace the text
-
Run the launcher from the command prompt or terminal window:
python3 launcher.py
If successful, it should send "Meowth! That's right!" as well as basic info on startup.
-
Simply type
!configure
in your server to start the configuration process as normal.
--help, -h Show the help message
--auto-restart, -r Auto-Restarts Meowth in case of a crash.
--debug, -d Prevents output being sent to Discord DM, as restarting
could occur often.
python3 launcher.py
python3 launcher.py -d
python3 launcher.py -r
We currently only support English with our public bot, with self-hosting being the only way to support other languages.
However, we have quite a few people on our support server who have been working on their own translations in a variety of languages.
If you are wanting to translate Meowth to your language, check there in our #non-english-support
channel to see if someone might be able to share what they've worked on in the language you need.
To translate Meowth yourself, you can use pygettext.py and edit the generated translation files using Poedit.
To generate a .pot file in Windows for example:
-
Nativate to
[pythonpath]\Python36\Tools\i18n\
-
Open Command Prompt or PowerShell in this directory and run:
py pygettext.py -d <RESULTING FILENAME> <PATH TO SPECIFIC *.PY FILE>
-
This will generate a meowth.pot that you can then translate using Poedit
-
Place the po/mo files from poedit into the
/locale/<language abbreviation>/LC_MESSAGES
directory (use other languages for reference) -
Change Meowth's config.json
bot-language
andpokemon-language
to<language abbreviation>
Note: Since moving to Python 3.6 we have utlised f-strings in our source code in order to take advantage of the cleanliness and additional performance it brings. Unfortunately, we have later found out it is incompatible with pygettext's string extraction and replacement methods. As such, any strings that require translating that use f-strings will need to be edited in source to use str.format() instead.
Note: Avoid punctuation inside commands.
Arguments within < > are required.
Arguments within [ ] are optional.
pkmn = Pokemon
Commands | Requirements | Description |
---|---|---|
!save | Owner Only | Saves the save data to file. |
!restart | Owner Only | Saves the save data to file and restarts Meowth. |
!load [extensions] | Owner Only | Loads or reloads extension. |
!unload [extensions] | Owner Only | Unloads extension. |
!reload [extensions] | Owner Only | Reload extensions without a hard restart. |
!exit | Owner Only | Saves the save data to file and shutdown Meowth. |
!eval <code> | Owner Only | Evaluates code. |
!welcome [user] | Guild Manager | Test welcome message on mentioned member |
Commands | Requirements | Description |
---|---|---|
!configure [command list] | Server Manager Only | Configure Meowth |
!configure all | Server Manager Only | Configure all settings |
!configure team | Server Manager Only | Configure team settings |
!configure welcome | Server Manager Only | Configure welcome settings |
!configure raid | Server Manager Only | Configure raid settings |
!configure exraid | Server Manager Only | Configure exraid settings |
!configure invite | Server Manager Only | Configure invite settings |
!configure counters | Server Manager Only | Configure counters settings |
!configure wild | Server Manager Only | Configure wild settings |
!configure research | Server Manager Only | Configure research settings |
!configure lure | Server Manager Only | Configure lure settings |
!configure invasion | Server Manager Only | Configure invasion settings |
!configure meetup | Server Manager Only | Configure meetup settings |
!configure want | Server Manager Only | Configure want settings |
!configure archive | Server Manager Only | Configure archive settings |
!configure settings | Server Manager Only | Configure other settings |
!configure trade | Server Manager Only | Configure trade settings |
!configure nest | Server Manager Only | Configure nest settings |
!configure scanners | Server Manager Only | Configure scanners settings |
Commands | Requirements | Description |
---|---|---|
!poi_json [gym/stop] [add/remove] | Bot Manager Only | Edits stop_info.json and gym_info.json. |
!gym_match_test [gym name] | gymmatching | Tests matching for a gym. |
!stop_match_test [stop name] | gymmatching | Tests matching for a pokestop. |
!whereis [stop or gym name] | gymmatching | Matches and shows information for a POI. |
Commands | Requirements | Description |
---|---|---|
!huntrraid | Server Manager Only | Simulates a huntr raid |
!huntregg | Server Manager Only | Simulates a huntr egg |
!huntrwild | Server Manager Only | Simulates a huntr wild |
!alarmraid | Server Manager Only | Simulates a pokealarm raid |
!alarmegg | Server Manager Only | Simulates a pokealarm egg |
!alarmwild | Server Manager Only | Simulates a pokealarm wild |
!alarmquest | Server Manager Only | Simulates a pokealarm quest |
!alarmlure | Server Manager Only | Simulates a pokealarm lure |
!alarminv | Server Manager Only | Simulates a pokealarm invasion |
!raidhour | Server Manager Only | Schedules a raid hour, raid day, or community day |
!raidhour list | Server Manager Only | Lists scheduled events |
!raidhour cancel | Server Manager Only | Cancel a scheduled event |
!alarmrecover | - | Recovers bot reports that Meowth missed. |
Commands | Requirements | Description |
---|---|---|
!invasion [pokestop name] [reward] | Region Channel | Reports an ongoing Team Rocket invasion. |
!invasion reset [report_message] | Channel Manager Only and Region Channel | Resets all invasion reports or supplied report_message. |
Commands | Requirements | Description |
---|---|---|
!list | Region Channel | Lists all raids from that region channel. Aliases: !lists, !l |
!list | Raid Channel | Lists all member status' for the raid. Aliases: !lists, !l |
!list tags | Raid Channel | Same behavior as !list, but with @mentions. Aliases: !tag |
!list interested | Raid Channel | Lists 'interested' members for the raid. |
!list coming | Raid Channel | Lists 'coming' members for the raid. |
!list here | Raid Channel | Lists 'here' members for the raid. |
!list lobby | Raid Channel | List the number and users who are in the raid lobby. |
!list teams | Raid Channel | Lists teams of the members that have RSVPd. |
!list mystic | Raid Channel | Lists teams of mystic members that have RSVPd. |
!list valor | Raid Channel | Lists teams of valor members that have RSVPd. |
!list instinct | Raid Channel | Lists teams of instinct members that have RSVPd. |
!list unknown | Raid Channel | Lists members with unknown team that have RSVPd. |
!list bosses | Raid Channel | Lists boss interest of members that have RSVPd. |
!list groups | Raid Channel | Lists lobby and all other groups that are battling or completed the raid. You can tag groups of users after reply with a number. |
!list wants | Want Channel | List the wants for the user. Aliases: !l |
!list allwants | Want Channel and Manage Guild | List the wants for the server. Aliases: !l |
!list wilds | Region Channel | List the wilds for the channel. Aliases: !l |
!list research | Region Channel | List the research for the channel. Aliases: !l |
!list trades [pokemon or trainer] | Region Channel | List the trades for a user or pokemon, defaults to your trades. Aliases: !l |
!list nests | Region Channel | List the nest reports for the channel. Aliases: !l |
!list lures | Region Channel | List the lure reports for the channel. Aliases: !l |
!list pokealarms | Region Channel | List the pokealarm reports for the channel. Aliases: !l |
!list invasions | Region Channel | List the invasions reports for the channel. Aliases: !l |
!list pvp | Region Channel | List the pvp reports for the channel. Aliases: !l |
Commands | Requirements | Description |
---|---|---|
!lure [type] [pokestop name] [minutes] | Region Channel | Reports an ongoing lure. |
!lure reset [report_message] | Channel Manager Only and Region Channel | Resets all lure reports or supplied report_message. |
Commands | Requirements | Description |
---|---|---|
!nest <pkmn> | Region Channel | Reports nest. |
!nest info | Region Channel | Details about a nest. |
!nest reset [report_message] | Server Manager | Resets nest reports. |
!nest add | Channel Manager | Adds a nest. |
!nest remove | Channel Manager | Removes a nest. |
!nest time | Channel Manager | Sets migration time. |
Commands | Requirements | Description |
---|---|---|
!poi_json [pokemon] | Bot Manager Only | Edits pkmn.json form, shiny, etc. availability. |
!pokedex <pkmn> | - | Displays Pokedex entry for pokemon. |
!pokedex stats <pkmn> | - | Displays detailed Pokedex entry for pokemon. |
!sprite <pkmn> | - | Displays pokemon sprite. |
Commands | Requirements | Description |
---|---|---|
!pvp [type] [location] [minutes] | Region Channel | Reports an ongoing PVP request. |
!pvp tournament [size] [type] [location] | Region Channel | Reports an ongoing PVP request. |
!pvp reset [report_message] | Channel Manager Only and Region Channel | Resets all lure reports or supplied report_message. |
Commands | Requirements | Description |
---|---|---|
!pvp badge | Channel Manager or Gym Leader | Rewards a badge to a user. |
!pvp leader | Channel Manager Only | Promotes a user to gym leader. |
!pvp elite | Channel Manager Only | Promotes a user to Elite Four. |
!pvp champion | Channel Manager Only | Promotes a user to champion. |
!pvp record | Channel Manager Only | Manage league records. |
Commands | Requirements | Description |
---|---|---|
!raid_json [level] [bosslist] | Bot Manager Only | Edits or displays raid_info.json |
!unassume | Channel Manager Raid Channel |
Use if a level 5 egg has been assumed before raid_json was corrected. |
!raid_time <hatch or raid> <level> <new time> | Channel Manager Only | Edits hatch or raid time for raids. |
!changeraid [level or boss] | Channel Manager Only | Changes raid boss or egg level |
!raid <pkmn> <place> [timer] | Region Channel | Creates an open raid channel. Aliases: !r |
!raidegg <level> <place> [timer] | Region Channel | Creates a raid egg channel. Aliases: !re, !regg, !egg |
!raid <pkmn> | Raid Egg Channel | Converts raid egg to an open raid. |
!raid assume <pkmn> | Raid Egg Channel | Assumes a pokemon on hatch. |
!exraid <pkmn> <place> | Region Channel | Creates an exraid channel. Aliases: !ex |
!invite | Region Channel | Gain entry to exraids. |
!meetup <place> | Region Channel | Reports a community event or meetup. Aliases: !event |
!train <channel or gym> | Region Channel | Reports a raid train. Aliases: !event |
!train channel <channel or gym> | Region Channel | Reports a raid train channel. Aliases: !event |
Commands | Requirements | Description |
---|---|---|
!meetup title <title> | Meetup Channel | Sets the title of the meetup channel |
!meetup start <date time> | Meetup Channel | Sets the start time in the meetup channel |
!meetup end <date time> | Meetup Channel | Sets the end time in the meetup channel |
!train title <title> | Train Channel | Sets the title of the train channel |
!train start <date time> | Train Channel and train manager | Sets the start time of the train channel |
!train end <date time> | Train Channel and train manager | Sets the end time of the train channel channel |
!train next [channel or gym] | Train Channel and train manager | Changes train channel to next gym. Aliases: !next |
!train manager <user> | Train Channel | Sets train managers |
!train history | Train Channel | View train channel history |
!train route <gym list> | Train Channel and train manager | Sets the train route |
Commands | Requirements | Description |
---|---|---|
!timer | Raid Channel | Shows the expiry time for the raid. |
!timerset <timer> | Raid Channel | Set the expiry time for the raid. |
!moveset <move 1, move 2> | Raid Channel | Set the boss moveset. |
!starttime [HH:MM AM/PM] | Raid Channel | Set a time for a group to start a raid. |
!location | Raid Channel | Shows the raid location. |
!location new <place/map> | Raid Channel | Sets the raid location. |
!recover | Raid Channel | Recovers an unresponsive raid channel. |
!duplicate | Raid Channel | Reports the raid as a duplicate channel. |
!weather | Raid Channel | Sets the weather for the raid. |
!counters | Raid Channel | Simulate a Raid battle with Pokebattler. |
!archive | Raid Channel | Mark a channel for archiving. |
Commands | Requirements | Description |
---|---|---|
!clearstatus | Channel Manager Raid Channel |
Cancel everyone's status. |
!setstatus <user> <status> [count] | Channel Manager Raid Channel |
Changes raid channel status lists. |
!interested [number] [teamcounts] [boss list or all] | Raid Channel | Sets your status for the raid to 'interested'. Teamcounts format is m# v# i# u# . You can also supply a list of bosses or 'all' that you are interested in. Aliases: !i, !maybe |
!coming [number] [teamcounts] [boss list or all] | Raid Channel | Sets your status for the raid to 'coming'. Teamcounts format is m# v# i# u# . You can also supply a list of bosses or 'all' that you are interested in. Aliases: !c |
!here [number] [teamcounts] [boss list or all] | Raid Channel | Sets your status for the raid to 'here'. Teamcounts format is m# v# i# u# . You can also supply a list of bosses or 'all' that you are interested in. Aliases: !h |
!lobby [number] [teamcounts] | Raid Channel | Indicate you are entering the raid lobby. Teamcounts format is m# v# i# u# . |
!starting [team] | Raid Channel | Clears all members 'here', announce raid start. |
!backout | Raid Channel | Request players in lobby to backout. |
!cancel | Raid Channel | Cancel your status. Aliases: !x |
Commands | Requirements | Description |
---|---|---|
!research [pokestop name [optional URL], quest, reward] | Region Channel | Reports field research. Guided version available with just !research Aliases: !res |
!research reset [report_message] | Channel Manager Only and Region Channel | Resets all research reports or supplied report_message. |
Commands | Requirements | Description |
---|---|---|
!silph [silph user] | - | Links a server member to a Silph Road travelers card. |
!silphcard [silph user] | - | Displays Silph Road travelers card. |
Commands | Requirements | Description |
---|---|---|
**!trade [pokemon list] | Region Channel | Create a trade listing |
Commands | Requirements | Description |
---|---|---|
!team <team> | - | Let's users set their team role. |
!trainercode | - | Links and displays author's trainer code. |
!pokebattler | - | Links and displays author's pokebattler code. |
!ign | - | Links and displays author's in-game name. |
!profile [username] | - | Displays [username]'s or user's profile. |
!leaderboard [type] | - | Displays reporting leaderboard. Accepts total, raids, eggs, exraids, wilds, research. Defaults to total. |
!leaderboard reset [user] [type] | Server Manager | Resets [user]'s or server's leaderboard by type or total. |
Commands | Requirements | Description |
---|---|---|
!tutorial [command] | - | Shows interactive bot/command tutorial. |
!tutorial all | - | Launch all tutorials |
!tutorial team | - | Launch team tutorial |
!tutorial raid | - | Launch raid tutorial |
!tutorial pvp | - | Launch raid tutorial |
!tutorial exraid | - | Launch exraid tutorial |
!tutorial invite | - | Launch invite tutorial |
!tutorial wild | - | Launch wild tutorial |
!tutorial research | - | Launch research tutorial |
!tutorial lure | - | Configure lure tutorial |
!tutorial invasion | - | Launch invasion tutorial |
!tutorial want | - | Launch want tutorial |
!tutorial trade | - | Launch trade tutorial |
!tutorial nest | - | Launch nest tutorial |
!help [command] | - | Shows bot/command help, with descriptions. |
Commands | Requirements | Description |
---|---|---|
!clean_dm | Owner Only | Manually clean forgotten DMs |
!embed <title> [content] [color] [icon_url] [image_url] [thumbnail_url] [plain_message] | Owner Only | Build and send an embed |
!template | Server Manager Only | Test welcome message template |
!outputlog | Server Manager Only | Uploads the log file to hastebin and replies with a link. |
!announce [msg] | Server Manager Only | Sends announcement message to server owners. |
!about | - | Shows info about Meowth. |
!uptime | - | Shows Meowth's uptime. |
!set regional <pkmn> | Server Manager Only | Sets server's regional raid boss. Accepts number or name. |
!set timezone <UTC offset> | Server Manager Only | Sets server's timezone. Accepts numbers from -12 to 14. |
!set activity <activity> | Owner Only | Sets Meowth's activity (Playing: x). |
!set status <status> | Owner Only | Sets Meowth's status (online, offline, idle, invisible). |
!set nickname <nickname> | Owner Only | Sets Meowth's nickname. |
!set avatar <avatar> | Owner Only | Sets Meowth's avatar from a URL or image upload. |
!set username <username> | Owner Only | Sets Meowth's username. |
!prefix | Server Manager Only | Displays Meowth's prefix. |
!permissions [channelid] | Server Manager Only | Displays Meowth's permissions in guild and channel. |
Commands | Requirements | Description |
---|---|---|
!want settings | Want Channel | Set active hours, mute, want list link. |
!want categories | Want Channel | Change your want category preferences. |
!want <pkmn> | Want Channel | Adds a Pokemon to your notifications. |
!want pokemon <pkmn> | Want Channel | Adds a Pokemon to your notifications. |
!want gym <gym list> | Want Channel and gymmatching | Add a gym to your notifications. |
!want stop <stop list> | Want Channel and gymmatching | Adds a pokestop to your notifications. |
!want item <item list> | Want Channel | Adds a item to your notifications. |
!want type <type list> | Want Channel | Adds a type to your notifications. |
!want boss <boss list> | Want Channel | Adds a boss to your notifications if want list unlinked. |
!want iv <iv list> | Want Channel | Adds an IV to your notifications. |
!want level <level list> | Want Channel | Adds an level to your notifications. |
!want role <role list> | Want Channel | Adds a joinable role to user. |
!want exraid | Want Channel | Adds all EX gyms to your notifications. |
!unwant <pkmn> | Want Channel | Removes a Pokemon from your notifications. |
!unwant pokemon <pkmn> | Want Channel | Removes a Pokemon from your notifications. |
!unwant gym <gym list> | Want Channel and gymmatching | Removes a gym from your notifications. |
!unwant stop <stop list> | Want Channel and gymmatching | Removes a pokestop from your notifications. |
!unwant item <item list> | Want Channel | Removes a item from your notifications. |
!unwant type <type list> | Want Channel | Removes a type from your notifications. |
!unwant boss <boss list> | Want Channel | Removes a boss from your notifications if want list unlinked. |
!unwant iv <iv list> | Want Channel | Removes an IV from your notifications. |
!unwant level <level list> | Want Channel | Removes an level from your notifications. |
!unwant role <role list> | Want Channel | Removes a joinable role from user. |
!unwant exraid | Want Channel | Removes all EX gyms from your notifications. |
!unwant all | Want Channel | Removes all notifications. |
Commands | Requirements | Description |
---|---|---|
!wild <pkmn> <location> | Region Channel | Reports a wild pokemon, notifying people who want it. Aliases: !w |
!wild reset [message] | Server Manager | Resets all wild reports or by message. |
Meowth relies completely on users for reports. Meowth was designed as an alternative to Discord bots that use scanners and other illegitimate sources of information about Pokemon Go. As a result, Meowth works only as well as the users who use it. As there are a lot of ways to interact with Meowth, there can be a bit of a rough learning period, but it quickly becomes worth it. Some commands are not necessary for normal usage and are only there for advanced users.
If you are having trouble getting Meowth running in your server, we have found that the majority of problems are either from permissions or your configuration. Check permissions with !get perms
and check your configuration with !configure
before asking for help in the support server.
Compatibility with Python 3.6 on Mac OS X requires running "Install Certificates.command" in the Python 3.6 folder.
Install the latest Python 3.6 package from the official site if you have not already got it. At the time of writing, Python 3.6.5 was the latest maintenance release.
https://www.python.org/downloads/release/python-365/
Python must be added the the environment's PATH, which is typically done automatically on install.
Your newly installed Python interpreter can be run in CLI in either Command Prompt or PowerShell typically with one of the following commands:
python
py
py -3
py -3.6
To check your referenced interpreter version, use:
python --version
Be sure to replace all instructions that specify a certain interpreter command with the one relevant to your system, as this differs between each individual OS, configuration and environment.
If you're using Linux, you will likely have a version of Python 3 already installed on your system. Check your current version with:
python3 --version
If the version is not 3.6.1
or above, or python3
is not found, you will need to install it on your system. You do not need to remove any existing versions from your system and it is usually not recommended to uninstal the default package as other system packages may rely on it.
There are a large variety of flavours of linux, so be sure to reference online guides on how to install the required Python version with your specific system and package manager.
If you're on a version of Debian or Ubuntu and there is not a suitable ready-made package to install, the following is how to build and install Python 3.6.5 tailored for your specific system:
sudo apt-get update &&
sudo apt-get install ca-certificates libexpat1 libffi6 libgdbm3 libreadline7 libsqlite3-0 libssl1.1 dpkg-dev gcc libbz2-dev libc6-dev libexpat1-dev libffi-dev libgdbm-dev liblzma-dev libncursesw5-dev libreadline-dev libsqlite3-dev libssl-dev make tcl-dev tk-dev wget xz-utils zlib1g-dev gnupg dirmngr
wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz
wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz.asc
gpg --keyserver ha.pool.sks-keyservers.net --recv-keys 0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D
gpg --batch --verify Python-3.6.5.tar.xz.asc Python-3.6.5.tar.xz
tar -xf Python-3.6.5.tar.xz
cd Python-3.6.5
./configure --enable-optimizations --enable-loadable-sqlite-extensions --enable-shared --with-system-expat --with-system-ffi
sudo make -j "$(nproc)"
sudo make altinstall