Add config for 2027

This commit is contained in:
2026-07-27 23:52:07 +02:00
parent 04dca24513
commit 3461b61e27
27 changed files with 1046 additions and 100 deletions
+6 -1
View File
@@ -10,6 +10,7 @@ import de.jeyp91.tippliga.TLWMatchesResultsUpdater;
import de.jeyp91.tippliga.TLWMatchesUpdaterFootball;
import de.jeyp91.tippliga.TLWTeamsUpdater;
import de.jeyp91.tippligaforum.MatchesListForumUpdater;
import de.jeyp91.tippligaforum.SeasonForumPostsCreator;
import de.jeyp91.tippligaforum.TippligaConfigProvider;
import de.jeyp91.tippligaforum.TippligaSQLConnector;
import de.jeyp91.whatsapp.WhatsAppNotifier;
@@ -69,6 +70,10 @@ public class App {
MatchesListForumUpdater matchesListForumUpdater = new MatchesListForumUpdater();
matchesListForumUpdater.updateAllLeagues(season);
}
case "SeasonPreparation" -> {
SeasonForumPostsCreator creator = new SeasonForumPostsCreator(season);
creator.createAllPosts();
}
case "PostChecksum" -> {
TippligaConfigProvider configProvider = new TippligaConfigProvider(season);
String checksum = configProvider.getChecksumOfConfigPost(configFile);
@@ -96,7 +101,7 @@ public class App {
parser.addArgument("-m", "--mode")
.dest("mode")
.choices("MatchdaysUpdater", "MatchesCreatorFootball", "MatchesUpdaterFootball", "MatchesResultsUpdater", "TeamsUpdater", "APIFootballUpdater", "MatchesListGistUpdater", "PostChecksum", "WhatsAppNotifier")
.choices("MatchdaysUpdater", "MatchesCreatorFootball", "MatchesUpdaterFootball", "MatchesResultsUpdater", "TeamsUpdater", "APIFootballUpdater", "MatchesListGistUpdater", "PostChecksum", "WhatsAppNotifier", "SeasonPreparation")
.help("")
.required(true)
.type(String.class);
@@ -0,0 +1,137 @@
package de.jeyp91.tippligaforum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
public class SeasonForumPostsCreator {
private static final Logger logger = LoggerFactory.getLogger(SeasonForumPostsCreator.class);
private static final String EMPTY_POST_CONTENT = "[code][/code]";
private static final String[] CONFIG_POSTS = {
"Supercup Tipper",
"WTL-Pokal Tipper",
"2. Tippliga Tipper",
"1. Tippliga Tipper",
"Relegation",
"Supercup",
"WTL-Pokal",
"Tippliga"
};
private static final String[] MATCH_LIST_POSTS = {
"World UEFA Super Cup",
"World UEFA Europa Conference League",
"World UEFA Europa League",
"World UEFA Champions League",
"Austria Bundesliga",
"Portugal Primeira Liga",
"Netherlands Eredivisie",
"Turkey Süper Lig",
"France Ligue 1",
"Italy Serie A",
"Spain La Liga",
"England Premier League",
"Germany Super Cup",
"Germany Frauen Bundesliga",
"Germany U19 Bundesliga",
"Germany Regionalliga - SudWest",
"Germany Regionalliga - Bayern",
"Germany 3. Liga",
"Germany 2. Bundesliga",
"Germany Bundesliga",
"Germany DFB Pokal"
};
private final int season;
private final TippligaWebsiteConnector connector;
private final TippligaSQLConnector sqlConnector;
public SeasonForumPostsCreator(int season) {
this.season = season;
try {
this.connector = new TippligaWebsiteConnector();
} catch (IOException e) {
throw new RuntimeException(e);
}
this.sqlConnector = TippligaSQLConnector.getInstance();
}
public void createAllPosts() {
Integer adminForumId = sqlConnector.getForumId("Admin");
if (adminForumId == null) {
logger.error("Forum 'Admin' not found. Aborting.");
return;
}
Integer tippligaConfigForumId = sqlConnector.getForumId("Tippliga-Config", adminForumId);
if (tippligaConfigForumId == null) {
logger.error("Forum 'Tippliga-Config' not found. Aborting.");
return;
}
Integer seasonForumId = sqlConnector.getForumId(String.valueOf(season), tippligaConfigForumId);
if (seasonForumId == null) {
logger.error("Forum '" + season + "' not found under Tippliga-Config. Aborting.");
return;
}
Integer ligenForumId = sqlConnector.getForumId("Ligen", seasonForumId);
if (ligenForumId == null) {
logger.error("Forum 'Ligen' not found under " + season + ". Aborting.");
return;
}
createConfigPosts(seasonForumId);
createMatchListPosts(ligenForumId);
}
private void createConfigPosts(int seasonForumId) {
logger.info("Creating config posts in forum " + season + "...");
for (String subject : CONFIG_POSTS) {
if (postExists(seasonForumId, subject)) {
logger.info("Config post '" + subject + "' already exists. Skipping.");
continue;
}
boolean success = connector.createPost(seasonForumId, subject, EMPTY_POST_CONTENT);
if (success) {
logger.info("Created config post: " + subject);
} else {
logger.error("Failed to create config post: " + subject);
}
}
}
private void createMatchListPosts(int ligenForumId) {
logger.info("Creating match list posts in " + season + " > Ligen...");
for (String subject : MATCH_LIST_POSTS) {
if (postExists(ligenForumId, subject)) {
logger.info("Match list post '" + subject + "' already exists. Skipping.");
continue;
}
boolean success = connector.createPost(ligenForumId, subject, EMPTY_POST_CONTENT);
if (success) {
logger.info("Created match list post: " + subject);
} else {
logger.error("Failed to create match list post: " + subject);
}
}
}
private boolean postExists(int forumId, String subject) {
String query = "SELECT COUNT(*) FROM phpbb_posts WHERE forum_id = " + forumId + " AND post_subject = '" + subject + "'";
ResultSet rset = sqlConnector.executeQuery(query);
try {
if (rset != null && rset.next()) {
return rset.getInt(1) > 0;
}
} catch (SQLException e) {
logger.error("Error checking if post exists", e);
}
return false;
}
}
@@ -218,6 +218,69 @@ public class TippligaWebsiteConnector {
this.lastFormToken = matcher.group(2);
}
public boolean createPost(int forumId, String subject, String message) {
String url = "https://tippliga-wuerzburg.de/posting.php?mode=post&f=" + forumId;
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) {
logger.error("Failed to fetch posting form", e);
return false;
}
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);
if (!matcher.find()) {
logger.error("Could not find CSRF tokens in posting form for forum " + forumId);
return false;
}
String creationTime = matcher.group(1);
String formToken = matcher.group(2);
Map<String, String> postParameters = new HashMap<>();
postParameters.put("subject", subject);
postParameters.put("message", message);
postParameters.put("creation_time", creationTime);
postParameters.put("form_token", formToken);
postParameters.put("post", "Absenden");
postParameters.put("attach_sig", "1");
postParameters.put("enable_bbcode", "1");
postParameters.put("enable_smilies", "1");
postParameters.put("enable_magic_url", "1");
String postForm = postParameters.entrySet()
.stream()
.map(e -> e.getKey() + "=" + URLEncoder.encode(e.getValue(), StandardCharsets.UTF_8))
.collect(Collectors.joining("&"));
HttpRequest postReq = HttpRequest.newBuilder()
.uri(URI.create(url))
.headers("Content-Type", "application/x-www-form-urlencoded")
.POST(HttpRequest.BodyPublishers.ofString(postForm))
.build();
try {
TimeUnit.SECONDS.sleep(1);
HttpResponse<String> response = client.send(postReq, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 302) {
logger.info("Created post '" + subject + "' in forum " + forumId);
return true;
}
logger.error("Failed to create post '" + subject + "' in forum " + forumId + ". Status: " + response.statusCode());
return false;
} catch (IOException | InterruptedException e) {
logger.error("Failed to create post", e);
return false;
}
}
private String getSidFromCookie() {
HttpCookie sidCookie = cookieStore.getCookies().get(2);
String sid = sidCookie.getValue();