Public Access
Sets map by exact title id, else by name and platform. Trophy gains count as achievements; platinum or all earned is perfect. Max 30 PSN calls per run; trophy lists load only when changed. Hidden trophies stay hidden (name and detail) until earned.
150 lines
5.1 KiB
YAML
150 lines
5.1 KiB
YAML
spring:
|
|
application:
|
|
name: tbp-core-service
|
|
profiles:
|
|
active: prod
|
|
jackson:
|
|
deserialization:
|
|
accept-float-as-int: false
|
|
jpa:
|
|
open-in-view: false
|
|
flyway:
|
|
enabled: true
|
|
baseline-on-migrate: true
|
|
locations: classpath:db/migration
|
|
threads:
|
|
virtual:
|
|
enabled: true
|
|
|
|
server:
|
|
port: 8090
|
|
|
|
management:
|
|
endpoints:
|
|
web:
|
|
exposure:
|
|
include: health
|
|
endpoint:
|
|
health:
|
|
show-details: never
|
|
security:
|
|
jwt:
|
|
public-key: ${JWT_PUBLIC_KEY:}
|
|
jwks-url: ${JWT_JWKS_URL:}
|
|
app:
|
|
build:
|
|
# Filled from the CI run by the Dockerfile.
|
|
commit: ${APP_BUILD_COMMIT:dev}
|
|
time: ${APP_BUILD_TIME:}
|
|
# The frontend; FRONTEND_HOST in the Deployment compose file. The prod host as default: an image that starts before
|
|
# the compose file sets the env var keeps working.
|
|
frontend-url: ${APP_FRONTEND_URL:https://tbp.andreas-dahm.eu}
|
|
cors:
|
|
allowed-origins: ${app.frontend-url}
|
|
steam:
|
|
api-key: ${STEAM_API_KEY}
|
|
base-url: https://api.steampowered.com
|
|
imageService-url: https://cdn.cloudflare.steamstatic.com/steam/apps/
|
|
igdb:
|
|
# A Twitch developer app (dev.twitch.tv). Without both values time to beat is off.
|
|
client-id: ${IGDB_CLIENT_ID:}
|
|
client-secret: ${IGDB_CLIENT_SECRET:}
|
|
base-url: https://api.igdb.com/v4
|
|
token-base-url: https://id.twitch.tv
|
|
psn:
|
|
# Base64 of 32 random bytes (openssl rand -base64 32). Empty = the PlayStation link is off.
|
|
token-key: ${APP_PSN_TOKEN_KEY:}
|
|
auth-base-url: https://ca.account.sony.com/api/authz/v3/oauth
|
|
api-base-url: https://m.np.playstation.com/api
|
|
# Trophy calls per sync run (title id lookups and trophy lists). The sync counts as stale after 5 minutes and
|
|
# the rate limit below is one call per 4 s, so 30 calls take 2 minutes.
|
|
trophy-calls-per-run: 30
|
|
# Days before the link ends that the inbox gets its "ends soon" note.
|
|
expiry-warning-days: 2
|
|
# The public client of the PlayStation app, as the psn-api project ships it. Not a secret of ours.
|
|
client-id: 09515159-7237-4370-9b40-3806e67c0891
|
|
client-secret: ucPjka5tntB2KqsP
|
|
redirect-uri: com.scee.psxandroid.scecompcall://redirect
|
|
speedrun:
|
|
# No key needed. false stops every call to speedrun.com.
|
|
enabled: true
|
|
base-url: https://www.speedrun.com/api/v1
|
|
library:
|
|
sync-ttl-hours: 20
|
|
# At most one sync try per user and hour on a visit, also after a failure.
|
|
login-retry-minutes: 60
|
|
force-sync-cooldown-seconds: 60
|
|
running-stale-minutes: 5
|
|
achievement-ttl-hours: 1
|
|
schema-ttl-days: 30
|
|
speedrun-ttl-days: 30
|
|
# Existing games get their IGDB series and companies in batches; 2 IGDB requests per batch.
|
|
credit-ttl-days: 30
|
|
credit-backfill-ms: 30000
|
|
credit-backfill-batch: 250
|
|
edition-ttl-days: 30
|
|
release-ttl-days: 30
|
|
# Reported broken pictures, repaired after the nightly sync.
|
|
image-repair-cron: "0 30 1 * * *"
|
|
merge-undo-purge-cron: "0 45 3 * * *"
|
|
image-repair-batch: 200
|
|
image-repair-max-attempts: 3
|
|
image-repair-retry-days: 30
|
|
rewards:
|
|
# Pile Points of every user, after the nightly sync (23:55) and the image repair (01:30).
|
|
settle-cron: "0 30 2 * * *"
|
|
follow:
|
|
# The hand changes of a followed user are one batch after this quiet time.
|
|
digest-ms: 600000
|
|
quiet-minutes: 10
|
|
inbox:
|
|
purge-cron: "0 15 3 * * *"
|
|
keep-days: 90
|
|
account-cleanup:
|
|
# Log only, delete nothing. Auth's nightly cleanup drives this; see the Deployment README before flipping it.
|
|
dry-run: ${APP_ACCOUNT_CLEANUP_DRY_RUN:true}
|
|
# A prune refuses more orphans than this per run; raise it once for a big cleanup.
|
|
max-orphans: 5
|
|
|
|
resilience4j:
|
|
retry:
|
|
instances:
|
|
steamApi:
|
|
max-attempts: 3
|
|
wait-duration: 500ms
|
|
enable-exponential-backoff: true
|
|
exponential-backoff-multiplier: 2
|
|
retry-exceptions:
|
|
- org.springframework.web.client.RestClientException
|
|
- org.springframework.web.client.ResourceAccessException
|
|
# A 4xx (a refused key, a private list) is the same on the next try.
|
|
ignore-exceptions:
|
|
- org.springframework.web.client.HttpClientErrorException
|
|
# Calls a page waits for, and the optional wishlist: one try, else a Steam outage holds every page (or the
|
|
# sync) for three read timeouts.
|
|
steamApiOnce:
|
|
max-attempts: 1
|
|
ratelimiter:
|
|
instances:
|
|
steamApi:
|
|
# Steam allows ~100k req/day. Cap at ~2 req/s to leave headroom for bursts.
|
|
limit-for-period: 2
|
|
limit-refresh-period: 1s
|
|
timeout-duration: 5s
|
|
speedrunApi:
|
|
# speedrun.com allows 100 requests/min per IP.
|
|
limit-for-period: 1
|
|
limit-refresh-period: 1s
|
|
timeout-duration: 30s
|
|
igdbApi:
|
|
# IGDB allows 4 requests/s. Taken per HTTP request.
|
|
limit-for-period: 4
|
|
limit-refresh-period: 1s
|
|
timeout-duration: 10s
|
|
psnApi:
|
|
# Unofficial API; third-party tools limit themselves to about 300 requests / 15 min. One request every 4 s
|
|
# for the whole server, taken per HTTP request.
|
|
limit-for-period: 1
|
|
limit-refresh-period: 4s
|
|
timeout-duration: 30s
|