diff --git a/source/bot.py b/source/bot.py index 5dfd647..19779b6 100644 --- a/source/bot.py +++ b/source/bot.py @@ -26,6 +26,7 @@ import pandas from db import User, session, Product, Score from fetcher import * +import helper_functions as hf load_dotenv(dotenv_path='.env') # load environment variables @@ -486,12 +487,22 @@ def time_in_range(start, end, current): """Returns whether current is in the range [start, end]""" # docstring is missing!!!!! return start <= current <= end +def find_todays_product_from_db(): + """Find todays product from db based on todays_product + """ + product = None + for element in session.query(Product).all(): + if element.todays_product: + product = element + break + return product + @bot.message_handler(commands=['daily', 'Daily']) def daily_message(message): - """change user name + """send daily challenge Args: - message (Message): Message from telegram user, here /changename + message (Message): Message from telegram user, here /daily Returns: None: None @@ -528,6 +539,35 @@ def daily_message(message): iteration-=1 time.sleep(1) + product_for_today=find_todays_product_from_db() + bot.send_message(chat_id=user_id, text=str(hf.make_markdown_proof(product_for_today.image_link)), parse_mode="MARKDOWNV2") + start_time = time.time() + bot.register_next_step_handler((message,start_time), get_user_guess) + +def get_time_difference(start_time, end_time): + """Get time difference + """ + return end_time - start_time + +def get_user_guess(message, start_time): + """Get users guess after typing /daily + + Args: + message (Message): Message element to react to. In this case next step after /daily + start_time (time.time): Time the user got the image + """ + end_time = time.time() + user_id = int(message.from_user.id) + user_guess = str(message.text) + if get_time_difference(start_time, end_time) > 35: + bot.send_message(chat_id=user_id, text="You took too long to guess.\n" + "No more tries today.") + return + else: + message_text=f"You guessed {user_guess}€" + bot.send_message(chat_id=user_id, text = message_text) + + @bot.message_handler(commands=['addproduct', 'Addproduct']) diff --git a/source/daily_challenge.py b/source/daily_challenge.py index 1ea71f9..420ee17 100644 --- a/source/daily_challenge.py +++ b/source/daily_challenge.py @@ -9,14 +9,14 @@ __license__ = "None" import time import sys -from apscheduler.schedulers.background import BackgroundScheduler import pandas import random +from apscheduler.schedulers.background import BackgroundScheduler + from bot import bot from db import User, session, Product - CHALLENGE_READY = "0 8 * * *" CHALLENGE_OVER = "0 22 * * *" GET_NEW_PRODUCT = "0 0 * * *" @@ -52,7 +52,7 @@ def start_challenges(): ,args = ("over", )) # Get new product - my_scheduler.add_job(get_todays_product, 'cron'\ + my_scheduler.add_job(set_todays_product, 'cron'\ ,day_of_week = new_product_split[4] \ , hour= new_product_split[1] \ , minute = new_product_split[0]\ @@ -65,20 +65,42 @@ def start_challenges(): my_scheduler.shutdown() start_challenges() -def get_todays_product(): + +def set_todays_product(): """Get a random product from the database Returns: Product: random product """ + + # Find old product and set todays_product false + products = [] for element in session.query(Product).all(): - products.append(element) + if element.todays_product: + element.todays_product = False + session.commit() + products.append(element) + else: + products.append(element) # choose random product random_product = products[int(len(products) * random.random())] - return random_product + # find product_id in db and delete element + session.query(Product).filter(Product.product_id == random_product.product_id).delete() + + # insert with todays_product True + product=Product( + product_id=random_product.product_id, + price=random_product.price, + image_link=random_product.image_link, + title=random_product.title, + todays_product=True + ) + + session.add(product) + session.commit() def send_current_event(str_event): @@ -102,9 +124,7 @@ def send_current_event(str_event): if __name__ == "__main__": - send_current_event("start") - time.sleep(10) - + set_todays_product() try: start_challenges() sys.exit(-1) diff --git a/source/db.py b/source/db.py index a15a797..652a040 100644 --- a/source/db.py +++ b/source/db.py @@ -49,10 +49,11 @@ class Product(Base): title = Column(String(5000)) description = Column(String(5000)) date = Column(DateTime) + todays_product = Column(Boolean) def __repr__(self): - return "" % ( - self.product_id, self.price, self.image_link, self.title, self.description, self.date) + return "" % ( + self.product_id, self.price, self.image_link, self.title, self.description, self.date, self.todays_product) # Create all tables by issuing CREATE TABLE commands to the DB. diff --git a/source/helper_functions.py b/source/helper_functions.py new file mode 100644 index 0000000..0b75ef7 --- /dev/null +++ b/source/helper_functions.py @@ -0,0 +1,70 @@ +""" +script for helper functions for bot related stuff +""" +__author__ = "Florian Kellermann, Linus Eickhoff, Florian Kaiser" +__date__ = "28.05.2022" +__version__ = "1.0.0" +__license__ = "None" + + +def contains_markdownv1_symbols(text): + """ checks if text contains markdown symbols + :type text: string + + :param text: text to check + + :return: true if text contains markdown symbols + + :rtype: bool + """ + if text.find("_") != -1 or text.find("*") != -1 or text.find("`") != -1: # check if text contains relevant markdown symbols + return True + + return False + + +def make_markdown_proof(text): # used to avoid errors related to markdown parsemode for telegram messaging + """ makes text markdown proof + :type text: string + + :param text: text to make markdown proof + + :return: markdown proof text + + :rtype: string + """ + text = str(text) + + text = text.replace("_", "\\_") # replace _ with \_ because \ is used as escape character in markdown, double escape is needed because \ is also a escape character in strings + text = text.replace("*", "\\*") + text = text.replace("`", "\\`") + text = text.replace("[", "\\[") + text = text.replace("]", "\\]") + text = text.replace("(", "\\(") + text = text.replace(")", "\\)") + text = text.replace("#", "\\#") + text = text.replace("+", "\\+") + text = text.replace("-", "\\-") + text = text.replace("!", "\\!") + text = text.replace(".", "\\.") + text = text.replace("?", "\\?") + text = text.replace("/", "\\/") + text = text.replace("~", "\\~") + text = text.replace("|", "\\|") + text = text.replace("<", "\\<") + text = text.replace(">", "\\>") + text = text.replace("&", "\\&") + text = text.replace("^", "\\^") + text = text.replace("$", "\\$") + text = text.replace("%", "\\%") + text = text.replace("=", "\\=") + text = text.replace("@", "\\@") + + return text + + +if __name__ == '__main__': + print("this is a module for helper functions for the bot and should not be run directly") + print(make_markdown_proof("_test_")) + text = make_markdown_proof("_test_") + print(f"{text}")