mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-06 11:18:54 -05:00
[Image] Rewrite for V3 (#768)
* [Core] add imgurpython to requirements * [Image] v3 rewrites * remove imgurpython from requirements * [Image] switch to Config, add in instructions for getting imgur client id * Add default register
This commit is contained in:
parent
680a44c4b4
commit
0ba6d9a5af
9
cogs/image/__init__.py
Normal file
9
cogs/image/__init__.py
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
from .image import Image
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
|
||||||
|
def setup(bot):
|
||||||
|
n = Image(bot)
|
||||||
|
loop = asyncio.get_event_loop()
|
||||||
|
loop.create_task(n.set_giphy_key())
|
||||||
|
bot.add_cog(n)
|
||||||
155
cogs/image/image.py
Normal file
155
cogs/image/image.py
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
from discord.ext import commands
|
||||||
|
from random import shuffle
|
||||||
|
import aiohttp
|
||||||
|
|
||||||
|
from core import checks, Config
|
||||||
|
|
||||||
|
GIPHY_API_KEY = "dc6zaTOxFJmzC"
|
||||||
|
|
||||||
|
|
||||||
|
class Image:
|
||||||
|
"""Image related commands."""
|
||||||
|
default_global = {
|
||||||
|
"imgur_client_id": None
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self, bot):
|
||||||
|
self.bot = bot
|
||||||
|
self.settings = Config.get_conf(self, identifier=2652104208, force_registration=True)
|
||||||
|
self.settings.register_global(**self.default_global)
|
||||||
|
self.session = aiohttp.ClientSession()
|
||||||
|
self.imgur_base_url = "https://api.imgur.com/3/"
|
||||||
|
|
||||||
|
@commands.group(name="imgur")
|
||||||
|
@commands.guild_only()
|
||||||
|
async def _imgur(self, ctx):
|
||||||
|
"""Retrieves pictures from imgur
|
||||||
|
|
||||||
|
Make sure to set the client ID using
|
||||||
|
[p]imgurcreds"""
|
||||||
|
if ctx.invoked_subcommand is None:
|
||||||
|
await self.bot.send_cmd_help(ctx)
|
||||||
|
|
||||||
|
@_imgur.command(name="search")
|
||||||
|
async def imgur_search(self, ctx, *, term: str):
|
||||||
|
"""Searches Imgur for the specified term and returns up to 3 results"""
|
||||||
|
url = self.imgur_base_url + "time/all/0"
|
||||||
|
params = {"q": term}
|
||||||
|
headers = {"Authorization": "Client-ID {}".format(await self.settings.imgur_client_id())}
|
||||||
|
async with self.session.get(url, headers=headers, data=params) as search_get:
|
||||||
|
data = await search_get.json()
|
||||||
|
|
||||||
|
if data["success"]:
|
||||||
|
results = data["data"]
|
||||||
|
if not results:
|
||||||
|
await ctx.send("Your search returned no results")
|
||||||
|
return
|
||||||
|
shuffle(results)
|
||||||
|
msg = "Search results...\n"
|
||||||
|
for r in results[:3]:
|
||||||
|
msg += r["gifv"] if "gifv" in r else r["link"]
|
||||||
|
msg += "\n"
|
||||||
|
await ctx.send(msg)
|
||||||
|
else:
|
||||||
|
await ctx.send("Something went wrong. Error code is {}".format(data["status"]))
|
||||||
|
|
||||||
|
@_imgur.command(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()
|
||||||
|
window = window.lower()
|
||||||
|
|
||||||
|
if sort_type not in ("new", "top"):
|
||||||
|
await ctx.send("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 = []
|
||||||
|
headers = {"Authorization": "Client-ID {}".format(await self.settings.imgur_client_id())}
|
||||||
|
url = self.imgur_base_url + "r/{}/{}/{}/0".format(subreddit, sort, window)
|
||||||
|
|
||||||
|
async with self.session.get(url, headers=headers) as sub_get:
|
||||||
|
data = await sub_get.json()
|
||||||
|
|
||||||
|
if data["success"]:
|
||||||
|
items = data["data"]
|
||||||
|
if items:
|
||||||
|
for item in items[:3]:
|
||||||
|
link = item["gifv"] if "gifv" in item else item["link"]
|
||||||
|
links.append("{}\n{}".format(item["title"], link))
|
||||||
|
|
||||||
|
if links:
|
||||||
|
await ctx.send("\n".join(links))
|
||||||
|
else:
|
||||||
|
await ctx.send("No results found.")
|
||||||
|
else:
|
||||||
|
await ctx.send("Something went wrong. Error code is {}".format(data["status"]))
|
||||||
|
|
||||||
|
@checks.is_owner()
|
||||||
|
@commands.command()
|
||||||
|
async def imgurcreds(self, ctx, imgur_client_id: str):
|
||||||
|
"""Sets the imgur client id
|
||||||
|
You will need an account on Imgur to get this
|
||||||
|
|
||||||
|
You can get these by visiting https://api.imgur.com/oauth2/addclient
|
||||||
|
and filling out the form. Enter a name for the application, select
|
||||||
|
'Anonymous usage without user authorization' for the auth type,
|
||||||
|
leave the app website blank, enter a valid email address, and
|
||||||
|
enter a description. Check the box for the captcha, then click Next.
|
||||||
|
Your client ID will be on the page that loads"""
|
||||||
|
await self.settings.imgur_client_id.set(imgur_client_id)
|
||||||
|
await ctx.send("Set the imgur client id!")
|
||||||
|
|
||||||
|
@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 self.session.get(url) as r:
|
||||||
|
result = await r.json()
|
||||||
|
if r.status == 200:
|
||||||
|
if result["data"]:
|
||||||
|
await ctx.send(result["data"][0]["url"])
|
||||||
|
else:
|
||||||
|
await ctx.send("No results found.")
|
||||||
|
else:
|
||||||
|
await ctx.send("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 self.session.get(url) as r:
|
||||||
|
result = await r.json()
|
||||||
|
if r.status == 200:
|
||||||
|
if result["data"]:
|
||||||
|
await ctx.send(result["data"]["url"])
|
||||||
|
else:
|
||||||
|
await ctx.send("No results found.")
|
||||||
|
else:
|
||||||
|
await ctx.send("Error contacting the API")
|
||||||
Loading…
x
Reference in New Issue
Block a user