diff --git a/telegram_bot/bot.py b/telegram_bot/bot.py index fb56f77..b700e28 100644 --- a/telegram_bot/bot.py +++ b/telegram_bot/bot.py @@ -179,7 +179,7 @@ def send_id(message): bot.reply_to(message, answer) -#function that sends telegram status(running or offline) as message from telegram bot to user +#function that can be used to ensure that the bot is online and running @bot.message_handler(commands=['status', 'Status']) def send_status(message): @@ -276,28 +276,26 @@ def send_all_news(message): """ user_id = int(message.from_user.id) - keywords = api_handler.get_user_keywords(user_id) + keywords = api_handler.get_user_keywords(user_id) # get keywords of user - if keywords == None: + if keywords == None: # true if user is not registered bot.send_message(chat_id=user_id, text='This didn\'t work. Make sure to connect your telegram id (/id) on https://gruppe1.testsites.info') return - if not keywords: + if not keywords: # true if user is registered but does not have any keywords bot.send_message(chat_id=user_id, text='You have no keywords. Please add some keywords with /news') return - keywords_search = ' OR '.join(keywords) - print(keywords_search) - now = dt.datetime.now().date() - from_date = now - dt.timedelta(days=7) + keywords_search = ' OR '.join(keywords) # concat all keywords with OR -> NewsAPI can understand OR, AND, NOT etc. + now = dt.datetime.now().date() # get current date + from_date = now - dt.timedelta(days=7) # get date 7 days ago -> limit age of news to 7 days old max from_date_formatted = dt.datetime.strftime(from_date, '%Y-%m-%d') - print(from_date_formatted) - news_list = news.get_all_news_by_keyword(keywords_search, from_date_formatted)["articles"] + news_list = news.get_all_news_by_keyword(keywords_search, from_date_formatted)["articles"] # array of JSON article objects - if news_list: + if news_list: # true if news_list is not empty for article in news_list: formatted_article = news.format_article(article) - bot.send_message(chat_id=user_id, text=formatted_article, parse_mode="MARKDOWN") + bot.send_message(chat_id=user_id, text=formatted_article, parse_mode="MARKDOWN") # Markdown allows to write bold text with * etc. else: bot.send_message(chat_id=user_id, text='No news found for your keywords.') @@ -314,27 +312,27 @@ def send_news(message): :rtype: none """ user_id = int(message.from_user.id) - keywords = api_handler.get_user_keywords(user_id) + keywords = api_handler.get_user_keywords(user_id) # get keywords of user - if keywords == None: + if keywords == None: # true if user is not registered bot.send_message(chat_id=user_id, text='This didn\'t work. Make sure to connect your telegram id (/id) on https://gruppe1.testsites.info') return - if not keywords: + if not keywords: # true if user is registered but does not have any keywords bot.send_message(chat_id=user_id, text='You have no keywords. Please add some keywords with /addkeyword') return if keywords: for keyword in keywords: top_news = news.get_top_news_by_keyword(keyword)["articles"] - if top_news == None: + if top_news == None: # true if request to NewsAPI failed bot.send_message(chat_id=user_id, text='News Server did not respond correctly. Try again later.') return - if not top_news: + if not top_news: # true if no news found for keyword (empty list) bot.send_message(chat_id=user_id, text=f'No news found for keyword: *{keyword}*', parse_mode="MARKDOWN") return - formatted_article = news.format_article(top_news[0]) + formatted_article = news.format_article(top_news[0]) # only format and send most popular news bot.send_message(chat_id=user_id, text=f"_keyword: {keyword}_\n\n" + formatted_article, parse_mode="MARKDOWN") @@ -350,15 +348,14 @@ def add_keyword(message): """ user_id = int(message.from_user.id) bot.send_message(chat_id=user_id, text='Type keyword to add:') - bot.register_next_step_handler(message, store_keyword) + bot.register_next_step_handler(message, store_keyword) # wait for user to send keyword, then call store_keyword function def store_keyword(message): user_id = int(message.from_user.id) - print(str(user_id)) - keyword = str(message.text).lower() - status = api_handler.set_keyword(user_id, keyword) - if status == 200: - bot.send_message(chat_id=user_id, text=f'Keyword "{keyword}" added.') + keyword = str(message.text).lower() # lower to ensure Bitcoin and bitcoin is not stored as individual keywords + status = api_handler.set_keyword(user_id, keyword) # set keyword in database + if status == 200: # statuscode 200 means keyword was added successfully without errors + bot.send_message(chat_id=user_id, text=f'Keyword "{keyword}" added.') # duplicate keywords are denied by Database, so no need to check for that here else: bot.send_message(chat_id=user_id, text=f'Keyword "{keyword}" could not be stored. Make sure to connect your telegram id (/id) on https://gruppe1.testsites.info (statuscode {status})') @@ -375,14 +372,14 @@ def remove_keyword(message): """ user_id = int(message.from_user.id) bot.send_message(chat_id=user_id, text='Type keyword to remove:') - bot.register_next_step_handler(message, remove_keyword_step) + bot.register_next_step_handler(message, remove_keyword_step) # wait for user to send keyword to remove, then call remove_keyword_step function def remove_keyword_step(message): user_id = int(message.from_user.id) keyword = str(message.text).lower() status = api_handler.delete_keyword(user_id, keyword) - if status == 200: - bot.send_message(chat_id=user_id, text=f'Keyword "{keyword}" removed.') + if status == 200: # statuscode 200 means keyword was removed successfully without errors + bot.send_message(chat_id=user_id, text=f'Keyword "{keyword}" removed.') # checking if keyword to remove is in database are handled in database, not here else: bot.send_message(chat_id=user_id, text=f'Failed deleting keyword "{keyword}". (statuscode {status})') @@ -398,19 +395,19 @@ def send_keywords(message): :rtype: none """ user_id = int(message.from_user.id) - keywords = api_handler.get_user_keywords(user_id) - if keywords == None: + keywords = api_handler.get_user_keywords(user_id) # get keywords of user + if keywords == None: # true if user is not registered bot.send_message(chat_id=user_id, text='This didn\'t work. Make sure to connect your telegram id (/id) on https://gruppe1.testsites.info') return - if not keywords: + if not keywords: # true if user is registered but does not have any keywords bot.send_message(chat_id=user_id, text='No keywords set for this account. Add keywords by using /addkeyword') return - else: + else: # send keyword list keywords_str = ', '.join(keywords) bot.send_message(chat_id=user_id, text=f'Your keywords are: _{keywords_str}_', parse_mode="MARKDOWN") -@bot.message_handler(commands=['portfolio', 'Portfolio']) #tbd +@bot.message_handler(commands=['portfolio', 'Portfolio']) def send_portfolio(message): """ Send portfolio of user :type message: message object bot @@ -421,23 +418,23 @@ def send_portfolio(message): :rtype: none """ user_id = int(message.from_user.id) - portfolio = api_handler.get_user_portfolio(user_id) - if portfolio == None: + portfolio = api_handler.get_user_portfolio(user_id) # get portfolio of user as json + if portfolio == None: # true if user is not registered bot.send_message(chat_id=user_id, text='This didn\'t work. Make sure to connect your telegram id (/id) on https://gruppe1.testsites.info') return - if not portfolio: + if not portfolio: # true if user is registered but does not have any stocks in portfolio bot.send_message(chat_id=user_id, text='You do not have any stocks in your portfolio.') return - else: + else: # send portfolio for stock in portfolio: - comment = str(stock["comment"]) - count = "{:.2f}".format(float(stock["count"])) + comment = str(stock["comment"]) # comment may be written name of stock, comment is made by user when adding an stock to portfolio + count = "{:.2f}".format(float(stock["count"])) # round count to 2 decimal places isin = str(stock["isin"]) - worth = "{:.2f}".format(float(stock["current_price"]) * float(stock["count"])) - bot.send_message(chat_id=user_id, text=f'*{comment}*\n_{isin}_\namount: {count}\nworth: ${worth}', parse_mode="MARKDOWN") + worth = "{:.2f}".format(float(stock["current_price"]) * float(stock["count"])) # round current_price to 2 decimal places + bot.send_message(chat_id=user_id, text=f'*{comment}*\n_{isin}_\namount: {count}\nworth: ${worth}', parse_mode="MARKDOWN") # formatted message in markdown -@bot.message_handler(commands=['newtransaction', 'Newtransaction']) #tbd not working rn +@bot.message_handler(commands=['newtransaction', 'Newtransaction']) #tbd not working rn may be deleted in future def set_new_transaction(message): """ Set new transaction for user :type message: message object bot @@ -474,7 +471,7 @@ def set_new_transaction_step(message): bot.send_message(chat_id=user_id, text=f'Failed adding transaction. (statuscode {status})') -@bot.message_handler(commands=['interval', 'Interval']) #tbd +@bot.message_handler(commands=['interval', 'Interval']) def send_interval(message): """ send interval for user :type message: message object bot @@ -485,20 +482,20 @@ def send_interval(message): :rtype: none """ user_id = int(message.from_user.id) - user_data = api_handler.get_user(user_id) - if user_data == None: + user_data = api_handler.get_user(user_id) # get cron interval of user (stored in user data) + if user_data == None: # true if user is not registered in DB bot.send_message(chat_id=user_id, text='This didn\'t work. Make sure to connect your telegram id (/id) on https://gruppe1.testsites.info and set an interval with /setinterval') return - else: - interval = str(user_data['cron']) - if interval == 'None': + else: # send interval + interval = str(user_data['cron']) # get cron from user data + if interval == 'None': # true if user has no cron set bot.send_message(chat_id=user_id, text='You do not have an interval set. Set one with /setinterval') return - formatted_interval = str(interval).replace(' ', '_') + formatted_interval = str(interval).replace(' ', '_') # replace spaces with underscores to add to url of crontab.guru bot.send_message(chat_id=user_id, text=f'Your update interval: {interval} (https://crontab.guru/#{formatted_interval})') -@bot.message_handler(commands=['setinterval', 'Setinterval']) #tbd +@bot.message_handler(commands=['setinterval', 'Setinterval']) def set_new_interval(message): """ Set new interval for user :type message: message object bot @@ -510,19 +507,19 @@ def set_new_interval(message): """ user_id = int(message.from_user.id) bot.send_message(chat_id=user_id, text='Type interval in cron format:\n(https://crontab.guru/)') - bot.register_next_step_handler(message, set_new_interval_step) + bot.register_next_step_handler(message, set_new_interval_step) # executes function when user sends message def set_new_interval_step(message): user_id = int(message.from_user.id) interval = str(message.text) - status = api_handler.set_cron_interval(user_id, interval) + status = api_handler.set_cron_interval(user_id, interval) # send cron to db if status == 200: bot.send_message(chat_id=user_id, text='Interval succesfully set.') return - if status == -1: # only -1 when interval is invalid + if status == -1: # only -1 when interval is invalid, not a real statuscode, but used from api_handler.set_cron_interval to tell the crontab has the wrong format bot.send_message(chat_id=user_id, text='Invalid interval format. Try again with\n /setinterval.') return else: