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); } }