Compare commits

..

8 Commits

Author SHA1 Message Date
dd7ab4ac10 Update dependency pyTelegramBotAPI to ~=4.7.0
All checks were successful
ci/woodpecker/pr/woodpecker Pipeline was successful
2022-09-18 00:55:33 +02:00
6b339e09fc Merge pull request 'Configure Renovate' (#417) from renovate/configure into main
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Reviewed-on: #417
2022-09-18 00:51:35 +02:00
364f8596ae Add renovate.json
All checks were successful
ci/woodpecker/pr/woodpecker Pipeline was successful
2022-09-18 00:51:28 +02:00
752d92be49 Fixed renovate
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2022-09-18 00:51:12 +02:00
97ce099485 Try to fix renovate
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2022-09-18 00:48:22 +02:00
cc9af56da7 Fixed renovate
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2022-09-18 00:46:23 +02:00
4adf14d7cb „.renovaterc.json“ löschen
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2022-09-18 00:45:54 +02:00
7595d42f9a Migrate from github to gitea + some improvements 2022-09-18 00:39:03 +02:00
19 changed files with 98 additions and 443 deletions

View File

@@ -1,27 +0,0 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
# API
- package-ecosystem: "pip"
directory: "/api"
schedule:
interval: "daily"
open-pull-requests-limit: 100
# Bot
- package-ecosystem: "pip"
directory: "/telegram_bot"
schedule:
interval: "daily"
open-pull-requests-limit: 100
# Frontend
- package-ecosystem: "npm"
directory: "/frontend"
schedule:
interval: "daily"
open-pull-requests-limit: 100

4
.renovaterc.json Normal file
View File

@@ -0,0 +1,4 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"schedule": ["* 5 * * *"]
}

View File

@@ -77,9 +77,9 @@ pipeline:
password:
from_secret: ssh_password
script:
- cd /root/docker/aktienbot
- cd ~/docker-compose-files/telegram_aktien_bot
- docker-compose pull
- docker-compose -p "aktienbot" up -d
- docker-compose --env-file ~/docker-compose-env/telegram_aktien_bot.env up -d
when:
path: [ "frontend/**", "telegram_bot/**", "api/**" ]
event: push

View File

