This commit is contained in:
Valerie 2025-02-19 21:49:40 -05:00
parent 98bca88114
commit 84880846b6
2079 changed files with 70561 additions and 1 deletions

21
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View file

@ -0,0 +1,21 @@
---
name: Bug report
about: Create a report to help us improve and repo issues
title: ''
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
-----
**Expected behavior**
A clear and concise description of what you expected to happen.
**Version**
Run `[p]help Pokecord` and return the version in the help.

View file

@ -0,0 +1,14 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Summary of your suggestion**
Brief outlook on what it should be and how it should work.
**Additional context**
Add any other context or screenshots about the feature request here.

49
.github/workflows/publish_crowdin.yml vendored Normal file
View file

@ -0,0 +1,49 @@
# All credits goes to Cog-Creators for this crowdin setup
# https://github.com/Cog-Creators/Red-DiscordBot/blob/V3/develop/.github/workflows/publish_crowdin.yml
name: Crowdin
on:
schedule:
- cron: "0 20 1 * *"
env:
CROWDIN_API_KEY: ${{ secrets.crowdin_token }}
CROWDIN_PROJECT_ID: ${{ secrets.crowdin_identifier }}
jobs:
deploy:
if: github.repository == 'flaree/pokecord-red'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v1
with:
python-version: "3.8"
- name: Install dependencies
run: |
curl https://artifacts.crowdin.com/repo/GPG-KEY-crowdin | sudo apt-key add -
echo "deb https://artifacts.crowdin.com/repo/deb/ /" | sudo tee -a /etc/apt/sources.list
sudo apt-get update -qq
sudo apt-get install -y crowdin
pip install redgettext==3.2
- name: Generate source files
run: |
make gettext
- name: Upload source files
run: |
make upload_translations
- name: Download translations
run: |
make download_translations
- name: Create Pull Request
uses: peter-evans/create-pull-request@v2
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: Automated Crowdin downstream
title: "[i18n] Automated Crowdin downstream"
body: |
This is an automated PR.
Please ensure that there are no errors or invalid files are in the PR.
branch: "automated/i18n"

31
.github/workflows/run_precommit.yaml vendored Normal file
View file

@ -0,0 +1,31 @@
name: Run pre-commit
on: [push, pull_request]
jobs:
run_precommit:
name: Run pre-commit
runs-on: ubuntu-latest
steps:
# Checkout repository
- uses: actions/checkout@v2
# Setup Python and install pre-commit
- uses: actions/setup-python@v2
with:
python_version: "3.8"
- name: Install pre-commit
run: |
pip install -U pre-commit
# Load cached pre-commit environment
- name: set PY
run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV
- uses: actions/cache@v2
with:
path: ~/.cache/pre-commit
key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }}
# Run pre-commit
- name: Run pre-commit
run: |
pre-commit run --show-diff-on-failure --color=never --all-files --verbose

132
.gitignore vendored Normal file
View file

@ -0,0 +1,132 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
.python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
chromedriver.exe
.vscode/

39
.pre-commit-config.yaml Normal file
View file

@ -0,0 +1,39 @@
default_language_version:
python: python3.8
fail_fast: false
ci:
autoupdate_schedule: quarterly
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.0.1
hooks:
- id: check-yaml
- id: trailing-whitespace
- id: check-builtin-literals
- id: check-ast
- id: check-docstring-first
- id: check-json
- id: detect-private-key
- id: check-toml
- id: requirements-txt-fixer
- id: trailing-whitespace
args: [--markdown-linebreak-ext=md]
- repo: https://github.com/humitos/mirrors-autoflake.git
rev: v1.1
hooks:
- id: autoflake
args: ['--in-place', '--remove-unused-variable']
- repo: https://github.com/psf/black
rev: '21.6b0'
hooks:
- id: black
- repo: https://github.com/Pierre-Sassoulas/black-disable-checker
rev: '1.0.1'
hooks:
- id: black-disable-checker
- repo: https://github.com/pycqa/isort
rev: '5.9.1'
hooks:
- id: isort

21
LICENSE Normal file
View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2020 Jamie
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

17
Makefile Normal file
View file

@ -0,0 +1,17 @@
gettext:
redgettext --command-docstrings --verbose --recursive pokecord/ --exclude-files 'pokecord/data/*'
upload_translations:
crowdin upload sources
download_translations:
crowdin download
reformat:
python3 -m black -l 99 `git ls-files "*.py"`
stylecheck:
python3 -m black -l 99 --check --diff `git ls-files "*.py"`
compile:
python3 -m compileall .

View file

@ -1 +1,10 @@
# Ava-Cogs
# Pokecord-Red
# This repo is NOT maintained.
## This is a cog for Red! This is NOT a standalone bot. You can find the docs for Red @ https://docs.discord.red/
# Contact
You can contact me in the Red Cog support support in #support_flare-cogs
<br>

7
crowdin.yml Normal file
View file

@ -0,0 +1,7 @@
api_key_env: CROWDIN_API_KEY
project_identifier_env: CROWDIN_PROJECT_ID
base_path: ./pokecord/
preserve_hierarchy: true
files:
- source: locales/messages.pot
translation: locales/%locale%.po

17
info.json Normal file
View file

@ -0,0 +1,17 @@
{
"author": [
"Valerie (1050531216589332581)"
],
"install_msg": "Thanks for adding Ava Cogs!",
"name": "Ava Cogs",
"short": "Ava Cogs, for our fork of Red-DiscordBot",
"description": "Ava Cogs, for our fork of Red-DiscordBot",
"tags": [
"avacogs",
"pokemon",
"utility",
"information",
"nsfw",
"various"
]
}

12
locales/messages.pot Normal file
View file

@ -0,0 +1,12 @@
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2020-08-01 23:53+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: redgettext 3.1\n"

50
make.bat Normal file
View file

@ -0,0 +1,50 @@
@echo off
if [%1] == [] goto help
REM This allows us to expand variables at execution
setlocal ENABLEDELAYEDEXPANSION
REM This will set DIFF as a list of staged files
set DIFF=
for /F "tokens=* USEBACKQ" %%A in (`git diff --name-only --staged "*.py" "*.pyi"`) do (
set DIFF=!DIFF! %%A
)
REM This will set DIFF as a list of files tracked by git
if [!DIFF!]==[] (
set DIFF=
for /F "tokens=* USEBACKQ" %%A in (`git ls-files "*.py" "*.pyi"`) do (
set DIFF=!DIFF! %%A
)
)
goto %1
:reformat
py -m autoflake --in-place --imports=aiohttp,discord,redbot !DIFF! || goto :eof
py -m isort !DIFF! || goto :eof
py -m black !DIFF!
goto :eof
:stylecheck
autoflake --check --imports aiohttp,discord,redbot !DIFF! || goto :eof
isort --check-only !DIFF! || goto :eof
black --check !DIFF!
goto :eof
:reformatblack
black !DIFF!
goto :eof
:help
echo Usage:
echo make ^<command^>
echo.
echo Commands:
echo reformat Reformat all .py files being tracked by git.
echo stylecheck Check which tracked .py files need reformatting.
echo newenv Create or replace this project's virtual environment.
echo syncenv Sync this project's virtual environment to Red's latest
echo dependencies.

11
nsfw/__init__.py Normal file
View file

@ -0,0 +1,11 @@
from redbot.core.bot import Red
from .nsfw import Nsfw
__red_end_user_data_statement__ = (
"This cog does not persistently store data or metadata about users."
)
async def setup(bot: Red):
cog = Nsfw(bot)
await bot.add_cog(cog)

344
nsfw/constants.py Normal file
View file

@ -0,0 +1,344 @@
from random import choice
# Stuff for the cog
def emoji():
"""Randomize footer emojis."""
EMOJIS = [
"\N{AUBERGINE}",
"\N{SMIRKING FACE}",
"\N{PEACH}",
"\N{SPLASHING SWEAT SYMBOL}",
"\N{BANANA}",
"\N{KISS MARK}",
]
emoji = choice(EMOJIS)
return emoji
REDDIT_BASEURL = "https://api.reddit.com/r/{sub}/random"
MARTINE_API_BASE_URL = "https://api.martinebot.com/v1/images/subreddit"
IMGUR_LINKS = ("http://imgur.com", "https://m.imgur.com", "https://imgur.com")
NOT_EMBED_DOMAINS = (
"gfycat.com/",
"gifdeliverynetwork.com/",
"redgifs.com",
"imgur.com/gallery/",
"imgur.com/a/",
".gifv",
)
GOOD_EXTENSIONS = (".png", ".jpg", ".jpeg", ".gif", "gifv")
# Subreddits
FOUR_K = [
"Hegre",
"HighResNSFW",
"NSFW_Wallpapers",
"UHDnsfw",
"closeup",
]
AHEGAO = ["AhegaoGirls", "EyeRollOrgasm", "O_Faces", "RealAhegao"]
ASS = [
"AssOnTheGlass",
"AssholeBehindThong",
"ButtsAndBareFeet",
"HungryButts",
"Mooning",
"SnakeButt",
"TheUnderbun",
"Upshorts",
"ass",
"asshole",
"assinthong",
"asstastic",
"beautifulbutt",
"bigasses",
"booty",
"datgap",
"girlsinleggings",
"girlsinyogapants",
"hugeass",
"paag",
"pawg",
"facedownassup",
]
ASIANPORN = [
"AsianCuties",
"AsianHotties",
"AsianNSFW",
"AsianPorn",
"AsiansGoneWild",
"KoreanHotties",
"NSFW_Japan",
"bustyasians",
"juicyasians",
]
ANAL = [
"AnalGW",
"MasterOfAnal",
"NotInThePussy",
"anal",
"analinsertions",
"assholegonewild",
"buttsthatgrip",
]
BBW = [
"BBW",
"BBW_Chubby",
"GoneWildPlus",
"PerkyChubby",
"chubby",
"gonewildcurvy",
]
BDSM = ["BDSMGW", "BDSM_NoSpam", "Bondage", "Spanking", "bdsm"]
BLACKCOCK = ["bigblackcocks", "blackcock"]
BLOWJOB = [
"AsianBlowjobs",
"Blowjobs",
"OralCreampie",
"SwordSwallowers",
"blowjobsandwich",
]
BOOBS = [
"AreolasGW",
"BestTits",
"BigBoobsGW",
"BigBoobsGonewild",
"BiggerThanYouThought",
"Boobies",
"BustyNaturals",
"BustyPetite",
"Nipples",
"PerfectTits",
"PiercedNSFW",
"Stacked",
"TheHangingBoobs",
"TheUnderboob",
"TinyTits",
"Titties",
"TittyDrop",
"boobbounce",
"boobgifs",
"boobs",
"burstingout",
"fortyfivefiftyfive",
"ghostnipples",
"homegrowntits",
"hugeboobs",
"naturaltitties",
"pokies",
"smallboobs",
"tits",
]
BOTTOMLESS = ["nopanties", "upskirt"]
COSPLAY = [
"CosplayLewd",
"Cosplayheels",
"nsfwcosplay",
]
CUNNI = ["cunnilingus"]
CUMSHOTS = [
"GirlsFinishingTheJob",
"amateurcumsluts",
"bodyshots",
"cumfetish",
"cumontongue",
"cumshots",
"facialcumshots",
"pulsatingcumshots",
]
DEEPTHROAT = [
"DeepThroatTears",
"SwordSwallowers",
"deepthroat",
]
DICK = [
"MassiveCock",
"ThickDick",
"bulges",
"cock",
"penis",
"twinks",
]
DOUBLE_P = ["Technical_DP", "doublepenetration"]
EBONY = [
"DarkAngels",
"Ebony",
"EbonyGirls",
"bigblackasses",
"blackchickswhitedicks",
"ebonyamateurs",
]
FACIALS = ["FacialFun", "facialcumshots"]
FEET = [
"ButtsAndBareFeet",
"Feet_NSFW",
"Feetup",
"FootFetish",
"rule34feet",
]
FEMDOM = ["Femdom", "FemdomHumiliation", "femdom", "hentaifemdom"]
FUTA = [
"FutanariHentai",
"HorsecockFuta",
]
GAY_P = [
"CuteGuyButts",
"GayDaddiesPics",
"GayGifs",
"ManSex",
"broslikeus",
"bulges",
"gaybears",
"gaynsfw",
"gayotters",
"jockstraps",
"ladybonersgw",
"lovegaymale",
"manass",
"MaleUnderwear",
]
GROUPS = ["GroupOfNudeGirls", "groupsex"]
LESBIANS = [
"HDLesbianGifs",
"Lesbian_gifs",
"StraightGirlsPlaying",
"dyke",
"girlskissing",
"lesbians",
"mmgirls",
"scissoring",
]
MILF = [
"AgedBeauty",
"MILFs",
"Milfie",
"amateur_milfs",
"cougars",
"hairymilfs",
"maturemilf",
"milf",
]
ORAL = [
"AsianBlowjobs",
"Blowjobs",
"DeepThroatTears",
"OralCreampie",
"SwordSwallowers",
"blowjobsandwich",
"cunnilingus",
"deepthroat",
]
PUBLIC = [
"ChangingRooms",
"Flashing",
"FlashingAndFlaunting",
"FlashingGirls",
"NSFW_Outdoors",
"NotSafeForNature",
"PublicFlashing",
"WoodNymphs",
"bitchinbubba",
"casualnudity",
"exposedinpublic",
"gwpublic",
"holdthemoan",
"publicplug",
"snowgirls",
]
PUSSY = [
"GodPussy",
"HairyPussy",
"Innies",
"LabiaGW",
"LipsThatGrip",
"MoundofVenus",
"PussyFlashing",
"PussyMound",
"grool",
"peachlips",
"pelfie",
"pussy",
"rearpussy",
"spreadeagle",
"ButterflyWings",
"DangleAndJingle",
]
REAL_GIRLS = [
"CellShots",
"ChangingRooms",
"Nude_Selfie",
"RealGirls",
"selfpix",
]
REDHEADS = [
"FreckledRedheads",
"RedheadGifs",
"RedheadsPorn",
"ginger",
"nsfw_redhead",
"redheads",
]
RULE_34 = [
"Overwatch_Porn",
"Rule34LoL",
"Rule_34",
"rule34",
]
SQUIRTS = ["squirting", "squirting_gifs", "wetspot", "grool"]
THIGHS = [
"ThickThighs",
"Thigh",
"datgap",
"leggingsgonewild",
"legs",
"theratio",
"thighhighs",
]
THREESOME = [
"AirTight",
"SpitRoasted",
"Threesome",
"Xsome",
"amateur_threesomes",
"groupsex",
"gangbang",
"blowbang",
]
TRANS = [
"GoneWildTrans",
"Shemale_Big_Cock",
"Shemales",
"ShemalesParadise",
"trapgifs",
"traps",
]
WILD = [
"ArtGW",
"AsiansGoneWild",
"BigBoobsGW",
"BigBoobsGonewild",
"GWCouples",
"GWNerdy",
"GoneWildSmiles",
"LabiaGW",
"LingerieGW",
"PetiteGoneWild",
"Swingersgw",
"TallGoneWild",
"UnderwearGW",
"altgonewild",
"bigonewild",
"dirtysmall",
"gonewild",
"gonewildcolor",
"gonewildcouples",
"gonewildcurvy",
"gwpublic",
"workgonewild",
]
YIFF = ["Hyiff", "Yiffbondage", "femyiff", "yiff", "yiffgif"]
# Other APIs
NEKOBOT_HENTAI = choice(["hentai_anal", "hentai"])
NEKOBOT_URL = "https://nekobot.xyz/api/image?type={}"

242
nsfw/core.py Normal file
View file

