303 lines
11 KiB
Python
303 lines
11 KiB
Python
import lxml.etree # Used by imageFunc
|
||
import re # Used by roll_dice
|
||
import datetime # Used by helloFunc
|
||
import json # Used by spellFunc
|
||
import random # Used by imageFunc
|
||
import urllib # Used by imageFunc
|
||
import imdb # Used by movieFunc
|
||
import time # Used for logging
|
||
import logging # Used for... you know... logging
|
||
import wikia # Used by findWikiPage
|
||
import os
|
||
|
||
from .roll import dice
|
||
|
||
logging.basicConfig(filename="gwendolyn.log", level=logging.INFO)
|
||
|
||
# Capitalizes all words except some of them
|
||
no_caps_list = ["of","the"]
|
||
def cap(s):
|
||
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-aprpriate 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(message : str, channel = ""):
|
||
localtime = time.asctime(time.localtime(time.time()))
|
||
channel = channel.replace("Direct Message with ","")
|
||
if channel == "":
|
||
print(localtime+" - "+message)
|
||
logging.info(localtime+" - "+message)
|
||
else:
|
||
print(localtime+" ("+channel+") - "+message)
|
||
logging.info(localtime+" ("+channel+") - "+message)
|
||
|
||
# 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 makeFiles():
|
||
# Creates swcharacters.json if it doesn't exist
|
||
try:
|
||
f = open("resources/starWars/swcharacters.json","r")
|
||
except:
|
||
logThis("swcharacters.json didn't exist. Making it now.")
|
||
emptyDict = {}
|
||
with open("resources/starWars/swcharacters.json","w") as f:
|
||
json.dump(emptyDict,f,indent = 4)
|
||
finally:
|
||
f.close()
|
||
|
||
# Creates games.json if it doesn't exist
|
||
try:
|
||
f = open("resources/games/games.json","r")
|
||
except:
|
||
logThis("games.json didn't exist. Making it now.")
|
||
data = {"trivia questions":{},"blackjack games":{},"4 in a row games": {},"users":{}}
|
||
with open("resources/games/games.json","w") as f:
|
||
json.dump(data,f,indent = 4)
|
||
finally:
|
||
f.close()
|
||
|
||
# Creates monsters.json if it doesn't exist
|
||
try:
|
||
f = open("resources/lookup/monsters.json","r")
|
||
except:
|
||
logThis("monsters.json didn't exist. Making it now.")
|
||
with open("resources/lookup/lookupExamples.json") as f:
|
||
data = json.load(f)["monster"]
|
||
with open("resources/lookup/monsters.json","w") as f:
|
||
json.dump(data,f,indent = 4)
|
||
finally:
|
||
f.close()
|
||
|
||
# Creates spells.json if it doesn't exist
|
||
try:
|
||
f = open("resources/lookup/spells.json","r")
|
||
except:
|
||
logThis("spells.json didn't exist. Making it now.")
|
||
with open("resources/lookup/lookupExamples.json") as f:
|
||
data = json.load(f)["spell"]
|
||
with open("resources/lookup/spells.json","w") as f:
|
||
json.dump(data,f,indent = 4)
|
||
finally:
|
||
f.close()
|
||
|
||
# Creates destinyPoints.txt if it doesn't exist
|
||
try:
|
||
f = open("resources/starWars/destinyPoints.txt","r")
|
||
except:
|
||
logThis("destinyPoints.txt didn't exist. Making it now.")
|
||
with open("resources/starWars/destinyPoints.txt","w") as f:
|
||
f.write("")
|
||
finally:
|
||
f.close()
|
||
|
||
# Creates token.txt if it doesn't exist
|
||
try:
|
||
f = open("token.txt","r")
|
||
except:
|
||
logThis("token.txt didn't exist. Write your bot token below, or in token.txt later.")
|
||
token = input()
|
||
with open("token.txt","w") as f:
|
||
f.write(token)
|
||
|
||
finally:
|
||
f.close()
|
||
|
||
# Creates the blackjacktables foulder if it doesn't exist
|
||
if os.path.isdir("resources/games/blackjackTables") == False:
|
||
os.makedirs("resources/games/blackjackTables")
|
||
logThis("The tables directory didn't exist")
|
||
|
||
# Creates the 4InARowBoards foulder if it doesn't exist
|
||
if os.path.isdir("resources/games/4InARowBoards") == False:
|
||
os.makedirs("resources/games/4InARowBoards")
|
||
logThis("The 4 in a row boards directory didn't exist")
|
||
|
||
# Creates the oldImages foulder if it doesn't exist
|
||
if os.path.isdir("resources/games/oldImages") == False:
|
||
os.makedirs("resources/games/oldImages")
|
||
logThis("The old images directory didn't exist")
|
||
|
||
# Creates the blackjackCards foulder if it doesn't exist
|
||
if os.path.isdir("resources/games/blackjackCards") == False:
|
||
os.makedirs("resources/games/blackjackCards")
|
||
logThis("The blackjack cards directory didn't exist")
|
||
|
||
# Creates the hilo foulder if it doesn't exist
|
||
if os.path.isdir("resources/games/hilo") == False:
|
||
os.makedirs("resources/games/hilo")
|
||
logThis("The hi-lo directory didn't exist")
|
||
|
||
# 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 emojiToNumber(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
|
||
else: return ""
|
||
|
||
def fiarReactionTest(channel,message,user):
|
||
with open("resources/games/games.json", "r") as f:
|
||
data = json.load(f)
|
||
|
||
with open("resources/games/oldImages/fourInARow"+str(channel), "r") as f:
|
||
oldImage = int(f.read())
|
||
|
||
if message.id == oldImage:
|
||
logThis("They reacted to the fourinarow game")
|
||
turn = data["4 in a row games"][str(channel)]["turn"]
|
||
if user.lower() == data["4 in a row games"][str(channel)]["players"][turn].lower():
|
||
if user != data["4 in a row games"][str(channel)]["players"][turn]:
|
||
data["4 in a row games"][str(channel)]["players"][turn] = user
|
||
with open("resources/games/games.json","w") as f:
|
||
json.dump(data,f,indent=4)
|
||
return True, turn+1
|
||
else:
|
||
logThis("It wasn't their turn")
|
||
return False, 0
|
||
else:
|
||
return False, 0
|
||
|
||
def stopServer():
|
||
with open("resources/games/games.json","r") as f:
|
||
data = json.load(f)
|
||
|
||
data["trivia questions"] = {}
|
||
data["blackjack games"] = {}
|
||
data["4 in a row games"] = {}
|
||
|
||
with open("resources/games/games.json","w") as f:
|
||
json.dump(data,f,indent=4)
|
||
|
||
def deleteGame(gameType,channel):
|
||
with open("resources/games/games.json", "r") as f:
|
||
data = json.load(f)
|
||
|
||
del data[gameType][channel]
|
||
with open("resources/games/games.json", "w") as f:
|
||
json.dump(data,f,indent=4)
|