197 lines
7.4 KiB
Python
197 lines
7.4 KiB
Python
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 .bedre_netflix import BedreNetflix
|
|
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:
|
|
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.bedre_netflix = BedreNetflix(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:
|
|
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 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 (error code 1002)")
|
|
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)
|
|
|