[StealEmoji] Bug fixes and better handling (#42)
* StealEmoji properly handle Emojis not having the `__dict__` attribute Start fix for emoiji vs animated max error * Comment-out some prints * First step to fixing stealemoji Uses discord.Asset now * Reformat * Call __init__ * Fix duplicate emojis, formatting, caching
This commit is contained in:
parent
e1256d26a5
commit
2a7a1b8b92
@ -1,17 +1,27 @@
|
||||
import aiohttp
|
||||
|
||||
import discord
|
||||
|
||||
from redbot.core import Config, commands
|
||||
from redbot.core import Config, checks, commands
|
||||
from redbot.core.bot import Red
|
||||
|
||||
from redbot.core.commands import Cog
|
||||
|
||||
|
||||
async def fetch_img(session, url):
|
||||
async with session.get(url) as response:
|
||||
assert response.status == 200
|
||||
return await response.read()
|
||||
# Replaced with discord.Asset.read()
|
||||
# async def fetch_img(session: aiohttp.ClientSession, url: StrOrURL):
|
||||
# async with session.get(url) as response:
|
||||
# assert response.status == 200
|
||||
# return await response.read()
|
||||
|
||||
|
||||
async def check_guild(guild, emoji):
|
||||
if len(guild.emojis) >= 100:
|
||||
return False
|
||||
|
||||
if len(guild.emojis) < 50:
|
||||
return True
|
||||
|
||||
if emoji.animated:
|
||||
return sum(e.animated for e in guild.emojis) < 50
|
||||
else:
|
||||
return sum(not e.animated for e in guild.emojis) < 50
|
||||
|
||||
|
||||
class StealEmoji(Cog):
|
||||
@ -22,20 +32,22 @@ class StealEmoji(Cog):
|
||||
default_stolemoji = {
|
||||
"guildbank": None,
|
||||
"name": None,
|
||||
"require_colons": False,
|
||||
"managed": False,
|
||||
"require_colons": None,
|
||||
"managed": None,
|
||||
"guild_id": None,
|
||||
"url": None,
|
||||
"animated": False,
|
||||
"animated": None,
|
||||
}
|
||||
|
||||
def __init__(self, red: Red):
|
||||
super().__init__()
|
||||
self.bot = red
|
||||
self.config = Config.get_conf(self, identifier=11511610197108101109111106105)
|
||||
default_global = {"stolemoji": {}, "guildbanks": [], "on": False}
|
||||
default_global = {"stolemoji": {}, "guildbanks": [], "on": False, "notify": 0}
|
||||
|
||||
self.config.register_global(**default_global)
|
||||
|
||||
self.is_on = await self.config.on()
|
||||
|
||||
@commands.group()
|
||||
async def stealemoji(self, ctx: commands.Context):
|
||||
"""
|
||||
@ -44,20 +56,44 @@ class StealEmoji(Cog):
|
||||
if ctx.invoked_subcommand is None:
|
||||
pass
|
||||
|
||||
@checks.is_owner()
|
||||
@stealemoji.command(name="notify")
|
||||
async def se_notify(self, ctx: commands.Context):
|
||||
"""Cycles between notification settings for when an emoji is stolen
|
||||
|
||||
None (Default)
|
||||
DM Owner
|
||||
Msg in server channel
|
||||
"""
|
||||
curr_setting = await self.config.notify()
|
||||
|
||||
if not curr_setting:
|
||||
await self.config.notify.set(1)
|
||||
await ctx.send("Bot owner will now be notified when an emoji is stolen")
|
||||
elif curr_setting == 1:
|
||||
channel: discord.TextChannel = ctx.channel
|
||||
await self.config.notify.set(channel.id)
|
||||
await ctx.send("This channel will now be notified when an emoji is stolen")
|
||||
else:
|
||||
await self.config.notify.set(0)
|
||||
await ctx.send("Notifications are now off")
|
||||
|
||||
@checks.is_owner()
|
||||
@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)
|
||||
|
||||
self.is_on = await self.config.on()
|
||||
|
||||
await ctx.send("Collection is now " + str(not curr_setting))
|
||||
|
||||
@checks.is_owner()
|
||||
@commands.guild_only()
|
||||
@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 (
|
||||
@ -66,31 +102,50 @@ class StealEmoji(Cog):
|
||||
and m.author == ctx.author
|
||||
)
|
||||
|
||||
already_a_guildbank = ctx.guild.id in (await self.config.guildbanks())
|
||||
|
||||
if already_a_guildbank:
|
||||
await ctx.send(
|
||||
"This is already an emoji bank\n"
|
||||
"Are you sure you want to remove the current server from the emoji bank list? (y/n)"
|
||||
)
|
||||
else:
|
||||
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)"
|
||||
)
|
||||
|
||||
msg = await self.bot.wait_for("message", check=check)
|
||||
|
||||
if msg.content in ["N", "NO"]:
|
||||
if msg.content.upper() in ["N", "NO"]:
|
||||
await ctx.send("Cancelled")
|
||||
return
|
||||
|
||||
async with self.config.guildbanks() as guildbanks:
|
||||
if already_a_guildbank:
|
||||
guildbanks.remove(ctx.guild.id)
|
||||
else:
|
||||
guildbanks.append(ctx.guild.id)
|
||||
|
||||
await ctx.send("This server has been added as an emoji bank")
|
||||
if already_a_guildbank:
|
||||
await ctx.send("This server has been removed from being an emoji bank")
|
||||
else:
|
||||
await ctx.send("This server has been added to be an emoji bank")
|
||||
|
||||
@commands.Cog.listener()
|
||||
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")
|
||||
# print("Not a custom emoji")
|
||||
return
|
||||
|
||||
if not (await self.config.on()):
|
||||
print("Collecting is off")
|
||||
if not self.is_on:
|
||||
# print("Collecting is off")
|
||||
return
|
||||
|
||||
emoji = reaction.emoji
|
||||
emoji: discord.Emoji = reaction.emoji
|
||||
if emoji in self.bot.emojis:
|
||||
print("Emoji already in 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
|
||||
@ -99,30 +154,39 @@ class StealEmoji(Cog):
|
||||
guildbank = None
|
||||
banklist = await self.config.guildbanks()
|
||||
for guild_id in banklist:
|
||||
guild = self.bot.get_guild(guild_id)
|
||||
if len(guild.emojis) < 50:
|
||||
guild: discord.Guild = self.bot.get_guild(guild_id)
|
||||
# if len(guild.emojis) < 50:
|
||||
if await check_guild(guild, emoji):
|
||||
guildbank = guild
|
||||
break
|
||||
|
||||
if guildbank is None:
|
||||
print("No guildbank to store emoji")
|
||||
# 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")
|
||||
if str(emoji.id) in await self.config.stolemoji():
|
||||
# print("Emoji has already been stolen")
|
||||
return
|
||||
|
||||
# stolemojis = await self.config.stolemoji()
|
||||
#
|
||||
# print(stolemojis.keys())
|
||||
#
|
||||
# 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)
|
||||
# async with aiohttp.ClientSession() as session:
|
||||
# img = await fetch_img(session, emoji.url)
|
||||
|
||||
img = await emoji.url.read()
|
||||
|
||||
# path = data_manager.cog_data_path(cog_instance=self) / (emoji.name+ext)
|
||||
|
||||
@ -135,20 +199,23 @@ class StealEmoji(Cog):
|
||||
name=emoji.name, image=img, reason="Stole from " + str(user)
|
||||
)
|
||||
except discord.Forbidden as e:
|
||||
print("PermissionError - no permission to add emojis")
|
||||
# print("PermissionError - no permission to add emojis")
|
||||
raise PermissionError("No permission to add emojis") from e
|
||||
except discord.HTTPException as e:
|
||||
print("HTTPException exception")
|
||||
# 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)
|
||||
# e_attr_list = [a for a in dir(emoji) if not a.startswith("__")]
|
||||
|
||||
for k in e_dict:
|
||||
if k in save_dict:
|
||||
save_dict[k] = e_dict[k]
|
||||
for k in save_dict.keys():
|
||||
save_dict[k] = getattr(emoji, k, None)
|
||||
|
||||
# for k in e_attr_list:
|
||||
# if k in save_dict:
|
||||
# save_dict[k] = getattr(emoji, k, None)
|
||||
|
||||
save_dict["guildbank"] = guildbank.id
|
||||
|
||||
@ -156,6 +223,12 @@ class StealEmoji(Cog):
|
||||
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))
|
||||
notify_settings = await self.config.notify()
|
||||
if notify_settings:
|
||||
if notify_settings == 1:
|
||||
owner = await self.bot.application_info()
|
||||
target = owner.owner
|
||||
else:
|
||||
target = self.bot.get_channel(notify_settings)
|
||||
|
||||
await target.send(f"Just added emoji {emoji} to server {guildbank}")
|
||||
|
Loading…
x
Reference in New Issue
Block a user