Browse Source

МНОгА ВСЕГО

master
gsd 2 years ago
parent
commit
44168a545c
  1. 19
      src/main/java/app/controllers/ProfileController.java
  2. 2
      src/main/java/app/controllers/StatsController.java
  3. 6
      src/main/java/app/entities/PlayerProfile.java
  4. 96
      src/main/java/app/entities/Stats.java
  5. 24
      src/main/java/app/entities/db/Ban.java
  6. 24
      src/main/java/app/entities/db/Permition.java
  7. 11
      src/main/java/app/entities/other/SteamID.java
  8. 11
      src/main/java/app/entities/server/PlayOn.java
  9. 23
      src/main/java/app/entities/server/Server.java
  10. 3
      src/main/java/app/entities/server/players/DefaultPlayer.java
  11. 1
      src/main/java/app/entities/server/players/RCONPlayer.java
  12. 33
      src/main/java/app/services/ProfileService.java
  13. 31
      src/main/java/app/services/Stats.java
  14. 7
      src/main/java/app/services/db/BanService.java
  15. 22
      src/main/java/app/services/db/PermitionService.java
  16. 3
      src/main/java/app/services/db/UsertimeService.java
  17. 3
      src/main/java/app/services/io/ServersReader.java
  18. 3
      src/main/java/app/updates/BanCountUpdater.java
  19. 2
      src/main/java/app/updates/CountriesUpdater.java
  20. 51
      src/main/java/app/updates/PlayersUpdater.java
  21. 2
      src/main/java/app/updates/UniqueUpdater.java
  22. 2
      src/main/resources/application.yaml

19
src/main/java/app/controllers/ProfileController.java

@ -1,6 +1,7 @@
package app.controllers;
import app.services.ProfileService;
import app.entities.Stats;
import app.utils.SaltedCookie;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
@ -10,17 +11,22 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("api/profile")
public class ProfileController {
private SaltedCookie saltedCookie;
private ProfileService profileService;
private Stats stats;
@Autowired
public ProfileController(SaltedCookie saltedCookie,
ProfileService profileService) {
ProfileService profileService,
Stats stats) {
this.saltedCookie = saltedCookie;
this.profileService = profileService;
this.stats = stats;
}
@GetMapping("/current")
@ -32,4 +38,15 @@ public class ProfileController {
return new ResponseEntity(profileService.GetProfile(steam64), HttpStatus.OK);
}
@GetMapping("/current/kick")
public ResponseEntity KickCurrentUserFromServers(
@CookieValue(value = "steam64", defaultValue = "") String steam64,
@CookieValue(value = "steam64_secured", defaultValue = "") String steam64_secured
){
if(!saltedCookie.Validate(steam64, steam64_secured)) return new ResponseEntity<>(HttpStatus.FORBIDDEN);
//return new ResponseEntity(stats.kickPlayer(profileService.GetProfile(steam64, List.of()).getPlay_on()), HttpStatus.OK);
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
}
}

2
src/main/java/app/controllers/StatsController.java

@ -1,6 +1,6 @@
package app.controllers;
import app.services.Stats;
import app.entities.Stats;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

6
src/main/java/app/entities/PlayerProfile.java

@ -1,8 +1,9 @@
package app.entities;
import app.entities.db.Permition;
import app.entities.other.SteamID;
import app.entities.server.PlayOn;
import app.entities.steam.SteamData;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import java.math.BigDecimal;
@ -13,8 +14,9 @@ public class PlayerProfile {
Object ban;
HashMap<String, HashMap<String, BigDecimal>> gametime;
HashMap<String, HashMap<String, Long>> lastplay;
Object permition;
Permition permition;
HashMap<String, Double> response_time;
SteamData steam_data;
SteamID steamids;
PlayOn play_on;
}

96
src/main/java/app/entities/Stats.java

