diff --git a/documentation/database/structure_database.png b/documentation/database/structure_database.png
index 4265215..d7d459d 100644
Binary files a/documentation/database/structure_database.png and b/documentation/database/structure_database.png differ
diff --git a/documentation/database/structure_database.uxf b/documentation/database/structure_database.uxf
index afdf01e..3f3aaf2 100644
--- a/documentation/database/structure_database.uxf
+++ b/documentation/database/structure_database.uxf
@@ -9,30 +9,18 @@ password varchar(255)
username varchar(255)
telegram_user_id varchar(255)
admin tinyint(1)
-cron varchar(20)
-UMLClass70515021090shares
+UMLClass70515021070shares
--
PK: a_id int(11)
FK: email varchar(255)
-isin varchar(255)
-comment varchar(255)UMLClass135150210130transaction
+symbol varchar(255)
+UMLClass135150210130transaction
--
PK: t_id int(11)
FK: email varchar(255)
-isin varchar(255)
-comment varchar(255)
+symbol varchar(255)
time datetime
count int(11)
price float
Relation335190110100lt=<<-
-group=110;10;60;10;60;80;90;80Relation625190100100lt=<<-80;10;50;10;50;80;10;80Relation625260100160lt=<<-80;140;50;140;50;10;10;10UMLClass14041010030Database V0.1UMLClass70515021090shares
---
-PK: a_id int(11)
-FK: email varchar(255)
-isin varchar(255)
-comment varchar(255)UMLClass14030021090share_price
---
-PK: id int(11)
-isin varchar(255)
-price float
-date datetime
\ No newline at end of file
+group=110;10;60;10;60;80;90;80Relation625190100100lt=<<-80;10;50;10;50;80;10;80Relation625260100160lt=<<-80;140;50;140;50;10;10;10UMLClass14041010030Database V0.1
\ No newline at end of file
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 993b3a2..a9bfceb 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -14,14 +14,14 @@
"@angular/compiler": "~13.2.0",
"@angular/core": "~13.2.0",
"@angular/forms": "~13.2.0",
- "@angular/material": "^13.3.4",
+ "@angular/material": "^13.3.3",
"@angular/platform-browser": "~13.2.0",
"@angular/platform-browser-dynamic": "~13.2.0",
"@angular/router": "~13.2.0",
"bootstrap": "^5.1.3",
"ngx-cron-editor": "^0.7.3",
"rxjs": "~7.5.0",
- "tslib": "^2.4.0",
+ "tslib": "^2.3.0",
"zone.js": "~0.11.4"
},
"devDependencies": {
@@ -29,9 +29,9 @@
"@angular/cli": "~13.3.3",
"@angular/compiler-cli": "~13.2.0",
"@types/jasmine": "~4.0.3",
- "@types/node": "^17.0.27",
+ "@types/node": "^17.0.25",
"jasmine-core": "~4.1.0",
- "karma": "~6.3.19",
+ "karma": "~6.3.18",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage": "~2.2.0",
"karma-jasmine": "~5.0.0",
@@ -213,12 +213,6 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true
},
- "node_modules/@angular-devkit/build-angular/node_modules/tslib": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
- "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
- "dev": true
- },
"node_modules/@angular-devkit/build-webpack": {
"version": "0.1303.3",
"resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1303.3.tgz",
@@ -301,6 +295,51 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true
},
+ "node_modules/@angular-devkit/core": {
+ "version": "13.3.3",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.3.tgz",
+ "integrity": "sha512-lfQwY9LuVRwcNVzGmyPcwOpb3CAobP4T+c3joR1LLIPS5lzcM0oeCE2bon9N52Ktn4Q/pH98dVtjWL+jSrUADw==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "8.9.0",
+ "ajv-formats": "2.1.1",
+ "fast-json-stable-stringify": "2.1.0",
+ "magic-string": "0.25.7",
+ "rxjs": "6.6.7",
+ "source-map": "0.7.3"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.15.0 || >=16.10.0",
+ "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
+ "yarn": ">= 1.13.0"
+ },
+ "peerDependencies": {
+ "chokidar": "^3.5.2"
+ },
+ "peerDependenciesMeta": {
+ "chokidar": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@angular-devkit/core/node_modules/rxjs": {
+ "version": "6.6.7",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+ "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.9.0"
+ },
+ "engines": {
+ "npm": ">=2.0.0"
+ }
+ },
+ "node_modules/@angular-devkit/core/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
"node_modules/@angular-devkit/schematics": {
"version": "13.3.3",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.3.tgz",
@@ -352,9 +391,9 @@
}
},
"node_modules/@angular/cdk": {
- "version": "13.3.4",
- "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.4.tgz",
- "integrity": "sha512-im4LKxJaIuqFVzmtf650PoiYsn/SZlvBV2zEgzusK8HwQ24C1Lya7NQSApwl8k43h4eKO1OvUKBjqL5uDgEQag==",
+ "version": "13.3.3",
+ "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.3.tgz",
+ "integrity": "sha512-dzd31mta2VwffxbeO4CelMqb7WswLnkC/r2QZXySnc0CTmj44HqXkqdZuEvVgxaKRVpxsYeuBuhhhy8U00YMOw==",
"dependencies": {
"tslib": "^2.3.0"
},
@@ -584,15 +623,15 @@
}
},
"node_modules/@angular/material": {
- "version": "13.3.4",
- "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.3.4.tgz",
- "integrity": "sha512-jK9rWmBaPrE+3re6uIdyvG5DCzc47VUvnP1DqblNnpaa8GCKllb1cFRGqa5GPYB1/96d3wO+RPwzhC06qqV+yw==",
+ "version": "13.3.3",
+ "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.3.3.tgz",
+ "integrity": "sha512-PkZ7VW3/7tqdBHSOOmq7com7Ir147OEe1+kfgF/G3y8WUutI9jY2cHKARXGWB+5WgcqKr7ol43u239UGkPfFHg==",
"dependencies": {
"tslib": "^2.3.0"
},
"peerDependencies": {
"@angular/animations": "^13.0.0 || ^14.0.0-0",
- "@angular/cdk": "13.3.4",
+ "@angular/cdk": "13.3.3",
"@angular/common": "^13.0.0 || ^14.0.0-0",
"@angular/core": "^13.0.0 || ^14.0.0-0",
"@angular/forms": "^13.0.0 || ^14.0.0-0",
@@ -2737,9 +2776,9 @@
"dev": true
},
"node_modules/@types/node": {
- "version": "17.0.27",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.27.tgz",
- "integrity": "sha512-4/Ke7bbWOasuT3kceBZFGakP1dYN2XFd8v2l9bqF2LNWrmeU07JLpp56aEeG6+Q3olqO5TvXpW0yaiYnZJ5CXg==",
+ "version": "17.0.25",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.25.tgz",
+ "integrity": "sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==",
"dev": true
},
"node_modules/@types/parse-json": {
@@ -6962,9 +7001,9 @@
]
},
"node_modules/karma": {
- "version": "6.3.19",
- "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.19.tgz",
- "integrity": "sha512-NDhWckzES/Y9xMiddyU1RzaKL76/scCsu8Mp0vR0Z3lQRvC3p72+Ab4ppoxs36S9tyPNX5V48yvaV++RNEBPZw==",
+ "version": "6.3.18",
+ "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.18.tgz",
+ "integrity": "sha512-YEwXVHRILKWKN7uEW9IkgTPjnYGb3YA3MDvlp04xpSRAyrNPoRmsBayLDgHykKAwBm6/mAOckj4xi/1JdQfhzQ==",
"dev": true,
"dependencies": {
"@colors/colors": "1.5.0",
@@ -10746,9 +10785,9 @@
}
},
"node_modules/tslib": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
- "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
+ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
},
"node_modules/type-fest": {
"version": "0.21.3",
@@ -11572,12 +11611,6 @@
"dev": true
}
}
- },
- "tslib": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
- "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
- "dev": true
}
}
},
@@ -11639,6 +11672,37 @@
}
}
},
+ "@angular-devkit/core": {
+ "version": "13.3.3",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.3.tgz",
+ "integrity": "sha512-lfQwY9LuVRwcNVzGmyPcwOpb3CAobP4T+c3joR1LLIPS5lzcM0oeCE2bon9N52Ktn4Q/pH98dVtjWL+jSrUADw==",
+ "dev": true,
+ "requires": {
+ "ajv": "8.9.0",
+ "ajv-formats": "2.1.1",
+ "fast-json-stable-stringify": "2.1.0",
+ "magic-string": "0.25.7",
+ "rxjs": "6.6.7",
+ "source-map": "0.7.3"
+ },
+ "dependencies": {
+ "rxjs": {
+ "version": "6.6.7",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+ "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.9.0"
+ }
+ },
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ }
+ }
+ },
"@angular-devkit/schematics": {
"version": "13.3.3",
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.3.tgz",
@@ -11678,9 +11742,9 @@
}
},
"@angular/cdk": {
- "version": "13.3.4",
- "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.4.tgz",
- "integrity": "sha512-im4LKxJaIuqFVzmtf650PoiYsn/SZlvBV2zEgzusK8HwQ24C1Lya7NQSApwl8k43h4eKO1OvUKBjqL5uDgEQag==",
+ "version": "13.3.3",
+ "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.3.tgz",
+ "integrity": "sha512-dzd31mta2VwffxbeO4CelMqb7WswLnkC/r2QZXySnc0CTmj44HqXkqdZuEvVgxaKRVpxsYeuBuhhhy8U00YMOw==",
"requires": {
"parse5": "^5.0.0",
"tslib": "^2.3.0"
@@ -11840,9 +11904,9 @@
}
},
"@angular/material": {
- "version": "13.3.4",
- "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.3.4.tgz",
- "integrity": "sha512-jK9rWmBaPrE+3re6uIdyvG5DCzc47VUvnP1DqblNnpaa8GCKllb1cFRGqa5GPYB1/96d3wO+RPwzhC06qqV+yw==",
+ "version": "13.3.3",
+ "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.3.3.tgz",
+ "integrity": "sha512-PkZ7VW3/7tqdBHSOOmq7com7Ir147OEe1+kfgF/G3y8WUutI9jY2cHKARXGWB+5WgcqKr7ol43u239UGkPfFHg==",
"requires": {
"tslib": "^2.3.0"
}
@@ -13392,9 +13456,9 @@
"dev": true
},
"@types/node": {
- "version": "17.0.27",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.27.tgz",
- "integrity": "sha512-4/Ke7bbWOasuT3kceBZFGakP1dYN2XFd8v2l9bqF2LNWrmeU07JLpp56aEeG6+Q3olqO5TvXpW0yaiYnZJ5CXg==",
+ "version": "17.0.25",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.25.tgz",
+ "integrity": "sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==",
"dev": true
},
"@types/parse-json": {
@@ -16534,9 +16598,9 @@
"dev": true
},
"karma": {
- "version": "6.3.19",
- "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.19.tgz",
- "integrity": "sha512-NDhWckzES/Y9xMiddyU1RzaKL76/scCsu8Mp0vR0Z3lQRvC3p72+Ab4ppoxs36S9tyPNX5V48yvaV++RNEBPZw==",
+ "version": "6.3.18",
+ "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.18.tgz",
+ "integrity": "sha512-YEwXVHRILKWKN7uEW9IkgTPjnYGb3YA3MDvlp04xpSRAyrNPoRmsBayLDgHykKAwBm6/mAOckj4xi/1JdQfhzQ==",
"dev": true,
"requires": {
"@colors/colors": "1.5.0",
@@ -19325,9 +19389,9 @@
"dev": true
},
"tslib": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
- "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
+ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
},
"type-fest": {
"version": "0.21.3",
diff --git a/frontend/package.json b/frontend/package.json
index c8f0e94..9cdd286 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -16,14 +16,14 @@
"@angular/compiler": "~13.2.0",
"@angular/core": "~13.2.0",
"@angular/forms": "~13.2.0",
- "@angular/material": "^13.3.4",
+ "@angular/material": "^13.3.3",
"@angular/platform-browser": "~13.2.0",
"@angular/platform-browser-dynamic": "~13.2.0",
"@angular/router": "~13.2.0",
"bootstrap": "^5.1.3",
"ngx-cron-editor": "^0.7.3",
"rxjs": "~7.5.0",
- "tslib": "^2.4.0",
+ "tslib": "^2.3.0",
"zone.js": "~0.11.4"
},
"devDependencies": {
@@ -31,8 +31,8 @@
"@angular/cli": "~13.3.3",
"@angular/compiler-cli": "~13.2.0",
"@types/jasmine": "~4.0.3",
- "@types/node": "^17.0.27",
- "karma": "~6.3.19",
+ "@types/node": "^17.0.25",
+ "karma": "~6.3.18",
"jasmine-core": "~4.1.0",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage": "~2.2.0",
diff --git a/telegram_bot/api_handling/api_handler.py b/telegram_bot/api_handling/api_handler.py
index 181fd71..35aef19 100644
--- a/telegram_bot/api_handling/api_handler.py
+++ b/telegram_bot/api_handling/api_handler.py
@@ -2,8 +2,8 @@
script for communicating with webservice to get data from database
"""
__author__ = "Florian Kellermann, Linus Eickhoff"
-__date__ = "16.03.2022"
-__version__ = "0.0.1"
+__date__ = "26.04.2022"
+__version__ = "1.0.1"
__license__ = "None"
#side-dependencies: none
@@ -13,6 +13,9 @@ import sys
import os
import requests as r
from croniter import croniter # used for checking cron formatting
+from dotenv import load_dotenv
+
+load_dotenv() # loads environment vars
# note: for more information about the api visit swagger documentation on https://gruppe1.testsites.info/api/docs#/
@@ -287,6 +290,7 @@ class API_Handler:
int: status code
"""
with r.Session() as s:
+ time = time[:-3] + "Z" # remove last character and add Z to make it a valid date for db
headers = {'Authorization': 'Bearer ' + self.token + ":" + str(user_id)}
transaction = {"comment": str(comment), "count": float(count), "isin": str(isin), "price": float(price), "time": str(time)} # set transaction as JSON with all the attributes needed according to Swagger docs
req = s.post(self.db_adress + "/transaction", json=transaction, headers=headers)
@@ -340,21 +344,21 @@ class API_Handler:
Args:
email (string): email of the user
- is_admin (String): "true" if user should be Admin, "false" if not
+ is_admin (bool): "true" if user should be Admin, "false" if not
Returns:
int: status code
"""
with r.Session() as s:
headers = {'Authorization': 'Bearer ' + self.token} # only bot token is needed, user is chosen by email
- req = s.put(self.db_adress + "/user/setAdmin", json={"admin": str(is_admin),"email": str(email)})
+ req = s.put(self.db_adress + "/user/setAdmin", json={"admin": is_admin,"email": str(email)}, headers=headers)
return req.status_code
if __name__ == "__main__": # editable, just for basic on the go testing of new functions
print("This is a module for the telegram bot. It is not intended to be run directly.")
- handler = API_Handler("https://gruppe1.testsites.info/api", "bot@example.com", "bot")
+ handler = API_Handler("https://gruppe1.testsites.info/api", str(os.getenv("BOT_EMAIL")), str(os.getenv("BOT_PASSWORD"))) # get creds from env
print(handler.token)
keywords = handler.get_user_keywords(user_id = 1709356058) #user_id here is currently mine (Linus)
print(keywords)
diff --git a/telegram_bot/bot.py b/telegram_bot/bot.py
index a2cc2a6..346a610 100644
--- a/telegram_bot/bot.py
+++ b/telegram_bot/bot.py
@@ -3,8 +3,8 @@
script for telegram bot and its functions
"""
__author__ = "Florian Kellermann, Linus Eickhoff"
-__date__ = "11.03.2022"
-__version__ = "0.0.4"
+__date__ = "26.04.2022"
+__version__ = "1.2.2"
__license__ = "None"
# side-dependencies: none
@@ -14,13 +14,11 @@ __license__ = "None"
# API Documentation https://core.telegram.org/bots/api
# Code examples https://github.com/eternnoir/pyTelegramBotAPI#getting-started
-import email
import os
import telebot
import sys
import logging
-import json
import re
import news.news_fetcher as news
@@ -41,31 +39,6 @@ bot_version = "1.0.1" # version of bot
api_handler = API_Handler("https://gruppe1.testsites.info/api", str(os.getenv("BOT_EMAIL")), str(os.getenv("BOT_PASSWORD"))) # get creds from env vars.
print("Webserver Token: " + str(api_handler.token))
-class User: # Currently saving users in this class to test functionality -> later database REMOVABLE
- def __init__(self, p_user_id, p_user_name, p_chat_id):
-
- """ Initialize a new user
- :type self: User
- :param self: object of the class
-
- :type p_user_id: int
- :param p_user_id: telegram user id
-
- :type p_user_name: str
- :param p_user_name: first name of user
-
- :type p_chat_id: int
- :param p_chat_id: telegram chat id
-
- :raises:
-
- :rtype:
- """
-
- self.user_id = int(p_user_id)
- self.chat_id = int(p_chat_id)
- self.user_name = str(p_user_name)
-
bot = telebot.TeleBot(os.getenv('BOT_API_KEY'))
@bot.message_handler(commands=['start', 'Start']) # /start -> saving as new user and sending welcome
@@ -143,7 +116,7 @@ def send_all_users(message):
bot.send_message(chat_id=user_id, text=f'Username: {username}\nEmail: {email}\nID: {id}\nCron: {cron}\nAdmin: {admin}') # format user data into readable message text
-@bot.message_handler(commands=['setAdmin', 'SetAdmin']) # set admin rights to user TBD: not working!!
+@bot.message_handler(commands=['setAdmin', 'SetAdmin', 'setadmin', 'Setadmin']) # set admin rights to user TBD: not working!!
def set_admin(message):
""" Set admin rights to user
@@ -161,7 +134,7 @@ def set_admin(message):
bot.reply_to(message, "You have to be an admin to use this command")
return
- bot.send_message(chat_id=user_id, text='send email and "true" if this account should have admin rights, else "false"\n in format: ,') # ask for email and admin rights to set
+ bot.send_message(chat_id=user_id, text='send email and true if this account should have admin rights, else false\n in format: ,') # request email and admin rights to change to
bot.register_next_step_handler(message, set_admin_step)
def set_admin_step(message):
@@ -174,7 +147,11 @@ def set_admin_step(message):
return
email = args_message[0]
- is_admin = args_message[1]
+ is_admin = False # default: False
+
+ if args_message[1].lower() == "true": # if user types true, set is_admin to true
+ is_admin = True
+
status = api_handler.set_admin(email, is_admin) # set admin in db
if(status == 200):
@@ -303,7 +280,7 @@ def send_share_update(message):
def send_share_price(message):
str_share_price = share_fetcher.get_share_price(str(message.text))
- bot.reply_to(message, str_share_price)
+ bot.reply_to(message, str_share_price) # add dollar symbol etc.
@bot.message_handler(commands=['allnews', 'Allnews']) # /allnews -> get all news
@@ -504,8 +481,8 @@ def set_new_transaction_step(message):
amount = float(transaction_data[2])
price = float(transaction_data[3])
time = dt.datetime.now().isoformat()
- #print("\n\n\n\n\n")
- #print(f"{symbol},{amount},{price},{time}")
+ print("\n\n\n\n\n")
+ print(f"{isin},{amount},{price},{time}")
status = api_handler.set_transaction(user_id, desc, isin, amount, price, time)
if status == 200:
diff --git a/telegram_bot/bot_updates.py b/telegram_bot/bot_updates.py
index 46df917..f48a824 100644
--- a/telegram_bot/bot_updates.py
+++ b/telegram_bot/bot_updates.py
@@ -2,21 +2,16 @@
script for regularly sending updates on shares and news based on user interval
"""
__author__ = "Florian Kellermann, Linus Eickhoff"
-__date__ = "05.04.2022"
-__version__ = "1.0.1"
+__date__ = "26.04.2022"
+__version__ = "1.0.2"
__license__ = "None"
-from calendar import month
-from symtable import Symbol
from dotenv import load_dotenv
-from shares.share_fetcher import get_share_price
import news.news_fetcher as news_fetcher
import time
-import datetime
import os
from bot import bot
import sys
-from multiprocessing import Process
from apscheduler.schedulers.background import BackgroundScheduler
from api_handling.api_handler import API_Handler
@@ -146,16 +141,23 @@ def update_for_user(p_user_id, p_my_handler):
my_update_message = f'Symbol: {share_symbols[i]}\nCurrent Price per Share: {share_courses[i]}\nAmount owned: {share_amounts[i]}\nTotal Investment: {float(share_courses[i]) * float(share_amounts[i])}'
send_to_user(my_update_message, pUser_id=p_user_id)
else:
- send_to_user("No shares found for your account. Check https://gruppe1.testsites.info/api to change your settings and add shares.", pUser_id=p_user_id)
+ send_to_user("No shares found for your account. Check https://gruppe1.testsites.info to change your settings and add shares.", pUser_id=p_user_id)
keywords = p_my_handler.get_user_keywords(p_user_id) # get keywords as array
if(keywords): # if keywords exist and array is not empty
send_to_user("If you haven't read yet: \nHere are some interesting news according to your keywords:", pUser_id=p_user_id)
for keyword in keywords:
- news = news_fetcher.get_top_news_by_keyword(keyword)["articles"][0] # only use the most popular news
- news_formatted = news_fetcher.format_article(news) # format for message
- send_to_user(f"_keyword: {keyword}_\n\n{news_formatted}", pUser_id=p_user_id, md_mode=True) # send news with related keyword in Markdown
+ news = news_fetcher.get_top_news_by_keyword(keyword)["articles"]
+
+ if not news: # if empty news array
+ send_to_user(f"No news found for keyword _{keyword}_.", pUser_id=p_user_id, md_mode=True)
+
+ if news == None: # if news is none
+ send_to_user(f"Server error for keyword _{keyword}_.", pUser_id=p_user_id, md_mode=True)
+ else:
+ news_formatted = news_fetcher.format_article(news[0]) # format for message, only use the most popular article
+ send_to_user(f"_keyword: {keyword}_\n\n{news_formatted}", pUser_id=p_user_id, md_mode=True) # send news with related keyword in Markdown
diff --git a/telegram_bot/news/news_fetcher.py b/telegram_bot/news/news_fetcher.py
index a6dad7e..bd083b5 100644
--- a/telegram_bot/news/news_fetcher.py
+++ b/telegram_bot/news/news_fetcher.py
@@ -2,15 +2,13 @@
script for news fetching (by keywords)
"""
__author__ = "Florian Kellermann, Linus Eickhoff"
-__date__ = "15.03.2022"
-__version__ = "0.0.1"
+__date__ = "26.04.2022"
+__version__ = "1.0.0"
__license__ = "None"
import sys
import os
-import json
import requests
-import datetime as dt
from newsapi import NewsApiClient
from dotenv import load_dotenv
diff --git a/telegram_bot/shares/share_fetcher.py b/telegram_bot/shares/share_fetcher.py
index 1aa3376..c7ec63f 100644
--- a/telegram_bot/shares/share_fetcher.py
+++ b/telegram_bot/shares/share_fetcher.py
@@ -7,7 +7,6 @@ __version__ = "0.0.2"
__license__ = "None"
import yfinance
-import json
def get_share_price(str_symbol):