Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#2063 download missing world details #2070

Merged
merged 4 commits into from
May 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 13 additions & 4 deletions src/main/java/core/db/DBManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ public void disconnect() {
/**
* connect to the database
*/
private void connect() throws Exception {
private void connect() {
User current_user = UserManager.instance().getCurrentUser();
if (connectionManager != null) {
connectionManager.connect(current_user.getDbURL(), current_user.getDbUsername(), current_user.getDbPwd(), UserManager.instance().getDriver());
Expand Down Expand Up @@ -1560,7 +1560,6 @@ public void setTransferType(TransferType type) {
*
* @return the world detail league [ ]
*/
// WorldDetail
public List<WorldDetailLeague> getAllWorldDetailLeagues() {
return ((WorldDetailsTable) getTable(WorldDetailsTable.TABLENAME))
.getAllWorldDetailLeagues();
Expand All @@ -1571,14 +1570,24 @@ public List<WorldDetailLeague> getAllWorldDetailLeagues() {
*
* @param leagues the leagues
*/
public void saveWorldDetailLeagues(List<WorldDetailLeague> leagues) {
public void storeWorldDetailLeagues(List<WorldDetailLeague> leagues) {
WorldDetailsTable table = (WorldDetailsTable) getTable(WorldDetailsTable.TABLENAME);
table.truncateTable();
for (WorldDetailLeague league : leagues) {
table.insertWorldDetailsLeague(league);
table.storeWorldDetailsLeague(league);
}
}

/**
* Save single world detail league.
*
* @param league The league
*/
public void storeWorldDetailLeague(WorldDetailLeague league) {
WorldDetailsTable table = (WorldDetailsTable) getTable(WorldDetailsTable.TABLENAME);
table.storeWorldDetailsLeague(league);
}

// --------------------------------------------------------------------------------
// -------------------------------- Statistik Part
// --------------------------------
Expand Down
9 changes: 5 additions & 4 deletions src/main/java/core/db/IfaMatchTable.java
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,11 @@ void insertMatch(IfaMatch match) {
store(match);
}

// @Override
// protected String createSelectStatement(){
// return createSelectStatement("");
// }
@Override
protected String createDeleteStatement() {
return createDeleteStatement(" WHERE TRUE");
}

void deleteAllMatches() {
executePreparedDelete();
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/core/db/WorldDetailsTable.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ protected String createSelectStatement() {
return createSelectStatement("");
}

void insertWorldDetailsLeague(WorldDetailLeague league){
void storeWorldDetailsLeague(WorldDetailLeague league){
if(league == null)
return;
store(league);
Expand All @@ -44,7 +44,7 @@ List<WorldDetailLeague> getAllWorldDetailLeagues(){
@Override
protected void insertDefaultValues(){
for ( var league : WorldDetailLeague.allLeagues){
insertWorldDetailsLeague(league);
storeWorldDetailsLeague(league);
}
}
}
46 changes: 41 additions & 5 deletions src/main/java/core/model/WorldDetailsManager.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package core.model;

import core.db.DBManager;
import core.file.xml.XMLManager;
import core.file.xml.XMLWorldDetailsParser;
import core.net.MyConnector;
import core.util.HOLogger;

import java.util.HashMap;
import java.util.List;
import java.util.*;

public class WorldDetailsManager {

private static WorldDetailsManager WMANAGER = null;
private List<WorldDetailLeague> leagues;
private HashMap<Integer, WorldDetailLeague> countryMap = new HashMap<Integer, WorldDetailLeague>();
private HashMap<Integer, WorldDetailLeague> leagueMap = new HashMap<Integer, WorldDetailLeague>();
private final HashMap<Integer, WorldDetailLeague> countryMap = new HashMap<>();
private final HashMap<Integer, WorldDetailLeague> leagueMap = new HashMap<>();
private int totalUsers;

public static WorldDetailsManager instance() {
Expand Down Expand Up @@ -48,12 +51,45 @@ public WorldDetailLeague getWorldDetailLeagueByLeagueId(Integer leagueId) {
return leagueMap.get(leagueId);
}

/**
* Get world detail information of country id.
* If cache is empty, it will be initialized by the details stored in the database.
* If this information does not contain the requested country id, the world details will be downloaded
* from hattrick. The downloaded object will be added to the cache and the database.
* @param countryId Country Id
* @return WorldDetailLeague
*/
public WorldDetailLeague getWorldDetailLeagueByCountryId(Integer countryId) {
if (countryMap.isEmpty()) {
initialize();
}
var ret = countryMap.get(countryId);
if (ret == null) {
ret = downloadWorldDetailLeague(countryId);
DBManager.instance().storeWorldDetailLeague(ret);
initialize();
}
return ret;
}

return countryMap.get(countryId);
/**
* Download missing world detail information
* @param countryId Country Id
* @return WorldDetailLeague
*/
private WorldDetailLeague downloadWorldDetailLeague(Integer countryId) {
WorldDetailLeague ret = null;
try {
var worldDetails = MyConnector.instance().getWorldDetailsByCountryId(countryId);
var leagues = XMLWorldDetailsParser.parseDetails(XMLManager.parseString(worldDetails));
if (!leagues.isEmpty()) {
ret = leagues.get(0);
}
}
catch (Exception e) {
HOLogger.instance().warning(getClass(), "Error downloading world details from " + countryId);
}
return ret;
}

public final List<WorldDetailLeague> getLeagues() {
Expand Down
17 changes: 5 additions & 12 deletions src/main/java/core/net/MyConnector.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

import com.github.scribejava.core.model.*;
import core.file.xml.XMLCHPPPreParser;
import core.file.xml.XMLTeamDetailsParser;
import core.gui.CursorToolkit;
import core.gui.HOMainFrame;
import core.model.HOVerwaltung;
Expand Down Expand Up @@ -508,6 +507,11 @@ public String getWorldDetails(int leagueId) throws IOException {
return getCHPPWebFile(url);
}

public String getWorldDetailsByCountryId(int countryId) {
String url = htUrl + "?file=worlddetails&version=1.9&countryID=" + countryId;
return getCHPPWebFile(url);
}

// ///////////////////////////////////////////////////////////////////////////////
// Update Checker
// //////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -572,17 +576,6 @@ public void enableProxy(ProxySettings proxySettings) {
}
}

/**
* Get the region id for a certain team.
*/
public String fetchRegionID(int teamId) {
String xml = getTeamDetails(teamId);
if (!xml.isEmpty()){
return XMLTeamDetailsParser.fetchRegionID(xml);
}
return "-1";
}

public InputStream getFileFromWeb(String url, boolean displaysettingsScreen) {
if (displaysettingsScreen) {
// Show Screen
Expand Down
116 changes: 41 additions & 75 deletions src/main/java/module/ifa/RightPanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import core.model.WorldDetailsManager;
import core.net.MyConnector;
import core.util.GUIUtils;
import core.util.HOLogger;
import core.util.IOUtils;
import module.ifa.gif.Gif89Encoder;
import module.ifa.model.IfaModel;
Expand All @@ -17,15 +18,9 @@
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.*;
import java.util.List;

import javax.swing.BorderFactory;
Expand All @@ -42,6 +37,7 @@

public class RightPanel extends JPanel {

@Serial
private static final long serialVersionUID = -5038012557489983903L;
private JButton updateButton;
private JButton saveImageButton;
Expand All @@ -56,21 +52,17 @@ public RightPanel(IfaModel model) {
addListeners();
}

public ImageDesignPanel getImageDesignPanel() {
return this.imageDesignPanel;
}

private void initComponents() {
setLayout(new GridBagLayout());
setBorder(BorderFactory.createTitledBorder(HOVerwaltung.instance().getLanguageString(
"ifa.imageBuilder.title")));

JPanel buttonPanel = new JPanel();
GridBagConstraints gbc = new GridBagConstraints();
this.updateButton = new JButton(getLangString("ls.button.update"));
this.updateButton = new JButton(HOVerwaltung.instance().getLanguageString("ls.button.update"));
gbc.anchor = GridBagConstraints.EAST;
buttonPanel.add(this.updateButton, gbc);
this.saveImageButton = new JButton(getLangString("ifa.imageBuilder.button.save"));
this.saveImageButton = new JButton(HOVerwaltung.instance().getLanguageString("ifa.imageBuilder.button.save"));
gbc.gridx = 1;
gbc.anchor = GridBagConstraints.WEST;
buttonPanel.add(this.saveImageButton, gbc);
Expand All @@ -81,13 +73,13 @@ private void initComponents() {
gbc.gridwidth = 2;
add(buttonPanel, gbc);

this.awayRadioButton = new JRadioButton(getLangString("ifa.imageBuilder.visited"), true);
this.awayRadioButton = new JRadioButton(HOVerwaltung.instance().getLanguageString("ifa.imageBuilder.visited"), true);
gbc.insets = new Insets(5, 6, 5, 6);
gbc.gridy = 1;
gbc.gridwidth = 1;
add(this.awayRadioButton, gbc);

this.homeRadioButton = new JRadioButton(getLangString("ifa.imageBuilder.hosted"), false);
this.homeRadioButton = new JRadioButton(HOVerwaltung.instance().getLanguageString("ifa.imageBuilder.hosted"), false);
gbc.gridx = 1;
add(this.homeRadioButton, gbc);

Expand All @@ -106,67 +98,41 @@ private void initComponents() {
}

private void addListeners() {
this.awayRadioButton.addItemListener(new ItemListener() {

@Override
public void itemStateChanged(ItemEvent evt) {
if (evt.getStateChange() == ItemEvent.SELECTED) {
imageDesignPanel.setAway(true);
}
}
});

this.homeRadioButton.addItemListener(new ItemListener() {

@Override
public void itemStateChanged(ItemEvent evt) {
if (evt.getStateChange() == ItemEvent.SELECTED) {
imageDesignPanel.setAway(false);
}
}
});

this.updateButton.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
String worldDetails;
try {
worldDetails = MyConnector.instance().getWorldDetails(0);
List<WorldDetailLeague> leagues = XMLWorldDetailsParser.parseDetails(XMLManager
.parseString(worldDetails));
DBManager.instance().saveWorldDetailLeagues(leagues);
WorldDetailsManager.instance().refresh();
} catch (IOException e1) {
e1.printStackTrace();
}
PluginIfaUtils.updateMatchesTable();
RightPanel.this.model.reload();
}
});

this.saveImageButton.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
try {
saveImage();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
});

}
this.awayRadioButton.addItemListener(evt -> {
if (evt.getStateChange() == ItemEvent.SELECTED) {
imageDesignPanel.setAway(true);
}
});

this.homeRadioButton.addItemListener(evt -> {
if (evt.getStateChange() == ItemEvent.SELECTED) {
imageDesignPanel.setAway(false);
}
});

this.updateButton.addActionListener(arg0 -> {
String worldDetails;
try {
worldDetails = MyConnector.instance().getWorldDetails(0);
List<WorldDetailLeague> leagues = XMLWorldDetailsParser.parseDetails(XMLManager
.parseString(worldDetails));
DBManager.instance().storeWorldDetailLeagues(leagues);
WorldDetailsManager.instance().refresh();
} catch (IOException e1) {
HOLogger.instance().warning(getClass(), "Could not download world details: " + e1.getMessage());
}
PluginIfaUtils.updateMatchesTable();
RightPanel.this.model.reload();
});

this.saveImageButton.addActionListener(e -> {
try {
saveImage();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
});

/**
* Convenience method
*
* @param key
* @return
*/
private static String getLangString(String key) {
return HOVerwaltung.instance().getLanguageString(key);
}

private void saveImage() throws IOException {
Expand Down
8 changes: 5 additions & 3 deletions src/main/resources/release_notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,12 @@

### Squad
* Fix length of owner notes in players' database table (#1816)
* player avatar image can be reloaded (#1815)
* Player avatar image can be reloaded (#1815)
* Fix error player download nickname null pointer exception (#1938)
* Fix initial sorting by player group (#1909)
* Show stamina sub skill (#383)
* fix error on player details display after initial download (#2044)
* Fix error on player details display after initial download (#2044)
* Update missing world details in database (#2063)

### Team Analyzer
* Restore size of match prediction dialog box (#1898)
Expand Down Expand Up @@ -55,7 +56,8 @@
* Change subskill recalculation dialog display (#1556)
* Tuning subskill recalculation (#1870)

### League
### International Friendlies
* Fix database error on match reload (#2063)

### Youth
* Increase effect of youth friendly match training (#1950, #1994)
Expand Down