@ -0,0 +1,96 @@
package app.entities;
import app.entities.other.SteamID;
import app.entities.server.PlayOn;
import app.entities.server.Server;
import app.entities.server.players.DefaultPlayer;
import app.entities.server.players.RCONPlayer;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.ibasco.agql.protocols.valve.source.query.SourceQueryClient;
import com.ibasco.agql.protocols.valve.source.query.info.SourceQueryInfoResponse;
import com.ibasco.agql.protocols.valve.source.query.players.SourceQueryPlayerResponse;
import com.ibasco.agql.protocols.valve.source.query.rcon.exceptions.RconException;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletionException;
@Data
@Component
@Scope(value = "singleton")
public class Stats {
long ban_count = 0;
int discord_users = 0;
int freevip_players = 0;
int server_uptime = 0;
int vip_players = 0;
int vk_users = 0;
HashMap<String, Integer> countries = new HashMap<>();
HashMap<String, Server> servers = new HashMap<>();
HashMap<String, Long> uniq = new HashMap<>();
HashMap<String, Long> updates = new HashMap<>();
public void UpdateUniq(String key, Long value) {
uniq.merge(key, value, (x,y) -> y);
}
public void RefreshServerA2SData(ApplicationContext context, String server_name){
SourceQueryClient sourceQueryClient = context.getBean(SourceQueryClient.class);
try {
SourceQueryInfoResponse info = sourceQueryClient.getInfo(getServers().get(server_name).getInetAddress()).join();
getServers().get(server_name).UpdateStatusFromA2S(info);
sourceQueryClient.close();
} catch (IOException err) {
getServers().get(server_name).SetDownStatus();
return;
}
if (!getServers().get(server_name).isStatus() || getServers().get(server_name).getPlayer_count() < 1) {
return;
}
////////////////////////////////////////////////////////////////////////
//If player count > 0 make base player request
////////////////////////////////////////////////////////////////////////
try {
sourceQueryClient = context.getBean(SourceQueryClient.class);
SourceQueryPlayerResponse players = sourceQueryClient.getPlayers(getServers().get(server_name).getInetAddress()).join();
getServers().get(server_name).UpdatePlayersFromA2S(players);
sourceQueryClient.close();
} catch (IOException err) {
return;
}
///////////////////////////////////////////////////////////////////////
//Extend current players of rcon result
//////////////////////////////////////////////////////////////////////
try {
String response = getServers().get(server_name).ExecuteRCON(context,"status");
getServers().get(server_name).UpdatePlayersFromRCON(response);
} catch (RconException | CompletionException err) {
return;
}
}
/*@JsonIgnore
public PlayOn searchPlayer(SteamID steamID){
for (Map.Entry<String, Server> stringServerEntry : servers.entrySet()) {
RCONPlayer player = stringServerEntry.getValue().searchPlayer(steamID);
if (player != null) return new PlayOn(stringServerEntry.getKey(), player.getId());
}
return null;
}*/
/*@JsonIgnore
public String kickPlayer(PlayOn playOn){
if (playOn == null) return "";
return servers.get(playOn.getServer_id()).ExecuteRCON(applicationContext, "sm_kick #%d kicked from backend".formatted(playOn.getPlayer_id()));
}*/
}

24
src/main/java/app/entities/db/Ban.java

@ -0,0 +1,24 @@
package app.entities.db;
import lombok.Data;
import java.math.BigInteger;
import java.sql.Time;
import java.sql.Timestamp;
@Data
public class Ban {
int id;
String steam_id;
BigInteger account_id;
String player_name;
int ban_length;
String ban_reason;
String banned_by;
String banned_by_id;
String ip;
Timestamp timestamp;
boolean active;
String unbanned_by_id;
Timestamp unbanned_timestamp;
}

24
src/main/java/app/entities/db/Permition.java

@ -0,0 +1,24 @@
package app.entities.db;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
@Data
public class Permition {
@JsonIgnore
int id;
String flags;
long u_timestamp;
int amount;
int immunity;
String status;
public Permition(Object[] objects) {
id = (int) objects[0];
flags = (String) objects[1];
immunity = (int) objects[2];
status = (String) objects[3];
amount = (int) objects[4];
u_timestamp = (long) objects[5];
}
}

11
src/main/java/app/entities/other/SteamID.java

