Files
elder-scrolls-legends/src/main/java/ch/gtache/elderscrollslegends/service/account/AccountService.java
2025-04-24 20:38:09 +02:00

111 lines
4.4 KiB
Java

package ch.gtache.elderscrollslegends.service.account;
import ch.gtache.elderscrollslegends.service.BaseService;
import ch.gtache.elderscrollslegends.service.SteamService;
import ch.gtache.elderscrollslegends.service.Token;
import ch.gtache.elderscrollslegends.service.account.auth.AuthData;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.jboss.logging.Logger;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.time.Duration;
import java.util.List;
import static java.util.Objects.requireNonNull;
@ApplicationScoped
public class AccountService extends BaseService {
private static final Logger logger = Logger.getLogger(AccountService.class);
private final JWTService jwtService;
private final SteamService steamService;
@Inject
AccountService(final DataSource dataSource, final JWTService jwtService, final SteamService steamService) {
super(dataSource);
this.jwtService = requireNonNull(jwtService);
this.steamService = requireNonNull(steamService);
}
AuthData authenticate(final String steamID) {
if (!exists(steamID)) {
final var longId = Long.parseLong(steamID);
final var name = steamService.getName(steamID);
try (final var connection = dataSource().getConnection();
final var statement = connection.prepareStatement("INSERT INTO player (steam_id, name) VALUES (?, ?)")) {
statement.setLong(1, longId);
statement.setString(2, name);
statement.executeUpdate();
} catch (final SQLException e) {
logger.error("Error inserting player " + steamID, e);
return null;
}
}
updateNameIfNeeded(steamID);
final var token = jwtService.createToken(steamID);
return getAuthData(steamID, token);
}
private void updateNameIfNeeded(final String steamID) {
final var longId = Long.parseLong(steamID);
final var name = steamService.getName(steamID);
try (final var connection = dataSource().getConnection();
final var statement = connection.prepareStatement("UPDATE player SET name=? WHERE steam_id=?")) {
statement.setString(1, name);
statement.setLong(2, longId);
statement.executeUpdate();
} catch (final SQLException e) {
logger.error("Error updating player " + steamID, e);
}
}
private AuthData getAuthData(final String steamID, final Token token) {
if (token != null) {
final var longId = Long.parseLong(steamID);
try (final var connection = dataSource().getConnection();
final var statement = connection.prepareStatement("SELECT name FROM player WHERE steam_id=?")) {
statement.setLong(1, longId);
try (final var rs = statement.executeQuery()) {
if (rs.next()) {
final var uuid = token.token();
final var name = rs.getString(1);
final var timeToRefresh = Duration.between(java.time.Instant.now(), token.expirationTimestamp()).getSeconds();
return new AuthData(uuid, "", "steam", "", uuid, steamID, steamID, steamID,
"", name, "US", false, false, (int) timeToRefresh,
5, 5, false, "", "",
0, List.of(), false);
}
}
} catch (final SQLException e) {
logger.error("Error checking for player " + steamID, e);
}
}
return null;
}
boolean exists(final String steamID) {
final var longId = Long.parseLong(steamID);
try (final var connection = dataSource().getConnection();
final var statement = connection.prepareStatement("SELECT 1 FROM player WHERE steam_id=?")) {
statement.setLong(1, longId);
try (final var rs = statement.executeQuery()) {
return rs.next();
}
} catch (final SQLException e) {
logger.error("Error checking for player " + steamID, e);
}
return false;
}
Token refreshToken(final String steamID) {
return jwtService.createToken(steamID);
}
public String getSteamIDFromToken(final String token) {
return jwtService.getSteamID(token);
}
}