Compare commits
131
Commits
0bc9c49b7f
...
c698008b0c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c698008b0c | ||
|
|
feaaa3fc83 | ||
|
|
988c7418c4 | ||
|
|
c07a155ecb | ||
|
|
062160e09e | ||
|
|
26ba216a32 | ||
|
|
84873c4296 | ||
|
|
054588e40c | ||
|
|
7c46d81092 | ||
|
|
37ddbef81c | ||
|
|
56da309644 | ||
|
|
3d472f4eaa | ||
|
|
99fa13d04c | ||
|
|
8b946bdd39 | ||
|
|
01413eb407 | ||
|
|
05bbd43236 | ||
|
|
9dcd7f94c7 | ||
|
|
559d786c7e | ||
|
|
f7110563cf | ||
|
|
f6d014b776 | ||
|
|
786c58166e | ||
|
|
163b211b02 | ||
|
|
f0f5d67b8b | ||
|
|
64ff8ddff8 | ||
|
|
6866d45400 | ||
|
|
03527d0d71 | ||
|
|
9261d4106a | ||
|
|
62cad30c48 | ||
|
|
ba2dae8906 | ||
|
|
51937b027f | ||
|
|
42b9c6efc4 | ||
|
|
3b90ca0d42 | ||
|
|
142b2f4ed7 | ||
|
|
0405a3d928 | ||
|
|
09e15afe62 | ||
|
|
d7d517eab8 | ||
|
|
edf7d60944 | ||
|
|
843056a8f9 | ||
|
|
71313fc27d | ||
|
|
ecab78527a | ||
|
|
d4e924cbc2 | ||
|
|
ffa6821549 | ||
|
|
b27648885d | ||
|
|
9ac3a9455f | ||
|
|
c74527d857 | ||
|
|
e368496a82 | ||
|
|
f81299ed8d | ||
|
|
c70bfe4b11 | ||
|
|
017a33f178 | ||
|
|
457393d033 | ||
|
|
7fa1015fdc | ||
|
|
2bf8ed712d | ||
|
|
43e04bd177 | ||
|
|
6dd6c231a2 | ||
|
|
93b081b840 | ||
|
|
b9b6e04ff8 | ||
|
|
75c5eb08ca | ||
|
|
393ce0fb78 | ||
|
|
00444221f4 | ||
|
|
3628d2eb51 | ||
|
|
ce014dfc57 | ||
|
|
5c0e86fca6 | ||
|
|
7af8142c62 | ||
|
|
ba00730bc5 | ||
|
|
87fcd64337 | ||
|
|
f4905606df | ||
|
|
056418c0f2 | ||
|
|
a6c0c7771d | ||
|
|
05943214d8 | ||
|
|
2dba172eec | ||
|
|
c0c5790311 | ||
|
|
ee28cac822 | ||
|
|
8675ac44b1 | ||
|
|
3876aae4a6 | ||
|
|
c6bd71d4a1 | ||
|
|
ffc50957c1 | ||
|
|
7106fdd7ab | ||
|
|
8f62a99ed8 | ||
|
|
4c33ba9383 | ||
|
|
9fbe79831c | ||
|
|
b4e07359c0 | ||
|
|
4cd5a6b014 | ||
|
|
c7d4891cfc | ||
|
|
e9e994de87 | ||
|
|
408559e494 | ||
|
|
b1d520b3d7 | ||
|
|
f6c34e0fd6 | ||
|
|
cc87104a0d | ||
|
|
0f67a1de05 | ||
|
|
2a5c652946 | ||
|
|
8cc7602709 | ||
|
|
a06a864dbc | ||
|
|
468a2a59e1 | ||
|
|
78446ea1d8 | ||
|
|
13f87087fa | ||
|
|
df19f8c255 | ||
|
|
8eef7d8c0a | ||
|
|
691b995500 | ||
|
|
21e1b783a7 | ||
|
|
c0d6e64aaa | ||
|
|
94cfb97a56 | ||
|
|
356b40c49d | ||
|
|
c93ee08cae | ||
|
|
2a494a4caf | ||
|
|
25f112d86a | ||
|
|
acc4664b2a | ||
|
|
f59bcd8ea9 | ||
|
|
b1a9195181 | ||
|
|
08d2b897ba | ||
|
|
c9e6ec42cb | ||
|
|
1cdc31c972 | ||
|
|
e5d0e65f2f | ||
|
|
b8d556d7d2 | ||
|
|
4bb0d423f0 | ||
|
|
bfa2be5c9d | ||
|
|
7f84747dd5 | ||
|
|
c118722fe9 | ||
|
|
e62badbc08 | ||
|
|
428fd0b5e3 | ||
|
|
d6edce1625 | ||
|
|
e8810202fa | ||
|
|
3371962300 | ||
|
|
76931cd7c1 | ||
|
|
27ce999c4b | ||
|
|
f152cce388 | ||
|
|
cb85968be4 | ||
|
|
f5b2bbb452 | ||
|
|
13d54a4752 | ||
|
|
71b39a2df3 | ||
|
|
88f10ebd41 | ||
|
|
bdb08f5b71 |
@@ -3,3 +3,7 @@
|
|||||||
/.settings/
|
/.settings/
|
||||||
/build/
|
/build/
|
||||||
/target/
|
/target/
|
||||||
|
src/main/main.iml
|
||||||
|
src/test/test.iml
|
||||||
|
bin
|
||||||
|
.env
|
||||||
Vendored
+64
@@ -0,0 +1,64 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"type": "java",
|
||||||
|
"name": "APIFootballUpdater",
|
||||||
|
"request": "launch",
|
||||||
|
"mainClass": "de.jeyp91.App",
|
||||||
|
"envFile": "${workspaceFolder}/.env",
|
||||||
|
"args": " --mode APIFootballUpdater --season 2026 --league 49 --configFile WM-Tippspiel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "java",
|
||||||
|
"name": "MatchesCreatorFootball",
|
||||||
|
"request": "launch",
|
||||||
|
"mainClass": "de.jeyp91.App",
|
||||||
|
"envFile": "${workspaceFolder}/.env",
|
||||||
|
"args": " --mode MatchesCreatorFootball --season 2026 --league 49 --configFile WM-Tippspiel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "java",
|
||||||
|
"name": "MatchesUpdaterFootball",
|
||||||
|
"request": "launch",
|
||||||
|
"mainClass": "de.jeyp91.App",
|
||||||
|
"envFile": "${workspaceFolder}/.env",
|
||||||
|
"args": " --mode MatchesUpdaterFootball --season 2026 --league 49 --configFile WM-Tippspiel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "java",
|
||||||
|
"name": "MatchdaysUpdater",
|
||||||
|
"request": "launch",
|
||||||
|
"mainClass": "de.jeyp91.App",
|
||||||
|
"envFile": "${workspaceFolder}/.env",
|
||||||
|
"args": " --mode MatchdaysUpdater --season 2026 --league 49 --configFile WM-Tippspiel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "java",
|
||||||
|
"name": "MatchesResultsUpdater",
|
||||||
|
"request": "launch",
|
||||||
|
"mainClass": "de.jeyp91.App",
|
||||||
|
"envFile": "${workspaceFolder}/.env",
|
||||||
|
"args": " --mode MatchesResultsUpdater --season 2026 --league 49 --configFile WM-Tippspiel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "java",
|
||||||
|
"name": "MatchesListGistUpdater",
|
||||||
|
"request": "launch",
|
||||||
|
"mainClass": "de.jeyp91.App",
|
||||||
|
"envFile": "${workspaceFolder}/.env",
|
||||||
|
"args": " --mode MatchesListGistUpdater --season 2026 --league 49 --configFile WM-Tippspiel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "java",
|
||||||
|
"name": "TeamsUpdater",
|
||||||
|
"request": "launch",
|
||||||
|
"mainClass": "de.jeyp91.App",
|
||||||
|
"envFile": "${workspaceFolder}/.env",
|
||||||
|
"args": " --mode TeamsUpdater --season 2026 --league 49 --configFile WM-Tippspiel"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Vendored
+8
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"java.compile.nullAnalysis.mode": "automatic",
|
||||||
|
"java.configuration.updateBuildConfiguration": "interactive",
|
||||||
|
"java.test.config": {
|
||||||
|
"envFile": "${workspaceFolder}/.env"
|
||||||
|
},
|
||||||
|
"java.debug.settings.onBuildFailureProceed": true,
|
||||||
|
}
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
<!-- headroom:rtk-instructions -->
|
||||||
|
# RTK (Rust Token Killer) - Token-Optimized Commands
|
||||||
|
|
||||||
|
When running shell commands, **always prefix with `rtk`**. This reduces context
|
||||||
|
usage by 60-90% with zero behavior change. If rtk has no filter for a command,
|
||||||
|
it passes through unchanged — so it is always safe to use.
|
||||||
|
|
||||||
|
## Key Commands
|
||||||
|
```bash
|
||||||
|
# Git (59-80% savings)
|
||||||
|
rtk git status rtk git diff rtk git log
|
||||||
|
|
||||||
|
# Files & Search (60-75% savings)
|
||||||
|
rtk ls <path> rtk read <file> rtk grep <pattern>
|
||||||
|
rtk find <pattern> rtk diff <file>
|
||||||
|
|
||||||
|
# Build (80-90% savings) — shows errors only
|
||||||
|
rtk ./gradlew build rtk ./gradlew compileJava
|
||||||
|
|
||||||
|
# Test (90-99% savings) — shows failures only
|
||||||
|
rtk ./gradlew test
|
||||||
|
|
||||||
|
# Analysis (70-90% savings)
|
||||||
|
rtk err <cmd> rtk log <file> rtk json <file>
|
||||||
|
rtk summary <cmd> rtk deps rtk env
|
||||||
|
|
||||||
|
# GitHub (26-87% savings)
|
||||||
|
rtk gh pr view <n> rtk gh run list rtk gh issue list
|
||||||
|
|
||||||
|
# Infrastructure (85% savings)
|
||||||
|
rtk docker ps rtk kubectl get rtk docker logs <c>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Rules
|
||||||
|
- In command chains, prefix each segment: `rtk git add . && rtk git commit -m "msg"`
|
||||||
|
- For debugging, use raw command without rtk prefix
|
||||||
|
- `rtk proxy <cmd>` runs command without filtering but tracks usage
|
||||||
|
<!-- /headroom:rtk-instructions -->
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# TLW Database Tool — Agent Guide
|
||||||
|
|
||||||
|
## Project Overview
|
||||||
|
Java CLI tool managing the Tippliga Würzburg football prediction league. Syncs match data from API-Football, manages MySQL database (phpBB forum), pushes Google Calendar events, sends WhatsApp reminders via OpenAI-generated messages, and uploads fixtures to S3.
|
||||||
|
|
||||||
|
## Build & Test
|
||||||
|
```bash
|
||||||
|
./gradlew build # compile + test + jar
|
||||||
|
./gradlew test # run all tests
|
||||||
|
./gradlew clean test # clean build + test
|
||||||
|
./gradlew jar # build fat JAR (all deps bundled)
|
||||||
|
./gradlew dependencies # list dependency tree
|
||||||
|
```
|
||||||
|
|
||||||
|
## Run Modes (CLI)
|
||||||
|
```
|
||||||
|
-m MatchdaysUpdater - Update delivery dates from match times
|
||||||
|
-m MatchesCreatorFootball - Create match schedule from API-Football
|
||||||
|
-m MatchesUpdaterFootball - Update match team/datetime from API-Football
|
||||||
|
-m MatchesResultsUpdater - Push match results to website
|
||||||
|
-m TeamsUpdater - Add missing teams to DB
|
||||||
|
-m APIFootballUpdater - Fetch fixtures/rounds from API-Football → S3
|
||||||
|
-m MatchesListGistUpdater - Update forum posts with fixture lists
|
||||||
|
-m PostChecksum - Print checksum of a config post
|
||||||
|
-m WhatsAppNotifier - Send WhatsApp reminders for missing bets
|
||||||
|
```
|
||||||
|
Required: `-s <season> -l <league> -c <configFile>`
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
```
|
||||||
|
App.java (CLI entry)
|
||||||
|
├── apifootball/ — API-Football HTTP client, match model, S3 caching
|
||||||
|
├── googlecalendar/ — Google Calendar API CRUD for matchday events
|
||||||
|
├── teamidmatcher/ — BiMap: Tippliga team ID ↔ API-Football team ID
|
||||||
|
├── tippliga/ — Domain models & operations (match, matchday, team, league)
|
||||||
|
├── tippligaforum/ — MySQL DB connector, phpBB forum post management
|
||||||
|
└── whatsapp/ — OpenAI-generated reminders, WhatsApp API sender
|
||||||
|
```
|
||||||
|
|
||||||
|
## Code Conventions
|
||||||
|
- Package: `de.jeyp91.*`
|
||||||
|
- SQL columns referenced by ordinal position (constants like `final int SEASON = 1`)
|
||||||
|
- Logger via SLF4J: `LoggerFactory.getLogger(Class.class)`
|
||||||
|
- Config stored as JSON in phpBB forum posts (not local files)
|
||||||
|
- API keys / secrets in environment variables
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
- JUnit 4 + TestNG
|
||||||
|
- Tests in `src/test/java/de/jeyp91/`
|
||||||
|
- Run single test: `./gradlew test --tests "de.jeyp91.apifootball.APIFootballMatchTest"`
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
# TLW Database Tool
|
||||||
|
|
||||||
|
CLI tool for **Tippliga Würzburg** football prediction league administration. Syncs match data from [API-Football](https://www.api-football.com/), manages a MySQL database backing a phpBB forum, pushes Google Calendar events, sends WhatsApp reminders with AI-generated messages via OpenAI, and uploads fixture data to S3.
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
App.java (CLI entry with argparse4j)
|
||||||
|
├── apifootball/ — API-Football HTTP client, match model, S3 caching
|
||||||
|
│ ├── APIFootballUpdater Fetch raw fixtures/rounds → S3
|
||||||
|
│ ├── APIFootballConnector Singleton, reads cached S3 data, resolves matchdays
|
||||||
|
│ ├── APIFootballMatch API-Football match model (extends BaseMatch)
|
||||||
|
│ └── APIFootballMatchesProvider Resolves config entries to match lists
|
||||||
|
├── googlecalendar/ — Google Calendar API CRUD
|
||||||
|
│ ├── GoogleCalendarConnector OAuth2 + service setup
|
||||||
|
│ ├── CalendarConfigProvider Reads calendar ID/URL from JSON resource
|
||||||
|
│ └── TippligaGoogleEventManager Create/update/delete matchday events
|
||||||
|
├── teamidmatcher/ — Bi-directional ID mapping
|
||||||
|
│ ├── TeamIDMatcher HashBiMap: Tippliga team ID ↔ API-Football ID
|
||||||
|
│ └── TeamIDMatcherTemplateCreator Generates config template from API teams
|
||||||
|
├── tippliga/ — Domain models & operations
|
||||||
|
│ ├── TLWMatch / TLWMatchday / TLWTeam / TLWLeague (DB-mapped models)
|
||||||
|
│ ├── TLWMatchesCreatorFootball Build match schedule from API data
|
||||||
|
│ ├── TLWMatchesCreatorTipperLeague Build tipper-vs-tipper league matches
|
||||||
|
│ ├── TLWMatchesCreatorTipperPokal Build knockout tournament matches
|
||||||
|
│ ├── TLWMatchesUpdaterFootball Update teams/datetimes from API
|
||||||
|
│ ├── TLWMatchesResultsUpdater Push finished match results to website
|
||||||
|
│ ├── TLWMatchdaysCreator Compute delivery dates from match times
|
||||||
|
│ ├── TLWMatchdaysUpdater Write delivery date updates to DB + Calendar
|
||||||
|
│ ├── TLWTeamsCreator / TLWTeamsUpdater Team management
|
||||||
|
│ └── TLWMatchesManagerBase Shared helpers (date math, match matching)
|
||||||
|
├── tippligaforum/ — MySQL + phpBB integration
|
||||||
|
│ ├── TippligaSQLConnector Singleton JDBC connector (all queries)
|
||||||
|
│ ├── TippligaConfigProvider Reads JSON config from forum posts
|
||||||
|
│ ├── TippligaWebsiteConnector HTTP client for admin result updates
|
||||||
|
│ └── MatchesListCreator / MatchesListForumUpdater Fixture list posts
|
||||||
|
└── whatsapp/ — WhatsApp reminder system
|
||||||
|
├── WhatsAppNotifier Sends messages via WhatsApp API
|
||||||
|
├── OpenAIConnector Generates reminder text via GPT-3.5
|
||||||
|
└── WhatsAppReminder Record: user, matchday, missing bets
|
||||||
|
|
||||||
|
BaseMatch — Abstract match with status/comparison/shared fields
|
||||||
|
S3Provider — AWS S3 read/write for cached API-Football JSON
|
||||||
|
ResourceProvider — Reads JSON config files from classpath resources
|
||||||
|
StatusHolder — Global error flag
|
||||||
|
```
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
- Java 17+
|
||||||
|
- MySQL database (phpBB with Tippliga extension)
|
||||||
|
- API-Football API key (free tier)
|
||||||
|
- Google Calendar API service account + credentials file
|
||||||
|
- AWS S3 bucket for fixture caching
|
||||||
|
- WhatsApp API endpoint
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
| Variable | Description |
|
||||||
|
|---|---|
|
||||||
|
| `TLW_DATABASE_USERNAME` | MySQL username |
|
||||||
|
| `TLW_DATABASE_PASSWORD` | MySQL password |
|
||||||
|
| `FORUM_USERNAME` | phpBB admin username (for website connector) |
|
||||||
|
| `FORUM_PASSWORD` | phpBB admin password |
|
||||||
|
| `OPENAI_TOKEN` | OpenAI API token (GPT reminders) |
|
||||||
|
| `TLW_WHATSAPP_HOST` | WhatsApp API host |
|
||||||
|
| `TLW_WHATSAPP_PORT` | WhatsApp API port |
|
||||||
|
| `TLW_WHATSAPP_API_KEY` | WhatsApp API key |
|
||||||
|
| `AWS_ACCESS_KEY_ID` | AWS credentials (S3) |
|
||||||
|
| `AWS_SECRET_ACCESS_KEY` | AWS credentials (S3) |
|
||||||
|
|
||||||
|
### Resources
|
||||||
|
Place these in `src/main/resources/`:
|
||||||
|
- `Tippliga/Team_ID_Matcher_Config.json` — team ID mapping
|
||||||
|
- `Tippliga/Ligen_v3.json` — league definitions
|
||||||
|
- `Google_Calendar_Config.json` — calendar IDs
|
||||||
|
- `Tippliga_Configs/<config>.json` — per-season match configs
|
||||||
|
|
||||||
|
Configs are stored as phpBB forum posts (JSON wrapped in `[code]` BBCode).
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build fat JAR
|
||||||
|
./gradlew jar
|
||||||
|
|
||||||
|
# Run modes (all require -s <season> -l <league> -c <configFile>)
|
||||||
|
java -jar build/libs/tlw-database-tool-1.0.jar -m MatchdaysUpdater -s 2025 -l 1 -c tl_2025
|
||||||
|
```
|
||||||
|
|
||||||
|
### CLI Modes
|
||||||
|
|
||||||
|
| Mode | Function |
|
||||||
|
|---|---|
|
||||||
|
| `MatchdaysUpdater` | Update delivery dates from match times, sync Google Calendar |
|
||||||
|
| `MatchesCreatorFootball` | Create match schedule from API-Football |
|
||||||
|
| `MatchesUpdaterFootball` | Update match teams/datetimes from API-Football |
|
||||||
|
| `MatchesResultsUpdater` | Push finished results to website |
|
||||||
|
| `TeamsUpdater` | Add missing teams to DB |
|
||||||
|
| `APIFootballUpdater` | Fetch raw fixtures/rounds → S3 |
|
||||||
|
| `MatchesListGistUpdater` | Update forum posts with fixture lists |
|
||||||
|
| `PostChecksum` | Print MD5 checksum of a config post |
|
||||||
|
| `WhatsAppNotifier` | Send WhatsApp reminders for missing bets |
|
||||||
|
|
||||||
|
### Build Commands
|
||||||
|
```bash
|
||||||
|
./gradlew build # compile + test + jar
|
||||||
|
./gradlew test # run all tests
|
||||||
|
./gradlew clean test # clean build + test
|
||||||
|
./gradlew jar # build fat JAR
|
||||||
|
./gradlew dependencies # list dependency tree
|
||||||
|
```
|
||||||
|
|
||||||
|
## Code Conventions
|
||||||
|
- Package: `de.jeyp91.*`
|
||||||
|
- SQL columns referenced by ordinal position in ResultSet (constants like `final int SEASON = 1`)
|
||||||
|
- Logger via SLF4J: `LoggerFactory.getLogger(Class.class)`
|
||||||
|
- Match status constants inherited from `BaseMatch`
|
||||||
|
- Config JSON stored in phpBB forum posts, loaded via `TippligaConfigProvider`
|
||||||
|
- Secrets in environment variables only
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
- JUnit 4 + TestNG
|
||||||
|
- Tests under `src/test/java/de/jeyp91/`
|
||||||
|
- Run single test: `./gradlew test --tests "de.jeyp91.apifootball.APIFootballMatchTest"`
|
||||||
|
|
||||||
|
## How It Works (Data Flow)
|
||||||
|
|
||||||
|
1. **APIFootballUpdater** fetches fixtures/rounds from API-Football → caches in S3
|
||||||
|
2. **APIFootballConnector** reads cached S3 data, resolves API matchdays to Tippliga matchdays
|
||||||
|
3. **TLWMatchesCreatorFootball** config on which API matches map to which Tippliga matchdays → SQL INSERT
|
||||||
|
4. **TLWMatchdaysCreator** computes delivery deadlines from match times
|
||||||
|
5. **TLWMatchdaysUpdater** writes deadlines to DB + creates/updates Google Calendar events
|
||||||
|
6. **TLWMatchesUpdaterFootball** updates team IDs, datetimes from latest API data
|
||||||
|
7. **TLWMatchesResultsUpdater** pushes finished match results to the website via HTTP
|
||||||
|
8. **WhatsAppNotifier** queries DB for users with missing bets, generates GPT reminders, sends via WhatsApp API
|
||||||
+22
-20
@@ -2,15 +2,16 @@
|
|||||||
* This file was generated by the Gradle 'init' task.
|
* This file was generated by the Gradle 'init' task.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
apply plugin: 'java'
|
plugins {
|
||||||
apply plugin: 'application'
|
id 'com.github.ben-manes.versions' version '0.52.0'
|
||||||
|
id 'java'
|
||||||
|
id 'application'
|
||||||
|
}
|
||||||
|
|
||||||
mainClassName = 'App'
|
mainClassName = 'App'
|
||||||
sourceCompatibility = 11
|
|
||||||
targetCompatibility = 11
|
|
||||||
version = '1.0'
|
version = '1.0'
|
||||||
compileJava.options.encoding = 'UTF-8'
|
compileJava.options.encoding = 'UTF-8'
|
||||||
compileTestJava.options.encoding = "UTF-8"
|
compileTestJava.options.encoding = 'UTF-8'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
@@ -18,22 +19,22 @@ repositories {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'mysql:mysql-connector-java:8.0.28'
|
implementation 'mysql:mysql-connector-java:8.0.33'
|
||||||
implementation 'org.apache.httpcomponents:httpclient:4.5.13'
|
implementation 'org.apache.httpcomponents:httpclient:4.5.14'
|
||||||
implementation 'com.googlecode.json-simple:json-simple:1.1.1'
|
implementation 'com.googlecode.json-simple:json-simple:1.1.1'
|
||||||
implementation 'com.google.code.gson:gson:2.9.0'
|
implementation 'com.google.code.gson:gson:2.11.0'
|
||||||
implementation platform('com.amazonaws:aws-java-sdk-bom:1.11.896')
|
implementation 'com.google.auth:google-auth-library-oauth2-http:1.31.0'
|
||||||
implementation 'com.amazonaws:aws-java-sdk-s3:1.12.173'
|
implementation 'com.google.api-client:google-api-client:2.7.2'
|
||||||
implementation 'com.google.api-client:google-api-client:1.33.2'
|
implementation 'com.google.apis:google-api-services-calendar:v3-rev20250115-2.0.0'
|
||||||
implementation 'com.google.oauth-client:google-oauth-client-jetty:1.33.1'
|
implementation 'com.google.guava:guava:33.4.0-jre'
|
||||||
implementation 'com.google.apis:google-api-services-calendar:v3-rev20211026-1.32.1'
|
implementation 'commons-cli:commons-cli:1.9.0'
|
||||||
|
implementation 'net.sourceforge.argparse4j:argparse4j:0.9.0'
|
||||||
|
implementation 'org.slf4j:slf4j-api:1.6.1'
|
||||||
|
implementation 'org.slf4j:slf4j-simple:1.6.1'
|
||||||
|
implementation 'javax.xml.bind:jaxb-api:2.4.0-b180830.0359'
|
||||||
|
implementation 'software.amazon.awssdk:s3:2.30.6'
|
||||||
testImplementation 'junit:junit:4.13.2'
|
testImplementation 'junit:junit:4.13.2'
|
||||||
compile 'com.google.guava:guava:31.1-jre'
|
testImplementation 'org.testng:testng:7.10.2'
|
||||||
compile group: 'commons-cli', name: 'commons-cli', version: '1.3.1'
|
|
||||||
compile group: 'net.sourceforge.argparse4j', name: 'argparse4j', version: '0.8.1'
|
|
||||||
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.14.1'
|
|
||||||
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.14.1'
|
|
||||||
compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.2.4'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
jar {
|
jar {
|
||||||
@@ -48,4 +49,5 @@ jar {
|
|||||||
from {
|
from {
|
||||||
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
|
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
|
||||||
}
|
}
|
||||||
}
|
duplicatesStrategy = DuplicatesStrategy.INCLUDE
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
# apifootball — API-Football Integration
|
||||||
|
|
||||||
|
Fetches, caches, and serves match data from [API-Football](https://www.api-football.com/). Raw JSON is cached in S3 to avoid repeated API calls.
|
||||||
|
|
||||||
|
## Classes
|
||||||
|
|
||||||
|
### APIFootballUpdater
|
||||||
|
HTTP client that fetches raw JSON from API-Football and writes to S3.
|
||||||
|
|
||||||
|
- `updateAllFixtures(season)` — fetches all leagues' fixtures
|
||||||
|
- `updateAllRounds(season)` — fetches all leagues' round metadata
|
||||||
|
- `getRawData(requestPath, season, league)` — calls API-Football with rate-limit retry
|
||||||
|
- `getLeagues()` — reads league IDs from `Ligen_v3.json` resource
|
||||||
|
|
||||||
|
Handles the Tippliga↔API-Football season offset: for most leagues, Tippliga season N corresponds to API-Football season N-1 (except World Cup `league=1` and Euro `league=4`).
|
||||||
|
|
||||||
|
### APIFootballConnector
|
||||||
|
Singleton that reads cached S3 JSON and resolves API data into `APIFootballMatch` objects.
|
||||||
|
|
||||||
|
- `getMatchDataByLeagueAndMatchday(league, matchday)` — all matches for a matchday
|
||||||
|
- `getMatchDataByLeagueAndMatchID(league, id)` — single match by API fixture ID
|
||||||
|
- `getMatchdays(leagueId)` — round metadata from S3
|
||||||
|
- `getTeamsForLeague(season, league)` — live team list from API
|
||||||
|
|
||||||
|
### APIFootballMatch
|
||||||
|
Extends `BaseMatch`. Parses a raw API-Football JSON fixture object.
|
||||||
|
|
||||||
|
Parses: fixture ID, league ID, team IDs + names, round string, datetime, status, fulltime/extratime/penalty scores.
|
||||||
|
|
||||||
|
Key method: `getMatchdayFromRoundString(season, round, leagueId)` — converts API round names (e.g. `"Regular Season - 1"`) to Tippliga matchday numbers. Falls back to the rounds JSON for non-regular-season formats.
|
||||||
|
|
||||||
|
### APIFootballMatchesProvider
|
||||||
|
High-level resolver that reads matchday config (from the JSON config file) and returns flat `APIFootballMatch` lists.
|
||||||
|
|
||||||
|
Supports two config entry types:
|
||||||
|
- `AllMatchesOfMatchday` — fetch all matches for a given API league+matchday
|
||||||
|
- `SingleMatch` — fetch a specific match by API league+fixture ID
|
||||||
|
|
||||||
|
Honors `showTable` and `ko` flags from config.
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# googlecalendar — Google Calendar Integration
|
||||||
|
|
||||||
|
Manages matchday deadline events in Google Calendar. Each matchday can have up to 3 delivery deadlines (1st, 2nd, 3rd chance).
|
||||||
|
|
||||||
|
## Classes
|
||||||
|
|
||||||
|
### GoogleCalendarConnector
|
||||||
|
Sets up the Google Calendar API service using a service account.
|
||||||
|
|
||||||
|
- Reads service account credentials from `tippliga-4e0def9ef447.json` (classpath resource)
|
||||||
|
- Uses `CalendarScopes.CALENDAR` scope
|
||||||
|
- Returns authenticated `com.google.api.services.calendar.Calendar` service
|
||||||
|
|
||||||
|
### CalendarConfigProvider
|
||||||
|
Reads calendar ID and URL from `Google_Calendar_Config.json` resource. Currently hardcoded to league 1.
|
||||||
|
|
||||||
|
### TippligaGoogleEventManager
|
||||||
|
CRUD operations for matchday deadline events.
|
||||||
|
|
||||||
|
- `createOrUpdateEventsForMatchday(matchday)` — creates/updates up to 3 events per matchday
|
||||||
|
- `createNewEvent()` / `updateEvent()` / `deleteEvent()` — individual event operations
|
||||||
|
- `deleteAllEvents(season)` — wipe all events for a season
|
||||||
|
- `updateAllMatchdays(matchdays)` — batch update; automatically deletes events for removed delivery dates
|
||||||
|
|
||||||
|
Event details:
|
||||||
|
- **Summary**: `"Tippliga Spieltag N tippen!"` (or custom matchday name)
|
||||||
|
- **Description**: season, league, matchday, delivery deadline number
|
||||||
|
- **Location**: `https://tippliga-wuerzburg.de/app.php/football/bet`
|
||||||
|
- **Time**: delivery deadline datetime, Europe/Berlin timezone
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
# teamidmatcher — Team ID Mapping
|
||||||
|
|
||||||
|
Maintains a bi-directional mapping between Tippliga (phpBB) team IDs and API-Football team IDs. Uses a Guava `HashBiMap` loaded from `Team_ID_Matcher_Config.json`.
|
||||||
|
|
||||||
|
## Classes
|
||||||
|
|
||||||
|
### TeamIDMatcher
|
||||||
|
Singleton `HashBiMap<Integer, Integer>` mapping Tippliga IDs ↔ API-Football IDs.
|
||||||
|
|
||||||
|
- `getApiFootballIdFromTippligaId(id)` — Tippliga → API-Football
|
||||||
|
- `getTippligaIdFromApiFootballId(match, homeguest)` — API-Football → Tippliga, for a given match and team side
|
||||||
|
- `getTeamNameFromTippligaId(id)` — human-readable team name
|
||||||
|
|
||||||
|
Sets `StatusHolder.setError()` if a lookup fails. Used by `TLWMatch`, `TLWMatchesUpdaterFootball`, `TLWMatchesResultsUpdater`.
|
||||||
|
|
||||||
|
Config format (`Team_ID_Matcher_Config.json`):
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{ "tippligaID": 1, "teamname": "Team Name", "apiFootballID": 12345 },
|
||||||
|
...
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
### TeamIDMatcherTemplateCreator
|
||||||
|
Utility that fetches teams from API-Football for a given league and generates a JSON config template. Useful when setting up new seasons — outputs skeleton entries with `apiFootballID` pre-filled, `tippligaID` left blank.
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
# tippliga — Domain Models & Operations
|
||||||
|
|
||||||
|
Core domain package with match, matchday, team, and league models plus operations for creating, updating, and managing the prediction league schedule. All extend `TLWMatchesManagerBase` or `TLWMatchesCreatorBase`.
|
||||||
|
|
||||||
|
## Base Classes
|
||||||
|
|
||||||
|
### BaseMatch (`de.jeyp91.BaseMatch`)
|
||||||
|
Abstract class with shared match state: team IDs, goals (home/guest/overtime/penalty), datetime, status, KO flag, show-table flag, and a `COMPARISON` enum (`IDENTICAL`, `DIFFERENT`, `DIFFERENT_DATETIME`, `DIFFERENT_RESULT`).
|
||||||
|
|
||||||
|
Status constants:
|
||||||
|
- `STATUS_NOTSTARTED = 0`
|
||||||
|
- `STATUS_STARTED = 1`
|
||||||
|
- `STATUS_PROVISIONAL_RESULT_AVAILABLE = 2`
|
||||||
|
- `STATUS_FINISHED = 3`
|
||||||
|
- `STATUS_NOT_EVALUATED = 4`
|
||||||
|
|
||||||
|
### TLWMatchesCreatorBase
|
||||||
|
Abstract creator with `TLWMatches` list, `getSQLInsertString()` generating `REPLACE INTO` queries, `getMatchesForMatchday()`, and `getNumberOfMatchdays()`.
|
||||||
|
|
||||||
|
### TLWMatchesManagerBase
|
||||||
|
Shared helpers used by updaters:
|
||||||
|
- Date parsing from TLW (`yyyy-MM-dd HH:mm:ss`) and API-Football (`yyyy-MM-dd'T'HH:mm:ss`) formats
|
||||||
|
- `getFirstMatchtimeTLW()` / `getFirstMatchtimeAPIFootball()` — earliest match in a list
|
||||||
|
- `getDaysDifference()` — calendar day diff
|
||||||
|
- `getMatchesStartingFromSecondDay()` / `getMatchesStartingFromSecondWeek()` — filter helpers for delivery date computation
|
||||||
|
- `getMatchingMatch()` — matches an API match to a TLW match by home/guest team IDs
|
||||||
|
|
||||||
|
## Domain Models
|
||||||
|
|
||||||
|
### TLWMatch (extends BaseMatch)
|
||||||
|
Full match model mapped from `phpbb_footb_matches` table. Multiple constructors:
|
||||||
|
- From `ResultSet` (DB query)
|
||||||
|
- From `APIFootballMatch` + `TeamIDMatcher` (API sync)
|
||||||
|
- Manual constructors for creators
|
||||||
|
- Copy constructor
|
||||||
|
|
||||||
|
Key methods:
|
||||||
|
- `getSQLQueryInsert()` / `getSQLQueryReplace()` — generates SQL values
|
||||||
|
- `updateMatch(APIFootballMatch)` — updates teams, goals, datetime from API data
|
||||||
|
- `isSameMatchPlaceholder()` — matches placeholder config entries to existing matches
|
||||||
|
|
||||||
|
### TLWMatchday
|
||||||
|
Mapped from `phpbb_footb_matchdays`. Fields: season, league, matchday, status, 3 delivery dates, matchday name, match count.
|
||||||
|
|
||||||
|
### TLWTeam
|
||||||
|
Mapped from `phpbb_footb_teams`. Fields: season, league, team ID, name, short name, symbol, group ID, matchday.
|
||||||
|
|
||||||
|
### TLWLeague
|
||||||
|
Mapped from `phpbb_footb_leagues`. Fields: season, league ID, league name, short name.
|
||||||
|
|
||||||
|
## Operations
|
||||||
|
|
||||||
|
### TLWMatchesCreatorFootball
|
||||||
|
Builds match schedule from API-Football data and JSON config. For each matchday config entry:
|
||||||
|
1. Resolves API matches via `APIFootballMatchesProvider`
|
||||||
|
2. Creates `TLWMatch` objects with team IDs matched via `TeamIDMatcher`
|
||||||
|
3. Fills remaining slots with placeholder matches (empty teams)
|
||||||
|
|
||||||
|
Handles `deliveryDateMode`: in `"single"` mode, matches beyond the first day get `status = -1` to prevent early betting on later matches.
|
||||||
|
|
||||||
|
### TLWMatchesCreatorTipperLeague
|
||||||
|
Creates matches for tipper-vs-tipper leagues (where tippers are "teams"). Reads pairing config from `Tipper_Match_Pair_Config.json` and tipper-team mapping from `Tipper_Team_Config.json`.
|
||||||
|
|
||||||
|
### TLWMatchesCreatorTipperPokal
|
||||||
|
Creates single-matchday knockout tournament matches from a tipper list config. Each pair of tippers is one match with `koMatch = 1` and `showTable = false`.
|
||||||
|
|
||||||
|
### TLWMatchesUpdaterFootball
|
||||||
|
Compares current DB matches with latest API data and generates SQL UPDATE statements. Only operates on matchdays where the first match is still in the future. Updates:
|
||||||
|
- Team IDs (via `TeamIDMatcher`)
|
||||||
|
- Match datetimes
|
||||||
|
- Status flags (0 = current matchday, -1 = next-day match, -2 = later)
|
||||||
|
- `show_table` / `ko_match` flags
|
||||||
|
|
||||||
|
Also handles:
|
||||||
|
- `addMissingMatches()` — inserts API matches not yet in DB (finds placeholder slots by datetime/formula)
|
||||||
|
- `addPlaceholderMatches()` — adds config-defined placeholders for TBD matchups
|
||||||
|
|
||||||
|
### TLWMatchesResultsUpdater
|
||||||
|
For finished matches, compares DB goals with API goals and pushes updates to the website via `TippligaWebsiteConnector`. Detects changes to:
|
||||||
|
- Full-time goals
|
||||||
|
- Overtime goals (for KO matches with `betKOType = 2`)
|
||||||
|
- Penalty → overtime mapping (for `betKOType = 1` or `3`)
|
||||||
|
- Status transitions from provisional to confirmed
|
||||||
|
|
||||||
|
### TLWMatchdaysCreator
|
||||||
|
Computes delivery dates (betting deadlines) from match times. Supports two modes:
|
||||||
|
- **"single"**: one deadline = first match time
|
||||||
|
- **"multiple"** (default): 3 deadlines — first match, first match of second day, first match of second week
|
||||||
|
|
||||||
|
Also handles `additionalDeliveryDate` config flags for special matchday events.
|
||||||
|
|
||||||
|
### TLWMatchdaysUpdater
|
||||||
|
Compares original DB matchdays with recomputed deadlines and generates SQL UPDATEs and Google Calendar syncs. Only updates future matchdays (deadline in the past is skipped).
|
||||||
|
|
||||||
|
### TLWTeamsCreator
|
||||||
|
Extracts unique team IDs from a list of matches and generates `REPLACE INTO phpbb_footb_teams` SQL, preserving group and matchday info from match data.
|
||||||
|
|
||||||
|
### TLWTeamsUpdater
|
||||||
|
Detects teams referenced in matches but not yet present in the league's team table. Generates INSERT SQL to add them (copies team metadata from existing entries in other seasons/leagues).
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
# tippligaforum — MySQL & phpBB Integration
|
||||||
|
|
||||||
|
Database connector, config loader, website HTTP client, and forum post management.
|
||||||
|
|
||||||
|
## Classes
|
||||||
|
|
||||||
|
### TippligaSQLConnector
|
||||||
|
Singleton JDBC connector to the phpBB MySQL database (`d0144ddb`). Connects to production via credentials from environment variables, with a fallback to localhost.
|
||||||
|
|
||||||
|
All major queries in one class:
|
||||||
|
- `getTeams()`, `getMatches()`, `getMatchdays()`, `getLeague()` — read domain objects
|
||||||
|
- `getUpdatedMatchdaysBasedOnMatches()` — complex SQL that computes delivery deadlines from match times (uses `DATEDIFF` to split deadlines across days/weeks)
|
||||||
|
- `getNextWhatsAppReminders(hours)` — multi-table query finding users with missing bets on upcoming matchdays, joins with reminder tracking to avoid duplicates
|
||||||
|
- `updatePost()` / `getPost()` / `getChecksumOfPost()` — phpBB post CRUD
|
||||||
|
- `executeQuery()` / `executeUpdate()` — raw SQL access
|
||||||
|
- `markWhatsAppReminderAsSent()` — logs sent reminders
|
||||||
|
|
||||||
|
Post updates use the phpBB checksum mechanism: `post_checksum` = MD5 of XML-escaped post text.
|
||||||
|
|
||||||
|
### TippligaConfigProvider
|
||||||
|
Reads JSON configuration from phpBB forum posts. Configs are stored as topics under the `Admin → Tippliga-Config → <season>` forum hierarchy.
|
||||||
|
|
||||||
|
- `getTippligaConfig(config)` — fetches post, strips `[code]` BBCode wrapper, parses JSON
|
||||||
|
- `getChecksumOfConfigPost(configFile)` — reads post checksum for integrity verification
|
||||||
|
|
||||||
|
### TippligaWebsiteConnector
|
||||||
|
HTTP client that logs into the phpBB frontend + admin panel and submits match results. Used by `TLWMatchesResultsUpdater`.
|
||||||
|
|
||||||
|
Login flow:
|
||||||
|
1. GET login page → extract `creation_time`, `form_token`, `sid` from hidden fields
|
||||||
|
2. POST credentials → capture session cookies
|
||||||
|
3. GET admin panel → extract admin credential token
|
||||||
|
4. POST admin login with `password_<credential>` parameter
|
||||||
|
|
||||||
|
Result submission:
|
||||||
|
1. GET results management page → extract CSRF tokens
|
||||||
|
2. POST form with season, league, matchday, match scores (home, guest, overtime)
|
||||||
|
|
||||||
|
### MatchesListCreator
|
||||||
|
Generates a JSON match list config from raw API-Football fixture data (read from S3). Creates `SingleMatch` config entries with matchday, matchtime, team names, and fixture IDs. Used by `MatchesListForumUpdater` to create fixture list forum posts.
|
||||||
|
|
||||||
|
### MatchesListForumUpdater
|
||||||
|
For each league:
|
||||||
|
1. Creates `MatchesListCreator` from S3 fixture data
|
||||||
|
2. Formats as pretty-printed JSON
|
||||||
|
3. Wraps in `[code]` BBCode
|
||||||
|
4. Finds the correct forum post (under `Admin → Tippliga-Config → <season> → Ligen → <country> <league>`)
|
||||||
|
5. Updates the post text via `TippligaSQLConnector`
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# whatsapp — WhatsApp Reminder System
|
||||||
|
|
||||||
|
Sends personalized WhatsApp reminders to users who haven't submitted their bets before the deadline. Uses OpenAI GPT-3.5 to generate natural-language reminder messages.
|
||||||
|
|
||||||
|
## Classes
|
||||||
|
|
||||||
|
### WhatsAppNotifier
|
||||||
|
Orchestrates the reminder workflow:
|
||||||
|
|
||||||
|
1. Queries DB for upcoming reminders at 2 checkpoints: **24 hours** and **2 hours** before deadline
|
||||||
|
2. For each reminder, generates a message via `OpenAIConnector`
|
||||||
|
3. Sends via WhatsApp API (HTTP POST to configurable host:port)
|
||||||
|
4. Marks sent reminders in DB to avoid duplicates
|
||||||
|
|
||||||
|
Requires env vars: `TLW_WHATSAPP_HOST`, `TLW_WHATSAPP_PORT`, `TLW_WHATSAPP_API_KEY`.
|
||||||
|
|
||||||
|
### OpenAIConnector
|
||||||
|
Caches and generates reminder text via OpenAI Chat Completions API (model `gpt-3.5-turbo-0125`).
|
||||||
|
|
||||||
|
Prompt structure:
|
||||||
|
- **System prompt** (German): "Generate a message reminding someone to submit missing tips. Must sound like a friend. Use correct singular/plural."
|
||||||
|
- **User input**: JSON with league name, matchday name, delivery day, time
|
||||||
|
- **Output template** has 2 variants — 24h deadline uses a friendly intro, 2h deadline emphasizes urgency
|
||||||
|
|
||||||
|
Message format:
|
||||||
|
```
|
||||||
|
Hey <username>,
|
||||||
|
<AI-generated intro>
|
||||||
|
Bitte gib die fehlenden Tipps bis <today/morgen> um <HH:MM> ab.
|
||||||
|
Du kannst deine Tipps wie immer unter https://tippliga-wuerzburg.de/app.php/football/bet abgeben.
|
||||||
|
Viele Grüße
|
||||||
|
Die Tippliga Admins
|
||||||
|
```
|
||||||
|
|
||||||
|
Messages are cached per (league + matchday + delivery) key to avoid repeated API calls.
|
||||||
|
|
||||||
|
### WhatsAppReminder
|
||||||
|
Java `record` with fields: season, league, leagueName, matchday, matchdayName, deliveryDate, todayTomorrow, time, remainingHours, userId, username, phoneNumber, missingBets.
|
||||||
|
|
||||||
|
Maps directly to the SQL query result from `TippligaSQLConnector.getNextWhatsAppReminders()`.
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
#This file is generated by updateDaemonJvm
|
||||||
|
toolchainVersion=22
|
||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
#Tue May 26 17:58:07 CEST 2020
|
#Tue May 26 17:58:07 CEST 2020
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-all.zip
|
distributionUrl=https://services.gradle.org/distributions/gradle-8.12.1-bin.zip
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
+90
@@ -0,0 +1,90 @@
|
|||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Restore tlw-database-tool') {
|
||||||
|
steps {
|
||||||
|
copyArtifacts filter: '**/tlw-database-tool-1.0.jar', fingerprintArtifacts: true, projectName: 'build tlw-database-tool', selector: lastSuccessful(), target: '.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Execute') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
String jdkPath = tool name: 'OpenJDK22', type: 'jdk'
|
||||||
|
withCredentials([
|
||||||
|
usernamePassword(credentialsId: 'aws', usernameVariable: 'AWS_ACCESS_KEY_ID', passwordVariable: 'AWS_SECRET_ACCESS_KEY'),
|
||||||
|
usernamePassword(credentialsId: 'forum_database', usernameVariable: 'TLW_DATABASE_USERNAME', passwordVariable: 'TLW_DATABASE_PASSWORD'),
|
||||||
|
usernamePassword(credentialsId: 'forum_user', usernameVariable: 'FORUM_USERNAME', passwordVariable: 'FORUM_PASSWORD')
|
||||||
|
]) {
|
||||||
|
withEnv([
|
||||||
|
"JAVA_HOME=${jdkPath}/jdk-22.0.2"
|
||||||
|
]) {
|
||||||
|
try {
|
||||||
|
sh "java --version"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode APIFootballUpdater --season ${season} --league 1 --configFile Tippliga >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchesListGistUpdater --season ${season} --league 1 --configFile Tippliga >> log.txt 2>&1"
|
||||||
|
} catch (Exception e) {
|
||||||
|
telegramSendManual("TLW-Database-Tool crashed!")
|
||||||
|
}
|
||||||
|
String outputString = readFile 'log.txt'
|
||||||
|
if(outputString != "") {
|
||||||
|
ArrayList<String> outputList = outputString.replace("\n\n", "\n").split('\n').toList()
|
||||||
|
outputList = clean(outputList)
|
||||||
|
outputList.each {
|
||||||
|
telegramSendManual(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Trigger Tool') {
|
||||||
|
steps {
|
||||||
|
echo 'Trigger jobs'
|
||||||
|
build wait: false, job: 'TippligaUpdater'
|
||||||
|
build wait: false, job: 'WTLPokalUpdater'
|
||||||
|
build wait: false, job: 'SupercupUpdater'
|
||||||
|
build wait: false, job: 'RelegationUpdater'
|
||||||
|
build wait: false, job: 'LigaCupUpdater'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
deleteDir()
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
telegramSendManual("Build failed!\n${env.BUILD_URL}console")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<String> clean(ArrayList<String> orig) {
|
||||||
|
ArrayList<String> cleaned = new ArrayList<String>()
|
||||||
|
orig.each{line ->
|
||||||
|
if(line.indexOf(" [main] INFO de.jeyp91 - ") >= 0) {
|
||||||
|
line = line.substring(20, line.size())
|
||||||
|
}
|
||||||
|
|
||||||
|
if(line.indexOf(" [main] ERROR de.jeyp91") >= 0) {
|
||||||
|
line = line.substring(20, line.size())
|
||||||
|
}
|
||||||
|
cleaned.add(line)
|
||||||
|
}
|
||||||
|
return cleaned.unique()
|
||||||
|
}
|
||||||
|
|
||||||
|
def telegramSendManual(String text) {
|
||||||
|
def encodedMessage = URLEncoder.encode(text, "UTF-8")
|
||||||
|
println encodedMessage
|
||||||
|
httpRequest(
|
||||||
|
httpMode: 'GET',
|
||||||
|
contentType: 'APPLICATION_JSON',
|
||||||
|
responseHandle: 'NONE',
|
||||||
|
url: "https://api.telegram.org/bot1298223079:AAEplcQpfzFG59qNYAYuSbJKtB9HMXCCE_U/sendMessage?text=$encodedMessage&chat_id=459231986&disable_web_page_preview=true",
|
||||||
|
wrapAsMultipart: false,
|
||||||
|
consoleLogResponseBody: true
|
||||||
|
)
|
||||||
|
sleep 1
|
||||||
|
}
|
||||||
+72
@@ -0,0 +1,72 @@
|
|||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Restore tlw-database-tool') {
|
||||||
|
steps {
|
||||||
|
copyArtifacts filter: '**/tlw-database-tool-1.0.jar', fingerprintArtifacts: true, projectName: 'build tlw-database-tool', selector: lastSuccessful(), target: '.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('GetAndWriteChecksum') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
String jdkPath = tool name: 'OpenJDK22', type: 'jdk'
|
||||||
|
withCredentials([
|
||||||
|
usernamePassword(credentialsId: 'aws', usernameVariable: 'AWS_ACCESS_KEY_ID', passwordVariable: 'AWS_SECRET_ACCESS_KEY'),
|
||||||
|
usernamePassword(credentialsId: 'forum_database', usernameVariable: 'TLW_DATABASE_USERNAME', passwordVariable: 'TLW_DATABASE_PASSWORD'),
|
||||||
|
usernamePassword(credentialsId: 'forum_user', usernameVariable: 'FORUM_USERNAME', passwordVariable: 'FORUM_PASSWORD')
|
||||||
|
]) {
|
||||||
|
withEnv([
|
||||||
|
"JAVA_HOME=${jdkPath}/jdk-22.0.2"
|
||||||
|
]) {
|
||||||
|
String checksum_tippliga = sh returnStdout: true, script: "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode PostChecksum --season ${season} --league 1 --configFile Tippliga 2>&1"
|
||||||
|
writeFile file: 'checksum_tippliga.txt', text: checksum_tippliga
|
||||||
|
archiveArtifacts artifacts: 'checksum_tippliga.txt', followSymlinks: false
|
||||||
|
String checksum_wtlpokal = sh returnStdout: true, script: "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode PostChecksum --season ${season} --league 1 --configFile WTL-Pokal 2>&1"
|
||||||
|
writeFile file: 'checksum_wtlpokal.txt', text: checksum_wtlpokal
|
||||||
|
archiveArtifacts artifacts: 'checksum_wtlpokal.txt', followSymlinks: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('CompareChecksums') {
|
||||||
|
steps {
|
||||||
|
copyArtifacts filter: 'checksum*', fingerprintArtifacts: true, projectName: 'CheckGistUpdates', selector: lastWithArtifacts(), target: 'last'
|
||||||
|
script {
|
||||||
|
String checksumTippliga = readFile 'checksum_tippliga.txt'
|
||||||
|
String lastChecksumTippliga = readFile 'last/checksum_tippliga.txt'
|
||||||
|
String checksumWTLPokal = readFile 'checksum_wtlpokal.txt'
|
||||||
|
String lastChecksumWTLPokal = readFile 'last/checksum_wtlpokal.txt'
|
||||||
|
if(!checksumTippliga.equals(lastChecksumTippliga)){
|
||||||
|
telegramSendManual('Tippliga Update')
|
||||||
|
build wait: false, job: 'TippligaUpdater'
|
||||||
|
}
|
||||||
|
if(!checksumWTLPokal.equals(lastChecksumWTLPokal)){
|
||||||
|
telegramSendManual('WTL-Pokal Update')
|
||||||
|
build wait: false, job: 'WTLPokalUpdater'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
failure {
|
||||||
|
telegramSendManual("Build failed!\n${env.BUILD_URL}console")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def telegramSendManual(String text) {
|
||||||
|
sleep 1
|
||||||
|
def encodedMessage = URLEncoder.encode(text, "UTF-8")
|
||||||
|
println encodedMessage
|
||||||
|
httpRequest(
|
||||||
|
httpMode: 'GET',
|
||||||
|
contentType: 'APPLICATION_JSON',
|
||||||
|
responseHandle: 'NONE',
|
||||||
|
url: "https://api.telegram.org/bot1298223079:AAEplcQpfzFG59qNYAYuSbJKtB9HMXCCE_U/sendMessage?text=$encodedMessage&chat_id=459231986&disable_web_page_preview=true",
|
||||||
|
wrapAsMultipart: false,
|
||||||
|
consoleLogResponseBody: true
|
||||||
|
)
|
||||||
|
}
|
||||||
+82
@@ -0,0 +1,82 @@
|
|||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Restore tlw-database-tool') {
|
||||||
|
steps {
|
||||||
|
copyArtifacts filter: '**/tlw-database-tool-1.0.jar', fingerprintArtifacts: true, projectName: 'build tlw-database-tool', selector: lastSuccessful(), target: '.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Execute') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
String jdkPath = tool name: 'OpenJDK22', type: 'jdk'
|
||||||
|
withCredentials([
|
||||||
|
usernamePassword(credentialsId: 'aws', usernameVariable: 'AWS_ACCESS_KEY_ID', passwordVariable: 'AWS_SECRET_ACCESS_KEY'),
|
||||||
|
usernamePassword(credentialsId: 'forum_database', usernameVariable: 'TLW_DATABASE_USERNAME', passwordVariable: 'TLW_DATABASE_PASSWORD'),
|
||||||
|
usernamePassword(credentialsId: 'forum_user', usernameVariable: 'FORUM_USERNAME', passwordVariable: 'FORUM_PASSWORD'),
|
||||||
|
string(credentialsId: 'google_calendar_private_key_id', variable: 'GOOGLE_CALENDAR_TIPPLIGA_SERVICE_ACCOUNT_PRIVATE_KEY_ID'),
|
||||||
|
string(credentialsId: 'google_calendar_private_key', variable: 'GOOGLE_CALENDAR_TIPPLIGA_SERVICE_ACCOUNT_PRIVATE_KEY')
|
||||||
|
]) {
|
||||||
|
withEnv([
|
||||||
|
"JAVA_HOME=${jdkPath}/jdk-22.0.2"
|
||||||
|
]) {
|
||||||
|
try {
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchesResultsUpdater --season ${season} --league 49 --configFile WM-Tippspiel >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchesUpdaterFootball --season ${season} --league 49 --configFile WM-Tippspiel >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchdaysUpdater --season ${season} --league 49 --configFile WM-Tippspiel >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode TeamsUpdater --season ${season} --league 49 --configFile WM-Tippspiel >> log.txt 2>&1"
|
||||||
|
} catch (Exception e) {
|
||||||
|
telegramSendManual("TLW-Database-Tool crashed!")
|
||||||
|
}
|
||||||
|
String outputString = readFile 'log.txt'
|
||||||
|
if(outputString != "") {
|
||||||
|
ArrayList<String> outputList = outputString.replace("\n\n", "\n").split('\n').toList()
|
||||||
|
outputList = clean(outputList)
|
||||||
|
outputList.each {
|
||||||
|
telegramSendManual(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
deleteDir()
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
telegramSendManual("Build failed!\n${env.BUILD_URL}console")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<String> clean(ArrayList<String> orig) {
|
||||||
|
ArrayList<String> cleaned = new ArrayList<String>()
|
||||||
|
orig.each{line ->
|
||||||
|
if(line.indexOf(" [main] INFO de.jeyp91 - ") >= 0) {
|
||||||
|
line = line.substring(20, line.size())
|
||||||
|
}
|
||||||
|
|
||||||
|
if(line.indexOf(" [main] ERROR de.jeyp91") >= 0) {
|
||||||
|
line = line.substring(20, line.size())
|
||||||
|
}
|
||||||
|
cleaned.add(line)
|
||||||
|
}
|
||||||
|
return cleaned.unique()
|
||||||
|
}
|
||||||
|
|
||||||
|
def telegramSendManual(String text) {
|
||||||
|
def encodedMessage = URLEncoder.encode(text, "UTF-8")
|
||||||
|
println encodedMessage
|
||||||
|
httpRequest(
|
||||||
|
httpMode: 'GET',
|
||||||
|
contentType: 'APPLICATION_JSON',
|
||||||
|
responseHandle: 'NONE',
|
||||||
|
url: "https://api.telegram.org/bot1298223079:AAEplcQpfzFG59qNYAYuSbJKtB9HMXCCE_U/sendMessage?text=$encodedMessage&chat_id=459231986&disable_web_page_preview=true",
|
||||||
|
wrapAsMultipart: false,
|
||||||
|
consoleLogResponseBody: true
|
||||||
|
)
|
||||||
|
}
|
||||||
+82
@@ -0,0 +1,82 @@
|
|||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Restore tlw-database-tool') {
|
||||||
|
steps {
|
||||||
|
copyArtifacts filter: '**/tlw-database-tool-1.0.jar', fingerprintArtifacts: true, projectName: 'build tlw-database-tool', selector: lastSuccessful(), target: '.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Execute') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
String jdkPath = tool name: 'OpenJDK22', type: 'jdk'
|
||||||
|
withCredentials([
|
||||||
|
usernamePassword(credentialsId: 'aws', usernameVariable: 'AWS_ACCESS_KEY_ID', passwordVariable: 'AWS_SECRET_ACCESS_KEY'),
|
||||||
|
usernamePassword(credentialsId: 'forum_database', usernameVariable: 'TLW_DATABASE_USERNAME', passwordVariable: 'TLW_DATABASE_PASSWORD'),
|
||||||
|
usernamePassword(credentialsId: 'forum_user', usernameVariable: 'FORUM_USERNAME', passwordVariable: 'FORUM_PASSWORD'),
|
||||||
|
string(credentialsId: 'google_calendar_private_key_id', variable: 'GOOGLE_CALENDAR_TIPPLIGA_SERVICE_ACCOUNT_PRIVATE_KEY_ID'),
|
||||||
|
string(credentialsId: 'google_calendar_private_key', variable: 'GOOGLE_CALENDAR_TIPPLIGA_SERVICE_ACCOUNT_PRIVATE_KEY')
|
||||||
|
]) {
|
||||||
|
withEnv([
|
||||||
|
"JAVA_HOME=${jdkPath}/jdk-22.0.2"
|
||||||
|
]) {
|
||||||
|
try {
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchesResultsUpdater --season ${season} --league 47 --configFile Relegation >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchesUpdaterFootball --season ${season} --league 47 --configFile Relegation >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchdaysUpdater --season ${season} --league 47 --configFile Relegation >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode TeamsUpdater --season ${season} --league 47 --configFile Relegation >> log.txt 2>&1"
|
||||||
|
} catch (Exception e) {
|
||||||
|
telegramSendManual("TLW-Database-Tool crashed!")
|
||||||
|
}
|
||||||
|
String outputString = readFile 'log.txt'
|
||||||
|
if(outputString != "") {
|
||||||
|
ArrayList<String> outputList = outputString.replace("\n\n", "\n").split('\n').toList()
|
||||||
|
outputList = clean(outputList)
|
||||||
|
outputList.each {
|
||||||
|
telegramSendManual(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
deleteDir()
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
telegramSendManual("Build failed!\n${env.BUILD_URL}console")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<String> clean(ArrayList<String> orig) {
|
||||||
|
ArrayList<String> cleaned = new ArrayList<String>()
|
||||||
|
orig.each{line ->
|
||||||
|
if(line.indexOf(" [main] INFO de.jeyp91 - ") >= 0) {
|
||||||
|
line = line.substring(20, line.size())
|
||||||
|
}
|
||||||
|
|
||||||
|
if(line.indexOf(" [main] ERROR de.jeyp91") >= 0) {
|
||||||
|
line = line.substring(20, line.size())
|
||||||
|
}
|
||||||
|
cleaned.add(line)
|
||||||
|
}
|
||||||
|
return cleaned.unique()
|
||||||
|
}
|
||||||
|
|
||||||
|
def telegramSendManual(String text) {
|
||||||
|
def encodedMessage = URLEncoder.encode(text, "UTF-8")
|
||||||
|
println encodedMessage
|
||||||
|
httpRequest(
|
||||||
|
httpMode: 'GET',
|
||||||
|
contentType: 'APPLICATION_JSON',
|
||||||
|
responseHandle: 'NONE',
|
||||||
|
url: "https://api.telegram.org/bot1298223079:AAEplcQpfzFG59qNYAYuSbJKtB9HMXCCE_U/sendMessage?text=$encodedMessage&chat_id=459231986&disable_web_page_preview=true",
|
||||||
|
wrapAsMultipart: false,
|
||||||
|
consoleLogResponseBody: true
|
||||||
|
)
|
||||||
|
}
|
||||||
+82
@@ -0,0 +1,82 @@
|
|||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Restore tlw-database-tool') {
|
||||||
|
steps {
|
||||||
|
copyArtifacts filter: '**/tlw-database-tool-1.0.jar', fingerprintArtifacts: true, projectName: 'build tlw-database-tool', selector: lastSuccessful(), target: '.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Execute') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
String jdkPath = tool name: 'OpenJDK22', type: 'jdk'
|
||||||
|
withCredentials([
|
||||||
|
usernamePassword(credentialsId: 'aws', usernameVariable: 'AWS_ACCESS_KEY_ID', passwordVariable: 'AWS_SECRET_ACCESS_KEY'),
|
||||||
|
usernamePassword(credentialsId: 'forum_database', usernameVariable: 'TLW_DATABASE_USERNAME', passwordVariable: 'TLW_DATABASE_PASSWORD'),
|
||||||
|
usernamePassword(credentialsId: 'forum_user', usernameVariable: 'FORUM_USERNAME', passwordVariable: 'FORUM_PASSWORD'),
|
||||||
|
string(credentialsId: 'google_calendar_private_key_id', variable: 'GOOGLE_CALENDAR_TIPPLIGA_SERVICE_ACCOUNT_PRIVATE_KEY_ID'),
|
||||||
|
string(credentialsId: 'google_calendar_private_key', variable: 'GOOGLE_CALENDAR_TIPPLIGA_SERVICE_ACCOUNT_PRIVATE_KEY')
|
||||||
|
]) {
|
||||||
|
withEnv([
|
||||||
|
"JAVA_HOME=${jdkPath}/jdk-22.0.2"
|
||||||
|
]) {
|
||||||
|
try {
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchesResultsUpdater --season ${season} --league 45 --configFile Supercup >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchesUpdaterFootball --season ${season} --league 45 --configFile Supercup >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchdaysUpdater --season ${season} --league 45 --configFile Supercup >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode TeamsUpdater --season ${season} --league 45 --configFile Supercup >> log.txt 2>&1"
|
||||||
|
} catch (Exception e) {
|
||||||
|
telegramSendManual("TLW-Database-Tool crashed!")
|
||||||
|
}
|
||||||
|
String outputString = readFile 'log.txt'
|
||||||
|
if(outputString != "") {
|
||||||
|
ArrayList<String> outputList = outputString.replace("\n\n", "\n").split('\n').toList()
|
||||||
|
outputList = clean(outputList)
|
||||||
|
outputList.each {
|
||||||
|
telegramSendManual(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
deleteDir()
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
telegramSendManual("Build failed!\n${env.BUILD_URL}console")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<String> clean(ArrayList<String> orig) {
|
||||||
|
ArrayList<String> cleaned = new ArrayList<String>()
|
||||||
|
orig.each{line ->
|
||||||
|
if(line.indexOf(" [main] INFO de.jeyp91 - ") >= 0) {
|
||||||
|
line = line.substring(20, line.size())
|
||||||
|
}
|
||||||
|
|
||||||
|
if(line.indexOf(" [main] ERROR de.jeyp91") >= 0) {
|
||||||
|
line = line.substring(20, line.size())
|
||||||
|
}
|
||||||
|
cleaned.add(line)
|
||||||
|
}
|
||||||
|
return cleaned.unique()
|
||||||
|
}
|
||||||
|
|
||||||
|
def telegramSendManual(String text) {
|
||||||
|
def encodedMessage = URLEncoder.encode(text, "UTF-8")
|
||||||
|
println encodedMessage
|
||||||
|
httpRequest(
|
||||||
|
httpMode: 'GET',
|
||||||
|
contentType: 'APPLICATION_JSON',
|
||||||
|
responseHandle: 'NONE',
|
||||||
|
url: "https://api.telegram.org/bot1298223079:AAEplcQpfzFG59qNYAYuSbJKtB9HMXCCE_U/sendMessage?text=$encodedMessage&chat_id=459231986&disable_web_page_preview=true",
|
||||||
|
wrapAsMultipart: false,
|
||||||
|
consoleLogResponseBody: true
|
||||||
|
)
|
||||||
|
}
|
||||||
+90
@@ -0,0 +1,90 @@
|
|||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Restore tlw-database-tool') {
|
||||||
|
steps {
|
||||||
|
copyArtifacts filter: '**/tlw-database-tool-1.0.jar', fingerprintArtifacts: true, projectName: 'build tlw-database-tool', selector: lastSuccessful(), target: '.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Execute') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
String jdkPath = tool name: 'OpenJDK22', type: 'jdk'
|
||||||
|
withCredentials([
|
||||||
|
usernamePassword(credentialsId: 'aws', usernameVariable: 'AWS_ACCESS_KEY_ID', passwordVariable: 'AWS_SECRET_ACCESS_KEY'),
|
||||||
|
usernamePassword(credentialsId: 'forum_database', usernameVariable: 'TLW_DATABASE_USERNAME', passwordVariable: 'TLW_DATABASE_PASSWORD'),
|
||||||
|
usernamePassword(credentialsId: 'forum_user', usernameVariable: 'FORUM_USERNAME', passwordVariable: 'FORUM_PASSWORD'),
|
||||||
|
string(credentialsId: 'google_calendar_private_key_id', variable: 'GOOGLE_CALENDAR_TIPPLIGA_SERVICE_ACCOUNT_PRIVATE_KEY_ID'),
|
||||||
|
string(credentialsId: 'google_calendar_private_key', variable: 'GOOGLE_CALENDAR_TIPPLIGA_SERVICE_ACCOUNT_PRIVATE_KEY')
|
||||||
|
]) {
|
||||||
|
withEnv([
|
||||||
|
"JAVA_HOME=${jdkPath}/jdk-22.0.2"
|
||||||
|
]) {
|
||||||
|
try {
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchesResultsUpdater --season ${season} --league 1 --configFile Tippliga >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchesUpdaterFootball --season ${season} --league 1 --configFile Tippliga >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchdaysUpdater --season ${season} --league 1 --configFile Tippliga >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode TeamsUpdater --season ${season} --league 1 --configFile Tippliga >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchesResultsUpdater --season ${season} --league 2 --configFile Tippliga >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchesUpdaterFootball --season ${season} --league 2 --configFile Tippliga >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchdaysUpdater --season ${season} --league 2 --configFile Tippliga >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode TeamsUpdater --season ${season} --league 2 --configFile Tippliga >> log.txt 2>&1"
|
||||||
|
} catch (Exception e) {
|
||||||
|
telegramSendManual("TLW-Database-Tool crashed!")
|
||||||
|
}
|
||||||
|
String outputString = readFile 'log.txt'
|
||||||
|
echo "Output: ${outputString}"
|
||||||
|
if(outputString != "") {
|
||||||
|
ArrayList<String> outputList = outputString.replace("\n\n", "\n").split('\n').toList()
|
||||||
|
outputList = clean(outputList)
|
||||||
|
outputList.each {
|
||||||
|
telegramSendManual(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
deleteDir()
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
telegramSendManual("Build failed!\n${env.BUILD_URL}console")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<String> clean(ArrayList<String> orig) {
|
||||||
|
ArrayList<String> cleaned = new ArrayList<String>()
|
||||||
|
orig.each{line ->
|
||||||
|
if(line.indexOf(" [main] INFO de.jeyp91 - ") >= 0) {
|
||||||
|
line = line.substring(20, line.size())
|
||||||
|
}
|
||||||
|
|
||||||
|
if(line.indexOf(" [main] ERROR de.jeyp91") >= 0) {
|
||||||
|
line = line.substring(20, line.size())
|
||||||
|
}
|
||||||
|
cleaned.add(line)
|
||||||
|
}
|
||||||
|
return cleaned.unique()
|
||||||
|
}
|
||||||
|
|
||||||
|
def telegramSendManual(String text) {
|
||||||
|
sleep 1
|
||||||
|
if(text) {
|
||||||
|
def encodedMessage = URLEncoder.encode(text, "UTF-8")
|
||||||
|
println encodedMessage
|
||||||
|
httpRequest(
|
||||||
|
httpMode: 'GET',
|
||||||
|
contentType: 'APPLICATION_JSON',
|
||||||
|
responseHandle: 'NONE',
|
||||||
|
url: "https://api.telegram.org/bot1298223079:AAEplcQpfzFG59qNYAYuSbJKtB9HMXCCE_U/sendMessage?text=$encodedMessage&chat_id=459231986&disable_web_page_preview=true",
|
||||||
|
wrapAsMultipart: false,
|
||||||
|
consoleLogResponseBody: true
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
+82
@@ -0,0 +1,82 @@
|
|||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Restore tlw-database-tool') {
|
||||||
|
steps {
|
||||||
|
copyArtifacts filter: '**/tlw-database-tool-1.0.jar', fingerprintArtifacts: true, projectName: 'build tlw-database-tool', selector: lastSuccessful(), target: '.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Execute') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
String jdkPath = tool name: 'OpenJDK22', type: 'jdk'
|
||||||
|
withCredentials([
|
||||||
|
usernamePassword(credentialsId: 'aws', usernameVariable: 'AWS_ACCESS_KEY_ID', passwordVariable: 'AWS_SECRET_ACCESS_KEY'),
|
||||||
|
usernamePassword(credentialsId: 'forum_database', usernameVariable: 'TLW_DATABASE_USERNAME', passwordVariable: 'TLW_DATABASE_PASSWORD'),
|
||||||
|
usernamePassword(credentialsId: 'forum_user', usernameVariable: 'FORUM_USERNAME', passwordVariable: 'FORUM_PASSWORD'),
|
||||||
|
string(credentialsId: 'google_calendar_private_key_id', variable: 'GOOGLE_CALENDAR_TIPPLIGA_SERVICE_ACCOUNT_PRIVATE_KEY_ID'),
|
||||||
|
string(credentialsId: 'google_calendar_private_key', variable: 'GOOGLE_CALENDAR_TIPPLIGA_SERVICE_ACCOUNT_PRIVATE_KEY')
|
||||||
|
]) {
|
||||||
|
withEnv([
|
||||||
|
"JAVA_HOME=${jdkPath}/jdk-22.0.2"
|
||||||
|
]) {
|
||||||
|
try {
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchesResultsUpdater --season ${season} --league 48 --configFile WTL-Pokal >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchesUpdaterFootball --season ${season} --league 48 --configFile WTL-Pokal >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode MatchdaysUpdater --season ${season} --league 48 --configFile WTL-Pokal >> log.txt 2>&1"
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode TeamsUpdater --season ${season} --league 48 --configFile WTL-Pokal >> log.txt 2>&1"
|
||||||
|
} catch (Exception e) {
|
||||||
|
telegramSendManual("TLW-Database-Tool crashed!")
|
||||||
|
}
|
||||||
|
String outputString = readFile 'log.txt'
|
||||||
|
if(outputString != "") {
|
||||||
|
ArrayList<String> outputList = outputString.replace("\n\n", "\n").split('\n').toList()
|
||||||
|
outputList = clean(outputList)
|
||||||
|
outputList.each {
|
||||||
|
telegramSendManual(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
deleteDir()
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
telegramSendManual("Build failed!\n${env.BUILD_URL}console")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<String> clean(ArrayList<String> orig) {
|
||||||
|
ArrayList<String> cleaned = new ArrayList<String>()
|
||||||
|
orig.each{line ->
|
||||||
|
if(line.indexOf(" [main] INFO de.jeyp91 - ") >= 0) {
|
||||||
|
line = line.substring(20, line.size())
|
||||||
|
}
|
||||||
|
|
||||||
|
if(line.indexOf(" [main] ERROR de.jeyp91") >= 0) {
|
||||||
|
line = line.substring(20, line.size())
|
||||||
|
}
|
||||||
|
cleaned.add(line)
|
||||||
|
}
|
||||||
|
return cleaned.unique()
|
||||||
|
}
|
||||||
|
|
||||||
|
def telegramSendManual(String text) {
|
||||||
|
def encodedMessage = URLEncoder.encode(text, "UTF-8")
|
||||||
|
println encodedMessage
|
||||||
|
httpRequest(
|
||||||
|
httpMode: 'GET',
|
||||||
|
contentType: 'APPLICATION_JSON',
|
||||||
|
responseHandle: 'NONE',
|
||||||
|
url: "https://api.telegram.org/bot1298223079:AAEplcQpfzFG59qNYAYuSbJKtB9HMXCCE_U/sendMessage?text=$encodedMessage&chat_id=459231986&disable_web_page_preview=true",
|
||||||
|
wrapAsMultipart: false,
|
||||||
|
consoleLogResponseBody: true
|
||||||
|
)
|
||||||
|
}
|
||||||
+83
@@ -0,0 +1,83 @@
|
|||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Restore tlw-database-tool') {
|
||||||
|
steps {
|
||||||
|
copyArtifacts filter: '**/tlw-database-tool-1.0.jar', fingerprintArtifacts: true, projectName: 'build tlw-database-tool', selector: lastSuccessful(), target: '.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Execute') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
String jdkPath = tool name: 'OpenJDK22', type: 'jdk'
|
||||||
|
withCredentials([
|
||||||
|
usernamePassword(credentialsId: 'aws', usernameVariable: 'AWS_ACCESS_KEY_ID', passwordVariable: 'AWS_SECRET_ACCESS_KEY'),
|
||||||
|
usernamePassword(credentialsId: 'forum_database', usernameVariable: 'TLW_DATABASE_USERNAME', passwordVariable: 'TLW_DATABASE_PASSWORD'),
|
||||||
|
usernamePassword(credentialsId: 'forum_user', usernameVariable: 'FORUM_USERNAME', passwordVariable: 'FORUM_PASSWORD'),
|
||||||
|
string(credentialsId: 'WhatsApp_Token', variable: 'TLW_WHATSAPP_API_KEY'),
|
||||||
|
string(credentialsId: 'OPENAI_TOKEN', variable: 'OPENAI_TOKEN')
|
||||||
|
]) {
|
||||||
|
withEnv([
|
||||||
|
"JAVA_HOME=${jdkPath}/jdk-22.0.2",
|
||||||
|
"TLW_WHATSAPP_HOST=https://tlw-whatsapp.codeam.io"
|
||||||
|
]) {
|
||||||
|
try {
|
||||||
|
sh "$JAVA_HOME/bin/java -jar build/libs/tlw-database-tool-1.0.jar --mode WhatsAppNotifier --season ${season} --league 1 --configFile Tippliga >> log.txt 2>&1"
|
||||||
|
} catch (Exception e) {
|
||||||
|
telegramSendManual("TLW-Database-Tool crashed!")
|
||||||
|
}
|
||||||
|
String outputString = readFile 'log.txt'
|
||||||
|
if(outputString != "") {
|
||||||
|
ArrayList<String> outputList = outputString.replace("\n\n", "\n").split('\n').toList()
|
||||||
|
outputList = clean(outputList)
|
||||||
|
outputList.each {
|
||||||
|
telegramSendManual(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
deleteDir()
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
telegramSendManual("Build failed!\n${env.BUILD_URL}console")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<String> clean(ArrayList<String> orig) {
|
||||||
|
ArrayList<String> cleaned = new ArrayList<String>()
|
||||||
|
orig.each{line ->
|
||||||
|
if(line.indexOf(" [main] INFO de.jeyp91 - ") >= 0) {
|
||||||
|
line = line.substring(20, line.size())
|
||||||
|
}
|
||||||
|
|
||||||
|
if(line.indexOf(" [main] ERROR de.jeyp91") >= 0) {
|
||||||
|
line = line.substring(20, line.size())
|
||||||
|
}
|
||||||
|
cleaned.add(line)
|
||||||
|
}
|
||||||
|
return cleaned.unique()
|
||||||
|
}
|
||||||
|
|
||||||
|
def telegramSendManual(String text) {
|
||||||
|
sleep 1
|
||||||
|
if(text) {
|
||||||
|
def encodedMessage = URLEncoder.encode(text, "UTF-8")
|
||||||
|
println encodedMessage
|
||||||
|
httpRequest(
|
||||||
|
httpMode: 'GET',
|
||||||
|
contentType: 'APPLICATION_JSON',
|
||||||
|
responseHandle: 'NONE',
|
||||||
|
url: "https://api.telegram.org/bot1298223079:AAEplcQpfzFG59qNYAYuSbJKtB9HMXCCE_U/sendMessage?text=$encodedMessage&chat_id=459231986&disable_web_page_preview=true",
|
||||||
|
wrapAsMultipart: false,
|
||||||
|
consoleLogResponseBody: true
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+81
@@ -0,0 +1,81 @@
|
|||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Checkout') {
|
||||||
|
steps {
|
||||||
|
git branch: 'main', credentialsId: 'gitea', url: 'https://git.codeam.io/Julian/tlw-database-tool.git'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Build') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
String jdkPath = tool name: 'OpenJDK22', type: 'jdk'
|
||||||
|
withCredentials([
|
||||||
|
usernamePassword(credentialsId: 'aws', usernameVariable: 'AWS_ACCESS_KEY_ID', passwordVariable: 'AWS_SECRET_ACCESS_KEY'),
|
||||||
|
usernamePassword(credentialsId: 'forum_database', usernameVariable: 'TLW_DATABASE_USERNAME', passwordVariable: 'TLW_DATABASE_PASSWORD'),
|
||||||
|
usernamePassword(credentialsId: 'forum_user', usernameVariable: 'FORUM_USERNAME', passwordVariable: 'FORUM_PASSWORD')
|
||||||
|
]) {
|
||||||
|
withEnv([
|
||||||
|
"JAVA_HOME=${jdkPath}/jdk-22.0.2"
|
||||||
|
]) {
|
||||||
|
sh returnStdout: false, script: "./gradlew build -x test"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Archive') {
|
||||||
|
steps {
|
||||||
|
archiveArtifacts artifacts: 'build/libs/tlw-database-tool-1.0.jar', followSymlinks: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Trigger') {
|
||||||
|
steps {
|
||||||
|
echo 'Trigger jobs'
|
||||||
|
build wait: false, job: 'TippligaUpdater'
|
||||||
|
build wait: false, job: 'WTLPokalUpdater'
|
||||||
|
build wait: false, job: 'SupercupUpdater'
|
||||||
|
build wait: false, job: 'RelegationUpdater'
|
||||||
|
build wait: false, job: 'LigaCupUpdater'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
deleteDir()
|
||||||
|
}
|
||||||
|
failure {
|
||||||
|
telegramSendManual("Build failed!\n${env.BUILD_URL}console")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<String> clean(ArrayList<String> orig) {
|
||||||
|
ArrayList<String> cleaned = new ArrayList<String>()
|
||||||
|
orig.each{line ->
|
||||||
|
if(line.indexOf(" [main] INFO de.jeyp91 - ") >= 0) {
|
||||||
|
line = line.substring(20, line.size())
|
||||||
|
}
|
||||||
|
|
||||||
|
if(line.indexOf(" [main] ERROR de.jeyp91") >= 0) {
|
||||||
|
line = line.substring(20, line.size())
|
||||||
|
}
|
||||||
|
cleaned.add(line)
|
||||||
|
}
|
||||||
|
return cleaned.unique()
|
||||||
|
}
|
||||||
|
|
||||||
|
def telegramSendManual(String text) {
|
||||||
|
def encodedMessage = URLEncoder.encode(text, "UTF-8")
|
||||||
|
println encodedMessage
|
||||||
|
httpRequest(
|
||||||
|
httpMode: 'GET',
|
||||||
|
contentType: 'APPLICATION_JSON',
|
||||||
|
responseHandle: 'NONE',
|
||||||
|
url: "https://api.telegram.org/bot1298223079:AAEplcQpfzFG59qNYAYuSbJKtB9HMXCCE_U/sendMessage?text=$encodedMessage&chat_id=459231986&disable_web_page_preview=true",
|
||||||
|
wrapAsMultipart: false,
|
||||||
|
consoleLogResponseBody: true
|
||||||
|
)
|
||||||
|
sleep 1
|
||||||
|
}
|
||||||
@@ -1,22 +1,22 @@
|
|||||||
package de.jeyp91;
|
package de.jeyp91;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import de.jeyp91.apifootball.APIFootballUpdater;
|
import de.jeyp91.apifootball.APIFootballUpdater;
|
||||||
import de.jeyp91.googlecalendar.TippligaGoogleEventManager;
|
import de.jeyp91.tippliga.TLWMatchdaysUpdater;
|
||||||
|
import de.jeyp91.tippliga.TLWMatchesCreatorFootball;
|
||||||
|
import de.jeyp91.tippliga.TLWMatchesResultsUpdater;
|
||||||
|
import de.jeyp91.tippliga.TLWMatchesUpdaterFootball;
|
||||||
|
import de.jeyp91.tippliga.TLWTeamsUpdater;
|
||||||
import de.jeyp91.tippligaforum.MatchesListForumUpdater;
|
import de.jeyp91.tippligaforum.MatchesListForumUpdater;
|
||||||
import de.jeyp91.tippliga.*;
|
|
||||||
import de.jeyp91.tippligaforum.TippligaConfigProvider;
|
import de.jeyp91.tippligaforum.TippligaConfigProvider;
|
||||||
import de.jeyp91.tippligaforum.TippligaSQLConnector;
|
import de.jeyp91.tippligaforum.TippligaSQLConnector;
|
||||||
|
import de.jeyp91.whatsapp.WhatsAppNotifier;
|
||||||
import net.sourceforge.argparse4j.ArgumentParsers;
|
import net.sourceforge.argparse4j.ArgumentParsers;
|
||||||
import net.sourceforge.argparse4j.inf.ArgumentParser;
|
import net.sourceforge.argparse4j.inf.ArgumentParser;
|
||||||
import net.sourceforge.argparse4j.inf.ArgumentParserException;
|
import net.sourceforge.argparse4j.inf.ArgumentParserException;
|
||||||
import net.sourceforge.argparse4j.inf.Namespace;
|
import net.sourceforge.argparse4j.inf.Namespace;
|
||||||
import org.apache.logging.log4j.Level;
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
import org.apache.logging.log4j.core.config.Configurator;
|
|
||||||
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
|
|
||||||
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
|
|
||||||
import org.apache.logging.log4j.core.config.builder.api.RootLoggerComponentBuilder;
|
|
||||||
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hello world!
|
* Hello world!
|
||||||
@@ -28,63 +28,65 @@ public class App {
|
|||||||
private static int season;
|
private static int season;
|
||||||
private static int league;
|
private static int league;
|
||||||
private static String configFile;
|
private static String configFile;
|
||||||
private static final Logger logger = LogManager.getLogger(App.class);
|
private static final Logger logger = LoggerFactory.getLogger(App.class);
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
ConfigurationBuilder<BuiltConfiguration> builder
|
// SLF4J does not require explicit configuration here
|
||||||
= ConfigurationBuilderFactory.newConfigurationBuilder();
|
// Configuration can be done via an external configuration file (e.g., logback.xml)
|
||||||
|
|
||||||
RootLoggerComponentBuilder rootLogger
|
|
||||||
= builder.newRootLogger(Level.ERROR);
|
|
||||||
|
|
||||||
builder.add(rootLogger);
|
|
||||||
Configurator.initialize(builder.build());
|
|
||||||
Configurator.setRootLevel(Level.INFO);
|
|
||||||
initOptions(args);
|
initOptions(args);
|
||||||
String sql = "";
|
String sql = "";
|
||||||
String beautifulInfo = "";
|
String beautifulInfo = "";
|
||||||
switch(mode) {
|
switch (mode) {
|
||||||
case "MatchdaysUpdater":
|
case "MatchdaysUpdater" -> {
|
||||||
TLWMatchdaysUpdater matchdaysUpdater = new TLWMatchdaysUpdater(season, league, configFile);
|
TLWMatchdaysUpdater matchdaysUpdater = new TLWMatchdaysUpdater(season, league, configFile);
|
||||||
sql = matchdaysUpdater.getUpdateSql();
|
sql = matchdaysUpdater.getUpdateSql();
|
||||||
beautifulInfo = matchdaysUpdater.getBeautifulInfo();
|
beautifulInfo = matchdaysUpdater.getBeautifulInfo();
|
||||||
matchdaysUpdater.updateGoogleCalendar();
|
matchdaysUpdater.updateGoogleCalendar();
|
||||||
break;
|
}
|
||||||
case "MatchesCreatorFootball":
|
case "MatchesCreatorFootball" -> {
|
||||||
TLWMatchesCreatorFootball creator = new TLWMatchesCreatorFootball(season, league, configFile);
|
TLWMatchesCreatorFootball creator = new TLWMatchesCreatorFootball(season, league, configFile);
|
||||||
sql = creator.getSQLInsertString();
|
sql = creator.getSQLInsertString();
|
||||||
break;
|
}
|
||||||
case "MatchesUpdaterFootball":
|
case "MatchesUpdaterFootball" -> {
|
||||||
TLWMatchesUpdaterFootball tlwMatchesUpdaterFootball = new TLWMatchesUpdaterFootball(season, league, configFile);
|
TLWMatchesUpdaterFootball tlwMatchesUpdaterFootball = new TLWMatchesUpdaterFootball(season, league, configFile);
|
||||||
sql = tlwMatchesUpdaterFootball.getUpdateSQL();
|
sql = tlwMatchesUpdaterFootball.getUpdateSQL();
|
||||||
beautifulInfo = tlwMatchesUpdaterFootball.getBeautifulInfo();
|
beautifulInfo = tlwMatchesUpdaterFootball.getBeautifulInfo();
|
||||||
break;
|
}
|
||||||
case "TeamsUpdater":
|
case "MatchesResultsUpdater" -> {
|
||||||
|
TLWMatchesResultsUpdater tlwMatchesResultsUpdater = new TLWMatchesResultsUpdater(season, league, configFile);
|
||||||
|
beautifulInfo = tlwMatchesResultsUpdater.getBeautifulInfo();
|
||||||
|
}
|
||||||
|
case "TeamsUpdater" -> {
|
||||||
TLWTeamsUpdater teamsUpdater = new TLWTeamsUpdater(season, league, configFile);
|
TLWTeamsUpdater teamsUpdater = new TLWTeamsUpdater(season, league, configFile);
|
||||||
sql = teamsUpdater.getInsertSQL();
|
sql = teamsUpdater.getInsertSQL();
|
||||||
break;
|
}
|
||||||
case "APIFootballUpdater":
|
case "APIFootballUpdater" -> {
|
||||||
APIFootballUpdater apiFootballUpdater = new APIFootballUpdater();
|
APIFootballUpdater apiFootballUpdater = new APIFootballUpdater();
|
||||||
apiFootballUpdater.updateAllFixtures(season);
|
apiFootballUpdater.updateAllFixtures(season);
|
||||||
apiFootballUpdater.updateAllRounds(season);
|
apiFootballUpdater.updateAllRounds(season);
|
||||||
break;
|
}
|
||||||
case "MatchesListGistUpdater":
|
case "MatchesListGistUpdater" -> {
|
||||||
MatchesListForumUpdater matchesListForumUpdater = new MatchesListForumUpdater(season);
|
MatchesListForumUpdater matchesListForumUpdater = new MatchesListForumUpdater();
|
||||||
matchesListForumUpdater.updateAllLeagues(season);
|
matchesListForumUpdater.updateAllLeagues(season);
|
||||||
break;
|
}
|
||||||
case "PostChecksum":
|
case "PostChecksum" -> {
|
||||||
TippligaConfigProvider configProvider = new TippligaConfigProvider(season);
|
TippligaConfigProvider configProvider = new TippligaConfigProvider(season);
|
||||||
String checksum = configProvider.getChecksumOfConfigPost(configFile);
|
String checksum = configProvider.getChecksumOfConfigPost(configFile);
|
||||||
System.out.println(checksum);
|
System.out.println(checksum);
|
||||||
break;
|
}
|
||||||
default:
|
case "WhatsAppNotifier" -> {
|
||||||
break;
|
WhatsAppNotifier notifier = new WhatsAppNotifier();
|
||||||
|
notifier.sendNotifications();
|
||||||
|
}
|
||||||
|
default -> {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(!StatusHolder.getError() && !sql.equals("")) {
|
if(!StatusHolder.getError() && !sql.equals("")) {
|
||||||
TippligaSQLConnector con = TippligaSQLConnector.getInstance();
|
TippligaSQLConnector con = TippligaSQLConnector.getInstance();
|
||||||
con.executeUpdate(sql);
|
con.executeUpdate(sql);
|
||||||
logger.info(beautifulInfo);
|
|
||||||
}
|
}
|
||||||
|
if(!StatusHolder.getError() && !beautifulInfo.equals(""))
|
||||||
|
logger.info(beautifulInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void initOptions(String[] args) {
|
private static void initOptions(String[] args) {
|
||||||
@@ -94,7 +96,7 @@ public class App {
|
|||||||
|
|
||||||
parser.addArgument("-m", "--mode")
|
parser.addArgument("-m", "--mode")
|
||||||
.dest("mode")
|
.dest("mode")
|
||||||
.choices("MatchdaysUpdater", "MatchesCreatorFootball", "MatchesUpdaterFootball", "TeamsUpdater", "APIFootballUpdater", "MatchesListGistUpdater", "PostChecksum")
|
.choices("MatchdaysUpdater", "MatchesCreatorFootball", "MatchesUpdaterFootball", "MatchesResultsUpdater", "TeamsUpdater", "APIFootballUpdater", "MatchesListGistUpdater", "PostChecksum", "WhatsAppNotifier")
|
||||||
.help("")
|
.help("")
|
||||||
.required(true)
|
.required(true)
|
||||||
.type(String.class);
|
.type(String.class);
|
||||||
|
|||||||
@@ -2,10 +2,18 @@ package de.jeyp91;
|
|||||||
|
|
||||||
public abstract class BaseMatch {
|
public abstract class BaseMatch {
|
||||||
|
|
||||||
public final Integer COMPARISON_IDENTICAL = 0;
|
public static final Integer STATUS_NOTSTARTED = 0;
|
||||||
public final Integer COMPARISON_DIFFERENT = 1;
|
public static final Integer STATUS_STARTED = 1;
|
||||||
public final Integer COMPARISON_DIFFERENT_DATETIME = 2;
|
public static final Integer STATUS_PROVISIONAL_RESULT_AVAILABLE = 2;
|
||||||
public final Integer COMPARISON_DIFFERENT_RESULT = 3;
|
public static final Integer STATUS_FINISHED = 3;
|
||||||
|
public static final Integer STATUS_NOT_EVALUATED = 4;
|
||||||
|
|
||||||
|
public enum COMPARISON {
|
||||||
|
IDENTICAL,
|
||||||
|
DIFFERENT,
|
||||||
|
DIFFERENT_DATETIME,
|
||||||
|
DIFFERENT_RESULT
|
||||||
|
}
|
||||||
|
|
||||||
protected Integer teamIdHome;
|
protected Integer teamIdHome;
|
||||||
protected Integer teamIdGuest;
|
protected Integer teamIdGuest;
|
||||||
@@ -13,8 +21,16 @@ public abstract class BaseMatch {
|
|||||||
protected String teamNameGuest = null;
|
protected String teamNameGuest = null;
|
||||||
protected Integer goalsHome = null;
|
protected Integer goalsHome = null;
|
||||||
protected Integer goalsGuest = null;
|
protected Integer goalsGuest = null;
|
||||||
|
protected Integer goalsOvertimeHome = null;
|
||||||
|
protected Integer goalsOvertimeGuest = null;
|
||||||
|
protected Integer goalsPenaltyHome = null;
|
||||||
|
protected Integer goalsPenaltyGuest = null;
|
||||||
protected Integer matchday = null;
|
protected Integer matchday = null;
|
||||||
protected String matchDatetime = null;
|
protected String matchDatetime = null;
|
||||||
|
protected Integer status = null;
|
||||||
|
protected Integer koMatch = 0;
|
||||||
|
protected Integer showTable = 0;
|
||||||
|
protected COMPARISON updateStatus = COMPARISON.IDENTICAL;
|
||||||
|
|
||||||
public Integer getMatchday() {
|
public Integer getMatchday() {
|
||||||
return this.matchday;
|
return this.matchday;
|
||||||
@@ -40,6 +56,22 @@ public abstract class BaseMatch {
|
|||||||
return this.goalsGuest;
|
return this.goalsGuest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer getGoalsOvertimeHome() {
|
||||||
|
return this.goalsOvertimeHome;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getGoalsOvertimeGuest() {
|
||||||
|
return this.goalsOvertimeGuest;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getGoalsPenaltyHome() {
|
||||||
|
return this.goalsPenaltyHome;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getGoalsPenaltyGuest() {
|
||||||
|
return this.goalsPenaltyGuest;
|
||||||
|
}
|
||||||
|
|
||||||
public String getTeamNameHome() {
|
public String getTeamNameHome() {
|
||||||
return this.teamNameHome;
|
return this.teamNameHome;
|
||||||
}
|
}
|
||||||
@@ -47,4 +79,34 @@ public abstract class BaseMatch {
|
|||||||
public String getTeamNameGuest() {
|
public String getTeamNameGuest() {
|
||||||
return this.teamNameGuest;
|
return this.teamNameGuest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setStatus(int status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getStatus() {
|
||||||
|
return this.status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getShowTable() {
|
||||||
|
return this.showTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setShowTable(boolean showTable) {
|
||||||
|
this.showTable = showTable ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean getKoMatch() {
|
||||||
|
return this.koMatch == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setKoMatch(Boolean koMatch) {
|
||||||
|
this.koMatch = koMatch ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUpdateStatus(COMPARISON newStatus) { this.updateStatus = newStatus; }
|
||||||
|
|
||||||
|
public COMPARISON getUpdateStatus() {
|
||||||
|
return this.updateStatus;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ public class ResourceProvider {
|
|||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static JSONArray getLigenConfig(int season) {
|
public static JSONArray getLigenConfig() {
|
||||||
return getJSONArrayFromResource("Tippliga/" + season + "_Ligen.json");
|
return getJSONArrayFromResource("Tippliga/Ligen_v3.json");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static JSONArray getTeamIDMatcherConfig() {
|
public static JSONArray getTeamIDMatcherConfig() {
|
||||||
|
|||||||
@@ -1,95 +1,110 @@
|
|||||||
package de.jeyp91;
|
package de.jeyp91;
|
||||||
|
|
||||||
import com.amazonaws.AmazonServiceException;
|
|
||||||
import com.amazonaws.SdkClientException;
|
|
||||||
import com.amazonaws.regions.Regions;
|
|
||||||
import com.amazonaws.services.s3.AmazonS3;
|
|
||||||
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
|
|
||||||
import com.amazonaws.services.s3.model.S3Object;
|
|
||||||
import com.amazonaws.services.s3.model.S3ObjectInputStream;
|
|
||||||
import org.json.simple.JSONObject;
|
|
||||||
import org.json.simple.parser.JSONParser;
|
|
||||||
import org.json.simple.parser.ParseException;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
import org.json.simple.parser.JSONParser;
|
||||||
|
import org.json.simple.parser.ParseException;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider;
|
||||||
|
import software.amazon.awssdk.core.exception.SdkClientException;
|
||||||
|
import software.amazon.awssdk.core.sync.RequestBody;
|
||||||
|
import software.amazon.awssdk.regions.Region;
|
||||||
|
import software.amazon.awssdk.services.s3.S3Client;
|
||||||
|
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
|
||||||
|
import software.amazon.awssdk.services.s3.model.NoSuchKeyException;
|
||||||
|
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
|
||||||
|
import software.amazon.awssdk.services.s3.model.S3Exception;
|
||||||
|
|
||||||
public class S3Provider {
|
public class S3Provider {
|
||||||
private static final Regions AWS_DEFAULT_REGION = Regions.EU_CENTRAL_1;
|
private static final Region AWS_DEFAULT_REGION = Region.EU_CENTRAL_1;
|
||||||
private static final String BUCKET_NAME = "tlw-database-tool-api-football-data";
|
private static final String BUCKET_NAME = "tlw-database-tool-api-football-data";
|
||||||
|
private final S3Client s3;
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(S3Provider.class);
|
||||||
|
|
||||||
|
public S3Provider() {
|
||||||
|
s3 = S3Client.builder()
|
||||||
|
.region(AWS_DEFAULT_REGION)
|
||||||
|
.credentialsProvider(EnvironmentVariableCredentialsProvider.create())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
private void writeToS3(String filename, String content) {
|
private void writeToS3(String filename, String content) {
|
||||||
final AmazonS3 s3 = AmazonS3ClientBuilder
|
|
||||||
.standard()
|
|
||||||
.withRegion(AWS_DEFAULT_REGION)
|
|
||||||
.build();
|
|
||||||
try {
|
try {
|
||||||
s3.putObject(BUCKET_NAME, filename, content);
|
this.s3.putObject(
|
||||||
} catch (AmazonServiceException e) {
|
PutObjectRequest.builder()
|
||||||
System.err.println(e.getErrorMessage());
|
.bucket(BUCKET_NAME)
|
||||||
|
.key(filename)
|
||||||
|
.build(),
|
||||||
|
RequestBody.fromString(content)
|
||||||
|
);
|
||||||
|
} catch (S3Exception e) {
|
||||||
|
System.err.println(e.awsErrorDetails().errorMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeFixturesToS3(int league, String content) {
|
public void writeFixturesToS3(int season, int league, String content) {
|
||||||
writeToS3("fixtures/" + league + ".json", content);
|
writeToS3(v3Filepath("fixtures", season, league), content);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeRoundsToS3(int league, String content) {
|
public void writeRoundsToS3(int season, int league, String content) {
|
||||||
writeToS3("rounds/" + league + ".json", content);
|
writeToS3(v3Filepath("rounds", season, league), content);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getFileFromS3(String filename) {
|
private String getFileFromS3(String filename) {
|
||||||
final AmazonS3 s3 = AmazonS3ClientBuilder
|
|
||||||
.standard()
|
|
||||||
.withRegion(AWS_DEFAULT_REGION)
|
|
||||||
.build();
|
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
try {
|
try {
|
||||||
S3Object o = s3.getObject(BUCKET_NAME, filename);
|
GetObjectRequest getObjectRequest = GetObjectRequest.builder()
|
||||||
S3ObjectInputStream s3is = o.getObjectContent();
|
.bucket(BUCKET_NAME)
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(s3is));
|
.key(filename)
|
||||||
|
.build();
|
||||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(
|
||||||
|
this.s3.getObject(getObjectRequest), StandardCharsets.UTF_8));
|
||||||
String line;
|
String line;
|
||||||
while ((line = reader.readLine()) != null) {
|
while ((line = reader.readLine()) != null) {
|
||||||
builder.append(line);
|
builder.append(line);
|
||||||
}
|
}
|
||||||
} catch (SdkClientException | IOException e) {
|
} catch (SdkClientException | IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
} catch (NoSuchKeyException e) {
|
||||||
|
logger.error(filename + " not found in S3.");
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
throw e;
|
||||||
}
|
}
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
String getFixturesStringFromS3(int league) {
|
public JSONObject getFixturesJSONFromS3(int season, int league) {
|
||||||
return getFileFromS3("fixtures/" + league + ".json");
|
return stringToJSONObject(getFileFromS3(v3Filepath("fixtures", season, league)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public JSONObject getFixturesJSONFromS3(int league) {
|
public JSONObject getRoundsJSONFromS3(int season, int league) {
|
||||||
String fixturesString = getFixturesStringFromS3(league);
|
return stringToJSONObject(getFileFromS3(v3Filepath("rounds", season, league)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private JSONObject stringToJSONObject(String rawData) {
|
||||||
|
if(rawData.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
JSONParser parser = new JSONParser();
|
JSONParser parser = new JSONParser();
|
||||||
JSONObject jsonObject = null;
|
JSONObject data = null;
|
||||||
try {
|
try {
|
||||||
jsonObject = (JSONObject) parser.parse(fixturesString);
|
data = (JSONObject) parser.parse(rawData);
|
||||||
} catch (ParseException e) {
|
} catch (ParseException e) {
|
||||||
/* TODO */
|
/* TODO */
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
return jsonObject;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getRoundsStringFromS3(int league) {
|
private String v3Filepath (String prefix, int season, int league) {
|
||||||
return getFileFromS3("rounds/" + league + ".json");
|
return "v3/" + prefix + "_" + season + "_" + league + ".json";
|
||||||
}
|
}
|
||||||
|
|
||||||
public JSONObject getRoundsJSONFromS3(int league) {
|
|
||||||
String fixturesString = getRoundsStringFromS3(league);
|
|
||||||
JSONParser parser = new JSONParser();
|
|
||||||
JSONObject jsonObject = null;
|
|
||||||
try {
|
|
||||||
jsonObject = (JSONObject) parser.parse(fixturesString);
|
|
||||||
} catch (ParseException e) {
|
|
||||||
/* TODO */
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return jsonObject;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
package de.jeyp91.apifootball;
|
package de.jeyp91.apifootball;
|
||||||
|
|
||||||
import de.jeyp91.S3Provider;
|
import java.util.ArrayList;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import java.util.HashMap;
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.json.simple.JSONArray;
|
import org.json.simple.JSONArray;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
import org.json.simple.parser.JSONParser;
|
import org.json.simple.parser.JSONParser;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import de.jeyp91.S3Provider;
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
public class APIFootballConnector {
|
public class APIFootballConnector {
|
||||||
|
|
||||||
@@ -16,7 +17,7 @@ public class APIFootballConnector {
|
|||||||
private final int season;
|
private final int season;
|
||||||
private final HashMap<Integer, JSONObject> rounds = new HashMap<>();
|
private final HashMap<Integer, JSONObject> rounds = new HashMap<>();
|
||||||
private final HashMap<Integer, JSONObject> matches = new HashMap<>();
|
private final HashMap<Integer, JSONObject> matches = new HashMap<>();
|
||||||
private static final Logger logger = LogManager.getLogger(APIFootballConnector.class);
|
private static final Logger logger = LoggerFactory.getLogger(APIFootballConnector.class);
|
||||||
|
|
||||||
private APIFootballConnector(int season) {
|
private APIFootballConnector(int season) {
|
||||||
this.season = season;
|
this.season = season;
|
||||||
@@ -33,7 +34,7 @@ public class APIFootballConnector {
|
|||||||
|
|
||||||
APIFootballMatch matchWithID = null;
|
APIFootballMatch matchWithID = null;
|
||||||
|
|
||||||
ArrayList<APIFootballMatch> allMatches = getMatchesFromLeagueFromFile(league);
|
ArrayList<APIFootballMatch> allMatches = getMatchesFromLeagueFromFile(this.season, league);
|
||||||
for (APIFootballMatch singleMatch : allMatches) {
|
for (APIFootballMatch singleMatch : allMatches) {
|
||||||
if (singleMatch.getAPIFootBallMatchID() == id) {
|
if (singleMatch.getAPIFootBallMatchID() == id) {
|
||||||
matchWithID = singleMatch;
|
matchWithID = singleMatch;
|
||||||
@@ -48,7 +49,7 @@ public class APIFootballConnector {
|
|||||||
|
|
||||||
ArrayList<APIFootballMatch> matchesOfMatchday = new ArrayList<>();
|
ArrayList<APIFootballMatch> matchesOfMatchday = new ArrayList<>();
|
||||||
|
|
||||||
ArrayList<APIFootballMatch> allMatches = getMatchesFromLeagueFromFile(league);
|
ArrayList<APIFootballMatch> allMatches = getMatchesFromLeagueFromFile(this.season, league);
|
||||||
for (APIFootballMatch singleMatch : allMatches) {
|
for (APIFootballMatch singleMatch : allMatches) {
|
||||||
if (singleMatch.getMatchday() == matchday) {
|
if (singleMatch.getMatchday() == matchday) {
|
||||||
matchesOfMatchday.add(singleMatch);
|
matchesOfMatchday.add(singleMatch);
|
||||||
@@ -58,15 +59,15 @@ public class APIFootballConnector {
|
|||||||
return matchesOfMatchday;
|
return matchesOfMatchday;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<APIFootballMatch> getMatchesFromLeagueFromFile(int leagueId) {
|
public ArrayList<APIFootballMatch> getMatchesFromLeagueFromFile(int season, int leagueId) {
|
||||||
ArrayList<APIFootballMatch> matchesList = new ArrayList<>();
|
ArrayList<APIFootballMatch> matchesList = new ArrayList<>();
|
||||||
S3Provider prov = new S3Provider();
|
S3Provider prov = new S3Provider();
|
||||||
|
|
||||||
if(!this.matches.containsKey(leagueId)) {
|
if(!this.matches.containsKey(leagueId)) {
|
||||||
this.matches.put(leagueId, prov.getFixturesJSONFromS3(leagueId));
|
this.matches.put(leagueId, prov.getFixturesJSONFromS3(season, leagueId));
|
||||||
}
|
}
|
||||||
JSONObject matches = this.matches.get(leagueId);
|
JSONObject matchesObject = this.matches.get(leagueId);
|
||||||
JSONArray matchArray = (JSONArray) (((JSONObject)matches.get("api")).get("fixtures"));
|
JSONArray matchArray = (JSONArray) (matchesObject.get("response"));
|
||||||
|
|
||||||
for(int i = 0; i < matchArray.size(); i++) {
|
for(int i = 0; i < matchArray.size(); i++) {
|
||||||
try {
|
try {
|
||||||
@@ -83,19 +84,18 @@ public class APIFootballConnector {
|
|||||||
public JSONObject getMatchdays(int leagueId) {
|
public JSONObject getMatchdays(int leagueId) {
|
||||||
S3Provider prov = new S3Provider();
|
S3Provider prov = new S3Provider();
|
||||||
if(!this.rounds.containsKey(leagueId)) {
|
if(!this.rounds.containsKey(leagueId)) {
|
||||||
this.rounds.put(leagueId, prov.getRoundsJSONFromS3(leagueId));
|
this.rounds.put(leagueId, prov.getRoundsJSONFromS3(this.season, leagueId));
|
||||||
}
|
}
|
||||||
return this.rounds.get(leagueId);
|
return this.rounds.get(leagueId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public JSONObject getTeamsForLeague(int league) throws Exception {
|
public JSONObject getTeamsForLeague(int season, int league) throws Exception {
|
||||||
String url = "https://v2.api-football.com/teams/league/" + league;
|
String requestPath = "teams";
|
||||||
String content = new APIFootballUpdater().getRawData(url);
|
String content = new APIFootballUpdater().getRawData(requestPath, season, league);
|
||||||
return stringToJSONObject(content);
|
return stringToJSONObject(content);
|
||||||
}
|
}
|
||||||
|
|
||||||
private JSONObject stringToJSONObject(String rawData) {
|
public static JSONObject stringToJSONObject(String rawData) {
|
||||||
|
|
||||||
JSONParser parser = new JSONParser();
|
JSONParser parser = new JSONParser();
|
||||||
JSONObject data = null;
|
JSONObject data = null;
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -1,35 +1,32 @@
|
|||||||
package de.jeyp91.apifootball;
|
package de.jeyp91.apifootball;
|
||||||
|
|
||||||
import de.jeyp91.BaseMatch;
|
|
||||||
import org.json.simple.JSONArray;
|
import org.json.simple.JSONArray;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
|
import de.jeyp91.BaseMatch;
|
||||||
|
|
||||||
public class APIFootballMatch extends BaseMatch {
|
public class APIFootballMatch extends BaseMatch {
|
||||||
|
|
||||||
private final int matchId;
|
private int matchId;
|
||||||
private final int leagueId;
|
private int leagueId;
|
||||||
private final String teamNameHome;
|
private String round;
|
||||||
private final String teamNameGuest;
|
|
||||||
private final String round;
|
|
||||||
private Boolean showTable = null;
|
|
||||||
|
|
||||||
public APIFootballMatch(JSONObject json, int season) throws Exception {
|
public APIFootballMatch(JSONObject json, int season) throws Exception {
|
||||||
this.matchId = Integer.parseInt(json.get("fixture_id").toString());
|
this.matchId = Integer.parseInt(((JSONObject) json.get("fixture")).get("id").toString());
|
||||||
// TODO
|
this.leagueId = Integer.parseInt(((JSONObject) json.get("league")).get("id").toString());
|
||||||
this.leagueId = Integer.parseInt(json.get("league_id").toString());
|
this.teamIdHome = Integer.valueOf(((JSONObject) ((JSONObject) json.get("teams")).get("home")).get("id").toString());
|
||||||
this.teamIdHome = Integer.parseInt(((JSONObject) json.get("homeTeam")).get("team_id").toString());
|
this.teamIdGuest = Integer.valueOf(((JSONObject) ((JSONObject) json.get("teams")).get("away")).get("id").toString());
|
||||||
this.teamIdGuest = Integer.parseInt(((JSONObject) json.get("awayTeam")).get("team_id").toString());
|
this.teamNameHome = ((JSONObject) ((JSONObject) json.get("teams")).get("home")).get("name").toString();
|
||||||
this.teamNameHome = ((JSONObject) json.get("homeTeam")).get("team_name").toString();
|
this.teamNameGuest = ((JSONObject) ((JSONObject) json.get("teams")).get("away")).get("name").toString();
|
||||||
this.teamNameGuest = ((JSONObject) json.get("awayTeam")).get("team_name").toString();
|
this.round = ((JSONObject) json.get("league")).get("round").toString();
|
||||||
this.goalsHome = getNumberOrNull(json.get("goalsHomeTeam"));
|
|
||||||
this.goalsGuest = getNumberOrNull(json.get("goalsAwayTeam"));
|
|
||||||
this.round = json.get("round").toString();
|
|
||||||
try {
|
try {
|
||||||
this.matchday = getMatchdayFromRoundString(season, this.round, this.leagueId);
|
this.matchday = getMatchdayFromRoundString(season, this.round, this.leagueId);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new Exception("Did not find matchday for league '" + this.leagueId + "': '" + json.get("round").toString() + "'");
|
throw new Exception("Did not find matchday for league '" + this.leagueId + "': '" + json.get("round").toString() + "'");
|
||||||
}
|
}
|
||||||
this.matchDatetime = (String) json.get("event_date");
|
this.matchDatetime = (String) ((JSONObject) json.get("fixture")).get("date");
|
||||||
|
this.status = parseStatus(((JSONObject) ((JSONObject) json.get("fixture")).get("status")).get("short").toString());
|
||||||
|
this.parseResult(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getAPIFootBallMatchID() {
|
public int getAPIFootBallMatchID() {
|
||||||
@@ -38,40 +35,50 @@ public class APIFootballMatch extends BaseMatch {
|
|||||||
|
|
||||||
public static int getMatchdayFromRoundString(int season, String round, int leagueId) {
|
public static int getMatchdayFromRoundString(int season, String round, int leagueId) {
|
||||||
round = round.replace(" ", "_");
|
round = round.replace(" ", "_");
|
||||||
Integer matchday = null;
|
Integer matchday = -1;
|
||||||
APIFootballConnector con = APIFootballConnector.getAPIFootballConnectorInstance(season);
|
if (round.startsWith("Regular_Season_-_")) {
|
||||||
JSONObject roundsObject = con.getMatchdays(leagueId);
|
matchday = Integer.valueOf(round.replace("Regular_Season_-_", ""));
|
||||||
JSONArray roundsArray = (JSONArray)(((JSONObject) roundsObject.get("api")).get("fixtures"));
|
} else {
|
||||||
for (int i = 0; i < roundsArray.size(); i++) {
|
APIFootballConnector con = APIFootballConnector.getAPIFootballConnectorInstance(season);
|
||||||
if(roundsArray.get(i).toString().equals(round)) {
|
JSONObject roundsObject = con.getMatchdays(leagueId);
|
||||||
matchday = i + 1;
|
JSONArray roundsArray = (JSONArray)(roundsObject.get("response"));
|
||||||
break;
|
for (int i = 0; i < roundsArray.size(); i++) {
|
||||||
|
if(roundsArray.get(i).toString().replace("_", " ").equals(round.replace("_", " "))) {
|
||||||
|
matchday = i + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return matchday;
|
return matchday;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Integer getNumberOrNull(Object object) {
|
private Integer getNumberOrNull(Object object) {
|
||||||
return object != null ? Integer.parseInt(object.toString()) : null;
|
return object != null ? Integer.valueOf(object.toString()) : null;
|
||||||
}
|
|
||||||
|
|
||||||
public String getTeamNameHome() {
|
|
||||||
return this.teamNameHome;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTeamNameGuest() {
|
|
||||||
return this.teamNameGuest;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getRound() {
|
public String getRound() {
|
||||||
return this.round;
|
return this.round;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setShowTable(boolean showTable) {
|
private int parseStatus(String statusShort) {
|
||||||
this.showTable = showTable;
|
return switch (statusShort) {
|
||||||
|
case "TBD", "NS" -> 0;
|
||||||
|
case "FT", "AET", "PEN" -> 3;
|
||||||
|
default -> 1;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public Boolean getShowTable() {
|
private void parseResult(JSONObject json) {
|
||||||
return this.showTable;
|
Object resultFulltime = ((JSONObject) json.get("score")).get("fulltime");
|
||||||
|
this.goalsHome = getNumberOrNull(((JSONObject) resultFulltime).get("home"));
|
||||||
|
this.goalsGuest = getNumberOrNull(((JSONObject) resultFulltime).get("away"));
|
||||||
|
|
||||||
|
Object resultExtratime = ((JSONObject) json.get("score")).get("extratime");
|
||||||
|
this.goalsOvertimeHome = getNumberOrNull(((JSONObject) resultExtratime).get("home"));
|
||||||
|
this.goalsOvertimeGuest = getNumberOrNull(((JSONObject) resultExtratime).get("away"));
|
||||||
|
|
||||||
|
Object resultPenalty = ((JSONObject) json.get("score")).get("penalty");
|
||||||
|
this.goalsPenaltyHome = getNumberOrNull(((JSONObject) resultPenalty).get("home"));
|
||||||
|
this.goalsPenaltyGuest = getNumberOrNull(((JSONObject) resultPenalty).get("away"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,12 +9,18 @@ public class APIFootballMatchesProvider {
|
|||||||
|
|
||||||
APIFootballConnector conn;
|
APIFootballConnector conn;
|
||||||
public APIFootballMatchesProvider(int season) {
|
public APIFootballMatchesProvider(int season) {
|
||||||
this.conn = APIFootballConnector.getAPIFootballConnectorInstance(season - 1);
|
this.conn = APIFootballConnector.getAPIFootballConnectorInstance(season);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<APIFootballMatch> getAPIFootballMatchesFromConfig(JSONArray config) {
|
public ArrayList<APIFootballMatch> getAPIFootballMatchesFromConfig(JSONObject matchdayConfig) {
|
||||||
|
boolean ko = false;
|
||||||
|
try {
|
||||||
|
ko = (boolean) matchdayConfig.get("ko");
|
||||||
|
} catch (Exception e) {
|
||||||
|
// Nothing to do here
|
||||||
|
}
|
||||||
ArrayList<APIFootballMatch> apiFootballMatches = new ArrayList<>();
|
ArrayList<APIFootballMatch> apiFootballMatches = new ArrayList<>();
|
||||||
for (Object singleConfigObject : config) {
|
for (Object singleConfigObject : (JSONArray) matchdayConfig.get("matchesConfig")) {
|
||||||
JSONObject singleConfig = (JSONObject) singleConfigObject;
|
JSONObject singleConfig = (JSONObject) singleConfigObject;
|
||||||
String type = (String) singleConfig.get("type");
|
String type = (String) singleConfig.get("type");
|
||||||
boolean showTable = false;
|
boolean showTable = false;
|
||||||
@@ -29,7 +35,11 @@ public class APIFootballMatchesProvider {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
boolean finalShowTable = showTable;
|
boolean finalShowTable = showTable;
|
||||||
matches.forEach(apiFootballMatch -> apiFootballMatch.setShowTable(finalShowTable));
|
boolean finalKo = ko;
|
||||||
|
matches.forEach(apiFootballMatch -> {
|
||||||
|
apiFootballMatch.setShowTable(finalShowTable);
|
||||||
|
apiFootballMatch.setKoMatch(finalKo);
|
||||||
|
});
|
||||||
apiFootballMatches.addAll(matches);
|
apiFootballMatches.addAll(matches);
|
||||||
break;
|
break;
|
||||||
case "SingleMatch":
|
case "SingleMatch":
|
||||||
@@ -38,6 +48,7 @@ public class APIFootballMatchesProvider {
|
|||||||
APIFootballMatch match = conn.getMatchDataByLeagueAndMatchID(matchLeague, matchId);
|
APIFootballMatch match = conn.getMatchDataByLeagueAndMatchID(matchLeague, matchId);
|
||||||
showTable = (boolean) singleConfig.get("showTable");
|
showTable = (boolean) singleConfig.get("showTable");
|
||||||
match.setShowTable(showTable);
|
match.setShowTable(showTable);
|
||||||
|
match.setKoMatch(ko);
|
||||||
apiFootballMatches.add(match);
|
apiFootballMatches.add(match);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,41 +1,43 @@
|
|||||||
package de.jeyp91.apifootball;
|
package de.jeyp91.apifootball;
|
||||||
|
|
||||||
import de.jeyp91.ResourceProvider;
|
import java.io.BufferedReader;
|
||||||
import de.jeyp91.S3Provider;
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
import org.apache.http.HttpResponse;
|
import org.apache.http.HttpResponse;
|
||||||
import org.apache.http.client.HttpClient;
|
import org.apache.http.client.HttpClient;
|
||||||
import org.apache.http.client.methods.HttpGet;
|
import org.apache.http.client.methods.HttpGet;
|
||||||
import org.apache.http.impl.client.HttpClientBuilder;
|
import org.apache.http.impl.client.HttpClientBuilder;
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
import org.json.simple.JSONArray;
|
import org.json.simple.JSONArray;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
import org.json.simple.parser.JSONParser;
|
import org.json.simple.parser.JSONParser;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.*;
|
import de.jeyp91.ResourceProvider;
|
||||||
import java.util.HashSet;
|
import de.jeyp91.S3Provider;
|
||||||
|
|
||||||
public class APIFootballUpdater {
|
public class APIFootballUpdater {
|
||||||
|
|
||||||
private static final Logger logger = LogManager.getLogger(APIFootballUpdater.class);
|
private static final Logger logger = LoggerFactory.getLogger(APIFootballUpdater.class);
|
||||||
|
private static final String BASE_URL = "https://v3.football.api-sports.io/";
|
||||||
|
|
||||||
public APIFootballUpdater() {
|
public APIFootballUpdater() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateFixtures(int league) {
|
public void updateFixtures(int season, int league) {
|
||||||
String apiFootballUrl = "https://v2.api-football.com/fixtures/league/" + league + "?timezone=Europe/Berlin";
|
String requestPath = "fixtures";
|
||||||
|
S3Provider prov = new S3Provider();
|
||||||
try {
|
try {
|
||||||
String content = getRawData(apiFootballUrl);
|
String content = getRawData(requestPath, season, league);
|
||||||
S3Provider prov = new S3Provider();
|
prov.writeFixturesToS3(season, league, content);
|
||||||
prov.writeFixturesToS3(league, content);
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if(e.getMessage().endsWith("did not have any results with status: 'Too many requests. Your rate limit is 10 requests per minute.'")) {
|
if(e.getMessage().toLowerCase().contains("rate limit'")) {
|
||||||
try {
|
try {
|
||||||
Thread.sleep(1000 * 60);
|
Thread.sleep(1000 * 60);
|
||||||
String content = getRawData(apiFootballUrl);
|
String content = getRawData(requestPath, season, league);
|
||||||
S3Provider prov = new S3Provider();
|
prov.writeFixturesToS3(season, league, content);
|
||||||
prov.writeFixturesToS3(league, content);
|
|
||||||
} catch (InterruptedException interruptedException) {
|
} catch (InterruptedException interruptedException) {
|
||||||
interruptedException.printStackTrace();
|
interruptedException.printStackTrace();
|
||||||
} catch (Exception exception) {
|
} catch (Exception exception) {
|
||||||
@@ -48,32 +50,41 @@ public class APIFootballUpdater {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void updateAllFixtures(int season) {
|
public void updateAllFixtures(int season) {
|
||||||
HashSet<Integer> leagues = getLeagues(season);
|
HashSet<Integer> leagues = getLeagues();
|
||||||
for (Integer league : leagues) {
|
for (Integer league : leagues) {
|
||||||
updateFixtures(league);
|
updateFixtures(season, league);
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000*6);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateAllRounds(int season) {
|
public void updateAllRounds(int season) {
|
||||||
HashSet<Integer> leagues = getLeagues(season);
|
HashSet<Integer> leagues = getLeagues();
|
||||||
for (Integer league : leagues) {
|
for (Integer league : leagues) {
|
||||||
updateRounds(league);
|
updateRounds(season, league);
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000*6);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateRounds(int league) {
|
public void updateRounds(int season, int league) {
|
||||||
String apiFootballUrl = "https://v2.api-football.com/fixtures/rounds/" + league;
|
String requestPath = "fixtures/rounds";
|
||||||
|
S3Provider prov = new S3Provider();
|
||||||
try {
|
try {
|
||||||
String content = getRawData(apiFootballUrl);
|
String content = getRawData(requestPath, season, league);
|
||||||
S3Provider prov = new S3Provider();
|
prov.writeRoundsToS3(season, league, content);
|
||||||
prov.writeRoundsToS3(league, content);
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if(e.getMessage().endsWith("did not have any results with status: 'Too many requests. Your rate limit is 10 requests per minute.'")) {
|
if(e.getMessage().toLowerCase().contains("rate limit'")) {
|
||||||
try {
|
try {
|
||||||
Thread.sleep(1000 * 60);
|
Thread.sleep(1000 * 60);
|
||||||
String content = getRawData(apiFootballUrl);
|
String content = getRawData(requestPath, season, league);
|
||||||
S3Provider prov = new S3Provider();
|
prov.writeRoundsToS3(season, league, content);
|
||||||
prov.writeRoundsToS3(league, content);
|
|
||||||
} catch (InterruptedException interruptedException) {
|
} catch (InterruptedException interruptedException) {
|
||||||
interruptedException.printStackTrace();
|
interruptedException.printStackTrace();
|
||||||
} catch (Exception exception) {
|
} catch (Exception exception) {
|
||||||
@@ -85,54 +96,37 @@ public class APIFootballUpdater {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getRawData(String requestUrl) throws Exception {
|
public String getRawData(String requestPath, int season, int league) throws Exception {
|
||||||
|
if(league != 1 && league != 4) {
|
||||||
|
/**
|
||||||
|
* Season usually is one higher in Tippliga than in API-Football.
|
||||||
|
* e.g. 2023/24 is 2024 in Tippliga and 2023 in API-Football.
|
||||||
|
* Because Liga Cup in Tippliga is at the end of a season, season does match World Cup (1) and Euro Championship (4)
|
||||||
|
*/
|
||||||
|
season--;
|
||||||
|
}
|
||||||
|
|
||||||
HttpClient client = HttpClientBuilder.create().build();
|
HttpClient client = HttpClientBuilder.create().build();
|
||||||
|
String requestUrl = BASE_URL + requestPath + "?season=" + (season) + "&league=" + league + "&timezone=Europe/Berlin";
|
||||||
HttpGet request = new HttpGet(requestUrl);
|
HttpGet request = new HttpGet(requestUrl);
|
||||||
|
|
||||||
// add request header
|
// add request header
|
||||||
request.addHeader("X-RapidAPI-Key", "a607e6a7437d9d52f3ac73e0b2704d0b");
|
request.addHeader("x-rapidapi-host", "v3.football.api-sports.io");
|
||||||
|
request.addHeader("x-rapidapi-key", "a607e6a7437d9d52f3ac73e0b2704d0b");
|
||||||
HttpResponse response = null;
|
|
||||||
try {
|
|
||||||
response = client.execute(request);
|
|
||||||
} catch (IOException e) {
|
|
||||||
/* TODO */
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
BufferedReader rd = null;
|
|
||||||
try {
|
|
||||||
assert response != null;
|
|
||||||
rd = new BufferedReader(
|
|
||||||
new InputStreamReader(response.getEntity().getContent())
|
|
||||||
);
|
|
||||||
} catch (IOException e) {
|
|
||||||
/* TODO */
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
HttpResponse response = client.execute(request);
|
||||||
|
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
|
||||||
StringBuilder result = new StringBuilder();
|
StringBuilder result = new StringBuilder();
|
||||||
String line = "";
|
String line;
|
||||||
while (true) {
|
while ((line = rd.readLine()) != null) {
|
||||||
try {
|
|
||||||
line = rd.readLine();
|
|
||||||
} catch (IOException e) {
|
|
||||||
/* TODO */
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stop reading if last line was found.
|
|
||||||
if (line == null) break;
|
|
||||||
|
|
||||||
result.append(line);
|
result.append(line);
|
||||||
}
|
}
|
||||||
checkErrors(requestUrl, result.toString());
|
checkErrors(requestUrl, result.toString());
|
||||||
return result.toString();
|
return result.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public HashSet<Integer> getLeagues(int season) {
|
public HashSet<Integer> getLeagues() {
|
||||||
JSONArray leaguesArray = ResourceProvider.getLigenConfig(season);
|
JSONArray leaguesArray = ResourceProvider.getLigenConfig();
|
||||||
HashSet<Integer> leagues = new HashSet<>();
|
HashSet<Integer> leagues = new HashSet<>();
|
||||||
for (Object leagueObject : leaguesArray) {
|
for (Object leagueObject : leaguesArray) {
|
||||||
JSONObject leagueJSONObject = (JSONObject) leagueObject;
|
JSONObject leagueJSONObject = (JSONObject) leagueObject;
|
||||||
@@ -144,15 +138,15 @@ public class APIFootballUpdater {
|
|||||||
|
|
||||||
public void checkErrors(String requestUrl, String result) throws Exception {
|
public void checkErrors(String requestUrl, String result) throws Exception {
|
||||||
JSONObject resultObject = stringToJSONObject(result);
|
JSONObject resultObject = stringToJSONObject(result);
|
||||||
boolean containsError = ((JSONObject) resultObject.get("api")).containsKey("error");
|
boolean containsError = !((JSONArray) resultObject.get("errors")).isEmpty();
|
||||||
int results = Integer.parseInt(((JSONObject) resultObject.get("api")).get("results").toString());
|
// int results = Integer.parseInt(resultObject.get("results").toString());
|
||||||
if(containsError) {
|
if(containsError) {
|
||||||
String errorMessage = ((JSONObject) resultObject.get("api")).get("error").toString();
|
String errorMessage = resultObject.get("errors").toString();
|
||||||
throw new Exception(requestUrl + " returned error: '" + errorMessage + "'");
|
throw new Exception(requestUrl + " returned error: '" + errorMessage + "'");
|
||||||
} else if (results == 0) {
|
|
||||||
String statusMessage = ((JSONObject) resultObject.get("api")).get("status").toString();
|
|
||||||
throw new Exception(requestUrl + " did not have any results with status: '" + statusMessage + "'");
|
|
||||||
}
|
}
|
||||||
|
// else if (results == 0) {
|
||||||
|
// throw new Exception(requestUrl + " did not have any results.");
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
private JSONObject stringToJSONObject(String rawData) {
|
private JSONObject stringToJSONObject(String rawData) {
|
||||||
|
|||||||
@@ -1,45 +1,14 @@
|
|||||||
package de.jeyp91.googlecalendar;
|
package de.jeyp91.googlecalendar;
|
||||||
|
|
||||||
import com.google.common.io.Resources;
|
|
||||||
import org.json.simple.JSONObject;
|
|
||||||
import org.json.simple.parser.JSONParser;
|
|
||||||
import org.json.simple.parser.ParseException;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
|
|
||||||
public class CalendarConfigProvider {
|
public class CalendarConfigProvider {
|
||||||
|
|
||||||
private static JSONObject googleCalendarConfig = null;
|
private static String GOOGLE_CALENDAR_ID = "825f79shtm9n3uknj99iuu2qho";
|
||||||
|
|
||||||
private static JSONObject getGoogleCalendarConfig() {
|
|
||||||
if(googleCalendarConfig == null) {
|
|
||||||
//JSON parser object to parse read file
|
|
||||||
JSONParser jsonParser = new JSONParser();
|
|
||||||
URL url = Resources.getResource("Google_Calendar_Config.json");
|
|
||||||
String jsonConfig = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
jsonConfig = Resources.toString(url, StandardCharsets.UTF_8);
|
|
||||||
//Read JSON file
|
|
||||||
googleCalendarConfig = (JSONObject) jsonParser.parse(jsonConfig);
|
|
||||||
|
|
||||||
} catch (IOException | ParseException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return googleCalendarConfig;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getCalendarUrl() {
|
public static String getCalendarUrl() {
|
||||||
JSONObject leagueConfig = (JSONObject) getGoogleCalendarConfig().get(String.valueOf(1));
|
return GOOGLE_CALENDAR_ID + "@group.calendar.google.com";
|
||||||
return (String) leagueConfig.get("url");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getCalendarId() {
|
public static String getCalendarId() {
|
||||||
JSONObject leagueConfig = (JSONObject) getGoogleCalendarConfig().get(String.valueOf(1));
|
return GOOGLE_CALENDAR_ID;
|
||||||
return (String) leagueConfig.get("id");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,76 +1,89 @@
|
|||||||
package de.jeyp91.googlecalendar;
|
package de.jeyp91.googlecalendar;
|
||||||
|
|
||||||
import com.google.api.client.auth.oauth2.Credential;
|
|
||||||
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
|
|
||||||
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
|
|
||||||
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
|
|
||||||
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
|
|
||||||
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
|
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
|
||||||
import com.google.api.client.http.javanet.NetHttpTransport;
|
import com.google.api.client.http.javanet.NetHttpTransport;
|
||||||
import com.google.api.client.json.JsonFactory;
|
import com.google.api.client.json.JsonFactory;
|
||||||
import com.google.api.client.json.gson.GsonFactory;
|
import com.google.api.client.json.gson.GsonFactory;
|
||||||
import com.google.api.client.util.store.FileDataStoreFactory;
|
|
||||||
import com.google.api.services.calendar.CalendarScopes;
|
|
||||||
import com.google.api.services.calendar.Calendar;
|
import com.google.api.services.calendar.Calendar;
|
||||||
|
import com.google.api.services.calendar.CalendarScopes;
|
||||||
|
import com.google.auth.http.HttpCredentialsAdapter;
|
||||||
|
import com.google.auth.oauth2.GoogleCredentials;
|
||||||
|
import com.google.auth.oauth2.ServiceAccountCredentials;
|
||||||
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.net.URI;
|
||||||
import java.io.InputStreamReader;
|
import java.security.KeyFactory;
|
||||||
import java.security.GeneralSecurityException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.PrivateKey;
|
||||||
|
import java.security.spec.InvalidKeySpecException;
|
||||||
|
import java.security.spec.PKCS8EncodedKeySpec;
|
||||||
|
import java.util.Base64;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class GoogleCalendarConnector {
|
public class GoogleCalendarConnector {
|
||||||
private static final String APPLICATION_NAME = "Google Calendar API Java Quickstart";
|
private static final String APPLICATION_NAME = "Google Calendar API Java Quickstart";
|
||||||
private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
|
private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
|
||||||
private static final String TOKENS_DIRECTORY_PATH = "tokens";
|
|
||||||
|
|
||||||
/**
|
private static final String PROJECT_ID = "tippliga";
|
||||||
* Global instance of the scopes required by this quickstart.
|
private static final String CLIENT_MAIL = "tlw-707@tippliga.iam.gserviceaccount.com";
|
||||||
* If modifying these scopes, delete your previously saved tokens/ folder.
|
private static final String CLIENT_ID = "101590566618120833710";
|
||||||
*/
|
private static final String TOKEN_URI = "https://oauth2.googleapis.com/token";
|
||||||
private static final List<String> SCOPES = Collections.singletonList(CalendarScopes.CALENDAR);
|
|
||||||
private static final String CREDENTIALS_FILE_PATH = "/Google_Credentials.json";
|
|
||||||
|
|
||||||
/**
|
private static GoogleCredentials getGoogleCredentials() throws IOException {
|
||||||
* Creates an authorized Credential object.
|
String privateKeyId = getEnv("GOOGLE_CALENDAR_TIPPLIGA_SERVICE_ACCOUNT_PRIVATE_KEY_ID");
|
||||||
* @param HTTP_TRANSPORT The network HTTP Transport.
|
String privateKeyPem = getEnv("GOOGLE_CALENDAR_TIPPLIGA_SERVICE_ACCOUNT_PRIVATE_KEY");
|
||||||
* @return An authorized Credential object.
|
|
||||||
* @throws IOException If the Google_Credentials.json file cannot be found.
|
GoogleCredentials credentials = ServiceAccountCredentials.newBuilder()
|
||||||
*/
|
.setClientEmail(CLIENT_MAIL)
|
||||||
private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
|
.setClientId(CLIENT_ID)
|
||||||
// Load client secrets.
|
.setPrivateKey(parsePrivateKey(privateKeyPem))
|
||||||
InputStream in = GoogleCalendarConnector.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
|
.setPrivateKeyId(privateKeyId)
|
||||||
if (in == null) {
|
.setProjectId(PROJECT_ID)
|
||||||
throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
|
.setTokenServerUri(URI.create(TOKEN_URI))
|
||||||
|
.build()
|
||||||
|
.createScoped(Collections.singleton(CalendarScopes.CALENDAR));
|
||||||
|
|
||||||
|
credentials.refreshIfExpired();
|
||||||
|
return credentials;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static PrivateKey parsePrivateKey(String pemData) throws IOException {
|
||||||
|
String normalized = pemData.replace("\\n", "\n");
|
||||||
|
String stripped = normalized
|
||||||
|
.replace("-----BEGIN PRIVATE KEY-----", "")
|
||||||
|
.replace("-----END PRIVATE KEY-----", "")
|
||||||
|
.replaceAll("\\s", "");
|
||||||
|
byte[] encoded = Base64.getDecoder().decode(stripped);
|
||||||
|
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
|
||||||
|
try {
|
||||||
|
KeyFactory kf = KeyFactory.getInstance("RSA");
|
||||||
|
return kf.generatePrivate(keySpec);
|
||||||
|
} catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
|
||||||
|
throw new IOException("Failed to parse private key", e);
|
||||||
}
|
}
|
||||||
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
|
}
|
||||||
|
|
||||||
// Build flow and trigger user authorization request.
|
private static String getEnv(String name) throws IOException {
|
||||||
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
|
String value = System.getenv(name);
|
||||||
HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
|
if (value == null || value.isEmpty()) {
|
||||||
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
|
throw new IOException("Environment variable " + name + " is not set");
|
||||||
.setAccessType("offline")
|
}
|
||||||
.build();
|
return value;
|
||||||
LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
|
|
||||||
Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
|
|
||||||
//returns an authorized Credential object.
|
|
||||||
return credential;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static com.google.api.services.calendar.Calendar getSerivce() {
|
public static com.google.api.services.calendar.Calendar getSerivce() {
|
||||||
|
Calendar service = null;
|
||||||
com.google.api.services.calendar.Calendar service = null;
|
|
||||||
|
|
||||||
final NetHttpTransport HTTP_TRANSPORT;
|
final NetHttpTransport HTTP_TRANSPORT;
|
||||||
try {
|
try {
|
||||||
|
// Build a new authorized API client service.
|
||||||
HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
|
HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
|
||||||
service = new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
|
service = new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, null)
|
||||||
|
.setHttpRequestInitializer(new HttpCredentialsAdapter(getGoogleCredentials()))
|
||||||
.setApplicationName(APPLICATION_NAME)
|
.setApplicationName(APPLICATION_NAME)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
} catch (GeneralSecurityException | IOException e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
return service;
|
return service;
|
||||||
|
|||||||
@@ -4,17 +4,18 @@ import com.google.api.client.util.DateTime;
|
|||||||
import com.google.api.services.calendar.Calendar;
|
import com.google.api.services.calendar.Calendar;
|
||||||
import com.google.api.services.calendar.model.Event;
|
import com.google.api.services.calendar.model.Event;
|
||||||
import com.google.api.services.calendar.model.EventDateTime;
|
import com.google.api.services.calendar.model.EventDateTime;
|
||||||
import com.google.api.services.calendar.model.EventReminder;
|
|
||||||
import com.google.api.services.calendar.model.Events;
|
import com.google.api.services.calendar.model.Events;
|
||||||
import de.jeyp91.tippliga.TLWLeague;
|
|
||||||
import de.jeyp91.tippliga.TLWMatchday;
|
import de.jeyp91.tippliga.TLWMatchday;
|
||||||
|
import de.jeyp91.tippligaforum.TippligaSQLConnector;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static de.jeyp91.googlecalendar.GoogleCalendarConnector.getSerivce;
|
import static de.jeyp91.googlecalendar.GoogleCalendarConnector.getSerivce;
|
||||||
@@ -22,6 +23,9 @@ import static de.jeyp91.googlecalendar.GoogleCalendarConnector.getSerivce;
|
|||||||
public class TippligaGoogleEventManager {
|
public class TippligaGoogleEventManager {
|
||||||
|
|
||||||
private static List<Event> allEvents = null;
|
private static List<Event> allEvents = null;
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(TippligaGoogleEventManager.class);
|
||||||
|
|
||||||
|
private static final HashMap<String, String> allLeagueNames = new HashMap<>();
|
||||||
|
|
||||||
public static List<Event> getAllEvents(Integer season) {
|
public static List<Event> getAllEvents(Integer season) {
|
||||||
if(allEvents == null) {
|
if(allEvents == null) {
|
||||||
@@ -56,8 +60,18 @@ public class TippligaGoogleEventManager {
|
|||||||
|
|
||||||
public static Event findEvent(List<Event> allEvents, Integer season, Integer league, Integer matchday, Integer deliveryDateNumber) {
|
public static Event findEvent(List<Event> allEvents, Integer season, Integer league, Integer matchday, Integer deliveryDateNumber) {
|
||||||
String description = getDescription(season, league, matchday, deliveryDateNumber);
|
String description = getDescription(season, league, matchday, deliveryDateNumber);
|
||||||
for (Event allEvent : allEvents) {
|
String descriptionHtml = getDescriptionHTML(season, league, matchday, deliveryDateNumber);
|
||||||
if (allEvent.getDescription().equals(description)) return allEvent;
|
if(matchday == 34) {
|
||||||
|
String debug = "";
|
||||||
|
}
|
||||||
|
for (Event event : allEvents) {
|
||||||
|
String eventDescription = event.getDescription();
|
||||||
|
if (
|
||||||
|
(eventDescription.replaceAll("\\s+","").equals(description.replaceAll("\\s+","")))
|
||||||
|
|| eventDescription.equals(descriptionHtml)
|
||||||
|
) {
|
||||||
|
return event;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -75,7 +89,13 @@ public class TippligaGoogleEventManager {
|
|||||||
createNewEvent(matchday, deliveryDateString, deliverDateNumber);
|
createNewEvent(matchday, deliveryDateString, deliverDateNumber);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
updateEvent(event, matchday, deliveryDateString, deliverDateNumber);
|
String googleEventStart = event.getStart().getDateTime().toString();
|
||||||
|
String googleEventEnd = event.getEnd().getDateTime().toString();
|
||||||
|
String googleEventStartBeautified = googleEventStart.substring(0, 19).replace("T", " ");
|
||||||
|
if(!googleEventStartBeautified.equals(deliveryDateString)
|
||||||
|
|| !googleEventEnd.equals(googleEventStart)) {
|
||||||
|
updateEvent(event, matchday, deliveryDateString, deliverDateNumber);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,6 +105,7 @@ public class TippligaGoogleEventManager {
|
|||||||
Event event = getEvent(matchday, deliveryDateString, deliverDateNumber);
|
Event event = getEvent(matchday, deliveryDateString, deliverDateNumber);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
logger.info("Create new google calendar event for " + matchday.getSeason() + ", " + matchday.getLeague() + ", " + matchday.getMatchday() + ", " + deliverDateNumber);
|
||||||
getSerivce().events().insert(calendarUrl, event).execute();
|
getSerivce().events().insert(calendarUrl, event).execute();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -97,6 +118,7 @@ public class TippligaGoogleEventManager {
|
|||||||
Event event = getEvent(matchday, deliveryDateString, deliverDateNumber);
|
Event event = getEvent(matchday, deliveryDateString, deliverDateNumber);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
logger.info("Update google calendar event for " + matchday.getSeason() + ", " + matchday.getLeague() + ", " + matchday.getMatchday() + ", " + deliverDateNumber);
|
||||||
Calendar.Events events = getSerivce().events();
|
Calendar.Events events = getSerivce().events();
|
||||||
events.update(calendarUrl, oldEvent.getId(), event).execute();
|
events.update(calendarUrl, oldEvent.getId(), event).execute();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@@ -110,6 +132,7 @@ public class TippligaGoogleEventManager {
|
|||||||
Event event = findEvent(getAllEvents(matchday.getSeason()), matchday.getSeason(), matchday.getLeague(), matchday.getMatchday(), deliverDateNumber);
|
Event event = findEvent(getAllEvents(matchday.getSeason()), matchday.getSeason(), matchday.getLeague(), matchday.getMatchday(), deliverDateNumber);
|
||||||
if(event != null) {
|
if(event != null) {
|
||||||
try {
|
try {
|
||||||
|
logger.info("Delete google calendar event for " + matchday.getSeason() + ", " + matchday.getLeague() + ", " + matchday.getMatchday() + ", " + deliverDateNumber);
|
||||||
getSerivce().events().delete(calendarUrl, event.getId()).execute();
|
getSerivce().events().delete(calendarUrl, event.getId()).execute();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -117,11 +140,19 @@ public class TippligaGoogleEventManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void deleteAllEvents(int season) throws IOException {
|
||||||
|
String calendarUrl = CalendarConfigProvider.getCalendarUrl();
|
||||||
|
List<Event> events = getAllEvents(season);
|
||||||
|
for(Event event : events ) {
|
||||||
|
getSerivce().events().delete(calendarUrl, event.getId()).execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static Event getEvent(TLWMatchday matchday, String deliveryDateString, Integer deliverDateNumber) {
|
private static Event getEvent(TLWMatchday matchday, String deliveryDateString, Integer deliverDateNumber) {
|
||||||
String matchdayName = matchday.getMatchdayName().equals("") ? matchday.getMatchday().toString() + ". Spieltag" : matchday.getMatchdayName();
|
String matchdayName = matchday.getMatchdayName().equals("") ? matchday.getMatchday().toString() + ". Spieltag" : matchday.getMatchdayName();
|
||||||
String summary = TLWLeague.getLeagueNameCalendar(matchday.getLeague()) + " " + matchdayName + " tippen!";
|
String summary = getLeagueNameCalendar(matchday.getSeason(), matchday.getLeague()) + " " + matchdayName + " tippen!";
|
||||||
if(deliverDateNumber > 1) summary += " " + deliverDateNumber + ". Chance \uD83D\uDE43";
|
if(deliverDateNumber > 1) summary += " " + deliverDateNumber + ". Chance \uD83D\uDE43";
|
||||||
String description = getDescription(matchday.getSeason(), matchday.getLeague() == 2 ? 1 : matchday.getLeague(), matchday.getMatchday(), deliverDateNumber);
|
String description = getDescription(matchday.getSeason(), matchday.getLeague(), matchday.getMatchday(), deliverDateNumber);
|
||||||
String location = "https://tippliga-wuerzburg.de/app.php/football/bet";
|
String location = "https://tippliga-wuerzburg.de/app.php/football/bet";
|
||||||
|
|
||||||
LocalDateTime deliveryLocalDateTime = LocalDateTime.parse(deliveryDateString.replace(" ", "T"));
|
LocalDateTime deliveryLocalDateTime = LocalDateTime.parse(deliveryDateString.replace(" ", "T"));
|
||||||
@@ -131,13 +162,9 @@ public class TippligaGoogleEventManager {
|
|||||||
.setDateTime(deliveryDateTime)
|
.setDateTime(deliveryDateTime)
|
||||||
.setTimeZone("Europe/Berlin");
|
.setTimeZone("Europe/Berlin");
|
||||||
|
|
||||||
// Set reminder to 12 hours before
|
// Set reminder to 12 remainingHours before
|
||||||
Event.Reminders reminders = new Event.Reminders();
|
Event.Reminders reminders = new Event.Reminders();
|
||||||
reminders.setUseDefault(false);
|
reminders.setUseDefault(true);
|
||||||
EventReminder[] reminderOverrides = new EventReminder[] {
|
|
||||||
new EventReminder().setMethod("popup").setMinutes(12 * 60),
|
|
||||||
};
|
|
||||||
reminders.setOverrides(Arrays.asList(reminderOverrides));
|
|
||||||
|
|
||||||
return new Event()
|
return new Event()
|
||||||
.setSummary(summary)
|
.setSummary(summary)
|
||||||
@@ -149,9 +176,16 @@ public class TippligaGoogleEventManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static String getDescription(Integer season, Integer league, Integer matchday, Integer deliverDateNumber) {
|
private static String getDescription(Integer season, Integer league, Integer matchday, Integer deliverDateNumber) {
|
||||||
|
league = league == 2 ? 1 : league;
|
||||||
return "Saison: " + season + "\n" + "Liga: " + league + "\n" + "Spieltag: " + matchday + "\n" + "Abgabeschluss: " + deliverDateNumber;
|
return "Saison: " + season + "\n" + "Liga: " + league + "\n" + "Spieltag: " + matchday + "\n" + "Abgabeschluss: " + deliverDateNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static String getDescriptionHTML(Integer season, Integer league, Integer matchday, Integer deliverDateNumber) {
|
||||||
|
league = league == 2 ? 1 : league;
|
||||||
|
return "Saison: " + season + "<br>" + "Liga: " + league + "<br>" + "Spieltag: " + matchday + "<br>" + "Abgabeschluss: " + deliverDateNumber;
|
||||||
|
}
|
||||||
|
|
||||||
public static void updateAllMatchdays(ArrayList<TLWMatchday> matchdays) {
|
public static void updateAllMatchdays(ArrayList<TLWMatchday> matchdays) {
|
||||||
matchdays.forEach(tlwMatchday -> {
|
matchdays.forEach(tlwMatchday -> {
|
||||||
createOrUpdateEvent(tlwMatchday, tlwMatchday.getDeliveryDate(), 1);
|
createOrUpdateEvent(tlwMatchday, tlwMatchday.getDeliveryDate(), 1);
|
||||||
@@ -167,4 +201,13 @@ public class TippligaGoogleEventManager {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String getLeagueNameCalendar(Integer season, Integer league) {
|
||||||
|
String seasonLeagueId = season.toString() + league.toString();
|
||||||
|
|
||||||
|
if(!allLeagueNames.containsKey(seasonLeagueId)) {
|
||||||
|
allLeagueNames.put(seasonLeagueId, TippligaSQLConnector.getInstance().getLeague(season.toString(), league.toString()).getLeagueNameCalendar());
|
||||||
|
}
|
||||||
|
return allLeagueNames.get(seasonLeagueId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,142 +0,0 @@
|
|||||||
package de.jeyp91.openligadb;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import org.apache.http.HttpResponse;
|
|
||||||
import org.apache.http.client.ClientProtocolException;
|
|
||||||
import org.apache.http.client.HttpClient;
|
|
||||||
import org.apache.http.client.methods.HttpGet;
|
|
||||||
import org.apache.http.impl.client.HttpClientBuilder;
|
|
||||||
import org.json.simple.JSONArray;
|
|
||||||
import org.json.simple.JSONObject;
|
|
||||||
import org.json.simple.parser.JSONParser;
|
|
||||||
import org.json.simple.parser.ParseException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class OpenLigaDBConnector {
|
|
||||||
|
|
||||||
private final String OPENLIGADB_API_URL = "http://www.openligadb.de/api/";
|
|
||||||
|
|
||||||
public OpenLigaDBConnector() {}
|
|
||||||
|
|
||||||
public OpenLigaDBMatch getMatchDataOfSingleMatch(int id) {
|
|
||||||
String url = OPENLIGADB_API_URL + "getmatchdata/" + id;
|
|
||||||
JSONObject matchAsJson = getDataAsJSONObject(url);
|
|
||||||
return new OpenLigaDBMatch(matchAsJson);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ArrayList<OpenLigaDBMatch> getMatchDataOfMatchday(int season, String league, int matchday) {
|
|
||||||
|
|
||||||
String url = OPENLIGADB_API_URL + "getmatchdata/" + league + "/" + (season - 1) + "/" + matchday;
|
|
||||||
|
|
||||||
JSONArray matches = getDataAsJSONArray(url);
|
|
||||||
ArrayList<OpenLigaDBMatch> matchesList = new ArrayList<>();
|
|
||||||
|
|
||||||
for(Object match: matches) {
|
|
||||||
matchesList.add(new OpenLigaDBMatch((JSONObject) match));
|
|
||||||
}
|
|
||||||
|
|
||||||
return matchesList;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ArrayList<OpenLigaDBMatch> getMatchDataOfCurrentMatchday(String league) {
|
|
||||||
|
|
||||||
String url = OPENLIGADB_API_URL + "getmatchdata/" + league;
|
|
||||||
|
|
||||||
JSONArray matches = getDataAsJSONArray(url);
|
|
||||||
ArrayList<OpenLigaDBMatch> matchesList = new ArrayList<>();
|
|
||||||
|
|
||||||
for(Object match: matches) {
|
|
||||||
matchesList.add(new OpenLigaDBMatch((JSONObject) match));
|
|
||||||
}
|
|
||||||
|
|
||||||
return matchesList;
|
|
||||||
}
|
|
||||||
|
|
||||||
public OpenLigaDBMatch getMatchDataByMatchId(int id) {
|
|
||||||
String url = OPENLIGADB_API_URL + "getmatchdata/" + id;
|
|
||||||
JSONObject match = getDataAsJSONObject(url);
|
|
||||||
return new OpenLigaDBMatch(match);
|
|
||||||
}
|
|
||||||
|
|
||||||
private JSONArray getDataAsJSONArray(String requestUrl) {
|
|
||||||
|
|
||||||
String rawData = getRawData(requestUrl);
|
|
||||||
JSONParser parser = new JSONParser();
|
|
||||||
JSONArray data = null;
|
|
||||||
try {
|
|
||||||
data = (JSONArray) parser.parse(rawData);
|
|
||||||
} catch (ParseException e) {
|
|
||||||
/* TODO */
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
private JSONObject getDataAsJSONObject(String requestUrl) {
|
|
||||||
|
|
||||||
String rawData = getRawData(requestUrl);
|
|
||||||
JSONParser parser = new JSONParser();
|
|
||||||
JSONObject data = null;
|
|
||||||
try {
|
|
||||||
data = (JSONObject) parser.parse(rawData);
|
|
||||||
} catch (ParseException e) {
|
|
||||||
/* TODO */
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getRawData(String requestUrl) {
|
|
||||||
|
|
||||||
HttpClient client = HttpClientBuilder.create().build();
|
|
||||||
HttpGet request = new HttpGet(requestUrl);
|
|
||||||
|
|
||||||
// add request header
|
|
||||||
request.addHeader("Content-Type", "application/json");
|
|
||||||
|
|
||||||
HttpResponse response = null;
|
|
||||||
try {
|
|
||||||
response = client.execute(request);
|
|
||||||
} catch (ClientProtocolException e) {
|
|
||||||
/* TODO */
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (IOException e) {
|
|
||||||
/* TODO */
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
BufferedReader rd = null;
|
|
||||||
try {
|
|
||||||
rd = new BufferedReader(
|
|
||||||
new InputStreamReader(response.getEntity().getContent())
|
|
||||||
);
|
|
||||||
} catch (IOException e) {
|
|
||||||
/* TODO */
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
StringBuilder result = new StringBuilder();
|
|
||||||
String line = "";
|
|
||||||
while (true) {
|
|
||||||
try {
|
|
||||||
line = rd.readLine();
|
|
||||||
} catch (IOException e) {
|
|
||||||
/* TODO */
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stop reading if last line was found.
|
|
||||||
if (line == null) break;
|
|
||||||
|
|
||||||
result.append(line);
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
package de.jeyp91.openligadb;
|
|
||||||
|
|
||||||
import de.jeyp91.BaseMatch;
|
|
||||||
import de.jeyp91.tippliga.TLWMatch;
|
|
||||||
import org.json.simple.JSONArray;
|
|
||||||
import org.json.simple.JSONObject;
|
|
||||||
import java.util.regex.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class OpenLigaDBMatch extends BaseMatch {
|
|
||||||
|
|
||||||
private final int RESULT_TYPE_ENDRESULT = 2;
|
|
||||||
|
|
||||||
private Integer season = null;
|
|
||||||
private int matchId;
|
|
||||||
private int leagueId;
|
|
||||||
private boolean matchIsFinished;
|
|
||||||
|
|
||||||
public OpenLigaDBMatch(JSONObject json) {
|
|
||||||
this.matchId = Integer.parseInt(json.get("MatchID").toString());
|
|
||||||
this.season = getSeasonFromLeageName(json.get("LeagueName").toString());
|
|
||||||
this.leagueId = Integer.parseInt(json.get("LeagueId").toString());
|
|
||||||
this.teamIdHome = Integer.parseInt(((JSONObject) json.get("Team1")).get("TeamId").toString());
|
|
||||||
this.teamIdGuest = Integer.parseInt(((JSONObject) json.get("Team2")).get("TeamId").toString());
|
|
||||||
for(int i = 0; i < ((JSONArray) json.get("MatchResults")).size(); i++) {
|
|
||||||
if(Integer.parseInt((((JSONObject) ((JSONArray) json.get("MatchResults")).get(i)).get("ResultTypeID")).toString()) == RESULT_TYPE_ENDRESULT) {
|
|
||||||
this.goalsHome = Integer.parseInt(((JSONObject) ((JSONArray) json.get("MatchResults")).get(i)).get("PointsTeam1").toString());
|
|
||||||
this.goalsGuest = Integer.parseInt(((JSONObject) ((JSONArray) json.get("MatchResults")).get(i)).get("PointsTeam2").toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.matchday = Integer.parseInt(((JSONObject) json.get("Group")).get("GroupOrderID").toString());
|
|
||||||
this.matchIsFinished = (Boolean) json.get("MatchIsFinished");
|
|
||||||
this.matchDatetime = (String) json.get("MatchDateTime");
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getSeasonFromLeageName(String leagueName) {
|
|
||||||
Pattern p = Pattern.compile("\\d*/\\d*");
|
|
||||||
Matcher m = p.matcher(leagueName);
|
|
||||||
m.find();
|
|
||||||
String seasonString = m.group();
|
|
||||||
p = Pattern.compile("\\d+");
|
|
||||||
m = p.matcher(seasonString);
|
|
||||||
Integer season = null;
|
|
||||||
while(m.find()) {
|
|
||||||
season = Integer.parseInt(m.group());
|
|
||||||
}
|
|
||||||
return season < 100 ? season + 2000 : season;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isSameMatch(TLWMatch compareMatch) {
|
|
||||||
if(this.getSeason()!= compareMatch.getSeason()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if(this.getMatchday() != compareMatch.getMatchday()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if(this.getTeamIdHome() != compareMatch.getTeamIdHome()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if(this.getTeamIdGuest() != compareMatch.getTeamIdGuest()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
String thisDateTime = this.getMatchDateTime().replace("T", " ");
|
|
||||||
String tempDateTime = compareMatch.getMatchDateTime().replace("T", " ");
|
|
||||||
if(!tempDateTime.equals(thisDateTime)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if(this.goalsHome != compareMatch.getGoalsHome() ||
|
|
||||||
this.goalsGuest != compareMatch.getGoalsGuest()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getSeason() {
|
|
||||||
return this.season;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getMatchId() {
|
|
||||||
return this.matchId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean getMatchIsFinished() {
|
|
||||||
return this.matchIsFinished;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4,14 +4,15 @@ import com.google.common.collect.HashBiMap;
|
|||||||
import de.jeyp91.ResourceProvider;
|
import de.jeyp91.ResourceProvider;
|
||||||
import de.jeyp91.StatusHolder;
|
import de.jeyp91.StatusHolder;
|
||||||
import de.jeyp91.apifootball.APIFootballMatch;
|
import de.jeyp91.apifootball.APIFootballMatch;
|
||||||
import org.apache.logging.log4j.*;
|
|
||||||
import org.json.simple.JSONArray;
|
import org.json.simple.JSONArray;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
public class TeamIDMatcher {
|
public class TeamIDMatcher {
|
||||||
|
|
||||||
private static HashBiMap<Integer, Integer> ids = null;
|
private static HashBiMap<Integer, Integer> ids = null;
|
||||||
private static final Logger logger = LogManager.getLogger(TeamIDMatcher.class);
|
private static final Logger logger = LoggerFactory.getLogger(TeamIDMatcher.class);
|
||||||
private static JSONArray teams;
|
private static JSONArray teams;
|
||||||
private static boolean init = false;
|
private static boolean init = false;
|
||||||
public static final int HOME = 0;
|
public static final int HOME = 0;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ public class TeamIDMatcherTemplateCreator {
|
|||||||
|
|
||||||
public TeamIDMatcherTemplateCreator(int season, int league) throws Exception {
|
public TeamIDMatcherTemplateCreator(int season, int league) throws Exception {
|
||||||
this.con = APIFootballConnector.getAPIFootballConnectorInstance(season);
|
this.con = APIFootballConnector.getAPIFootballConnectorInstance(season);
|
||||||
JSONObject apiObject = con.getTeamsForLeague(league);
|
JSONObject apiObject = con.getTeamsForLeague(season, league);
|
||||||
JSONObject teamsObject = (JSONObject) apiObject.get("api");
|
JSONObject teamsObject = (JSONObject) apiObject.get("api");
|
||||||
this.teams = (JSONArray) teamsObject.get("teams");
|
this.teams = (JSONArray) teamsObject.get("teams");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,75 +1,50 @@
|
|||||||
package de.jeyp91.tippliga;
|
package de.jeyp91.tippliga;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
public class TLWLeague {
|
public class TLWLeague {
|
||||||
public static String getLeagueName(int id) {
|
|
||||||
String leagueName = "";
|
private Integer season = null;
|
||||||
switch (id) {
|
private Integer league = null;
|
||||||
case 1:
|
private String leagueName = null;
|
||||||
leagueName = "Tippliga";
|
private String leagueNameShort = null;
|
||||||
break;
|
|
||||||
case 46:
|
public TLWLeague(ResultSet rset) {
|
||||||
leagueName = "Elfmeter";
|
final int SEASON = 1;
|
||||||
break;
|
final int LEAGUE = 2;
|
||||||
case 47:
|
final int LEAGUE_NAME = 3;
|
||||||
leagueName = "Relegation";
|
final int LEAGUE_NAME_SHORT = 4;
|
||||||
break;
|
try {
|
||||||
case 48:
|
this.season = Integer.parseInt(rset.getString(SEASON));
|
||||||
leagueName = "WTL-Pokal";
|
this.league = Integer.parseInt(rset.getString(LEAGUE));
|
||||||
break;
|
this.leagueName = rset.getString(LEAGUE_NAME);
|
||||||
case 49:
|
this.leagueNameShort = rset.getString(LEAGUE_NAME_SHORT);
|
||||||
leagueName = "Liga-Cup";
|
} catch (SQLException e) {
|
||||||
break;
|
e.printStackTrace();
|
||||||
default: break;
|
|
||||||
}
|
}
|
||||||
return leagueName;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getLeagueNameShort(int id) {
|
public Integer getSeason() {
|
||||||
String leagueName = "";
|
return this.season;
|
||||||
switch (id) {
|
|
||||||
case 1:
|
|
||||||
leagueName = "1. TLW";
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
leagueName = "2. TLW";
|
|
||||||
break;
|
|
||||||
case 46:
|
|
||||||
leagueName = "ELF";
|
|
||||||
break;
|
|
||||||
case 47:
|
|
||||||
leagueName = "REL";
|
|
||||||
break;
|
|
||||||
case 48:
|
|
||||||
leagueName = "WTL";
|
|
||||||
break;
|
|
||||||
case 49:
|
|
||||||
leagueName = "LC";
|
|
||||||
break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
return leagueName;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getLeagueNameCalendar(int id) {
|
public Integer getLeague() {
|
||||||
String leagueName = "";
|
return this.league;
|
||||||
switch (id) {
|
}
|
||||||
case 1:
|
|
||||||
case 2:
|
public String getLeagueName() {
|
||||||
leagueName = "Tippliga";
|
return this.leagueName;
|
||||||
break;
|
}
|
||||||
case 46:
|
|
||||||
leagueName = "Elfmeter";
|
public String getLeagueNameShort() {
|
||||||
break;
|
return this.leagueNameShort;
|
||||||
case 47:
|
}
|
||||||
leagueName = "Relegation";
|
|
||||||
break;
|
public String getLeagueNameCalendar() {
|
||||||
case 48:
|
String leagueName = this.leagueName;
|
||||||
leagueName = "WTL-Pokal";
|
if (leagueName.equals("1. Tippliga Würzburg") || leagueName.equals("2. Tippliga Würzburg")) {
|
||||||
break;
|
leagueName = "Tippliga";
|
||||||
case 49:
|
|
||||||
leagueName = "Liga Cup";
|
|
||||||
break;
|
|
||||||
default: break;
|
|
||||||
}
|
}
|
||||||
return leagueName;
|
return leagueName;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,22 +2,20 @@ package de.jeyp91.tippliga;
|
|||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import de.jeyp91.BaseMatch;
|
import de.jeyp91.BaseMatch;
|
||||||
import de.jeyp91.teamidmatcher.TeamIDMatcher;
|
|
||||||
import de.jeyp91.apifootball.APIFootballMatch;
|
import de.jeyp91.apifootball.APIFootballMatch;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import de.jeyp91.teamidmatcher.TeamIDMatcher;
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class TLWMatch extends BaseMatch{
|
public class TLWMatch extends BaseMatch{
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(TLWMatch.class);
|
||||||
public final Integer STATUS_NOTSTARTED = 0;
|
|
||||||
public final Integer STATUS_STARTED = 1;
|
|
||||||
public final Integer STATUS_PROVISIONAL_RESULT_AVAILABLE = 2;
|
|
||||||
public final Integer STATUS_FINISHED = 3;
|
|
||||||
|
|
||||||
private Integer season = null;
|
private Integer season = null;
|
||||||
private Integer league = null;
|
private Integer league = null;
|
||||||
@@ -25,11 +23,6 @@ public class TLWMatch extends BaseMatch{
|
|||||||
private String groupId = null;
|
private String groupId = null;
|
||||||
private String formulaHome = null;
|
private String formulaHome = null;
|
||||||
private String formulaGuest = null;
|
private String formulaGuest = null;
|
||||||
private Integer status = null;
|
|
||||||
private Integer koMatch = 0;
|
|
||||||
private Integer goalsOvertimeHome = null;
|
|
||||||
private Integer goalsOvertimeGuest = null;
|
|
||||||
private Integer showTable = null;
|
|
||||||
private String trend = null;
|
private String trend = null;
|
||||||
private Float odd1 = null;
|
private Float odd1 = null;
|
||||||
private Float oddX = null;
|
private Float oddX = null;
|
||||||
@@ -90,7 +83,7 @@ public class TLWMatch extends BaseMatch{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public TLWMatch(APIFootballMatch apiFootballMatch, int season, int league, int matchday, int matchNo, int status, int koMatch) {
|
public TLWMatch(APIFootballMatch apiFootballMatch, int season, int league, int matchday, int matchNo, int status, int koMatch, boolean showTable) {
|
||||||
this.season = season;
|
this.season = season;
|
||||||
this.league = league;
|
this.league = league;
|
||||||
this.matchday = matchday;
|
this.matchday = matchday;
|
||||||
@@ -98,6 +91,10 @@ public class TLWMatch extends BaseMatch{
|
|||||||
this.teamIdHome = TeamIDMatcher.getTippligaIdFromApiFootballId(apiFootballMatch, TeamIDMatcher.HOME);
|
this.teamIdHome = TeamIDMatcher.getTippligaIdFromApiFootballId(apiFootballMatch, TeamIDMatcher.HOME);
|
||||||
this.teamIdGuest = TeamIDMatcher.getTippligaIdFromApiFootballId(apiFootballMatch, TeamIDMatcher.GUEST);
|
this.teamIdGuest = TeamIDMatcher.getTippligaIdFromApiFootballId(apiFootballMatch, TeamIDMatcher.GUEST);
|
||||||
this.goalsHome = apiFootballMatch.getGoalsHome();
|
this.goalsHome = apiFootballMatch.getGoalsHome();
|
||||||
|
this.goalsOvertimeHome = apiFootballMatch.getGoalsOvertimeHome();
|
||||||
|
this.goalsOvertimeGuest = apiFootballMatch.getGoalsOvertimeGuest();
|
||||||
|
this.goalsGuest = apiFootballMatch.getGoalsGuest();
|
||||||
|
this.goalsHome = apiFootballMatch.getGoalsHome();
|
||||||
this.goalsGuest = apiFootballMatch.getGoalsGuest();
|
this.goalsGuest = apiFootballMatch.getGoalsGuest();
|
||||||
this.matchDatetime = apiFootballMatch.getMatchDateTime().replace("T", " ").substring(0, 19);
|
this.matchDatetime = apiFootballMatch.getMatchDateTime().replace("T", " ").substring(0, 19);
|
||||||
this.groupId = this.getGroupFromMatchdayString(apiFootballMatch.getRound());
|
this.groupId = this.getGroupFromMatchdayString(apiFootballMatch.getRound());
|
||||||
@@ -105,6 +102,7 @@ public class TLWMatch extends BaseMatch{
|
|||||||
this.formulaGuest = "";
|
this.formulaGuest = "";
|
||||||
this.status = status;
|
this.status = status;
|
||||||
this.koMatch = koMatch;
|
this.koMatch = koMatch;
|
||||||
|
this.showTable = showTable ? 0 : 1;
|
||||||
this.teamNameHome = apiFootballMatch.getTeamNameHome();
|
this.teamNameHome = apiFootballMatch.getTeamNameHome();
|
||||||
this.teamNameGuest = apiFootballMatch.getTeamNameGuest();
|
this.teamNameGuest = apiFootballMatch.getTeamNameGuest();
|
||||||
}
|
}
|
||||||
@@ -156,6 +154,14 @@ public class TLWMatch extends BaseMatch{
|
|||||||
this.rating = referenceMatch.rating;
|
this.rating = referenceMatch.rating;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TLWMatch(String formulaHome, String formulaGuest, String matchDateTime) {
|
||||||
|
this.teamIdHome = 0;
|
||||||
|
this.teamIdGuest = 0;
|
||||||
|
this.formulaHome = formulaHome;
|
||||||
|
this.formulaGuest = formulaGuest;
|
||||||
|
this.matchDatetime = matchDateTime;
|
||||||
|
}
|
||||||
|
|
||||||
public Integer getSeason() {
|
public Integer getSeason() {
|
||||||
return this.season;
|
return this.season;
|
||||||
}
|
}
|
||||||
@@ -168,42 +174,24 @@ public class TLWMatch extends BaseMatch{
|
|||||||
return this.matchNo;
|
return this.matchNo;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getStatus() {
|
|
||||||
return this.status;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getKoMatch() {
|
|
||||||
return this.koMatch;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getGroupId() {
|
public String getGroupId() {
|
||||||
return this.groupId;
|
return this.groupId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getShowTable() {
|
|
||||||
return this.showTable;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFormulaHome() {
|
public String getFormulaHome() {
|
||||||
String formula = "'D'";
|
String formula = "D";
|
||||||
if(this.teamIdHome != null) {
|
if (this.formulaHome != null) {
|
||||||
return "''";
|
|
||||||
}
|
|
||||||
else if (this.formulaHome != null) {
|
|
||||||
formula = this.formulaHome;
|
formula = this.formulaHome;
|
||||||
}
|
}
|
||||||
return formula;
|
return "'" + formula + "'";
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getFormulaGuest() {
|
public String getFormulaGuest() {
|
||||||
String formula = "'D'";
|
String formula = "D";
|
||||||
if(this.teamIdGuest != null) {
|
if (this.formulaGuest != null) {
|
||||||
return "''";
|
|
||||||
}
|
|
||||||
else if (this.formulaGuest != null) {
|
|
||||||
formula = this.formulaGuest;
|
formula = this.formulaGuest;
|
||||||
}
|
}
|
||||||
return formula;
|
return "'" + formula + "'";
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getSQLQueryInsert() {
|
public String getSQLQueryInsert() {
|
||||||
@@ -222,8 +210,8 @@ public class TLWMatch extends BaseMatch{
|
|||||||
return this.season + ", " +
|
return this.season + ", " +
|
||||||
this.league + ", " +
|
this.league + ", " +
|
||||||
this.matchNo + ", " +
|
this.matchNo + ", " +
|
||||||
nullToSqlEmptyString(this.teamIdHome) + ", " +
|
nullToSqlNullString(this.teamIdHome) + ", " +
|
||||||
nullToSqlEmptyString(this.teamIdGuest) + ", " +
|
nullToSqlNullString(this.teamIdGuest) + ", " +
|
||||||
nullToSqlEmptyString(this.goalsHome) + ", " +
|
nullToSqlEmptyString(this.goalsHome) + ", " +
|
||||||
nullToSqlEmptyString(this.goalsGuest) + ", " +
|
nullToSqlEmptyString(this.goalsGuest) + ", " +
|
||||||
this.matchday + ", " +
|
this.matchday + ", " +
|
||||||
@@ -243,22 +231,34 @@ public class TLWMatch extends BaseMatch{
|
|||||||
return number != null ? number.toString() : "''";
|
return number != null ? number.toString() : "''";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String nullToSqlNullString(Integer number) {
|
||||||
|
return number != null ? number.toString() : "0";
|
||||||
|
}
|
||||||
|
|
||||||
private String nullToSqlEmptyString(String string) {
|
private String nullToSqlEmptyString(String string) {
|
||||||
return string != null ? "'"+string+"'" : "''";
|
return string != null ? "'"+string+"'" : "''";
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setStatus(int status) {
|
public void setGoalsHome(int goals) {
|
||||||
this.status = status;
|
this.goalsHome = goals;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGoalsGuest(int goals) {
|
||||||
|
this.goalsGuest = goals;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGoalsOvertimeHome(int goals) {
|
||||||
|
this.goalsOvertimeHome = goals;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGoalsOvertimeGuest(int goals) {
|
||||||
|
this.goalsOvertimeGuest = goals;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMatchDateTime(String matchDateTime) {
|
public void setMatchDateTime(String matchDateTime) {
|
||||||
this.matchDatetime = matchDateTime;
|
this.matchDatetime = matchDateTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setShowTable(Boolean showTable) {
|
|
||||||
this.showTable = showTable ? 0 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateMatch(APIFootballMatch apiFootballMatch) {
|
public void updateMatch(APIFootballMatch apiFootballMatch) {
|
||||||
this.teamIdHome = TeamIDMatcher.getTippligaIdFromApiFootballId(apiFootballMatch, TeamIDMatcher.HOME);
|
this.teamIdHome = TeamIDMatcher.getTippligaIdFromApiFootballId(apiFootballMatch, TeamIDMatcher.HOME);
|
||||||
this.teamIdGuest = TeamIDMatcher.getTippligaIdFromApiFootballId(apiFootballMatch, TeamIDMatcher.GUEST);
|
this.teamIdGuest = TeamIDMatcher.getTippligaIdFromApiFootballId(apiFootballMatch, TeamIDMatcher.GUEST);
|
||||||
@@ -276,4 +276,24 @@ public class TLWMatch extends BaseMatch{
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isSameMatchPlaceholder (TLWMatch tlwMatch, TLWMatch placeholderConfigMatch) {
|
||||||
|
String placeholderConfigMatchDateTime = placeholderConfigMatch.getMatchDateTime();
|
||||||
|
String tlwMatchDateTime = tlwMatch.getMatchDateTime();
|
||||||
|
String placeholderConfigMatchFormulaHome = placeholderConfigMatch.getFormulaHome();
|
||||||
|
String tlwMatchFormulaHome = tlwMatch.getFormulaHome();
|
||||||
|
String placeholderConfigMatchFormulaGuest = placeholderConfigMatch.getFormulaGuest();
|
||||||
|
String tlwMatchFormulaGuest = tlwMatch.getFormulaGuest();
|
||||||
|
if(Objects.equals(tlwMatchDateTime, placeholderConfigMatchDateTime) &&
|
||||||
|
Objects.equals(tlwMatchFormulaHome, placeholderConfigMatchFormulaHome) &&
|
||||||
|
Objects.equals(tlwMatchFormulaGuest, placeholderConfigMatchFormulaGuest)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if(Objects.equals(tlwMatchDateTime, placeholderConfigMatchDateTime) &&
|
||||||
|
Objects.equals(tlwMatch.getTeamIdHome(), null) &&
|
||||||
|
Objects.equals(tlwMatch.getTeamIdGuest(), null)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -6,11 +6,6 @@ import java.sql.SQLException;
|
|||||||
|
|
||||||
public class TLWMatchday {
|
public class TLWMatchday {
|
||||||
|
|
||||||
final Integer STATUS_NOTSTARTED = 0;
|
|
||||||
final Integer STATUS_STARTED = 1;
|
|
||||||
final Integer STATUS_PROVISIONAL_RESULT_AVAILABLE = 2;
|
|
||||||
final Integer STATUS_FINISHED = 3;
|
|
||||||
|
|
||||||
private Integer season = null;
|
private Integer season = null;
|
||||||
private Integer league = null;
|
private Integer league = null;
|
||||||
private Integer matchday = null;
|
private Integer matchday = null;
|
||||||
@@ -34,15 +29,15 @@ public class TLWMatchday {
|
|||||||
final int MATCHES = 9;
|
final int MATCHES = 9;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
this.season = Integer.parseInt(rset.getString(SEASON));
|
this.season = Integer.valueOf(rset.getString(SEASON));
|
||||||
this.league = Integer.parseInt(rset.getString(LEAGUE));
|
this.league = Integer.valueOf(rset.getString(LEAGUE));
|
||||||
this.matchday = Integer.parseInt(rset.getString(MATCHDAY));
|
this.matchday = Integer.valueOf(rset.getString(MATCHDAY));
|
||||||
this.status = Integer.parseInt(rset.getString(STATUS));
|
this.status = Integer.valueOf(rset.getString(STATUS));
|
||||||
this.deliveryDate = rset.getString(DELIVERY_DATE);
|
this.deliveryDate = rset.getString(DELIVERY_DATE);
|
||||||
this.deliveryDate2 = rset.getString(DELIVERY_DATE_2);
|
this.deliveryDate2 = rset.getString(DELIVERY_DATE_2);
|
||||||
this.deliveryDate3 = rset.getString(DELIVERY_DATE_3);
|
this.deliveryDate3 = rset.getString(DELIVERY_DATE_3);
|
||||||
this.matchdayName = rset.getString(MATCHDAY_NAME);
|
this.matchdayName = rset.getString(MATCHDAY_NAME);
|
||||||
this.matches = Integer.parseInt(rset.getString(MATCHES));
|
this.matches = Integer.valueOf(rset.getString(MATCHES));
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
/* TODO */
|
/* TODO */
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
@@ -130,9 +130,15 @@ public class TLWMatchdaysCreator {
|
|||||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||||
deliveryDates.add(firstMatchDate.format(formatter));
|
deliveryDates.add(firstMatchDate.format(formatter));
|
||||||
|
|
||||||
ArrayList<TLWMatch> remainingMatches = TLWMatchesManagerBase.getMatchesStartingFromSecondDay(matchesOfMatchday);
|
ArrayList<TLWMatch> matchesSecondDay = TLWMatchesManagerBase.getMatchesStartingFromSecondDay(matchesOfMatchday);
|
||||||
if(remainingMatches.size() > 0) {
|
if(matchesSecondDay.size() > 0) {
|
||||||
firstMatchDate = TLWMatchesManagerBase.getFirstMatchtimeTLW(remainingMatches);
|
firstMatchDate = TLWMatchesManagerBase.getFirstMatchtimeTLW(matchesSecondDay);
|
||||||
|
deliveryDates.add(firstMatchDate.format(formatter));
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayList<TLWMatch> matchesSecondWeek = TLWMatchesManagerBase.getMatchesStartingFromSecondWeek(matchesOfMatchday);
|
||||||
|
if(matchesSecondWeek.size() > 0) {
|
||||||
|
firstMatchDate = TLWMatchesManagerBase.getFirstMatchtimeTLW(matchesSecondWeek);
|
||||||
deliveryDates.add(firstMatchDate.format(formatter));
|
deliveryDates.add(firstMatchDate.format(formatter));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package de.jeyp91.tippliga;
|
package de.jeyp91.tippliga;
|
||||||
|
|
||||||
import de.jeyp91.tippligaforum.TippligaSQLConnector;
|
import de.jeyp91.tippligaforum.TippligaSQLConnector;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.slf4j.Logger;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -13,7 +13,7 @@ import static de.jeyp91.googlecalendar.TippligaGoogleEventManager.*;
|
|||||||
|
|
||||||
public class TLWMatchdaysUpdater {
|
public class TLWMatchdaysUpdater {
|
||||||
|
|
||||||
private final Logger logger = LogManager.getLogger(TLWMatch.class);
|
private final Logger logger = LoggerFactory.getLogger(TLWMatch.class);
|
||||||
|
|
||||||
int season;
|
int season;
|
||||||
int league;
|
int league;
|
||||||
@@ -29,8 +29,7 @@ public class TLWMatchdaysUpdater {
|
|||||||
this.matchdaysOriginal = conn.getMatchdays(String.valueOf(season), String.valueOf(league));
|
this.matchdaysOriginal = conn.getMatchdays(String.valueOf(season), String.valueOf(league));
|
||||||
this.matchdaysOriginal.sort(Comparator.comparing(TLWMatchday::getMatchday));
|
this.matchdaysOriginal.sort(Comparator.comparing(TLWMatchday::getMatchday));
|
||||||
|
|
||||||
TLWMatchdaysCreator creator = new TLWMatchdaysCreator(season, league, configPath);
|
this.matchdaysUpdated = conn.getUpdatedMatchdaysBasedOnMatches(String.valueOf(season), String.valueOf(league));
|
||||||
this.matchdaysUpdated = creator.getMatchdays();
|
|
||||||
this.matchdaysUpdated.sort(Comparator.comparing(TLWMatchday::getMatchday));
|
this.matchdaysUpdated.sort(Comparator.comparing(TLWMatchday::getMatchday));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,6 +83,14 @@ public class TLWMatchdaysUpdater {
|
|||||||
"Tippabgabeschluss 2 zu '" + matchdayUpdated.getDeliveryDate2() + "'.\n";
|
"Tippabgabeschluss 2 zu '" + matchdayUpdated.getDeliveryDate2() + "'.\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!matchdayOriginal.getDeliveryDate3().equals(matchdayUpdated.getDeliveryDate3())) {
|
||||||
|
updateSql += updateStart +
|
||||||
|
"delivery_date_3 = '" + matchdayUpdated.getDeliveryDate3() + "' " +
|
||||||
|
condition;
|
||||||
|
this.beautifulInfo += beautifulInfoStart +
|
||||||
|
"Tippabgabeschluss 3 zu '" + matchdayUpdated.getDeliveryDate3() + "'.\n";
|
||||||
|
}
|
||||||
|
|
||||||
if (!matchdayOriginal.getMatchdayName().equals(matchdayUpdated.getMatchdayName())) {
|
if (!matchdayOriginal.getMatchdayName().equals(matchdayUpdated.getMatchdayName())) {
|
||||||
updateSql += updateStart +
|
updateSql += updateStart +
|
||||||
"matchday_name = '" + matchdayUpdated.getMatchdayName() + "' " +
|
"matchday_name = '" + matchdayUpdated.getMatchdayName() + "' " +
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ public abstract class TLWMatchesCreatorBase {
|
|||||||
|
|
||||||
// Add matches from config
|
// Add matches from config
|
||||||
for(TLWMatch match : tlwMatches) {
|
for(TLWMatch match : tlwMatches) {
|
||||||
sql += match.getSQLQueryInsert() + "\n";
|
sql += match.getSQLQueryReplace() + "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
return sql;
|
return sql;
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ public class TLWMatchesCreatorFootball extends TLWMatchesCreatorBase {
|
|||||||
|
|
||||||
this.season = season;
|
this.season = season;
|
||||||
this.league = league;
|
this.league = league;
|
||||||
this.conn = APIFootballConnector.getAPIFootballConnectorInstance(season - 1);
|
this.conn = APIFootballConnector.getAPIFootballConnectorInstance(season);
|
||||||
|
|
||||||
TippligaConfigProvider prov = new TippligaConfigProvider(season);
|
TippligaConfigProvider prov = new TippligaConfigProvider(season);
|
||||||
this.config = prov.getTippligaConfig(configFileName);
|
this.config = prov.getTippligaConfig(configFileName);
|
||||||
@@ -62,7 +62,7 @@ public class TLWMatchesCreatorFootball extends TLWMatchesCreatorBase {
|
|||||||
&& TLWMatchesManagerBase.getDaysDifference(firstDate, matchDateTime) >= 1) {
|
&& TLWMatchesManagerBase.getDaysDifference(firstDate, matchDateTime) >= 1) {
|
||||||
status = -1;
|
status = -1;
|
||||||
}
|
}
|
||||||
this.TLWMatches.add(new TLWMatch(match, this.season, this.league, TLWMatchday, matchNo, status, this.ko));
|
this.TLWMatches.add(new TLWMatch(match, this.season, this.league, TLWMatchday, matchNo, status, this.ko, true));
|
||||||
matchdayMatchCounter++;
|
matchdayMatchCounter++;
|
||||||
if(firstDate == null) {
|
if(firstDate == null) {
|
||||||
firstDate = matchDateTime;
|
firstDate = matchDateTime;
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ package de.jeyp91.tippliga;
|
|||||||
import de.jeyp91.ResourceProvider;
|
import de.jeyp91.ResourceProvider;
|
||||||
import de.jeyp91.StatusHolder;
|
import de.jeyp91.StatusHolder;
|
||||||
import de.jeyp91.tippligaforum.TippligaConfigProvider;
|
import de.jeyp91.tippligaforum.TippligaConfigProvider;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.slf4j.Logger;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.json.simple.JSONArray;
|
import org.json.simple.JSONArray;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
@@ -12,7 +12,7 @@ import java.util.ArrayList;
|
|||||||
|
|
||||||
public class TLWMatchesCreatorTipperLeague extends TLWMatchesCreatorBase {
|
public class TLWMatchesCreatorTipperLeague extends TLWMatchesCreatorBase {
|
||||||
|
|
||||||
private final Logger logger = LogManager.getLogger(TLWMatchesCreatorTipperLeague.class);
|
private final Logger logger = LoggerFactory.getLogger(TLWMatchesCreatorTipperLeague.class);
|
||||||
|
|
||||||
int season;
|
int season;
|
||||||
int league;
|
int league;
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ package de.jeyp91.tippliga;
|
|||||||
|
|
||||||
import de.jeyp91.ResourceProvider;
|
import de.jeyp91.ResourceProvider;
|
||||||
import de.jeyp91.tippligaforum.TippligaConfigProvider;
|
import de.jeyp91.tippligaforum.TippligaConfigProvider;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.slf4j.Logger;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.json.simple.JSONArray;
|
import org.json.simple.JSONArray;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
@@ -11,7 +11,7 @@ import java.util.ArrayList;
|
|||||||
|
|
||||||
public class TLWMatchesCreatorTipperPokal extends TLWMatchesCreatorBase{
|
public class TLWMatchesCreatorTipperPokal extends TLWMatchesCreatorBase{
|
||||||
|
|
||||||
Logger logger = LogManager.getLogger(TLWMatchesCreatorTipperPokal.class);
|
Logger logger = LoggerFactory.getLogger(TLWMatchesCreatorTipperPokal.class);
|
||||||
|
|
||||||
int season;
|
int season;
|
||||||
int league;
|
int league;
|
||||||
@@ -40,7 +40,7 @@ public class TLWMatchesCreatorTipperPokal extends TLWMatchesCreatorBase{
|
|||||||
|
|
||||||
int matchday = 1;
|
int matchday = 1;
|
||||||
|
|
||||||
for(int matchNo = 1; matchNo < 13; matchNo++) {
|
for(int matchNo = 1; matchNo <= this.tipperList.size() / 2; matchNo++) {
|
||||||
|
|
||||||
String homeName = this.tipperList.get(String.valueOf(2 * matchNo - 1)).toString();
|
String homeName = this.tipperList.get(String.valueOf(2 * matchNo - 1)).toString();
|
||||||
String guestName = this.tipperList.get(String.valueOf(2 * matchNo)).toString();
|
String guestName = this.tipperList.get(String.valueOf(2 * matchNo)).toString();
|
||||||
@@ -51,6 +51,7 @@ public class TLWMatchesCreatorTipperPokal extends TLWMatchesCreatorBase{
|
|||||||
String matchDatetime = getDeliveryDateForMatchday(matchday);
|
String matchDatetime = getDeliveryDateForMatchday(matchday);
|
||||||
|
|
||||||
TLWMatch tlwMatch = new TLWMatch(this.season, this.league, matchday, matchNo, teamIdHome, teamIdGuest, matchDatetime, 1);
|
TLWMatch tlwMatch = new TLWMatch(this.season, this.league, matchday, matchNo, teamIdHome, teamIdGuest, matchDatetime, 1);
|
||||||
|
tlwMatch.setShowTable(false);
|
||||||
this.TLWMatches.add(tlwMatch);
|
this.TLWMatches.add(tlwMatch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package de.jeyp91.tippliga;
|
package de.jeyp91.tippliga;
|
||||||
|
|
||||||
import de.jeyp91.apifootball.APIFootballMatch;
|
import de.jeyp91.apifootball.APIFootballMatch;
|
||||||
|
import de.jeyp91.teamidmatcher.TeamIDMatcher;
|
||||||
import de.jeyp91.tippligaforum.TippligaConfigProvider;
|
import de.jeyp91.tippligaforum.TippligaConfigProvider;
|
||||||
import org.json.simple.JSONArray;
|
import org.json.simple.JSONArray;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
@@ -15,8 +16,9 @@ public class TLWMatchesManagerBase {
|
|||||||
protected int season;
|
protected int season;
|
||||||
protected int league;
|
protected int league;
|
||||||
protected int numberOfMatchdays;
|
protected int numberOfMatchdays;
|
||||||
protected int matchesPerMatchday;
|
protected Integer matchesPerMatchday = null;
|
||||||
protected int ko;
|
protected int ko;
|
||||||
|
protected int betKOType;
|
||||||
|
|
||||||
protected JSONArray matchdayConfig;
|
protected JSONArray matchdayConfig;
|
||||||
|
|
||||||
@@ -25,8 +27,11 @@ public class TLWMatchesManagerBase {
|
|||||||
TippligaConfigProvider prov = new TippligaConfigProvider(this.season);
|
TippligaConfigProvider prov = new TippligaConfigProvider(this.season);
|
||||||
JSONObject config = prov.getTippligaConfig(configFileName);
|
JSONObject config = prov.getTippligaConfig(configFileName);
|
||||||
this.numberOfMatchdays = ((Long) config.get("numberOfMatchdays")).intValue();
|
this.numberOfMatchdays = ((Long) config.get("numberOfMatchdays")).intValue();
|
||||||
|
try { this.matchesPerMatchday = ((Long) config.get("matchesPerMatchday")).intValue(); } catch (Exception ignored) {}
|
||||||
this.matchdayConfig = (JSONArray) config.get("matchdayConfig");
|
this.matchdayConfig = (JSONArray) config.get("matchdayConfig");
|
||||||
this.ko = ((Long) config.get("ko")).intValue();
|
this.ko = ((Long) config.get("ko")).intValue();
|
||||||
|
Long parsedBetKOType = (Long) config.get("betKOType");
|
||||||
|
this.betKOType = parsedBetKOType == null ? 1 : parsedBetKOType.intValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ArrayList<TLWMatch> getMatchesStartingFromSecondDay(ArrayList<TLWMatch> matches) {
|
public static ArrayList<TLWMatch> getMatchesStartingFromSecondDay(ArrayList<TLWMatch> matches) {
|
||||||
@@ -41,6 +46,18 @@ public class TLWMatchesManagerBase {
|
|||||||
return filteredMatches;
|
return filteredMatches;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ArrayList<TLWMatch> getMatchesStartingFromSecondWeek(ArrayList<TLWMatch> matches) {
|
||||||
|
LocalDateTime firstMatchtime = getFirstMatchtimeTLW(matches);
|
||||||
|
ArrayList<TLWMatch> filteredMatches = new ArrayList<>();
|
||||||
|
for(TLWMatch match : matches) {
|
||||||
|
LocalDateTime matchDateTime = getDate(match);
|
||||||
|
if(getDaysDifference(matchDateTime, firstMatchtime) > 6) {
|
||||||
|
filteredMatches.add(match);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return filteredMatches;
|
||||||
|
}
|
||||||
|
|
||||||
public static LocalDateTime getFirstMatchtimeTLW(ArrayList<TLWMatch> matches) {
|
public static LocalDateTime getFirstMatchtimeTLW(ArrayList<TLWMatch> matches) {
|
||||||
LocalDateTime matchtime = null;
|
LocalDateTime matchtime = null;
|
||||||
for(TLWMatch match : matches) {
|
for(TLWMatch match : matches) {
|
||||||
@@ -88,4 +105,26 @@ public class TLWMatchesManagerBase {
|
|||||||
date2 = date2.toLocalDate().atTime(0, 0, 0);
|
date2 = date2.toLocalDate().atTime(0, 0, 0);
|
||||||
return (int) date1.until(date2, ChronoUnit.DAYS);
|
return (int) date1.until(date2, ChronoUnit.DAYS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected TLWMatch getMatchingMatch(APIFootballMatch apiFootballMatch, ArrayList<TLWMatch> tlwMatches) {
|
||||||
|
TLWMatch matchingMatch = null;
|
||||||
|
for(TLWMatch match : tlwMatches) {
|
||||||
|
Integer apiTeamIdHome = TeamIDMatcher.getTippligaIdFromApiFootballId(apiFootballMatch, TeamIDMatcher.HOME);
|
||||||
|
Integer apiTeamIdGuest = TeamIDMatcher.getTippligaIdFromApiFootballId(apiFootballMatch, TeamIDMatcher.GUEST);
|
||||||
|
int tlwTeamIdHome = match.getTeamIdHome();
|
||||||
|
int tlwTeamIdGuest = match.getTeamIdGuest();
|
||||||
|
|
||||||
|
if(apiTeamIdHome == null
|
||||||
|
|| apiTeamIdGuest == null) {
|
||||||
|
throw new NullPointerException();
|
||||||
|
}
|
||||||
|
if(
|
||||||
|
apiTeamIdHome.equals(tlwTeamIdHome)
|
||||||
|
&& apiTeamIdGuest.equals(tlwTeamIdGuest)
|
||||||
|
) {
|
||||||
|
matchingMatch = match;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return matchingMatch;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,176 @@
|
|||||||
|
package de.jeyp91.tippliga;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import de.jeyp91.apifootball.APIFootballMatch;
|
||||||
|
import de.jeyp91.apifootball.APIFootballMatchesProvider;
|
||||||
|
import de.jeyp91.teamidmatcher.TeamIDMatcher;
|
||||||
|
import de.jeyp91.tippligaforum.TippligaSQLConnector;
|
||||||
|
import de.jeyp91.tippligaforum.TippligaWebsiteConnector;
|
||||||
|
|
||||||
|
public class TLWMatchesResultsUpdater extends TLWMatchesManagerBase {
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(TLWMatchesResultsUpdater.class);
|
||||||
|
|
||||||
|
|
||||||
|
ArrayList<ArrayList<TLWMatch>> tlwMatchesUpdated = new ArrayList<>();
|
||||||
|
|
||||||
|
String beautifulInfo = "";
|
||||||
|
|
||||||
|
public TLWMatchesResultsUpdater(int season, int league, String configFileName) {
|
||||||
|
this.season = season;
|
||||||
|
this.league = league;
|
||||||
|
|
||||||
|
super.initConfigParamsFromFile(configFileName);
|
||||||
|
initUpdates();
|
||||||
|
applyUpdates();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initUpdates() {
|
||||||
|
|
||||||
|
APIFootballMatchesProvider apiFootballMatchesProvider = new APIFootballMatchesProvider(this.season);
|
||||||
|
TippligaSQLConnector tippligaSQLConnector = TippligaSQLConnector.getInstance();
|
||||||
|
for (Object singleMatchdayConfig : this.matchdayConfig) {
|
||||||
|
int tlwMatchday = ((Long) ((JSONObject) singleMatchdayConfig).get("TLWMatchday")).intValue();
|
||||||
|
|
||||||
|
ArrayList<APIFootballMatch> apiFootballMatches = apiFootballMatchesProvider.getAPIFootballMatchesFromConfig((JSONObject) singleMatchdayConfig);
|
||||||
|
|
||||||
|
ArrayList<TLWMatch> tlwMatchesOriginalMatchday = tippligaSQLConnector.getMatches(String.valueOf(this.season), String.valueOf(this.league), String.valueOf(tlwMatchday));
|
||||||
|
ArrayList<TLWMatch> tlwMatchesUpdatedMatchday = new ArrayList<>();
|
||||||
|
for (TLWMatch match : tlwMatchesOriginalMatchday) {
|
||||||
|
tlwMatchesUpdatedMatchday.add(new TLWMatch(match));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (apiFootballMatches.size() > tlwMatchesOriginalMatchday.size()) {
|
||||||
|
logger.error("Not matching config!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!apiFootballMatches.isEmpty()) {
|
||||||
|
updateResults(tlwMatchesUpdatedMatchday, apiFootballMatches);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateBeautifulInfo(tlwMatchesOriginalMatchday, tlwMatchesUpdatedMatchday);
|
||||||
|
tlwMatchesUpdatedMatchday.removeIf(tlwMatch -> tlwMatch.getUpdateStatus() != TLWMatch.COMPARISON.DIFFERENT_RESULT);
|
||||||
|
if(!tlwMatchesUpdatedMatchday.isEmpty()) this.tlwMatchesUpdated.add(tlwMatchesUpdatedMatchday);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void applyUpdates() {
|
||||||
|
TippligaWebsiteConnector con;
|
||||||
|
try {
|
||||||
|
con = new TippligaWebsiteConnector();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
this.tlwMatchesUpdated.forEach(tlwMatches -> {
|
||||||
|
con.updateResultsAdmin(this.season, this.league, tlwMatches.get(0).getMatchday(), tlwMatches);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateResults(
|
||||||
|
ArrayList<TLWMatch> tlwMatchesUpdated,
|
||||||
|
ArrayList<APIFootballMatch> apiFootballMatches)
|
||||||
|
{
|
||||||
|
ArrayList<TLWMatch> tlwMatchesCopy = new ArrayList<>(tlwMatchesUpdated);
|
||||||
|
for(APIFootballMatch apiFootballMatch : apiFootballMatches) {
|
||||||
|
try {
|
||||||
|
TLWMatch tlwMatch = getMatchingMatch(apiFootballMatch, tlwMatchesCopy);
|
||||||
|
tlwMatchesCopy.remove(tlwMatch);
|
||||||
|
if(Objects.equals(apiFootballMatch.getStatus(), TLWMatch.STATUS_FINISHED)) {
|
||||||
|
if(!Objects.equals(tlwMatch.getGoalsHome(), apiFootballMatch.getGoalsHome())
|
||||||
|
|| !Objects.equals(tlwMatch.getGoalsGuest(), apiFootballMatch.getGoalsGuest())
|
||||||
|
) {
|
||||||
|
tlwMatch.setGoalsHome(apiFootballMatch.getGoalsHome());
|
||||||
|
tlwMatch.setGoalsGuest(apiFootballMatch.getGoalsGuest());
|
||||||
|
tlwMatch.setUpdateStatus(TLWMatch.COMPARISON.DIFFERENT_RESULT);
|
||||||
|
}
|
||||||
|
if(tlwMatch.getKoMatch() &&
|
||||||
|
this.betKOType == 2 &&
|
||||||
|
(!Objects.equals(tlwMatch.getGoalsOvertimeHome(), apiFootballMatch.getGoalsOvertimeHome())
|
||||||
|
|| !Objects.equals(tlwMatch.getGoalsOvertimeGuest(), apiFootballMatch.getGoalsOvertimeGuest()))
|
||||||
|
) {
|
||||||
|
tlwMatch.setGoalsOvertimeHome(apiFootballMatch.getGoalsOvertimeHome());
|
||||||
|
tlwMatch.setGoalsOvertimeGuest(apiFootballMatch.getGoalsOvertimeGuest());
|
||||||
|
tlwMatch.setUpdateStatus(TLWMatch.COMPARISON.DIFFERENT_RESULT);
|
||||||
|
}
|
||||||
|
if(tlwMatch.getKoMatch() &&
|
||||||
|
(this.betKOType == 1 || this.betKOType == 3) &&
|
||||||
|
(apiFootballMatch.getGoalsPenaltyHome() != null) &&
|
||||||
|
(!Objects.equals(tlwMatch.getGoalsOvertimeHome(), apiFootballMatch.getGoalsPenaltyHome())
|
||||||
|
|| !Objects.equals(tlwMatch.getGoalsOvertimeGuest(), apiFootballMatch.getGoalsPenaltyGuest()))
|
||||||
|
) {
|
||||||
|
tlwMatch.setGoalsOvertimeHome(apiFootballMatch.getGoalsPenaltyHome());
|
||||||
|
tlwMatch.setGoalsOvertimeGuest(apiFootballMatch.getGoalsPenaltyGuest());
|
||||||
|
tlwMatch.setUpdateStatus(TLWMatch.COMPARISON.DIFFERENT_RESULT);
|
||||||
|
}
|
||||||
|
if(tlwMatch.getKoMatch() &&
|
||||||
|
(this.betKOType == 1 || this.betKOType == 3) &&
|
||||||
|
(apiFootballMatch.getGoalsPenaltyHome() == null) &&
|
||||||
|
(!Objects.equals(tlwMatch.getGoalsOvertimeHome(), apiFootballMatch.getGoalsOvertimeHome())
|
||||||
|
|| !Objects.equals(tlwMatch.getGoalsOvertimeGuest(), apiFootballMatch.getGoalsOvertimeGuest()))
|
||||||
|
) {
|
||||||
|
tlwMatch.setGoalsOvertimeHome(apiFootballMatch.getGoalsOvertimeHome());
|
||||||
|
tlwMatch.setGoalsOvertimeGuest(apiFootballMatch.getGoalsOvertimeGuest());
|
||||||
|
tlwMatch.setUpdateStatus(TLWMatch.COMPARISON.DIFFERENT_RESULT);
|
||||||
|
}
|
||||||
|
if(Objects.equals(tlwMatch.getStatus(), TLWMatch.STATUS_PROVISIONAL_RESULT_AVAILABLE)) {
|
||||||
|
tlwMatch.setUpdateStatus(TLWMatch.COMPARISON.DIFFERENT_RESULT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (NullPointerException ignored) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateBeautifulInfo(ArrayList<TLWMatch> matchesOriginal, ArrayList<TLWMatch> matchesUpdated) {
|
||||||
|
for (int i = 0; i < matchesOriginal.size(); i++) {
|
||||||
|
if(matchesUpdated.get(i).getUpdateStatus() != TLWMatch.COMPARISON.DIFFERENT_RESULT) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
updateBeautifulInfo(matchesOriginal.get(i), matchesUpdated.get(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateBeautifulInfo(TLWMatch matchOriginal, TLWMatch matchUpdated) {
|
||||||
|
String beautifulInfoStart = "Aktualisiere Saison " + matchOriginal.getSeason() + ", " +
|
||||||
|
"Liga " + matchOriginal.getLeague() + ", " +
|
||||||
|
"Spieltag " + matchOriginal.getMatchday() + ", " +
|
||||||
|
"Spielnummer " + matchOriginal.getMatchNo() + ", " +
|
||||||
|
"Spiel '" + TeamIDMatcher.getTeamNameFromTippligaId(matchOriginal.getTeamIdHome()) + "' - '" + TeamIDMatcher.getTeamNameFromTippligaId(matchOriginal.getTeamIdGuest()) + "', ";
|
||||||
|
|
||||||
|
if(!Objects.equals(matchOriginal.getGoalsHome(), matchUpdated.getGoalsHome())
|
||||||
|
|| !Objects.equals(matchOriginal.getGoalsGuest(), matchUpdated.getGoalsGuest())) {
|
||||||
|
this.beautifulInfo += beautifulInfoStart +
|
||||||
|
"Ergebnis zu '" + matchUpdated.getGoalsHome() + ":" + matchUpdated.getGoalsGuest() + "'.\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(matchOriginal.getKoMatch() && (!Objects.equals(matchOriginal.getGoalsOvertimeHome(), matchUpdated.getGoalsOvertimeHome())
|
||||||
|
|| !Objects.equals(matchOriginal.getGoalsOvertimeGuest(), matchUpdated.getGoalsOvertimeGuest()))) {
|
||||||
|
this.beautifulInfo += beautifulInfoStart +
|
||||||
|
"Ergebnis Nachspielzeit zu '" + matchUpdated.getGoalsOvertimeHome() + ":" + matchUpdated.getGoalsOvertimeGuest() + "'.\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(matchOriginal.getStatus().equals(TLWMatch.STATUS_PROVISIONAL_RESULT_AVAILABLE)
|
||||||
|
&& Objects.equals(matchOriginal.getGoalsHome(), matchUpdated.getGoalsHome())
|
||||||
|
&& Objects.equals(matchOriginal.getGoalsGuest(), matchUpdated.getGoalsGuest())
|
||||||
|
&& (!matchOriginal.getKoMatch() || (
|
||||||
|
matchOriginal.getKoMatch()
|
||||||
|
&& Objects.equals(matchOriginal.getGoalsOvertimeHome(), matchUpdated.getGoalsOvertimeHome())
|
||||||
|
&& Objects.equals(matchOriginal.getGoalsOvertimeGuest(), matchUpdated.getGoalsOvertimeGuest())
|
||||||
|
))
|
||||||
|
) {
|
||||||
|
this.beautifulInfo += beautifulInfoStart +
|
||||||
|
"Ergebnis gespeichert.\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBeautifulInfo() {
|
||||||
|
return this.beautifulInfo;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,20 +1,23 @@
|
|||||||
package de.jeyp91.tippliga;
|
package de.jeyp91.tippliga;
|
||||||
|
|
||||||
import de.jeyp91.StatusHolder;
|
import java.time.LocalDateTime;
|
||||||
import de.jeyp91.teamidmatcher.TeamIDMatcher;
|
import java.util.ArrayList;
|
||||||
import de.jeyp91.apifootball.APIFootballMatch;
|
import java.util.Iterator;
|
||||||
import de.jeyp91.apifootball.APIFootballMatchesProvider;
|
import java.util.Objects;
|
||||||
import de.jeyp91.tippligaforum.TippligaSQLConnector;
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
import org.json.simple.JSONArray;
|
import org.json.simple.JSONArray;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.time.*;
|
import de.jeyp91.StatusHolder;
|
||||||
import java.util.ArrayList;
|
import de.jeyp91.apifootball.APIFootballMatch;
|
||||||
|
import de.jeyp91.apifootball.APIFootballMatchesProvider;
|
||||||
|
import de.jeyp91.teamidmatcher.TeamIDMatcher;
|
||||||
|
import de.jeyp91.tippligaforum.TippligaSQLConnector;
|
||||||
|
|
||||||
public class TLWMatchesUpdaterFootball extends TLWMatchesManagerBase {
|
public class TLWMatchesUpdaterFootball extends TLWMatchesManagerBase {
|
||||||
private static final Logger logger = LogManager.getLogger(TLWMatchesUpdaterFootball.class);
|
private static final Logger logger = LoggerFactory.getLogger(TLWMatchesUpdaterFootball.class);
|
||||||
|
|
||||||
ArrayList<TLWMatch> tlwMatchesOriginal;
|
ArrayList<TLWMatch> tlwMatchesOriginal;
|
||||||
ArrayList<TLWMatch> tlwMatchesUpdated;
|
ArrayList<TLWMatch> tlwMatchesUpdated;
|
||||||
@@ -38,9 +41,8 @@ public class TLWMatchesUpdaterFootball extends TLWMatchesManagerBase {
|
|||||||
TippligaSQLConnector tippligaSQLConnector = TippligaSQLConnector.getInstance();
|
TippligaSQLConnector tippligaSQLConnector = TippligaSQLConnector.getInstance();
|
||||||
for (Object singleMatchdayConfig : this.matchdayConfig) {
|
for (Object singleMatchdayConfig : this.matchdayConfig) {
|
||||||
int tlwMatchday = ((Long) ((JSONObject) singleMatchdayConfig).get("TLWMatchday")).intValue();
|
int tlwMatchday = ((Long) ((JSONObject) singleMatchdayConfig).get("TLWMatchday")).intValue();
|
||||||
JSONArray matchesConfig = (JSONArray) ((JSONObject) singleMatchdayConfig).get("matchesConfig");
|
|
||||||
|
|
||||||
ArrayList<APIFootballMatch> apiFootballMatches = apiFootballMatchesProvider.getAPIFootballMatchesFromConfig(matchesConfig);
|
ArrayList<APIFootballMatch> apiFootballMatches = apiFootballMatchesProvider.getAPIFootballMatchesFromConfig((JSONObject) singleMatchdayConfig);
|
||||||
|
|
||||||
ArrayList<TLWMatch> tlwMatchesOriginalMatchday = tippligaSQLConnector.getMatches(String.valueOf(this.season), String.valueOf(this.league), String.valueOf(tlwMatchday));
|
ArrayList<TLWMatch> tlwMatchesOriginalMatchday = tippligaSQLConnector.getMatches(String.valueOf(this.season), String.valueOf(this.league), String.valueOf(tlwMatchday));
|
||||||
ArrayList<TLWMatch> tlwMatchesUpdatedMatchday = new ArrayList<>();
|
ArrayList<TLWMatch> tlwMatchesUpdatedMatchday = new ArrayList<>();
|
||||||
@@ -64,6 +66,10 @@ public class TLWMatchesUpdaterFootball extends TLWMatchesManagerBase {
|
|||||||
updateShowTable(tlwMatchesUpdatedMatchday, apiFootballMatches);
|
updateShowTable(tlwMatchesUpdatedMatchday, apiFootballMatches);
|
||||||
updateStatus(tlwMatchesUpdatedMatchday);
|
updateStatus(tlwMatchesUpdatedMatchday);
|
||||||
}
|
}
|
||||||
|
if(now.isBefore(firstMatchOriginal)) {
|
||||||
|
updateStatus(tlwMatchesUpdatedMatchday);
|
||||||
|
addPlaceholderMatches(tlwMatchesUpdatedMatchday, (JSONObject) singleMatchdayConfig);
|
||||||
|
}
|
||||||
|
|
||||||
this.tlwMatchesOriginal.addAll(tlwMatchesOriginalMatchday);
|
this.tlwMatchesOriginal.addAll(tlwMatchesOriginalMatchday);
|
||||||
this.tlwMatchesUpdated.addAll(tlwMatchesUpdatedMatchday);
|
this.tlwMatchesUpdated.addAll(tlwMatchesUpdatedMatchday);
|
||||||
@@ -135,6 +141,14 @@ public class TLWMatchesUpdaterFootball extends TLWMatchesManagerBase {
|
|||||||
"Spiel in Tabelle einberechnen zu '" + (matchUpdated.getShowTable() == 1 ? "falsch" : "wahr") + "'.\n";
|
"Spiel in Tabelle einberechnen zu '" + (matchUpdated.getShowTable() == 1 ? "falsch" : "wahr") + "'.\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!matchOriginal.getKoMatch().equals(matchUpdated.getKoMatch())) {
|
||||||
|
updateString += updateStart +
|
||||||
|
"ko_match = '" + (matchUpdated.getKoMatch() ? "1" : "0") + "' " +
|
||||||
|
condition;
|
||||||
|
this.beautifulInfo += beautifulInfoStart +
|
||||||
|
"KO zu '" + (matchUpdated.getKoMatch() ? "wahr" : "falsch") + "'.\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return updateString;
|
return updateString;
|
||||||
}
|
}
|
||||||
@@ -143,32 +157,98 @@ public class TLWMatchesUpdaterFootball extends TLWMatchesManagerBase {
|
|||||||
ArrayList<APIFootballMatch> apiFootballMatches) {
|
ArrayList<APIFootballMatch> apiFootballMatches) {
|
||||||
|
|
||||||
ArrayList<APIFootballMatch> missingMatches = new ArrayList<>();
|
ArrayList<APIFootballMatch> missingMatches = new ArrayList<>();
|
||||||
|
if(!validateApiFootballTeamIds(apiFootballMatches)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for(APIFootballMatch apiFootballMatch : apiFootballMatches) {
|
for(APIFootballMatch apiFootballMatch : apiFootballMatches) {
|
||||||
try {
|
if(getMatchingMatch(apiFootballMatch, tlwMatches) == null) {
|
||||||
if(getMatchingMatch(apiFootballMatch, tlwMatches) == null) {
|
missingMatches.add(apiFootballMatch);
|
||||||
missingMatches.add(apiFootballMatch);
|
|
||||||
}
|
|
||||||
} catch (NullPointerException ignored) {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (APIFootballMatch missingMatch : missingMatches) {
|
for (APIFootballMatch missingMatch : missingMatches) {
|
||||||
|
Integer missingTeamIdHome = TeamIDMatcher.getTippligaIdFromApiFootballId(missingMatch, TeamIDMatcher.HOME);
|
||||||
|
Integer missingTeamIdGuest = TeamIDMatcher.getTippligaIdFromApiFootballId(missingMatch, TeamIDMatcher.GUEST);
|
||||||
boolean done = false;
|
boolean done = false;
|
||||||
for(TLWMatch tlwMatch : tlwMatches) {
|
// update placeholder match based on matching match datetime
|
||||||
if(tlwMatch.getTeamIdHome() == 0 && tlwMatch.getTeamIdGuest() == 0) {
|
for (TLWMatch tlwMatch : tlwMatches) {
|
||||||
|
Boolean homeMatches = tlwMatch.getTeamIdHome() == 0 || tlwMatch.getTeamIdHome().equals(missingTeamIdHome);
|
||||||
|
Boolean guestMatches =tlwMatch.getTeamIdGuest() == 0 || tlwMatch.getTeamIdGuest().equals(missingTeamIdGuest);
|
||||||
|
Boolean timeMatches = Objects.equals(tlwMatch.getMatchDateTime(), missingMatch.getMatchDateTime().replace("T", " ").substring(0, 19));
|
||||||
|
Boolean formulaHomeMatches = !Objects.equals(tlwMatch.getFormulaHome(), "");
|
||||||
|
Boolean formulaGuestMatches = !Objects.equals(tlwMatch.getFormulaGuest(), "");
|
||||||
|
if (
|
||||||
|
homeMatches
|
||||||
|
&& guestMatches
|
||||||
|
&& timeMatches
|
||||||
|
&& formulaHomeMatches
|
||||||
|
&& formulaGuestMatches
|
||||||
|
) {
|
||||||
tlwMatch.updateMatch(missingMatch);
|
tlwMatch.updateMatch(missingMatch);
|
||||||
done = true;
|
done = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// update empty match
|
||||||
|
if(!done) {
|
||||||
|
for (TLWMatch tlwMatch : tlwMatches) {
|
||||||
|
if (tlwMatch.getTeamIdHome() == 0 && tlwMatch.getTeamIdGuest() == 0
|
||||||
|
&& (Objects.equals(tlwMatch.getFormulaHome(), "") || Objects.equals(tlwMatch.getFormulaHome(), "D"))
|
||||||
|
&& (Objects.equals(tlwMatch.getFormulaGuest(), "") || Objects.equals(tlwMatch.getFormulaGuest(), "D"))
|
||||||
|
) {
|
||||||
|
tlwMatch.updateMatch(missingMatch);
|
||||||
|
done = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if(!done) {
|
if(!done) {
|
||||||
logger.error("Could not add missing match: " + this.season + ", " + this.league + ", " + tlwMatches.get(0).getMatchday() + ", " + missingMatch.getTeamNameHome() + " - " + missingMatch.getTeamNameGuest());
|
logger.error("Could not add missing match: " + this.season + ", " + this.league + ", " + tlwMatches.get(0).getMatchday() + ", " + missingMatch.getTeamNameHome() + " - " + missingMatch.getTeamNameGuest());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addPlaceholderMatches(ArrayList<TLWMatch> tlwMatches,
|
||||||
|
JSONObject matchdayConfig) {
|
||||||
|
Integer numberOfMatches = this.matchesPerMatchday;
|
||||||
|
try { numberOfMatches = ((Long) matchdayConfig.get("numberOfMatches")).intValue();} catch (Exception ignored) {}
|
||||||
|
ArrayList<TLWMatch> placeholderMatches = new ArrayList<>();
|
||||||
|
ArrayList<TLWMatch> tlwMatchesCopy = new ArrayList<>(tlwMatches);
|
||||||
|
JSONArray matchesConfig = (JSONArray) matchdayConfig.get("matchesConfig");
|
||||||
|
for (Object singleMatchConfig : matchesConfig) {
|
||||||
|
// check if type placeholderSingleMatch
|
||||||
|
if(((JSONObject) singleMatchConfig).get("type").equals("PlaceholderSingleMatch")) {
|
||||||
|
String formulaHome = (String) ((JSONObject) singleMatchConfig).get("formulaHome");
|
||||||
|
String formulaGuest = (String) ((JSONObject) singleMatchConfig).get("formulaGuest");
|
||||||
|
String matchDateTime = (String) ((JSONObject) singleMatchConfig).get("placeholderDatetime");
|
||||||
|
TLWMatch placeholderMatch = new TLWMatch(formulaHome, formulaGuest, matchDateTime);
|
||||||
|
placeholderMatches.add(placeholderMatch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// filter placeholderMatches by checking if they are already in tlwMatches
|
||||||
|
Iterator<TLWMatch> placeholderIterator = placeholderMatches.iterator();
|
||||||
|
while (placeholderIterator.hasNext()) {
|
||||||
|
TLWMatch placeholderMatch = placeholderIterator.next();
|
||||||
|
Iterator<TLWMatch> tlwMatchIterator = tlwMatchesCopy.iterator();
|
||||||
|
while (tlwMatchIterator.hasNext()) {
|
||||||
|
TLWMatch tlwMatch = tlwMatchIterator.next();
|
||||||
|
if (TLWMatch.isSameMatchPlaceholder(tlwMatch, placeholderMatch)) {
|
||||||
|
tlwMatchIterator.remove();
|
||||||
|
placeholderIterator.remove();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// check if total number of matches is not too high
|
||||||
|
if(tlwMatches.size() + placeholderMatches.size() > (numberOfMatches)) {
|
||||||
|
logger.error("Too many matches in config: " + this.season + ", " + this.league + ", " + tlwMatches.get(0).getMatchday());
|
||||||
|
} else {
|
||||||
|
// add placeholderMatches to tlwMatches
|
||||||
|
tlwMatches.addAll(placeholderMatches);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void updateMatchDateTimes(
|
private void updateMatchDateTimes(
|
||||||
ArrayList<TLWMatch> tlwMatches,
|
ArrayList<TLWMatch> tlwMatches,
|
||||||
ArrayList<APIFootballMatch> apiFootballMatches)
|
ArrayList<APIFootballMatch> apiFootballMatches)
|
||||||
@@ -195,10 +275,13 @@ public class TLWMatchesUpdaterFootball extends TLWMatchesManagerBase {
|
|||||||
if(earliestDate.isAfter(now)) {
|
if(earliestDate.isAfter(now)) {
|
||||||
for(TLWMatch match : matches) {
|
for(TLWMatch match : matches) {
|
||||||
LocalDateTime date = TLWMatchesManagerBase.getDate(match);
|
LocalDateTime date = TLWMatchesManagerBase.getDate(match);
|
||||||
if (getDaysDifference(earliestDate, date) == 0) {
|
int daysDifference = TLWMatchesManagerBase.getDaysDifference(earliestDate, date);
|
||||||
|
if (daysDifference == 0) {
|
||||||
match.setStatus(0);
|
match.setStatus(0);
|
||||||
} else {
|
} else if (daysDifference > 0 && daysDifference < 7) {
|
||||||
match.setStatus(-1);
|
match.setStatus(-1);
|
||||||
|
} else {
|
||||||
|
match.setStatus(-2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -212,36 +295,31 @@ public class TLWMatchesUpdaterFootball extends TLWMatchesManagerBase {
|
|||||||
for(APIFootballMatch apiFootballMatch : apiFootballMatches) {
|
for(APIFootballMatch apiFootballMatch : apiFootballMatches) {
|
||||||
try {
|
try {
|
||||||
TLWMatch tlwMatch = getMatchingMatch(apiFootballMatch, tlwMatchesCopy);
|
TLWMatch tlwMatch = getMatchingMatch(apiFootballMatch, tlwMatchesCopy);
|
||||||
|
if(tlwMatch.getTeamIdHome() == 4) {
|
||||||
|
int debug = 1;
|
||||||
|
}
|
||||||
tlwMatchesCopy.remove(tlwMatch);
|
tlwMatchesCopy.remove(tlwMatch);
|
||||||
tlwMatch.setShowTable(apiFootballMatch.getShowTable());
|
tlwMatch.setShowTable(apiFootballMatch.getShowTable() == 0);
|
||||||
} catch (NullPointerException ignored) {
|
} catch (NullPointerException ignored) {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private TLWMatch getMatchingMatch(APIFootballMatch apiFootballMatch, ArrayList<TLWMatch> tlwMatches) throws NullPointerException{
|
private void updateKo(
|
||||||
int foundMatches = 0;
|
ArrayList<TLWMatch> tlwMatches,
|
||||||
TLWMatch matchingMatch = null;
|
ArrayList<APIFootballMatch> apiFootballMatches)
|
||||||
for(TLWMatch match : tlwMatches) {
|
{
|
||||||
Integer apiTeamIdHome = TeamIDMatcher.getTippligaIdFromApiFootballId(apiFootballMatch, TeamIDMatcher.HOME);
|
ArrayList<TLWMatch> tlwMatchesCopy = new ArrayList<>(tlwMatches);
|
||||||
Integer apiTeamIdGuest = TeamIDMatcher.getTippligaIdFromApiFootballId(apiFootballMatch, TeamIDMatcher.GUEST);
|
for(APIFootballMatch apiFootballMatch : apiFootballMatches) {
|
||||||
int tlwTeamIdHome = match.getTeamIdHome();
|
try {
|
||||||
int tlwTeamIdGuest = match.getTeamIdGuest();
|
TLWMatch tlwMatch = getMatchingMatch(apiFootballMatch, tlwMatchesCopy);
|
||||||
|
tlwMatchesCopy.remove(tlwMatch);
|
||||||
|
tlwMatch.setKoMatch(apiFootballMatch.getKoMatch());
|
||||||
|
} catch (NullPointerException ignored) {
|
||||||
|
|
||||||
if(apiTeamIdHome == null
|
|
||||||
|| apiTeamIdGuest == null) {
|
|
||||||
throw new NullPointerException();
|
|
||||||
}
|
|
||||||
if(
|
|
||||||
apiTeamIdHome.equals(tlwTeamIdHome)
|
|
||||||
&& apiTeamIdGuest.equals(tlwTeamIdGuest)
|
|
||||||
) {
|
|
||||||
foundMatches++;
|
|
||||||
matchingMatch = match;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return matchingMatch;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<TLWMatch> getTLWMatchesUpdated() {
|
public ArrayList<TLWMatch> getTLWMatchesUpdated() {
|
||||||
@@ -251,4 +329,20 @@ public class TLWMatchesUpdaterFootball extends TLWMatchesManagerBase {
|
|||||||
public String getBeautifulInfo() {
|
public String getBeautifulInfo() {
|
||||||
return this.beautifulInfo;
|
return this.beautifulInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean validateApiFootballTeamIds(ArrayList<APIFootballMatch> apiFootballMatches) {
|
||||||
|
|
||||||
|
int missing = 0;
|
||||||
|
|
||||||
|
for(APIFootballMatch apiFootballMatch : apiFootballMatches) {
|
||||||
|
if(TeamIDMatcher.getTippligaIdFromApiFootballId(apiFootballMatch, TeamIDMatcher.HOME) == null) {
|
||||||
|
missing++;
|
||||||
|
}
|
||||||
|
if(TeamIDMatcher.getTippligaIdFromApiFootballId(apiFootballMatch, TeamIDMatcher.GUEST) == null) {
|
||||||
|
missing++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return missing == 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
package de.jeyp91.tippliga;
|
package de.jeyp91.tippliga;
|
||||||
|
|
||||||
import de.jeyp91.tippligaforum.TippligaSQLConnector;
|
import de.jeyp91.tippligaforum.TippligaSQLConnector;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class TLWTeamsCreator {
|
public class TLWTeamsCreator {
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(TLWTeamsCreator.class);
|
||||||
int season;
|
int season;
|
||||||
int league;
|
int league;
|
||||||
ArrayList<TLWMatch> matches;
|
ArrayList<TLWMatch> matches;
|
||||||
@@ -36,6 +40,10 @@ public class TLWTeamsCreator {
|
|||||||
String sql = "";
|
String sql = "";
|
||||||
for (Integer id : teamIds) {
|
for (Integer id : teamIds) {
|
||||||
ArrayList<TLWTeam> teams = connector.getTeams(String.valueOf(id));
|
ArrayList<TLWTeam> teams = connector.getTeams(String.valueOf(id));
|
||||||
|
if(teams.size() == 0) {
|
||||||
|
this.logger.error("Did not find team id " + id.toString());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
String teamName = teams.get(0).getTeamName();
|
String teamName = teams.get(0).getTeamName();
|
||||||
String teamNameShort = teams.get(0).getTeamNameShort();
|
String teamNameShort = teams.get(0).getTeamNameShort();
|
||||||
String teamSymbol = teams.get(0).getTeamSymbol();
|
String teamSymbol = teams.get(0).getTeamSymbol();
|
||||||
|
|||||||
@@ -1,22 +1,35 @@
|
|||||||
package de.jeyp91.tippligaforum;
|
package de.jeyp91.tippligaforum;
|
||||||
|
|
||||||
import com.google.gson.*;
|
|
||||||
import de.jeyp91.S3Provider;
|
|
||||||
import de.jeyp91.apifootball.APIFootballMatch;
|
|
||||||
import org.json.simple.JSONArray;
|
import org.json.simple.JSONArray;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonParser;
|
||||||
|
|
||||||
|
import de.jeyp91.S3Provider;
|
||||||
|
import de.jeyp91.apifootball.APIFootballMatch;
|
||||||
|
|
||||||
public class MatchesListCreator {
|
public class MatchesListCreator {
|
||||||
|
|
||||||
private final JSONObject mainObject = new JSONObject();
|
private final JSONObject mainObject = new JSONObject();
|
||||||
private final String country;
|
private String country;
|
||||||
private final String leagueName;
|
private String leagueName;
|
||||||
|
private final int season;
|
||||||
|
|
||||||
public MatchesListCreator(int league) {
|
public MatchesListCreator(int season, int league) {
|
||||||
|
this.season = season;
|
||||||
S3Provider prov = new S3Provider();
|
S3Provider prov = new S3Provider();
|
||||||
JSONObject leagueConfig = prov.getFixturesJSONFromS3(league);
|
JSONObject leagueConfig = prov.getFixturesJSONFromS3(season, league);
|
||||||
JSONObject api = (JSONObject) leagueConfig.get("api");
|
if (leagueConfig == null) {
|
||||||
JSONArray matchesAPIFootball = (JSONArray) api.get("fixtures");
|
return;
|
||||||
|
}
|
||||||
|
JSONArray matchesAPIFootball = (JSONArray) leagueConfig.get("response");
|
||||||
|
|
||||||
|
if(matchesAPIFootball.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
JSONObject firstMatchAPIFootball = (JSONObject) matchesAPIFootball.get(0);
|
JSONObject firstMatchAPIFootball = (JSONObject) matchesAPIFootball.get(0);
|
||||||
JSONObject leagueObject = (JSONObject) firstMatchAPIFootball.get("league");
|
JSONObject leagueObject = (JSONObject) firstMatchAPIFootball.get("league");
|
||||||
@@ -40,16 +53,20 @@ public class MatchesListCreator {
|
|||||||
JSONObject matchAPIFootball = (JSONObject) matchAPIFootballObject;
|
JSONObject matchAPIFootball = (JSONObject) matchAPIFootballObject;
|
||||||
JSONObject match = new JSONObject();
|
JSONObject match = new JSONObject();
|
||||||
|
|
||||||
Long leagueId = (Long) matchAPIFootball.get("league_id");
|
JSONObject leagueObject = (JSONObject) matchAPIFootball.get("league");
|
||||||
String matchdayString = matchAPIFootball.get("round").toString();
|
Long leagueId = (Long) leagueObject.get("id");
|
||||||
int matchday = APIFootballMatch.getMatchdayFromRoundString(2021, matchdayString, leagueId.intValue());
|
String matchdayString = leagueObject.get("round").toString();
|
||||||
String matchtime = matchAPIFootball.get("event_date").toString().replace("T", " ").substring(0, 16);
|
int matchday = APIFootballMatch.getMatchdayFromRoundString(this.season, matchdayString, leagueId.intValue());
|
||||||
Long fixtureId = (Long) matchAPIFootball.get("fixture_id");
|
|
||||||
|
|
||||||
JSONObject teamHome = (JSONObject) matchAPIFootball.get("homeTeam");
|
JSONObject fixtureObject = (JSONObject) matchAPIFootball.get("fixture");
|
||||||
String teamNameHome = teamHome.get("team_name").toString();
|
String matchtime = fixtureObject.get("date").toString().replace("T", " ").substring(0, 16);
|
||||||
JSONObject teamGuest = (JSONObject) matchAPIFootball.get("awayTeam");
|
Long fixtureId = (Long) fixtureObject.get("id");
|
||||||
String teamNameGuest = teamGuest.get("team_name").toString();
|
|
||||||
|
JSONObject teamsObject = (JSONObject) matchAPIFootball.get("teams");
|
||||||
|
JSONObject teamHome = (JSONObject) teamsObject.get("home");
|
||||||
|
String teamNameHome = teamHome.get("name").toString();
|
||||||
|
JSONObject teamGuest = (JSONObject) teamsObject.get("away");
|
||||||
|
String teamNameGuest = teamGuest.get("name").toString();
|
||||||
|
|
||||||
match.put("match", teamNameHome + " - " + teamNameGuest);
|
match.put("match", teamNameHome + " - " + teamNameGuest);
|
||||||
match.put("matchday", matchday);
|
match.put("matchday", matchday);
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
package de.jeyp91.tippligaforum;
|
package de.jeyp91.tippligaforum;
|
||||||
|
|
||||||
import de.jeyp91.App;
|
|
||||||
import de.jeyp91.apifootball.APIFootballUpdater;
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import de.jeyp91.apifootball.APIFootballUpdater;
|
||||||
|
|
||||||
public class MatchesListForumUpdater {
|
public class MatchesListForumUpdater {
|
||||||
private HashSet<Integer> leagues;
|
private HashSet<Integer> leagues;
|
||||||
private static final Logger logger = LogManager.getLogger(MatchesListForumUpdater.class);
|
private static final Logger logger = LoggerFactory.getLogger(MatchesListForumUpdater.class);
|
||||||
|
|
||||||
public MatchesListForumUpdater(int season) {
|
public MatchesListForumUpdater() {
|
||||||
this.leagues = new APIFootballUpdater().getLeagues(season);
|
this.leagues = new APIFootballUpdater().getLeagues();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateAllLeagues(int season) {
|
public void updateAllLeagues(int season) {
|
||||||
@@ -24,7 +24,10 @@ public class MatchesListForumUpdater {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void updateLeague(int season, int league) {
|
public void updateLeague(int season, int league) {
|
||||||
MatchesListCreator creator = new MatchesListCreator(league);
|
MatchesListCreator creator = new MatchesListCreator(season, league);
|
||||||
|
if(creator.getMatches().isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
String content = creator.getMatchesBeautiful();
|
String content = creator.getMatchesBeautiful();
|
||||||
String contentWithCodeBBCode = "<r><CODE><s>[code]</s>" + content + "<e>[/code]</e></CODE></r>";
|
String contentWithCodeBBCode = "<r><CODE><s>[code]</s>" + content + "<e>[/code]</e></CODE></r>";
|
||||||
Integer postId = getPostId(season, creator.getCountry(), creator.getLeagueName());
|
Integer postId = getPostId(season, creator.getCountry(), creator.getLeagueName());
|
||||||
|
|||||||
@@ -1,28 +1,32 @@
|
|||||||
package de.jeyp91.tippligaforum;
|
package de.jeyp91.tippligaforum;
|
||||||
|
|
||||||
import de.jeyp91.StatusHolder;
|
|
||||||
import de.jeyp91.tippliga.TLWMatch;
|
|
||||||
import de.jeyp91.tippliga.TLWMatchday;
|
|
||||||
import de.jeyp91.tippliga.TLWTeam;
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
|
||||||
import org.apache.logging.log4j.Logger;
|
|
||||||
|
|
||||||
import javax.xml.bind.DatatypeConverter;
|
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.time.Instant;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.DriverManager;
|
import java.sql.DriverManager;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import javax.xml.bind.DatatypeConverter;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import de.jeyp91.StatusHolder;
|
||||||
|
import de.jeyp91.tippliga.TLWLeague;
|
||||||
|
import de.jeyp91.tippliga.TLWMatch;
|
||||||
|
import de.jeyp91.tippliga.TLWMatchday;
|
||||||
|
import de.jeyp91.tippliga.TLWTeam;
|
||||||
|
import de.jeyp91.whatsapp.WhatsAppReminder;
|
||||||
|
|
||||||
public class TippligaSQLConnector {
|
public class TippligaSQLConnector {
|
||||||
|
|
||||||
Connection con;
|
Connection con;
|
||||||
|
|
||||||
private static final Logger logger = LogManager.getLogger(TippligaSQLConnector.class);
|
private static final Logger logger = LoggerFactory.getLogger(TippligaSQLConnector.class);
|
||||||
private static TippligaSQLConnector tlwSqlCon = null;
|
private static TippligaSQLConnector tlwSqlCon = null;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
@@ -35,6 +39,8 @@ public class TippligaSQLConnector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private TippligaSQLConnector() {
|
private TippligaSQLConnector() {
|
||||||
|
String databaseUsername = System.getenv("TLW_DATABASE_USERNAME");
|
||||||
|
String databasePassword = System.getenv("TLW_DATABASE_PASSWORD");
|
||||||
String jdbcUrlLocalhost = "jdbc:mysql://localhost:3306/d0144ddb" +
|
String jdbcUrlLocalhost = "jdbc:mysql://localhost:3306/d0144ddb" +
|
||||||
"?user=root" +
|
"?user=root" +
|
||||||
"&password=" +
|
"&password=" +
|
||||||
@@ -44,8 +50,8 @@ public class TippligaSQLConnector {
|
|||||||
"&serverTimezone=UTC" +
|
"&serverTimezone=UTC" +
|
||||||
"&allowMultiQueries=true";
|
"&allowMultiQueries=true";
|
||||||
String jdbcUrlProd = "jdbc:mysql://w00f4eaf.kasserver.com:3306/d0144ddb" +
|
String jdbcUrlProd = "jdbc:mysql://w00f4eaf.kasserver.com:3306/d0144ddb" +
|
||||||
"?user=d0144ddb" +
|
"?user=" + databaseUsername +
|
||||||
"&password=TippligaWuerzb_1" +
|
"&password=" + databasePassword +
|
||||||
"&useUnicode=true" +
|
"&useUnicode=true" +
|
||||||
"&useJDBCCompliantTimezoneShift=true" +
|
"&useJDBCCompliantTimezoneShift=true" +
|
||||||
"&useLegacyDatetimeCode=false" +
|
"&useLegacyDatetimeCode=false" +
|
||||||
@@ -61,7 +67,7 @@ public class TippligaSQLConnector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static TippligaSQLConnector getInstance() {
|
public static TippligaSQLConnector getInstance() {
|
||||||
if(tlwSqlCon == null) {
|
if (tlwSqlCon == null) {
|
||||||
tlwSqlCon = new TippligaSQLConnector();
|
tlwSqlCon = new TippligaSQLConnector();
|
||||||
}
|
}
|
||||||
return tlwSqlCon;
|
return tlwSqlCon;
|
||||||
@@ -138,6 +144,66 @@ public class TippligaSQLConnector {
|
|||||||
return matchdays;
|
return matchdays;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TLWLeague getLeague(String season, String league) {
|
||||||
|
String queryString = "SELECT * FROM `phpbb_footb_leagues` WHERE `season` = " + season + " AND `league` = " + league + ";";
|
||||||
|
ResultSet rset = executeQuery(queryString);
|
||||||
|
TLWLeague tlwLeague = null;
|
||||||
|
try {
|
||||||
|
while (rset.next()) {
|
||||||
|
tlwLeague = new TLWLeague(rset);
|
||||||
|
}
|
||||||
|
} catch (SQLException throwables) {
|
||||||
|
throwables.printStackTrace();
|
||||||
|
}
|
||||||
|
return tlwLeague;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<TLWMatchday> getUpdatedMatchdaysBasedOnMatches(String season, String league) {
|
||||||
|
String queryString = """
|
||||||
|
SELECT
|
||||||
|
d1.season,
|
||||||
|
d1.league,
|
||||||
|
d1.matchday,
|
||||||
|
d1.status,
|
||||||
|
d1.delivery_date,
|
||||||
|
min(STR_TO_DATE(d2.match_datetime, '%Y-%m-%d %H:%i:%s')) as delivery_date_2,
|
||||||
|
min(STR_TO_DATE(d3.match_datetime, '%Y-%m-%d %H:%i:%s')) as delivery_date_3,
|
||||||
|
d1.matchday_name,
|
||||||
|
d1.matches
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
md.season,
|
||||||
|
md.league,
|
||||||
|
md.matchday,
|
||||||
|
md.status,
|
||||||
|
min(STR_TO_DATE(ma.match_datetime, '%Y-%m-%d %H:%i:%s')) AS delivery_date,
|
||||||
|
md.matchday_name,
|
||||||
|
md.matches
|
||||||
|
FROM phpbb_footb_matchdays md
|
||||||
|
LEFT JOIN phpbb_footb_matches ma ON (md.season = ma.season AND md.league = ma.league AND md.matchday = ma.matchday)
|
||||||
|
WHERE md.season =""" + " " + season + " " + """
|
||||||
|
AND md.league =""" + " " + league + " " + """
|
||||||
|
GROUP BY md.season, md.league, md.matchday
|
||||||
|
) AS d1
|
||||||
|
LEFT JOIN phpbb_footb_matches d2 ON (d1.season = d2.season AND d1.league = d2.league AND d1.matchday = d2.matchday
|
||||||
|
AND DATEDIFF(DATE(STR_TO_DATE(d2.match_datetime, '%Y-%m-%d %H:%i:%s')), DATE(d1.delivery_date)) > 0)
|
||||||
|
LEFT JOIN phpbb_footb_matches d3 ON (d1.season = d3.season AND d1.league = d3.league AND d1.matchday = d3.matchday
|
||||||
|
AND DATEDIFF(DATE(STR_TO_DATE(d3.match_datetime, '%Y-%m-%d %H:%i:%s')), DATE(d1.delivery_date)) > 6)
|
||||||
|
GROUP BY d1.season, d1.league, d1.matchday;
|
||||||
|
""";
|
||||||
|
|
||||||
|
ArrayList<TLWMatchday> matchdays = new ArrayList<>();
|
||||||
|
ResultSet rset = executeQuery(queryString);
|
||||||
|
try {
|
||||||
|
while (rset.next()) {
|
||||||
|
matchdays.add(new TLWMatchday(rset));
|
||||||
|
}
|
||||||
|
} catch (SQLException throwables) {
|
||||||
|
throwables.printStackTrace();
|
||||||
|
}
|
||||||
|
return matchdays;
|
||||||
|
}
|
||||||
|
|
||||||
public Integer getForumId(String forumName, int parentId) {
|
public Integer getForumId(String forumName, int parentId) {
|
||||||
String queryString = "SELECT forum_id FROM phpbb_forums WHERE forum_name = \"" + forumName + "\" AND parent_id = " + parentId + ";";
|
String queryString = "SELECT forum_id FROM phpbb_forums WHERE forum_name = \"" + forumName + "\" AND parent_id = " + parentId + ";";
|
||||||
ResultSet rset = executeQuery(queryString);
|
ResultSet rset = executeQuery(queryString);
|
||||||
@@ -180,19 +246,19 @@ public class TippligaSQLConnector {
|
|||||||
return post;
|
return post;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResultSet executeQuery (String queryString){
|
public ResultSet executeQuery(String queryString) {
|
||||||
Statement stmt;
|
Statement stmt;
|
||||||
ResultSet rset = null;
|
ResultSet rset = null;
|
||||||
try {
|
try {
|
||||||
stmt = con.createStatement();
|
stmt = con.createStatement();
|
||||||
rset = stmt.executeQuery(queryString);
|
rset = stmt.executeQuery(queryString);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
logger.error(e.getStackTrace());
|
logger.error(e.getMessage());
|
||||||
}
|
}
|
||||||
return rset;
|
return rset;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void executeUpdate (String queryString){
|
public void executeUpdate(String queryString) {
|
||||||
Statement stmt;
|
Statement stmt;
|
||||||
try {
|
try {
|
||||||
stmt = con.createStatement();
|
stmt = con.createStatement();
|
||||||
@@ -204,7 +270,7 @@ public class TippligaSQLConnector {
|
|||||||
|
|
||||||
public void updatePost(int postId, String postText) {
|
public void updatePost(int postId, String postText) {
|
||||||
String postChecksum = getChecksum(postText);
|
String postChecksum = getChecksum(postText);
|
||||||
final long postEditTime = Instant.now().getEpochSecond();;
|
final long postEditTime = Instant.now().getEpochSecond();
|
||||||
final String postEditReason = "Update by tool.";
|
final String postEditReason = "Update by tool.";
|
||||||
int postEditUser = 2;
|
int postEditUser = 2;
|
||||||
String query = getPostUpdateQuery(postId, postText, postChecksum, postEditTime, postEditReason, postEditUser);
|
String query = getPostUpdateQuery(postId, postText, postChecksum, postEditTime, postEditReason, postEditUser);
|
||||||
@@ -258,4 +324,156 @@ public class TippligaSQLConnector {
|
|||||||
post = post.replace("'", "'");
|
post = post.replace("'", "'");
|
||||||
return post;
|
return post;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getNextMailReminder(int hours) {
|
||||||
|
String query = """
|
||||||
|
WITH next_delivery_date AS (
|
||||||
|
SELECT
|
||||||
|
m.season,
|
||||||
|
m.league,
|
||||||
|
l.league_name,
|
||||||
|
l.bet_type,
|
||||||
|
m.matchday,
|
||||||
|
m.matchday_name,
|
||||||
|
delivery_date,
|
||||||
|
STR_TO_DATE(delivery_date, '%Y-%m-%d %H:%i:%s') as parsed_delivery_date
|
||||||
|
FROM phpbb_footb_matchdays m
|
||||||
|
LEFT JOIN phpbb_footb_leagues l ON (m.season = l.season AND m.league = l.league)
|
||||||
|
HAVING parsed_delivery_date > NOW() AND parsed_delivery_date < NOW() + INTERVAL {{remainingHours}} HOUR
|
||||||
|
)
|
||||||
|
""".replace("{{remainingHours}}", "" + hours);
|
||||||
|
ResultSet rset = executeQuery(query);
|
||||||
|
String reminder = null;
|
||||||
|
try {
|
||||||
|
if (rset.next()) {
|
||||||
|
reminder = "Reminder for user: " + rset.getString("username") + " for matchday: " + rset.getString("matchday");
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return reminder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<WhatsAppReminder> getNextWhatsAppReminders(int hours) {
|
||||||
|
final String remindersToSendQuery = """
|
||||||
|
WITH delivery_date_next_day AS (
|
||||||
|
SELECT
|
||||||
|
m.season,
|
||||||
|
m.league,
|
||||||
|
l.league_name,
|
||||||
|
l.bet_type,
|
||||||
|
m.matchday,
|
||||||
|
m.matchday_name,
|
||||||
|
delivery_date,
|
||||||
|
STR_TO_DATE(delivery_date, '%Y-%m-%d %H:%i:%s') as parsed_delivery_date
|
||||||
|
FROM phpbb_footb_matchdays m
|
||||||
|
LEFT JOIN phpbb_footb_leagues l ON (m.season = l.season AND m.league = l.league)
|
||||||
|
HAVING parsed_delivery_date > NOW() AND parsed_delivery_date < NOW() + INTERVAL {{remainingHours}} HOUR
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
d.season,
|
||||||
|
d.league,
|
||||||
|
d.league_name,
|
||||||
|
d.matchday,
|
||||||
|
IF(d.matchday_name = '', CONCAT(d.matchday, '. Spieltag'), d.matchday_name) AS matchday_name,
|
||||||
|
d.delivery_date,
|
||||||
|
CASE
|
||||||
|
WHEN DATE (d.parsed_delivery_date) = CURDATE() THEN 'heute'
|
||||||
|
WHEN DATE (d.parsed_delivery_date) = CURDATE() + INTERVAL 1 DAY THEN 'morgen'
|
||||||
|
ELSE DATE (d.parsed_delivery_date)
|
||||||
|
END AS today_or_tomorrow,
|
||||||
|
TIME_FORMAT(TIME(d.parsed_delivery_date), '%H:%i') AS time,
|
||||||
|
'{{remainingHours}}' AS remaining_hours,
|
||||||
|
b.user_id,
|
||||||
|
u.username,
|
||||||
|
CASE
|
||||||
|
WHEN SUBSTR(pf.pf_handynummer, 1, 2) = '00' THEN pf.pf_handynummer
|
||||||
|
WHEN SUBSTR(pf.pf_handynummer, 1, 1) = '+' THEN CONCAT('00', SUBSTR(pf.pf_handynummer, 2))
|
||||||
|
WHEN SUBSTR(pf.pf_handynummer, 1, 2) = '01' THEN CONCAT('0049', SUBSTR(pf.pf_handynummer, 2))
|
||||||
|
ELSE ''
|
||||||
|
END AS pf_handynummer,
|
||||||
|
count(*) AS missing_bets
|
||||||
|
FROM delivery_date_next_day d
|
||||||
|
LEFT JOIN phpbb_footb_matches m
|
||||||
|
ON (d.season = m.season
|
||||||
|
AND d.league = m.league
|
||||||
|
AND d.matchday = m.matchday)
|
||||||
|
LEFT JOIN phpbb_footb_bets b
|
||||||
|
ON (m.season = b.season
|
||||||
|
AND m.league = b.league
|
||||||
|
AND m.match_no = b.match_no)
|
||||||
|
LEFT JOIN phpbb_footb_matches mb
|
||||||
|
ON (d.season = mb.season
|
||||||
|
AND d.league = mb.league - 50
|
||||||
|
AND d.matchday = mb.matchday
|
||||||
|
AND (b.user_id + 2000 = mb.team_id_home OR b.user_id + 2000 = mb.team_id_guest))
|
||||||
|
LEFT JOIN phpbb_footb_whatsapp_reminders r
|
||||||
|
ON (m.season = r.season
|
||||||
|
AND m.league = r.league
|
||||||
|
AND m.matchday = r.matchday
|
||||||
|
AND r.delivery_date = d.delivery_date
|
||||||
|
AND b.user_id = r.user_id
|
||||||
|
AND r.remaining_hours = {{remainingHours}})
|
||||||
|
LEFT JOIN phpbb_users u
|
||||||
|
ON (b.user_id = u.user_id)
|
||||||
|
LEFT JOIN phpbb_footb_whatsapp_reminder_users wu
|
||||||
|
ON (u.username = wu.username)
|
||||||
|
LEFT JOIN phpbb_profile_fields_data pf
|
||||||
|
ON (u.user_id = pf.user_id)
|
||||||
|
WHERE ((d.bet_type = 0 AND mb.match_no IS NOT NULL) OR d.bet_type = 1)
|
||||||
|
AND (b.goals_home = '' OR b.goals_guest = '')
|
||||||
|
AND r.timestamp IS NULL
|
||||||
|
AND m.status = 0
|
||||||
|
AND wu.username IS NOT NULL
|
||||||
|
AND pf.pf_handynummer != ''
|
||||||
|
GROUP BY d.league_name, d.matchday, u.username, pf.pf_handynummer;
|
||||||
|
""".replace("{{remainingHours}}", "" + hours);
|
||||||
|
final int SEASON = 1;
|
||||||
|
final int LEAGUE = 2;
|
||||||
|
final int LEAGUE_NAME = 3;
|
||||||
|
final int MATCHDAY = 4;
|
||||||
|
final int MATCHDAY_NAME = 5;
|
||||||
|
final int DELIVERY_DATE = 6;
|
||||||
|
final int TODAY_OR_TOMORROW = 7;
|
||||||
|
final int TIME = 8;
|
||||||
|
final int HOURS = 9;
|
||||||
|
final int USER_ID = 10;
|
||||||
|
final int USERNAME = 11;
|
||||||
|
final int PHONE_NUMBER = 12;
|
||||||
|
final int MISSING_BETS = 13;
|
||||||
|
try {
|
||||||
|
ResultSet rset = executeQuery(remindersToSendQuery);
|
||||||
|
ArrayList <WhatsAppReminder> reminders = new ArrayList<>();
|
||||||
|
while (rset.next()) {
|
||||||
|
reminders.add(
|
||||||
|
new WhatsAppReminder(
|
||||||
|
Integer.parseInt(rset.getString(SEASON)),
|
||||||
|
Integer.parseInt(rset.getString(LEAGUE)),
|
||||||
|
rset.getString(LEAGUE_NAME),
|
||||||
|
Integer.parseInt(rset.getString(MATCHDAY)),
|
||||||
|
rset.getString(MATCHDAY_NAME),
|
||||||
|
rset.getString(DELIVERY_DATE),
|
||||||
|
rset.getString(TODAY_OR_TOMORROW),
|
||||||
|
rset.getString(TIME),
|
||||||
|
Integer.parseInt(rset.getString(HOURS)),
|
||||||
|
Integer.parseInt(rset.getString(USER_ID)),
|
||||||
|
rset.getString(USERNAME),
|
||||||
|
rset.getString(PHONE_NUMBER),
|
||||||
|
Integer.parseInt(rset.getString(MISSING_BETS))
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return reminders;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void markWhatsAppReminderAsSent(WhatsAppReminder reminder) {
|
||||||
|
String query = """
|
||||||
|
INSERT INTO phpbb_footb_whatsapp_reminders
|
||||||
|
(season, league, matchday, delivery_date, user_id, remaining_hours)
|
||||||
|
VALUES
|
||||||
|
(""" + reminder.season() + ", " + reminder.league() + ", " + reminder.matchday() + ", '" + reminder.deliveryDate() + "', " + reminder.userId() + ", " + reminder.remainingHours() + ");";
|
||||||
|
executeUpdate(query);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,226 @@
|
|||||||
|
package de.jeyp91.tippligaforum;
|
||||||
|
|
||||||
|
import de.jeyp91.tippliga.TLWMatch;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.*;
|
||||||
|
import java.net.http.HttpClient;
|
||||||
|
import java.net.http.HttpRequest;
|
||||||
|
import java.net.http.HttpResponse;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class TippligaWebsiteConnector {
|
||||||
|
CookieManager cm = new CookieManager(null, CookiePolicy.ACCEPT_ALL);
|
||||||
|
|
||||||
|
CookieStore cookieStore = cm.getCookieStore();
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(TippligaWebsiteConnector.class);
|
||||||
|
private final HttpClient client;
|
||||||
|
private final String username = System.getenv("FORUM_USERNAME");
|
||||||
|
private final String password = System.getenv("FORUM_PASSWORD");
|
||||||
|
private String lastCreationTime = "";
|
||||||
|
private String lastFormToken = "";
|
||||||
|
|
||||||
|
public TippligaWebsiteConnector() throws IOException {
|
||||||
|
CookieHandler.setDefault(cm);
|
||||||
|
|
||||||
|
client = HttpClient.newBuilder()
|
||||||
|
.cookieHandler(CookieHandler.getDefault())
|
||||||
|
.connectTimeout(Duration.ofSeconds(10))
|
||||||
|
.build();
|
||||||
|
login();
|
||||||
|
adminLogin();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void login() throws IOException {
|
||||||
|
HttpRequest req = HttpRequest.newBuilder()
|
||||||
|
.uri(URI.create("https://tippliga-wuerzburg.de/ucp.php?mode=login"))
|
||||||
|
.GET().build();
|
||||||
|
|
||||||
|
String reqBody = "";
|
||||||
|
try {
|
||||||
|
TimeUnit.SECONDS.sleep(1);
|
||||||
|
reqBody = client.send(req, HttpResponse.BodyHandlers.ofString()).body();
|
||||||
|
} catch (IOException | InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
Pattern pattern = Pattern.compile("^[\\s\\S]*<input type=\"hidden\" name=\"creation_time\" value=\"([\\d]{10})\" \\/>[\\s\\S]*<input type=\"hidden\" name=\"form_token\" value=\"([\\d\\w]{40})\" \\/>[\\s\\S]*<input type=\"hidden\" name=\"sid\" value=\"([\\d\\w]{32})\" \\/>[\\s\\S]*$");
|
||||||
|
Matcher matcher = pattern.matcher(reqBody);
|
||||||
|
matcher.find();
|
||||||
|
|
||||||
|
this.lastCreationTime = matcher.group(1);
|
||||||
|
this.lastFormToken = matcher.group(2);
|
||||||
|
String sid = matcher.group(3);
|
||||||
|
|
||||||
|
Map<String, String> loginParameters = new HashMap<>();
|
||||||
|
loginParameters.put("login", "Anmelden");
|
||||||
|
loginParameters.put("redirect", "index.php");
|
||||||
|
loginParameters.put("autologin", "on");
|
||||||
|
loginParameters.put("viewonline", "on");
|
||||||
|
loginParameters.put("username", username);
|
||||||
|
loginParameters.put("password", password);
|
||||||
|
loginParameters.put("creation_time", this.lastCreationTime);
|
||||||
|
loginParameters.put("form_token", this.lastFormToken);
|
||||||
|
loginParameters.put("sid", sid);
|
||||||
|
|
||||||
|
String loginForm = loginParameters.entrySet()
|
||||||
|
.stream()
|
||||||
|
.map(e -> e.getKey() + "=" + URLEncoder.encode(e.getValue(), StandardCharsets.UTF_8))
|
||||||
|
.collect(Collectors.joining("&"));
|
||||||
|
|
||||||
|
HttpRequest loginReq = HttpRequest.newBuilder()
|
||||||
|
.uri(URI.create("https://tippliga-wuerzburg.de/ucp.php?mode=login"))
|
||||||
|
.headers("Content-Type", "application/x-www-form-urlencoded")
|
||||||
|
.POST(HttpRequest.BodyPublishers.ofString(loginForm))
|
||||||
|
.build();
|
||||||
|
|
||||||
|
String loginReqBody = "";
|
||||||
|
try {
|
||||||
|
TimeUnit.SECONDS.sleep(1);
|
||||||
|
loginReqBody = client.send(loginReq, HttpResponse.BodyHandlers.ofString()).body();
|
||||||
|
} catch (IOException | InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
List<HttpCookie> loginReqCookieList = cookieStore.getCookies();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void adminLogin() throws IOException {
|
||||||
|
String sid = getSidFromCookie();
|
||||||
|
String url = "https://tippliga-wuerzburg.de/adm/index.php?sid=" + sid;
|
||||||
|
HttpRequest req = HttpRequest.newBuilder()
|
||||||
|
.uri(URI.create(url))
|
||||||
|
.headers("referer", "https://tippliga-wuerzburg.de/index.php?sid=" + sid)
|
||||||
|
.GET().build();
|
||||||
|
|
||||||
|
String reqBody = "";
|
||||||
|
try {
|
||||||
|
TimeUnit.SECONDS.sleep(1);
|
||||||
|
reqBody = client.send(req, HttpResponse.BodyHandlers.ofString()).body();
|
||||||
|
} catch (IOException | InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
Pattern pattern = Pattern.compile("^[\\s\\S]*<input type=\"hidden\" name=\"creation_time\" value=\"([\\d]{10})\" \\/>[\\s\\S]*<input type=\"hidden\" name=\"form_token\" value=\"([\\d\\w]{40})\" \\/>[\\s\\S]*<input type=\"hidden\" name=\"sid\" value=\"([\\d\\w]{32})\" \\/>[\\s\\S]*<input type=\"hidden\" name=\"credential\" value=\"([\\d\\w]{32})\" \\/>[\\s\\S]*$");
|
||||||
|
Matcher matcher = pattern.matcher(reqBody);
|
||||||
|
matcher.find();
|
||||||
|
|
||||||
|
this.lastCreationTime = matcher.group(1);
|
||||||
|
this.lastFormToken = matcher.group(2);
|
||||||
|
sid = matcher.group(3);
|
||||||
|
String credential = matcher.group(4);
|
||||||
|
|
||||||
|
Map<String, String> loginParameters = new HashMap<>();
|
||||||
|
loginParameters.put("login", "Anmelden");
|
||||||
|
loginParameters.put("redirect", "./../adm/index.php?sid=" + sid);
|
||||||
|
loginParameters.put("username", username);
|
||||||
|
loginParameters.put("password_" + credential, password);
|
||||||
|
loginParameters.put("creation_time", this.lastCreationTime);
|
||||||
|
loginParameters.put("form_token", this.lastFormToken);
|
||||||
|
loginParameters.put("sid", sid);
|
||||||
|
loginParameters.put("credential", credential);
|
||||||
|
|
||||||
|
String loginForm = loginParameters.entrySet()
|
||||||
|
.stream()
|
||||||
|
.map(e -> e.getKey() + "=" + URLEncoder.encode(e.getValue(), StandardCharsets.UTF_8))
|
||||||
|
.collect(Collectors.joining("&"));
|
||||||
|
|
||||||
|
HttpRequest loginReq = HttpRequest.newBuilder()
|
||||||
|
.uri(URI.create(url))
|
||||||
|
.headers("Content-Type", "application/x-www-form-urlencoded")
|
||||||
|
.POST(HttpRequest.BodyPublishers.ofString(loginForm))
|
||||||
|
.build();
|
||||||
|
|
||||||
|
String loginReqBody = "";
|
||||||
|
try {
|
||||||
|
TimeUnit.SECONDS.sleep(1);
|
||||||
|
HttpResponse<String> loginReqResponse = client.send(loginReq, HttpResponse.BodyHandlers.ofString()); // Response 302
|
||||||
|
|
||||||
|
} catch (IOException | InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
List<HttpCookie> loginReqCookieList = cookieStore.getCookies();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateResultsAdmin(int season, int league, int matchday, List<TLWMatch> matches) {
|
||||||
|
String sid = getSidFromCookie();
|
||||||
|
String url = "https://tippliga-wuerzburg.de/adm/index.php?i=-football-football-acp-results_module&mode=manage&sid=" + sid;
|
||||||
|
|
||||||
|
HttpRequest req = HttpRequest.newBuilder()
|
||||||
|
.uri(URI.create(url))
|
||||||
|
.GET().build();
|
||||||
|
|
||||||
|
String reqBody = "";
|
||||||
|
try {
|
||||||
|
TimeUnit.SECONDS.sleep(1);
|
||||||
|
reqBody = client.send(req, HttpResponse.BodyHandlers.ofString()).body();
|
||||||
|
} catch (IOException | InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
Pattern pattern = Pattern.compile("^[\\s\\S]*<input type=\"hidden\" name=\"creation_time\" value=\"([\\d]{10})\" \\/>[\\s\\S]*<input type=\"hidden\" name=\"form_token\" value=\"([\\d\\w]{40})\" \\/>[\\s\\S]*$");
|
||||||
|
Matcher matcher = pattern.matcher(reqBody);
|
||||||
|
matcher.find();
|
||||||
|
|
||||||
|
this.lastCreationTime = matcher.group(1);
|
||||||
|
this.lastFormToken = matcher.group(2);
|
||||||
|
|
||||||
|
Map<String, String> resultParameters = new HashMap<>();
|
||||||
|
|
||||||
|
resultParameters.put("s", String.valueOf(season));
|
||||||
|
resultParameters.put("l", String.valueOf(league));
|
||||||
|
resultParameters.put("m", String.valueOf(matchday));
|
||||||
|
resultParameters.put("edit", "Speichern");
|
||||||
|
resultParameters.put("creation_time", this.lastCreationTime);
|
||||||
|
resultParameters.put("form_token", this.lastFormToken);
|
||||||
|
matches.forEach(tlwMatch -> {
|
||||||
|
String matchNo = String.valueOf(tlwMatch.getMatchNo());
|
||||||
|
resultParameters.put("select_" + matchNo, "on");
|
||||||
|
resultParameters.put("goals_home_" + matchNo, String.valueOf(tlwMatch.getGoalsHome()));
|
||||||
|
resultParameters.put("goals_guest_" + matchNo, String.valueOf(tlwMatch.getGoalsGuest()));
|
||||||
|
Integer goalsOverTimeHome = tlwMatch.getGoalsOvertimeHome();
|
||||||
|
Integer goalsOvertimeGuest = tlwMatch.getGoalsOvertimeGuest();
|
||||||
|
resultParameters.put("overtime_home_" + matchNo, goalsOverTimeHome == null ? "" : String.valueOf(goalsOverTimeHome));
|
||||||
|
resultParameters.put("overtime_guest_" + matchNo, goalsOvertimeGuest == null ? "" : String.valueOf(goalsOvertimeGuest));
|
||||||
|
});
|
||||||
|
|
||||||
|
String resultForm = resultParameters.entrySet()
|
||||||
|
.stream()
|
||||||
|
.map(e -> e.getKey() + "=" + URLEncoder.encode(e.getValue(), StandardCharsets.UTF_8))
|
||||||
|
.collect(Collectors.joining("&"));
|
||||||
|
|
||||||
|
HttpRequest resultReq = HttpRequest.newBuilder()
|
||||||
|
.uri(URI.create("https://tippliga-wuerzburg.de/adm/index.php?i=-football-football-acp-results_module&mode=manage&sid=" + sid))
|
||||||
|
.headers("Content-Type", "application/x-www-form-urlencoded")
|
||||||
|
.POST(HttpRequest.BodyPublishers.ofString(resultForm))
|
||||||
|
.build();
|
||||||
|
|
||||||
|
String resultReqBody = "";
|
||||||
|
try {
|
||||||
|
TimeUnit.SECONDS.sleep(1);
|
||||||
|
resultReqBody = client.send(resultReq, HttpResponse.BodyHandlers.ofString()).body();
|
||||||
|
} catch (IOException | InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
matcher = pattern.matcher(resultReqBody);
|
||||||
|
matcher.find();
|
||||||
|
|
||||||
|
this.lastCreationTime = matcher.group(1);
|
||||||
|
this.lastFormToken = matcher.group(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getSidFromCookie() {
|
||||||
|
HttpCookie sidCookie = cookieStore.getCookies().get(2);
|
||||||
|
String sid = sidCookie.getValue();
|
||||||
|
return sid;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
package de.jeyp91.whatsapp;
|
||||||
|
|
||||||
|
import org.json.simple.JSONArray;
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.http.HttpClient;
|
||||||
|
import java.net.http.HttpRequest;
|
||||||
|
import java.net.http.HttpResponse;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import static de.jeyp91.apifootball.APIFootballConnector.stringToJSONObject;
|
||||||
|
|
||||||
|
public class OpenAIConnector {
|
||||||
|
private final HttpClient client;
|
||||||
|
private final String OPENAI_TOKEN = System.getenv("OPENAI_TOKEN");
|
||||||
|
private final String OPENAPI_URL = "https://api.openai.com/v1/chat/completions";
|
||||||
|
private final String OPENAPI_MODEL = "gpt-3.5-turbo-0125";
|
||||||
|
private final HashMap<String, String> generatedMessages = new HashMap<>();
|
||||||
|
|
||||||
|
public OpenAIConnector() {
|
||||||
|
client = HttpClient.newBuilder().build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getReminderMessage(WhatsAppReminder reminder) {
|
||||||
|
String key = reminder.leagueName() + reminder.matchdayName() + reminder.todayTomorrow() + reminder.time();
|
||||||
|
String message;
|
||||||
|
if (generatedMessages.containsKey(key)) {
|
||||||
|
message = generatedMessages.get(key);
|
||||||
|
} else {
|
||||||
|
message = executeReminderPrompt(reminder.leagueName(), reminder.matchdayName(), reminder.todayTomorrow(), reminder.time(), reminder.remainingHours());
|
||||||
|
generatedMessages.put(key, message);
|
||||||
|
}
|
||||||
|
message = message.replace("Hey", "Hey " + reminder.username());
|
||||||
|
String end = "\nDu kannst deine Tipps wie immer unter https://tippliga-wuerzburg.de/app.php/football/bet abgeben.\nViele Grüße\nDie Tippliga Admins";
|
||||||
|
message += end;
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String executeReminderPrompt(String leagueName, String matchdayName, String deliveryDay, String time, int remainingHours) {
|
||||||
|
String systemPrompt = "Generiere eine Nachricht, die dem Zweck dient, jemanden daran zu erinnern, seine noch fehlenden Tipps für den kommenden Spieltag abzuschicken. Die Nachricht muss so klingen, als ob ein Freund sie in natürlicher Sprache abschickt. Sie muss auf Deutsch sein. Die Nachricht muss den richtigen Singular und Plural für die Anzahl der fehlenden Wetten verwenden. Halte dich genau an die Vorlage und ersetze die Teile gekennzeichnet durch \"{}\" durch passende Passagen. Die Antwort auf diesen Prompt soll ausschließlich die Nachricht sein.\n\n "
|
||||||
|
+"Dies ist die Vorlage:\n"
|
||||||
|
+"Hey,\n"
|
||||||
|
+ (remainingHours == 24 ? "{ein netter einleitender Satz der \"league_name\", \"matchday_name\" enthält}.\n" : "{ein einleitender Satz der \"league_name\", \"matchday_name\" enthält und klar macht, dass die Zeit abläuft und nur noch weniger als zwei Stunden Zeit für die Abgabe der Tipps bleibt}.\n")
|
||||||
|
+"Bitte gib die fehlenden Tipps bis {delivery_day} um {time} ab.";
|
||||||
|
JSONObject userInput = new JSONObject();
|
||||||
|
userInput.put("league_name", leagueName);
|
||||||
|
userInput.put("matchday_name", matchdayName);
|
||||||
|
userInput.put("delivery_day", deliveryDay);
|
||||||
|
userInput.put("time", time);
|
||||||
|
String user = userInput.toJSONString();
|
||||||
|
JSONObject jsonBody = new JSONObject();
|
||||||
|
jsonBody.put("model", OPENAPI_MODEL);
|
||||||
|
JSONArray messages = new JSONArray();
|
||||||
|
JSONObject system = new JSONObject();
|
||||||
|
system.put("role", "system");
|
||||||
|
system.put("content", systemPrompt);
|
||||||
|
messages.add(system);
|
||||||
|
JSONObject userMessage = new JSONObject();
|
||||||
|
userMessage.put("role", "user");
|
||||||
|
userMessage.put("content", user);
|
||||||
|
messages.add(userMessage);
|
||||||
|
jsonBody.put("messages", messages);
|
||||||
|
HttpRequest openAIRequest = HttpRequest.newBuilder()
|
||||||
|
.uri(URI.create(OPENAPI_URL))
|
||||||
|
.headers("Content-Type", "application/json")
|
||||||
|
.headers("Authorization", "Bearer " + OPENAI_TOKEN)
|
||||||
|
.POST(HttpRequest.BodyPublishers.ofString(jsonBody.toJSONString()))
|
||||||
|
.build();
|
||||||
|
JSONObject response = new JSONObject();
|
||||||
|
try {
|
||||||
|
response = stringToJSONObject(client.send(openAIRequest, HttpResponse.BodyHandlers.ofString()).body());
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
JSONArray choices = (JSONArray) response.get("choices");
|
||||||
|
JSONObject choice = (JSONObject) choices.get(0);
|
||||||
|
JSONObject message = (JSONObject) choice.get("message");
|
||||||
|
return message.get("content").toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
package de.jeyp91.whatsapp;
|
||||||
|
|
||||||
|
import de.jeyp91.tippligaforum.TippligaSQLConnector;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.http.HttpClient;
|
||||||
|
import java.net.http.HttpRequest;
|
||||||
|
import java.net.http.HttpResponse;
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class WhatsAppNotifier {
|
||||||
|
private final String host = System.getenv("TLW_WHATSAPP_HOST");
|
||||||
|
private final String port = System.getenv("TLW_WHATSAPP_PORT");
|
||||||
|
private final String apiKey = System.getenv("TLW_WHATSAPP_API_KEY");
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(WhatsAppNotifier.class);
|
||||||
|
private final HttpClient client;
|
||||||
|
private final OpenAIConnector openAIConnector = new OpenAIConnector();
|
||||||
|
|
||||||
|
public WhatsAppNotifier() {
|
||||||
|
client = HttpClient.newBuilder()
|
||||||
|
.connectTimeout(Duration.ofSeconds(10))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendNotifications() {
|
||||||
|
ArrayList<WhatsAppReminder> reminders = TippligaSQLConnector.getInstance().getNextWhatsAppReminders(24);
|
||||||
|
reminders.addAll(TippligaSQLConnector.getInstance().getNextWhatsAppReminders(2));
|
||||||
|
reminders.forEach(reminder -> {
|
||||||
|
boolean success = sendMessage(reminder);
|
||||||
|
if (success) {
|
||||||
|
markReminderAsSent(reminder);
|
||||||
|
logger.info("WhatsApp Erinnerung an " + reminder.username() + " gesendet.");
|
||||||
|
} else {
|
||||||
|
logger.error("WhatsApp Nachricht senden an " + reminder.username() + " fehlgeschlagen.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean sendMessage(WhatsAppReminder reminder) {
|
||||||
|
String message = openAIConnector.getReminderMessage(reminder);
|
||||||
|
JSONObject body = new JSONObject();
|
||||||
|
body.put("number", reminder.phoneNumber().substring(2));
|
||||||
|
body.put("message", message);
|
||||||
|
HttpRequest req = HttpRequest.newBuilder()
|
||||||
|
.uri(URI.create(this.host + (this.port != null ? ":" + this.port : "") + "/send"))
|
||||||
|
.headers("Content-Type", "application/json")
|
||||||
|
.headers("x-api-key", apiKey)
|
||||||
|
.POST(HttpRequest.BodyPublishers.ofString(body.toJSONString()))
|
||||||
|
.build();
|
||||||
|
boolean success = false;
|
||||||
|
try {
|
||||||
|
int responseCode = client.send(req, HttpResponse.BodyHandlers.ofString()).statusCode();
|
||||||
|
if (responseCode != 200) {
|
||||||
|
logger.error("Failed to send WhatsApp message. Response code: " + responseCode);
|
||||||
|
} else {
|
||||||
|
success = true;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("Failed to send WhatsApp message: " + e.getMessage());
|
||||||
|
}
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void markReminderAsSent(WhatsAppReminder reminder) {
|
||||||
|
TippligaSQLConnector.getInstance().markWhatsAppReminderAsSent(reminder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package de.jeyp91.whatsapp;
|
||||||
|
|
||||||
|
public record WhatsAppReminder(int season,
|
||||||
|
int league,
|
||||||
|
String leagueName,
|
||||||
|
int matchday,
|
||||||
|
String matchdayName,
|
||||||
|
String deliveryDate,
|
||||||
|
String todayTomorrow,
|
||||||
|
String time,
|
||||||
|
int remainingHours,
|
||||||
|
int userId,
|
||||||
|
String username,
|
||||||
|
String phoneNumber,
|
||||||
|
int missingBets) {
|
||||||
|
}
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"username": "tippligawuerzburg",
|
|
||||||
"password": "1154f448eae29212971cb82ca8850f54bff23629"
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"1": {
|
|
||||||
"id": "825f79shtm9n3uknj99iuu2qho",
|
|
||||||
"url": "825f79shtm9n3uknj99iuu2qho@group.calendar.google.com"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"installed": {
|
|
||||||
"client_id": "267204101826-2ps9m6httllrc7mrsvml50rsfb661k87.apps.googleusercontent.com",
|
|
||||||
"project_id": "tippliga",
|
|
||||||
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
|
||||||
"token_uri": "https://oauth2.googleapis.com/token",
|
|
||||||
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
|
|
||||||
"client_secret": "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",
|
|
||||||
"redirect_uris": [
|
|
||||||
"urn:ietf:wg:oauth:2.0:oob",
|
|
||||||
"http://localhost"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -83,5 +83,15 @@
|
|||||||
"country": "World",
|
"country": "World",
|
||||||
"name": "UEFA Super Cup",
|
"name": "UEFA Super Cup",
|
||||||
"league_id": 4306
|
"league_id": 4306
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Turkey",
|
||||||
|
"name": "Süper Lig",
|
||||||
|
"league_id": 4418
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Netherlands",
|
||||||
|
"name": "Eredivisie",
|
||||||
|
"league_id": 4349
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "Bundesliga",
|
||||||
|
"league_id": 5348
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "2. Bundesliga",
|
||||||
|
"league_id": 5347
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "3. Liga",
|
||||||
|
"league_id": 5399
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "Regionalliga - Bayern",
|
||||||
|
"league_id": 5518
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "Regionalliga - SudWest",
|
||||||
|
"league_id": 5519
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "U19 Bundesliga",
|
||||||
|
"league_id": 5436
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "Frauen Bundesliga",
|
||||||
|
"league_id": 5464
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "DFB Pokal",
|
||||||
|
"league_id": 5275
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "Super Cup",
|
||||||
|
"league_id": 5223
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "England",
|
||||||
|
"name": "Premier League",
|
||||||
|
"league_id": 5267
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Spain",
|
||||||
|
"name": "La Liga",
|
||||||
|
"league_id": 5284
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Italy",
|
||||||
|
"name": "Serie A",
|
||||||
|
"league_id": 5367
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "France",
|
||||||
|
"name": "Ligue 1",
|
||||||
|
"league_id": 5322
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Turkey",
|
||||||
|
"name": "Süper Lig",
|
||||||
|
"league_id": 5476
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Netherlands",
|
||||||
|
"name": "Eredivisie",
|
||||||
|
"league_id": 5389
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "World",
|
||||||
|
"name": "UEFA Champions League",
|
||||||
|
"league_id": 5262
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "World",
|
||||||
|
"name": "UEFA Europa League",
|
||||||
|
"league_id": 5607
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "World",
|
||||||
|
"name": "UEFA Europa Conference League",
|
||||||
|
"league_id": 5277
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "World",
|
||||||
|
"name": "UEFA Super Cup",
|
||||||
|
"league_id": 5235
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "World",
|
||||||
|
"name": "Euro Championship",
|
||||||
|
"league_id": 5858
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "Bundesliga",
|
||||||
|
"league_id": 6375
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "2. Bundesliga",
|
||||||
|
"league_id": 6387
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "3. Liga",
|
||||||
|
"league_id": 6443
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "Regionalliga - Bayern",
|
||||||
|
"league_id": 6472
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "Regionalliga - SudWest",
|
||||||
|
"league_id": 6471
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "U19 Bundesliga",
|
||||||
|
"league_id": 6572
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "Frauen Bundesliga",
|
||||||
|
"league_id": 6510
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "DFB Pokal",
|
||||||
|
"league_id": 6244
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "Super Cup",
|
||||||
|
"league_id": 6247
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "England",
|
||||||
|
"name": "Premier League",
|
||||||
|
"league_id": 6280
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Spain",
|
||||||
|
"name": "La Liga",
|
||||||
|
"league_id": 6284
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Italy",
|
||||||
|
"name": "Serie A",
|
||||||
|
"league_id": 6374
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "France",
|
||||||
|
"name": "Ligue 1",
|
||||||
|
"league_id": 6315
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Turkey",
|
||||||
|
"name": "Süper Lig",
|
||||||
|
"league_id": 6447
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Netherlands",
|
||||||
|
"name": "Eredivisie",
|
||||||
|
"league_id": 6314
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "World",
|
||||||
|
"name": "UEFA Champions League",
|
||||||
|
"league_id": 6281
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "World",
|
||||||
|
"name": "UEFA Europa League",
|
||||||
|
"league_id": 6283
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "World",
|
||||||
|
"name": "UEFA Europa Conference League",
|
||||||
|
"league_id": 6282
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "World",
|
||||||
|
"name": "UEFA Super Cup",
|
||||||
|
"league_id": 6241
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "Bundesliga",
|
||||||
|
"league_id": 78
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "2. Bundesliga",
|
||||||
|
"league_id": 79
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "3. Liga",
|
||||||
|
"league_id": 80
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "Regionalliga - Bayern",
|
||||||
|
"league_id": 83
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "Regionalliga - SudWest",
|
||||||
|
"league_id": 86
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "U19 Bundesliga",
|
||||||
|
"league_id": 488
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "Frauen Bundesliga",
|
||||||
|
"league_id": 82
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "DFB Pokal",
|
||||||
|
"league_id": 81
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Germany",
|
||||||
|
"name": "Super Cup",
|
||||||
|
"league_id": 529
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "England",
|
||||||
|
"name": "Premier League",
|
||||||
|
"league_id": 39
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Spain",
|
||||||
|
"name": "La Liga",
|
||||||
|
"league_id": 140
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Italy",
|
||||||
|
"name": "Serie A",
|
||||||
|
"league_id": 135
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "France",
|
||||||
|
"name": "Ligue 1",
|
||||||
|
"league_id": 61
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Turkey",
|
||||||
|
"name": "Süper Lig",
|
||||||
|
"league_id": 203
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Netherlands",
|
||||||
|
"name": "Eredivisie",
|
||||||
|
"league_id": 88
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Austria",
|
||||||
|
"name": "Bundesliga",
|
||||||
|
"league_id": 218
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "Portugal",
|
||||||
|
"name": "Primeira Liga",
|
||||||
|
"league_id": 94
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "World",
|
||||||
|
"name": "UEFA Champions League",
|
||||||
|
"league_id": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "World",
|
||||||
|
"name": "UEFA Europa League",
|
||||||
|
"league_id": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "World",
|
||||||
|
"name": "UEFA Europa Conference League",
|
||||||
|
"league_id": 848
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "World",
|
||||||
|
"name": "UEFA Super Cup",
|
||||||
|
"league_id": 531
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "World",
|
||||||
|
"name": "World Cup",
|
||||||
|
"league_id": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"country": "World",
|
||||||
|
"name": "Euro Championship",
|
||||||
|
"league_id": 4
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -511,7 +511,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"teamname": "FC Fulham",
|
"teamname": "FC Fulham",
|
||||||
"tippligaID": 5555,
|
"tippligaID": 555,
|
||||||
"apiFootballID": 36
|
"apiFootballID": 36
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -998,5 +998,535 @@
|
|||||||
"teamname": "FC Teutonia 05 Ottensen",
|
"teamname": "FC Teutonia 05 Ottensen",
|
||||||
"tippligaID": 642,
|
"tippligaID": 642,
|
||||||
"apiFootballID": 12878
|
"apiFootballID": 12878
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "FK Partizan",
|
||||||
|
"tippligaID": 547,
|
||||||
|
"apiFootballID": 573
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Celtic",
|
||||||
|
"tippligaID": 526,
|
||||||
|
"apiFootballID": 247
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Maccabi Haifa",
|
||||||
|
"tippligaID": 551,
|
||||||
|
"apiFootballID": 4195
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Sporting CP",
|
||||||
|
"tippligaID": 512,
|
||||||
|
"apiFootballID": 228
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Bologna",
|
||||||
|
"tippligaID": 647,
|
||||||
|
"apiFootballID": 500
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Rayo Vallecano",
|
||||||
|
"tippligaID": 643,
|
||||||
|
"apiFootballID": 728
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Udinese",
|
||||||
|
"tippligaID": 490,
|
||||||
|
"apiFootballID": 494
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Monza",
|
||||||
|
"tippligaID": 644,
|
||||||
|
"apiFootballID": 1579
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Empoli",
|
||||||
|
"tippligaID": 451,
|
||||||
|
"apiFootballID": 511
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Sampdoria",
|
||||||
|
"tippligaID": 417,
|
||||||
|
"apiFootballID": 498
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Fenerbahce",
|
||||||
|
"tippligaID": 521,
|
||||||
|
"apiFootballID": 611
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Nottingham Forest",
|
||||||
|
"tippligaID": 645,
|
||||||
|
"apiFootballID": 65
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Reims",
|
||||||
|
"tippligaID": 646,
|
||||||
|
"apiFootballID": 93
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Feyenoord",
|
||||||
|
"tippligaID": 482,
|
||||||
|
"apiFootballID": 209
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "VfB Oldenburg",
|
||||||
|
"tippligaID": 112,
|
||||||
|
"apiFootballID": 9347
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "TuS Bersenbrück",
|
||||||
|
"tippligaID": 188,
|
||||||
|
"apiFootballID": 14635
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "TSG Balingen",
|
||||||
|
"tippligaID": 189,
|
||||||
|
"apiFootballID": 9360
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Atlas Delmenhorst",
|
||||||
|
"tippligaID": 171,
|
||||||
|
"apiFootballID": 4260
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "FC Gütersloh",
|
||||||
|
"tippligaID": 190,
|
||||||
|
"apiFootballID": 14485
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Rostocker FC",
|
||||||
|
"tippligaID": 191,
|
||||||
|
"apiFootballID": 14762
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "TuS Makkabi Berlin",
|
||||||
|
"tippligaID": 192,
|
||||||
|
"apiFootballID": 14722
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Freiburg II",
|
||||||
|
"tippligaID": 193,
|
||||||
|
"apiFootballID": 9363
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Bournemouth",
|
||||||
|
"tippligaID": 624,
|
||||||
|
"apiFootballID": 35
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Burnley",
|
||||||
|
"tippligaID": 194,
|
||||||
|
"apiFootballID": 44
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Crystal Palace",
|
||||||
|
"tippligaID": 195,
|
||||||
|
"apiFootballID": 52
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Sheffield Utd",
|
||||||
|
"tippligaID": 196,
|
||||||
|
"apiFootballID": 62
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Luton",
|
||||||
|
"tippligaID": 197,
|
||||||
|
"apiFootballID": 1359
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Genoa",
|
||||||
|
"tippligaID": 560,
|
||||||
|
"apiFootballID": 495
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Frosinone",
|
||||||
|
"tippligaID": 198,
|
||||||
|
"apiFootballID": 512
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Lecce",
|
||||||
|
"tippligaID": 199,
|
||||||
|
"apiFootballID": 867
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Cagliari",
|
||||||
|
"tippligaID": 200,
|
||||||
|
"apiFootballID": 490
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Salernitana",
|
||||||
|
"tippligaID": 201,
|
||||||
|
"apiFootballID": 514
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Sassuolo",
|
||||||
|
"tippligaID": 202,
|
||||||
|
"apiFootballID": 488
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Fiorentina",
|
||||||
|
"tippligaID": 438,
|
||||||
|
"apiFootballID": 502
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Torino",
|
||||||
|
"tippligaID": 627,
|
||||||
|
"apiFootballID": 503
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "FC Copenhagen",
|
||||||
|
"tippligaID": 473,
|
||||||
|
"apiFootballID": 400
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Sporting Braga",
|
||||||
|
"tippligaID": 457,
|
||||||
|
"apiFootballID": 217
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Girona",
|
||||||
|
"tippligaID": 648,
|
||||||
|
"apiFootballID": 547
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "PSV Eindhoven",
|
||||||
|
"tippligaID": 510,
|
||||||
|
"apiFootballID": 197
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Viktoria Plzen",
|
||||||
|
"tippligaID": 598,
|
||||||
|
"apiFootballID": 567
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "PAOK Saloniki",
|
||||||
|
"tippligaID": 579,
|
||||||
|
"apiFootballID": 619
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Club Brugge KV",
|
||||||
|
"tippligaID": 462,
|
||||||
|
"apiFootballID": 569
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "FC Toulouse",
|
||||||
|
"tippligaID": 427,
|
||||||
|
"apiFootballID": 96
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Stade Brestois 29",
|
||||||
|
"tippligaID": 649,
|
||||||
|
"apiFootballID": 106
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Albania",
|
||||||
|
"tippligaID": 702,
|
||||||
|
"apiFootballID": 778
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Slovenia",
|
||||||
|
"tippligaID": 926,
|
||||||
|
"apiFootballID": 1091
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Serbia",
|
||||||
|
"tippligaID": 924,
|
||||||
|
"apiFootballID": 14
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Romania",
|
||||||
|
"tippligaID": 836,
|
||||||
|
"apiFootballID": 774
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Georgia",
|
||||||
|
"tippligaID": 751,
|
||||||
|
"apiFootballID": 1104
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "TuS Koblenz",
|
||||||
|
"tippligaID": 32,
|
||||||
|
"apiFootballID": 1648
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Phönix Lübeck",
|
||||||
|
"tippligaID": 650,
|
||||||
|
"apiFootballID": 12831
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Alemannia Aachen",
|
||||||
|
"tippligaID": 7,
|
||||||
|
"apiFootballID": 4259
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Borussia Hildesheim",
|
||||||
|
"tippligaID": 651,
|
||||||
|
"apiFootballID": 12742
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "AJ Auxerre",
|
||||||
|
"tippligaID": 652,
|
||||||
|
"apiFootballID": 108
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "FK Bodø/Glimt",
|
||||||
|
"tippligaID": 653,
|
||||||
|
"apiFootballID": 327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Jagiellonia",
|
||||||
|
"tippligaID": 654,
|
||||||
|
"apiFootballID": 336
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Celje",
|
||||||
|
"tippligaID": 655,
|
||||||
|
"apiFootballID": 4360
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Legia Warszawa",
|
||||||
|
"tippligaID": 656,
|
||||||
|
"apiFootballID": 339
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Djurgardens IF",
|
||||||
|
"tippligaID": 657,
|
||||||
|
"apiFootballID": 364
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Rapid Wien",
|
||||||
|
"tippligaID": 415,
|
||||||
|
"apiFootballID": 781
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "ZFC Meuselwitz",
|
||||||
|
"tippligaID": 102,
|
||||||
|
"apiFootballID": 9358
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Bahlinger SC",
|
||||||
|
"tippligaID": 585,
|
||||||
|
"apiFootballID": 9359
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "SV Hemelingen",
|
||||||
|
"tippligaID": 658,
|
||||||
|
"apiFootballID": 12783
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "RSV Eintracht",
|
||||||
|
"tippligaID": 659,
|
||||||
|
"apiFootballID": 14754
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Sturm Graz",
|
||||||
|
"tippligaID": 559,
|
||||||
|
"apiFootballID": 637
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Go Ahead Eagles",
|
||||||
|
"tippligaID": 660,
|
||||||
|
"apiFootballID": 410
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Espanyol",
|
||||||
|
"tippligaID": 572,
|
||||||
|
"apiFootballID": 540
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Como",
|
||||||
|
"tippligaID": 661,
|
||||||
|
"apiFootballID": 895
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Genk",
|
||||||
|
"tippligaID": 662,
|
||||||
|
"apiFootballID": 742
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Sigma Olomouc",
|
||||||
|
"tippligaID": 663,
|
||||||
|
"apiFootballID": 2250
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "AZ Alkmaar",
|
||||||
|
"tippligaID": 454,
|
||||||
|
"apiFootballID": 201
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "AEK Athens",
|
||||||
|
"tippligaID": 404,
|
||||||
|
"apiFootballID": 575
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Mexico",
|
||||||
|
"tippligaID": 916,
|
||||||
|
"apiFootballID": 16
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "South Africa",
|
||||||
|
"tippligaID": 928,
|
||||||
|
"apiFootballID": 1531
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "South Korea",
|
||||||
|
"tippligaID": 929,
|
||||||
|
"apiFootballID": 17
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Canada",
|
||||||
|
"tippligaID": 664,
|
||||||
|
"apiFootballID": 5529
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Bosnia & Herzegovina",
|
||||||
|
"tippligaID": 724,
|
||||||
|
"apiFootballID": 1113
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "USA",
|
||||||
|
"tippligaID": 931,
|
||||||
|
"apiFootballID": 2384
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Paraguay",
|
||||||
|
"tippligaID": 921,
|
||||||
|
"apiFootballID": 2380
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Qatar",
|
||||||
|
"tippligaID": 665,
|
||||||
|
"apiFootballID": 1569
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Brazil",
|
||||||
|
"tippligaID": 903,
|
||||||
|
"apiFootballID": 6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Morocco",
|
||||||
|
"tippligaID": 707,
|
||||||
|
"apiFootballID": 31
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Haiti",
|
||||||
|
"tippligaID": 666,
|
||||||
|
"apiFootballID": 2386
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Australia",
|
||||||
|
"tippligaID": 902,
|
||||||
|
"apiFootballID": 20
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "New Zealand",
|
||||||
|
"tippligaID": 917,
|
||||||
|
"apiFootballID": 4673
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Ghana",
|
||||||
|
"tippligaID": 910,
|
||||||
|
"apiFootballID": 1504
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Panama",
|
||||||
|
"tippligaID": 705,
|
||||||
|
"apiFootballID": 11
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Colombia",
|
||||||
|
"tippligaID": 938,
|
||||||
|
"apiFootballID": 8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Congo DR",
|
||||||
|
"tippligaID": 667,
|
||||||
|
"apiFootballID": 1508
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Uzbekistan",
|
||||||
|
"tippligaID": 668,
|
||||||
|
"apiFootballID": 1568
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Algeria",
|
||||||
|
"tippligaID": 900,
|
||||||
|
"apiFootballID": 1532
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Jordan",
|
||||||
|
"tippligaID": 669,
|
||||||
|
"apiFootballID": 1548
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Argentina",
|
||||||
|
"tippligaID": 901,
|
||||||
|
"apiFootballID": 26
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Senegal",
|
||||||
|
"tippligaID": 708,
|
||||||
|
"apiFootballID": 13
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Iraq",
|
||||||
|
"tippligaID": 670,
|
||||||
|
"apiFootballID": 1567
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Norway",
|
||||||
|
"tippligaID": 823,
|
||||||
|
"apiFootballID": 1090
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Uruguay",
|
||||||
|
"tippligaID": 930,
|
||||||
|
"apiFootballID": 7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Cape Verde Islands",
|
||||||
|
"tippligaID": 671,
|
||||||
|
"apiFootballID": 1533
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Saudi Arabia",
|
||||||
|
"tippligaID": 703,
|
||||||
|
"apiFootballID": 23
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Egypt",
|
||||||
|
"tippligaID": 706,
|
||||||
|
"apiFootballID": 32
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Iran",
|
||||||
|
"tippligaID": 937,
|
||||||
|
"apiFootballID": 22
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Ecuador",
|
||||||
|
"tippligaID": 934,
|
||||||
|
"apiFootballID": 2382
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Curaçao",
|
||||||
|
"tippligaID": 672,
|
||||||
|
"apiFootballID": 5530
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Ivory Coast",
|
||||||
|
"tippligaID": 907,
|
||||||
|
"apiFootballID": 1501
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Japan",
|
||||||
|
"tippligaID": 914,
|
||||||
|
"apiFootballID": 12
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"teamname": "Tunisia",
|
||||||
|
"tippligaID": 710,
|
||||||
|
"apiFootballID": 28
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"team_id": 2058,
|
"team_id": 2058,
|
||||||
"team_name": "Nicole (TG Rhön)",
|
"team_name": "Nicole",
|
||||||
"team_name_short": "Nicole"
|
"team_name_short": "Nicole"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -273,5 +273,20 @@
|
|||||||
"team_id": 2133,
|
"team_id": 2133,
|
||||||
"team_name": "Barb",
|
"team_name": "Barb",
|
||||||
"team_name_short": "Barb"
|
"team_name_short": "Barb"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"team_id": 2137,
|
||||||
|
"team_name": "Johannes",
|
||||||
|
"team_name_short": "Johannes"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"team_id": 2138,
|
||||||
|
"team_name": "TG ChatGPT",
|
||||||
|
"team_name_short": "ChatGPT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"team_id": 2139,
|
||||||
|
"team_name": "Dustin",
|
||||||
|
"team_name_short": "Dustin"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -0,0 +1,114 @@
|
|||||||
|
{
|
||||||
|
"numberOfMatchdays": 5,
|
||||||
|
"matchesPerMatchday": 0,
|
||||||
|
"pointMode": 4,
|
||||||
|
"pointsTendency": 1,
|
||||||
|
"pointsDifference": 2,
|
||||||
|
"pointsDirectHit": 3,
|
||||||
|
"ko": 1,
|
||||||
|
"matchdayConfig": [
|
||||||
|
{
|
||||||
|
"TLWMatchday": 1,
|
||||||
|
"matchdayName": "1. Runde",
|
||||||
|
"numberOfMatches": 32,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 5275,
|
||||||
|
"leagueMatchday": 1,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2022-07-29 20:45:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 2,
|
||||||
|
"numberOfMatches": 12,
|
||||||
|
"matchdayName": "2. Spieltag",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 5275,
|
||||||
|
"leagueMatchday": 2,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2022-10-18 18:30:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 3,
|
||||||
|
"numberOfMatches": 12,
|
||||||
|
"matchdayName": "3. Spieltag",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 5275,
|
||||||
|
"leagueMatchday": 3,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2023-01-31 18:30:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 4,
|
||||||
|
"numberOfMatches": 8,
|
||||||
|
"matchdayName": "Achtelfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 5275,
|
||||||
|
"leagueMatchday": 4,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2023-04-04 18:30:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 5,
|
||||||
|
"numberOfMatches": 4,
|
||||||
|
"matchdayName": "Viertelfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 5275,
|
||||||
|
"leagueMatchday": 5,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 5275,
|
||||||
|
"leagueMatchday": 5,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 5275,
|
||||||
|
"leagueMatchday": 6,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 5275,
|
||||||
|
"leagueMatchday": 6,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2023-05-02 20:45:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
{
|
||||||
|
"numberOfMatchdays": 5,
|
||||||
|
"matchesPerMatchday": 0,
|
||||||
|
"pointMode": 4,
|
||||||
|
"pointsTendency": 1,
|
||||||
|
"pointsDifference": 2,
|
||||||
|
"pointsDirectHit": 3,
|
||||||
|
"ko": 1,
|
||||||
|
"matchdayConfig": [
|
||||||
|
{
|
||||||
|
"TLWMatchday": 1,
|
||||||
|
"matchdayName": "1. Runde",
|
||||||
|
"numberOfMatches": 32,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 5858,
|
||||||
|
"leagueMatchday": 1,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 2,
|
||||||
|
"numberOfMatches": 12,
|
||||||
|
"matchdayName": "2. Spieltag",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 5858,
|
||||||
|
"leagueMatchday": 2,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 3,
|
||||||
|
"numberOfMatches": 12,
|
||||||
|
"matchdayName": "3. Spieltag",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 5858,
|
||||||
|
"leagueMatchday": 3,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 4,
|
||||||
|
"numberOfMatches": 8,
|
||||||
|
"matchdayName": "Achtelfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 5858,
|
||||||
|
"leagueMatchday": 4,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2024-06-29 18:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 5,
|
||||||
|
"numberOfMatches": 4,
|
||||||
|
"matchdayName": "Viertelfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 5858,
|
||||||
|
"leagueMatchday": 5,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2024-07-05 18:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 6,
|
||||||
|
"numberOfMatches": 2,
|
||||||
|
"matchdayName": "Halbfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 5858,
|
||||||
|
"leagueMatchday": 6,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2024-07-09 21:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 7,
|
||||||
|
"numberOfMatches": 1,
|
||||||
|
"matchdayName": "Finale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 5858,
|
||||||
|
"leagueMatchday": 7,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2024-07-14 21:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,435 @@
|
|||||||
|
{
|
||||||
|
"numberOfMatchdays": 39,
|
||||||
|
"matchesPerMatchday": 12,
|
||||||
|
"pointMode": 4,
|
||||||
|
"pointsTendency": 1,
|
||||||
|
"pointsDifference": 2,
|
||||||
|
"pointsDirectHit": 3,
|
||||||
|
"ko": 0,
|
||||||
|
"matchdayConfig": [
|
||||||
|
{
|
||||||
|
"TLWMatchday": 1,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6387,
|
||||||
|
"leagueMatchday": 1,
|
||||||
|
"showTable": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 2,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6387,
|
||||||
|
"leagueMatchday": 2,
|
||||||
|
"showTable": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 3,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 1,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 4,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 2,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 5,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 3,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 6,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 4,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 7,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 5,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 8,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 6,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 9,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 7,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 10,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 8,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 11,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 9,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 12,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 10,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 13,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 11,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 14,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 12,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 15,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 13,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 16,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 14,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 17,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 15,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 18,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2024-12-26 18:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 19,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 16,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 20,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 17,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 21,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 18,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 22,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 19,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 23,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 20,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 24,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 21,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 25,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 22,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 26,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 23,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 27,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 24,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 28,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 25,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 29,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 26,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 30,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2025-03-18 18:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 31,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 27,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 32,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 28,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 33,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 29,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 34,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2025-04-15 18:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 35,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 30,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 36,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 31,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 37,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 32,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 38,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 33,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 39,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6375,
|
||||||
|
"leagueMatchday": 34,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,152 @@
|
|||||||
|
{
|
||||||
|
"numberOfMatchdays": 5,
|
||||||
|
"matchesPerMatchday": 0,
|
||||||
|
"pointMode": 4,
|
||||||
|
"pointsTendency": 1,
|
||||||
|
"pointsDifference": 2,
|
||||||
|
"pointsDirectHit": 3,
|
||||||
|
"ko": 1,
|
||||||
|
"matchdayConfig": [
|
||||||
|
{
|
||||||
|
"TLWMatchday": 1,
|
||||||
|
"matchdayName": "1. Runde",
|
||||||
|
"numberOfMatches": 32,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6244,
|
||||||
|
"leagueMatchday": 1,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2024-08-16 18:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 2,
|
||||||
|
"numberOfMatches": 16,
|
||||||
|
"matchdayName": "Achtelfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6244,
|
||||||
|
"leagueMatchday": 2,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2024-10-29 18:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 3,
|
||||||
|
"numberOfMatches": 8,
|
||||||
|
"matchdayName": "Viertelfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6244,
|
||||||
|
"leagueMatchday": 3,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2024-12-03 18:30:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 4,
|
||||||
|
"numberOfMatches": 4,
|
||||||
|
"matchdayName": "Halbfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6244,
|
||||||
|
"leagueMatchday": 4,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2025-02-04 18:30:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 5,
|
||||||
|
"numberOfMatches": 6,
|
||||||
|
"matchdayName": "Finale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6244,
|
||||||
|
"leagueMatchday": 5,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6244,
|
||||||
|
"leagueMatchday": 5,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6244,
|
||||||
|
"leagueMatchday": 6,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 6244,
|
||||||
|
"leagueMatchday": 6,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2025-04-01 20:45:00",
|
||||||
|
"formulaHome": "D",
|
||||||
|
"formulaGuest": "D"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2025-04-02 20:45:00",
|
||||||
|
"formulaHome": "D",
|
||||||
|
"formulaGuest": "D"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2025-04-01 20:45:00",
|
||||||
|
"formulaHome": "D",
|
||||||
|
"formulaGuest": "D"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2025-04-02 20:45:00",
|
||||||
|
"formulaHome": "D",
|
||||||
|
"formulaGuest": "D"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2025-05-24 20:00:00",
|
||||||
|
"formulaHome": "D",
|
||||||
|
"formulaGuest": "D"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2025-05-24 20:00:00",
|
||||||
|
"formulaHome": "D",
|
||||||
|
"formulaGuest": "D"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,152 @@
|
|||||||
|
{
|
||||||
|
"numberOfMatchdays": 5,
|
||||||
|
"matchesPerMatchday": 0,
|
||||||
|
"pointMode": 4,
|
||||||
|
"pointsTendency": 1,
|
||||||
|
"pointsDifference": 2,
|
||||||
|
"pointsDirectHit": 3,
|
||||||
|
"ko": 1,
|
||||||
|
"matchdayConfig": [
|
||||||
|
{
|
||||||
|
"TLWMatchday": 1,
|
||||||
|
"matchdayName": "1. Runde",
|
||||||
|
"numberOfMatches": 32,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 81,
|
||||||
|
"leagueMatchday": 1,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2024-08-16 18:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 2,
|
||||||
|
"numberOfMatches": 16,
|
||||||
|
"matchdayName": "Achtelfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 81,
|
||||||
|
"leagueMatchday": 2,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2024-10-29 18:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 3,
|
||||||
|
"numberOfMatches": 8,
|
||||||
|
"matchdayName": "Viertelfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 81,
|
||||||
|
"leagueMatchday": 3,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2024-12-03 18:30:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 4,
|
||||||
|
"numberOfMatches": 4,
|
||||||
|
"matchdayName": "Halbfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 81,
|
||||||
|
"leagueMatchday": 4,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2025-02-04 18:30:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 5,
|
||||||
|
"numberOfMatches": 6,
|
||||||
|
"matchdayName": "Finale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 81,
|
||||||
|
"leagueMatchday": 5,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 81,
|
||||||
|
"leagueMatchday": 5,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 81,
|
||||||
|
"leagueMatchday": 6,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 81,
|
||||||
|
"leagueMatchday": 6,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2025-04-01 20:45:00",
|
||||||
|
"formulaHome": "D",
|
||||||
|
"formulaGuest": "D"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2025-04-02 20:45:00",
|
||||||
|
"formulaHome": "D",
|
||||||
|
"formulaGuest": "D"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2025-04-01 20:45:00",
|
||||||
|
"formulaHome": "D",
|
||||||
|
"formulaGuest": "D"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2025-04-02 20:45:00",
|
||||||
|
"formulaHome": "D",
|
||||||
|
"formulaGuest": "D"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2025-05-24 20:00:00",
|
||||||
|
"formulaHome": "D",
|
||||||
|
"formulaGuest": "D"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2025-05-24 20:00:00",
|
||||||
|
"formulaHome": "D",
|
||||||
|
"formulaGuest": "D"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
{
|
||||||
|
"numberOfMatchdays": 8,
|
||||||
|
"matchesPerMatchday": 0,
|
||||||
|
"pointMode": 4,
|
||||||
|
"pointsTendency": 1,
|
||||||
|
"pointsDifference": 2,
|
||||||
|
"pointsDirectHit": 3,
|
||||||
|
"ko": 1,
|
||||||
|
"matchdayConfig": [
|
||||||
|
{
|
||||||
|
"TLWMatchday": 1,
|
||||||
|
"numberOfMatches": 24,
|
||||||
|
"matchdayName": "1. Spieltag",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 1,
|
||||||
|
"leagueMatchday": 1,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 2,
|
||||||
|
"numberOfMatches": 24,
|
||||||
|
"matchdayName": "2. Spieltag",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 1,
|
||||||
|
"leagueMatchday": 2,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 3,
|
||||||
|
"numberOfMatches": 24,
|
||||||
|
"matchdayName": "3. Spieltag",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 1,
|
||||||
|
"leagueMatchday": 3,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 4,
|
||||||
|
"numberOfMatches": 16,
|
||||||
|
"matchdayName": "Sechzentelfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 1,
|
||||||
|
"leagueMatchday": 4,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2026-06-28 21:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 5,
|
||||||
|
"numberOfMatches": 8,
|
||||||
|
"matchdayName": "Achtelfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 1,
|
||||||
|
"leagueMatchday": 5,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2026-07-04 19:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 6,
|
||||||
|
"numberOfMatches": 4,
|
||||||
|
"matchdayName": "Viertelfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 1,
|
||||||
|
"leagueMatchday": 6,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2026-07-09 22:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 7,
|
||||||
|
"numberOfMatches": 2,
|
||||||
|
"matchdayName": "Halbfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 1,
|
||||||
|
"leagueMatchday": 7,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2026-07-14 21:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 8,
|
||||||
|
"numberOfMatches": 2,
|
||||||
|
"matchdayName": "Finale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 1,
|
||||||
|
"leagueMatchday": 8,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2026-07-18 23:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,434 @@
|
|||||||
|
{
|
||||||
|
"numberOfMatchdays": 39,
|
||||||
|
"matchesPerMatchday": 12,
|
||||||
|
"pointMode": 4,
|
||||||
|
"pointsTendency": 1,
|
||||||
|
"pointsDifference": 2,
|
||||||
|
"pointsDirectHit": 3,
|
||||||
|
"ko": 0,
|
||||||
|
"matchdayConfig": [
|
||||||
|
{
|
||||||
|
"TLWMatchday": 1,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 79,
|
||||||
|
"leagueMatchday": 1,
|
||||||
|
"showTable": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 2,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 79,
|
||||||
|
"leagueMatchday": 2,
|
||||||
|
"showTable": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 3,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 1,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 4,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 2,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 5,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 3,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 6,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 4,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 7,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 5,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 8,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 6,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 9,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 7,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 10,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 8,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 11,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 9,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 12,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 10,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 13,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 11,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 14,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 12,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 15,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 13,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 16,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 14,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 17,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 15,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 18,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2025-12-26 18:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 19,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 16,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 20,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 17,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 21,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 18,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 22,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 19,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 23,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 20,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 24,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 21,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 25,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 22,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 26,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 23,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 27,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 24,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 28,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 25,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 29,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 26,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 30,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2026-03-17 18:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 31,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 27,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 32,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 28,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 33,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 29,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 34,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2026-04-14 18:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 35,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 30,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 36,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 31,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 37,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 32,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 38,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 33,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 39,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 78,
|
||||||
|
"leagueMatchday": 34,
|
||||||
|
"showTable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
INSERT INTO `phpbb_footb_leagues` (`season`, `league`, `league_name`, `league_name_short`, `league_type`, `matchdays`, `matches_on_matchday`, `win_result`, `win_result_02`, `win_matchday`, `win_season`, `points_mode`, `points_result`, `points_tendency`, `points_diff`, `points_last`, `join_by_user`, `join_in_season`, `bet_in_time`, `rules_post_id`, `sort`, `bet_ko_type`, `bet_points`, `bet_type`) VALUES (2026, 1, '1. Tippliga Würzburg', '1TL', 1, 39, 12, '0', '0', '0', '0', 4, 3, 1, 2, 0, 0, 0, 0, 561, 0, 1, 0.00, 0);
|
||||||
|
INSERT INTO `phpbb_footb_leagues` (`season`, `league`, `league_name`, `league_name_short`, `league_type`, `matchdays`, `matches_on_matchday`, `win_result`, `win_result_02`, `win_matchday`, `win_season`, `points_mode`, `points_result`, `points_tendency`, `points_diff`, `points_last`, `join_by_user`, `join_in_season`, `bet_in_time`, `rules_post_id`, `sort`, `bet_ko_type`, `bet_points`, `bet_type`) VALUES (2026, 2, '2. Tippliga Würzburg', '2TL', 1, 39, 12, '0', '0', '0', '0', 4, 3, 1, 2, 0, 0, 0, 0, 561, 0, 1, 0.00, 0);
|
||||||
|
INSERT INTO `phpbb_footb_leagues` (`season`, `league`, `league_name`, `league_name_short`, `league_type`, `matchdays`, `matches_on_matchday`, `win_result`, `win_result_02`, `win_matchday`, `win_season`, `points_mode`, `points_result`, `points_tendency`, `points_diff`, `points_last`, `join_by_user`, `join_in_season`, `bet_in_time`, `rules_post_id`, `sort`, `bet_ko_type`, `bet_points`, `bet_type`) VALUES (2026, 45, 'Supercup', 'SC', 2, 1, 0, '0', '0', '0', '0', 4, 3, 1, 2, 0, 0, 0, 1, 561, 0, 1, 0.00, 0);
|
||||||
|
INSERT INTO `phpbb_footb_leagues` (`season`, `league`, `league_name`, `league_name_short`, `league_type`, `matchdays`, `matches_on_matchday`, `win_result`, `win_result_02`, `win_matchday`, `win_season`, `points_mode`, `points_result`, `points_tendency`, `points_diff`, `points_last`, `join_by_user`, `join_in_season`, `bet_in_time`, `rules_post_id`, `sort`, `bet_ko_type`, `bet_points`, `bet_type`) VALUES (2026, 47, 'Relegation', 'REL', 2, 1, 0, '0', '0', '0', '0', 4, 3, 1, 2, 0, 0, 0, 1, 561, 0, 1, 0.00, 1);
|
||||||
|
INSERT INTO `phpbb_footb_leagues` (`season`, `league`, `league_name`, `league_name_short`, `league_type`, `matchdays`, `matches_on_matchday`, `win_result`, `win_result_02`, `win_matchday`, `win_season`, `points_mode`, `points_result`, `points_tendency`, `points_diff`, `points_last`, `join_by_user`, `join_in_season`, `bet_in_time`, `rules_post_id`, `sort`, `bet_ko_type`, `bet_points`, `bet_type`) VALUES (2026, 48, 'WTL-Pokal', 'WTL', 2, 5, 0, '0', '0', '0', '0', 4, 3, 1, 2, 0, 0, 0, 0, 561, 0, 1, 0.00, 0);
|
||||||
|
INSERT INTO `phpbb_footb_leagues` (`season`, `league`, `league_name`, `league_name_short`, `league_type`, `matchdays`, `matches_on_matchday`, `win_result`, `win_result_02`, `win_matchday`, `win_season`, `points_mode`, `points_result`, `points_tendency`, `points_diff`, `points_last`, `join_by_user`, `join_in_season`, `bet_in_time`, `rules_post_id`, `sort`, `bet_ko_type`, `bet_points`, `bet_type`) VALUES (2026, 49, 'WM-Tippspiel', 'EM', 2, 7, 0, '0', '0', '0', '0', 4, 3, 1, 2, 0, 0, 0, 0, 0, 0, 1, 0.00, 1);
|
||||||
|
INSERT INTO `phpbb_footb_leagues` (`season`, `league`, `league_name`, `league_name_short`, `league_type`, `matchdays`, `matches_on_matchday`, `win_result`, `win_result_02`, `win_matchday`, `win_season`, `points_mode`, `points_result`, `points_tendency`, `points_diff`, `points_last`, `join_by_user`, `join_in_season`, `bet_in_time`, `rules_post_id`, `sort`, `bet_ko_type`, `bet_points`, `bet_type`) VALUES (2026, 51, '1. Tippliga Würzburg', '1TL', 1, 39, 7, '0', '0', '0', '0', 1, 0, 0, 0, 1, 0, 0, 0, 561, 0, 1, 0.00, 0);
|
||||||
|
INSERT INTO `phpbb_footb_leagues` (`season`, `league`, `league_name`, `league_name_short`, `league_type`, `matchdays`, `matches_on_matchday`, `win_result`, `win_result_02`, `win_matchday`, `win_season`, `points_mode`, `points_result`, `points_tendency`, `points_diff`, `points_last`, `join_by_user`, `join_in_season`, `bet_in_time`, `rules_post_id`, `sort`, `bet_ko_type`, `bet_points`, `bet_type`) VALUES (2026, 52, '2. Tippliga Würzburg', '2TL', 1, 39, 7, '0', '0', '0', '0', 1, 0, 0, 0, 1, 0, 0, 0, 561, 0, 1, 0.00, 0);
|
||||||
|
INSERT INTO `phpbb_footb_leagues` (`season`, `league`, `league_name`, `league_name_short`, `league_type`, `matchdays`, `matches_on_matchday`, `win_result`, `win_result_02`, `win_matchday`, `win_season`, `points_mode`, `points_result`, `points_tendency`, `points_diff`, `points_last`, `join_by_user`, `join_in_season`, `bet_in_time`, `rules_post_id`, `sort`, `bet_ko_type`, `bet_points`, `bet_type`) VALUES (2026, 95, 'Supercup', 'SC', 2, 2, 0, '0', '0', '0', '0', 1, 0, 0, 0, 1, 0, 0, 0, 561, 0, 1, 0.00, 0);
|
||||||
|
INSERT INTO `phpbb_footb_leagues` (`season`, `league`, `league_name`, `league_name_short`, `league_type`, `matchdays`, `matches_on_matchday`, `win_result`, `win_result_02`, `win_matchday`, `win_season`, `points_mode`, `points_result`, `points_tendency`, `points_diff`, `points_last`, `join_by_user`, `join_in_season`, `bet_in_time`, `rules_post_id`, `sort`, `bet_ko_type`, `bet_points`, `bet_type`) VALUES (2026, 97, 'Relegation', 'REL', 2, 1, 0, '0', '0', '0', '0', 1, 0, 0, 0, 1, 0, 0, 0, 561, 0, 1, 0.00, 0);
|
||||||
|
INSERT INTO `phpbb_footb_leagues` (`season`, `league`, `league_name`, `league_name_short`, `league_type`, `matchdays`, `matches_on_matchday`, `win_result`, `win_result_02`, `win_matchday`, `win_season`, `points_mode`, `points_result`, `points_tendency`, `points_diff`, `points_last`, `join_by_user`, `join_in_season`, `bet_in_time`, `rules_post_id`, `sort`, `bet_ko_type`, `bet_points`, `bet_type`) VALUES (2026, 98, 'WTL-Pokal', 'WTL', 2, 6, 0, '0', '0', '0', '0', 1, 0, 0, 0, 1, 0, 0, 0, 561, 0, 1, 0.00, 0);
|
||||||
@@ -0,0 +1,152 @@
|
|||||||
|
{
|
||||||
|
"numberOfMatchdays": 5,
|
||||||
|
"matchesPerMatchday": 0,
|
||||||
|
"pointMode": 4,
|
||||||
|
"pointsTendency": 1,
|
||||||
|
"pointsDifference": 2,
|
||||||
|
"pointsDirectHit": 3,
|
||||||
|
"ko": 1,
|
||||||
|
"matchdayConfig": [
|
||||||
|
{
|
||||||
|
"TLWMatchday": 1,
|
||||||
|
"matchdayName": "1. Runde",
|
||||||
|
"numberOfMatches": 32,
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 81,
|
||||||
|
"leagueMatchday": 1,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2025-08-15 18:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 2,
|
||||||
|
"numberOfMatches": 16,
|
||||||
|
"matchdayName": "Achtelfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 81,
|
||||||
|
"leagueMatchday": 2,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2025-10-28 18:00:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 3,
|
||||||
|
"numberOfMatches": 8,
|
||||||
|
"matchdayName": "Viertelfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 81,
|
||||||
|
"leagueMatchday": 3,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2025-12-02 18:30:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 4,
|
||||||
|
"numberOfMatches": 4,
|
||||||
|
"matchdayName": "Halbfinale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 81,
|
||||||
|
"leagueMatchday": 4,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "Placeholder",
|
||||||
|
"placeholderDatetime": "2026-02-03 18:30:00"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TLWMatchday": 5,
|
||||||
|
"numberOfMatches": 6,
|
||||||
|
"matchdayName": "Finale",
|
||||||
|
"matchesConfig": [
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 81,
|
||||||
|
"leagueMatchday": 5,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 81,
|
||||||
|
"leagueMatchday": 5,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 81,
|
||||||
|
"leagueMatchday": 6,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "AllMatchesOfMatchday",
|
||||||
|
"matchesLeague": 81,
|
||||||
|
"leagueMatchday": 6,
|
||||||
|
"showTable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2026-04-21 20:45:00",
|
||||||
|
"formulaHome": "D",
|
||||||
|
"formulaGuest": "D"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2026-04-21 20:45:00",
|
||||||
|
"formulaHome": "D",
|
||||||
|
"formulaGuest": "D"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2026-04-22 20:45:00",
|
||||||
|
"formulaHome": "D",
|
||||||
|
"formulaGuest": "D"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2026-04-22 20:45:00",
|
||||||
|
"formulaHome": "D",
|
||||||
|
"formulaGuest": "D"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2026-05-23 20:00:00",
|
||||||
|
"formulaHome": "W 61",
|
||||||
|
"formulaGuest": "W 63"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "PlaceholderSingleMatch",
|
||||||
|
"koMatch": true,
|
||||||
|
"placeholderDatetime": "2026-05-23 20:00:00",
|
||||||
|
"formulaHome": "W 62",
|
||||||
|
"formulaGuest": "W 64"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package de.jeyp91;
|
package de.jeyp91;
|
||||||
|
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class S3ProviderTest {
|
public class S3ProviderTest {
|
||||||
@@ -7,7 +8,7 @@ public class S3ProviderTest {
|
|||||||
@Test
|
@Test
|
||||||
public void getFixturesFromS3Test() {
|
public void getFixturesFromS3Test() {
|
||||||
S3Provider prov = new S3Provider();
|
S3Provider prov = new S3Provider();
|
||||||
String rounds = prov.getFixturesStringFromS3(1240);
|
JSONObject rounds = prov.getFixturesJSONFromS3(2026, 1240);
|
||||||
System.out.println(rounds);
|
System.out.println(rounds.toJSONString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import de.jeyp91.apifootball.APIFootballMatch;
|
|||||||
import de.jeyp91.teamidmatcher.TeamIDMatcher;
|
import de.jeyp91.teamidmatcher.TeamIDMatcher;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
import org.json.simple.parser.JSONParser;
|
import org.json.simple.parser.JSONParser;
|
||||||
import org.json.simple.parser.ParseException;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
@@ -11,7 +10,7 @@ import static org.junit.Assert.assertEquals;
|
|||||||
public class TeamIDMatcherTest {
|
public class TeamIDMatcherTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getOpenLigaDbIdFromTippligaIdTest() {
|
public void getAPIFootballIdFromTippligaIdTest() {
|
||||||
int apiFootballId;
|
int apiFootballId;
|
||||||
|
|
||||||
apiFootballId = TeamIDMatcher.getApiFootballIdFromTippligaId(505);
|
apiFootballId = TeamIDMatcher.getApiFootballIdFromTippligaId(505);
|
||||||
@@ -23,7 +22,7 @@ public class TeamIDMatcherTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getTippligaIdFromOpenLigaDbIdTest() throws Exception {
|
public void getTippligaIdFromAPIFootballIdTest() throws Exception {
|
||||||
int tlwId;
|
int tlwId;
|
||||||
String jsonMatch = "{" +
|
String jsonMatch = "{" +
|
||||||
"\"fixture_id\":1," +
|
"\"fixture_id\":1," +
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package de.jeyp91.apifootball;
|
package de.jeyp91.apifootball;
|
||||||
|
|
||||||
import de.jeyp91.openligadb.OpenLigaDBConnector;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package de.jeyp91.apifootball;
|
||||||
|
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static de.jeyp91.apifootball.APIFootballConnector.stringToJSONObject;
|
||||||
|
|
||||||
|
public class APIFootballMatchTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void withExtratime() throws Exception {
|
||||||
|
String matchString = "{\"fixture_id\":958530,\"league_id\":4303,\"league\":{\"name\":\"DFB Pokal\",\"country\":\"Germany\",\"logo\":\"https:\\/\\/media-3.api-sports.io\\/football\\/leagues\\/81.png\",\"flag\":\"https:\\/\\/media-1.api-sports.io\\/flags\\/de.svg\"},\"event_date\":\"2022-10-19T18:00:00+02:00\",\"event_timestamp\":1666195200,\"firstHalfStart\":1666195200,\"secondHalfStart\":1666198800,\"round\":\"2nd Round\",\"status\":\"Match Finished\",\"statusShort\":\"PEN\",\"elapsed\":120,\"venue\":\"Home Deluxe Arena\",\"referee\":\"Frank Willenborg, Germany\",\"homeTeam\":{\"team_id\":185,\"team_name\":\"SC Paderborn 07\",\"logo\":\"https:\\/\\/media-2.api-sports.io\\/football\\/teams\\/185.png\"},\"awayTeam\":{\"team_id\":162,\"team_name\":\"Werder Bremen\",\"logo\":\"https:\\/\\/media-3.api-sports.io\\/football\\/teams\\/162.png\"},\"goalsHomeTeam\":2,\"goalsAwayTeam\":2,\"score\":{\"halftime\":\"2-0\",\"fulltime\":\"2-2\",\"extratime\":\"0-0\",\"penalty\":\"5-4\"}}";
|
||||||
|
JSONObject matchJson = stringToJSONObject(matchString);
|
||||||
|
APIFootballMatch match = new APIFootballMatch(matchJson, 2023);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void withoutExtratime() throws Exception {
|
||||||
|
String matchString = "{\"fixture_id\":958530,\"league_id\":4303,\"league\":{\"name\":\"DFB Pokal\",\"country\":\"Germany\",\"logo\":\"https:\\/\\/media-3.api-sports.io\\/football\\/leagues\\/81.png\",\"flag\":\"https:\\/\\/media-1.api-sports.io\\/flags\\/de.svg\"},\"event_date\":\"2022-10-19T18:00:00+02:00\",\"event_timestamp\":1666195200,\"firstHalfStart\":1666195200,\"secondHalfStart\":1666198800,\"round\":\"2nd Round\",\"status\":\"Match Finished\",\"statusShort\":\"PEN\",\"elapsed\":120,\"venue\":\"Home Deluxe Arena\",\"referee\":\"Frank Willenborg, Germany\",\"homeTeam\":{\"team_id\":185,\"team_name\":\"SC Paderborn 07\",\"logo\":\"https:\\/\\/media-2.api-sports.io\\/football\\/teams\\/185.png\"},\"awayTeam\":{\"team_id\":162,\"team_name\":\"Werder Bremen\",\"logo\":\"https:\\/\\/media-3.api-sports.io\\/football\\/teams\\/162.png\"},\"goalsHomeTeam\":2,\"goalsAwayTeam\":2,\"score\":{\"halftime\":\"2-0\",\"fulltime\":\"2-2\",\"extratime\":null,\"penalty\":null}}";
|
||||||
|
JSONObject matchJson = stringToJSONObject(matchString);
|
||||||
|
APIFootballMatch match = new APIFootballMatch(matchJson, 2023);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,28 +4,30 @@ import org.junit.Test;
|
|||||||
|
|
||||||
public class APIFootballUpdaterTest {
|
public class APIFootballUpdaterTest {
|
||||||
|
|
||||||
|
int season = 2026;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void checkErrorsTest() {
|
public void checkErrorsTest() {
|
||||||
String exceededLimitDayError = "{\"api\":{\"results\":0,\"error\":\"You have reached the request limit for the day\"}}";
|
String rateLimitError = "{\"results\":0,\"errors\":{\"rateLimit\":\"Too many requests. Your rate limit is 10 requests per minute.\"}}";
|
||||||
APIFootballUpdater updater = new APIFootballUpdater();
|
APIFootballUpdater updater = new APIFootballUpdater();
|
||||||
try {
|
try {
|
||||||
updater.checkErrors("https://test.url/api", exceededLimitDayError);
|
updater.checkErrors("https://test.url/api", rateLimitError);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
System.out.println(e.getMessage());
|
System.out.println(e.getMessage());
|
||||||
assert e.getMessage().equals("https://test.url/api returned error: 'You have reached the request limit for the day'");
|
assert e.getMessage().equals("https://test.url/api returned error: '{\"rateLimit\":\"Too many requests. Your rate limit is 10 requests per minute.\"}'");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void updateFixturesTest() {
|
public void updateFixturesTest() {
|
||||||
APIFootballUpdater updater = new APIFootballUpdater();
|
APIFootballUpdater updater = new APIFootballUpdater();
|
||||||
// updater.updateFixtures(1240);
|
updater.updateFixtures(season, 218);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void updateAllFixturesTest() {
|
public void updateAllFixturesTest() {
|
||||||
APIFootballUpdater updater = new APIFootballUpdater();
|
APIFootballUpdater updater = new APIFootballUpdater();
|
||||||
// updater.updateAllFixtures();
|
updater.updateAllFixtures(season);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -37,6 +39,6 @@ public class APIFootballUpdaterTest {
|
|||||||
@Test
|
@Test
|
||||||
public void updateAllRoundsTest() {
|
public void updateAllRoundsTest() {
|
||||||
APIFootballUpdater updater = new APIFootballUpdater();
|
APIFootballUpdater updater = new APIFootballUpdater();
|
||||||
// updater.updateAllRounds();
|
updater.updateAllRounds(season);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import de.jeyp91.tippliga.TLWMatchday;
|
|||||||
import de.jeyp91.tippliga.TLWMatchdaysCreator;
|
import de.jeyp91.tippliga.TLWMatchdaysCreator;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -34,7 +35,15 @@ public class TippligaGoogleEventManagerTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void createOrUpdateEventsForMatchdayTippligaTest() {
|
public void createOrUpdateEventsForMatchdayTippligaTest() {
|
||||||
TLWMatchdaysCreator creator = new TLWMatchdaysCreator(2022, 1, "Tippliga");
|
TLWMatchdaysCreator creator = new TLWMatchdaysCreator(2024, 1, "Tippliga");
|
||||||
|
ArrayList<TLWMatchday> matchdays = creator.getMatchdays();
|
||||||
|
|
||||||
|
matchdays.forEach(TippligaGoogleEventManager::createOrUpdateEventsForMatchday);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void createOrUpdateEventsForMatchdaySupercupTest() {
|
||||||
|
TLWMatchdaysCreator creator = new TLWMatchdaysCreator(2024, 45, "Supercup");
|
||||||
ArrayList<TLWMatchday> matchdays = creator.getMatchdays();
|
ArrayList<TLWMatchday> matchdays = creator.getMatchdays();
|
||||||
|
|
||||||
matchdays.forEach(TippligaGoogleEventManager::createOrUpdateEventsForMatchday);
|
matchdays.forEach(TippligaGoogleEventManager::createOrUpdateEventsForMatchday);
|
||||||
@@ -44,21 +53,23 @@ public class TippligaGoogleEventManagerTest {
|
|||||||
public void findEventTest() {
|
public void findEventTest() {
|
||||||
List<Event> allEvents = getAllEvents(2023);
|
List<Event> allEvents = getAllEvents(2023);
|
||||||
Event event = findEvent(allEvents, 2023, 1, 1, 2);
|
Event event = findEvent(allEvents, 2023, 1, 1, 2);
|
||||||
assertEquals(event.getStart(), 2);
|
assert event != null;
|
||||||
|
assertEquals(event.getStart().size(), 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void updateEventTest() {
|
public void updateEventTest() {
|
||||||
List<Event> allEvents = getAllEvents(2023);
|
List<Event> allEvents = getAllEvents(2023);
|
||||||
Event event = findEvent(allEvents, 2023, 1, 1, 1);
|
Event event = findEvent(allEvents, 2023, 1, 1, 1);
|
||||||
TLWMatchday matchday = new TLWMatchday(2023, 1, 1, 0, "2022-08-05 20:30:00", "", "", "1. Spieltag", 12);
|
TLWMatchday matchday = new TLWMatchday(2023, 1, 1, 0, "2022-08-06 20:30:00", "", "", "1. Spieltag", 12);
|
||||||
|
assert event != null;
|
||||||
updateEvent(event, matchday, matchday.getDeliveryDate(), 1);
|
updateEvent(event, matchday, matchday.getDeliveryDate(), 1);
|
||||||
assertEquals(event.size(), 18);
|
assertEquals(event.size(), 18);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void createOrUpdateEventsForMatchdayWTLPokalTest() {
|
public void createOrUpdateEventsForMatchdayWTLPokalTest() {
|
||||||
TLWMatchdaysCreator creator = new TLWMatchdaysCreator(2022, 48, "WTL-Pokal");
|
TLWMatchdaysCreator creator = new TLWMatchdaysCreator(2024, 48, "WTL-Pokal");
|
||||||
ArrayList<TLWMatchday> matchdays = creator.getMatchdays();
|
ArrayList<TLWMatchday> matchdays = creator.getMatchdays();
|
||||||
// createOrUpdateEventsForMatchday(matchdays.get(4));
|
// createOrUpdateEventsForMatchday(matchdays.get(4));
|
||||||
|
|
||||||
@@ -67,7 +78,7 @@ public class TippligaGoogleEventManagerTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void createOrUpdateEventTest() {
|
public void createOrUpdateEventTest() {
|
||||||
TLWMatchday matchday = new TLWMatchday(2023, 1, 1, 0, "2022-08-06 20:30:00", "", "", "1. Spieltag", 12);
|
TLWMatchday matchday = new TLWMatchday(2023, 1, 1, 0, "2022-08-05 20:30:00", "", "", "1. Spieltag", 12);
|
||||||
createOrUpdateEvent(matchday, matchday.getDeliveryDate(), 1);
|
createOrUpdateEvent(matchday, matchday.getDeliveryDate(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,4 +105,9 @@ public class TippligaGoogleEventManagerTest {
|
|||||||
TippligaGoogleEventManager.deleteEvent(tlwMatchday, 3);
|
TippligaGoogleEventManager.deleteEvent(tlwMatchday, 3);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void deleteAllEventsTest() throws IOException {
|
||||||
|
TippligaGoogleEventManager.deleteAllEvents(2023);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,13 @@
|
|||||||
package de.jeyp91.tippliga;
|
package de.jeyp91.tippliga;
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import java.text.ParseException;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public class TLWMatchdaysCreatorTest {
|
public class TLWMatchdaysCreatorTest {
|
||||||
|
|
||||||
int season = 2023;
|
int season = 2026;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getMatchdaysTippligaTest() {
|
public void getMatchdaysTippligaTest() {
|
||||||
@@ -76,6 +74,22 @@ public class TLWMatchdaysCreatorTest {
|
|||||||
System.out.println(sql);
|
System.out.println(sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMatchdaysSupercup45SqlTest() {
|
||||||
|
|
||||||
|
TLWMatchdaysCreator matchdaysCreator = new TLWMatchdaysCreator(season, 45, "Supercup");
|
||||||
|
String sql = matchdaysCreator.getMatchdaysSQL();
|
||||||
|
System.out.println(sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMatchdaysSupercup95SqlTest() {
|
||||||
|
|
||||||
|
TLWMatchdaysCreator matchdaysCreator = new TLWMatchdaysCreator(season, 95, "Supercup");
|
||||||
|
String sql = matchdaysCreator.getMatchdaysSQL();
|
||||||
|
System.out.println(sql);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getMatchdaysEMTippspielSqlTest() {
|
public void getMatchdaysEMTippspielSqlTest() {
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import static org.junit.Assert.assertEquals;
|
|||||||
|
|
||||||
public class TLWMatchesCreatorFootballTest {
|
public class TLWMatchesCreatorFootballTest {
|
||||||
|
|
||||||
int season = 2023;
|
int season = 2026;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getMatchesTest() {
|
public void getMatchesTest() {
|
||||||
@@ -41,6 +41,13 @@ public class TLWMatchesCreatorFootballTest {
|
|||||||
System.out.println(sql);
|
System.out.println(sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMatchesSupercupSqlTest() {
|
||||||
|
TLWMatchesCreatorFootball creator = new TLWMatchesCreatorFootball(season, 45, "Supercup");
|
||||||
|
String sql = creator.getSQLInsertString();
|
||||||
|
System.out.println(sql);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getMatchesEMTippspielSqlTest() {
|
public void getMatchesEMTippspielSqlTest() {
|
||||||
TLWMatchesCreatorFootball creator = new TLWMatchesCreatorFootball(2021, 49, "EM-Tippspiel");
|
TLWMatchesCreatorFootball creator = new TLWMatchesCreatorFootball(2021, 49, "EM-Tippspiel");
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import org.junit.Test;
|
|||||||
|
|
||||||
public class TLWMatchesCreatorTipperPokalTest {
|
public class TLWMatchesCreatorTipperPokalTest {
|
||||||
|
|
||||||
int season = 2023;
|
int season = 2026;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getMatchesWTLPokalTest() {
|
public void getMatchesWTLPokalTest() {
|
||||||
@@ -15,4 +15,14 @@ public class TLWMatchesCreatorTipperPokalTest {
|
|||||||
String sql = creator.getSQLInsertString();
|
String sql = creator.getSQLInsertString();
|
||||||
System.out.println(sql);
|
System.out.println(sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getMatchesSupercupTest() {
|
||||||
|
TLWMatchdaysCreator matchdaysCreator = new TLWMatchdaysCreator(season, 45, "Supercup");
|
||||||
|
|
||||||
|
TLWMatchesCreatorTipperPokal creator = new TLWMatchesCreatorTipperPokal(season, 95, "Supercup Tipper", matchdaysCreator.getMatchdays());
|
||||||
|
|
||||||
|
String sql = creator.getSQLInsertString();
|
||||||
|
System.out.println(sql);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,13 +2,9 @@ package de.jeyp91.tippliga;
|
|||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.text.ParseException;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
|
|
||||||
public class TLWMatchesCreatorTipperTest {
|
public class TLWMatchesCreatorTipperTest {
|
||||||
|
|
||||||
int season = 2023;
|
int season = 2026;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getMatchesTippliga1Test() {
|
public void getMatchesTippliga1Test() {
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package de.jeyp91.tippliga;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class TLWMatchesResultsUpdaterTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void updateResultsTest1() {
|
||||||
|
TLWMatchesResultsUpdater updater = new TLWMatchesResultsUpdater(2024, 48, "WTL-Pokal");
|
||||||
|
// updater.applyUpdates();
|
||||||
|
System.out.println(updater.getBeautifulInfo());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,30 +4,32 @@ import org.junit.Test;
|
|||||||
|
|
||||||
public class TLWMatchesUpdaterFootballTest {
|
public class TLWMatchesUpdaterFootballTest {
|
||||||
|
|
||||||
|
int season = 2026;
|
||||||
@Test
|
@Test
|
||||||
public void getUpdateSqlTest1() {
|
public void getUpdateSqlTest1() {
|
||||||
TLWMatchesUpdaterFootball updater = new TLWMatchesUpdaterFootball(2022, 1, "Tippliga");
|
TLWMatchesUpdaterFootball updater = new TLWMatchesUpdaterFootball(season, 1, "Tippliga");
|
||||||
String sql = updater.getUpdateSQL();
|
String sql = updater.getUpdateSQL();
|
||||||
|
String beatifulInfo = updater.getBeautifulInfo();
|
||||||
|
|
||||||
// System.out.println(sql);
|
System.out.println(sql);
|
||||||
// System.out.println(updater.getBeautifulInfo());
|
// System.out.println(beatifulInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getUpdateSqlTest2() {
|
public void getUpdateSqlTest2() {
|
||||||
TLWMatchesUpdaterFootball updater = new TLWMatchesUpdaterFootball(2021, 2, "Tippliga");
|
TLWMatchesUpdaterFootball updater = new TLWMatchesUpdaterFootball(season, 2, "Tippliga");
|
||||||
String sql = updater.getUpdateSQL();
|
String sql = updater.getUpdateSQL();
|
||||||
|
|
||||||
// System.out.println(sql);
|
System.out.println(sql);
|
||||||
// System.out.println(updater.getBeautifulInfo());
|
// System.out.println(updater.getBeautifulInfo());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getUpdateSqlTest48() {
|
public void getUpdateSqlTest48() {
|
||||||
TLWMatchesUpdaterFootball updater = new TLWMatchesUpdaterFootball(2021, 48, "WTL-Pokal");
|
TLWMatchesUpdaterFootball updater = new TLWMatchesUpdaterFootball(season, 48, "WTL-Pokal");
|
||||||
String sql = updater.getUpdateSQL();
|
String sql = updater.getUpdateSQL();
|
||||||
|
|
||||||
// System.out.println(sql);
|
System.out.println(sql);
|
||||||
// System.out.println(updater.getBeautifulInfo());
|
// System.out.println(updater.getBeautifulInfo());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,12 @@
|
|||||||
package de.jeyp91.tippliga;
|
package de.jeyp91.tippliga;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.text.ParseException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
|
|
||||||
public class TLWTeamsCreatorTest {
|
public class TLWTeamsCreatorTest {
|
||||||
|
|
||||||
int season = 2023;
|
int season = 2026;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getTeamsTippligaFootball1Test() {
|
public void getTeamsTippligaFootball1Test() {
|
||||||
@@ -42,17 +39,27 @@ public class TLWTeamsCreatorTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getTeamsTippligaEMTippspielTest() {
|
public void getTeamsTippligaSupercupTest() {
|
||||||
TLWMatchesCreatorFootball matchesCreator = new TLWMatchesCreatorFootball(2021, 49, "EM-Tippspiel");
|
TLWMatchesCreatorFootball matchesCreator = new TLWMatchesCreatorFootball(season, 45, "Supercup");
|
||||||
ArrayList<TLWMatch> matches = matchesCreator.getMatches();
|
ArrayList<TLWMatch> matches = matchesCreator.getMatches();
|
||||||
|
|
||||||
TLWTeamsCreator teamCreator = new TLWTeamsCreator(2021, 49, matches);
|
TLWTeamsCreator teamCreator = new TLWTeamsCreator(season, 45, matches);
|
||||||
String sql = teamCreator.getSql();
|
String sql = teamCreator.getSql();
|
||||||
System.out.println(sql);
|
System.out.println(sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getTeamsTipper1TLTest() throws ParseException {
|
public void getTeamsTippligaEMTippspielTest() {
|
||||||
|
TLWMatchesCreatorFootball matchesCreator = new TLWMatchesCreatorFootball(2021, 49, "EM-Tippspiel");
|
||||||
|
ArrayList<TLWMatch> matches = matchesCreator.getMatches();
|
||||||
|
|
||||||
|
TLWTeamsCreator teamCreator = new TLWTeamsCreator(season, 49, matches);
|
||||||
|
String sql = teamCreator.getSql();
|
||||||
|
System.out.println(sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getTeamsTipper1TLTest() {
|
||||||
TLWMatchdaysCreator matchdaysCreator = new TLWMatchdaysCreator(season, 1, "Tippliga");
|
TLWMatchdaysCreator matchdaysCreator = new TLWMatchdaysCreator(season, 1, "Tippliga");
|
||||||
|
|
||||||
TLWMatchesCreatorTipperLeague creator = new TLWMatchesCreatorTipperLeague(season, 51, "1. Tippliga Tipper", matchdaysCreator.getMatchdays());
|
TLWMatchesCreatorTipperLeague creator = new TLWMatchesCreatorTipperLeague(season, 51, "1. Tippliga Tipper", matchdaysCreator.getMatchdays());
|
||||||
@@ -65,7 +72,7 @@ public class TLWTeamsCreatorTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getTeamsTipper2TLTest() throws ParseException {
|
public void getTeamsTipper2TLTest() {
|
||||||
TLWMatchdaysCreator matchdaysCreator = new TLWMatchdaysCreator(season, 2, "Tippliga");
|
TLWMatchdaysCreator matchdaysCreator = new TLWMatchdaysCreator(season, 2, "Tippliga");
|
||||||
|
|
||||||
TLWMatchesCreatorTipperLeague creator = new TLWMatchesCreatorTipperLeague(season, 52, "2. Tippliga Tipper", matchdaysCreator.getMatchdays());
|
TLWMatchesCreatorTipperLeague creator = new TLWMatchesCreatorTipperLeague(season, 52, "2. Tippliga Tipper", matchdaysCreator.getMatchdays());
|
||||||
@@ -78,7 +85,7 @@ public class TLWTeamsCreatorTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getTeamsTipperWTLTest() throws ParseException {
|
public void getTeamsTipperWTLTest() {
|
||||||
TLWMatchdaysCreator matchdaysCreator = new TLWMatchdaysCreator(season, 48, "WTL-Pokal");
|
TLWMatchdaysCreator matchdaysCreator = new TLWMatchdaysCreator(season, 48, "WTL-Pokal");
|
||||||
|
|
||||||
TLWMatchesCreatorTipperPokal creator = new TLWMatchesCreatorTipperPokal(season, 98, "WTL-Pokal Tipper", matchdaysCreator.getMatchdays());
|
TLWMatchesCreatorTipperPokal creator = new TLWMatchesCreatorTipperPokal(season, 98, "WTL-Pokal Tipper", matchdaysCreator.getMatchdays());
|
||||||
@@ -89,4 +96,18 @@ public class TLWTeamsCreatorTest {
|
|||||||
String sql = teamCreator.getSql();
|
String sql = teamCreator.getSql();
|
||||||
System.out.println(sql);
|
System.out.println(sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getTeamsTipperSupercupTest() {
|
||||||
|
int leagueId = 45;
|
||||||
|
TLWMatchdaysCreator matchdaysCreator = new TLWMatchdaysCreator(season, leagueId, "Supercup");
|
||||||
|
|
||||||
|
TLWMatchesCreatorTipperPokal creator = new TLWMatchesCreatorTipperPokal(season, leagueId + 50, "Supercup Tipper", matchdaysCreator.getMatchdays());
|
||||||
|
|
||||||
|
ArrayList<TLWMatch> matches = creator.getMatches();
|
||||||
|
|
||||||
|
TLWTeamsCreator teamCreator = new TLWTeamsCreator(season, leagueId + 50, matches);
|
||||||
|
String sql = teamCreator.getSql();
|
||||||
|
System.out.println(sql);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,41 +1,40 @@
|
|||||||
package de.jeyp91.tippligaforum;
|
package de.jeyp91.tippligaforum;
|
||||||
|
|
||||||
import de.jeyp91.tippligaforum.MatchesListCreator;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class MatchesListCreatorTest {
|
public class MatchesListCreatorTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getMatchesTest2664() {
|
public void getMatchesTest2664() {
|
||||||
MatchesListCreator creator = new MatchesListCreator(2664);
|
MatchesListCreator creator = new MatchesListCreator(2026, 2664);
|
||||||
String matches = creator.getMatchesBeautiful();
|
String matches = creator.getMatchesBeautiful();
|
||||||
// System.out.println(matches);
|
// System.out.println(matches);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getMatchesTest2743() {
|
public void getMatchesTest2743() {
|
||||||
MatchesListCreator creator = new MatchesListCreator(2743);
|
MatchesListCreator creator = new MatchesListCreator(2026, 2743);
|
||||||
String matches = creator.getMatchesBeautiful();
|
String matches = creator.getMatchesBeautiful();
|
||||||
System.out.println(matches);
|
System.out.println(matches);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getMatchesTest2755() {
|
public void getMatchesTest2755() {
|
||||||
MatchesListCreator creator = new MatchesListCreator(2755);
|
MatchesListCreator creator = new MatchesListCreator(2026, 2755);
|
||||||
String matches = creator.getMatchesBeautiful();
|
String matches = creator.getMatchesBeautiful();
|
||||||
// System.out.println(matches);
|
// System.out.println(matches);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getMatchesTest2790() {
|
public void getMatchesTest2790() {
|
||||||
MatchesListCreator creator = new MatchesListCreator(2790);
|
MatchesListCreator creator = new MatchesListCreator(2026, 2790);
|
||||||
String matches = creator.getMatchesBeautiful();
|
String matches = creator.getMatchesBeautiful();
|
||||||
// System.out.println(matches);
|
// System.out.println(matches);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getMatchesTest2795() {
|
public void getMatchesTest2795() {
|
||||||
MatchesListCreator creator = new MatchesListCreator(2795);
|
MatchesListCreator creator = new MatchesListCreator(2026, 2795);
|
||||||
String matches = creator.getMatchesBeautiful();
|
String matches = creator.getMatchesBeautiful();
|
||||||
// System.out.println(matches);
|
// System.out.println(matches);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,13 +6,13 @@ public class MatchesListForumUpdaterTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void updateAllLeaguesTest() {
|
public void updateAllLeaguesTest() {
|
||||||
MatchesListForumUpdater updater = new MatchesListForumUpdater(2022);
|
MatchesListForumUpdater updater = new MatchesListForumUpdater();
|
||||||
// updater.updateAllLeagues(2022);
|
updater.updateAllLeagues(2026);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void updateLeagueTest() {
|
public void updateLeagueTest() {
|
||||||
MatchesListForumUpdater updater = new MatchesListForumUpdater(2022);
|
MatchesListForumUpdater updater = new MatchesListForumUpdater();
|
||||||
updater.updateLeague(2022, 3509);
|
updater.updateLeague(2026, 218);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package de.jeyp91.tippligaforum;
|
||||||
|
|
||||||
|
import de.jeyp91.tippliga.TLWMatch;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class TippligaWebsiteConnectorTest {
|
||||||
|
@Test
|
||||||
|
public void updateResultsAdminTest() throws IOException {
|
||||||
|
TippligaWebsiteConnector con = new TippligaWebsiteConnector();
|
||||||
|
List<TLWMatch> matches = new ArrayList<>();
|
||||||
|
TLWMatch match = new TLWMatch(2023, 48, 5, 61, "0", 3, 0);
|
||||||
|
match.setGoalsHome(1);
|
||||||
|
match.setGoalsGuest(5);
|
||||||
|
matches.add(match);
|
||||||
|
con.updateResultsAdmin(2023, 48, 5, matches);
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
Reference in New Issue
Block a user