added comments in bot

This commit is contained in:
Linus E 2022-04-25 18:25:22 +02:00
parent eab129fce8
commit 6fae531c1c

View File

@ -179,7 +179,7 @@ def send_id(message):
bot.reply_to(message, answer) 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']) @bot.message_handler(commands=['status', 'Status'])
def send_status(message): def send_status(message):
@ -276,28 +276,26 @@ def send_all_news(message):
""" """
user_id = int(message.from_user.id) 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') 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 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') bot.send_message(chat_id=user_id, text='You have no keywords. Please add some keywords with /news')
return return
keywords_search = ' OR '.join(keywords) keywords_search = ' OR '.join(keywords) # concat all keywords with OR -> NewsAPI can understand OR, AND, NOT etc.
print(keywords_search) now = dt.datetime.now().date() # get current date
now = dt.datetime.now().date() from_date = now - dt.timedelta(days=7) # get date 7 days ago -> limit age of news to 7 days old max
from_date = now - dt.timedelta(days=7)
from_date_formatted = dt.datetime.strftime(from_date, '%Y-%m-%d') 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"] # array of JSON article objects
news_list = news.get_all_news_by_keyword(keywords_search, from_date_formatted)["articles"]
if news_list: if news_list: # true if news_list is not empty
for article in news_list: for article in news_list:
formatted_article = news.format_article(article) 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: else:
bot.send_message(chat_id=user_id, text='No news found for your keywords.') bot.send_message(chat_id=user_id, text='No news found for your keywords.')
@ -314,27 +312,27 @@ def send_news(message):
:rtype: none :rtype: none
""" """
user_id = int(message.from_user.id) 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') 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 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') bot.send_message(chat_id=user_id, text='You have no keywords. Please add some keywords with /addkeyword')
return return
if keywords: if keywords:
for keyword in keywords: for keyword in keywords:
top_news = news.get_top_news_by_keyword(keyword)["articles"] 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.') bot.send_message(chat_id=user_id, text='News Server did not respond correctly. Try again later.')
return 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") bot.send_message(chat_id=user_id, text=f'No news found for keyword: *{keyword}*', parse_mode="MARKDOWN")
return 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") 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) user_id = int(message.from_user.id)
bot.send_message(chat_id=user_id, text='Type keyword to add:') 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): def store_keyword(message):
user_id = int(message.from_user.id) user_id = int(message.from_user.id)
print(str(user_id)) keyword = str(message.text).lower() # lower to ensure Bitcoin and bitcoin is not stored as individual keywords
keyword = str(message.text).lower() status = api_handler.set_keyword(user_id, keyword) # set keyword in database
status = api_handler.set_keyword(user_id, keyword) if status == 200: # statuscode 200 means keyword was added successfully without errors
if status == 200: 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
bot.send_message(chat_id=user_id, text=f'Keyword "{keyword}" added.')
else: 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})') 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) user_id = int(message.from_user.id)
bot.send_message(chat_id=user_id, text='Type keyword to remove:') 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): def remove_keyword_step(message):
user_id = int(message.from_user.id) user_id = int(message.from_user.id)
keyword = str(message.text).lower() keyword = str(message.text).lower()
status = api_handler.delete_keyword(user_id, keyword) status = api_handler.delete_keyword(user_id, keyword)
if status == 200: if status == 200: # statuscode 200 means keyword was removed successfully without errors
bot.send_message(chat_id=user_id, text=f'Keyword "{keyword}" removed.') 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: else:
bot.send_message(chat_id=user_id, text=f'Failed deleting keyword "{keyword}". (statuscode {status})') 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 :rtype: none
""" """
user_id = int(message.from_user.id) 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') 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 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') bot.send_message(chat_id=user_id, text='No keywords set for this account. Add keywords by using /addkeyword')
return return
else: else: # send keyword list
keywords_str = ', '.join(keywords) keywords_str = ', '.join(keywords)
bot.send_message(chat_id=user_id, text=f'Your keywords are: _{keywords_str}_', parse_mode="MARKDOWN") 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): def send_portfolio(message):
""" Send portfolio of user """ Send portfolio of user
:type message: message object bot :type message: message object bot
@ -421,23 +418,23 @@ def send_portfolio(message):
:rtype: none :rtype: none
""" """
user_id = int(message.from_user.id) user_id = int(message.from_user.id)
portfolio = api_handler.get_user_portfolio(user_id) portfolio = api_handler.get_user_portfolio(user_id) # get portfolio of user as json
if portfolio == None: 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') 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 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.') bot.send_message(chat_id=user_id, text='You do not have any stocks in your portfolio.')
return return
else: else: # send portfolio
for stock in portfolio: for stock in portfolio:
comment = str(stock["comment"]) 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"])) count = "{:.2f}".format(float(stock["count"])) # round count to 2 decimal places
isin = str(stock["isin"]) isin = str(stock["isin"])
worth = "{:.2f}".format(float(stock["current_price"]) * float(stock["count"])) 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") 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): def set_new_transaction(message):
""" Set new transaction for user """ Set new transaction for user
:type message: message object bot :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.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): def send_interval(message):
""" send interval for user """ send interval for user
:type message: message object bot :type message: message object bot
@ -485,20 +482,20 @@ def send_interval(message):
:rtype: none :rtype: none
""" """
user_id = int(message.from_user.id) user_id = int(message.from_user.id)
user_data = api_handler.get_user(user_id) user_data = api_handler.get_user(user_id) # get cron interval of user (stored in user data)
if user_data == None: 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') 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 return
else: else: # send interval
interval = str(user_data['cron']) interval = str(user_data['cron']) # get cron from user data
if interval == 'None': 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') bot.send_message(chat_id=user_id, text='You do not have an interval set. Set one with /setinterval')
return 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.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): def set_new_interval(message):
""" Set new interval for user """ Set new interval for user
:type message: message object bot :type message: message object bot
@ -510,19 +507,19 @@ def set_new_interval(message):
""" """
user_id = int(message.from_user.id) 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.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): def set_new_interval_step(message):
user_id = int(message.from_user.id) user_id = int(message.from_user.id)
interval = str(message.text) 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: if status == 200:
bot.send_message(chat_id=user_id, text='Interval succesfully set.') bot.send_message(chat_id=user_id, text='Interval succesfully set.')
return 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.') bot.send_message(chat_id=user_id, text='Invalid interval format. Try again with\n /setinterval.')
return return
else: else: