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 wikia # Used in findWikiPage import d20 # Used in rollDice import ast 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: resultText = "Result" else: resultText = node.comment.capitalize() return f"**{resultText}**: {self._stringify(node.roll)}\n**Total**: {int(node.total)}" class Other(): def __init__(self, bot): self.bot = bot self.bedreNetflix = BedreNetflix(self.bot) self.nerdShit = NerdShit(self.bot) self.generators = Generators(self.bot) # Picks a random movie and returns information about it async def movieFunc(self, ctx): await ctx.defer() self.bot.log("Creating IMDb object") imdbClient = imdb.IMDb() self.bot.log("Picking a movie") with open("resources/movies.txt", "r") as f: movieList = f.read().split("\n") movieName = random.choice(movieList) self.bot.log(f"Searching for {movieName}") searchResult = imdbClient.search_movie(movieName) 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): 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): 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): 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): sendMessage = "Good night, "+str(author) else: sendMessage = "Hello, "+str(author) await ctx.send(sendMessage) # 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 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) content = page.content.replace(u'\xa0', u' ').split("\n")[0] images = page.images if len(images) > 0: image = images[len(images)-1]+"/revision/latest?path-prefix=da" else: image = "" else: self.bot.log("Couldn't find the page") await ctx.send("Couldn't find page (error code 1002)") 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:] 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)