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

154 lines
5.0 KiB

import asyncio
7 years ago
import aiohttp
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
@stealemoji.command(name="bank")
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"
7 years ago
"Are you sure you want to make the current server an emoji bank? (y/n)")
7 years ago
def check(m):
7 years ago
return m.content.upper() in ["Y","YES","N","NO"] and m.channel == ctx.channel and m.author == ctx.author
7 years ago
7 years ago
msg = await self.bot.wait_for('message', check=check)
7 years ago
7 years ago
if msg.content in ["N","NO"]:
7 years ago
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:
7 years ago
print("Not a custom emoji")
return
if not (await self.config.on()):
7 years ago
print("Collecting is off")
return
emoji = reaction.emoji
if emoji in self.bot.emojis:
7 years ago
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()
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:
7 years ago
print("No guildbank to store emoji")
# 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:
7 years ago
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]
7 years ago
7 years ago
async with aiohttp.ClientSession() as session:
img = await fetch_img(session, emoji.url)
7 years ago
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()?