mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-06 11:18:54 -05:00
169 lines
5.8 KiB
Python
169 lines
5.8 KiB
Python
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))
|