You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Fox-V3/stealemoji/stealemoji.py

159 lines
4.9 KiB

import aiohttp
import discord
from redbot.core import Config, commands
from redbot.core.bot import Red
from typing import Any
Cog: Any = getattr(commands, "Cog", object)
async def fetch_img(session, url):
with aiohttp.Timeout(10):
async with session.get(url) as response:
assert response.status == 200
return await response.read()
class StealEmoji(Cog):
"""
This cog steals emojis and creates servers for them
"""
default_stolemoji = {
"guildbank": None,
"name": None,
"require_colons": False,
"managed": False,
"guild_id": None,
"url": None,
"animated": False
}
def __init__(self, red: Red):
self.bot = red
self.config = Config.get_conf(self, identifier=11511610197108101109111106105)
default_global = {
"stolemoji": {},
"guildbanks": [],
"on": False
}
self.config.register_global(**default_global)
@commands.group()
async def stealemoji(self, ctx: commands.Context):
"""
Base command for this cog. Check help for the commands list.
"""
if ctx.invoked_subcommand is None:
pass
@stealemoji.command(name="collect")
async def se_collect(self, ctx):
"""Toggles whether emoji's are collected or not"""
curr_setting = await self.config.on()
await self.config.on.set(not curr_setting)
await ctx.send("Collection is now " + str(not curr_setting))
@stealemoji.command(name="bank")
async def se_bank(self, ctx):
"""Add current server as emoji bank"""
await ctx.send("This will upload custom emojis to this server\n"
"Are you sure you want to make the current server an emoji bank? (y//n)")
def check(m):
return m.content.upper() in ["Y", "YES", "N", "NO"] and m.channel == ctx.channel and m.author == ctx.author
msg = await self.bot.wait_for('message', check=check)
if msg.content in ["N", "NO"]:
await ctx.send("Cancelled")
return
async with self.config.guildbanks() as guildbanks:
guildbanks.append(ctx.guild.id)
await ctx.send("This server has been added as an emoji bank")
async def on_reaction_add(self, reaction: discord.Reaction, user: discord.User):
"""Event handler for reaction watching"""
if not reaction.custom_emoji:
print("Not a custom emoji")
return
if not (await self.config.on()):
print("Collecting is off")
return
emoji = reaction.emoji
if emoji in self.bot.emojis:
print("Emoji already in bot.emojis")
return
# This is now a custom emoji that the bot doesn't have access to, time to steal it
# First, do I have an available guildbank?
guildbank = None
banklist = await self.config.guildbanks()
for guild_id in banklist:
guild = self.bot.get_guild(guild_id)
if len(guild.emojis) < 50:
guildbank = guild
break
if guildbank is None:
print("No guildbank to store emoji")
# Eventually make a new banklist
return
# Next, have I saved this emoji before (because uploaded emoji != orignal emoji)
stolemojis = await self.config.stolemoji()
if emoji.id in stolemojis:
print("Emoji has already been stolen")
return
# Alright, time to steal it for real
# path = urlparse(emoji.url).path
# ext = os.path.splitext(path)[1]
async with aiohttp.ClientSession() as session:
img = await fetch_img(session, emoji.url)
# path = data_manager.cog_data_path(cog_instance=self) / (emoji.name+ext)
# with path.open("wb") as f:
# f.write(img)
# urllib.urlretrieve(emoji.url, emoji.name+ext)
try:
await guildbank.create_custom_emoji(name=emoji.name, image=img, reason="Stole from " + str(user))
except discord.Forbidden as e:
print("PermissionError - no permission to add emojis")
raise PermissionError("No permission to add emojis") from e
except discord.HTTPException as e:
print("HTTPException exception")
raise e # Unhandled error
# If you get this far, YOU DID IT
save_dict = self.default_stolemoji.copy()
e_dict = vars(emoji)
for k in e_dict:
if k in save_dict:
save_dict[k] = e_dict[k]
save_dict["guildbank"] = guildbank.id
async with self.config.stolemoji() as stolemoji:
stolemoji[emoji.id] = save_dict
# Enable the below if you want to get notified when it works
# owner = await self.bot.application_info()
# owner = owner.owner
# await owner.send("Just added emoji "+str(emoji)+" to server "+str(guildbank))