import discord from discord.ext import commands from .utils.dataIO import dataIO from .utils import checks import os import aiohttp # if this seem hard to read/understand, remove the comments. Might make it easier class Sadface: """D:""" def __init__(self,bot): self.bot = bot self.url = "https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/1x" self.sadLoaded = os.path.exists('data/sadface/sadface.png') self.image = "data/sadface/sadface.png" self.servers = dataIO.load_json("data/sadface/servers.json") # doesn't make sense to use this command in a pm, because pms aren't in servers # mod_or_permissions needs something in it otherwise it's mod or True which is always True @commands.command(pass_context=True, no_pm=True) @checks.mod_or_permissions(manage_roles=True) async def sadface(self, ctx): """Enables/Disables sadface for this server""" #default off. server = ctx.message.server if server.id not in self.servers: self.servers[server.id] = False else: self.servers[server.id] = not self.servers[server.id] #for a toggle, settings should save here in case bot fails to send message dataIO.save_json("data/sadface/servers.json", self.servers) if self.servers[server.id]: await self.bot.say("Sadface on. Please turn this off in the Red - DiscordBot server. This is only an example cog.") else: await self.bot.say("Sadface off.") async def check_sad(self, message): # check if setting is on in this server #let sadfaces happen in PMs always server = message.server if server != None: if server.id not in self.servers: #default off self.servers[server.id] = False # sadface is off, so ignore if not self.servers[server.id]: return # comments explaining next section. seemed easier to read this way # check for a phrase in message # if sadface isn't downloaded yet, dl it # try # get image from url # write image to file # it worked \o/ # send it # except # there was a problem, print an error then try to send the url instead # else sadface image already downloaded, send it if "D:" in message.content.split(): if not self.sadLoaded: try: async with aiohttp.get(self.url) as r: image = await r.content.read() with open('data/sadface/sadface.png','wb') as f: f.write(image) self.sadLoaded = os.path.exists('data/sadface/sadface.png') await self.bot.send_file(message.channel,self.image) except Exception as e: print(e) print("Sadface error D: I couldn't download the file, so we're gonna use the url instead") await self.bot.send_message(message.channel,self.url) else: await self.bot.send_file(message.channel,self.image) def check_folders(): # create data/sadface if not there if not os.path.exists("data/sadface"): print("Creating data/sadface folder...") os.makedirs("data/sadface") def check_files(): # create server.json if not there # put in default values default = {} if not os.path.isfile("data/sadface/servers.json"): print("Creating default sadface servers.json...") dataIO.save_json("data/sadface/servers.json", default) def setup(bot): check_folders() check_files() n = Sadface(bot) # add an on_message listener bot.add_listener(n.check_sad, "on_message") bot.add_cog(n)