@ -3,8 +3,7 @@ package app.entities.other;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@JsonSerialize
public
class SteamID {
public class SteamID {
public String steam3;
public String steam2;
public long steam64;
@ -12,6 +11,9 @@ class SteamID {
public long account_id;
public SteamID(){
}
public SteamID(String steam3, String steam2, String steam64, long account_id) {
this.steam3 = steam3;
this.steam2 = steam2;
@ -24,4 +26,9 @@ class SteamID {
public String toString(){
return steam_url;
}
public boolean is(SteamID steamID){
if (steam64 == steamID.steam64) return true;
else return false;
}
}

11
src/main/java/app/entities/server/PlayOn.java

@ -0,0 +1,11 @@
package app.entities.server;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class PlayOn {
String server_id;
int player_id;
}

23
src/main/java/app/entities/server/Server.java

@ -1,5 +1,6 @@
package app.entities.server;
import app.entities.other.SteamID;
import app.entities.server.players.DefaultPlayer;
import app.entities.server.players.RCONPlayer;
import com.fasterxml.jackson.annotation.*;
@ -7,8 +8,13 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.ibasco.agql.protocols.valve.source.query.info.SourceQueryInfoResponse;
import com.ibasco.agql.protocols.valve.source.query.players.SourcePlayer;
import com.ibasco.agql.protocols.valve.source.query.players.SourceQueryPlayerResponse;
import com.ibasco.agql.protocols.valve.source.query.rcon.SourceRconClient;
import com.ibasco.agql.protocols.valve.source.query.rcon.message.SourceRconAuthResponse;
import com.ibasco.agql.protocols.valve.source.query.rcon.message.SourceRconCmdResponse;
import jakarta.persistence.criteria.CriteriaBuilder;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import java.net.InetSocketAddress;
import java.util.ArrayList;
@ -87,10 +93,27 @@ public class Server {
}
}
@JsonIgnore
public String ExecuteRCON(ApplicationContext context, String command) {
SourceRconClient rconClient = context.getBean(SourceRconClient.class);
SourceRconAuthResponse response = rconClient.authenticate(getInetAddress(), getRcon_password().getBytes()).join();
if(!response.isAuthenticated()) {
return null;
}
SourceRconCmdResponse res = rconClient.execute(getInetAddress(), command).join();
rconClient.cleanup();
return res.getResult();
}
public void SetDownStatus() {
setStatus(false);
setMax_players(0);
setPlayer_count(0);
players.clear();
}
@JsonIgnore
public RCONPlayer searchPlayer(SteamID steamID){
return (RCONPlayer) players.stream().filter(player -> player.getSteam().is(steamID)).findFirst().orElse(null);
}
}

3
src/main/java/app/entities/server/players/DefaultPlayer.java

@ -1,9 +1,12 @@
package app.entities.server.players;
import app.entities.other.SteamID;
import lombok.Data;
@Data
public class DefaultPlayer {
String name;
int score;
SteamID steam = new SteamID();
}

1
src/main/java/app/entities/server/players/RCONPlayer.java

@ -16,7 +16,6 @@ public class RCONPlayer extends DefaultPlayer {
int ping;
String state;
String steam2;
SteamID steam;
public RCONPlayer(List<String> status_line) {
id = Integer.parseInt(status_line.get(1));

33
src/main/java/app/services/ProfileService.java

@ -1,15 +1,16 @@
package app.services;
import app.controllers.ProfileController;
import app.entities.PlayerProfile;
import app.entities.Stats;
import app.entities.other.SteamID;
import app.services.db.PermitionService;
import app.services.db.UsertimeService;
import app.services.steam.SteamWebApi;
import app.utils.SteamIDConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.Instant;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@ -17,11 +18,17 @@ import java.util.List;
public class ProfileService {
SteamWebApi steamWebApi;
UsertimeService usertimeService;
PermitionService permitionService;
Stats stats;
@Autowired
public ProfileService(SteamWebApi steamWebApi,
UsertimeService usertimeService) {
UsertimeService usertimeService,
PermitionService permitionService,
Stats stats) {
this.steamWebApi = steamWebApi;
this.usertimeService = usertimeService;
this.permitionService = permitionService;
this.stats = stats;
}
public PlayerProfile GetProfile(String steam64, List<String> requests) {
@ -31,6 +38,13 @@ public class ProfileService {
profile.setSteamids(steamID);
Long start_time, end_time;
start_time = Instant.now().toEpochMilli();
//profile.setPlay_on(stats.searchPlayer(steamID));
end_time = Instant.now().toEpochMilli() - start_time;
profile.getResponse_time().put("play_on", Double.valueOf(end_time) / 1000);
if(requests.contains("steam_data")){
start_time = Instant.now().toEpochMilli();
profile.setSteam_data(steamWebApi.getSteamData(steamID.steam64));
@ -40,22 +54,29 @@ public class ProfileService {
if(requests.contains("lastplay")){
start_time = Instant.now().toEpochMilli();
profile.setLastplay(usertimeService.getPlayerLastplay(profile.getSteamids()));
profile.setLastplay(usertimeService.getPlayerLastplay(steamID));
end_time = Instant.now().toEpochMilli() - start_time;
profile.getResponse_time().put("lastplay", Double.valueOf(end_time) / 1000);
}
if(requests.contains("usertime")){
start_time = Instant.now().toEpochMilli();
profile.setGametime(usertimeService.getPlayerUsertime(profile.getSteamids()));
profile.setGametime(usertimeService.getPlayerUsertime(steamID));
end_time = Instant.now().toEpochMilli() - start_time;
profile.getResponse_time().put("usertime", Double.valueOf(end_time) / 1000);
}
if(requests.contains("permition")){
start_time = Instant.now().toEpochMilli();
profile.setPermition(permitionService.getPermition(steamID));
end_time = Instant.now().toEpochMilli() - start_time;
profile.getResponse_time().put("permition", Double.valueOf(end_time) / 1000);
}
return profile;
}
public PlayerProfile GetProfile(String steam64) {
return GetProfile(steam64, List.of("steam_data,lastplay,usertime".split(",")));
return GetProfile(steam64, List.of("steam_data,lastplay,usertime,permition".split(",")));
}
}

31
src/main/java/app/services/Stats.java

@ -1,31 +0,0 @@
package app.services;
import app.entities.server.Server;
import lombok.Data;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@Data
@Component
@Scope(value = "singleton")
public class Stats {
long ban_count = 0;
int discord_users = 0;
int freevip_players = 0;
int server_uptime = 0;
int vip_players = 0;
int vk_users = 0;
HashMap<String, Integer> countries = new HashMap<>();
HashMap<String, Server> servers = new HashMap<>();
HashMap<String, Long> uniq = new HashMap<>();
HashMap<String, Long> updates = new HashMap<>();
public void UpdateUniq(String key, Long value) {
uniq.merge(key, value, (x,y) -> y);
}
}

7
src/main/java/app/services/db/BanService.java

@ -0,0 +1,7 @@
package app.services.db;
import org.springframework.stereotype.Service;
@Service
public class BanService {
}

22
src/main/java/app/services/db/PermitionService.java

@ -0,0 +1,22 @@
package app.services.db;
import app.entities.db.Permition;
import app.entities.other.SteamID;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class PermitionService {
@PersistenceContext
EntityManager entityManager;
public Permition getPermition(SteamID steamID){
List<Object[]> permitionList = entityManager.createNativeQuery("SELECT id, flags, immunity, status, amount, UNIX_TIMESTAMP(`reg_date`) as u_timestamp FROM sm_admins WHERE `identity` LIKE ?1")
.setParameter(1, steamID.steam2)
.getResultList();
return permitionList.size() > 0 ? new Permition(permitionList.get(0)) : null;
}
}

3
src/main/java/app/services/UsertimeService.java → src/main/java/app/services/db/UsertimeService.java

@ -1,7 +1,8 @@
package app.services;
package app.services.db;
import app.entities.other.SteamID;
import app.entities.server.Server;
import app.entities.Stats;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.beans.factory.annotation.Autowired;

3
src/main/java/app/services/io/ServersReader.java

@ -1,10 +1,9 @@
package app.services.io;
import app.entities.server.Server;
import app.services.Stats;
import app.entities.Stats;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

3
src/main/java/app/updates/BanCountUpdater.java

@ -1,6 +1,6 @@
package app.updates;
import app.services.Stats;
import app.entities.Stats;
import jakarta.annotation.PostConstruct;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
@ -8,7 +8,6 @@ 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 org.springframework.stereotype.Service;
import java.time.Instant;

2
src/main/java/app/updates/CountriesUpdater.java

@ -2,7 +2,7 @@ package app.updates;
import app.entities.server.Server;
import app.services.io.GeoIP;
import app.services.Stats;
import app.entities.Stats;
import com.maxmind.geoip2.exception.GeoIp2Exception;
import jakarta.annotation.PostConstruct;
import jakarta.persistence.EntityManager;

51
src/main/java/app/updates/PlayersUpdater.java

@ -1,13 +1,6 @@
package app.updates;
import app.services.Stats;
import com.ibasco.agql.protocols.valve.source.query.SourceQueryClient;
import com.ibasco.agql.protocols.valve.source.query.info.SourceQueryInfoResponse;
import com.ibasco.agql.protocols.valve.source.query.players.SourceQueryPlayerResponse;
import com.ibasco.agql.protocols.valve.source.query.rcon.SourceRconClient;
import com.ibasco.agql.protocols.valve.source.query.rcon.exceptions.RconException;
import com.ibasco.agql.protocols.valve.source.query.rcon.message.SourceRconAuthResponse;
import com.ibasco.agql.protocols.valve.source.query.rcon.message.SourceRconCmdResponse;
import app.entities.Stats;
import jakarta.annotation.PostConstruct;
import org.jobrunr.jobs.annotations.Job;
import org.jobrunr.scheduling.JobScheduler;
@ -16,9 +9,6 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.concurrent.CompletionException;
@Component
public class PlayersUpdater {
Stats stats;
@ -49,43 +39,6 @@ public class PlayersUpdater {
@Job(name = "Update A2S data on: %0")
public void UpdatePlayersOnServer(String server_name) {
SourceQueryClient sourceQueryClient = context.getBean(SourceQueryClient.class);
try {
SourceQueryInfoResponse info = sourceQueryClient.getInfo(stats.getServers().get(server_name).getInetAddress()).join();
stats.getServers().get(server_name).UpdateStatusFromA2S(info);
sourceQueryClient.close();
} catch (IOException err) {
stats.getServers().get(server_name).SetDownStatus();
return;
}
if (!stats.getServers().get(server_name).isStatus() || stats.getServers().get(server_name).getPlayer_count() < 1) {
return;
}
////////////////////////////////////////////////////////////////////////
//If player count > 0 make base player request
////////////////////////////////////////////////////////////////////////
try {
sourceQueryClient = context.getBean(SourceQueryClient.class);
SourceQueryPlayerResponse players = sourceQueryClient.getPlayers(stats.getServers().get(server_name).getInetAddress()).join();
stats.getServers().get(server_name).UpdatePlayersFromA2S(players);
sourceQueryClient.close();
} catch (IOException err) {
return;
}
///////////////////////////////////////////////////////////////////////
//Extend current players of rcon result
//////////////////////////////////////////////////////////////////////
try {
SourceRconClient rcon_client = context.getBean(SourceRconClient.class);
SourceRconAuthResponse response = rcon_client.authenticate(stats.getServers().get(server_name).getInetAddress(), stats.getServers().get(server_name).getRcon_password().getBytes()).join();
if(!response.isAuthenticated()) {
return;
}
SourceRconCmdResponse rcon_response = rcon_client.execute(stats.getServers().get(server_name).getInetAddress(), "status").join();
rcon_client.cleanup();
stats.getServers().get(server_name).UpdatePlayersFromRCON(rcon_response.getResult());
} catch (RconException | CompletionException err) {
return;
}
stats.RefreshServerA2SData(context, server_name);
}
}

2
src/main/java/app/updates/UniqueUpdater.java

@ -1,7 +1,7 @@
package app.updates;
import app.entities.server.Server;
import app.services.Stats;
import app.entities.Stats;
import jakarta.annotation.PostConstruct;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;

2
src/main/resources/application.yaml

@ -28,7 +28,7 @@ backend:
unique_global: false
unique_server: false
ban_count: false
a2s: false
a2s: true
countries: false
auth:
salt: ${AUTH_SALT}

Loading…
Cancel
Save