@@ -1,4 +1,4 @@
[![Build Status](https://woodpecker.flokaiser.com/api/badges/WebEngineering2/TelegramAktienBot/status.svg)](https://woodpecker.flokaiser.com/WebEngineering2/TelegramAktienBot/)
[![Build Status](https://gitea.woodpecker.flokaiser.com/api/badges/DHBW/TelegramAktienBot/status.svg)](https://gitea.woodpecker.flokaiser.com/DHBW/TelegramAktienBot)
# TelegramAktienBot
WebEngineering2 Projekt: Aktien und News Bot für Telegram
@@ -21,16 +21,4 @@ WebEngineering2 Projekt: Aktien und News Bot für Telegram
* Florian Kaiser
* Florian Kellermann
* Linus Eickhoff
* Kevin Pauer
## Nützliche Tools
- Portainer (https://gruppe1.testsites.info/portainer/) \
*Container Management System*
- phpMyAdmin (https://gruppe1.testsites.info/phpmyadmin/) \
*Administration von MySQL-Datenbanken*
- goaccess (https://gruppe1.testsites.info/goaccess/) \
*Webanalyseanwendung*
- Uptimekuma (https://uptimekuma.flokaiser.com/status/aktienbot) \
*Monitoring*
- Woodpecker (https://woodpecker.flokaiser.com/WebEngineering2/TelegramAktienBot) \
*Continuous Integration platform*
* Kevin Pauer

View File

@@ -64,10 +64,15 @@ token = requests.post(os.getenv("API_URL") + '/user/login', json={"email": usern
response = requests.get(os.getenv("API_URL") + '/symbols', headers={'Authorization': 'Bearer ' + token}).json()['data']
symbols = split(response, int(len(response) / 5))
for symbol_list in symbols:
for symbol in symbol_list:
x = threading.Thread(target=thread_function, args=(symbol,))
x.start()
if len(response) > 5:
symbols = split(response, int(len(response) / 5))
for symbol_list in symbols:
for symbol in symbol_list:
x = threading.Thread(target=thread_function, args=(symbol,))
x.start()
time.sleep(10)
time.sleep(10)
else:
for symbol in response:
x = threading.Thread(target=thread_function, args=(symbol,))
x.start()

View File

@@ -12,7 +12,7 @@ BOT_EMAIL=
BOT_PASSWORD=
# urls
WEBSITE_URL=
APP_URL=
API_URL=
# timezone

View File

@@ -1,7 +1,7 @@
# Dokumentation
## Swagger Documentation
Visit https://gruppe1.testsites.info/api/docs
Visit \<API_URL\> + /docs
## API
- `api/openapi.json`

View File

@@ -28,7 +28,7 @@
"@angular-devkit/build-angular": "~13.3.5",
"@angular-eslint/builder": "13.2.1",
"@angular-eslint/eslint-plugin": "13.2.1",
"@angular-eslint/eslint-plugin-template": "14.0.4",
"@angular-eslint/eslint-plugin-template": "13.2.1",
"@angular-eslint/schematics": "13.2.1",
"@angular-eslint/template-parser": "13.2.1",
"@angular/cli": "~13.3.5",
@@ -391,185 +391,21 @@
}
},
"node_modules/@angular-eslint/eslint-plugin-template": {
"version": "14.0.4",
"resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-14.0.4.tgz",
"integrity": "sha512-F3GgItYHcEtQfOcJoyfvmRKdFIrI+/Wc7SjOo1X31tdeaQaRHseYWGFZ5AaA+MM+/rV7jPAd671Tv7wlm+Wjtg==",
"version": "13.2.1",
"resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-13.2.1.tgz",
"integrity": "sha512-fA11IGfnWzJePFVS04JKigQY33/Twp5Gv3sj6o8NLRi25NbZDFMc6YjRv8FuKfJ0DXrZh0nLgP2L/01qnXDgZQ==",
"dev": true,
"dependencies": {
"@angular-eslint/bundled-angular-compiler": "14.0.4",
"@typescript-eslint/type-utils": "5.36.2",
"@typescript-eslint/utils": "5.36.2",
"aria-query": "5.0.2",
"axobject-query": "3.0.1"
"@angular-eslint/bundled-angular-compiler": "13.2.1",
"@typescript-eslint/experimental-utils": "5.17.0",
"aria-query": "^4.2.2",
"axobject-query": "^2.2.0"
},
"peerDependencies": {
"eslint": "^7.0.0 || ^8.0.0",
"typescript": "*"
}
},
"node_modules/@angular-eslint/eslint-plugin-template/node_modules/@angular-eslint/bundled-angular-compiler": {
"version": "14.0.4",
"resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-14.0.4.tgz",
"integrity": "sha512-/fbXDvkm4q95xG/9LZDtiyE2MQwT061sanmMginDk63f0dlC4H+AXgggva38YNRN+CFcbFtWfikTy7yFdNFZlA==",
"dev": true
},
"node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/scope-manager": {
"version": "5.36.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.2.tgz",
"integrity": "sha512-cNNP51L8SkIFSfce8B1NSUBTJTu2Ts4nWeWbFrdaqjmn9yKrAaJUBHkyTZc0cL06OFHpb+JZq5AUHROS398Orw==",
"dev": true,
"dependencies": {
"@typescript-eslint/types": "5.36.2",
"@typescript-eslint/visitor-keys": "5.36.2"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
}
},
"node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/type-utils": {
"version": "5.36.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.36.2.tgz",
"integrity": "sha512-rPQtS5rfijUWLouhy6UmyNquKDPhQjKsaKH0WnY6hl/07lasj8gPaH2UD8xWkePn6SC+jW2i9c2DZVDnL+Dokw==",
"dev": true,
"dependencies": {
"@typescript-eslint/typescript-estree": "5.36.2",
"@typescript-eslint/utils": "5.36.2",
"debug": "^4.3.4",
"tsutils": "^3.21.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"eslint": "*"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/types": {
"version": "5.36.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.2.tgz",
"integrity": "sha512-9OJSvvwuF1L5eS2EQgFUbECb99F0mwq501w0H0EkYULkhFa19Qq7WFbycdw1PexAc929asupbZcgjVIe6OK/XQ==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
}
},
"node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/typescript-estree": {
"version": "5.36.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.2.tgz",
"integrity": "sha512-8fyH+RfbKc0mTspfuEjlfqA4YywcwQK2Amcf6TDOwaRLg7Vwdu4bZzyvBZp4bjt1RRjQ5MDnOZahxMrt2l5v9w==",
"dev": true,
"dependencies": {
"@typescript-eslint/types": "5.36.2",
"@typescript-eslint/visitor-keys": "5.36.2",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
"semver": "^7.3.7",
"tsutils": "^3.21.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/utils": {
"version": "5.36.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.36.2.tgz",
"integrity": "sha512-uNcopWonEITX96v9pefk9DC1bWMdkweeSsewJ6GeC7L6j2t0SJywisgkr9wUTtXk90fi2Eljj90HSHm3OGdGRg==",
"dev": true,
"dependencies": {
"@types/json-schema": "^7.0.9",
"@typescript-eslint/scope-manager": "5.36.2",
"@typescript-eslint/types": "5.36.2",
"@typescript-eslint/typescript-estree": "5.36.2",
"eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
"node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/visitor-keys": {
"version": "5.36.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.2.tgz",
"integrity": "sha512-BtRvSR6dEdrNt7Net2/XDjbYKU5Ml6GqJgVfXT0CxTCJlnIqK7rAGreuWKMT2t8cFUT2Msv5oxw0GMRD7T5J7A==",
"dev": true,
"dependencies": {
"@typescript-eslint/types": "5.36.2",
"eslint-visitor-keys": "^3.3.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
}
},
"node_modules/@angular-eslint/eslint-plugin-template/node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/@angular-eslint/eslint-plugin-template/node_modules/semver": {
"version": "7.3.7",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
"integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@angular-eslint/schematics": {
"version": "13.2.1",
"resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-13.2.1.tgz",
@@ -586,41 +422,6 @@
"@angular/cli": ">= 13.0.0 < 14.0.0"
}
},
"node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/eslint-plugin-template": {
"version": "13.2.1",
"resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-13.2.1.tgz",
"integrity": "sha512-fA11IGfnWzJePFVS04JKigQY33/Twp5Gv3sj6o8NLRi25NbZDFMc6YjRv8FuKfJ0DXrZh0nLgP2L/01qnXDgZQ==",
"dev": true,
"dependencies": {
"@angular-eslint/bundled-angular-compiler": "13.2.1",
"@typescript-eslint/experimental-utils": "5.17.0",
"aria-query": "^4.2.2",
"axobject-query": "^2.2.0"
},
"peerDependencies": {
"eslint": "^7.0.0 || ^8.0.0",
"typescript": "*"
}
},
"node_modules/@angular-eslint/schematics/node_modules/aria-query": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
"integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
"dev": true,
"dependencies": {
"@babel/runtime": "^7.10.2",
"@babel/runtime-corejs3": "^7.10.2"
},
"engines": {
"node": ">=6.0"
}
},
"node_modules/@angular-eslint/schematics/node_modules/axobject-query": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
"integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==",
"dev": true
},
"node_modules/@angular-eslint/template-parser": {
"version": "13.2.1",
"resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-13.2.1.tgz",
@@ -2534,9 +2335,9 @@
}
},
"node_modules/@babel/runtime-corejs3": {
"version": "7.19.0",
"resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.0.tgz",
"integrity": "sha512-JyXXoCu1N8GLuKc2ii8y5RGma5FMpFeO2nAQIe0Yzrbq+rQnN+sFj47auLblR5ka6aHNGPDgv8G/iI2Grb0ldQ==",
"version": "7.17.9",
"resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz",
"integrity": "sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw==",
"dev": true,
"dependencies": {
"core-js-pure": "^3.20.2",
@@ -4861,10 +4662,14 @@
}
},
"node_modules/aria-query": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.2.tgz",
"integrity": "sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q==",
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
"integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
"dev": true,
"dependencies": {
"@babel/runtime": "^7.10.2",
"@babel/runtime-corejs3": "^7.10.2"
},
"engines": {
"node": ">=6.0"
}
@@ -4945,13 +4750,10 @@
}
},
"node_modules/axobject-query": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.0.1.tgz",
"integrity": "sha512-vy5JPSOibF9yAeC2PoemRdA1MuSXX7vX5osdoxKf/6OUeppAWekZ3JIJVNWFMH6wgj7uHYyqZUSqE/b/3JLV1A==",
"dev": true,
"engines": {
"node": ">=6.0"
}
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
"integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==",
"dev": true
},
"node_modules/babel-loader": {
"version": "8.2.3",
@@ -5907,9 +5709,9 @@
}
},
"node_modules/core-js-pure": {
"version": "3.25.1",
"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.1.tgz",
"integrity": "sha512-7Fr74bliUDdeJCBMxkkIuQ4xfxn/SwrVg+HkJUAoNEXVqYLv55l6Af0dJ5Lq2YBUW9yKqSkLXaS5SYPK6MGa/A==",
"version": "3.22.3",
"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.3.tgz",
"integrity": "sha512-oN88zz7nmKROMy8GOjs+LN+0LedIvbMdnB5XsTlhcOg1WGARt9l0LFg0zohdoFmCsEZ1h2ZbSQ6azj3M+vhzwQ==",
"dev": true,
"hasInstallScript": true,
"funding": {
@@ -14440,109 +14242,15 @@
}
},
"@angular-eslint/eslint-plugin-template": {
"version": "14.0.4",
"resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-14.0.4.tgz",
"integrity": "sha512-F3GgItYHcEtQfOcJoyfvmRKdFIrI+/Wc7SjOo1X31tdeaQaRHseYWGFZ5AaA+MM+/rV7jPAd671Tv7wlm+Wjtg==",
"version": "13.2.1",
"resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-13.2.1.tgz",
"integrity": "sha512-fA11IGfnWzJePFVS04JKigQY33/Twp5Gv3sj6o8NLRi25NbZDFMc6YjRv8FuKfJ0DXrZh0nLgP2L/01qnXDgZQ==",
"dev": true,
"requires": {
"@angular-eslint/bundled-angular-compiler": "14.0.4",
"@typescript-eslint/type-utils": "5.36.2",
"@typescript-eslint/utils": "5.36.2",
"aria-query": "5.0.2",
"axobject-query": "3.0.1"
},
"dependencies": {
"@angular-eslint/bundled-angular-compiler": {
"version": "14.0.4",
"resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-14.0.4.tgz",
"integrity": "sha512-/fbXDvkm4q95xG/9LZDtiyE2MQwT061sanmMginDk63f0dlC4H+AXgggva38YNRN+CFcbFtWfikTy7yFdNFZlA==",
"dev": true
},
"@typescript-eslint/scope-manager": {
"version": "5.36.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.2.tgz",
"integrity": "sha512-cNNP51L8SkIFSfce8B1NSUBTJTu2Ts4nWeWbFrdaqjmn9yKrAaJUBHkyTZc0cL06OFHpb+JZq5AUHROS398Orw==",
"dev": true,
"requires": {
"@typescript-eslint/types": "5.36.2",
"@typescript-eslint/visitor-keys": "5.36.2"
}
},
"@typescript-eslint/type-utils": {
"version": "5.36.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.36.2.tgz",
"integrity": "sha512-rPQtS5rfijUWLouhy6UmyNquKDPhQjKsaKH0WnY6hl/07lasj8gPaH2UD8xWkePn6SC+jW2i9c2DZVDnL+Dokw==",
"dev": true,
"requires": {
"@typescript-eslint/typescript-estree": "5.36.2",
"@typescript-eslint/utils": "5.36.2",
"debug": "^4.3.4",
"tsutils": "^3.21.0"
}
},
"@typescript-eslint/types": {
"version": "5.36.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.2.tgz",
"integrity": "sha512-9OJSvvwuF1L5eS2EQgFUbECb99F0mwq501w0H0EkYULkhFa19Qq7WFbycdw1PexAc929asupbZcgjVIe6OK/XQ==",
"dev": true
},
"@typescript-eslint/typescript-estree": {
"version": "5.36.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.2.tgz",
"integrity": "sha512-8fyH+RfbKc0mTspfuEjlfqA4YywcwQK2Amcf6TDOwaRLg7Vwdu4bZzyvBZp4bjt1RRjQ5MDnOZahxMrt2l5v9w==",
"dev": true,
"requires": {
"@typescript-eslint/types": "5.36.2",
"@typescript-eslint/visitor-keys": "5.36.2",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
"semver": "^7.3.7",
"tsutils": "^3.21.0"
}
},
"@typescript-eslint/utils": {
"version": "5.36.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.36.2.tgz",
"integrity": "sha512-uNcopWonEITX96v9pefk9DC1bWMdkweeSsewJ6GeC7L6j2t0SJywisgkr9wUTtXk90fi2Eljj90HSHm3OGdGRg==",
"dev": true,
"requires": {
"@types/json-schema": "^7.0.9",
"@typescript-eslint/scope-manager": "5.36.2",
"@typescript-eslint/types": "5.36.2",
"@typescript-eslint/typescript-estree": "5.36.2",
"eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0"
}
},
"@typescript-eslint/visitor-keys": {
"version": "5.36.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.2.tgz",
"integrity": "sha512-BtRvSR6dEdrNt7Net2/XDjbYKU5Ml6GqJgVfXT0CxTCJlnIqK7rAGreuWKMT2t8cFUT2Msv5oxw0GMRD7T5J7A==",
"dev": true,
"requires": {
"@typescript-eslint/types": "5.36.2",
"eslint-visitor-keys": "^3.3.0"
}
},
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
"requires": {
"ms": "2.1.2"
}
},
"semver": {
"version": "7.3.7",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
"integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
}
}
"@angular-eslint/bundled-angular-compiler": "13.2.1",
"@typescript-eslint/experimental-utils": "5.17.0",
"aria-query": "^4.2.2",
"axobject-query": "^2.2.0"
}
},
"@angular-eslint/schematics": {
@@ -14556,36 +14264,6 @@
"ignore": "5.2.0",
"strip-json-comments": "3.1.1",
"tmp": "0.2.1"
},
"dependencies": {
"@angular-eslint/eslint-plugin-template": {
"version": "13.2.1",
"resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-13.2.1.tgz",
"integrity": "sha512-fA11IGfnWzJePFVS04JKigQY33/Twp5Gv3sj6o8NLRi25NbZDFMc6YjRv8FuKfJ0DXrZh0nLgP2L/01qnXDgZQ==",
"dev": true,
"requires": {
"@angular-eslint/bundled-angular-compiler": "13.2.1",
"@typescript-eslint/experimental-utils": "5.17.0",
"aria-query": "^4.2.2",
"axobject-query": "^2.2.0"
}
},
"aria-query": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
"integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
"dev": true,
"requires": {
"@babel/runtime": "^7.10.2",
"@babel/runtime-corejs3": "^7.10.2"
}
},
"axobject-query": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
"integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==",
"dev": true
}
}
},
"@angular-eslint/template-parser": {
@@ -15900,9 +15578,9 @@
}
},
"@babel/runtime-corejs3": {
"version": "7.19.0",
"resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.0.tgz",
"integrity": "sha512-JyXXoCu1N8GLuKc2ii8y5RGma5FMpFeO2nAQIe0Yzrbq+rQnN+sFj47auLblR5ka6aHNGPDgv8G/iI2Grb0ldQ==",
"version": "7.17.9",
"resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz",
"integrity": "sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw==",
"dev": true,
"requires": {
"core-js-pure": "^3.20.2",
@@ -17600,10 +17278,14 @@
}
},
"aria-query": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.2.tgz",
"integrity": "sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q==",
"dev": true
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
"integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
"dev": true,
"requires": {
"@babel/runtime": "^7.10.2",
"@babel/runtime-corejs3": "^7.10.2"
}
},
"array-flatten": {
"version": "2.1.2",
@@ -17650,9 +17332,9 @@
}
},
"axobject-query": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.0.1.tgz",
"integrity": "sha512-vy5JPSOibF9yAeC2PoemRdA1MuSXX7vX5osdoxKf/6OUeppAWekZ3JIJVNWFMH6wgj7uHYyqZUSqE/b/3JLV1A==",
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
"integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==",
"dev": true
},
"babel-loader": {
@@ -18366,9 +18048,9 @@
}
},
"core-js-pure": {
"version": "3.25.1",
"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.1.tgz",
"integrity": "sha512-7Fr74bliUDdeJCBMxkkIuQ4xfxn/SwrVg+HkJUAoNEXVqYLv55l6Af0dJ5Lq2YBUW9yKqSkLXaS5SYPK6MGa/A==",
"version": "3.22.3",
"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.3.tgz",
"integrity": "sha512-oN88zz7nmKROMy8GOjs+LN+0LedIvbMdnB5XsTlhcOg1WGARt9l0LFg0zohdoFmCsEZ1h2ZbSQ6azj3M+vhzwQ==",
"dev": true
},
"core-util-is": {

View File

@@ -32,7 +32,7 @@
"@angular-devkit/build-angular": "~13.3.5",
"@angular-eslint/builder": "13.2.1",
"@angular-eslint/eslint-plugin": "13.2.1",
"@angular-eslint/eslint-plugin-template": "14.0.4",
"@angular-eslint/eslint-plugin-template": "13.2.1",
"@angular-eslint/schematics": "13.2.1",
"@angular-eslint/template-parser": "13.2.1",
"@angular/cli": "~13.3.5",

View File

@@ -1,7 +1,7 @@
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs';
const AUTH_API = 'https://gruppe1.testsites.info/api/user';
const AUTH_API = '/api/user';
const httpOptions = {
headers: new HttpHeaders({ 'Content-Type': 'application/json' }),

View File

@@ -3,7 +3,7 @@ import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { TokenStorageService } from './token.service';
const API_URL = 'https://gruppe1.testsites.info/api/';
const API_URL = '/api/';
@Injectable({
providedIn: 'root',

View File

@@ -2,7 +2,7 @@ import { Injectable, OnInit } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { delay, Observable } from 'rxjs';
import { TokenStorageService } from './token.service';
const API_URL = 'https://gruppe1.testsites.info/api/';
const API_URL = '/api/';
@Injectable({
providedIn: 'root',
})

View File

@@ -3,7 +3,7 @@ import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { TokenStorageService } from './token.service';
const API_URL = 'https://gruppe1.testsites.info/api/';
const API_URL = '/api/';
@Injectable({
providedIn: 'root',
@@ -77,7 +77,7 @@ export class ProfileService {
*/
public addCronString(cron: string): Observable<any> {
return this.http.put(
'https://gruppe1.testsites.info/api/user' + '/setCron',
'/api/user' + '/setCron',
{
cron,
},

3
renovate.json Normal file
View File

@@ -0,0 +1,3 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json"
}

View File

@@ -12,7 +12,7 @@ BOT_EMAIL=
BOT_PASSWORD=
# urls
WEBSITE_URL=
APP_URL=
API_URL=
# timezone

View File

@@ -19,7 +19,7 @@ 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#/
# note: for more information about the api visit swagger documentation on os.getenv("API_URL")/docs#/
class API_Handler:
"""class for interacting with the api webservice
@@ -392,7 +392,7 @@ class API_Handler:
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", str(os.getenv("BOT_EMAIL")), str(os.getenv("BOT_PASSWORD"))) # get creds from env
handler = API_Handler(os.getenv("API_URL"), 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)

View File

@@ -50,7 +50,7 @@ def send_start(message):
"""
bot.reply_to(message, "Welcome to this share bot project. \
\nType /help to get information on what this bot can do. \
\nAlso see " + os.getenv("WEBSITE_URL") + " \
\nAlso see " + os.getenv("APP_URL") + " \
to start configuring your bot")
@@ -78,7 +78,7 @@ def send_help(message):
:rtype: none
"""
bot.reply_to(message,
"/id or /auth get your user id\n/shares get update on interesting shares\n/setAdmin set admin rights of user (ADMIN)\n/users see all users. (ADMIN)\n/me get my user info\n/news get top article for each keyword.\n/allnews get all news (last 7 days)\n/keywords get all your keywords\n/addkeyword add a keyword\n/removekeyword remove a keyword\n/transactions get all transactions\n/newtransaction create new transaction\n/share get price of specific share\n/portfolio see own stock portfolio\n/removeshare removes share from portfolio\n/interval get update interval\n/setinterval set update interval\n For further details see " + os.getenv("WEBSITE_URL"))
"/id or /auth get your user id\n/shares get update on interesting shares\n/setAdmin set admin rights of user (ADMIN)\n/users see all users. (ADMIN)\n/me get my user info\n/news get top article for each keyword.\n/allnews get all news (last 7 days)\n/keywords get all your keywords\n/addkeyword add a keyword\n/removekeyword remove a keyword\n/transactions get all transactions\n/newtransaction create new transaction\n/share get price of specific share\n/portfolio see own stock portfolio\n/removeshare removes share from portfolio\n/interval get update interval\n/setinterval set update interval\n For further details see " + os.getenv("APP_URL"))
@bot.message_handler(commands=['users', 'Users']) # /users -> sending all users
@@ -170,7 +170,7 @@ def send_user(message):
user_id = int(message.from_user.id)
user_data = api_handler.get_user(user_id)
if not user_data or user_data == None: # true if user is not registered
bot.reply_to(message, "This didn\'t work. Make sure to connect your telegram id (/id) on " + os.getenv("WEBSITE_URL"))
bot.reply_to(message, "This didn\'t work. Make sure to connect your telegram id (/id) on " + os.getenv("APP_URL"))
return
username = user_data['username']
email = user_data['email']
@@ -190,7 +190,7 @@ def send_id(message):
:rtype: none
"""
answer = 'Your ID/Authentication Code is: [' + str(message.from_user.id) + ']. Enter this code in the settings on ' + os.getenv("WEBSITE_URL") + ' to get updates on your shares.'
answer = 'Your ID/Authentication Code is: [' + str(message.from_user.id) + ']. Enter this code in the settings on ' + os.getenv("APP_URL") + ' to get updates on your shares.'
bot.reply_to(message, answer)
@@ -219,7 +219,7 @@ def update_for_user(message):
my_portfolio = p_my_handler.get_user_portfolio(p_user_id)
if my_portfolio == None: # true if user is not registered
bot.send_message(chat_id=p_user_id, text='This didn\'t work. Make sure to connect your telegram id (/id) on ' + os.getenv("WEBSITE_URL"))
bot.send_message(chat_id=p_user_id, text='This didn\'t work. Make sure to connect your telegram id (/id) on ' + os.getenv("APP_URL"))
return
my_user = p_my_handler.get_user(p_user_id)
@@ -240,7 +240,7 @@ def update_for_user(message):
my_update_message = f'{share_fetcher.get_share_information_markdown(share_symbols[i])}\ncount: {amounts}\nTotal: {hf.make_markdown_proof(round(float(my_price) * float(share_amounts[i]), 2))} EUR'
bot.send_message(chat_id=p_user_id, text=my_update_message, parse_mode="MARKDOWNV2")
else:
send_to_user("No shares found for your account. Check " + os.getenv("WEBSITE_URL") + " to change your settings and add shares.", pUser_id=p_user_id)
send_to_user("No shares found for your account. Check " + os.getenv("APP_URL") + " to change your settings and add shares.", pUser_id=p_user_id)
def send_to_user(pText, pUser_id):
@@ -294,7 +294,7 @@ def send_all_news(message):
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 ' + os.getenv("WEBSITE_URL"))
bot.send_message(chat_id=user_id, text='This didn\'t work. Make sure to connect your telegram id (/id) on ' + os.getenv("APP_URL"))
return
if not keywords: # true if user is registered but does not have any keywords
@@ -330,7 +330,7 @@ def send_news(message):
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 ' + os.getenv("WEBSITE_URL"))
bot.send_message(chat_id=user_id, text='This didn\'t work. Make sure to connect your telegram id (/id) on ' + os.getenv("APP_URL"))
return
if not keywords: # true if user is registered but does not have any keywords
@@ -375,7 +375,7 @@ def store_keyword(message):
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})')
bot.send_message(chat_id=user_id, text=f'Keyword "{keyword}" could not be stored. Make sure to connect your telegram id (/id) on {os.getenv("APP_URL")} (statuscode {status})')
@bot.message_handler(commands=['removekeyword', 'Removekeyword']) # /removekeyword -> remove keyword from user
@@ -417,7 +417,7 @@ def send_keywords(message):
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 ' + os.getenv("WEBSITE_URL"))
bot.send_message(chat_id=user_id, text='This didn\'t work. Make sure to connect your telegram id (/id) on ' + os.getenv("APP_URL"))
return
if not keywords: # true if user is registered but does not have any keywords
@@ -513,7 +513,7 @@ def send_interval(message):
user_id = int(message.from_user.id)
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 ' + os.getenv("WEBSITE_URL") + ' 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 ' + os.getenv("APP_URL") + ' and set an interval with /setinterval')
return
else: # send interval
interval = str(user_data['cron']) # get cron from user data
@@ -538,7 +538,7 @@ def send_transactions(message):
transactions = api_handler.get_user_transactions(user_id) # get transactions of user
if transactions == None: # true if user does not exist
bot.send_message(chat_id=user_id, text='This didn\'t work. Make sure to connect your telegram id (/id) on ' + os.getenv("WEBSITE_URL"))
bot.send_message(chat_id=user_id, text='This didn\'t work. Make sure to connect your telegram id (/id) on ' + os.getenv("APP_URL"))
return
if not transactions: # true if user has no transactions
@@ -571,9 +571,9 @@ def send_shares(message):
shares = api_handler.get_user_shares(user_id) # get shares of user
if shares == None: # true if user does not exist
bot.send_message(chat_id=user_id, text='This didn\'t work. Make sure to connect your telegram id (/id) on ' + os.getenv("WEBSITE_URL"))
bot.send_message(chat_id=user_id, text='This didn\'t work. Make sure to connect your telegram id (/id) on ' + os.getenv("APP_URL"))
elif not shares: # true if user has no shares
bot.send_message(chat_id=user_id, text='You do not have any shares. Add shares on ' + os.getenv("WEBSITE_URL"))
bot.send_message(chat_id=user_id, text='You do not have any shares. Add shares on ' + os.getenv("APP_URL"))
else:
for element in shares:
bot.send_message(chat_id=user_id, text=share_fetcher.get_share_information_markdown(element), parse_mode="MARKDOWNV2")

View File

@@ -156,7 +156,7 @@ def update_for_user(p_user_id, p_my_handler):
my_update_message = f'{share_fetcher.get_share_information_markdown(share_symbols[i])}\ncount: {hf.make_markdown_proof(share_amounts[i])}\nTotal: {hf.make_markdown_proof(round(float(my_price) * float(share_amounts[i]), 2))} EUR'
bot.send_message(chat_id=p_user_id, text=my_update_message, parse_mode="MARKDOWNV2")
else:
send_to_user("No shares found for your account. Check " + os.getenv("WEBSITE_URL") + " to change your settings and add shares.", pUser_id=p_user_id)
send_to_user("No shares found for your account. Check " + os.getenv("APP_URL") + " to change your settings and add shares.", pUser_id=p_user_id)
if len(shares) != 0: # Send updates on watchlist shares if existing
send_to_user("Your watchlist shares:", pUser_id=p_user_id)

View File

@@ -1,4 +1,4 @@
pyTelegramBotAPI~=4.5.0
pyTelegramBotAPI~=4.7.0
Markdown~=3.3.6
newsapi-python~=0.2.6
python-dotenv~=0.20.0