Skip to content

Instantly share code, notes, and snippets.

@freundTech
Last active July 15, 2016 13:50
Show Gist options
  • Save freundTech/720eaf35a30db3244d29e09bb6fd37bf to your computer and use it in GitHub Desktop.
Save freundTech/720eaf35a30db3244d29e09bb6fd37bf to your computer and use it in GitHub Desktop.
German pokedex hangoutsbot
'''
pokemon.py -- a hangoutsbot plugin for retrieving information about pokemon, given a name
This uses the pokeapi.co API to retrieve the information.
Because Pokéapi limits requests to 300 requests per method, we store cached data for each Pokémon for 5 days - this should be sufficient for up to 1500 Pokémon overall. Currently there are approximately 811 Pokémon accessible through the Pokéapi so this should be more than enough.
'''
import hangups, plugins, asyncio, logging, datetime
import urllib.request
import json
import aiohttp, os, io
translations = {
'aalabyss': 'huntail',
'abra': 'abra',
'absol': 'absol',
'admurai': 'samurott',
'aerodactyl': 'aerodactyl',
'aeropteryx': 'archeops',
'akkup': 'charjabug',
'algitt': 'skrelp',
'alpollo': 'haunter',
'altaria': 'altaria',
'amagarga': 'aurorus',
'amarino': 'amaura',
'ambidiffel': 'ambipom',
'amonitas': 'omanyte',
'amoroso': 'omastar',
'ampharos': 'ampharos',
'amphizel': 'frogadier',
'anorith': 'anorith',
'apoquallyp': 'jellicent',
'aquana': 'vaporeon',
'arbok': 'arbok',
'arceus': 'arceus',
'ariados': 'ariados',
'arkani': 'arcanine',
'arktilas': 'avalugg',
'arktip': 'bergmite',
'arktos': 'articuno',
'armaldo': 'armaldo',
'austos': 'cloyster',
'azumarill': 'azumarill',
'azurill': 'azurill',
'baldorfish': 'qwilfish',
'balgoras': 'tyrunt',
'bamelin': 'buizel',
'banette': 'banette',
'barschuft': 'basculin',
'barschwa': 'feebas',
'bauz': 'rowlet',
'bibor': 'beedrill',
'bidifas': 'bibarel',
'bidiza': 'bidoof',
'bisaflor': 'venusaur',
'bisaknosp': 'ivysaur',
'bisasam': 'bulbasaur',
'bisofank': 'bouffalant',
'bissbark': 'stoutland',
'bithora': 'binacle',
'blanas': 'nuzleaf',
'blitza': 'jolteon',
'blubella': 'bellossom',
'bluzuk': 'venonat',
'bojelin': 'floatzel',
'bollterus': 'bastiodon',
'boreos': 'tornadus',
'botogel': 'delibird',
'branawarz': 'seismitoad',
'brigaron': 'chesnaught',
'brockoloss': 'gigalith',
'bronzel': 'bronzor',
'bronzong': 'bronzong',
'brutalanda': 'salamence',
'bummelz': 'slakoth',
'burmadame': 'wormadam',
'burmy': 'burmy',
'caesurio': 'bisharp',
'calamanero': 'malamar',
'camaub': 'numel',
'camerupt': 'camerupt',
'castellith': 'crustle',
'cavalanzas': 'escavalier',
'celebi': 'celebi',
'cerapendra': 'scolipede',
'chaneira': 'chansey',
'charmian': 'glameow',
'chelast': 'turtwig',
'chelcarain': 'grotle',
'chelterrar': 'torterra',
'chevrumm': 'gogoat',
'chillabell': 'cinccino',
'clavion': 'klefki',
'coiffwaff': 'furfrou',
'corasonn': 'corsola',
'cresselia': 'cresselia',
'damhirplex': 'stantler',
'darkrai': 'darkrai',
'dartignis': 'fletchinder',
'dartiri': 'fletchling',
'dedenne': 'dedenne',
'demeteros': 'landorus',
'deoxys': 'deoxys',
'deponitox': 'garbodor',
'despotar': 'tyranitar',
'dialga': 'dialga',
'diancie': 'diancie',
'digda': 'diglett',
'digdri': 'dugtrio',
'ditto': 'ditto',
'dodri': 'dodrio',
'dodu': 'doduo',
'donarion': 'vikavolt',
'donphan': 'donphan',
'dragonir': 'dragonair',
'dragoran': 'dragonite',
'draschel': 'shelgon',
'dratini': 'dratini',
'dressella': 'lilligant',
'driftlon': 'drifloon',
'drifzepeli': 'drifblim',
'duflor': 'gloom',
'dummisel': 'dunsparce',
'duodino': 'zweilous',
'duokles': 'doublade',
'durengard': 'aegislash',
'dusselgurr': 'pidove',
'echnatoll': 'cofagrigus',
'efem': 'noibat',
'efoserp': 'servine',
'eguana': 'helioptile',
'elekid': 'elekid',
'elektek': 'electabuzz',
'elevoltek': 'electivire',
'elezard': 'heliolisk',
'elezeba': 'blitzle',
'elfun': 'whimsicott',
'emolga': 'emolga',
'endivie': 'chikorita',
'eneco': 'skitty',
'enekoro': 'delcatty',
'entei': 'entei',
'enton': 'psyduck',
'entoron': 'golduck',
'evoli': 'eevee',
'farbeagle': 'smeargle',
'fasasnob': 'unfezant',
'feelinara': 'sylveon',
'felilou': 'purrloin',
'felino': 'wooper',
'fennexis': 'delphox',
'ferkokel': 'pignite',
'fermicula': 'durant',
'feurigel': 'cyndaquil',
'fiaro': 'talonflame',
'fiffyen': 'poochyena',
'finneon': 'finneon',
'firnontor': 'glalie',
'flabébé': 'flabébé',
'flamara': 'flareon',
'flambirex': 'emboar',
'flamiau': 'litten',
'flampion': 'darumaka',
'flampivian': 'darmanitan',
'flapteryx': 'archen',
'flauschling': 'swirlix',
'flegmon': 'slowpoke',
'fleknoil': 'woobat',
'flemmli': 'torchic',
'fletiamo': 'swoobat',
'floette': 'floette',
'floink': 'tepig',
'florges': 'florges',
'fluffeluff': 'igglybuff',
'flunkifer': 'mawile',
'flunschlik': 'stunfisk',
'flurmel': 'whismur',
'folikon': 'swadloon',
'folipurba': 'leafeon',
'formeo': 'castform',
'forstellka': 'forretress',
'frigometri': 'cryogonal',
'frizelbliz': 'electrike',
'frosdedje': 'froslass',
'froxy': 'froakie',
'fukano': 'growlithe',
'furnifraß': 'heatmor',
'fynx': 'fennekin',
'galagladi': 'gallade',
'galapaflos': 'tirtouga',
'gallopa': 'rapidash',
'ganovil': 'sandile',
'garados': 'gyarados',
'gastrodon': 'gastrodon',
'geckarbor': 'treecko',
'gehweiher': 'surskit',
'gelatini': 'vanillite',
'gelatroppo': 'vanillish',
'gelatwino': 'vanilluxe',
'genesect': 'genesect',
'gengar': 'gengar',
'georok': 'graveler',
'geowaz': 'golem',
'geradaks': 'linoone',
'geronimatz': 'rufflet',
'gewaldro': 'sceptile',
'giflor': 'vileplume',
'girafarig': 'girafarig',
'giratina': 'giratina',
'gladiantri': 'pawniard',
'glaziola': 'glaceon',
'glibunkel': 'croagunk',
'glumanda': 'charmander',
'glurak': 'charizard',
'glutexo': 'charmeleon',
'golbat': 'golbat',
'golbit': 'golett',
'goldini': 'goldeen',
'golgantes': 'golurk',
'golking': 'seaking',
'gramokles': 'honedge',
'granbull': 'granbull',
'grebbit': 'diggersby',
'griffel': 'aipom',
'grillchita': 'simisear',
'grillmak': 'pansear',
'groink': 'grumpig',
'groudon': 'groudon',
'grypheldis': 'mandibuzz',
'guardevoir': 'gardevoir',
'habitak': 'spearow',
'hariyama': 'hariyama',
'haspiror': 'buneary',
'heatran': 'heatran',
'heiteira': 'blissey',
'hippopotas': 'hippopotas',
'hippoterus': 'hippowdon',
'honweisel': 'vespiquen',
'hooh': 'hooh',
'hoopa': 'hoopa',
'hoothoot': 'hoothoot',
'hoppspross': 'hoppip',
'hornliu': 'weedle',
'hubelupf': 'skiploom',
'hundemon': 'houndoom',
'hunduster': 'houndour',
'hutsassa': 'amoonguss',
'hydragil': 'accelgor',
'hydropi': 'mudkip',
'hypno': 'hypno',
'hypnomorba': 'gothorita',
'ibitak': 'fearow',
'icognito': 'unown',
'igamaro': 'chespin',
'igastarnish': 'quilladin',
'igelavar': 'quilava',
'ignivor': 'larvesta',
'iksbat': 'crobat',
'illumise': 'illumise',
'impergator': 'feraligatr',
'impoleon': 'empoleon',
'irokex': 'scrafty',
'irrbis': 'pumpkaboo',
'iscalar': 'inkay',
'isso': 'wynaut',
'jirachi': 'jirachi',
'jiutesto': 'throh',
'jugong': 'dewgong',
'jungglut': 'combusken',
'jurob': 'seel',
'kabuto': 'kabuto',
'kabutops': 'kabutops',
'kadabra': 'kadabra',
'kangama': 'kangaskhan',
'kanivanha': 'carvanha',
'kapilz': 'breloom',
'kapoera': 'hitmontop',
'kappalores': 'ludicolo',
'kapuno': 'deino',
'kapuriki': 'tapukoko',
'karadonis': 'sawk',
'karippas': 'carracosta',
'karnimani': 'totodile',
'karpador': 'magikarp',
'kastadur': 'ferroseed',
'kaumalat': 'gible',
'kecleon': 'kecleon',
'keifel': 'piloswine',
'keldeo': 'keldeo',
'kicklee': 'hitmonlee',
'kiesling': 'roggenrola',
'kikugi': 'cherubi',
'kindwurm': 'bagon',
'kingler': 'kingler',
'kinoso': 'cherrim',
'kirlia': 'kirlia',
'kleinstein': 'geodude',
'kleoparda': 'liepard',
'klikdiklak': 'klinklang',
'klikk': 'klink',
'kliklak': 'klang',
'klingplim': 'chingling',
'knacklion': 'trapinch',
'knakrack': 'garchomp',
'knarksel': 'gabite',
'knilz': 'shroomish',
'knirfish': 'bruxish',
'knofensa': 'bellsprout',
'knogga': 'marowak',
'knospi': 'budew',
'knuddeluff': 'wigglytuff',
'koalelu': 'komala',
'kobalium': 'cobalion',
'koknodon': 'cranidos',
'kokowei': 'exeggutor',
'kokuna': 'kakuna',
'krabby': 'krabby',
'krakeelo': 'loudred',
'kramshef': 'honchkrow',
'kramurx': 'murkrow',
'krawumms': 'exploud',
'krebscorps': 'corphish',
'krebutack': 'crawdaunt',
'kronjuwild': 'sawsbuck',
'kryppuk': 'spiritomb',
'kukmarda': 'watchog',
'kussilla': 'smoochum',
'kyogre': 'kyogre',
'kyurem': 'kyurem',
'lahmus': 'slowbro',
'lampi': 'chinchou',
'lanturn': 'lanturn',
'lapras': 'lapras',
'larvitar': 'larvitar',
'laschoking': 'slowking',
'laternecto': 'lampent',
'latias': 'latias',
'latios': 'latios',
'laukaps': 'karrablast',
'lavados': 'moltres',
'ledian': 'ledian',
'ledyba': 'ledyba',
'lektrobal': 'electrode',
'lepumentas': 'claydol',
'letarking': 'slaking',
'leufeo': 'litleo',
'libelldra': 'flygon',
'lichtel': 'litwick',
'liebiskus': 'luvdisc',
'liliep': 'lileep',
'lilminip': 'petilil',
'linfu': 'mienfoo',
'lithomith': 'dwebble',
'lohgock': 'blaziken',
'lombrero': 'lombre',
'lorblatt': 'bayleef',
'loturzel': 'lotad',
'lucario': 'lucario',
'lugia': 'lugia',
'lumineon': 'lumineon',
'lunala': 'lunala',
'lunastein': 'lunatone',
'luxio': 'luxio',
'luxtra': 'luxray',
'mabula': 'grubbin',
'machollo': 'machop',
'machomei': 'machamp',
'magbrant': 'magmortar',
'magby': 'magby',
'magcargo': 'magcargo',
'magearna': 'magearna',
'magmar': 'magmar',
'magnayen': 'mightyena',
'magnetilo': 'magnemite',
'magneton': 'magneton',
'magnezone': 'magnezone',
'makabaja': 'yamask',
'makuhita': 'makuhita',
'mamolida': 'alomomola',
'mampfaxo': 'munchlax',
'mamutel': 'mamoswine',
'manaphy': 'manaphy',
'mangunior': 'yungoos',
'mantax': 'mantine',
'mantirps': 'mantyke',
'maracamba': 'maractus',
'marill': 'marill',
'maschock': 'machoke',
'maskeregen': 'masquerain',
'matrifol': 'leavanny',
'mauzi': 'meowth',
'maxax': 'haxorus',
'mebrana': 'palpitoad',
'meditalis': 'medicham',
'meditie': 'meditite',
'megalon': 'beheeyem',
'meganie': 'meganium',
'meistagrif': 'conkeldurr',
'meloetta': 'meloetta',
'menki': 'mankey',
'metagross': 'metagross',
'metang': 'metang',
'mew': 'mew',
'mewtu': 'mewtwo',
'milotic': 'milotic',
'miltank': 'miltank',
'milza': 'axew',
'minun': 'minun',
'mitodos': 'duosion',
'mobai': 'bonsly',
'mogelbaum': 'sudowoodo',
'mollimorba': 'gothita',
'molunk': 'salandit',
'monargoras': 'tyrantrum',
'monozyto': 'solosis',
'moorabbel': 'marshtomp',
'morbitesse': 'gothitelle',
'morlord': 'quagsire',
'moterpel': 'mothim',
'muntier': 'vigoroth',
'muschas': 'shellder',
'myrapla': 'oddish',
'mähikel': 'skiddo',
'nachtara': 'umbreon',
'nagelotz': 'patrat',
'nasgnet': 'nosepass',
'natu': 'natu',
'navitaub': 'tranquill',
'nebulak': 'gastly',
'nidoking': 'nidoking',
'nidoqueen': 'nidoqueen',
'nidoran': 'nidoran',
'nidorina': 'nidorina',
'nidorino': 'nidorino',
'nincada': 'nincada',
'ninjask': 'ninjask',
'ninjatom': 'shedinja',
'nockchan': 'hitmonchan',
'noctuh': 'noctowl',
'noktuska': 'cacturne',
'octillery': 'octillery',
'ohrdoch': 'audino',
'omot': 'venomoth',
'onix': 'onix',
'ottaro': 'oshawott',
'owei': 'exeggcute',
'pachirisu': 'pachirisu',
'palimpalim': 'chimecho',
'palkia': 'palkia',
'pampam': 'pancham',
'pandagro': 'pangoro',
'pandir': 'spinda',
'panekon': 'cascoon',
'panferno': 'infernape',
'panflam': 'chimchar',
'panpyro': 'monferno',
'pantimimi': 'mimejr',
'pantimos': 'mrmime',
'panzaeron': 'skarmory',
'papinella': 'beautifly',
'papungha': 'jumpluff',
'paragoni': 'phantump',
'paras': 'paras',
'parasek': 'parasect',
'parfi': 'spritzee',
'parfinesse': 'aromatisse',
'pelipper': 'pelipper',
'peppeck': 'pikipek',
'perlu': 'clamperl',
'petznief': 'cubchoo',
'phanpy': 'phanpy',
'phione': 'phione',
'piccolente': 'ducklett',
'pichu': 'pichu',
'picochilla': 'minccino',
'piepi': 'clefairy',
'pii': 'cleffa',
'pikachu': 'pikachu',
'pinsir': 'pinsir',
'piondragi': 'drapion',
'pionskora': 'skorupi',
'pixi': 'clefable',
'plaudagei': 'chatot',
'plinfa': 'piplup',
'pliprin': 'prinplup',
'plusle': 'plusle',
'ponita': 'ponyta',
'porenta': 'farfetchd',
'porygon': 'porygon',
'porygon2': 'porygon2',
'porygonz': 'porygonz',
'pottrott': 'shuckle',
'praktibalk': 'timburr',
'psiana': 'espeon',
'psiau': 'espurr',
'psiaugon': 'meowstic',
'pudox': 'dustox',
'pummeluff': 'jigglypuff',
'pumpdjinn': 'gourgeist',
'pupitar': 'pupitar',
'puponcho': 'spewpa',
'puppance': 'baltoy',
'purmel': 'scatterbug',
'pygraulon': 'elgyem',
'pyroleo': 'pyroar',
'quabbel': 'frillish',
'quajutsu': 'greninja',
'quappo': 'poliwrath',
'quapsel': 'poliwag',
'quaputzi': 'poliwhirl',
'quaxo': 'politoed',
'quiekel': 'swinub',
'qurtel': 'torkoal',
'rabauz': 'tyrogue',
'rabigator': 'krookodile',
'raichu': 'raichu',
'raikou': 'raikou',
'rameidon': 'rampardos',
'ramoth': 'volcarona',
'rasaff': 'primeape',
'rattfratz': 'rattata',
'rattikarl': 'raticate',
'raupy': 'caterpie',
'rayquaza': 'rayquaza',
'regice': 'regice',
'regigigas': 'regigigas',
'regirock': 'regirock',
'registeel': 'registeel',
'relaxo': 'snorlax',
'relicanth': 'relicanth',
'remoraid': 'remoraid',
'reptain': 'grovyle',
'reshiram': 'reshiram',
'resladero': 'hawlucha',
'rettan': 'ekans',
'rexblisar': 'abomasnow',
'rihorn': 'rhyhorn',
'rihornior': 'rhyperior',
'riolu': 'riolu',
'rizeros': 'rhydon',
'robball': 'popplio',
'rocara': 'carbink',
'rokkaiman': 'krokorok',
'rollum': 'whirlipede',
'roselia': 'roselia',
'roserade': 'roserade',
'rossana': 'jynx',
'rotom': 'rotom',
'rotomurf': 'drilbur',
'rutena': 'braixen',
'sabbaione': 'slurpuff',
'safcon': 'metapod',
'saganabyss': 'gorebyss',
'samurzel': 'seedot',
'sandamer': 'sandslash',
'sandan': 'sandshrew',
'sarzenia': 'victreebel',
'scampisto': 'clauncher',
'schalellos': 'shellos',
'schallquap': 'tympole',
'schaloko': 'silcoon',
'scherox': 'scizor',
'schiggy': 'squirtle',
'schillok': 'wartortle',
'schilterus': 'shieldon',
'schlapor': 'lopunny',
'schlukwech': 'swalot',
'schluppuck': 'gulpin',
'schlurp': 'lickitung',
'schlurplek': 'lickilicky',
'schmerbe': 'barboach',
'schneckmag': 'slugma',
'schneppke': 'snorunt',
'schnuthelm': 'shelmet',
'schwalbini': 'taillow',
'schwalboss': 'swellow',
'scoppel': 'bunnelby',
'sedimantur': 'boldore',
'seedraking': 'kingdra',
'seejong': 'sealeo',
'seemon': 'seadra',
'seemops': 'spheal',
'seeper': 'horsea',
'selfe': 'uxie',
'sengo': 'zangoose',
'senlong': 'drampa',
'serpifeu': 'snivy',
'serpiroyal': 'serperior',
'sesokitz': 'deerling',
'shardrago': 'druddigon',
'sharfax': 'fraxure',
'shaymin': 'shaymin',
'sheinux': 'shinx',
'shnebedeck': 'snover',
'shnurgarst': 'purugly',
'shuppet': 'shuppet',
'siberio': 'beartic',
'sichlor': 'scyther',
'simsala': 'alakazam',
'skallyk': 'vullaby',
'skaraborn': 'heracross',
'skelabra': 'chandelure',
'skorgla': 'gligar',
'skorgro': 'gliscor',
'skunkapuh': 'stunky',
'skunktank': 'skuntank',
'sleima': 'grimer',
'sleimok': 'muk',
'smettbo': 'butterfree',
'smogmog': 'weezing',
'smogon': 'koffing',
'snibunna': 'weavile',
'sniebel': 'sneasel',
'snobilikat': 'persian',
'snubbull': 'snubbull',
'sodachita': 'simipour',
'sodamak': 'panpour',
'solgaleo': 'solgaleo',
'somniam': 'munna',
'somnivora': 'musharna',
'sonnfel': 'solrock',
'sonnflora': 'sunflora',
'sonnkern': 'sunkern',
'spoink': 'spoink',
'stahlos': 'steelix',
'stalobor': 'excadrill',
'staralili': 'starly',
'staraptor': 'staraptor',
'staravia': 'staravia',
'starmie': 'starmie',
'sterndu': 'staryu',
'stolloss': 'aggron',
'stollrak': 'lairon',
'stollunior': 'aron',
'strawickl': 'sewaddle',
'strepoli': 'gurdurr',
'suicune': 'suicune',
'sumpex': 'swampert',
'swaroness': 'swanna',
'symvolara': 'sigilyph',
'tandrak': 'dragalge',
'tangela': 'tangela',
'tangoloss': 'tangrowth',
'tanhel': 'beldum',
'tannza': 'pineco',
'tarnpignon': 'foongus',
'tauboga': 'pidgeotto',
'tauboss': 'pidgeot',
'taubsi': 'pidgey',
'tauros': 'tauros',
'teddiursa': 'teddiursa',
'tengulist': 'shiftry',
'tentacha': 'tentacool',
'tentantel': 'ferrothorn',
'tentoxa': 'tentacruel',
'terrakium': 'terrakion',
'terribark': 'herdier',
'thanathora': 'barbaracle',
'tobutz': 'azelf',
'togedemaru': 'togedemaru',
'togekiss': 'togekiss',
'togepi': 'togepi',
'togetic': 'togetic',
'tohaido': 'sharpedo',
'tornupto': 'typhlosion',
'toxiped': 'venipede',
'toxiquak': 'toxicroak',
'tragosso': 'cubone',
'trasla': 'ralts',
'traumato': 'drowzee',
'traunfugil': 'misdreavus',
'traunmagil': 'mismagius',
'trikephalo': 'hydreigon',
'trombork': 'trevenant',
'tropius': 'tropius',
'turtok': 'blastoise',
'tuska': 'cacnea',
'tyracroc': 'croconaw',
'uhafnir': 'noivern',
'ultrigaria': 'weepinbell',
'unratütox': 'trubbish',
'ursaring': 'ursaring',
'vegichita': 'simisage',
'vegimak': 'pansage',
'venuflibis': 'carnivine',
'vesprit': 'mesprit',
'vibrava': 'vibrava',
'victini': 'victini',
'vipitis': 'seviper',
'viridium': 'virizion',
'viscargot': 'sliggoo',
'viscogon': 'goodra',
'viscora': 'goomy',
'vivillon': 'vivillon',
'volbeat': 'volbeat',
'volcanion': 'volcanion',
'voltenso': 'manectric',
'voltilamm': 'mareep',
'voltobal': 'voltorb',
'voltolos': 'thundurus',
'voltula': 'galvantula',
'voluminas': 'probopass',
'vulnona': 'ninetales',
'vulpix': 'vulpix',
'waaty': 'flaaffy',
'wablu': 'swablu',
'wadribie': 'combee',
'wailmer': 'wailmer',
'wailord': 'wailord',
'walraisa': 'walrein',
'washakwil': 'braviary',
'wattzapf': 'joltik',
'waumboll': 'cottonee',
'waumpel': 'wurmple',
'webarak': 'spinarak',
'welsar': 'whiscash',
'wielie': 'cradily',
'wiesenior': 'furret',
'wieshu': 'mienshao',
'wiesor': 'sentret',
'wingull': 'wingull',
'woingenau': 'wobbuffet',
'wommel': 'cutiefly',
'wonneira': 'happiny',
'wuffels': 'rockruff',
'wummer': 'clawitzer',
'xatu': 'xatu',
'xerneas': 'xerneas',
'yanma': 'yanma',
'yanmega': 'yanmega',
'yorkleff': 'lillipup',
'yveltal': 'yveltal',
'zapdos': 'zapdos',
'zapplalek': 'eelektrik',
'zapplarang': 'eelektross',
'zapplardin': 'tynamo',
'zebritz': 'zebstrika',
'zekrom': 'zekrom',
'zigzachs': 'zigzagoon',
'zirpeise': 'kricketune',
'zirpurze': 'kricketot',
'zobiris': 'sableye',
'zoroark': 'zoroark',
'zorua': 'zorua',
'zubat': 'zubat',
'zurrokex': 'scraggy',
'zwirrfinst': 'dusknoir',
'zwirrklop': 'dusclops',
'zwirrlicht': 'duskull',
'zwottronin': 'dewott',
'zygarde': 'zygarde',
'zytomega': 'reuniclus'
}
logger = logging.getLogger(__name__)
def _initialise(bot):
plugins.register_admin_command(["clearpokedex"])
plugins.register_user_command(["pokedex"])
def comparetypes(data1, data2):
weak1 = [x['name'] for x in data1['damage_relations']['double_damage_from']]
weak2 = [x['name'] for x in data2['damage_relations']['double_damage_from']]
resist1 = [x['name'] for x in data1['damage_relations']['half_damage_from']]
resist2 = [x['name'] for x in data2['damage_relations']['half_damage_from']]
immune1 = [x['name'] for x in data1['damage_relations']['no_damage_from']]
immune2 = [x['name'] for x in data2['damage_relations']['no_damage_from']]
immune = set(immune1).union(immune2)
four = set(weak1).intersection(weak2).difference(immune)
quarter = set(resist1).intersection(resist2).difference(immune)
two = set(weak1).symmetric_difference(weak2).difference(set(resist1).symmetric_difference(resist2)).difference(immune)
half = ((set(resist1).symmetric_difference(resist2)).difference(set(weak1).symmetric_difference(weak2))).difference(immune)
matchup = {'4x':four,'2x':two,'1/2':half,'1/4':quarter,'immune':immune}
return matchup
@asyncio.coroutine
def clearpokedex(bot, event):
'''Clear the cached pokedex - useful when the data seems outdated.'''
bot.memory.set_by_path(["pokedex"], {})
yield from bot.coro_send_message(event.conv, "Pokedex cache cleared")
def gettypefromcache(bot, pkmntype):
if not bot.memory.exists(["pokedex", "pokemontypes"]):
bot.memory.set_by_path(["pokedex", "pokemontypes"], {})
return None
else:
if not bot.memory.exists(["pokedex", "pokemontypes", pkmntype]):
return None
elif bot.get_by_path(["pokedex", "pokemontypes", pkmntype, "expires"]) < str(datetime.datetime.now()):
logger.info("Cached data for {} type expired.".format(pkmntype))
return None
else:
return bot.get_by_path(["pokedex","pokemontypes",pkmntype])
@asyncio.coroutine
def cachepkmntype(bot, pkmntypedata):
if not bot.memory.exists(["pokedex", "pokemontypes"]):
bot.memory.set_by_path(["pokedex", "pokemontypes"], {})
bot.memory.set_by_path(["pokedex", "pokemontypes", pkmntypedata["name"]], {"name":pkmntypedata["name"],"damage_relations":pkmntypedata['damage_relations'],'expires':str(datetime.datetime.now() + datetime.timedelta(days=5))})
logger.info("Writing {} type data into cache".format(pkmntypedata['name']))
def getpkmntype(bot, pkmntype):
url = "http://pokeapi.co/api/v2/type/{}".format(pkmntype.lower())
request = urllib.request.Request(url, headers = {"User-agent":"Mozilla/5.0"})
try:
data = json.loads(urllib.request.urlopen(request).read().decode("utf-8"))
except:
return None
return data
def getfromcache(bot, pokemonname):
if not bot.memory.exists(["pokedex"]):
bot.memory.set_by_path(["pokedex"], {})
if not bot.memory.exists(["pokedex", pokemonname]):
logger.info("{} not in cache.".format(pokemonname))
return None
else:
try:
if bot.memory.get_by_path(["pokedex", pokemonname, "expires"]) < str(datetime.datetime.now()):
logger.info("Cached data for {} expired.".format(pokemonname))
return None
except:
logger.info("No cache timestamp for {} available.".format(pokemonname))
return None
return bot.memory.get_by_path(["pokedex", pokemonname])
return
def cachepkmn(bot, pkmndata, name):
if not bot.memory.exists(["pokedex"]):
bot.memory.set_by_path(["pokedex"], {})
bot.memory.set_by_path(["pokedex", name], {"id":pkmndata["id"],"types":pkmndata["types"],"expires": str(datetime.datetime.now() + datetime.timedelta(days=5))})
logger.info("Writing {} into cache".format(name))
return
def gettype(bot, pkmntype, logger):
cache = gettypefromcache(bot, pkmntype)
if cache:
return cache
else:
typedata = getpkmntype(bot, pkmntype)
if typedata:
cachepkmntype(bot, typedata)
return typedata
return
@asyncio.coroutine
def pokedex(bot, event, pokemon):
'''Returns the number, types, weaknesses and image of a pokemon'''
if pokemon.isdigit(): return
if pokemon.lower() in translations:
pokemon = translations[pokemon.lower()]
url = "http://pokeapi.co/api/v2/pokemon/{}/".format(pokemon.lower())
request = urllib.request.Request(url, headers = {"User-agent":"Mozilla/5.0"})
cache = getfromcache(bot, pokemon.lower())
if cache:
logger.info("Found {} in cache".format(pokemon.lower()))
data = cache
pkmn = "<b><a href='http://pokemondb.net/pokedex/{}'>{}</a></b> [#{}]".format(pokemon.lower(),pokemon.capitalize(),data["id"])
else:
logger.info("{} not found in cache OR cache expired, getting from pokeapi".format(pokemon.capitalize()))
try:
data = json.loads(urllib.request.urlopen(request).read().decode("utf-8"))
except urllib.error.URLError as e:
yield from bot.coro_send_message(event.conv, "{}: Error: {}".format(event.user.full_name, json.loads(e.read().decode("utf8","ignore"))['detail']))
return
cachepkmn(bot, data, pokemon.lower())
pkmn = "<b><a href='http://pokemondb.net/pokedex/{}'>{}</a></b> (#{})".format(pokemon.lower(),pokemon.capitalize(),data["id"])
type1 = gettype(bot, data['types'][0]['type']['name'], logger)
pkmn = pkmn + "<br><b>Type</b>: <a href='http://pokemondb.net/type/{}'>{}</a>".format(data['types'][0]["type"]["name"],data['types'][0]["type"]["name"].capitalize())
if len(data['types']) > 1 :
type2 = gettype(bot, data['types'][1]['type']['name'], logger)
pkmn = pkmn + " / <a href='http://pokemondb.net/type/{}'>{}</a>".format(data['types'][1]["type"]["name"],data['types'][1]["type"]["name"].capitalize())
if type1 and type2:
matchups = comparetypes(type1, type2)
else:
if type1:
matchups = {'2x':type1['damage_relations']['double_damage_from'],'1/2':type1['damage_relations']['half_damage_from'],'immune':type1['damage_relations']['no_damage_from']}
matches = ""
if matchups:
for x in matchups:
if len(matchups[x]) > 0:
matches = matches + "<br><b>{}</b>: ".format(x.capitalize())
for y in matchups[x]:
if isinstance(y, dict):
matches = matches + " <a href='http://pokemondb.net/type/{}'>{}</a>".format(y['name'].lower(),y['name'].capitalize())
else:
matches = matches + " <a href='http://pokemondb.net/type/{}'>{}</a>".format(y.lower(),y.capitalize())
else:
matches = "<i>Type matchups not currently available. Sorry :(</i>"
pkmn = pkmn + matches
link_image = "http://img.pokemondb.net/artwork/{}.jpg".format(pokemon.lower())
filename = os.path.basename(link_image)
r = yield from aiohttp.request('get', link_image)
raw = yield from r.read()
image_data = io.BytesIO(raw)
image_id = yield from bot._client.upload_image(image_data, filename=filename)
yield from bot.coro_send_message(event.conv, pkmn, image_id=image_id)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment