mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-06 03:08:55 -05:00
API changes: - Cogs must now inherit from `commands.Cog` (see #2151 for discussion and more details) - All functions which are not decorators in the `redbot.core.checks` module are now deprecated in favour of their counterparts in `redbot.core.utils.mod`. This is to make this module more consistent and end the confusing naming convention. - `redbot.core.checks.check_overrides` function is now gone, overrideable checks can now be created with the `@commands.permissions_check` decorator - Command, Group, Cog and Context have some new attributes and methods, but they are for internal use so shouldn't concern cog creators (unless they're making a permissions cog!). - `__permissions_check_before` and `__permissions_check_after` have been replaced: A cog method named `__permissions_hook` will be evaluated as permissions hooks in the same way `__permissions_check_before` previously was. Permissions hooks can also be added/removed/verified through the new `*_permissions_hook()` methods on the bot object, and they will be verified even when permissions is unloaded. - New utility method `redbot.core.utils.chat_formatting.humanize_list` - New dependency [`schema`](https://github.com/keleshev/schema) User-facing changes: - When a `@bot_has_permissions` check fails, the bot will respond saying what permissions were actually missing. - All YAML-related `[p]permissions` subcommands now reside under the `[p]permissions acl` sub-group (tbh I still think the whole cog has too many top-level commands) - The YAML schema for these commands has been changed - A rule cannot be set as allow and deny at the same time (previously this would just default to allow) Documentation: - New documentation for `redbot.core.commands.requires` and `redbot.core.checks` modules - Renewed documentation for the permissions cog - `sphinx.ext.doctest` is now enabled Note: standard discord.py checks will still behave exactly the same way, in fact they are checked before `Requires` is looked at, so they are not overrideable. Signed-off-by: Toby Harradine <tobyharradine@gmail.com>
186 lines
6.3 KiB
Python
186 lines
6.3 KiB
Python
from random import shuffle
|
|
|
|
import aiohttp
|
|
|
|
from redbot.core.i18n import Translator, cog_i18n
|
|
from redbot.core import checks, Config, commands
|
|
|
|
_ = Translator("Image", __file__)
|
|
|
|
GIPHY_API_KEY = "dc6zaTOxFJmzC"
|
|
|
|
|
|
@cog_i18n(_)
|
|
class Image(commands.Cog):
|
|
"""Image related commands."""
|
|
|
|
default_global = {"imgur_client_id": None}
|
|
|
|
def __init__(self, bot):
|
|
super().__init__()
|
|
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/"
|
|
|
|
def __unload(self):
|
|
self.session.detach()
|
|
|
|
@commands.group(name="imgur")
|
|
async def _imgur(self, ctx):
|
|
"""Retrieves pictures from imgur
|
|
|
|
Make sure to set the client ID using
|
|
[p]imgurcreds"""
|
|
pass
|
|
|
|
@_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 + "gallery/search/time/all/0"
|
|
params = {"q": term}
|
|
imgur_client_id = await self.settings.imgur_client_id()
|
|
if not imgur_client_id:
|
|
await ctx.send(
|
|
_("A client ID has not been set! Please set one with {}.").format(
|
|
"`{}imgurcreds`".format(ctx.prefix)
|
|
)
|
|
)
|
|
return
|
|
headers = {"Authorization": "Client-ID {}".format(imgur_client_id)}
|
|
async with self.session.get(url, headers=headers, params=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 ctx.send_help()
|
|
return
|
|
|
|
if sort_type == "new":
|
|
sort = "time"
|
|
elif sort_type == "top":
|
|
sort = "top"
|
|
|
|
imgur_client_id = await self.settings.imgur_client_id()
|
|
if not imgur_client_id:
|
|
await ctx.send(
|
|
_("A client ID has not been set! Please set one with {}.").format(
|
|
"`{}imgurcreds`".format(ctx.prefix)
|
|
)
|
|
)
|
|
return
|
|
|
|
links = []
|
|
headers = {"Authorization": "Client-ID {}".format(imgur_client_id)}
|
|
url = self.imgur_base_url + "gallery/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,
|
|
set the authorization callback url to 'https://localhost'
|
|
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.guild_only()
|
|
@commands.command()
|
|
async def gif(self, ctx, *keywords):
|
|
"""Retrieves first search result from giphy"""
|
|
if keywords:
|
|
keywords = "+".join(keywords)
|
|
else:
|
|
await ctx.send_help()
|
|
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.guild_only()
|
|
@commands.command()
|
|
async def gifr(self, ctx, *keywords):
|
|
"""Retrieves a random gif from a giphy search"""
|
|
if keywords:
|
|
keywords = "+".join(keywords)
|
|
else:
|
|
await ctx.send_help()
|
|
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."))
|