use of org.javacord.core.entity.user.UserImpl in project Javacord by BtoBastian.
the class PrivateChannelImpl method getOrCreatePrivateChannel.
/**
* This function is used internally by Javacord to get create and update private channels.
* It checks if the recipient is known and dispatches a private channel create event if the channel got created.
*
* @param api The discord api instance.
* @param channelId The id of the channel to get.
* @param userId The id of the recipient of the channel or yourself.
* @param user The user with the user id.
*
* @return The private channel with the id.
*/
public static PrivateChannelImpl getOrCreatePrivateChannel(DiscordApiImpl api, long channelId, long userId, UserImpl user) {
Optional<PrivateChannel> optionalChannel = api.getPrivateChannelById(channelId);
if (optionalChannel.isPresent()) {
// if necessary update private channel information
PrivateChannelImpl channel = (PrivateChannelImpl) optionalChannel.get();
if (!channel.getRecipientId().isPresent() && userId != api.getYourself().getId()) {
channel.updateRecipientId(userId);
}
if (!channel.getRecipient().isPresent()) {
UserImpl recipient;
if (user == null) {
recipient = (UserImpl) api.getCachedUserById(userId).orElse(null);
} else {
recipient = user;
}
if (recipient != null && !recipient.isYourself()) {
channel.updateRecipient(recipient);
}
}
return channel;
}
if (userId == api.getYourself().getId()) {
return dispatchPrivateChannelCreateEvent(api, new PrivateChannelImpl(api, channelId, null, null));
}
UserImpl recipient;
if (user == null) {
recipient = (UserImpl) api.getCachedUserById(userId).orElse(null);
} else {
recipient = user;
}
return dispatchPrivateChannelCreateEvent(api, new PrivateChannelImpl(api, channelId, recipient, userId));
}
use of org.javacord.core.entity.user.UserImpl in project Javacord by BtoBastian.
the class InteractionCreateHandler method handle.
@Override
public void handle(JsonNode packet) {
TextChannel channel = null;
if (packet.hasNonNull("channel_id")) {
long channelId = packet.get("channel_id").asLong();
// Check if this interaction comes from a guild or a DM
if (packet.hasNonNull("guild_id")) {
channel = api.getTextChannelById(channelId).orElse(null);
} else {
UserImpl user = new UserImpl(api, packet.get("user"), (MemberImpl) null, null);
channel = PrivateChannelImpl.getOrCreatePrivateChannel(api, channelId, user.getId(), user);
}
}
int typeId = packet.get("type").asInt();
final InteractionType interactionType = InteractionType.fromValue(typeId);
ComponentType componentType = null;
InteractionImpl interaction;
switch(interactionType) {
case APPLICATION_COMMAND:
int applicationCommandTypeId = packet.get("data").get("type").asInt();
ApplicationCommandType applicationCommandType = ApplicationCommandType.fromValue(applicationCommandTypeId);
switch(applicationCommandType) {
case SLASH:
interaction = new SlashCommandInteractionImpl(api, channel, packet);
break;
case USER:
interaction = new UserContextMenuInteractionImpl(api, channel, packet);
break;
case MESSAGE:
interaction = new MessageContextMenuInteractionImpl(api, channel, packet);
break;
default:
logger.info("Got application command interaction of unknown type <{}>. " + "Please contact the developer!", applicationCommandTypeId);
return;
}
break;
case MESSAGE_COMPONENT:
int componentTypeId = packet.get("data").get("component_type").asInt();
componentType = ComponentType.fromId(componentTypeId);
switch(componentType) {
case BUTTON:
interaction = new ButtonInteractionImpl(api, channel, packet);
break;
case ACTION_ROW:
logger.warn("Received a message component interaction of type ACTION_ROW. This should not" + " be possible.");
return;
case SELECT_MENU:
interaction = new SelectMenuInteractionImpl(api, channel, packet);
break;
default:
logger.warn("Received message component interaction of unknown type <{}>. " + "Please contact the developer!", componentTypeId);
return;
}
break;
case APPLICATION_COMMAND_AUTOCOMPLETE:
interaction = new AutocompleteInteractionImpl(api, channel, packet);
break;
default:
logger.warn("Received interaction of unknown type <{}>. " + "Please contact the developer!", typeId);
return;
}
InteractionCreateEvent event = new InteractionCreateEventImpl(interaction);
ServerImpl server = (ServerImpl) interaction.getServer().orElse(null);
api.getEventDispatcher().dispatchInteractionCreateEvent(server == null ? api : server, server, interaction.getChannel().orElse(null), interaction.getUser(), event);
switch(interactionType) {
case APPLICATION_COMMAND:
int applicationCommandTypeId = packet.get("data").get("type").asInt();
ApplicationCommandType applicationCommandType = ApplicationCommandType.fromValue(applicationCommandTypeId);
switch(applicationCommandType) {
case SLASH:
SlashCommandCreateEvent slashCommandCreateEvent = new SlashCommandCreateEventImpl(interaction);
api.getEventDispatcher().dispatchSlashCommandCreateEvent(server == null ? api : server, server, interaction.getChannel().orElse(null), interaction.getUser(), slashCommandCreateEvent);
break;
case USER:
UserContextMenuCommandEvent userContextMenuCommandEvent = new UserContextMenuCommandEventImpl(interaction);
api.getEventDispatcher().dispatchUserContextMenuCommandEvent(server, server, interaction.getChannel().orElse(null), interaction.getUser(), userContextMenuCommandEvent);
break;
case MESSAGE:
MessageContextMenuCommandEvent messageContextMenuCommandEvent = new MessageContextMenuCommandEventImpl(interaction);
api.getEventDispatcher().dispatchMessageContextMenuCommandEvent(server, interaction.asMessageContextMenuInteraction().orElseThrow(AssertionError::new).getTarget().getId(), server, interaction.getChannel().orElse(null), interaction.getUser(), messageContextMenuCommandEvent);
break;
default:
logger.info("Got application command interaction of unknown type <{}>. " + "Please contact the developer!", applicationCommandTypeId);
return;
}
break;
case MESSAGE_COMPONENT:
MessageComponentCreateEvent messageComponentCreateEvent = new MessageComponentCreateEventImpl(interaction);
long messageId = messageComponentCreateEvent.getMessageComponentInteraction().getMessage().getId();
api.getEventDispatcher().dispatchMessageComponentCreateEvent(server == null ? api : server, messageId, server, interaction.getChannel().orElse(null), interaction.getUser(), messageComponentCreateEvent);
switch(componentType) {
case BUTTON:
ButtonClickEvent buttonClickEvent = new ButtonClickEventImpl(interaction);
api.getEventDispatcher().dispatchButtonClickEvent(server == null ? api : server, messageId, server, interaction.getChannel().orElse(null), interaction.getUser(), buttonClickEvent);
break;
case SELECT_MENU:
SelectMenuChooseEvent selectMenuChooseEvent = new SelectMenuChooseEventImpl(interaction);
api.getEventDispatcher().dispatchSelectMenuChooseEvent(server == null ? api : server, messageId, server, interaction.getChannel().orElse(null), interaction.getUser(), selectMenuChooseEvent);
break;
default:
break;
}
break;
case APPLICATION_COMMAND_AUTOCOMPLETE:
AutocompleteCreateEvent autocompleteCreateEvent = new AutocompleteCreateEventImpl(interaction);
api.getEventDispatcher().dispatchAutocompleteCreateEvent(server == null ? api : server, server, interaction.getChannel().orElse(null), interaction.getUser(), autocompleteCreateEvent);
break;
default:
break;
}
}
use of org.javacord.core.entity.user.UserImpl in project Javacord by BtoBastian.
the class PresenceUpdateHandler method dispatchUserStatusChangeEventIfChangeDetected.
private void dispatchUserStatusChangeEventIfChangeDetected(long userId, UserStatus newStatus, UserStatus oldStatus, Map<DiscordClient, UserStatus> newClientStatus, Map<DiscordClient, UserStatus> oldClientStatus) {
UserImpl user = api.getCachedUserById(userId).map(UserImpl.class::cast).orElse(null);
// Only dispatch the event if something changed
boolean shouldDispatch = false;
if (newClientStatus != oldClientStatus) {
shouldDispatch = true;
}
for (DiscordClient client : DiscordClient.values()) {
if (newClientStatus.get(client) != oldClientStatus.get(client)) {
shouldDispatch = true;
}
}
if (!shouldDispatch) {
return;
}
UserChangeStatusEvent event = new UserChangeStatusEventImpl(api, userId, newStatus, oldStatus, newClientStatus, oldClientStatus);
api.getEventDispatcher().dispatchUserChangeStatusEvent(api, user == null ? Collections.emptySet() : user.getMutualServers(), user == null ? Collections.emptySet() : Collections.singleton(user), event);
}
use of org.javacord.core.entity.user.UserImpl in project Javacord by BtoBastian.
the class GuildMemberUpdateHandler method handle.
@Override
public void handle(JsonNode packet) {
api.getPossiblyUnreadyServerById(packet.get("guild_id").asLong()).map(server -> (ServerImpl) server).ifPresent(server -> {
MemberImpl newMember = new MemberImpl(api, server, packet, null);
Member oldMember = server.getRealMemberById(newMember.getId()).orElse(null);
api.addMemberToCacheOrReplaceExisting(newMember);
if (oldMember == null) {
// Should only happen shortly after startup and is unproblematic
return;
}
if (!newMember.getNickname().equals(oldMember.getNickname())) {
UserChangeNicknameEvent event = new UserChangeNicknameEventImpl(newMember, oldMember);
api.getEventDispatcher().dispatchUserChangeNicknameEvent(server, server, newMember.getUser(), event);
}
if (!newMember.getServerAvatarHash().equals(oldMember.getServerAvatarHash())) {
UserChangeServerAvatarEvent event = new UserChangeServerAvatarEventImpl(newMember, oldMember);
api.getEventDispatcher().dispatchUserChangeServerAvatarEvent(server, server, newMember.getUser(), event);
}
if (newMember.isPending() != oldMember.isPending()) {
UserChangePendingEvent event = new UserChangePendingEventImpl(oldMember, newMember);
api.getEventDispatcher().dispatchUserChangePendingEvent(server, server, newMember.getUser(), event);
}
if (packet.has("roles")) {
JsonNode jsonRoles = packet.get("roles");
Collection<Role> newRoles = new HashSet<>();
Collection<Role> oldRoles = oldMember.getRoles();
Collection<Role> intersection = new HashSet<>();
for (JsonNode roleIdJson : jsonRoles) {
api.getRoleById(roleIdJson.asText()).map(role -> {
newRoles.add(role);
return role;
}).filter(oldRoles::contains).ifPresent(intersection::add);
}
// Added roles
Collection<Role> addedRoles = new ArrayList<>(newRoles);
addedRoles.removeAll(intersection);
for (Role role : addedRoles) {
if (role.isEveryoneRole()) {
continue;
}
UserRoleAddEvent event = new UserRoleAddEventImpl(role, newMember);
api.getEventDispatcher().dispatchUserRoleAddEvent((DispatchQueueSelector) role.getServer(), role, role.getServer(), newMember.getId(), event);
}
// Removed roles
Collection<Role> removedRoles = new ArrayList<>(oldRoles);
removedRoles.removeAll(intersection);
for (Role role : removedRoles) {
if (role.isEveryoneRole()) {
continue;
}
UserRoleRemoveEvent event = new UserRoleRemoveEventImpl(role, newMember);
api.getEventDispatcher().dispatchUserRoleRemoveEvent((DispatchQueueSelector) role.getServer(), role, role.getServer(), newMember.getId(), event);
}
}
if (newMember.getUser().isYourself()) {
Set<Long> unreadableChannels = server.getTextChannels().stream().filter(((Predicate<ServerTextChannel>) ServerTextChannel::canYouSee).negate()).map(ServerTextChannel::getId).collect(Collectors.toSet());
api.forEachCachedMessageWhere(msg -> unreadableChannels.contains(msg.getChannel().getId()), msg -> {
api.removeMessageFromCache(msg.getId());
((MessageCacheImpl) msg.getChannel().getMessageCache()).removeMessage(msg);
});
}
// https://github.com/discord/discord-api-docs/pull/1307#issuecomment-581561519
if (oldMember.getUser() != null) {
UserImpl oldUser = (UserImpl) oldMember.getUser();
boolean userChanged = false;
UserImpl updatedUser = oldUser.replacePartialUserData(packet.get("user"));
if (packet.get("user").has("username")) {
String newName = packet.get("user").get("username").asText();
String oldName = oldUser.getName();
if (!oldName.equals(newName)) {
dispatchUserChangeNameEvent(updatedUser, newName, oldName);
userChanged = true;
}
}
if (packet.get("user").has("discriminator")) {
String newDiscriminator = packet.get("user").get("discriminator").asText();
String oldDiscriminator = oldUser.getDiscriminator();
if (!oldDiscriminator.equals(newDiscriminator)) {
dispatchUserChangeDiscriminatorEvent(updatedUser, newDiscriminator, oldDiscriminator);
userChanged = true;
}
}
if (packet.get("user").has("avatar")) {
String newAvatarHash = packet.get("user").get("avatar").asText(null);
String oldAvatarHash = oldUser.getAvatarHash().orElse(null);
if (!Objects.deepEquals(newAvatarHash, oldAvatarHash)) {
dispatchUserChangeAvatarEvent(updatedUser, newAvatarHash, oldAvatarHash);
userChanged = true;
}
}
if (userChanged) {
api.updateUserOfAllMembers(updatedUser);
}
}
});
}
use of org.javacord.core.entity.user.UserImpl in project Javacord by BtoBastian.
the class ReadyHandler method handle.
@Override
public void handle(JsonNode packet) {
// Purge the cache first
api.purgeCache();
JsonNode guilds = packet.get("guilds");
for (JsonNode guildJson : guilds) {
if (guildJson.has("unavailable") && guildJson.get("unavailable").asBoolean()) {
api.addUnavailableServerToCache(guildJson.get("id").asLong());
continue;
}
new ServerImpl(api, guildJson);
}
// https://github.com/hammerandchisel/discord-api-docs/issues/184
if (packet.has("private_channels")) {
JsonNode privateChannels = packet.get("private_channels");
for (JsonNode channelJson : privateChannels) {
switch(ChannelType.fromId(channelJson.get("type").asInt())) {
case PRIVATE_CHANNEL:
new PrivateChannelImpl(api, channelJson);
break;
case GROUP_CHANNEL:
new GroupChannelImpl(api, channelJson);
break;
default:
logger.warn("Unknown or unexpected channel type. Your Javacord version might be out of date!");
}
}
}
api.setYourself(new UserImpl(api, packet.get("user"), (MemberImpl) null, null));
}
Aggregations