🔨 Add music status api enpoint
This commit is contained in:
parent
9f1a3f737b
commit
a3f6adf6f5
@ -0,0 +1,28 @@
|
|||||||
|
package net.Broken.Api.Controllers;
|
||||||
|
|
||||||
|
import net.Broken.Api.Data.Music.Status;
|
||||||
|
import net.Broken.Api.Security.Data.JwtPrincipal;
|
||||||
|
import net.Broken.Api.Services.AudioService;
|
||||||
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
|
import org.springframework.security.core.Authentication;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/v2/audio")
|
||||||
|
@CrossOrigin(origins = "*", maxAge = 3600)
|
||||||
|
public class AudioController {
|
||||||
|
|
||||||
|
public final AudioService audioService;
|
||||||
|
|
||||||
|
public AudioController(AudioService audioService) {
|
||||||
|
this.audioService = audioService;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@GetMapping("/{guildId}/status")
|
||||||
|
@PreAuthorize("isInGuild(#guildId)")
|
||||||
|
public Status getMusicStatus(@PathVariable String guildId, Authentication authentication){
|
||||||
|
JwtPrincipal principal = (JwtPrincipal) authentication.getPrincipal();
|
||||||
|
return audioService.getGuildAudioStatus(guildId, principal.user().getDiscordId());
|
||||||
|
}
|
||||||
|
}
|
12
src/main/java/net/Broken/Api/Data/Music/PlayBackInfo.java
Normal file
12
src/main/java/net/Broken/Api/Data/Music/PlayBackInfo.java
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package net.Broken.Api.Data.Music;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||||
|
|
||||||
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
|
public record PlayBackInfo(
|
||||||
|
Boolean paused,
|
||||||
|
Boolean stopped,
|
||||||
|
Long progress,
|
||||||
|
TrackInfo trackInfo
|
||||||
|
) {
|
||||||
|
}
|
14
src/main/java/net/Broken/Api/Data/Music/Status.java
Normal file
14
src/main/java/net/Broken/Api/Data/Music/Status.java
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package net.Broken.Api.Data.Music;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||||
|
import net.Broken.Api.Data.Guild.Channel;
|
||||||
|
|
||||||
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||||
|
public record Status(
|
||||||
|
Boolean connected,
|
||||||
|
Channel channel,
|
||||||
|
Boolean canView,
|
||||||
|
Boolean canInteract,
|
||||||
|
PlayBackInfo playBackInfo
|
||||||
|
) {
|
||||||
|
}
|
17
src/main/java/net/Broken/Api/Data/Music/TrackInfo.java
Normal file
17
src/main/java/net/Broken/Api/Data/Music/TrackInfo.java
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package net.Broken.Api.Data.Music;
|
||||||
|
|
||||||
|
import com.sedmelluq.discord.lavaplayer.track.AudioTrackInfo;
|
||||||
|
import net.Broken.Api.Data.UserInfo;
|
||||||
|
import net.Broken.audio.UserAudioTrack;
|
||||||
|
|
||||||
|
public record TrackInfo(UserInfo submitter, AudioTrackInfo detail) {
|
||||||
|
public TrackInfo(UserInfo submitter, AudioTrackInfo detail) {
|
||||||
|
this.submitter = submitter;
|
||||||
|
this.detail = detail;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TrackInfo(UserAudioTrack userAudioTrack) {
|
||||||
|
this(new UserInfo(userAudioTrack.getSubmittedUser().getId(), userAudioTrack.getSubmittedUser().getName(), userAudioTrack.getSubmittedUser().getAvatarUrl()),
|
||||||
|
userAudioTrack.getAudioTrack().getInfo());
|
||||||
|
}
|
||||||
|
}
|
8
src/main/java/net/Broken/Api/Data/UserInfo.java
Normal file
8
src/main/java/net/Broken/Api/Data/UserInfo.java
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package net.Broken.Api.Data;
|
||||||
|
|
||||||
|
public record UserInfo(
|
||||||
|
String id,
|
||||||
|
String username,
|
||||||
|
String avatar
|
||||||
|
) {
|
||||||
|
}
|
65
src/main/java/net/Broken/Api/Services/AudioService.java
Normal file
65
src/main/java/net/Broken/Api/Services/AudioService.java
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
package net.Broken.Api.Services;
|
||||||
|
|
||||||
|
import net.Broken.Api.Data.Guild.Channel;
|
||||||
|
import net.Broken.Api.Data.Music.PlayBackInfo;
|
||||||
|
import net.Broken.Api.Data.Music.Status;
|
||||||
|
import net.Broken.Api.Data.Music.TrackInfo;
|
||||||
|
import net.Broken.MainBot;
|
||||||
|
import net.Broken.audio.AudioM;
|
||||||
|
import net.Broken.audio.UserAudioTrack;
|
||||||
|
import net.dv8tion.jda.api.Permission;
|
||||||
|
import net.dv8tion.jda.api.entities.Guild;
|
||||||
|
import net.dv8tion.jda.api.entities.GuildVoiceState;
|
||||||
|
import net.dv8tion.jda.api.entities.Member;
|
||||||
|
import net.dv8tion.jda.api.entities.VoiceChannel;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class AudioService {
|
||||||
|
public Status getGuildAudioStatus(String guildId, String userId) {
|
||||||
|
Guild guild = MainBot.jda.getGuildById(guildId);
|
||||||
|
Member member = guild.getMemberById(userId);
|
||||||
|
GuildVoiceState voiceState = guild.getSelfMember().getVoiceState();
|
||||||
|
|
||||||
|
if (voiceState != null) {
|
||||||
|
VoiceChannel channel = voiceState.getChannel();
|
||||||
|
if (channel != null) {
|
||||||
|
// The user can view the audio status if:
|
||||||
|
// -> He can view the voice channel
|
||||||
|
// -> OR He can *not* view the voice channel, but he is connected to this voice channel
|
||||||
|
boolean canView = member.hasPermission(channel, Permission.VIEW_CHANNEL)
|
||||||
|
|| (member.getVoiceState() != null && member.getVoiceState().getChannel() == channel);
|
||||||
|
if (canView) {
|
||||||
|
// The user can interact with the audio if:
|
||||||
|
// -> He can connect to this voice channel
|
||||||
|
// -> AND He can speak in this voice channel
|
||||||
|
// -> AND He is connected to this voice channel
|
||||||
|
boolean canInteract = member.hasPermission(channel, Permission.VOICE_CONNECT, Permission.VOICE_SPEAK)
|
||||||
|
&& member.getVoiceState() != null
|
||||||
|
&& member.getVoiceState().getChannel() == channel;
|
||||||
|
AudioM audioM = AudioM.getInstance(guild);
|
||||||
|
boolean stopped = audioM.getGuildAudioPlayer().player.getPlayingTrack() == null;
|
||||||
|
PlayBackInfo playBackInfo;
|
||||||
|
if (!stopped) {
|
||||||
|
boolean paused = audioM.getGuildAudioPlayer().player.isPaused();
|
||||||
|
long position = audioM.getGuildAudioPlayer().player.getPlayingTrack().getPosition();
|
||||||
|
UserAudioTrack userAudioTrack = audioM.getGuildAudioPlayer().scheduler.getCurrentPlayingTrack();
|
||||||
|
|
||||||
|
playBackInfo = new PlayBackInfo(paused, false, position, new TrackInfo(userAudioTrack));
|
||||||
|
|
||||||
|
} else {
|
||||||
|
playBackInfo = new PlayBackInfo(false, true, null, null);
|
||||||
|
}
|
||||||
|
Channel channelApi = new Channel(channel.getId(), channel.getName());
|
||||||
|
return new Status(true, channelApi, true, canInteract, playBackInfo);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
return new Status(true, null, false, false, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new Status(false, null, null, null, null);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user