Better folder structure, added a few ambient sensors
This commit is contained in:
@@ -1 +1,6 @@
|
||||
# Placeholder
|
||||
from . import keys
|
||||
from . import reddit
|
||||
from . import weather
|
||||
from . import reddit
|
||||
from . import search
|
||||
from . import metmuseum
|
@@ -1,20 +0,0 @@
|
||||
import googlesearch
|
||||
|
||||
|
||||
def query(params):
|
||||
param_string = ""
|
||||
for word in params:
|
||||
param_string += word + "+"
|
||||
param_string = param_string[:-1]
|
||||
search_url = "https://google.com/search?q=" + param_string
|
||||
|
||||
try:
|
||||
res = googlesearch.search(param_string.replace("+"," ") ,num=5,start=0,stop=5)
|
||||
send_string = "Results for <b>" + param_string.replace("+"," ") + "</b>:\n\n"
|
||||
for url in res:
|
||||
send_string += url + "\n\n"
|
||||
send_string += "Search url:\n" + search_url
|
||||
except:
|
||||
send_string = "Search url:\n" + search_url
|
||||
|
||||
return send_string
|
39
bot/api/metmuseum.py
Normal file
39
bot/api/metmuseum.py
Normal file
@@ -0,0 +1,39 @@
|
||||
import requests
|
||||
import random
|
||||
from PIL import Image
|
||||
import io
|
||||
|
||||
class ArtFetch:
|
||||
def __init__(self):
|
||||
self.base_url = "https://collectionapi.metmuseum.org/"
|
||||
self.objects = self.fetch_objects() # chosen set of images to select randomly
|
||||
|
||||
|
||||
def fetch_objects(self):
|
||||
"""We restrict ourselves to a few domains."""
|
||||
# fetch all departements
|
||||
t = requests.get(self.base_url + "public/collection/v1/departments").json()
|
||||
deps = t["departments"]
|
||||
keep_id = []
|
||||
for d in deps:
|
||||
name = d["displayName"]
|
||||
if name == "American Decorative Arts" or name == "Arts of Africa, Oceania, and the Americas" or name == "Asian Art" or name == "European Paintings":
|
||||
keep_id.append(str(d["departmentId"]))
|
||||
# fetch artworks listed under these departments
|
||||
data = {"departmentIds" : "|".join(keep_id)}
|
||||
t = requests.get(self.base_url + "public/collection/v1/objects",params=data).json()
|
||||
# num = t["total"]
|
||||
ids = t["objectIDs"]
|
||||
return ids
|
||||
|
||||
def get_random_art(self):
|
||||
"""Returns an image object of a randomly selected artwork"""
|
||||
# fetch the artwork's url
|
||||
r_id = self.objects[random.randint(0,len(self.objects))]
|
||||
t = requests.get(self.base_url + "public/collection/v1/objects/" + str(r_id)).json()
|
||||
im_url = t["primaryImageSmall"]
|
||||
# download the image
|
||||
resp = requests.get(im_url)
|
||||
img = Image.open(io.BytesIO(resp.content))
|
||||
|
||||
return img
|
@@ -1,50 +1,56 @@
|
||||
import praw
|
||||
try:
|
||||
import bot.api.keys as keys
|
||||
except:
|
||||
import keys
|
||||
|
||||
stream = praw.Reddit(client_id = keys.reddit_id, client_secret = keys.reddit_secret, user_agent=keys.reddit_user_agent)
|
||||
|
||||
def get_top(subreddit, number, return_type="text"):
|
||||
if return_type == "text":
|
||||
message = ""
|
||||
try:
|
||||
for submission in stream.subreddit(subreddit).top(limit=number):
|
||||
if not submission.stickied:
|
||||
message += "<b>" + submission.title + "</b>" + "\n" + submission.selftext + "\n\n\n"
|
||||
return message
|
||||
except:
|
||||
return "Api call failed, sorry"
|
||||
else:
|
||||
images = []
|
||||
try:
|
||||
for submission in stream.subreddit(subreddit).top(limit=number):
|
||||
if not submission.stickied:
|
||||
t = {"image": submission.url, "caption": submission.title}
|
||||
images.append(t)
|
||||
return images
|
||||
except:
|
||||
return ["Api call failed, sorry"]
|
||||
|
||||
|
||||
def get_random_rising(subreddit, number, return_type="text"):
|
||||
if return_type == "text":
|
||||
message = ""
|
||||
try:
|
||||
for submission in stream.subreddit(subreddit).random_rising(limit=number):
|
||||
if not submission.stickied:
|
||||
message += "<b>" + submission.title + "</b>" + "\n" + submission.selftext + "\n\n\n"
|
||||
return message
|
||||
except:
|
||||
return "Api call failed, sorry"
|
||||
else:
|
||||
images = []
|
||||
try:
|
||||
for submission in stream.subreddit(subreddit).random_rising(limit=number):
|
||||
if not submission.stickied:
|
||||
t = {"image": submission.url, "caption": submission.title}
|
||||
images.append(t)
|
||||
return images
|
||||
except:
|
||||
return ["Api call failed, sorry"]
|
||||
|
||||
class RedditFetch():
|
||||
def __init__(self, key):
|
||||
self.stream = praw.Reddit(client_id = key["id"], client_secret = key["secret"], user_agent=key["user_agent"])
|
||||
|
||||
def get_top(self, subreddit, number, return_type="text"):
|
||||
if return_type == "text":
|
||||
posts = []
|
||||
try:
|
||||
for submission in self.stream.subreddit(subreddit).top(limit=number):
|
||||
p = {}
|
||||
if not submission.stickied:
|
||||
p["title"] = submission.title
|
||||
p["content"] = submission.selftext
|
||||
posts.append(p)
|
||||
return posts
|
||||
except:
|
||||
return []
|
||||
else:
|
||||
images = []
|
||||
try:
|
||||
for submission in self.stream.subreddit(subreddit).top(limit=number):
|
||||
if not submission.stickied:
|
||||
t = {"image": submission.url, "caption": submission.title}
|
||||
images.append(t)
|
||||
return images
|
||||
except:
|
||||
return []
|
||||
|
||||
|
||||
def get_random_rising(self, subreddit, number, return_type="text"):
|
||||
if return_type == "text":
|
||||
posts = []
|
||||
try:
|
||||
for submission in self.stream.subreddit(subreddit).random_rising(limit=number):
|
||||
p = {}
|
||||
if not submission.stickied:
|
||||
p["title"] = submission.title
|
||||
p["content"] = submission.selftext
|
||||
posts.append(p)
|
||||
return posts
|
||||
except:
|
||||
return []
|
||||
else:
|
||||
images = []
|
||||
try:
|
||||
for submission in self.stream.subreddit(subreddit).random_rising(limit=number):
|
||||
if not submission.stickied:
|
||||
t = {"image": submission.url, "caption": submission.title}
|
||||
images.append(t)
|
||||
return images
|
||||
except:
|
||||
return []
|
||||
|
21
bot/api/search.py
Normal file
21
bot/api/search.py
Normal file
@@ -0,0 +1,21 @@
|
||||
import duckduckpy
|
||||
|
||||
class WebSearch():
|
||||
def __init__(self):
|
||||
self.search = duckduckpy.query
|
||||
|
||||
def get_result(self, query):
|
||||
try:
|
||||
res = []
|
||||
response = self.search(query, container = "dict")["related_topics"]
|
||||
for r in response:
|
||||
if "text" in r:
|
||||
res.append({
|
||||
"text" : r["text"],
|
||||
"url": r["first_url"]
|
||||
})
|
||||
except:
|
||||
res = ["Connection error"]
|
||||
return res
|
||||
|
||||
# TODO: this api has more potential. Extract images or quick facts!
|
@@ -1,150 +0,0 @@
|
||||
import emoji
|
||||
import requests
|
||||
import datetime
|
||||
|
||||
import bot.api.keys
|
||||
|
||||
|
||||
class TelegramIO():
|
||||
def __init__(self, persistence):
|
||||
"""Inits the Telegram-Interface
|
||||
"""
|
||||
self.base_url = "https://api.telegram.org/bot" + bot.api.keys.telegram_api + "/"
|
||||
self.persistence = persistence
|
||||
# Dynamic variables for answering
|
||||
self.chat_id = ""
|
||||
self.offset = 0
|
||||
self.message_id = ""
|
||||
self.message_queue = []
|
||||
|
||||
|
||||
def update_commands(self,commands):
|
||||
self.commands = commands
|
||||
|
||||
########################################################################
|
||||
"""Helper-Functions"""
|
||||
|
||||
|
||||
def fetch_updates(self):
|
||||
""""""
|
||||
update_url = self.base_url + "getUpdates"
|
||||
data = {"offset":self.offset}
|
||||
|
||||
try:
|
||||
result = requests.post(update_url,data=data)
|
||||
result = result.json()["result"]
|
||||
self.message_queue = result
|
||||
except:
|
||||
result = []
|
||||
|
||||
return len(result)
|
||||
|
||||
|
||||
def process_message(self):
|
||||
"""Inspects the first message from self.message_queue and reacts accordingly."""
|
||||
message_data = self.message_queue.pop(0)
|
||||
|
||||
self.increase_counter("receive_activity")
|
||||
|
||||
self.offset = message_data["update_id"] + 1
|
||||
|
||||
if "edited_message" in message_data:
|
||||
return
|
||||
|
||||
message = message_data["message"]
|
||||
self.message_id = message["message_id"]
|
||||
self.chat_id = message["chat"]["id"]
|
||||
author = message["from"]
|
||||
|
||||
if str(author["id"]) not in self.persistence["bot"]["chat_members"]:
|
||||
name = ""
|
||||
if "first_name" in author:
|
||||
name += author["first_name"] + " "
|
||||
if "last_name" in author:
|
||||
name += author["last_name"]
|
||||
if len(name) == 0:
|
||||
name = "anonymous"
|
||||
self.persistence["bot"]["chat_members"][str(author["id"])] = name # seems like the conversion to string is handled implicitly, but it got me really confused
|
||||
self.send_message("Welcome to this chat " + name + "!")
|
||||
|
||||
if "text" in message:
|
||||
print("Chat said: ", emoji.demojize(message["text"]))
|
||||
|
||||
if "entities" in message:
|
||||
for entry in message["entities"]:
|
||||
if entry["type"] == "bot_command":
|
||||
return message["text"] #self.handle_command(message["text"][1:])
|
||||
|
||||
elif "photo" in message:
|
||||
print("Photo received, what do I do?")
|
||||
|
||||
return
|
||||
|
||||
|
||||
def send_thinking_note(self):
|
||||
data = {
|
||||
"chat_id" : self.chat_id,
|
||||
"action" : "typing",
|
||||
}
|
||||
send_url = self.base_url + "sendChatAction"
|
||||
try:
|
||||
r = requests.post(send_url, data=data)
|
||||
except:
|
||||
print("Could not show that I'm thinking =(")
|
||||
|
||||
|
||||
def send_message(self, message):
|
||||
|
||||
if message == "" or message == None:
|
||||
return
|
||||
|
||||
print("SENDING: " + message)
|
||||
# message = message.replace("<","<").replace(">", ">")
|
||||
# TODO: sanitize input but keep relevant tags
|
||||
data = {
|
||||
'chat_id': self.chat_id,
|
||||
'text': emoji.emojize(message),
|
||||
"parse_mode": "HTML",
|
||||
"reply_to_message_id" : self.message_id,
|
||||
}
|
||||
|
||||
send_url = self.base_url + "sendMessage"
|
||||
try:
|
||||
r = requests.post(send_url, data=data)
|
||||
if (r.status_code != 200):
|
||||
raise Exception
|
||||
|
||||
self.increase_counter("send_activity")
|
||||
except:
|
||||
out = datetime.datetime.now().strftime("%d.%m.%y - %H:%M")
|
||||
out += " @ " + "telegram.send_message"
|
||||
out += " --> " + "did not send:\n" + message
|
||||
self.persistence["bot"]["log"] += [out]
|
||||
|
||||
|
||||
def send_photo(self, url, caption):
|
||||
print("SENDING PHOTO: " + url)
|
||||
data = {
|
||||
'chat_id': self.chat_id,
|
||||
'photo': url,
|
||||
"parse_mode": "HTML",
|
||||
"reply_to_message_id" : self.message_id,
|
||||
'caption' : caption,
|
||||
}
|
||||
send_url = self.base_url + "sendPhoto"
|
||||
try:
|
||||
r = requests.post(send_url, data=data)
|
||||
self.increase_counter("send_activity")
|
||||
except:
|
||||
out = datetime.datetime.now().strftime("%d.%m.%y - %H:%M")
|
||||
out += " @ " + "telegram.send_photo"
|
||||
out += " --> " + "did not send:\n" + url
|
||||
self.persistence["bot"]["log"] += [out]
|
||||
|
||||
def increase_counter(self, counter_name):
|
||||
current_hour = int(datetime.datetime.now().timestamp() // 3600)
|
||||
if len(self.persistence["bot"][counter_name]["hour"]) == 0 or current_hour != self.persistence["bot"][counter_name]["hour"][-1]:
|
||||
self.persistence["bot"][counter_name]["hour"].append(current_hour)
|
||||
self.persistence["bot"][counter_name]["count"].append(1)
|
||||
else:
|
||||
self.persistence["bot"][counter_name]["count"][-1] += 1
|
@@ -1,14 +1,13 @@
|
||||
import requests
|
||||
import bot.api.keys
|
||||
import datetime
|
||||
|
||||
class WeatherFetch():
|
||||
def __init__(self):
|
||||
def __init__(self, key):
|
||||
self.last_fetch = datetime.datetime.fromtimestamp(0)
|
||||
self.last_weather = ""
|
||||
|
||||
self.url = "https://api.openweathermap.org/data/2.5/onecall?"
|
||||
self.key = bot.api.keys.weather_api
|
||||
self.key = key
|
||||
|
||||
def show_weather(self, location):
|
||||
delta = datetime.datetime.now() - self.last_fetch
|
||||
@@ -59,3 +58,25 @@ class WeatherFetch():
|
||||
ret_weather = self.last_weather
|
||||
|
||||
return ret_weather
|
||||
|
||||
# def get_weather_by_city(self, city):
|
||||
# loc = get_coords_from_city(self, city)
|
||||
# weather = self.show_weather(loc)
|
||||
# return weather
|
||||
|
||||
|
||||
# def get_coords_from_city(self, city):
|
||||
# url = "https://devru-latitude-longitude-find-v1.p.rapidapi.com/latlon.php"
|
||||
# data = {"location": city}
|
||||
# headers = {
|
||||
# "x-rapidapi-key" : "d4e0ab7ab3mshd5dde5a282649e0p11fd98jsnc93afd98e3aa",
|
||||
# "x-rapidapi-host" : "devru-latitude-longitude-find-v1.p.rapidapi.com",
|
||||
# }
|
||||
|
||||
# #try:
|
||||
# resp = requests.request("GET", url, headers=headers, params=data)
|
||||
# result = resp.text
|
||||
# #except:
|
||||
# # result = "???"
|
||||
# return result
|
||||
|
||||
|
Reference in New Issue
Block a user