Skip to content

Commit f71cab1

Browse files
authored
Add Guild#retrieveMemberVoiceState (#2729)
1 parent c37908a commit f71cab1

File tree

4 files changed

+115
-15
lines changed

4 files changed

+115
-15
lines changed

src/main/java/net/dv8tion/jda/api/entities/Guild.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2596,6 +2596,76 @@ default RestAction<RichCustomEmoji> retrieveEmoji(@Nonnull CustomEmoji emoji)
25962596
@Nonnull
25972597
List<GuildVoiceState> getVoiceStates();
25982598

2599+
/**
2600+
* Load the member's voice state for the specified user.
2601+
*
2602+
* <p>Possible {@link net.dv8tion.jda.api.exceptions.ErrorResponseException ErrorResponseExceptions} include:
2603+
* <ul>
2604+
* <li>{@link net.dv8tion.jda.api.requests.ErrorResponse#UNKNOWN_VOICE_STATE}
2605+
* <br>The specified user does not exist, is not a member of this guild or is not connected to a voice channel</li>
2606+
* </ul>
2607+
*
2608+
* @param id
2609+
* The user id to load the voice state from
2610+
*
2611+
* @return {@link RestAction} - Type: {@link GuildVoiceState}
2612+
*/
2613+
@Nonnull
2614+
@CheckReturnValue
2615+
RestAction<GuildVoiceState> retrieveMemberVoiceStateById(long id);
2616+
2617+
/**
2618+
* Load the member's voice state for the specified user.
2619+
*
2620+
* <p>Possible {@link net.dv8tion.jda.api.exceptions.ErrorResponseException ErrorResponseExceptions} include:
2621+
* <ul>
2622+
* <li>{@link net.dv8tion.jda.api.requests.ErrorResponse#UNKNOWN_VOICE_STATE}
2623+
* <br>The specified user does not exist, is not a member of this guild or is not connected to a voice channel</li>
2624+
* </ul>
2625+
*
2626+
* @param id
2627+
* The user id to load the voice state from
2628+
*
2629+
* @throws IllegalArgumentException
2630+
* If the provided id is empty or null
2631+
* @throws NumberFormatException
2632+
* If the provided id is not a snowflake
2633+
*
2634+
* @return {@link RestAction} - Type: {@link GuildVoiceState}
2635+
*/
2636+
@Nonnull
2637+
@CheckReturnValue
2638+
default RestAction<GuildVoiceState> retrieveMemberVoiceStateById(@Nonnull String id)
2639+
{
2640+
return retrieveMemberVoiceStateById(MiscUtil.parseSnowflake(id));
2641+
}
2642+
2643+
/**
2644+
* Load the member's voice state for the specified {@link UserSnowflake}.
2645+
*
2646+
* <p>Possible {@link net.dv8tion.jda.api.exceptions.ErrorResponseException ErrorResponseExceptions} include:
2647+
* <ul>
2648+
* <li>{@link net.dv8tion.jda.api.requests.ErrorResponse#UNKNOWN_VOICE_STATE}
2649+
* <br>The specified user does not exist, is not a member of this guild or is not connected to a voice channel</li>
2650+
* </ul>
2651+
*
2652+
* @param user
2653+
* The {@link UserSnowflake} for the member's voice state to retrieve.
2654+
* This can be a member or user instance or {@link User#fromId(long)}.
2655+
*
2656+
* @throws IllegalArgumentException
2657+
* If provided with null
2658+
*
2659+
* @return {@link RestAction} - Type: {@link GuildVoiceState}
2660+
*/
2661+
@Nonnull
2662+
@CheckReturnValue
2663+
default RestAction<GuildVoiceState> retrieveMemberVoiceState(@Nonnull UserSnowflake user)
2664+
{
2665+
Checks.notNull(user, "User");
2666+
return retrieveMemberVoiceStateById(user.getIdLong());
2667+
}
2668+
25992669
/**
26002670
* Returns the verification-Level of this Guild. Verification level is one of the factors that determines if a Member
26012671
* can send messages in a Guild.

src/main/java/net/dv8tion/jda/api/requests/Route.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ public static class Guilds
127127
public static final Route GET_GUILD_EMOJIS = new Route(GET, "guilds/{guild_id}/emojis");
128128
public static final Route GET_AUDIT_LOGS = new Route(GET, "guilds/{guild_id}/audit-logs");
129129
public static final Route GET_VOICE_REGIONS = new Route(GET, "guilds/{guild_id}/regions");
130+
public static final Route GET_VOICE_STATE = new Route(GET, "guilds/{guild_id}/voice-states/{user_id}");
130131
public static final Route UPDATE_VOICE_STATE = new Route(PATCH, "guilds/{guild_id}/voice-states/{user_id}");
131132

132133
public static final Route GET_INTEGRATIONS = new Route(GET, "guilds/{guild_id}/integrations");

src/main/java/net/dv8tion/jda/internal/entities/EntityBuilder.java

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -664,39 +664,51 @@ public MemberImpl createMember(GuildImpl guild, DataObject memberJson, DataObjec
664664

665665
// Load voice state and presence if necessary
666666
if (voiceStateJson != null && member.getVoiceState() != null)
667-
createVoiceState(guild, voiceStateJson, user, member);
667+
createGuildVoiceState(member, voiceStateJson);
668668
if (presence != null)
669669
createPresence(member, presence);
670670
return member;
671671
}
672672

673-
private void createVoiceState(GuildImpl guild, DataObject voiceStateJson, User user, MemberImpl member)
673+
public GuildVoiceState createGuildVoiceState(MemberImpl member, DataObject voiceStateJson)
674674
{
675675
GuildVoiceStateImpl voiceState = (GuildVoiceStateImpl) member.getVoiceState();
676+
if (voiceState == null)
677+
voiceState = new GuildVoiceStateImpl(member);
678+
updateGuildVoiceState(voiceState, voiceStateJson, member);
679+
return voiceState;
680+
}
681+
682+
private void updateGuildVoiceState(GuildVoiceStateImpl oldVoiceState, DataObject newVoiceStateJson, MemberImpl member)
683+
{
684+
Guild guild = member.getGuild();
676685

677-
final long channelId = voiceStateJson.getLong("channel_id");
686+
final long channelId = newVoiceStateJson.getLong("channel_id");
678687
AudioChannel audioChannel = (AudioChannel) guild.getGuildChannelById(channelId);
679688
if (audioChannel != null)
680-
((AudioChannelMixin<?>) audioChannel).getConnectedMembersMap().put(member.getIdLong(), member);
689+
{
690+
if (member.getVoiceState() != null)
691+
((AudioChannelMixin<?>) audioChannel).getConnectedMembersMap().put(member.getIdLong(), member);
692+
}
681693
else
682694
LOG.error("Received a GuildVoiceState with a channel ID for a non-existent channel! ChannelId: {} GuildId: {} UserId: {}",
683-
channelId, guild.getId(), user.getId());
695+
channelId, guild.getId(), member.getId());
684696

685-
String requestToSpeak = voiceStateJson.getString("request_to_speak_timestamp", null);
697+
String requestToSpeak = newVoiceStateJson.getString("request_to_speak_timestamp", null);
686698
OffsetDateTime timestamp = null;
687699
if (requestToSpeak != null)
688700
timestamp = OffsetDateTime.parse(requestToSpeak);
689701

690702
// VoiceState is considered volatile so we don't expect anything to actually exist
691-
voiceState.setSelfMuted(voiceStateJson.getBoolean("self_mute"))
692-
.setSelfDeafened(voiceStateJson.getBoolean("self_deaf"))
693-
.setGuildMuted(voiceStateJson.getBoolean("mute"))
694-
.setGuildDeafened(voiceStateJson.getBoolean("deaf"))
695-
.setSuppressed(voiceStateJson.getBoolean("suppress"))
696-
.setSessionId(voiceStateJson.getString("session_id"))
697-
.setStream(voiceStateJson.getBoolean("self_stream"))
698-
.setRequestToSpeak(timestamp)
699-
.setConnectedChannel(audioChannel);
703+
oldVoiceState.setSelfMuted(newVoiceStateJson.getBoolean("self_mute"))
704+
.setSelfDeafened(newVoiceStateJson.getBoolean("self_deaf"))
705+
.setGuildMuted(newVoiceStateJson.getBoolean("mute"))
706+
.setGuildDeafened(newVoiceStateJson.getBoolean("deaf"))
707+
.setSuppressed(newVoiceStateJson.getBoolean("suppress"))
708+
.setSessionId(newVoiceStateJson.getString("session_id"))
709+
.setStream(newVoiceStateJson.getBoolean("self_stream"))
710+
.setRequestToSpeak(timestamp)
711+
.setConnectedChannel(audioChannel);
700712
}
701713

702714
public void updateMember(GuildImpl guild, MemberImpl member, DataObject content, List<Role> newRoles)

src/main/java/net/dv8tion/jda/internal/entities/GuildImpl.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1164,6 +1164,23 @@ public List<GuildVoiceState> getVoiceStates()
11641164
.collect(Helpers.toUnmodifiableList());
11651165
}
11661166

1167+
@Nonnull
1168+
@Override
1169+
@CheckReturnValue
1170+
public RestAction<GuildVoiceState> retrieveMemberVoiceStateById(long id)
1171+
{
1172+
JDAImpl jda = getJDA();
1173+
Route.CompiledRoute route = Route.Guilds.GET_VOICE_STATE.compile(getId(), Long.toUnsignedString(id));
1174+
return new RestActionImpl<>(jda, route, (response, request) ->
1175+
{
1176+
EntityBuilder entityBuilder = jda.getEntityBuilder();
1177+
DataObject voiceStateData = response.getObject();
1178+
MemberImpl member = entityBuilder.createMember(this, voiceStateData.getObject("member"), null, null);
1179+
entityBuilder.updateMemberCache(member);
1180+
return entityBuilder.createGuildVoiceState(member, voiceStateData);
1181+
});
1182+
}
1183+
11671184
@Nonnull
11681185
@Override
11691186
public VerificationLevel getVerificationLevel()

0 commit comments

Comments
 (0)