/cogs/image.py
Python | 168 lines | 161 code | 6 blank | 1 comment | 2 complexity | 4ea222233eee8c6bb54a7ebba62e79a7 MD5 | raw file
Possible License(s): GPL-3.0
- from discord.ext import commands
- from random import choice, shuffle
- import aiohttp
- import functools
- import asyncio
- try:
- from imgurpython import ImgurClient
- except:
- ImgurClient = False
- CLIENT_ID = "1fd3ef04daf8cab"
- CLIENT_SECRET = "f963e574e8e3c17993c933af4f0522e1dc01e230"
- GIPHY_API_KEY = "dc6zaTOxFJmzC"
- class Image:
- """Image related commands."""
- def __init__(self, bot):
- self.bot = bot
- self.imgur = ImgurClient(CLIENT_ID, CLIENT_SECRET)
- @commands.group(name="imgur", no_pm=True, pass_context=True)
- async def _imgur(self, ctx):
- """Retrieves pictures from imgur"""
- if ctx.invoked_subcommand is None:
- await self.bot.send_cmd_help(ctx)
- @_imgur.command(pass_context=True, name="random")
- async def imgur_random(self, ctx, *, term: str=None):
- """Retrieves a random image from Imgur
- Search terms can be specified"""
- if term is None:
- task = functools.partial(self.imgur.gallery_random, page=0)
- else:
- task = functools.partial(self.imgur.gallery_search, term,
- advanced=None, sort='time',
- window='all', page=0)
- task = self.bot.loop.run_in_executor(None, task)
- try:
- results = await asyncio.wait_for(task, timeout=10)
- except asyncio.TimeoutError:
- await self.bot.say("Error: request timed out")
- else:
- if results:
- item = choice(results)
- link = item.gifv if hasattr(item, "gifv") else item.link
- await self.bot.say(link)
- else:
- await self.bot.say("Your search terms gave no results.")
- @_imgur.command(pass_context=True, name="search")
- async def imgur_search(self, ctx, *, term: str):
- """Searches Imgur for the specified term and returns up to 3 results"""
- task = functools.partial(self.imgur.gallery_search, term,
- advanced=None, sort='time',
- window='all', page=0)
- task = self.bot.loop.run_in_executor(None, task)
- try:
- results = await asyncio.wait_for(task, timeout=10)
- except asyncio.TimeoutError:
- await self.bot.say("Error: request timed out")
- else:
- if results:
- shuffle(results)
- msg = "Search results...\n"
- for r in results[:3]:
- msg += r.gifv if hasattr(r, "gifv") else r.link
- msg += "\n"
- await self.bot.say(msg)
- else:
- await self.bot.say("Your search terms gave no results.")
- @_imgur.command(pass_context=True, name="subreddit")
- async def imgur_subreddit(self, ctx, subreddit: str, sort_type: str="top", window: str="day"):
- """Gets images from the specified subreddit section
- Sort types: new, top
- Time windows: day, week, month, year, all"""
- sort_type = sort_type.lower()
- if sort_type not in ("new", "top"):
- await self.bot.say("Only 'new' and 'top' are a valid sort type.")
- return
- elif window not in ("day", "week", "month", "year", "all"):
- await self.bot.send_cmd_help(ctx)
- return
- if sort_type == "new":
- sort = "time"
- elif sort_type == "top":
- sort = "top"
- links = []
- task = functools.partial(self.imgur.subreddit_gallery, subreddit,
- sort=sort, window=window, page=0)
- task = self.bot.loop.run_in_executor(None, task)
- try:
- items = await asyncio.wait_for(task, timeout=10)
- except asyncio.TimeoutError:
- await self.bot.say("Error: request timed out")
- return
- for item in items[:3]:
- link = item.gifv if hasattr(item, "gifv") else item.link
- links.append("{}\n{}".format(item.title, link))
- if links:
- await self.bot.say("\n".join(links))
- else:
- await self.bot.say("No results found.")
- @commands.command(pass_context=True, no_pm=True)
- async def gif(self, ctx, *keywords):
- """Retrieves first search result from giphy"""
- if keywords:
- keywords = "+".join(keywords)
- else:
- await self.bot.send_cmd_help(ctx)
- return
- url = ("http://api.giphy.com/v1/gifs/search?&api_key={}&q={}"
- "".format(GIPHY_API_KEY, keywords))
- async with aiohttp.get(url) as r:
- result = await r.json()
- if r.status == 200:
- if result["data"]:
- await self.bot.say(result["data"][0]["url"])
- else:
- await self.bot.say("No results found.")
- else:
- await self.bot.say("Error contacting the API")
- @commands.command(pass_context=True, no_pm=True)
- async def gifr(self, ctx, *keywords):
- """Retrieves a random gif from a giphy search"""
- if keywords:
- keywords = "+".join(keywords)
- else:
- await self.bot.send_cmd_help(ctx)
- return
- url = ("http://api.giphy.com/v1/gifs/random?&api_key={}&tag={}"
- "".format(GIPHY_API_KEY, keywords))
- async with aiohttp.get(url) as r:
- result = await r.json()
- if r.status == 200:
- if result["data"]:
- await self.bot.say(result["data"]["url"])
- else:
- await self.bot.say("No results found.")
- else:
- await self.bot.say("Error contacting the API")
- def setup(bot):
- if ImgurClient is False:
- raise RuntimeError("You need the imgurpython module to use this.\n"
- "pip3 install imgurpython")
- bot.add_cog(Image(bot))