111 lines
4.4 KiB
Java
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);
|
|
}
|
|
}
|