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
	 Remy Moll
					Remy Moll