You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
2.4 KiB
68 lines
2.4 KiB
package app.updates;
|
|
|
|
import app.entities.server.Server;
|
|
import app.services.io.GeoIP;
|
|
import app.entities.Stats;
|
|
import com.maxmind.geoip2.exception.GeoIp2Exception;
|
|
import jakarta.annotation.PostConstruct;
|
|
import jakarta.persistence.EntityManager;
|
|
import jakarta.persistence.PersistenceContext;
|
|
import org.jobrunr.jobs.annotations.Job;
|
|
import org.jobrunr.scheduling.JobScheduler;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
import java.io.IOException;
|
|
import java.net.UnknownHostException;
|
|
import java.util.Map;
|
|
|
|
@Component
|
|
public class CountriesUpdater {
|
|
Stats stats;
|
|
GeoIP geoIP;
|
|
JobScheduler jobScheduler;
|
|
@PersistenceContext
|
|
EntityManager entityManager;
|
|
|
|
@Value("${backend.updates.countries}")
|
|
private boolean update;
|
|
|
|
private final String countries_in_current_year = "SELECT DISTINCT `connect_ip` FROM `%s`.`user_connections` WHERE connection_type LIKE 'connect' AND `timestamp` > CAST(DATE_FORMAT(NOW() ,'%%Y-01-01') as DATE) UNION\n";
|
|
|
|
@Autowired
|
|
public CountriesUpdater(Stats stats,
|
|
GeoIP geoIP,
|
|
JobScheduler jobScheduler) {
|
|
this.stats = stats;
|
|
this.geoIP = geoIP;
|
|
this.jobScheduler = jobScheduler;
|
|
}
|
|
|
|
@PostConstruct
|
|
public void UpdateCountries(){
|
|
if (update) {
|
|
jobScheduler.enqueue(() -> UpdateCountriesStatistic());
|
|
jobScheduler.scheduleRecurrently("backend.stats.countries.update", "*/15 * * * *", () -> UpdateCountriesStatistic());
|
|
}
|
|
}
|
|
|
|
@Job(name = "Update countries statistic", retries = 0)
|
|
public void UpdateCountriesStatistic() {
|
|
stats.getCountries().clear();
|
|
|
|
String query = "";
|
|
for (Map.Entry<String, Server> stringServerEntry : stats.getServers().entrySet()) {
|
|
query += countries_in_current_year.formatted(stringServerEntry.getValue().getDb());
|
|
}
|
|
query = query.substring(0, query.length()-7) + ";";
|
|
for(Object ip:entityManager.createNativeQuery(query).getResultList()) {
|
|
try {
|
|
stats.getCountries().merge(geoIP.GetCountry(String.valueOf(ip)), 1, (x, y) -> x+y);
|
|
} catch (UnknownHostException e) {
|
|
} catch (IOException e) {
|
|
} catch (GeoIp2Exception e) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|