import imdb # Used in movieFunc import random # Used in movieFunc import discord # Used in movieFunc import datetime # Used in helloFunc import urllib # Used in imageFunc import lxml # Used in imageFunc import fandom # Used in findWikiPage import d20 # Used in rollDice import ast from .plex import Plex from .nerd_shit import NerdShit from .generators import Generators from gwendolyn.utils import cap fandom.set_lang("da") fandom.set_wiki("senkulpa") class MyStringifier(d20.MarkdownStringifier): def _str_expression(self, node): if node.comment == None: result_text = "Result" else: result_text = node.comment.capitalize() return f"**{result_text}**: {self._stringify(node.roll)}\n**Total**: {int(node.total)}" class Other(): def __init__(self, bot): self.bot = bot self.plex = Plex(self.bot) self.nerd_shit = NerdShit(self.bot) self.generators = Generators(self.bot) # Picks a random movie and returns information about it async def movieFunc(self, ctx): await self.bot.defer(ctx) self.bot.log("Creating IMDb object") imdbClient = imdb.IMDb() self.bot.log("Picking a movie") with open("gwendolyn/resources/movies.txt", "r") as f: movie_list = f.read().split("\n") movie_name = random.choice(movie_list) self.bot.log(f"Searching for {movie_name}") searchResult = imdbClient.search_movie(movie_name) self.bot.log("Getting the data") movie = searchResult[0] imdbClient.update(movie) self.bot.log("Successfully ran /movie") title = movie["title"] plot = movie['plot'][0].split("::")[0] cover = movie['cover url'].replace("150","600").replace("101","404") cast = ", ".join([i["name"] for i in movie['cast'][:5]]) embed = discord.Embed(title=title, description=plot, color=0x24ec19) embed.set_thumbnail(url=cover) embed.add_field(name="Cast", value=cast,inline = True) await ctx.send(embed = embed) # Responds with a greeting of a time-appropriate maner 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): send_message = "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): send_message = "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): send_message = "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): send_message = "Good night, "+str(author) else: send_message = "Hello, "+str(author) await ctx.send(send_message) # Finds a random picture online async def imageFunc(self, ctx): # Picks a type of camera, which decides the naming scheme cams = ("one","two","three","four") cam = random.choice(cams) self.bot.log("Chose cam type "+cam) if cam == "one": a = str(random.randint(0 ,9)) b = str(random.randint(0,9)) c = str(random.randint(0,9)) d = str(random.randint(0,9)) search = ("img_"+a+b+c+d) elif cam == "two": a = str(random.randint(2012,2016)) b = str(random.randint(1,12)).zfill(2) c = str(random.randint(1,29)).zfill(2) search = ("IMG_"+a+b+c) elif cam == "three": a = str(random.randint(1,500)).zfill(4) search = ("IMAG_"+a) elif cam == "four": a = str(random.randint(0,9)) b = str(random.randint(0,9)) c = str(random.randint(0,9)) d = str(random.randint(0,9)) search = ("DSC_"+a+b+c+d) self.bot.log("Searching for "+search) # Searches for the image and reads the resulting web page page = urllib.request.urlopen("https://www.bing.com/images/search?q="+search+"&safesearch=off") read = page.read() tree = lxml.etree.HTML(read) images = tree.xpath('//a[@class = "iusc"]/@m') if len(images) == 0: await ctx.send("Found no images") else: # Picks an image number = random.randint(1,len(images))-1 image = ast.literal_eval(str(images[number])) imageUrl = image["murl"] self.bot.log("Picked image number "+str(number)) # Returns the image self.bot.log("Successfully returned an image") await ctx.send(imageUrl) # Finds a page from the Senkulpa Wikia async def findWikiPage(self, ctx, search : str): await self.bot.defer(ctx) foundPage = False if search != "": self.bot.log("Trying to find wiki page for "+search) searchResults = fandom.search(search) if len(searchResults) > 0: foundPage = True searchResult = searchResults[0] else: self.bot.log("Couldn't find the page") await ctx.send("Couldn't find page") else: foundPage = True self.bot.log("Searching for a random page") searchResult = fandom.random() if foundPage: self.bot.log(f"Found page \"{searchResult[0]}\"") page = fandom.page(pageid = searchResult[1]) content = page.summary images = page.images if len(images) > 0: image = images[0] else: image = "" 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:] 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("gwendolyn/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"gwendolyn/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)