@ -0,0 +1,242 @@
import asyncio
import json
import sys
from random import choice
from typing import List, Optional, Union
import aiohttp
import discord
from redbot.core import Config, commands
from redbot.core.bot import Red
from redbot.core.i18n import Translator, cog_i18n
from redbot.core.utils.chat_formatting import bold, box, inline
from .constants import (
GOOD_EXTENSIONS,
IMGUR_LINKS,
MARTINE_API_BASE_URL,
NOT_EMBED_DOMAINS,
REDDIT_BASEURL,
emoji,
)
_ = Translator("Nsfw", __file__)
# FIXME: This code really needs a good rewrite at some point.
@cog_i18n(_)
class Core(commands.Cog):
__author__ = ["Predä", "aikaterna"]
__version__ = "2.3.99"
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete."""
return
def __init__(self, bot: Red):
self.bot = bot
self.session = aiohttp.ClientSession(
headers={
"User-Agent": (
f"Red-DiscordBot PredaCogs-Nsfw/{self.__version__} "
f"(Python/{'.'.join(map(str, sys.version_info[:3]))} aiohttp/{aiohttp.__version__})"
)
}
)
self.config = Config.get_conf(self, identifier=512227974893010954, force_registration=True)
self.config.register_global(use_reddit_api=False)
def cog_unload(self):
self.bot.loop.create_task(self.session.close())
def format_help_for_context(self, ctx: commands.Context) -> str:
"""Thanks Sinbad!"""
pre_processed = super().format_help_for_context(ctx)
return f"{pre_processed}\n\nAuthors: {', '.join(self.__author__)}\nCog Version: {self.__version__}"
async def _get_imgs(self, subs: List[str] = None):
"""Get images from Reddit API."""
tries = 0
while tries < 5:
sub = choice(subs)
try:
if await self.config.use_reddit_api():
async with self.session.get(REDDIT_BASEURL.format(sub=sub)) as reddit:
if reddit.status != 200:
return None, None
try:
data = await reddit.json(content_type=None)
content = data[0]["data"]["children"][0]["data"]
url = content["url"]
subr = content["subreddit"]
except (KeyError, ValueError, json.decoder.JSONDecodeError):
tries += 1
continue
if url.startswith(IMGUR_LINKS):
url = url + ".png"
elif url.endswith(".mp4"):
url = url[:-3] + "gif"
elif url.endswith(".gifv"):
url = url[:-1]
elif not url.endswith(GOOD_EXTENSIONS) and not url.startswith(
"https://gfycat.com"
) or "redgifs" in url:
tries += 1
continue
return url, subr
else:
async with self.session.get(
MARTINE_API_BASE_URL, params={"name": sub}
) as resp:
if resp.status != 200:
tries += 1
continue
try:
data = await resp.json()
return data["data"]["image_url"], data["data"]["subreddit"]["name"]
except (KeyError, json.JSONDecodeError):
tries += 1
continue
except aiohttp.client_exceptions.ClientConnectionError:
tries += 1
continue
return None, None
async def _get_others_imgs(self, ctx: commands.Context, url: str = None):
"""Get images from all other images APIs."""
try:
async with self.session.get(url) as resp:
if resp.status != 200:
await self._api_errors_msg(ctx, error_code=resp.status)
return None
try:
data = await resp.json(content_type=None)
except json.decoder.JSONDecodeError as exception:
await self._api_errors_msg(ctx, error_code=exception)
return None
data = dict(img=data)
return data
except aiohttp.client_exceptions.ClientConnectionError:
await self._api_errors_msg(ctx, error_code="JSON decode failed")
return None
async def _api_errors_msg(self, ctx: commands.Context, error_code: int = None):
"""Error message when API calls fail."""
return await ctx.send(
_("Error when trying to contact image service, please try again later. ")
+ "(Code: {})".format(inline(str(error_code)))
)
async def _version_msg(self, ctx: commands.Context, version: str, authors: List[str]):
"""Cog version message."""
msg = box(
_("Nsfw cog version: {version}\nAuthors: {authors}").format(
version=version, authors=", ".join(authors)
),
lang="py",
)
return await ctx.send(msg)
async def _make_embed(self, ctx: commands.Context, subs: List[str], name: str):
"""Function to make the embed for all Reddit API images."""
try:
url, subr = await asyncio.wait_for(self._get_imgs(subs=subs), 5)
except asyncio.TimeoutError:
await ctx.send("Failed to get an image. Please try again later. (Timeout error)")
return
if not url:
return
if any(wrong in url for wrong in NOT_EMBED_DOMAINS):
em = (
_("Here is {name} gif ...")
+ " \N{EYES}\n\n"
+ _("Requested by {req} {emoji} • From {r}\n{url}")
).format(
name=name,
req=bold(ctx.author.display_name),
emoji=emoji(),
r=bold(f"r/{subr}"),
url=url,
)
else:
em = await self._embed(
color=0x891193,
title=(_("Here is {name} image ...") + " \N{EYES}").format(name=name),
description=bold(
_("[Link if you don't see image]({url})").format(url=url),
escape_formatting=False,
),
image=url,
footer=_("Requested by {req} {emoji} • From r/{r}").format(
req=ctx.author.display_name, emoji=emoji(), r=subr
),
)
return em
async def _make_embed_other(
self, ctx: commands.Context, name: str, url: str, arg: str, source: str
):
"""Function to make the embed for all others APIs images."""
try:
data = await asyncio.wait_for(self._get_others_imgs(ctx, url=url), 5)
except asyncio.TimeoutError:
await ctx.send("Failed to get an image. Please try again later. (Timeout error)")
return
if not data:
return
em = await self._embed(
color=0x891193,
title=(_("Here is {name} image ...") + " \N{EYES}").format(name=name),
description=bold(
_("[Link if you don't see image]({url})").format(url=data["img"][arg]),
escape_formatting=False,
),
image=data["img"][arg],
footer=_("Requested by {req} {emoji} • From {source}").format(
req=ctx.author.display_name, emoji=emoji(), source=source
),
)
return em
async def _maybe_embed(self, ctx: commands.Context, embed: Union[discord.Embed, str]):
"""
Function to choose if type of the message is an embed or not
and if not send a simple message.
"""
try:
if isinstance(embed, discord.Embed):
await ctx.send(embed=embed)
else:
await ctx.send(embed)
except discord.HTTPException:
return
async def _send_msg(self, ctx: commands.Context, name: str, subs: List[str] = None):
"""Main function called in all Reddit API commands."""
embed = await self._make_embed(ctx, subs, name)
return await self._maybe_embed(ctx, embed=embed)
async def _send_other_msg(
self, ctx: commands.Context, name: str, arg: str, source: str, url: str = None
):
"""Main function called in all others APIs commands."""
embed = await self._make_embed_other(ctx, name, url, arg, source)
return await self._maybe_embed(ctx, embed)
@staticmethod
async def _embed(
color: Union[int, discord.Color] = None,
title: str = None,
description: str = None,
image: str = None,
footer: Optional[str] = None,
):
em = discord.Embed(color=color, title=title, description=description)
em.set_image(url=image)
if footer:
em.set_footer(text=footer)
return em

10
nsfw/info.json Normal file
View file

@ -0,0 +1,10 @@
{
"author": ["Predä", "aikaterna"],
"install_msg": "Thank you for installing my Nsfw cog!\n\n__Important note:__ As indicated in name of this cog, it contains mature content and is not suited for all audiences, use it responsibly.\n__Second important note:__ This cog uses by default Martine's API, this is to avoid your bot being ratelimited by Reddit pretty fast. That API is owned by this cog's author. It keeps a hash of your bot's IP in order to get ratelimits working, then access logs are not stored persistently. See privacy policy here: https://api.martinebot.com/v1/privacypolicy. If you ever want to switch back to use Reddit API, it is possible by using `[p]nsfwset switchredditapi`\n\nUse `[p]help Nsfw` to get all commands.",
"name": "Nsfw",
"short": "Send random NSFW images from random subreddits and Nekobot API.",
"description": "Send random NSFW images from random subreddits and Nekobot API in NSFW only channels.",
"tags": ["nsfw", "reddit", "images"],
"min_bot_version" : "3.5.0",
"end_user_data_statement": "This cog does not persistently store data or metadata about users."
}

398
nsfw/locales/nl-NL.po Normal file
View file

@ -0,0 +1,398 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2019-07-22 12:43+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: redgettext 2.2\n"
#: core.py:76
msgid "Error when trying to contact image service, please try again later. "
msgstr "Fout bij het proberen contact te maken met de beeldservice. Probeer het later opnieuw.""
#: core.py:83
msgid ""
"Nsfw cog version: {version}\n"
"Authors: {authors}"
msgstr ""
"Nsfw cog versie: {version}\n"
"Auteurs: {authors}"
#: core.py:98 core.py:126
msgid "Here is {name} image ..."
msgstr "Hier is {name} afbeelding ..."
#: core.py:99 core.py:127
msgid "[Link if you don't see image]({url})"
msgstr "[Link als je geen afbeelding ziet]({url})"
#: core.py:101
msgid "Requested by {req} {emoji} • From r/{r}"
msgstr "Aangevraagd door {req} {emoji} • Van r/{r}"
#: core.py:107
msgid "Here is {name} gif ..."
msgstr "Hier is {name} gif ..."
#: core.py:109
msgid ""
"Requested by {req} {emoji} • From {r}\n"
"{url}"
msgstr ""
"Aangevraagd door {req} {emoji} • Van {r}\n"
"{url}"
#: core.py:129
msgid "Requested by {req} {emoji} • From Nekobot API"
msgstr "Aangevraagd door {req} {emoji} • Van Nekobot API"
#: core.py:195
msgid "You can't use this command in a non-NSFW channel !"
msgstr "Je kunt die opdracht niet gebruiken in een niet-NSFW-kanaal!"
#: nsfw.py:16
#, docstring
msgid ""
"\n"
" Send random NSFW images from random subreddits\n"
"\n"
" If `[p]help Nsfw` or any other Nsfw commands are used in a non-nsfw channel,\n"
" you will not be able to see the list of commands for this category.\n"
" "
msgstr ""
"\n"
" Stuur willekeurige NSFW-afbeeldingen van willekeurige subreddits\n"
"\n"
" Typ `[p]help Nsfw`of een andere nsfw command in niet-nsfw-kanalen,\n"
" dan zal je de lijst met opdrachten voor deze categorie niet kunnen zien.\n"
" "
#: nsfw.py:28
#, docstring
msgid "Get the version of the installed Nsfw cog."
msgstr "Download de versie van het geïnstalleerde Nsfw-cog."
#: nsfw.py:36
#, docstring
msgid ""
"\n"
" Delete a number specified of DM's from the bot.\n"
"\n"
" `<number>`: Number of messages from the bot you want\n"
" to delete in your DM's.\n"
" "
msgstr ""
"\n"
" Verwijder een aantal opgegeven DM's uit de bot.\n"
"\n"
" `<number>`: Aantal berichten die je wilt verwijderen\n"
" van de bot in je DM's.\n"
" "
#: nsfw.py:43
msgid "This command works only for DM's messages !"
msgstr "Deze command werkt alleen in privé berichten!"
#: nsfw.py:54
#, docstring
msgid "Show some 4k images from random subreddits."
msgstr "Toon een aantal 4k-afbeeldingen van willekeurige subreddits."
#: nsfw.py:56
msgid "4k"
msgstr "4k"
#: nsfw.py:63
#, docstring
msgid "Show some ahegao images from random subreddits."
msgstr "Toon enkele ahegao-afbeeldingen van willekeurige subreddits."
#: nsfw.py:65
msgid "ahegao"
msgstr "ahego"
#: nsfw.py:72
#, docstring
msgid "Show some ass images from random subreddits."
msgstr "Toon enkele bibs-afbeeldingen van willekeurige subreddits."
#: nsfw.py:74
msgid "ass"
msgstr "bips"
#: nsfw.py:81
#, docstring
msgid "Show some anal images/gifs from random subreddits."
msgstr "Toon enkele bips afbeeldingen / gifs van willekeurige subreddits."
#: nsfw.py:83
msgid "anal"
msgstr "anaal"
#: nsfw.py:90
#, docstring
msgid "Show some bdsm from random subreddits."
msgstr "Toon enkele bdsm afbeeldingen van willekeurige subreddits."
#: nsfw.py:92
msgid "bdsm"
msgstr "bdsm"
#: nsfw.py:99
#, docstring
msgid "Show some blackcock images from random subreddits."
msgstr "Toon enkele donkere piemels van willekeurige subreddits."
#: nsfw.py:101
msgid "black cock"
msgstr "donkere piemels"
#: nsfw.py:108
#, docstring
msgid "Show some blowjob images/gifs from random subreddits."
msgstr "Toon enkele blowjob van willekeurige subreddits."
#: nsfw.py:110
msgid "blowjob"
msgstr "blowjob"
#: nsfw.py:117
#, docstring
msgid "Show some boobs images from random subreddits."
msgstr "Toon enkele tieten van willekeurige subreddits."
#: nsfw.py:119
msgid "boobs"
msgstr "tieten"
#: nsfw.py:126
#, docstring
msgid "Show some bottomless images from random subreddits."
msgstr "Toon enkele bottomless afbeeldingen van willekeurige subreddits."
#: nsfw.py:128
msgid "bottomless"
msgstr "bottomless"
#: nsfw.py:135
#, docstring
msgid "Show some nsfw cosplay images from random subreddits."
msgstr "Toon enkele nsfw cosplay afbeeldingen van willekeurige subreddits."
#: nsfw.py:137
msgid "nsfw cosplay"
msgstr "nsfw cosplay"
#: nsfw.py:144
#, docstring
msgid "Show some cunnilingus images from random subreddits."
msgstr "Toon enkele cunnilingus afbeeldingen van willekeurige subreddits."
#: nsfw.py:146
msgid "cunnilingus"
msgstr "cunnilingus"
#: nsfw.py:153
#, docstring
msgid "Show some cumshot images/gifs from random subreddits."
msgstr "Toon enkele cumshot afbeeldingen van willekeurige subreddits."
#: nsfw.py:155
msgid "cumshot"
msgstr "cumshot"
#: nsfw.py:162
#, docstring
msgid "Show some deepthroat images from random subreddits."
msgstr "Toon enkele feest-in-je-mond afbeeldingen van willekeurige subreddits."
#: nsfw.py:164
msgid "deepthroat"
msgstr "feest-in-je-mond"
#: nsfw.py:171
#, docstring
msgid "Show some dicks images from random subreddits."
msgstr "Toon enkele piemels van willekeurige subreddits."
#: nsfw.py:173
msgid "dick"
msgstr "piemels"
#: nsfw.py:180
#, docstring
msgid "Show some double penetration images/gifs from random subreddits."
msgstr "Toon enkele dubbel-feestje afbeeldingen van willekeurige subreddits."
#: nsfw.py:182
msgid "double penetration"
msgstr "dubbel-feestje"
#: nsfw.py:189
#, docstring
msgid "Show some futa images from random subreddits."
msgstr "Toon enkele futa afbeeldingen van willekeurige subreddits."
#: nsfw.py:191
msgid "futa"
msgstr "futa"
#: nsfw.py:198
#, docstring
msgid "Show some gay porn from random subreddits."
msgstr "Toon enkele homo porno afbeeldingen van willekeurige subreddits."
#: nsfw.py:200
msgid "gay porn"
msgstr "homo porno"
#: nsfw.py:207
#, docstring
msgid "Show some groups nudes from random subreddits."
msgstr "Toon enkele afbeeldingen van naakte groepen van willekeurige subreddits."
#: nsfw.py:216
#, docstring
msgid "Show some hentai images/gifs from Nekobot API."
msgstr "Toon enkele hentai afbeeldingen van Nekobot API."
#: nsfw.py:218
msgid "hentai"
msgstr "hentai"
#: nsfw.py:225
#, docstring
msgid "Show some lesbian gifs or images from random subreddits."
msgstr "Toon enkele lesbo afbeeldingen van willekeurige subreddits."
#: nsfw.py:227
msgid "lesbian"
msgstr "lesbo"
#: nsfw.py:234
#, docstring
msgid "Show some milf images from random subreddits."
msgstr "Toon enkele milf afbeeldingen van willekeurige subreddits."
#: nsfw.py:236
msgid "milf"
msgstr "milf"
#: nsfw.py:243
#, docstring
msgid "Show some oral gifs or images from random subreddits."
msgstr "Toon enkele orale afbeeldingen van willekeurige subreddits."
#: nsfw.py:245
msgid "oral"
msgstr "oraal"
#: nsfw.py:252
#, docstring
msgid "Show some porn gifs from Nekobot API."
msgstr "Toon enkele porno gifjes van Nekobot API."
#: nsfw.py:254
msgid "porn gif"
msgstr "porno gifjes"
#: nsfw.py:261
#, docstring
msgid "Show some public nude images from random subreddits."
msgstr "Toon enkele afbeeldingen van publiekelijk naakte mensen van willekeurige subreddits."
#: nsfw.py:263
msgid "public nude"
msgstr "publiekelijk naakt"
#: nsfw.py:270
#, docstring
msgid "Show some pussy nude images from random subreddits."
msgstr "Toon enkele kutjes van willekeurige subreddits."
#: nsfw.py:272
msgid "pussy"
msgstr "kutjes"
#: nsfw.py:279
#, docstring
msgid "Show some real girls images from random subreddits."
msgstr "Toon enkele naakte dames van willekeurige subreddits."
#: nsfw.py:281
msgid "real nudes"
msgstr "echte naaktfoto's"
#: nsfw.py:288
#, docstring
msgid "Show some red heads images from random subreddits."
msgstr "Toon enkele roodharigen van willekeurige subreddits."
#: nsfw.py:290
msgid "red head"
msgstr "roodharigen"
#: nsfw.py:297
#, docstring
msgid "Show some rule34 images from random subreddits."
msgstr "Toon enkele rule34 afbeeldingen van willekeurige subreddits."
#: nsfw.py:299
msgid "rule34"
msgstr "rule34"
#: nsfw.py:306
#, docstring
msgid "Show some squirts images from random subreddits."
msgstr "Toon enkele squirt afbeeldingen van willekeurige subreddits."
#: nsfw.py:308
msgid "squirt"
msgstr "squirts"
#: nsfw.py:315
#, docstring
msgid "Show some thighs images from random subreddits."
msgstr "Toon enkele thigh afbeeldingen van willekeurige subreddits."
#: nsfw.py:317
msgid "thigh"
msgstr "thigh"
#: nsfw.py:324
#, docstring
msgid "Show some traps from random subreddits."
msgstr "Toon enkele trap afbeeldingen van willekeurige subreddits."
#: nsfw.py:326
msgid "trap"
msgstr "trap"
#: nsfw.py:333
#, docstring
msgid "Show some gonewild images from random subreddits."
msgstr "Toon enkele gonewild afbeeldingen van willekeurige subreddits."
#: nsfw.py:335
msgid "gonewild"
msgstr "gonewild"
#: nsfw.py:342
#, docstring
msgid "Show some yiff images from random subreddits."
msgstr "Toon enkele yiff afbeeldingen van willekeurige subreddits."
#: nsfw.py:344
msgid "yiff"
msgstr "yiff"

435
nsfw/nsfw.py Normal file
View file

@ -0,0 +1,435 @@
import discord
from redbot.core import commands
from redbot.core.i18n import Translator, cog_i18n
import contextlib
from . import constants as sub
from .core import Core
_ = Translator("Nsfw", __file__)
@cog_i18n(_)
class Nsfw(Core):
"""
Send random NSFW images from random subreddits
If `[p]help Nsfw` or any other Nsfw commands are used in a non-nsfw channel,
you will not be able to see the list of commands for this category.
"""
@commands.command()
async def nsfwversion(self, ctx: commands.Context):
"""Get the version of the installed Nsfw cog."""
await self._version_msg(ctx, self.__version__, self.__author__)
@commands.is_owner()
@commands.group()
async def nsfwset(self, ctx: commands.Context):
"""Settings for the Nsfw cog."""
@nsfwset.command()
async def switchredditapi(self, ctx: commands.Context):
"""Toggle to use Reddit API directly with the cost of getting ratelimited fast, or use Martine API with faster results and no ratelimits problems.
Defaults to Martine API."""
val = await self.config.use_reddit_api()
await self.config.use_reddit_api.set(not val)
await ctx.send(
"Switched to Reddit API. Warning: Your bot might be ratelimited by Reddit fast."
if not val
else "Switched back to Martine API."
)
@commands.is_nsfw()
@commands.command()
@commands.cooldown(1, 3, commands.BucketType.user)
async def cleandm(self, ctx: commands.Context, number: int):
"""
Delete a number specified of DM's from the bot.
`<number>`: Number of messages from the bot you want
to delete in your DM's.
"""
if ctx.guild:
return await ctx.send(_("This command works only for DM's messages !"))
async for message in ctx.channel.history(limit=number):
if message.author.id == ctx.bot.user.id:
with contextlib.suppress(discord.NotFound):
await message.delete()
await ctx.tick()
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(name="4k", aliases=["4K", "fourk"])
async def four_k(self, ctx: commands.Context):
"""Sends some 4k images from random subreddits."""
await self._send_msg(ctx, _("4k"), sub.FOUR_K)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["oface", "ofaces"])
async def ahegao(self, ctx: commands.Context):
"""Sends some ahegao images from random subreddits."""
await self._send_msg(ctx, _("ahegao"), sub.AHEGAO)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["butt", "booty"])
async def ass(self, ctx: commands.Context):
"""Sends some ass images from random subreddits."""
await self._send_msg(ctx, _("ass"), sub.ASS)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["asian"])
async def asianporn(self, ctx: commands.Context):
"""Sends some asian porn images."""
await self._send_msg(ctx, _("asian porn"), sub.ASIANPORN)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["sodomy"])
async def anal(self, ctx: commands.Context):
"""Sends some anal images/gifs from random subreddits."""
await self._send_msg(ctx, _("anal"), sub.ANAL)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command()
async def bbw(self, ctx: commands.Context):
"""Sends some bbw images."""
await self._send_msg(ctx, _("bbw"), sub.BBW)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["shibari"])
async def bdsm(self, ctx: commands.Context):
"""Sends some bdsm from random subreddits."""
await self._send_msg(ctx, _("bdsm"), sub.BDSM)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["blackdick", "bcock", "bdick", "blackcocks", "blackdicks"])
async def blackcock(self, ctx: commands.Context):
"""Sends some blackcock images from random subreddits."""
await self._send_msg(ctx, _("black cock"), sub.BLACKCOCK)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["blowjobs", "blowj", "bjob", "fellatio", "fellation"])
async def blowjob(self, ctx: commands.Context):
"""Sends some blowjob images/gifs from random subreddits."""
await self._send_msg(ctx, _("blowjob"), sub.BLOWJOB)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["boob", "boobies", "tits", "titties", "breasts", "breast"])
async def boobs(self, ctx: commands.Context):
"""Sends some boobs images from random subreddits."""
await self._send_msg(ctx, _("boobs"), sub.BOOBS)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["boless"])
async def bottomless(self, ctx: commands.Context):
"""Sends some bottomless images from random subreddits."""
await self._send_msg(ctx, _("bottomless"), sub.BOTTOMLESS)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command()
async def cosplay(self, ctx: commands.Context):
"""Sends some nsfw cosplay images from random subreddits."""
await self._send_msg(ctx, _("nsfw cosplay"), sub.COSPLAY)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["cunni", "pussyeating"])
async def cunnilingus(self, ctx: commands.Context):
"""Sends some cunnilingus images from random subreddits."""
await self._send_msg(ctx, _("cunnilingus"), sub.CUNNI)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["cum", "cums", "cumshots"])
async def cumshot(self, ctx: commands.Context):
"""Sends some cumshot images/gifs from random subreddits."""
await self._send_msg(ctx, _("cumshot"), sub.CUMSHOTS)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["deept", "deepthroating"])
async def deepthroat(self, ctx: commands.Context):
"""Sends some deepthroat images from random subreddits."""
await self._send_msg(ctx, _("deepthroat"), sub.DEEPTHROAT)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["cock"])
async def dick(self, ctx: commands.Context):
"""Sends some dicks images from random subreddits."""
await self._send_msg(ctx, _("dick"), sub.DICK)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["doublep"])
async def doublepenetration(self, ctx: commands.Context):
"""Sends some double penetration images/gifs from random subreddits."""
await self._send_msg(ctx, _("double penetration"), sub.DOUBLE_P)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command()
async def ebony(self, ctx: commands.Context):
"""Sends some ebony images."""
await self._send_msg(ctx, _("ebony"), sub.EBONY)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["facial"])
async def facials(self, ctx: commands.Context):
"""Sends some facials images from random subreddits."""
await self._send_msg(ctx, _("facials"), sub.FACIALS)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["feets", "feetish"])
async def feet(self, ctx: commands.Context):
"""Sends some feet images from random subreddits."""
await self._send_msg(ctx, _("feets"), sub.FEET)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command()
async def femdom(self, ctx: commands.Context):
"""Sends some femdom images from random subreddits."""
await self._send_msg(ctx, _("femdom"), sub.FEMDOM)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["futanari"])
async def futa(self, ctx: commands.Context):
"""Sends some futa images from random subreddits."""
await self._send_msg(ctx, _("futa"), sub.FUTA)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["gayporn"])
async def gay(self, ctx: commands.Context):
"""Sends some gay porn from random subreddits."""
await self._send_msg(ctx, _("gay porn"), sub.GAY_P)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["groups", "nudegroup", "nudegroups"])
async def group(self, ctx: commands.Context):
"""Sends some groups nudes from random subreddits."""
await self._send_msg(ctx, "groups nudes", sub.GROUPS)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command()
async def hentai(self, ctx: commands.Context):
"""Sends some hentai images/gifs from Nekobot API."""
await self._send_other_msg(
ctx,
name=_("hentai"),
arg="message",
source="Nekobot API",
url=sub.NEKOBOT_URL.format(sub.NEKOBOT_HENTAI),
)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["lesbians"])
async def lesbian(self, ctx: commands.Context):
"""Sends some lesbian gifs or images from random subreddits."""
await self._send_msg(ctx, _("lesbian"), sub.LESBIANS)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["milfs"])
async def milf(self, ctx: commands.Context):
"""Sends some milf images from random subreddits."""
await self._send_msg(ctx, _("milf"), sub.MILF)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["oralsex"])
async def oral(self, ctx: commands.Context):
"""Sends some oral gifs or images from random subreddits."""
await self._send_msg(ctx, _("oral"), sub.ORAL)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["pgif", "prongif"])
async def porngif(self, ctx: commands.Context):
"""Sends some porn gifs from Nekobot API."""
await self._send_other_msg(
ctx,
name=_("porn gif"),
arg="message",
source="Nekobot API",
url=sub.NEKOBOT_URL.format("pgif"),
)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command()
async def public(self, ctx: commands.Context):
"""Sends some public nude images from random subreddits."""
await self._send_msg(ctx, _("public nude"), sub.PUBLIC)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["vagina", "puss"])
async def pussy(self, ctx: commands.Context):
"""Sends some pussy nude images from random subreddits."""
await self._send_msg(ctx, _("pussy"), sub.PUSSY)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command()
async def realgirls(self, ctx: commands.Context):
"""Sends some real girls images from random subreddits."""
await self._send_msg(ctx, _("real nudes"), sub.REAL_GIRLS)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["redheads", "ginger", "gingers"])
async def redhead(self, ctx: commands.Context):
"""Sends some red heads images from random subreddits."""
await self._send_msg(ctx, _("red head"), sub.REDHEADS)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["r34"])
async def rule34(self, ctx: commands.Context):
"""Sends some rule34 images from random subreddits."""
await self._send_msg(ctx, _("rule34"), sub.RULE_34)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["squirts"])
async def squirt(self, ctx: commands.Context):
"""Sends some squirts images from random subreddits."""
await self._send_msg(ctx, _("squirt"), sub.SQUIRTS)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["thighs", "legs"])
async def thigh(self, ctx: commands.Context):
"""Sends some thighs images from random subreddits."""
await self._send_msg(ctx, _("thigh"), sub.THIGHS)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["groupsex"])
async def threesome(self, ctx: commands.Context):
"""Sends some threesome images."""
await self._send_msg(ctx, _("threesome"), sub.THREESOME)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["trap", "shemale", "shemales"])
async def trans(self, ctx: commands.Context):
"""Sends some trans from random subreddits."""
await self._send_msg(ctx, _("trans"), sub.TRANS)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["wild", "gwild"])
async def gonewild(self, ctx: commands.Context):
"""Sends some gonewild images from random subreddits."""
await self._send_msg(ctx, _("gonewild"), sub.WILD)
@commands.is_nsfw()
@commands.bot_has_permissions(embed_links=True)
@commands.cooldown(1, 0.5, commands.BucketType.user)
@commands.command(aliases=["yiffs"])
async def yiff(self, ctx: commands.Context):
"""Sends some yiff images from random subreddits."""
await self._send_msg(ctx, _("yiff"), sub.YIFF)

7
pokecord/__init__.py Normal file
View file

@ -0,0 +1,7 @@
from .pokecord import Pokecord
async def setup(bot):
cog = Pokecord(bot)
await cog.initalize()
await bot.add_cog(cog)

40
pokecord/abc.py Normal file
View file

@ -0,0 +1,40 @@
from abc import ABC, abstractmethod
from redbot.core import Config, commands
from redbot.core.bot import Red
class MixinMeta(ABC):
"""Base class for well behaved type hint detection with composite class.
Basically, to keep developers sane when not all attributes are defined in each mixin.
"""
def __init__(self, *_args):
self.config: Config
self.bot: Red
self.datapath: str
self.spawnedpokemon: dict
self.maybe_spawn: dict
self.guildcache: dict
@abstractmethod
async def is_global(self):
raise NotImplementedError
@abstractmethod
async def user_is_global(self):
raise NotImplementedError
@abstractmethod
def pokemon_choose(self):
raise NotImplementedError
@abstractmethod
def get_name(self):
raise NotImplementedError
@commands.group(name="poke")
async def poke(self, ctx: commands.Context):
"""
Pokecord commands
"""

49
pokecord/converters.py Normal file
View file

@ -0,0 +1,49 @@
import argparse
from redbot.core.commands import BadArgument, Converter
class NoExitParser(argparse.ArgumentParser):
def error(self, message):
raise BadArgument()
class Args(Converter):
async def convert(self, ctx, argument):
argument = argument.replace("", "--")
parser = NoExitParser(description="Pokecord Search", add_help=False)
pokemon = parser.add_mutually_exclusive_group()
pokemon.add_argument("--name", "--n", nargs="*", dest="names", default=[])
pokemon.add_argument("--level", "--l", nargs="*", dest="level", type=int, default=0)
pokemon.add_argument("--id", "--i", nargs="*", dest="id", type=int, default=0)
pokemon.add_argument("--variant", "--v", nargs="*", dest="variant", default=[])
pokemon.add_argument("--gender", "--g", nargs="*", dest="gender", default=[])
pokemon.add_argument("--iv", nargs="*", dest="iv", type=int, default=0)
pokemon.add_argument("--type", "--t", nargs="*", dest="type", default=[])
try:
vals = vars(parser.parse_args(argument.split(" ")))
except Exception as error:
raise BadArgument() from error
if not any(
[
vals["names"],
vals["level"],
vals["id"],
vals["variant"],
vals["gender"],
vals["iv"],
vals["type"],
]
):
raise BadArgument(
"You must provide one of `--name`, `--level`, `--id`, `--variant`, `--iv`, `--gender` or `--type``"
)
vals["names"] = " ".join(vals["names"])
vals["variant"] = " ".join(vals["variant"])
vals["gender"] = " ".join(vals["gender"])
vals["type"] = " ".join(vals["type"])
return vals

420
pokecord/data/alolan.json Normal file
View file

@ -0,0 +1,420 @@
[
{
"id": 19,
"name": {
"english": "Rattata",
"japanese": "\u30b3\u30e9\u30c3\u30bf",
"chinese": "\u5c0f\u62c9\u9054",
"french": "Rattata"
},
"type": [
"Normal"
],
"stats": {
"HP": 30,
"Attack": 56,
"Defence": 35,
"Sp. Atk": 25,
"Sp. Def": 35,
"Speed": 72
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Rattata"
},
{
"id": 20,
"name": {
"english": "Raticate",
"japanese": "\u30e9\u30c3\u30bf",
"chinese": "\u62c9\u9054",
"french": "Rattatac"
},
"type": [
"Normal"
],
"stats": {
"HP": 55,
"Attack": 81,
"Defence": 60,
"Sp. Atk": 50,
"Sp. Def": 70,
"Speed": 97
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Raticate"
},
{
"id": 26,
"name": {
"english": "Raichu",
"japanese": "\u30e9\u30a4\u30c1\u30e5\u30a6",
"chinese": "\u96f7\u4e18",
"french": "Raichu"
},
"type": [
"Electric"
],
"stats": {
"HP": 60,
"Attack": 90,
"Defence": 55,
"Sp. Atk": 90,
"Sp. Def": 80,
"Speed": 110
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Raichu"
},
{
"id": 27,
"name": {
"english": "Sandshrew",
"japanese": "\u30b5\u30f3\u30c9",
"chinese": "\u7a7f\u5c71\u9f20",
"french": "Sabelette"
},
"type": [
"Ground"
],
"stats": {
"HP": 50,
"Attack": 75,
"Defence": 85,
"Sp. Atk": 20,
"Sp. Def": 30,
"Speed": 40
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Sandshrew"
},
{
"id": 28,
"name": {
"english": "Sandslash",
"japanese": "\u30b5\u30f3\u30c9\u30d1\u30f3",
"chinese": "\u7a7f\u5c71\u738b",
"french": "Sablaireau"
},
"type": [
"Ground"
],
"stats": {
"HP": 75,
"Attack": 100,
"Defence": 110,
"Sp. Atk": 45,
"Sp. Def": 55,
"Speed": 65
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Sandslash"
},
{
"id": 37,
"name": {
"english": "Vulpix",
"japanese": "\u30ed\u30b3\u30f3",
"chinese": "\u516d\u5c3e",
"french": "Goupix"
},
"type": [
"Fire"
],
"stats": {
"HP": 38,
"Attack": 41,
"Defence": 40,
"Sp. Atk": 50,
"Sp. Def": 65,
"Speed": 65
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Vulpix"
},
{
"id": 38,
"name": {
"english": "Ninetales",
"japanese": "\u30ad\u30e5\u30a6\u30b3\u30f3",
"chinese": "\u4e5d\u5c3e",
"french": "Feunard"
},
"type": [
"Fire"
],
"stats": {
"HP": 73,
"Attack": 76,
"Defence": 75,
"Sp. Atk": 81,
"Sp. Def": 100,
"Speed": 100
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Ninetales"
},
{
"id": 50,
"name": {
"english": "Diglett",
"japanese": "\u30c7\u30a3\u30b0\u30c0",
"chinese": "\u5730\u9f20",
"french": "Taupiqueur"
},
"type": [
"Ground"
],
"stats": {
"HP": 10,
"Attack": 55,
"Defence": 25,
"Sp. Atk": 35,
"Sp. Def": 45,
"Speed": 95
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Diglett"
},
{
"id": 51,
"name": {
"english": "Dugtrio",
"japanese": "\u30c0\u30b0\u30c8\u30ea\u30aa",
"chinese": "\u4e09\u5730\u9f20",
"french": "Triopikeur"
},
"type": [
"Ground"
],
"stats": {
"HP": 35,
"Attack": 100,
"Defence": 50,
"Sp. Atk": 50,
"Sp. Def": 70,
"Speed": 120
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Dugtrio"
},
{
"id": 52,
"name": {
"english": "Meowth",
"japanese": "\u30cb\u30e3\u30fc\u30b9",
"chinese": "\u55b5\u55b5",
"french": "Miaouss"
},
"type": [
"Normal"
],
"stats": {
"HP": 40,
"Attack": 45,
"Defence": 35,
"Sp. Atk": 40,
"Sp. Def": 40,
"Speed": 90
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Meowth"
},
{
"id": 53,
"name": {
"english": "Persian",
"japanese": "\u30da\u30eb\u30b7\u30a2\u30f3",
"chinese": "\u8c93\u8001\u5927",
"french": "Persian"
},
"type": [
"Normal"
],
"stats": {
"HP": 65,
"Attack": 70,
"Defence": 60,
"Sp. Atk": 65,
"Sp. Def": 65,
"Speed": 115
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Persian"
},
{
"id": 74,
"name": {
"english": "Geodude",
"japanese": "\u30a4\u30b7\u30c4\u30d6\u30c6",
"chinese": "\u5c0f\u62f3\u77f3",
"french": "Racaillou"
},
"type": [
"Rock",
"Ground"
],
"stats": {
"HP": 40,
"Attack": 80,
"Defence": 100,
"Sp. Atk": 30,
"Sp. Def": 30,
"Speed": 20
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Geodude"
},
{
"id": 75,
"name": {
"english": "Graveler",
"japanese": "\u30b4\u30ed\u30fc\u30f3",
"chinese": "\u9686\u9686\u77f3",
"french": "Gravalanch"
},
"type": [
"Rock",
"Ground"
],
"stats": {
"HP": 55,
"Attack": 95,
"Defence": 115,
"Sp. Atk": 45,
"Sp. Def": 45,
"Speed": 35
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Graveler"
},
{
"id": 76,
"name": {
"english": "Golem",
"japanese": "\u30b4\u30ed\u30fc\u30cb\u30e3",
"chinese": "\u9686\u9686\u5ca9",
"french": "Grolem"
},
"type": [
"Rock",
"Ground"
],
"stats": {
"HP": 80,
"Attack": 120,
"Defence": 130,
"Sp. Atk": 55,
"Sp. Def": 65,
"Speed": 45
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Golem"
},
{
"id": 88,
"name": {
"english": "Grimer",
"japanese": "\u30d9\u30c8\u30d9\u30bf\u30fc",
"chinese": "\u81ed\u6ce5",
"french": "Tadmorv"
},
"type": [
"Poison"
],
"stats": {
"HP": 80,
"Attack": 80,
"Defence": 50,
"Sp. Atk": 40,
"Sp. Def": 50,
"Speed": 25
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Grimer"
},
{
"id": 89,
"name": {
"english": "Muk",
"japanese": "\u30d9\u30c8\u30d9\u30c8\u30f3",
"chinese": "\u81ed\u81ed\u6ce5",
"french": "Grotadmorv"
},
"type": [
"Poison"
],
"stats": {
"HP": 105,
"Attack": 105,
"Defence": 75,
"Sp. Atk": 65,
"Sp. Def": 100,
"Speed": 50
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Muk"
},
{
"id": 103,
"name": {
"english": "Exeggutor",
"japanese": "\u30ca\u30c3\u30b7\u30fc",
"chinese": "\u6930\u86cb\u6a39",
"french": "Noadkoko"
},
"type": [
"Grass",
"Psychic"
],
"stats": {
"HP": 95,
"Attack": 95,
"Defence": 85,
"Sp. Atk": 125,
"Sp. Def": 75,
"Speed": 55
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Exeggutor"
},
{
"id": 105,
"name": {
"english": "Marowak",
"japanese": "\u30ac\u30e9\u30ac\u30e9",
"chinese": "\u560e\u5566\u560e\u5566",
"french": "Ossatueur"
},
"type": [
"Ground"
],
"stats": {
"HP": 60,
"Attack": 80,
"Defence": 110,
"Sp. Atk": 50,
"Sp. Def": 80,
"Speed": 45
},
"spawnchance": 0.15,
"variant": "Alolan",
"alias": "Alolan Marowak"
}
]

351
pokecord/data/evolve.json Normal file
View file

@ -0,0 +1,351 @@
{
"Bulbasaur": {"evolution": "Ivysaur", "level": "16"},
"Ivysaur": {"evolution": "Venusaur", "level": "32"},
"Charmander": {"evolution": "Charmeleon", "level": "16"},
"Charmeleon": {"evolution": "Charizard", "level": "36"},
"Squirtle": {"evolution": "Wartortle", "level": "16"},
"Wartortle": {"evolution": "Blastoise", "level": "36"},
"Caterpie": {"evolution": "Metapod", "level": "7"},
"Metapod": {"evolution": "Butterfree", "level": "10"},
"Weedle": {"evolution": "Kakuna", "level": "7"},
"Kakuna": {"evolution": "Beedrill", "level": "10"},
"Pidgey": {"evolution": "Pidgeotto", "level": "18"},
"Pidgeotto": {"evolution": "Pidgeot", "level": "36"},
"Rattata": {"evolution": "Raticate", "level": "20"},
"Alolan Rattata": {"evolution": "Alolan Raticate", "level": "20"},
"Spearow": {"evolution": "Fearow", "level": "20"},
"Ekans": {"evolution": "Arbok", "level": "22"},
"Sandshrew": {"evolution": "Sandslash", "level": "22"},
"Nidoran\u2640": {"evolution": "Nidorina", "level": "16"},
"Nidoran\u2642": {"evolution": "Nidorino", "level": "16"},
"Zubat": {"evolution": "Golbat", "level": "22"},
"Oddish": {"evolution": "Gloom", "level": "21"},
"Paras": {"evolution": "Parasect", "level": "24"},
"Venonat": {"evolution": "Venomoth", "level": "31"},
"Diglett": {"evolution": "Dugtrio", "level": "26"},
"Alolan Diglett": {"evolution": "Alolan Dugtrio", "level": "26"},
"Meowth": {"evolution": "Persian", "level": "28"},
"Galarian Meowth": {"evolution": "Perrserker", "level": "28"},
"Psyduck": {"evolution": "Golduck", "level": "33"},
"Mankey": {"evolution": "Primeape", "level": "28"},
"Poliwag": {"evolution": "Poliwhirl", "level": "25"},
"Abra": {"evolution": "Kadabra", "level": "16"},
"Machop": {"evolution": "Machoke", "level": "28"},
"Bellsprout": {"evolution": "Weepinbell", "level": "21"},
"Tentacool": {"evolution": "Tentacruel", "level": "30"},
"Geodude": {"evolution": "Graveler", "level": "25"},
"Alolan Geodude": {"evolution": "Alolan Graveler", "level": "25"},
"Ponyta": {"evolution": "Rapidash", "level": "40"},
"Galarian Ponyta": {"evolution": "Galarian Rapidash", "level": "40"},
"Slowpoke": {"evolution": "Slowbro", "level": "37"},
"Magnemite": {"evolution": "Magneton", "level": "30"},
"Doduo": {"evolution": "Dodrio", "level": "31"},
"Seel": {"evolution": "Dewgong", "level": "34"},
"Grimer": {"evolution": "Muk", "level": "38"},
"Alolan Grimer": {"evolution": "Alolan Muk", "level": "38"},
"Gastly": {"evolution": "Haunter", "level": "25"},
"Drowzee": {"evolution": "Hypno", "level": "26"},
"Krabby": {"evolution": "Kingler", "level": "28"},
"Voltorb": {"evolution": "Electrode", "level": "30"},
"Cubone": {"evolution": "Alolan Marowak", "level": "28"},
"Tyrogue": {"evolution": "Hitmontop", "level": "20"},
"Koffing": {"evolution": "Galarian Weezing", "level": "35"},
"Rhyhorn": {"evolution": "Rhydon", "level": "42"},
"Horsea": {"evolution": "Seadra", "level": "32"},
"Goldeen": {"evolution": "Seaking", "level": "33"},
"Galarian Mr. Mime": {"evolution": "Mr. Rime", "level": "42"},
"Smoochum": {"evolution": "Jynx", "level": "30"},
"Elekid": {"evolution": "Electabuzz", "level": "30"},
"Magby": {"evolution": "Magmar", "level": "30"},
"Magikarp": {"evolution": "Gyarados", "level": "20"},
"Omanyte": {"evolution": "Omastar", "level": "40"},
"Kabuto": {"evolution": "Kabutops", "level": "40"},
"Dratini": {"evolution": "Dragonair", "level": "30"},
"Dragonair": {"evolution": "Dragonite", "level": "55"},
"Chikorita": {"evolution": "Bayleef", "level": "16"},
"Bayleef": {"evolution": "Meganium", "level": "32"},
"Cyndaquil": {"evolution": "Quilava", "level": "14"},
"Quilava": {"evolution": "Typhlosion", "level": "36"},
"Totodile": {"evolution": "Croconaw", "level": "18"},
"Croconaw": {"evolution": "Feraligatr", "level": "30"},
"Sentret": {"evolution": "Furret", "level": "15"},
"Hoothoot": {"evolution": "Noctowl", "level": "20"},
"Ledyba": {"evolution": "Ledian", "level": "18"},
"Spinarak": {"evolution": "Ariados", "level": "22"},
"Chinchou": {"evolution": "Lanturn", "level": "27"},
"Natu": {"evolution": "Xatu", "level": "25"},
"Mareep": {"evolution": "Flaaffy", "level": "15"},
"Flaaffy": {"evolution": "Ampharos", "level": "30"},
"Marill": {"evolution": "Azumarill", "level": "18"},
"Hoppip": {"evolution": "Skiploom", "level": "18"},
"Skiploom": {"evolution": "Jumpluff", "level": "27"},
"Wooper": {"evolution": "Quagsire", "level": "20"},
"Wynaut": {"evolution": "Wobbuffet", "level": "15"},
"Pineco": {"evolution": "Forretress", "level": "31"},
"Snubbull": {"evolution": "Granbull", "level": "23"},
"Teddiursa": {"evolution": "Ursaring", "level": "30"},
"Slugma": {"evolution": "Magcargo", "level": "38"},
"Swinub": {"evolution": "Piloswine", "level": "33"},
"Remoraid": {"evolution": "Octillery", "level": "25"},
"Houndour": {"evolution": "Houndoom", "level": "24"},
"Phanpy": {"evolution": "Donphan", "level": "25"},
"Larvitar": {"evolution": "Pupitar", "level": "30"},
"Pupitar": {"evolution": "Tyranitar", "level": "55"},
"Treecko": {"evolution": "Grovyle", "level": "16"},
"Grovyle": {"evolution": "Sceptile", "level": "36"},
"Torchic": {"evolution": "Combusken", "level": "16"},
"Combusken": {"evolution": "Blaziken", "level": "36"},
"Mudkip": {"evolution": "Marshtomp", "level": "16"},
"Marshtomp": {"evolution": "Swampert", "level": "36"},
"Poochyena": {"evolution": "Mightyena", "level": "18"},
"Zigzagoon": {"evolution": "Linoone", "level": "20"},
"Galarian Zigzagoon": {"evolution": "Galarian Linoone", "level": "20"},
"Galarian Linoone": {"evolution": "Obstagoon", "level": "35"},
"Wurmple": {"evolution": "Cascoon", "level": "7"},
"Silcoon": {"evolution": "Beautifly", "level": "10"},
"Cascoon": {"evolution": "Dustox", "level": "10"},
"Lotad": {"evolution": "Lombre", "level": "14"},
"Seedot": {"evolution": "Nuzleaf", "level": "14"},
"Taillow": {"evolution": "Swellow", "level": "22"},
"Wingull": {"evolution": "Pelipper", "level": "25"},
"Ralts": {"evolution": "Kirlia", "level": "20"},
"Kirlia": {"evolution": "Gardevoir", "level": "30"},
"Surskit": {"evolution": "Masquerain", "level": "22"},
"Shroomish": {"evolution": "Breloom", "level": "23"},
"Slakoth": {"evolution": "Vigoroth", "level": "18"},
"Vigoroth": {"evolution": "Slaking", "level": "36"},
"Nincada": {"evolution": "Shedinja", "level": "20"},
"Whismur": {"evolution": "Loudred", "level": "20"},
"Loudred": {"evolution": "Exploud", "level": "40"},
"Makuhita": {"evolution": "Hariyama", "level": "24"},
"Aron": {"evolution": "Lairon", "level": "32"},
"Lairon": {"evolution": "Aggron", "level": "42"},
"Meditite": {"evolution": "Medicham", "level": "37"},
"Electrike": {"evolution": "Manectric", "level": "26"},
"Gulpin": {"evolution": "Swalot", "level": "26"},
"Carvanha": {"evolution": "Sharpedo", "level": "30"},
"Wailmer": {"evolution": "Wailord", "level": "40"},
"Numel": {"evolution": "Camerupt", "level": "33"},
"Spoink": {"evolution": "Grumpig", "level": "32"},
"Trapinch": {"evolution": "Vibrava", "level": "35"},
"Vibrava": {"evolution": "Flygon", "level": "45"},
"Cacnea": {"evolution": "Cacturne", "level": "32"},
"Swablu": {"evolution": "Altaria", "level": "35"},
"Barboach": {"evolution": "Whiscash", "level": "30"},
"Corphish": {"evolution": "Crawdaunt", "level": "30"},
"Baltoy": {"evolution": "Claydol", "level": "36"},
"Lileep": {"evolution": "Cradily", "level": "40"},
"Anorith": {"evolution": "Armaldo", "level": "40"},
"Shuppet": {"evolution": "Banette", "level": "37"},
"Duskull": {"evolution": "Dusclops", "level": "37"},
"Snorunt": {"evolution": "Glalie", "level": "42"},
"Spheal": {"evolution": "Sealeo", "level": "32"},
"Sealeo": {"evolution": "Walrein", "level": "44"},
"Bagon": {"evolution": "Shelgon", "level": "30"},
"Shelgon": {"evolution": "Salamence", "level": "50"},
"Beldum": {"evolution": "Metang", "level": "20"},
"Metang": {"evolution": "Metagross", "level": "45"},
"Turtwig": {"evolution": "Grotle", "level": "18"},
"Grotle": {"evolution": "Torterra", "level": "32"},
"Chimchar": {"evolution": "Monferno", "level": "14"},
"Monferno": {"evolution": "Infernape", "level": "36"},
"Piplup": {"evolution": "Prinplup", "level": "16"},
"Prinplup": {"evolution": "Empoleon", "level": "36"},
"Starly": {"evolution": "Staravia", "level": "14"},
"Staravia": {"evolution": "Staraptor", "level": "34"},
"Bidoof": {"evolution": "Bibarel", "level": "15"},
"Kricketot": {"evolution": "Kricketune", "level": "10"},
"Shinx": {"evolution": "Luxio", "level": "15"},
"Luxio": {"evolution": "Luxray", "level": "30"},
"Cranidos": {"evolution": "Rampardos", "level": "30"},
"Shieldon": {"evolution": "Bastiodon", "level": "30"},
"Burmy": {"evolution": "Trash Cloak", "level": "20"},
"Combee": {"evolution": "Vespiquen", "level": "21"},
"Buizel": {"evolution": "Floatzel", "level": "26"},
"Cherubi": {"evolution": "Cherrim", "level": "25"},
"Shellos": {"evolution": "Gastrodon", "level": "30"},
"Drifloon": {"evolution": "Drifblim", "level": "28"},
"Glameow": {"evolution": "Purugly", "level": "38"},
"Stunky": {"evolution": "Skuntank", "level": "34"},
"Bronzor": {"evolution": "Bronzong", "level": "33"},
"Gible": {"evolution": "Gabite", "level": "24"},
"Gabite": {"evolution": "Garchomp", "level": "48"},
"Hippopotas": {"evolution": "Hippowdon", "level": "34"},
"Skorupi": {"evolution": "Drapion", "level": "40"},
"Croagunk": {"evolution": "Toxicroak", "level": "37"},
"Finneon": {"evolution": "Lumineon", "level": "31"},
"Snover": {"evolution": "Abomasnow", "level": "40"},
"Snivy": {"evolution": "Servine", "level": "17"},
"Servine": {"evolution": "Serperior", "level": "36"},
"Tepig": {"evolution": "Pignite", "level": "17"},
"Pignite": {"evolution": "Emboar", "level": "36"},
"Oshawott": {"evolution": "Dewott", "level": "17"},
"Dewott": {"evolution": "Samurott", "level": "36"},
"Patrat": {"evolution": "Watchog", "level": "20"},
"Lillipup": {"evolution": "Herdier", "level": "16"},
"Herdier": {"evolution": "Stoutland", "level": "32"},
"Purrloin": {"evolution": "Liepard", "level": "20"},
"Pidove": {"evolution": "Tranquill", "level": "21"},
"Tranquill": {"evolution": "Unfezant", "level": "32"},
"Blitzle": {"evolution": "Zebstrika", "level": "27"},
"Roggenrola": {"evolution": "Boldore", "level": "25"},
"Drilbur": {"evolution": "Excadrill", "level": "31"},
"Timburr": {"evolution": "Gurdurr", "level": "25"},
"Tympole": {"evolution": "Palpitoad", "level": "25"},
"Palpitoad": {"evolution": "Seismitoad", "level": "36"},
"Sewaddle": {"evolution": "Swadloon", "level": "20"},
"Venipede": {"evolution": "Whirlipede", "level": "22"},
"Whirlipede": {"evolution": "Scolipede", "level": "30"},
"Sandile": {"evolution": "Krokorok", "level": "29"},
"Krokorok": {"evolution": "Krookodile", "level": "40"},
"Darumaka": {"evolution": "Standard Mode", "level": "35"},
"Dwebble": {"evolution": "Crustle", "level": "34"},
"Scraggy": {"evolution": "Scrafty", "level": "39"},
"Yamask": {"evolution": "Cofagrigus", "level": "34"},
"Tirtouga": {"evolution": "Carracosta", "level": "37"},
"Archen": {"evolution": "Archeops", "level": "37"},
"Trubbish": {"evolution": "Garbodor", "level": "36"},
"Zorua": {"evolution": "Zoroark", "level": "30"},
"Gothita": {"evolution": "Gothorita", "level": "32"},
"Gothorita": {"evolution": "Gothitelle", "level": "41"},
"Solosis": {"evolution": "Duosion", "level": "32"},
"Duosion": {"evolution": "Reuniclus", "level": "41"},
"Ducklett": {"evolution": "Swanna", "level": "35"},
"Vanillite": {"evolution": "Vanillish", "level": "35"},
"Vanillish": {"evolution": "Vanilluxe", "level": "47"},
"Deerling": {"evolution": "Sawsbuck", "level": "34"},
"Foongus": {"evolution": "Amoonguss", "level": "39"},
"Frillish": {"evolution": "Jellicent", "level": "40"},
"Joltik": {"evolution": "Galvantula", "level": "36"},
"Ferroseed": {"evolution": "Ferrothorn", "level": "40"},
"Klink": {"evolution": "Klang", "level": "38"},
"Klang": {"evolution": "Klinklang", "level": "49"},
"Tynamo": {"evolution": "Eelektrik", "level": "39"},
"Elgyem": {"evolution": "Beheeyem", "level": "42"},
"Litwick": {"evolution": "Lampent", "level": "41"},
"Axew": {"evolution": "Fraxure", "level": "38"},
"Fraxure": {"evolution": "Haxorus", "level": "48"},
"Cubchoo": {"evolution": "Beartic", "level": "37"},
"Mienfoo": {"evolution": "Mienshao", "level": "50"},
"Golett": {"evolution": "Golurk", "level": "43"},
"Pawniard": {"evolution": "Bisharp", "level": "52"},
"Rufflet": {"evolution": "Braviary", "level": "54"},
"Vullaby": {"evolution": "Mandibuzz", "level": "54"},
"Deino": {"evolution": "Zweilous", "level": "50"},
"Zweilous": {"evolution": "Hydreigon", "level": "64"},
"Larvesta": {"evolution": "Volcarona", "level": "59"},
"Chespin": {"evolution": "Quilladin", "level": "16"},
"Quilladin": {"evolution": "Chesnaught", "level": "36"},
"Fennekin": {"evolution": "Braixen", "level": "16"},
"Braixen": {"evolution": "Delphox", "level": "36"},
"Froakie": {"evolution": "Frogadier", "level": "16"},
"Frogadier": {"evolution": "Greninja", "level": "36"},
"Bunnelby": {"evolution": "Diggersby", "level": "20"},
"Fletchling": {"evolution": "Fletchinder", "level": "17"},
"Fletchinder": {"evolution": "Talonflame", "level": "35"},
"Scatterbug": {"evolution": "Spewpa", "level": "9"},
"Spewpa": {"evolution": "Vivillon", "level": "12"},
"Litleo": {"evolution": "Pyroar", "level": "35"},
"Flab\u00e9b\u00e9": {"evolution": "Floette", "level": "19"},
"Skiddo": {"evolution": "Gogoat", "level": "32"},
"Pancham": {"evolution": "Pangoro", "level": "32"},
"Espurr": {"evolution": "Meowstic", "level": "25"},
"Honedge": {"evolution": "Doublade", "level": "35"},
"Inkay": {"evolution": "Malamar", "level": "30"},
"Binacle": {"evolution": "Barbaracle", "level": "39"},
"Skrelp": {"evolution": "Dragalge", "level": "48"},
"Clauncher": {"evolution": "Clawitzer", "level": "37"},
"Tyrunt": {"evolution": "Tyrantrum", "level": "39"},
"Amaura": {"evolution": "Aurorus", "level": "39"},
"Goomy": {"evolution": "Sliggoo", "level": "40"},
"Sliggoo": {"evolution": "Goodra", "level": "50"},
"Bergmite": {"evolution": "Avalugg", "level": "37"},
"Noibat": {"evolution": "Noivern", "level": "48"},
"Rowlet": {"evolution": "Dartrix", "level": "17"},
"Dartrix": {"evolution": "Decidueye", "level": "34"},
"Litten": {"evolution": "Torracat", "level": "17"},
"Torracat": {"evolution": "Incineroar", "level": "34"},
"Popplio": {"evolution": "Brionne", "level": "17"},
"Brionne": {"evolution": "Primarina", "level": "34"},
"Pikipek": {"evolution": "Trumbeak", "level": "14"},
"Trumbeak": {"evolution": "Toucannon", "level": "28"},
"Yungoos": {"evolution": "Gumshoos", "level": "20"},
"Grubbin": {"evolution": "Charjabug", "level": "20"},
"Cutiefly": {"evolution": "Ribombee", "level": "25"},
"Rockruff": {"evolution": "Midnight Form", "level": "25"},
"Own Tempo Rockruff": {"evolution": "Dusk Form", "level": "25"},
"Mareanie": {"evolution": "Toxapex", "level": "38"},
"Mudbray": {"evolution": "Mudsdale", "level": "30"},
"Dewpider": {"evolution": "Araquanid", "level": "22"},
"Fomantis": {"evolution": "Lurantis", "level": "34"},
"Morelull": {"evolution": "Shiinotic", "level": "24"},
"Salandit": {"evolution": "Salazzle", "level": "33"},
"Stufful": {"evolution": "Bewear", "level": "27"},
"Bounsweet": {"evolution": "Steenee", "level": "18"},
"Wimpod": {"evolution": "Golisopod", "level": "30"},
"Sandygast": {"evolution": "Palossand", "level": "42"},
"Jangmo-o": {"evolution": "Hakamo-o", "level": "35"},
"Hakamo-o": {"evolution": "Kommo-o", "level": "45"},
"Cosmog": {"evolution": "Cosmoem", "level": "43"},
"Cosmoem": {"evolution": "Lunala", "level": "53"},
"Grookey": {"evolution": "Thwackey", "level": "16"},
"Thwackey": {"evolution": "Rillaboom", "level": "35"},
"Scorbunny": {"evolution": "Raboot", "level": "16"},
"Raboot": {"evolution": "Cinderace", "level": "35"},
"Sobble": {"evolution": "Drizzile", "level": "16"},
"Drizzile": {"evolution": "Inteleon", "level": "35"},
"Blipbug": {"evolution": "Dottler", "level": "10"},
"Dottler": {"evolution": "Orbeetle", "level": "30"},
"Rookidee": {"evolution": "Corvisquire", "level": "18"},
"Corvisquire": {"evolution": "Corviknight", "level": "38"},
"Skwovet": {"evolution": "Greedent", "level": "24"},
"Nickit": {"evolution": "Thievul", "level": "18"},
"Wooloo": {"evolution": "Dubwool", "level": "24"},
"Chewtle": {"evolution": "Drednaw", "level": "22"},
"Yamper": {"evolution": "Boltund", "level": "25"},
"Gossifleur": {"evolution": "Eldegoss", "level": "20"},
"Sizzlipede": {"evolution": "Centiskorch", "level": "28"},
"Rolycoly": {"evolution": "Carkol", "level": "18"},
"Carkol": {"evolution": "Coalossal", "level": "34"},
"Arrokuda": {"evolution": "Barraskewda", "level": "26"},
"Galarian Corsola": {"evolution": "Cursola", "level": "38"},
"Impidimp": {"evolution": "Morgrem", "level": "32"},
"Morgrem": {"evolution": "Grimmsnarl", "level": "42"},
"Hatenna": {"evolution": "Hattrem", "level": "32"},
"Hattrem": {"evolution": "Hatterene", "level": "42"},
"Cufant": {"evolution": "Copperajah", "level": "34"},
"Toxel": {"evolution": "Amped Form", "level": "30"},
"Silicobra": {"evolution": "Sandaconda", "level": "36"},
"Dreepy": {"evolution": "Drakloak", "level": "50"},
"Drakloak": {"evolution": "Dragapult", "level": "60"},
"Sprigatito": {"evolution": "Floragato", "level": "16"},
"Floragato": {"evolution": "Meowscarada", "level": "36"},
"Fuecoco": {"evolution": "Crocalor", "level": "16"},
"Crocalor": {"evolution": "Skeledirge", "level": "36"},
"Quaxly": {"evolution": "Quaxwell", "level": "16"},
"Quaxwell": {"evolution": "Quaquaval", "level": "36"},
"Lechonk": {"evolution": "Oinkologne", "level": "16"},
"Tarountula": {"evolution": "Spidops", "level": "15"},
"Nymble": {"evolution": "Lokix", "level": "24"},
"Pawmi": {"evolution": "Pawmo", "level": "18"},
"Tandemaus": {"evolution": "Maushold", "level": "25"},
"Fidough": {"evolution": "Dachsbun", "level": "26"},
"Smoliv": {"evolution": "Dolliv", "level": "25"},
"Dolliv": {"evolution": "Arboliva", "level": "35"},
"Nacli": {"evolution": "Naclstack", "level": "24"},
"Naclstack": {"evolution": "Garganacl", "level": "38"},
"Wattrel": {"evolution": "Kilowattrel", "level": "25"},
"Maschiff": {"evolution": "Machamp", "level": "30"},
"Shroodle": {"evolution": "Grafaiai", "level": "28"},
"Toedscool": {"evolution": "Toedscruel", "level": "30"},
"Flittle": {"evolution": "Espathra", "level": "35"},
"Tinkatink": {"evolution": "Tinkatuff", "level": "24"},
"Tinkatuff": {"evolution": "Tinkaton", "level": "38"},
"Wiglett": {"evolution": "Wugtrio", "level": "26"},
"Finizen": {"evolution": "Palafin", "level": "28"},
"Varoom": {"evolution": "Revavroom", "level": "40"},
"Glimmet": {"evolution": "Glimmet", "level": "35"},
"Greavard": {"evolution": "Houndstone", "level": "30"},
"Frigibax": {"evolution": "Arctibax", "level": "35"},
"Arctibax": {"evolution": "Baxcalibur", "level": "54"}
}

590
pokecord/data/galarian.json Normal file
View file

@ -0,0 +1,590 @@
[
{
"id": 52,
"name": {
"english": "Meowth",
"japanese": "\u30cb\u30e3\u30fc\u30b9",
"chinese": "\u55b5\u55b5",
"french": "Miaouss"
},
"type": [
"Normal"
],
"stats": {
"HP": 40,
"Attack": 45,
"Defence": 35,
"Sp. Atk": 40,
"Sp. Def": 40,
"Speed": 90
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Meowth"
},
{
"id": 77,
"name": {
"english": "Ponyta",
"japanese": "\u30dd\u30cb\u30fc\u30bf",
"chinese": "\u5c0f\u706b\u99ac",
"french": "Ponyta"
},
"type": [
"Fire"
],
"stats": {
"HP": 50,
"Attack": 85,
"Defence": 55,
"Sp. Atk": 65,
"Sp. Def": 65,
"Speed": 90
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Ponyta"
},
{
"id": 78,
"name": {
"english": "Rapidash",
"japanese": "\u30ae\u30e3\u30ed\u30c3\u30d7",
"chinese": "\u70c8\u7130\u99ac",
"french": "Galopa"
},
"type": [
"Fire"
],
"stats": {
"HP": 65,
"Attack": 100,
"Defence": 70,
"Sp. Atk": 80,
"Sp. Def": 80,
"Speed": 105
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Rapidash"
},
{
"id": 79,
"name": {
"english": "Slowpoke",
"japanese": "\u30e4\u30c9\u30f3",
"chinese": "\u5446\u5446\u7378",
"french": "Ramoloss"
},
"type": [
"Water",
"Psychic"
],
"stats": {
"HP": 90,
"Attack": 65,
"Defence": 65,
"Sp. Atk": 40,
"Sp. Def": 40,
"Speed": 15
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Slowpoke"
},
{
"id": 80,
"name": {
"english": "Slowbro",
"japanese": "\u30e4\u30c9\u30e9\u30f3",
"chinese": "\u5446\u6bbc\u7378",
"french": "Flagadoss"
},
"type": [
"Water",
"Psychic"
],
"stats": {
"HP": 95,
"Attack": 75,
"Defence": 110,
"Sp. Atk": 100,
"Sp. Def": 80,
"Speed": 30
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Slowbro"
},
{
"id": 83,
"name": {
"english": "Farfetch'd",
"japanese": "\u30ab\u30e2\u30cd\u30ae",
"chinese": "\u5927\u8525\u9d28",
"french": "Canarticho"
},
"type": [
"Normal",
"Flying"
],
"stats": {
"HP": 52,
"Attack": 90,
"Defence": 55,
"Sp. Atk": 58,
"Sp. Def": 62,
"Speed": 60
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Farfetch'd"
},
{
"id": 110,
"name": {
"english": "Weezing",
"japanese": "\u30de\u30bf\u30c9\u30ac\u30b9",
"chinese": "\u96d9\u5f48\u74e6\u65af",
"french": "Smogogo"
},
"type": [
"Poison"
],
"stats": {
"HP": 65,
"Attack": 90,
"Defence": 120,
"Sp. Atk": 85,
"Sp. Def": 70,
"Speed": 60
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Weezing"
},
{
"id": 122,
"name": {
"english": "Mr. Mime",
"japanese": "\u30d0\u30ea\u30e4\u30fc\u30c9",
"chinese": "\u9b54\u7246\u4eba\u5076",
"french": "M. Mime"
},
"type": [
"Psychic",
"Fairy"
],
"stats": {
"HP": 40,
"Attack": 45,
"Defence": 65,
"Sp. Atk": 100,
"Sp. Def": 120,
"Speed": 90
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Mr. Mime"
},
{
"id": 144,
"name": {
"english": "Articuno",
"japanese": "\u30d5\u30ea\u30fc\u30b6\u30fc",
"chinese": "\u6025\u51cd\u9ce5",
"french": "Artikodin"
},
"type": [
"Psychic",
"Flying"
],
"stats": {
"HP": 90,
"Attack": 85,
"Defence": 85,
"Sp. Atk": 125,
"Sp. Def": 100,
"Speed": 95
},
"spawnchance": 0.00015,
"variant": "Galarian",
"alias": "Galarian Articuno"
},
{
"id": 145,
"name": {
"english": "Zapdos",
"japanese": "\u30b5\u30f3\u30c0\u30fc",
"chinese": "\u9583\u96fb\u9ce5",
"french": "\u00c9lecthor"
},
"type": [
"Fighting",
"Flying"
],
"stats": {
"HP": 90,
"Attack": 125,
"Defence": 90,
"Sp. Atk": 85,
"Sp. Def": 90,
"Speed": 100
},
"spawnchance": 0.00015,
"variant": "Galarian",
"alias": "Galarian Zapdos"
},
{
"id": 146,
"name": {
"english": "Moltres",
"japanese": "\u30d5\u30a1\u30a4\u30e4\u30fc",
"chinese": "\u706b\u7130\u9ce5",
"french": "Sulfura"
},
"type": [
"Dark",
"Flying"
],
"stats": {
"HP": 90,
"Attack": 85,
"Defence": 90,
"Sp. Atk": 100,
"Sp. Def": 125,
"Speed": 90
},
"spawnchance": 0.00015,
"variant": "Galarian",
"alias": "Galarian Moltres"
},
{
"id": 199,
"name": {
"english": "Slowking",
"japanese": "\u30e4\u30c9\u30ad\u30f3\u30b0",
"chinese": "\u5446\u5446\u738b",
"french": "Roigada"
},
"type": [
"Water",
"Psychic"
],
"stats": {
"HP": 95,
"Attack": 75,
"Defence": 80,
"Sp. Atk": 100,
"Sp. Def": 110,
"Speed": 30
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Slowking"
},
{
"id": 222,
"name": {
"english": "Corsola",
"japanese": "\u30b5\u30cb\u30fc\u30b4",
"chinese": "\u592a\u967d\u73ca\u745a",
"french": "Corayon"
},
"type": [
"Water",
"Rock"
],
"stats": {
"HP": 65,
"Attack": 55,
"Defence": 95,
"Sp. Atk": 65,
"Sp. Def": 95,
"Speed": 35
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Corsola"
},
{
"id": 263,
"name": {
"english": "Zigzagoon",
"japanese": "\u30b8\u30b0\u30b6\u30b0\u30de",
"chinese": "\u86c7\u7d0b\u718a",
"french": "Zigzaton"
},
"type": [
"Normal"
],
"stats": {
"HP": 38,
"Attack": 30,
"Defence": 41,
"Sp. Atk": 30,
"Sp. Def": 41,
"Speed": 60
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Zigzagoon"
},
{
"id": 264,
"name": {
"english": "Linoone",
"japanese": "\u30de\u30c3\u30b9\u30b0\u30de",
"chinese": "\u76f4\u885d\u718a",
"french": "Lin\u00e9on"
},
"type": [
"Normal"
],
"stats": {
"HP": 78,
"Attack": 70,
"Defence": 61,
"Sp. Atk": 50,
"Sp. Def": 61,
"Speed": 100
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Linoone"
},
{
"id": 554,
"name": {
"english": "Darumaka",
"japanese": "\u30c0\u30eb\u30de\u30c3\u30ab",
"chinese": "\u706b\u7d05\u4e0d\u5012\u7fc1",
"french": "Darumarond"
},
"type": [
"Fire"
],
"stats": {
"HP": 70,
"Attack": 90,
"Defence": 45,
"Sp. Atk": 15,
"Sp. Def": 45,
"Speed": 50
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Darumaka"
},
{
"id": 555,
"name": {
"english": "Darmanitan",
"japanese": "\u30d2\u30d2\u30c0\u30eb\u30de",
"chinese": "\u9054\u6469\u72d2\u72d2",
"french": "Darumacho"
},
"type": [
"Fire"
],
"stats": {
"HP": 105,
"Attack": 140,
"Defence": 55,
"Sp. Atk": 30,
"Sp. Def": 55,
"Speed": 95
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Darmanitan"
},
{
"id": 562,
"name": {
"english": "Yamask",
"japanese": "\u30c7\u30b9\u30de\u30b9",
"chinese": "\u54ed\u54ed\u9762\u5177",
"french": "Tutafeh"
},
"type": [
"Ghost"
],
"stats": {
"HP": 38,
"Attack": 30,
"Defence": 85,
"Sp. Atk": 55,
"Sp. Def": 65,
"Speed": 30
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Yamask"
},
{
"id": 618,
"name": {
"english": "Stunfisk",
"japanese": "\u30de\u30c3\u30ae\u30e7",
"chinese": "\u6ce5\u5df4\u9b5a",
"french": "Limonde"
},
"type": [
"Ground",
"Electric"
],
"stats": {
"HP": 109,
"Attack": 66,
"Defence": 84,
"Sp. Atk": 81,
"Sp. Def": 99,
"Speed": 32
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Stunfisk"
},
{
"id": 862,
"name": {
"english": "Obstagoon",
"japanese": "\u30bf\u30c1\u30d5\u30b5\u30b0\u30de",
"chinese": "\u5835\u6514\u718a",
"french": "Ixon"
},
"type": [
"Dark",
"Normal"
],
"stats": {
"HP": 93,
"Attack": 90,
"Defence": 101,
"Sp. Atk": 60,
"Sp. Def": 81,
"Speed": 95
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Obstagoon"
},
{
"id": 863,
"name": {
"english": "Perrserker",
"japanese": "\u30cb\u30e3\u30a4\u30ad\u30f3\u30b0",
"chinese": "\u55b5\u982d\u76ee",
"french": "Berserkatt"
},
"type": [
"Steel"
],
"stats": {
"HP": 70,
"Attack": 110,
"Defence": 100,
"Sp. Atk": 50,
"Sp. Def": 60,
"Speed": 50
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Perrserker"
},
{
"id": 864,
"name": {
"english": "Cursola",
"japanese": "\u30b5\u30cb\u30b4\u30fc\u30f3",
"chinese": "\u9b54\u9748\u73ca\u745a",
"french": "Coray\u00f4me"
},
"type": [
"Ghost"
],
"stats": {
"HP": 60,
"Attack": 95,
"Defence": 50,
"Sp. Atk": 145,
"Sp. Def": 130,
"Speed": 30
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Cursola"
},
{
"id": 865,
"name": {
"english": "Sirfetch'd",
"japanese": "\u30cd\u30ae\u30ac\u30ca\u30a4\u30c8",
"chinese": "\u8525\u904a\u5175",
"french": "Palarticho"
},
"type": [
"Fighting"
],
"stats": {
"HP": 62,
"Attack": 135,
"Defence": 95,
"Sp. Atk": 68,
"Sp. Def": 82,
"Speed": 65
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Sirfetch'd"
},
{
"id": 866,
"name": {
"english": "Mr. Rime",
"japanese": "\u30d0\u30ea\u30b3\u30aa\u30eb",
"chinese": "\u8e0f\u51b0\u4eba\u5076",
"french": "M. Glaquette"
},
"type": [
"Ice",
"Psychic"
],
"stats": {
"HP": 80,
"Attack": 85,
"Defence": 75,
"Sp. Atk": 110,
"Sp. Def": 100,
"Speed": 70
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Mr. Rime"
},
{
"id": 867,
"name": {
"english": "Runerigus",
"japanese": "\u30c7\u30b9\u30d0\u30fc\u30f3",
"chinese": "\u6b7b\u795e\u677f",
"french": "Tut\u00e9t\u00e9kri"
},
"type": [
"Ground",
"Ghost"
],
"stats": {
"HP": 58,
"Attack": 95,
"Defence": 145,
"Sp. Atk": 50,
"Sp. Def": 105,
"Speed": 30
},
"spawnchance": 0.15,
"variant": "Galarian",
"alias": "Galarian Runerigus"
}
]

809
pokecord/data/genders.json Normal file
View file

@ -0,0 +1,809 @@
{
"Abomasnow": 4,
"Abra": 2,
"Absol": 4,
"Accelgor": 4,
"Aegislash": 4,
"Aerodactyl": 1,
"Aggron": 4,
"Aipom": 4,
"Alakazam": 2,
"Alomomola": 4,
"Altaria": 4,
"Amaura": 1,
"Ambipom": 4,
"Amoonguss": 4,
"Ampharos": 4,
"Anorith": 1,
"Araquanid": 4,
"Arbok": 4,
"Arcanine": 2,
"Arceus": -1,
"Archen": 1,
"Archeops": 1,
"Ariados": 4,
"Armaldo": 1,
"Aromatisse": 4,
"Aron": 4,
"Articuno": -1,
"Audino": 4,
"Aurorus": 1,
"Avalugg": 4,
"Axew": 4,
"Azelf": -1,
"Azumarill": 4,
"Azurill": 6,
"Bagon": 4,
"Baltoy": -1,
"Banette": 4,
"Barbaracle": 4,
"Barboach": 4,
"Basculin": 4,
"Bastiodon": 1,
"Bayleef": 1,
"Beartic": 4,
"Beautifly": 4,
"Beedrill": 4,
"Beheeyem": 4,
"Beldum": -1,
"Bellossom": 4,
"Bellsprout": 4,
"Bergmite": 4,
"Bewear": 4,
"Bibarel": 4,
"Bidoof": 4,
"Binacle": 4,
"Bisharp": 4,
"Blacephalon": -1,
"Blastoise": 1,
"Blaziken": 1,
"Blissey": 8,
"Blitzle": 4,
"Boldore": 4,
"Bonsly": 4,
"Bouffalant": 4,
"Bounsweet": 8,
"Braixen": 1,
"Braviary": 0,
"Breloom": 4,
"Brionne": 1,
"Bronzong": -1,
"Bronzor": -1,
"Bruxish": 4,
"Budew": 4,
"Buizel": 4,
"Bulbasaur": 1,
"Buneary": 4,
"Bunnelby": 4,
"Burmy": 4,
"Butterfree": 4,
"Buzzwole": -1,
"Cacnea": 4,
"Cacturne": 4,
"Camerupt": 4,
"Carbink": -1,
"Carnivine": 4,
"Carracosta": 1,
"Carvanha": 4,
"Cascoon": 4,
"Castform": 4,
"Caterpie": 4,
"Celebi": -1,
"Celesteela": -1,
"Chandelure": 4,
"Chansey": 8,
"Charizard": 1,
"Charjabug": 4,
"Charmander": 1,
"Charmeleon": 1,
"Chatot": 4,
"Cherrim": 4,
"Cherubi": 4,
"Chesnaught": 1,
"Chespin": 1,
"Chikorita": 1,
"Chimchar": 1,
"Chimecho": 4,
"Chinchou": 4,
"Chingling": 4,
"Cinccino": 6,
"Clamperl": 4,
"Clauncher": 4,
"Clawitzer": 4,
"Claydol": -1,
"Clefable": 6,
"Clefairy": 6,
"Cleffa": 6,
"Cloyster": 4,
"Cobalion": -1,
"Cofagrigus": 4,
"Combee": 1,
"Combusken": 1,
"Comfey": 6,
"Conkeldurr": 2,
"Corphish": 4,
"Corsola": 6,
"Cosmoem": -1,
"Cosmog": -1,
"Cottonee": 4,
"Crabominable": 4,
"Crabrawler": 4,
"Cradily": 1,
"Cranidos": 1,
"Crawdaunt": 4,
"Cresselia": 8,
"Croagunk": 4,
"Crobat": 4,
"Croconaw": 1,
"Crustle": 4,
"Cryogonal": -1,
"Cubchoo": 4,
"Cubone": 4,
"Cutiefly": 4,
"Cyndaquil": 1,
"Darkrai": -1,
"Darmanitan": 4,
"Dartrix": 1,
"Darumaka": 4,
"Decidueye": 1,
"Dedenne": 4,
"Deerling": 4,
"Deino": 4,
"Delcatty": 6,
"Delibird": 4,
"Delphox": 1,
"Deoxys": -1,
"Dewgong": 4,
"Dewott": 1,
"Dewpider": 4,
"Dhelmise": -1,
"Dialga": -1,
"Diancie": -1,
"Diggersby": 4,
"Diglett": 4,
"Ditto": -1,
"Dodrio": 4,
"Doduo": 4,
"Donphan": 4,
"Doublade": 4,
"Dragalge": 4,
"Dragonair": 4,
"Dragonite": 4,
"Drampa": 4,
"Drapion": 4,
"Dratini": 4,
"Drifblim": 4,
"Drifloon": 4,
"Drilbur": 4,
"Drowzee": 4,
"Druddigon": 4,
"Ducklett": 4,
"Dugtrio": 4,
"Dunsparce": 4,
"Duosion": 4,
"Durant": 4,
"Dusclops": 4,
"Dusknoir": 4,
"Duskull": 4,
"Dustox": 4,
"Dwebble": 4,
"Eelektrik": 4,
"Eelektross": 4,
"Eevee": 1,
"Ekans": 4,
"Electabuzz": 2,
"Electivire": 2,
"Electrike": 4,
"Electrode": -1,
"Elekid": 2,
"Elgyem": 4,
"Emboar": 1,
"Emolga": 4,
"Empoleon": 1,
"Entei": -1,
"Escavalier": 4,
"Espeon": 1,
"Espurr": 4,
"Excadrill": 4,
"Exeggcute": 4,
"Exeggutor": 4,
"Exploud": 4,
"Farfetch\u2019d": 4,
"Fearow": 4,
"Feebas": 4,
"Fennekin": 1,
"Feraligatr": 1,
"Ferroseed": 4,
"Ferrothorn": 4,
"Finneon": 4,
"Flaaffy": 4,
"Flab\u00e9b\u00e9": 8,
"Flareon": 1,
"Fletchinder": 4,
"Fletchling": 4,
"Floatzel": 4,
"Floette": 8,
"Florges": 8,
"Flygon": 4,
"Fomantis": 4,
"Foongus": 4,
"Forretress": 4,
"Fraxure": 4,
"Frillish": 4,
"Froakie": 1,
"Frogadier": 1,
"Froslass": 8,
"Furfrou": 4,
"Furret": 4,
"Gabite": 4,
"Gallade": 0,
"Galvantula": 4,
"Garbodor": 4,
"Garchomp": 4,
"Gardevoir": 4,
"Gastly": 4,
"Gastrodon": 4,
"Genesect": -1,
"Gengar": 4,
"Geodude": 4,
"Gible": 4,
"Gigalith": 4,
"Girafarig": 4,
"Giratina": -1,
"Glaceon": 1,
"Glalie": 4,
"Glameow": 6,
"Gligar": 4,
"Gliscor": 4,
"Gloom": 4,
"Gogoat": 4,
"Golbat": 4,
"Goldeen": 4,
"Golduck": 4,
"Golem": 4,
"Golett": -1,
"Golisopod": 4,
"Golurk": -1,
"Goodra": 4,
"Goomy": 4,
"Gorebyss": 4,
"Gothita": 6,
"Gothitelle": 6,
"Gothorita": 6,
"Gourgeist": 4,
"Granbull": 6,
"Graveler": 4,
"Greninja": 1,
"Grimer": 4,
"Grotle": 1,
"Groudon": -1,
"Grovyle": 1,
"Growlithe": 2,
"Grubbin": 4,
"Grumpig": 4,
"Gulpin": 4,
"Gumshoos": 4,
"Gurdurr": 2,
"Guzzlord": -1,
"Gyarados": 4,
"Hakamo-o": 4,
"Happiny": 8,
"Hariyama": 2,
"Haunter": 4,
"Hawlucha": 4,
"Haxorus": 4,
"Heatmor": 4,
"Heatran": 4,
"Heliolisk": 4,
"Helioptile": 4,
"Heracross": 4,
"Herdier": 4,
"Hippopotas": 4,
"Hippowdon": 4,
"Hitmonchan": 0,
"Hitmonlee": 0,
"Hitmontop": 0,
"Ho-Oh": -1,
"Honchkrow": 4,
"Honedge": 4,
"Hoopa": -1,
"Hoothoot": 4,
"Hoppip": 4,
"Horsea": 4,
"Houndoom": 4,
"Houndour": 4,
"Huntail": 4,
"Hydreigon": 4,
"Hypno": 4,
"Igglybuff": 6,
"Illumise": 8,
"Incineroar": 1,
"Infernape": 1,
"Inkay": 4,
"Ivysaur": 1,
"Jangmo-o": 4,
"Jellicent": 4,
"Jigglypuff": 6,
"Jirachi": -1,
"Jolteon": 1,
"Joltik": 4,
"Jumpluff": 4,
"Jynx": 8,
"Kabuto": 1,
"Kabutops": 1,
"Kadabra": 2,
"Kakuna": 4,
"Kangaskhan": 8,
"Karrablast": 4,
"Kartana": -1,
"Kecleon": 4,
"Keldeo": -1,
"Kingdra": 4,
"Kingler": 4,
"Kirlia": 4,
"Klang": -1,
"Klefki": 4,
"Klink": -1,
"Klinklang": -1,
"Koffing": 4,
"Komala": 4,
"Kommo-o": 4,
"Krabby": 4,
"Kricketot": 4,
"Kricketune": 4,
"Krokorok": 4,
"Krookodile": 4,
"Kyogre": -1,
"Kyurem": -1,
"Lairon": 4,
"Lampent": 4,
"Landorus": 0,
"Lanturn": 4,
"Lapras": 4,
"Larvesta": 4,
"Larvitar": 4,
"Latias": 8,
"Latios": 0,
"Leafeon": 1,
"Leavanny": 4,
"Ledian": 4,
"Ledyba": 4,
"Lickilicky": 4,
"Lickitung": 4,
"Liepard": 4,
"Lileep": 1,
"Lilligant": 8,
"Lillipup": 4,
"Linoone": 4,
"Litleo": 7,
"Litten": 1,
"Litwick": 4,
"Lombre": 4,
"Lopunny": 4,
"Lotad": 4,
"Loudred": 4,
"Lucario": 1,
"Ludicolo": 4,
"Lugia": -1,
"Lumineon": 4,
"Lunala": -1,
"Lunatone": -1,
"Lurantis": 4,
"Luvdisc": 6,
"Luxio": 4,
"Luxray": 4,
"Lycanroc": 4,
"Machamp": 2,
"Machoke": 2,
"Machop": 2,
"Magby": 2,
"Magcargo": 4,
"Magearna": -1,
"Magikarp": 4,
"Magmar": 2,
"Magmortar": 2,
"Magnemite": -1,
"Magneton": -1,
"Magnezone": -1,
"Makuhita": 2,
"Malamar": 4,
"Mamoswine": 4,
"Manaphy": -1,
"Mandibuzz": 8,
"Manectric": 4,
"Mankey": 4,
"Mantine": 4,
"Mantyke": 4,
"Maractus": 4,
"Mareanie": 4,
"Mareep": 4,
"Marill": 4,
"Marowak": 4,
"Marshadow": -1,
"Marshtomp": 1,
"Masquerain": 4,
"Mawile": 4,
"Medicham": 4,
"Meditite": 4,
"Meganium": 1,
"Meloetta": -1,
"Meowstic": 4,
"Meowth": 4,
"Mesprit": -1,
"Metagross": -1,
"Metang": -1,
"Metapod": 4,
"Mew": -1,
"Mewtwo": -1,
"Mienfoo": 4,
"Mienshao": 4,
"Mightyena": 4,
"Milotic": 4,
"Miltank": 8,
"Mime Jr.": 4,
"Mimikyu": 4,
"Minccino": 6,
"Minior": -1,
"Minun": 4,
"Misdreavus": 4,
"Mismagius": 4,
"Moltres": -1,
"Monferno": 1,
"Morelull": 4,
"Mothim": 0,
"Mr. Mime": 4,
"Mudbray": 4,
"Mudkip": 1,
"Mudsdale": 4,
"Muk": 4,
"Munchlax": 1,
"Munna": 4,
"Murkrow": 4,
"Musharna": 4,
"Naganadel": -1,
"Natu": 4,
"Necrozma": -1,
"Nidoking": 0,
"Nidoqueen": 8,
"Nidoran\u2640": 8,
"Nidoran\u2642": 0,
"Nidorina": 8,
"Nidorino": 0,
"Nihilego": -1,
"Nincada": 4,
"Ninetales": 6,
"Ninjask": 4,
"Noctowl": 4,
"Noibat": 4,
"Noivern": 4,
"Nosepass": 4,
"Numel": 4,
"Nuzleaf": 4,
"Octillery": 4,
"Oddish": 4,
"Omanyte": 1,
"Omastar": 1,
"Onix": 4,
"Oranguru": 4,
"Oricorio": 6,
"Oshawott": 1,
"Pachirisu": 4,
"Palkia": -1,
"Palossand": 4,
"Palpitoad": 4,
"Pancham": 4,
"Pangoro": 4,
"Panpour": 1,
"Pansage": 1,
"Pansear": 1,
"Paras": 4,
"Parasect": 4,
"Passimian": 4,
"Patrat": 4,
"Pawniard": 4,
"Pelipper": 4,
"Persian": 4,
"Petilil": 8,
"Phanpy": 4,
"Phantump": 4,
"Pheromosa": -1,
"Phione": -1,
"Pichu": 4,
"Pidgeot": 4,
"Pidgeotto": 4,
"Pidgey": 4,
"Pidove": 4,
"Pignite": 1,
"Pikachu": 4,
"Pikipek": 4,
"Piloswine": 4,
"Pineco": 4,
"Pinsir": 4,
"Piplup": 1,
"Plusle": 4,
"Poipole": -1,
"Politoed": 4,
"Poliwag": 4,
"Poliwhirl": 4,
"Poliwrath": 4,
"Ponyta": 4,
"Poochyena": 4,
"Popplio": 1,
"Porygon": -1,
"Porygon-Z": -1,
"Porygon2": -1,
"Primarina": 1,
"Primeape": 4,
"Prinplup": 1,
"Probopass": 4,
"Psyduck": 4,
"Pumpkaboo": 4,
"Pupitar": 4,
"Purrloin": 4,
"Purugly": 6,
"Pyroar": 7,
"Pyukumuku": 4,
"Quagsire": 4,
"Quilava": 1,
"Quilladin": 1,
"Qwilfish": 4,
"Raichu": 4,
"Raikou": -1,
"Ralts": 4,
"Rampardos": 1,
"Rapidash": 4,
"Raticate": 4,
"Rattata": 4,
"Rayquaza": -1,
"Regice": -1,
"Regigigas": -1,
"Regirock": -1,
"Registeel": -1,
"Relicanth": 1,
"Remoraid": 4,
"Reshiram": -1,
"Reuniclus": 4,
"Rhydon": 4,
"Rhyhorn": 4,
"Rhyperior": 4,
"Ribombee": 4,
"Riolu": 1,
"Rockruff": 4,
"Roggenrola": 4,
"Roselia": 4,
"Roserade": 4,
"Rotom": -1,
"Rowlet": 1,
"Rufflet": 0,
"Sableye": 4,
"Salamence": 4,
"Salandit": 1,
"Salazzle": 8,
"Samurott": 1,
"Sandile": 4,
"Sandshrew": 4,
"Sandslash": 4,
"Sandygast": 4,
"Sawk": 0,
"Sawsbuck": 4,
"Scatterbug": 4,
"Sceptile": 1,
"Scizor": 4,
"Scolipede": 4,
"Scrafty": 4,
"Scraggy": 4,
"Scyther": 4,
"Seadra": 4,
"Seaking": 4,
"Sealeo": 4,
"Seedot": 4,
"Seel": 4,
"Seismitoad": 4,
"Sentret": 4,
"Serperior": 1,
"Servine": 1,
"Seviper": 4,
"Sewaddle": 4,
"Sharpedo": 4,
"Shaymin": -1,
"Shedinja": -1,
"Shelgon": 4,
"Shellder": 4,
"Shellos": 4,
"Shelmet": 4,
"Shieldon": 1,
"Shiftry": 4,
"Shiinotic": 4,
"Shinx": 4,
"Shroomish": 4,
"Shuckle": 4,
"Shuppet": 4,
"Sigilyph": 4,
"Silcoon": 4,
"Silvally": -1,
"Simipour": 1,
"Simisage": 1,
"Simisear": 1,
"Skarmory": 4,
"Skiddo": 4,
"Skiploom": 4,
"Skitty": 6,
"Skorupi": 4,
"Skrelp": 4,
"Skuntank": 4,
"Slaking": 4,
"Slakoth": 4,
"Sliggoo": 4,
"Slowbro": 4,
"Slowking": 4,
"Slowpoke": 4,
"Slugma": 4,
"Slurpuff": 4,
"Smeargle": 4,
"Smoochum": 8,
"Sneasel": 4,
"Snivy": 1,
"Snorlax": 1,
"Snorunt": 4,
"Snover": 4,
"Snubbull": 6,
"Solgaleo": -1,
"Solosis": 4,
"Solrock": -1,
"Spearow": 4,
"Spewpa": 4,
"Spheal": 4,
"Spinarak": 4,
"Spinda": 4,
"Spiritomb": 4,
"Spoink": 4,
"Spritzee": 4,
"Squirtle": 1,
"Stakataka": -1,
"Stantler": 4,
"Staraptor": 4,
"Staravia": 4,
"Starly": 4,
"Starmie": -1,
"Staryu": -1,
"Steelix": 4,
"Steenee": 8,
"Stoutland": 4,
"Stufful": 4,
"Stunfisk": 4,
"Stunky": 4,
"Sudowoodo": 4,
"Suicune": -1,
"Sunflora": 4,
"Sunkern": 4,
"Surskit": 4,
"Swablu": 4,
"Swadloon": 4,
"Swalot": 4,
"Swampert": 1,
"Swanna": 4,
"Swellow": 4,
"Swinub": 4,
"Swirlix": 4,
"Swoobat": 4,
"Sylveon": 1,
"Taillow": 4,
"Talonflame": 4,
"Tangela": 4,
"Tangrowth": 4,
"Tapu Bulu": -1,
"Tapu Fini": -1,
"Tapu Koko": -1,
"Tapu Lele": -1,
"Tauros": 0,
"Teddiursa": 4,
"Tentacool": 4,
"Tentacruel": 4,
"Tepig": 1,
"Terrakion": -1,
"Throh": 0,
"Thundurus": 0,
"Timburr": 2,
"Tirtouga": 1,
"Togedemaru": 4,
"Togekiss": 1,
"Togepi": 1,
"Togetic": 1,
"Torchic": 1,
"Torkoal": 4,
"Tornadus": 0,
"Torracat": 1,
"Torterra": 1,
"Totodile": 1,
"Toucannon": 4,
"Toxapex": 4,
"Toxicroak": 4,
"Tranquill": 4,
"Trapinch": 4,
"Treecko": 1,
"Trevenant": 4,
"Tropius": 4,
"Trubbish": 4,
"Trumbeak": 4,
"Tsareena": 8,
"Turtonator": 4,
"Turtwig": 1,
"Tympole": 4,
"Tynamo": 4,
"Type: Null": -1,
"Typhlosion": 1,
"Tyranitar": 4,
"Tyrantrum": 1,
"Tyrogue": 0,
"Tyrunt": 1,
"Umbreon": 1,
"Unfezant": 4,
"Unown": -1,
"Ursaring": 4,
"Uxie": -1,
"Vanillish": 4,
"Vanillite": 4,
"Vanilluxe": 4,
"Vaporeon": 1,
"Venipede": 4,
"Venomoth": 4,
"Venonat": 4,
"Venusaur": 1,
"Vespiquen": 8,
"Vibrava": 4,
"Victini": -1,
"Victreebel": 4,
"Vigoroth": 4,
"Vikavolt": 4,
"Vileplume": 4,
"Virizion": -1,
"Vivillon": 4,
"Volbeat": 0,
"Volcanion": -1,
"Volcarona": 4,
"Voltorb": -1,
"Vullaby": 8,
"Vulpix": 6,
"Wailmer": 4,
"Wailord": 4,
"Walrein": 4,
"Wartortle": 1,
"Watchog": 4,
"Weavile": 4,
"Weedle": 4,
"Weepinbell": 4,
"Weezing": 4,
"Whimsicott": 4,
"Whirlipede": 4,
"Whiscash": 4,
"Whismur": 4,
"Wigglytuff": 6,
"Wimpod": 4,
"Wingull": 4,
"Wishiwashi": 4,
"Wobbuffet": 4,
"Woobat": 4,
"Wooper": 4,
"Wormadam": 8,
"Wurmple": 4,
"Wynaut": 4,
"Xatu": 4,
"Xerneas": -1,
"Xurkitree": -1,
"Yamask": 4,
"Yanma": 4,
"Yanmega": 4,
"Yungoos": 4,
"Yveltal": -1,
"Zangoose": 4,
"Zapdos": -1,
"Zebstrika": 4,
"Zekrom": -1,
"Zeraora": -1,
"Zigzagoon": 4,
"Zoroark": 1,
"Zorua": 1,
"Zubat": 4,
"Zweilous": 4,
"Zygarde": -1
}

361
pokecord/data/hisuian.json Normal file
View file

@ -0,0 +1,361 @@
[
{
"id": 503,
"name": {
"english": "Samurott",
"japanese": "ダイケンキ",
"chinese": "大剑鬼",
"french": "Clamiral"
},
"type": [
"water",
"Dark"
],
"stats": {
"HP": 90,
"Attack": 108,
"Defence": 80,
"Sp. Atk": 100,
"Sp. Def": 65,
"Speed": 85
},
"spawnchance": 0.34,
"variant": "hisuian",
"alias": "Hisuian Samurott"
},
{
"id": 724,
"name": {
"english": "Decidueye",
"japanese": "\u30b8\u30e5\u30ca\u30a4\u30d1\u30fc",
"chinese": "\u72d9\u5c04\u6a39\u689f",
"french": "Arch\u00e9duc"
},
"type": [
"Grass",
"Fighting"
],
"stats": {
"HP": 88,
"Attack": 112,
"Defence": 80,
"Sp. Atk": 95,
"Sp. Def": 95,
"Speed": 60
},
"spawnchance": 0.34,
"variant": "hisuian",
"alias": "Hisuian Decidueye"
},
{
"id": 157,
"name": {
"english": "Typhlosion",
"japanese": "\u30d0\u30af\u30d5\u30fc\u30f3",
"chinese": "\u706b\u7206\u7378",
"french": "Typhlosion"
},
"type": [
"Fire",
"Ghost"
],
"stats": {
"HP": 73,
"Attack": 84,
"Defence": 78,
"Sp. Atk": 119,
"Sp. Def": 85,
"Speed": 95
},
"spawnchance": 0.34,
"variant": "hisuian",
"alias": "Hisuian Typhlosion"
},
{
"id": 570,
"name": {
"english": "Zorua",
"japanese": "\u30be\u30ed\u30a2",
"chinese": "\u7d22\u7f85\u4e9e",
"french": "Zorua"
},
"type": [
"Ghost",
"Normal"
],
"stats": {
"HP": 35,
"Attack": 60,
"Defence": 40,
"Sp. Atk": 85,
"Sp. Def": 40,
"Speed": 70
},
"spawnchance": 0.34,
"variant": "hisuian",
"alias": "Hisuian Zorua"
},
{
"id": 571,
"name": {
"english": "Zoroark",
"japanese": "\u30be\u30ed\u30a2\u30fc\u30af",
"chinese": "\u7d22\u7f85\u4e9e\u514b",
"french": "Zoroark"
},
"type": [
"Ghost",
"Normal"
],
"stats": {
"HP": 55,
"Attack": 100,
"Defence": 60,
"Sp. Atk": 125,
"Sp. Def": 60,
"Speed": 110
},
"spawnchance": 0.34,
"variant": "hisuian",
"alias": "Hisuian Zoroark"
},
{
"id": 549,
"name": {
"english": "Lilligant",
"japanese": "\u30c9\u30ec\u30c7\u30a3\u30a2",
"chinese": "\u88d9\u5152\u5c0f\u59d0",
"french": "Fragilady"
},
"type": [
"Grass",
"Fighting"
],
"stats": {
"HP": 70,
"Attack": 105,
"Defence": 75,
"Sp. Atk": 50,
"Sp. Def": 75,
"Speed": 105
},
"spawnchance": 0.34,
"variant": "hisuian",
"alias": "Hisuian Lilligant"
},
{
"id": 100,
"name": {
"english": "Voltorb",
"japanese": "\u30d3\u30ea\u30ea\u30c0\u30de",
"chinese": "\u9739\u9742\u96fb\u7403",
"french": "Voltorbe"
},
"type": [
"Electric",
"Grass"
],
"stats": {
"HP": 40,
"Attack": 30,
"Defence": 50,
"Sp. Atk": 55,
"Sp. Def": 55,
"Speed": 100
},
"spawnchance": 0.5875,
"variant": "hisuian",
"alias": "Hisuian Voltorb"
},
{
"id": 101,
"name": {
"english": "Electrode",
"japanese": "\u30de\u30eb\u30de\u30a4\u30f3",
"chinese": "\u9811\u76ae\u96f7\u5f48",
"french": "\u00c9lectrode"
},
"type": [
"Electric"
],
"stats": {
"HP": 60,
"Attack": 50,
"Defence": 70,
"Sp. Atk": 80,
"Sp. Def": 80,
"Speed": 150
},
"spawnchance": 0.5875,
"variant": "hisuian",
"alias": "Hisuian Electrode"
},
{
"id": 713,
"name": {
"english": "Avalugg",
"japanese": "\u30af\u30ec\u30d9\u30fc\u30b9",
"chinese": "\u51b0\u5ca9\u602a",
"french": "S\u00e9racrawl"
},
"type": [
"Ice",
"Rock"
],
"stats": {
"HP": 95,
"Attack": 127,
"Defence": 184,
"Sp. Atk": 34,
"Sp. Def": 36,
"Speed": 38
},
"spawnchance": 0.3575,
"variant": "hisuian",
"alias": "Hisuian Avalugg"
},
{
"id": 628,
"name": {
"english": "Braviary",
"japanese": "\u30a6\u30a9\u30fc\u30b0\u30eb",
"chinese": "\u52c7\u58eb\u96c4\u9df9",
"french": "Gueriaigle"
},
"type": [
"Psychic",
"Flying"
],
"stats": {
"HP": 110,
"Attack": 83,
"Defence": 70,
"Sp. Atk": 112,
"Sp. Def": 70,
"Speed": 65
},
"spawnchance": 0.3625,
"variant": "hisuian",
"alias": "Hisuian Braviary"
},
{
"id": 705,
"name": {
"english": "Sliggoo",
"japanese": "\u30cc\u30e1\u30a4\u30eb",
"chinese": "\u9ecf\u7f8e\u5152",
"french": "Colimucus"
},
"type": [
"Dragon",
"Steel"
],
"stats": {
"HP": 58,
"Attack": 75,
"Defence": 83,
"Sp. Atk": 83,
"Sp. Def": 113,
"Speed": 40
},
"spawnchance": 0.435,
"variant": "hisuian",
"alias": "Hisuian Sliggoo"
},
{
"id": 706,
"name": {
"english": "Goodra",
"japanese": "\u30cc\u30e1\u30eb\u30b4\u30f3",
"chinese": "\u9ecf\u7f8e\u9f8d",
"french": "Muplodocus"
},
"type": [
"Dragon",
"Steel"
],
"stats": {
"HP": 80,
"Attack": 100,
"Defence": 100,
"Sp. Atk": 110,
"Sp. Def": 150,
"Speed": 60
},
"spawnchance": 0.25,
"variant": "hisuian",
"alias": "Hisuian Goodra"
},
{
"id": 215,
"name": {
"english": "Sneasel",
"japanese": "\u30cb\u30e5\u30fc\u30e9",
"chinese": "\u72c3\u62c9",
"french": "Farfuret"
},
"type": [
"Fighting",
"Poison"
],
"stats": {
"HP": 55,
"Attack": 95,
"Defence": 55,
"Sp. Atk": 35,
"Sp. Def": 75,
"Speed": 115
},
"spawnchance": 0.4625,
"variant": "hisuian",
"alias": "Hisuian Sneasel"
},
{
"id": 211,
"name": {
"english": "Qwilfish",
"japanese": "\u30cf\u30ea\u30fc\u30bb\u30f3",
"chinese": "\u5343\u91dd\u9b5a",
"french": "Qwilfish"
},
"type": [
"Dark",
"Poison"
],
"stats": {
"HP": 65,
"Attack": 95,
"Defence": 85,
"Sp. Atk": 55,
"Sp. Def": 55,
"Speed": 85
},
"spawnchance": 0.45,
"variant": "hisuian",
"alias": "Hisuian Qwilfish"
},
{
"id": 58,
"name": {
"english": "Growlithe",
"japanese": "\u30ac\u30fc\u30c7\u30a3",
"chinese": "\u5361\u8482\u72d7",
"french": "Caninos"
},
"type": [
"Fire",
"Rock"
],
"stats": {
"HP": 60,
"Attack": 75,
"Defence": 45,
"Sp. Atk": 65,
"Sp. Def": 50,
"Speed": 55
},
"spawnchance": 0.5625,
"variant": "hisuian",
"alias": "Hisuian Growlithe"
}
]

1515
pokecord/data/legendary.json Normal file

File diff suppressed because it is too large Load diff

1116
pokecord/data/megas.json Normal file

File diff suppressed because it is too large Load diff

452
pokecord/data/mythical.json Normal file
View file

@ -0,0 +1,452 @@
[
{
"id": 151,
"name": {
"english": "Mew",
"japanese": "\u30df\u30e5\u30a6",
"chinese": "\u5922\u5e7b",
"french": "Mew"
},
"type": [
"Psychic"
],
"stats": {
"HP": 100,
"Attack": 100,
"Defence": 100,
"Sp. Atk": 100,
"Sp. Def": 100,
"Speed": 100
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 251,
"name": {
"english": "Celebi",
"japanese": "\u30bb\u30ec\u30d3\u30a3",
"chinese": "\u6642\u62c9\u6bd4",
"french": "Celebi"
},
"type": [
"Psychic",
"Grass"
],
"stats": {
"HP": 100,
"Attack": 100,
"Defence": 100,
"Sp. Atk": 100,
"Sp. Def": 100,
"Speed": 100
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 385,
"name": {
"english": "Jirachi",
"japanese": "\u30b8\u30e9\u30fc\u30c1",
"chinese": "\u57fa\u62c9\u7948",
"french": "Jirachi"
},
"type": [
"Steel",
"Psychic"
],
"stats": {
"HP": 100,
"Attack": 100,
"Defence": 100,
"Sp. Atk": 100,
"Sp. Def": 100,
"Speed": 100
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 386,
"name": {
"english": "Deoxys",
"japanese": "\u30c7\u30aa\u30ad\u30b7\u30b9",
"chinese": "\u4ee3\u6b50\u5947\u5e0c\u65af",
"french": "Deoxys"
},
"type": [
"Psychic"
],
"stats": {
"HP": 50,
"Attack": 150,
"Defence": 50,
"Sp. Atk": 150,
"Sp. Def": 50,
"Speed": 150
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 489,
"name": {
"english": "Phione",
"japanese": "\u30d5\u30a3\u30aa\u30cd",
"chinese": "\u970f\u6b50\u7d0d",
"french": "Phione"
},
"type": [
"Water"
],
"stats": {
"HP": 80,
"Attack": 80,
"Defence": 80,
"Sp. Atk": 80,
"Sp. Def": 80,
"Speed": 80
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 490,
"name": {
"english": "Manaphy",
"japanese": "\u30de\u30ca\u30d5\u30a3",
"chinese": "\u746a\u7d0d\u970f",
"french": "Manaphy"
},
"type": [
"Water"
],
"stats": {
"HP": 100,
"Attack": 100,
"Defence": 100,
"Sp. Atk": 100,
"Sp. Def": 100,
"Speed": 100
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 491,
"name": {
"english": "Darkrai",
"japanese": "\u30c0\u30fc\u30af\u30e9\u30a4",
"chinese": "\u9054\u514b\u840a\u4f0a",
"french": "Darkrai"
},
"type": [
"Dark"
],
"stats": {
"HP": 70,
"Attack": 90,
"Defence": 90,
"Sp. Atk": 135,
"Sp. Def": 90,
"Speed": 125
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 492,
"name": {
"english": "Shaymin",
"japanese": "\u30b7\u30a7\u30a4\u30df",
"chinese": "\u8b1d\u7c73",
"french": "Shaymin"
},
"type": [
"Grass"
],
"stats": {
"HP": 100,
"Attack": 100,
"Defence": 100,
"Sp. Atk": 100,
"Sp. Def": 100,
"Speed": 100
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 493,
"name": {
"english": "Arceus",
"japanese": "\u30a2\u30eb\u30bb\u30a6\u30b9",
"chinese": "\u963f\u723e\u5b99\u65af",
"french": "Arceus"
},
"type": [
"Normal"
],
"stats": {
"HP": 120,
"Attack": 120,
"Defence": 120,
"Sp. Atk": 120,
"Sp. Def": 120,
"Speed": 120
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 494,
"name": {
"english": "Victini",
"japanese": "\u30d3\u30af\u30c6\u30a3\u30cb",
"chinese": "\u6bd4\u514b\u63d0\u5c3c",
"french": "Victini"
},
"type": [
"Psychic",
"Fire"
],
"stats": {
"HP": 100,
"Attack": 100,
"Defence": 100,
"Sp. Atk": 100,
"Sp. Def": 100,
"Speed": 100
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 647,
"name": {
"english": "Keldeo",
"japanese": "\u30b1\u30eb\u30c7\u30a3\u30aa",
"chinese": "\u51f1\u8def\u8fea\u6b50",
"french": "Keldeo"
},
"type": [
"Water",
"Fighting"
],
"stats": {
"HP": 91,
"Attack": 72,
"Defence": 90,
"Sp. Atk": 129,
"Sp. Def": 90,
"Speed": 108
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 648,
"name": {
"english": "Meloetta",
"japanese": "\u30e1\u30ed\u30a8\u30c3\u30bf",
"chinese": "\u7f8e\u6d1b\u8036\u5854",
"french": "Meloetta"
},
"type": [
"Normal",
"Psychic"
],
"stats": {
"HP": 100,
"Attack": 77,
"Defence": 77,
"Sp. Atk": 128,
"Sp. Def": 128,
"Speed": 90
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 649,
"name": {
"english": "Genesect",
"japanese": "\u30b2\u30ce\u30bb\u30af\u30c8",
"chinese": "\u84cb\u8afe\u8cfd\u514b\u7279",
"french": "Genesect"
},
"type": [
"Bug",
"Steel"
],
"stats": {
"HP": 71,
"Attack": 120,
"Defence": 95,
"Sp. Atk": 120,
"Sp. Def": 95,
"Speed": 99
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 719,
"name": {
"english": "Diancie",
"japanese": "\u30c7\u30a3\u30a2\u30f3\u30b7\u30fc",
"chinese": "\u8482\u5b89\u5e0c",
"french": "Diancie"
},
"type": [
"Rock",
"Fairy"
],
"stats": {
"HP": 50,
"Attack": 100,
"Defence": 150,
"Sp. Atk": 100,
"Sp. Def": 150,
"Speed": 50
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 720,
"name": {
"english": "Hoopa",
"japanese": "\u30d5\u30fc\u30d1",
"chinese": "\u80e1\u5e15",
"french": "Hoopa"
},
"type": [
"Psychic",
"Ghost"
],
"stats": {
"HP": 80,
"Attack": 110,
"Defence": 60,
"Sp. Atk": 150,
"Sp. Def": 130,
"Speed": 70
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 801,
"name": {
"english": "Magearna",
"japanese": "\u30de\u30ae\u30a2\u30ca",
"chinese": "\u746a\u6a5f\u96c5\u5a1c",
"french": "Magearna"
},
"type": [
"Steel",
"Fairy"
],
"stats": {
"HP": 80,
"Attack": 95,
"Defence": 115,
"Sp. Atk": 130,
"Sp. Def": 115,
"Speed": 65
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 802,
"name": {
"english": "Marshadow",
"japanese": "\u30de\u30fc\u30b7\u30e3\u30c9\u30fc",
"chinese": "\u746a\u590f\u591a",
"french": "Marshadow"
},
"type": [
"Fighting",
"Ghost"
],
"stats": {
"HP": 90,
"Attack": 125,
"Defence": 80,
"Sp. Atk": 90,
"Sp. Def": 90,
"Speed": 125
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 807,
"name": {
"english": "Zeraora",
"japanese": "\u30bc\u30e9\u30aa\u30e9",
"chinese": "\u6377\u62c9\u5967\u62c9",
"french": "Zeraora"
},
"type": [
"Electric"
],
"stats": {
"HP": 88,
"Attack": 112,
"Defence": 75,
"Sp. Atk": 102,
"Sp. Def": 80,
"Speed": 143
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 808,
"name": {
"english": "Meltan",
"japanese": "\u30e1\u30eb\u30bf\u30f3",
"chinese": "\u7f8e\u9304\u5766",
"french": "Meltan"
},
"type": [
"Steel"
],
"stats": {
"HP": 46,
"Attack": 65,
"Defence": 65,
"Sp. Atk": 55,
"Sp. Def": 35,
"Speed": 34
},
"spawnchance": 0.001,
"variant": "Mythical"
},
{
"id": 809,
"name": {
"english": "Melmetal",
"japanese": "\u30e1\u30eb\u30e1\u30bf\u30eb",
"chinese": "\u7f8e\u9304\u6885\u5854",
"french": "Melmetal"
},
"type": [
"Steel"
],
"stats": {
"HP": 135,
"Attack": 143,
"Defence": 143,
"Sp. Atk": 80,
"Sp. Def": 65,
"Speed": 34
},
"spawnchance": 0.001,
"variant": "Mythical"
}
]

2238
pokecord/data/paldea.json Normal file

File diff suppressed because it is too large Load diff

17714
pokecord/data/pokedex.json Normal file

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Some files were not shown because too many files have changed in this diff Show more