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

146 lines
4.6 KiB

import asyncio
from urllib.parse import urlparse
import os
from typing import List, Union
import discord
from discord.ext import commands
from redbot.core import Config
from redbot.core.bot import Red
7 years ago
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()
7 years ago
class StealEmoji:
"""
This cog steals emojis and creates servers for them
"""
def __init__(self, red: Red):
self.bot = red
self.config = Config.get_conf(self, identifier=11511610197108101109111106105)
default_global = {
"stolemoji": {},
"guildbanks": [],
"on": False
}
default_stolemoji = {
"guildbank": None,
"name": None,
"require_colons": False,
"managed": False,
"guild_id": None,
"created_at": None,
"url": None,
"roles": [],
"guild": None # Will not save this one
}
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:
await ctx.send_help()
@stealemoji.command(name="collect")
async def se_collect(self, ctx):
"""Toggles whether emoji's are collected or not"""
currSetting = await self.config.on()
await self.config.on.set(not currSetting)
await ctx.send("Collection is now "+str(not currSetting))
7 years ago
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 upper(m.content) in ["Y","YES","N","NO"] and m.channel == ctx.channel and m.author == ctx.author
msg = await client.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"""
7 years ago
if not reaction.custom_emoji:
return
if not (await self.config.on()):
return
emoji = reaction.emoji
if emoji in self.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()
7 years ago
for guild_id in banklist:
guild = self.bot.get_guild(guild_id)
if len(guild.emojis)<50:
guildbank = guild
break
7 years ago
if guildbank is None:
# Eventually make a new banklist
return
# Next, have I saved this emoji before (in self.bot.emojis should've done this)
stolemojis = await self.config.stolemoji()
if emoji.id in stolemojis:
return
# Alright, time to steal it for real
path = urlparse(emoji.url).path
ext = os.path.splitext(path)[1]
7 years ago
img = await fetch_img(emoji.url)
with open("\\cogs\\stealemoji\\"+emoji.name+ext, "wb") as f:
f.write(img)
# urllib.urlretrieve(emoji.url, emoji.name+ext)
try:
7 years ago
await guildbank.create_custom_emoji(name=emoji.name,image="\\cogs\\stealemoji\\"+emoji.name+ext,reason="Stole from "+str(user))
except Forbidden as e:
7 years ago
print("PermissionError - no permission to add emojis")
raise PermissionError("No permission to add emojis") from e
except HTTPException:
7 years ago
print("Unhandled exception")
pass # Unhandled error
# If you get this far, YOU DID IT
owner = await self.bot.application_info()
owner = owner.owner
await owner.send("Just added emoji "+str(emoji)+" to server "+str(guildbank))
7 years ago
# add to config.stolemoji()?