From 682a20f62ddacbfbf55631d8fdf9100bbe6d7081 Mon Sep 17 00:00:00 2001 From: NikolajDanger Date: Tue, 6 Apr 2021 11:02:12 +0200 Subject: [PATCH] :sparkles: Converted misc functionality to slash commands --- Gwendolyn.py | 14 +++++++ cogs/MiscCog.py | 66 +++++------------------------ funcs/other/bedreNetflix.py | 6 +++ funcs/other/generators.py | 9 ++-- funcs/other/other.py | 83 +++++++++++++++++++++++++++---------- 5 files changed, 96 insertions(+), 82 deletions(-) diff --git a/Gwendolyn.py b/Gwendolyn.py index 0494ec4..22a3daf 100644 --- a/Gwendolyn.py +++ b/Gwendolyn.py @@ -36,6 +36,20 @@ class Gwendolyn(commands.Bot): def log(self, messages, channel : str = "", level : int = 20): logThis(messages, channel, level) + async def stop(self, ctx): + if f"#{ctx.author.id}" in self.options.admins: + await ctx.send("Pulling git repo and restarting...") + + await self.change_presence(status = discord.Status.offline) + + self.databaseFuncs.stopServer() + + self.log("Logging out", level = 25) + await self.logout() + else: + self.log(f"{ctx.author.display_name} tried to stop me! (error code 201)",str(ctx.channel_id)) + await ctx.send(f"I don't think I will, {ctx.author.display_name} (error code 201)") + if __name__ == "__main__": diff --git a/cogs/MiscCog.py b/cogs/MiscCog.py index 2fb6be0..7b4d940 100644 --- a/cogs/MiscCog.py +++ b/cogs/MiscCog.py @@ -2,16 +2,9 @@ import discord, codecs, string, json from discord.ext import commands from discord_slash import cog_ext -from utils import Options +from utils import getParams -with open("resources/slashParameters.json", "r") as f: - params = json.load(f) - -options = Options() - -if options.testing: - for p in params: - params[p]["guild_ids"] = options.guildIds +params = getParams() class MiscCog(commands.Cog): def __init__(self, bot): @@ -30,33 +23,12 @@ class MiscCog(commands.Cog): # Restarts the bot @cog_ext.cog_slash(**params["stop"]) async def stop(self, ctx): - if "#"+str(ctx.author.id) in self.bot.options.admins: - await ctx.send("Pulling git repo and restarting...") - - await self.bot.change_presence(status = discord.Status.offline) - - self.bot.databaseFuncs.stopServer() - - self.bot.log("Logging out.") - await self.bot.logout() - else: - self.bot.log(f"{ctx.author.display_name} tried to stop me! (error code 201)",str(ctx.channel_id)) - await ctx.send(f"I don't think I will, {ctx.author.display_name} (error code 201)") + await self.bot.stop(ctx) # Gets help for specific command @cog_ext.cog_slash(**params["help"]) async def helpCommand(self, ctx, command = ""): - if command == "": - with codecs.open("resources/help/help.txt",encoding="utf-8") as f: - text = f.read() - em = discord.Embed(title = "Help", description = text,colour = 0x59f442) - await ctx.send(embed = em) - else: - self.bot.log(f"Looking for help-{command}.txt",str(ctx.channel_id)) - with codecs.open(f"resources/help/help-{command}.txt",encoding="utf-8") as f: - text = f.read() - em = discord.Embed(title = command.capitalize(), description = text,colour = 0x59f442) - await ctx.send(embed = em) + await self.bot.other.helpFunc(ctx, command) # Lets you thank the bot @cog_ext.cog_slash(**params["thank"]) @@ -66,67 +38,51 @@ class MiscCog(commands.Cog): # Sends a friendly message @cog_ext.cog_slash(**params["hello"]) async def hello(self, ctx): - await ctx.send(self.bot.other.helloFunc(ctx.author.display_name)) + await self.bot.other.helloFunc(ctx) # Rolls dice @cog_ext.cog_slash(**params["roll"]) async def roll(self, ctx, dice = "1d20"): - await ctx.send(self.bot.other.rollDice(ctx.author.display_name, dice)) + await self.bot.other.rollDice(ctx, dice) # Sends a random image @cog_ext.cog_slash(**params["image"]) async def image(self, ctx): - await ctx.defer() - await ctx.send(self.bot.other.imageFunc()) + await self.bot.other.imageFunc(ctx) # Finds a random movie @cog_ext.cog_slash(**params["movie"]) - async def movie(self,ctx): + async def movie(self, ctx): await self.bot.other.movieFunc(ctx) # Generates a random name @cog_ext.cog_slash(**params["name"]) async def name(self, ctx): - await ctx.send(self.generators.nameGen()) + await self.generators.nameGen(ctx) # Generates a random tavern name @cog_ext.cog_slash(**params["tavern"]) async def tavern(self, ctx): - await ctx.send(self.generators.tavernGen()) + await self.generators.tavernGen(ctx) # Finds a page on the Senkulpa wiki @cog_ext.cog_slash(**params["wiki"]) async def wiki(self, ctx, wikiPage): - await ctx.defer() - command = string.capwords(wikiPage) - title, content, thumbnail = self.bot.otherfindWikiPage(command) - if title != "": - self.bot.log("Sending the embedded message",str(ctx.channel_id)) - content += "\n[Læs mere](https://senkulpa.fandom.com/da/wiki/"+title.replace(" ","_")+")" - embed = discord.Embed(title = title, description = content, colour=0xDEADBF) - if thumbnail != "": - embed.set_thumbnail(url=thumbnail) - - await ctx.send(embed = embed) - else: - await ctx.send(content) + await self.bot.other.findWikiPage(ctx, wikiPage) #Searches for movie and adds it to Bedre Netflix @cog_ext.cog_slash(**params["addMovie"]) async def addMovie(self, ctx, movie): - await ctx.defer() await self.bedreNetflix.requestMovie(ctx, movie) #Searches for show and adds it to Bedre Netflix @cog_ext.cog_slash(**params["addShow"]) async def addShow(self, ctx, show): - await ctx.defer() await self.bedreNetflix.requestShow(ctx, show) #Returns currently downloading torrents @cog_ext.cog_slash(**params["downloading"]) async def downloading(self, ctx, parameters = "-d"): - await ctx.defer() await self.bedreNetflix.downloading(ctx, parameters) #Looks up on Wolfram Alpha diff --git a/funcs/other/bedreNetflix.py b/funcs/other/bedreNetflix.py index 7c98520..3870a42 100644 --- a/funcs/other/bedreNetflix.py +++ b/funcs/other/bedreNetflix.py @@ -13,6 +13,8 @@ class BedreNetflix(): #Returns a list of no more than 5 options when user requests a movie async def requestMovie(self, ctx, movieName): + await ctx.defer() + self.bot.log("Searching for "+movieName) movieList = imdb.IMDb().search_movie(movieName) movies = [] @@ -89,6 +91,8 @@ class BedreNetflix(): #Returns a list of no more than 5 options when user requests a show async def requestShow(self, ctx, showName): + await ctx.defer() + self.bot.log("Searching for "+showName) movies = imdb.IMDb().search_movie(showName) #Replace with tvdb shows = [] @@ -301,6 +305,8 @@ class BedreNetflix(): await ctx.send("```"+messageText[:cutOffIndex]+"```") await SendLongMessage(ctx,messageText[cutOffIndex+1:]) + await ctx.defer() + # showDM, showMovies, showShows, episodes params = [False, False, False, False] showDMArgs = ["d", "dm", "downloading", "downloadmanager"] diff --git a/funcs/other/generators.py b/funcs/other/generators.py index febe219..37f66f9 100644 --- a/funcs/other/generators.py +++ b/funcs/other/generators.py @@ -15,7 +15,7 @@ class Generators(): yield (corpus[i], corpus[i+1], corpus[i+2]) # Generates a random name - def nameGen(self): + async def nameGen(self, ctx): # Makes a list of all names from "names.txt" names = open('resources/names.txt', encoding='utf8').read() corpus = list(names) @@ -74,11 +74,12 @@ class Generators(): done = True genName = "".join(chain) self.bot.log("Generated "+genName[:-1]) + # Returns the name - return(genName) + await ctx.send(genName) # Generates a random tavern name - def tavernGen(self): + async def tavernGen(self, ctx): # Lists first parts, second parts and third parts of tavern names fp = ["The Silver","The Golden","The Staggering","The Laughing","The Prancing","The Gilded","The Running","The Howling","The Slaughtered","The Leering","The Drunken","The Leaping","The Roaring","The Frowning","The Lonely","The Wandering","The Mysterious","The Barking","The Black","The Gleaming","The Tap-Dancing","The Sad","The Sexy","The Artificial","The Groovy","The Merciful","The Confused","The Pouting","The Horny","The Okay","The Friendly","The Hungry","The Handicapped","The Fire-breathing","The One-Eyed","The Psychotic","The Mad","The Evil","The Idiotic","The Trusty","The Busty"] sp = ["Eel","Dolphin","Dwarf","Pegasus","Pony","Rose","Stag","Wolf","Lamb","Demon","Goat","Spirit","Horde","Jester","Mountain","Eagle","Satyr","Dog","Spider","Star","Dad","Rat","Jeremy","Mouse","Unicorn","Pearl","Ant","Crab","Penguin","Octopus","Lawyer","Ghost","Toad","Handjob","Immigrant","SJW","Dragon","Bard","Sphinx","Soldier","Salmon","Owlbear","Kite","Frost Giant","Arsonist"] @@ -89,4 +90,4 @@ class Generators(): self.bot.log("Generated "+genTav) # Return the name - return(genTav) + await ctx.send(genTav) diff --git a/funcs/other/other.py b/funcs/other/other.py index 90bff31..c4a6290 100644 --- a/funcs/other/other.py +++ b/funcs/other/other.py @@ -10,6 +10,8 @@ from .bedreNetflix import BedreNetflix from .nerdShit import NerdShit from .generators import Generators +from utils import cap + class MyStringifier(d20.MarkdownStringifier): def _str_expression(self, node): if node.comment == None: @@ -57,29 +59,31 @@ class Other(): await ctx.send(embed = embed) # Responds with a greeting of a time-appropriate maner - def helloFunc(self, author): + async def helloFunc(self, ctx): def time_in_range(start, end, x): # Return true if x is in the range [start, end] if start <= end: return start <= x <= end else: return start <= x or x <= end + + author = ctx.author.display_name now = datetime.datetime.now() if time_in_range(now.replace(hour=5, minute=0, second=0, microsecond=0),now.replace(hour=10, minute=0, second=0, microsecond=0), now): - return("Good morning, "+str(author)) - elif time_in_range(now.replace(hour=10, minute=0, second=0, microsecond=0),now.replace(hour=13, minute=0, second=0, microsecond=0), now): - return("Good day, "+str(author)) + sendMessage = "Good morning, "+str(author) elif time_in_range(now.replace(hour=13, minute=0, second=0, microsecond=0),now.replace(hour=18, minute=0, second=0, microsecond=0), now): - return("Good afternoon, "+str(author)) + sendMessage = "Good afternoon, "+str(author) elif time_in_range(now.replace(hour=18, minute=0, second=0, microsecond=0),now.replace(hour=22, minute=0, second=0, microsecond=0), now): - return("Good evening, "+str(author)) + sendMessage = "Good evening, "+str(author) elif time_in_range(now.replace(hour=22, minute=0, second=0, microsecond=0),now.replace(hour=23, minute=59, second=59, microsecond=0), now): - return("Good night, "+str(author)) + sendMessage = "Good night, "+str(author) else: - return("Hello, "+str(author)) + sendMessage = "Hello, "+str(author) + + await ctx.send(sendMessage) # Finds a random picture online - def imageFunc(self): + async def imageFunc(self, ctx): # Picks a type of camera, which decides the naming scheme cams = ("one","two","three","four") cam = random.choice(cams) @@ -113,22 +117,31 @@ class Other(): tree = lxml.etree.HTML(read) images = tree.xpath('//a[@class = "thumb"]/@href') - # Picks an image - number = random.randint(1,len(images))-1 - image = images[number] + if len(images) == 0: + await ctx.send("Found no images") + else: + # Picks an image + number = random.randint(1,len(images))-1 + image = images[number] - self.bot.log("Picked image number "+str(number)) + self.bot.log("Picked image number "+str(number)) - # Returns the image - self.bot.log("Successfully returned an image") - return(image) + # Returns the image + self.bot.log("Successfully returned an image") + + await ctx.send(image) # Finds a page from the Senkulpa Wikia - def findWikiPage(self, search : str): + async def findWikiPage(self, ctx, search : str): + await ctx.defer() + search = cap(search) + foundPage = False + self.bot.log("Trying to find wiki page for "+search) wikia.set_lang("da") searchResults = wikia.search("senkulpa",search) if len(searchResults) > 0: + foundPage = True searchResult = searchResults[0].replace(",","%2C") self.bot.log("Found page \""+searchResult+"\"") page = wikia.page("senkulpa",searchResult) @@ -137,15 +150,39 @@ class Other(): images = page.images if len(images) > 0: image = images[len(images)-1]+"/revision/latest?path-prefix=da" - return page.title, content, image else: - return page.title, content, "" + image = "" else: - self.bot.log("Couldn't find the page (error code 1002)") - return "", "Couldn't find page (error code 1002)", "" + self.bot.log("Couldn't find the page") + await ctx.send("Couldn't find page (error code 1002)") - def rollDice(self, user, rollString): + if foundPage: + self.bot.log("Sending the embedded message",str(ctx.channel_id)) + content += f"\n[Læs mere]({page.url})" + embed = discord.Embed(title = page.title, description = content, colour=0xDEADBF) + if image != "": + embed.set_thumbnail(url=image) + + await ctx.send(embed = embed) + + async def rollDice(self, ctx, rollString): + user = ctx.author.display_name while len(rollString) > 1 and rollString[0] == " ": rollString = rollString[1:] - return user+" :game_die:\n"+str(d20.roll(rollString, allow_comments=True,stringifier=MyStringifier())) + + roll = d20.roll(rollString, allow_comments=True, stringifier=MyStringifier()) + await ctx.send(f"{user} :game_die:\n{roll}") + + async def helpFunc(self, ctx, command): + if command == "": + with open("resources/help/help.txt",encoding="utf-8") as f: + text = f.read() + em = discord.Embed(title = "Help", description = text,colour = 0x59f442) + await ctx.send(embed = em) + else: + self.bot.log(f"Looking for help-{command}.txt",str(ctx.channel_id)) + with open(f"resources/help/help-{command}.txt",encoding="utf-8") as f: + text = f.read() + em = discord.Embed(title = command.capitalize(), description = text,colour = 0x59f442) + await ctx.send(embed = em)