from typing import Union import lxml.etree # Used by imageFunc import datetime # Used by helloFunc import json # Used by spellFunc import random # Used by imageFunc import urllib # Used by imageFunc import time # Used for logging import logging # Used for... you know... logging import wikia # Used by findWikiPage import os # Used by makeFiles logging.basicConfig(filename="gwendolyn.log", level=logging.INFO) # Capitalizes all words except some of them no_caps_list = ["of","the"] def cap(s): # Capitalizes a strink like a movie title word_number = 0 lst = s.split() res = '' for word in lst: word_number += 1 if word not in no_caps_list or word_number == 1: word = word.capitalize() res += word+" " res = res[:-1] return res 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 # Responds with a greeting of a time-appropriate maner def helloFunc(author): 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)) 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)) 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)) 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)) else: return("Why hello, "+str(author)) # Finds a random picture online def imageFunc(): # Picks a type of camera, which decides the naming scheme try: cams = ("one","two","three","four") cam = random.choice(cams) logThis("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) except: logThis("error picking camera type (error code 702)") logThis("Searching for "+search) # Searches for the image and reads the resulting web page try: 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 = "thumb"]/@href') # Picks an image number = random.randint(1,len(images))-1 image = images[number] logThis("Picked image number "+str(number)) # Returns the image logThis("Successfully returned an image") except: image = "Couldn't connect to bing (error code 701)" logThis("Couldn't connect to bing (error code 701)") return(image) def logThis(messages : Union[str, list], channel = "", level = 20): localtime = time.asctime(time.localtime(time.time())) channel = channel.replace("Direct Message with ","") if type(messages) is str: messages = [messages] for x, msg in enumerate(messages): if channel == "": messages[x] = localtime+" - "+msg else: messages[x] = localtime+" ("+channel+") - "+msg if len(messages) == 1: messages[0] += " (details in log)" if level != 10: print(messages[0]) for logMessage in messages: logging.log(level, logMessage) # Finds a page from the Senkulpa Wikia def findWikiPage(search : str): logThis("Trying to find wiki page for "+search) wikia.set_lang("da") searchResults = wikia.search("senkulpa",search) if len(searchResults) > 0: try: searchResult = searchResults[0].replace(",","%2C") logThis("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" return page.title, content, image else: return page.title, content, "" except: logThis("Fucked up (error code 1001)") return "", "Sorry. Fucked that one up (error code 1001)", "" else: logThis("Couldn't find the page (error code 1002)") return "", "Couldn't find page (error code 1002)", "" def makeJsonFile(path,content): # Creates json file if it doesn't exist try: f = open(path,"r") except: logThis(path.split("/")[-1]+" didn't exist. Making it now.") with open(path,"w") as f: json.dump(content,f,indent = 4) finally: f.close() def makeTxtFile(path,content): # Creates txt file if it doesn't exist try: f = open(path,"r") except: logThis(path.split("/")[-1]+" didn't exist. Making it now.") with open(path,"w") as f: f.write(content) finally: f.close() def makeFolder(path): if os.path.isdir(path) == False: os.makedirs(path) logThis("The "+path.split("/")[-1]+" directory didn't exist") def makeFiles(): with open("resources/startingFiles.json") as f: data = json.load(f) for path, content in data["json"].items(): makeJsonFile(path,content) for path, content in data["txt"].items(): makeTxtFile(path,content) for path in data["folder"]: makeFolder(path) # Replaces multiple things with the same thing def replaceMultiple(mainString, toBeReplaces, newString): # Iterate over the strings to be replaced for elem in toBeReplaces : # Check if string is in the main string if elem in mainString : # Replace the string mainString = mainString.replace(elem, newString) return mainString def emojiToCommand(emoji): if emoji == "1️⃣": return 1 elif emoji == "2️⃣": return 2 elif emoji == "3️⃣": return 3 elif emoji == "4️⃣": return 4 elif emoji == "5️⃣": return 5 elif emoji == "6️⃣": return 6 elif emoji == "7️⃣": return 7 elif emoji == "🎲": return "roll" elif emoji == "❌": return "none" elif emoji == "✔️": return 1 else: return ""