edgar/edgarbot.py

211 lines
8.8 KiB
Python

import imessage
import re
import os
import random
import urllib
import urllib.request
from bs4 import BeautifulSoup
import pickle
from pprint import pprint
MESSAGE_CONTENT = 0
GUID = 1
weaponized = False
def save_obj(obj, name ):
with open('obj/'+ name + '.pkl', 'wb') as f:
pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)
def load_obj(name ):
with open('obj/' + name + '.pkl', 'rb') as f:
return pickle.load(f)
class Edgar():
def __init__(self):
mem_path = 'obj/memories.pkl'
if not os.path.exists(mem_path):
os.makedirs(os.path.dirname(mem_path), exist_ok=True)
self.memories = {}
save_obj(self.memories,'memories')
else:
self.memories = load_obj('memories')
song_path = 'obj/songs.pkl'
if not os.path.exists(song_path):
os.makedirs(os.path.dirname(song_path), exist_ok=True)
self.songs = {}
save_obj(self.songs,'songs')
else:
self.songs = load_obj('songs')
#send_message(self,string,chatid,noRobot=False)
def send_message(self, string, guid, noRobot=False):
string = string.replace("'", "")
string = string.replace('"', '')
faces = ["<I^_^I>", "<Io_oI>", "<I*_*I>", "<IO_OI>", "<I-_-I>", "<I0_0I>", "<Io_0I>", "<IU_UI>", "<I+_+I>", "<I=_=I>"]
if not noRobot:
string = random.choice(faces) + " " + string
body = """
osascript -e 'tell application "Messages"
set myid to "%s"
set mymessage to "%s"
set theBuddy to a reference to text chat id myid
send mymessage to theBuddy
end tell' """ % (guid, string)
print(body)
os.system(body)
def here(self, guid):
msg = "*Beep Boop* I am here!"
self.send_message(msg, guid)
def what_am_i(self, guid):
commands = ["Are you here? - Returns if I am running", "What are you? - Returns with help on how to use me", "Remember <key> is <value> - I will remember this relation", "What is <key> - I search my memories for a relation", "Odds <number> - I will generate 2 random numbers for odds within the range given", "Dog pic - returns a cute dog pic from the internet", "Set song of the week <url> <name> - sets that person's song of the week", "Song of the week <name>/all - gets a specific person/everyone's song of the week"]
msg = "I am a robot that lives inside of Dans texts. You can call me with @Edgar. \rI currently have the following commands:"
for i, com in enumerate(commands):
msg = msg + "\r" + com
self.send_message(msg, guid)
def remember(self, guid, string1, string2):
self.memories[string1.lower()] = string2
save_obj(self.memories, "memories")
msg = "Ok, I will remember " + string1 + " is " + string2
self.send_message(msg, guid)
def recall(self, guid, string1):
s1 = string1.lower()
if s1 in self.memories:
self.send_message(self.memories[s1], guid)
else:
msg = "Sorry, I dont have a memory for " + string1
self.send_message(msg, guid)
def set_song(self, guid, song, name):
if name == 'all':
msg = "All is reserved, sorry"
self.send_message(msg, guid)
else:
self.songs[name.lower()] = song
save_obj(self.songs, "songs")
msg = name + "s song of the week set as " + song
self.send_message(msg, guid)
def get_song(self, guid, name):
s1 = name.lower()
msg = ''
if s1 == 'all':
for key, value in self.songs.items():
msg = msg + "\r" + key + ": " + value
msg = msg + "\r *Beep Boop*"
self.send_message(msg, guid)
elif s1 in self.songs:
self.send_message(self.songs[s1], guid)
else:
msg = "Sorry, I dont have a song of the week for " + name
self.send_message(msg, guid)
def odds(self, guid, number):
if number < 1:
msg = "Odds must be with 1 or above"
self.send_message(msg, guid)
num1 = random.randint(1, number)
num2 = random.randint(1, number)
result = ""
if num1 == num2:
result = "I demand completion of the odds!!"
else:
result = "no dice."
msg = "%s and %s - %s" % (num1, num2, result)
self.send_message(msg, guid)
def dog_pic(self, guid):
url = 'https://imgur.com/r/dogpictures'
response = urllib.request.urlopen(url)
html = response.read()
soup = BeautifulSoup(html)
dogs = soup.findAll(attrs={'class':'image-list-link'})
dog = random.choice(dogs)
dog_url = dog.find('img')['src']
print(dog_url)
dog_url = dog_url.replace("//", "")
msg = dog_url.replace("b.", ".")
self.send_message("Enjoy your dog picture!", guid)
self.send_message(msg, guid, noRobot=True)
def read(self, message):
global weaponized
if not message[MESSAGE_CONTENT]:
pass
text = message[MESSAGE_CONTENT].text
date = message[MESSAGE_CONTENT].date
command = text.decode().split(" ")
guid = message[GUID]
print (command)
if(command[0] == "@Edgar" or command[0] == "@edgar"):
print (guid)
command.pop(0)
command = " ".join(command)
if re.match(r"are you here.*", command, re.IGNORECASE):
self.here(guid)
elif re.match(r"what are you.*", command, re.IGNORECASE):
self.what_am_i(guid)
elif re.match(r"remember .*? is .*?", command, re.IGNORECASE):
string1 = re.search(r"remember (.*?) is", command, re.IGNORECASE).group(1)
string2 = re.search(r"(.*? is )(.*?)$", command, re.IGNORECASE).group(2)
self.remember(guid, string1, string2)
elif re.match(r"what is .*?", command, re.IGNORECASE):
string1 = re.search(r"what is (.*?)\??$", command, re.IGNORECASE).group(1)
self.recall(guid, string1)
elif re.match(r"did you hear( a)? 4.*?", command, re.IGNORECASE):
msg = ["I heard a 4", "I definitely heard 4, anyone else hear a 4?", "*Beep Boop* Thats a yar darg"]
self.send_message(random.choice(msg), guid)
elif re.match(r"odds [0-9]*$", command, re.IGNORECASE):
number = [int(s) for s in command.split() if s.isdigit()][0]
self.odds(guid, number)
elif re.match(r"dog pic.*?", command, re.IGNORECASE):
self.dog_pic(guid)
elif re.match(r"song of the week .*?", command, re.IGNORECASE):
regex = re.search(r"song of the week (.*?)$", command, re.IGNORECASE)
name = regex.group(1)
self.get_song(guid, name)
elif re.match(r"set song of the week (.*?) (.*?)$", command, re.IGNORECASE):
regex = re.search(r"set song of the week (.*?) (.*?)$", command, re.IGNORECASE)
song = regex.group(1)
name = regex.group(2)
self.set_song(guid, song, name)
elif re.match(r"good bot.*?|thank you.*?|thanks.*?", command, re.IGNORECASE):
msg = "Glad I could be of assistance, meatbag. *Beep Boop*"
self.send_message(msg, guid)
elif re.match(r"dick pic.*?", command, re.IGNORECASE):
msg = "Enjoy your dick picture!"
self.send_message(msg, guid)
msg = "https://upload.wikimedia.org/wikipedia/commons/thumb/8/88/46_Dick_Cheney_3x4.jpg/1200px-46_Dick_Cheney_3x4.jpg"
self.send_message(msg, guid, noRobot=True)
elif re.match(r"arm the kitten cannon (\d{10})", command, re.IGNORECASE):
regex = re.search(r"arm the kitten cannon (\d{10})", command, re.IGNORECASE)
weaponized = regex.group(1)
msg = "Tater cat weaponized, sir, and aimed at +1%s" % (weaponized)
self.send_message(msg, guid)
elif re.match(r"fire.*?", command, re.IGNORECASE) and weaponized:
msg = "Locked on target. Commencing launch sequence"
self.send_message(msg, guid)
cannon = """
for ((i=1; i<=100; i++)); do
osascript -e 'tell application "Messages"
set myid to "iMessage;-;+1%s"
set ImageAttachment to POSIX file "./ammo.png" as alias
set theBuddy to a reference to text chat id myid
send ImageAttachment to theBuddy
end tell'
done
""" % (weaponized)
os.system(cannon)
weaponized = False
else:
self.send_message("I dont recognize that command. Text @Edgar what are you? for help", guid)