diff --git a/src/main/java/cc/fascinated/bat/command/impl/BotStatsCommand.java b/src/main/java/cc/fascinated/bat/command/impl/BotStatsCommand.java index e4061fb..360e970 100644 --- a/src/main/java/cc/fascinated/bat/command/impl/BotStatsCommand.java +++ b/src/main/java/cc/fascinated/bat/command/impl/BotStatsCommand.java @@ -42,8 +42,8 @@ public class BotStatsCommand extends BatCommand { interaction.replyEmbeds(EmbedUtils.genericEmbed().setDescription( "**Bot Statistics**\n" + - "➜ Guilds: **%s\n".formatted(jda.getGuilds().size()) + - "➜ Users: **%s\n".formatted(jda.getUsers().size()) + + "➜ Guilds: **%s**\n".formatted(jda.getGuilds().size()) + + "➜ Users: **%s**\n".formatted(jda.getUsers().size()) + "➜ Gateway Ping: **%sms**\n".formatted(jda.getGatewayPing()) + "\n" + "**Bat Statistics**\n" + diff --git a/src/main/java/cc/fascinated/bat/features/spotify/profile/SpotifyProfile.java b/src/main/java/cc/fascinated/bat/features/spotify/profile/SpotifyProfile.java index 03e3e0f..eebb3d8 100644 --- a/src/main/java/cc/fascinated/bat/features/spotify/profile/SpotifyProfile.java +++ b/src/main/java/cc/fascinated/bat/features/spotify/profile/SpotifyProfile.java @@ -19,6 +19,11 @@ public class SpotifyProfile extends Profile { */ private String refreshToken; + /** + * When the access token expires + */ + private Long expiresAt; + public SpotifyProfile() { super("spotify"); } diff --git a/src/main/java/cc/fascinated/bat/service/SpotifyService.java b/src/main/java/cc/fascinated/bat/service/SpotifyService.java index 0d0bfbd..6d5361e 100644 --- a/src/main/java/cc/fascinated/bat/service/SpotifyService.java +++ b/src/main/java/cc/fascinated/bat/service/SpotifyService.java @@ -7,6 +7,8 @@ import lombok.Getter; import lombok.NonNull; import lombok.SneakyThrows; import net.jodah.expiringmap.ExpiringMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import se.michaelthelin.spotify.SpotifyApi; @@ -24,6 +26,7 @@ import java.util.concurrent.TimeUnit; @Service @Getter public class SpotifyService { + private static final Logger log = LoggerFactory.getLogger(SpotifyService.class); /** * The access token map. */ @@ -69,15 +72,7 @@ public class SpotifyService { .build(); this.authorizationUrl = spotifyApi.authorizationCodeUri() .response_type("code") - .scope( - AuthorizationScope.APP_REMOTE_CONTROL, - AuthorizationScope.USER_READ_PLAYBACK_POSITION, - AuthorizationScope.USER_READ_PLAYBACK_STATE, - AuthorizationScope.USER_MODIFY_PLAYBACK_STATE, - AuthorizationScope.USER_READ_CURRENTLY_PLAYING, - AuthorizationScope.APP_REMOTE_CONTROL, - AuthorizationScope.STREAMING - ) + .scope(AuthorizationScope.values()) .build().execute().toString(); } @@ -91,7 +86,7 @@ public class SpotifyService { try { return getSpotifyApi(user).getUsersCurrentlyPlayingTrack().build().execute(); } catch (Exception e) { - return null; + throw new RuntimeException("Failed to get currently playing track", e); } } @@ -178,11 +173,27 @@ public class SpotifyService { * * @return the Spotify API */ + @SneakyThrows public SpotifyApi getSpotifyApi(BatUser user) { SpotifyProfile profile = user.getProfile(SpotifyProfile.class); - return new SpotifyApi.Builder() - .setAccessToken(profile.getAccessToken()) + SpotifyApi api = new SpotifyApi.Builder() + .setClientId(clientId) .setClientSecret(clientSecret) + .setAccessToken(profile.getAccessToken()) + .setRefreshToken(profile.getRefreshToken()) .build(); + + // Refresh the access token if it's expired + if (profile.getExpiresAt() == null || profile.getExpiresAt() < System.currentTimeMillis()) { + AuthorizationCodeCredentials credentials = api.authorizationCodeRefresh().build().execute(); + profile.setAccessToken(credentials.getAccessToken()); + profile.setRefreshToken(credentials.getRefreshToken()); + profile.setExpiresAt(System.currentTimeMillis() + (credentials.getExpiresIn() * 1000)); + api.setAccessToken(credentials.getAccessToken()); + api.setRefreshToken(credentials.getRefreshToken()); + userService.saveUser(user); + log.info("Refreshed spotify access token for user {}", user.getName()); + } + return api; } }