Search in sources :

Example 1 with User

use of org.javacord.api.entity.user.User in project Javacord by BtoBastian.

the class ServerUpdaterDelegateImpl method update.

@Override
public CompletableFuture<Void> update() {
    // A set with all members that get updates
    HashSet<User> members = new HashSet<>(userRoles.keySet());
    members.addAll(userNicknames.keySet());
    members.addAll(userMuted.keySet());
    members.addAll(userDeafened.keySet());
    members.addAll(userMoveTargets.keySet());
    // A list with all tasks
    List<CompletableFuture<?>> tasks = new ArrayList<>();
    members.forEach(member -> {
        boolean patchMember = false;
        ObjectNode updateNode = JsonNodeFactory.instance.objectNode();
        Collection<Role> roles = userRoles.get(member);
        if (roles != null) {
            ArrayNode rolesJson = updateNode.putArray("roles");
            roles.stream().map(DiscordEntity::getIdAsString).forEach(rolesJson::add);
            patchMember = true;
        }
        if (userNicknames.containsKey(member)) {
            String nickname = userNicknames.get(member);
            if (member.isYourself()) {
                tasks.add(new RestRequest<Void>(server.getApi(), RestMethod.PATCH, RestEndpoint.OWN_NICKNAME).setUrlParameters(server.getIdAsString()).setBody(JsonNodeFactory.instance.objectNode().put("nick", nickname)).setAuditLogReason(reason).execute(result -> null));
            } else {
                updateNode.put("nick", (nickname == null) ? "" : nickname);
                patchMember = true;
            }
        }
        if (userMuted.containsKey(member)) {
            updateNode.put("mute", userMuted.get(member));
            patchMember = true;
        }
        if (userDeafened.containsKey(member)) {
            updateNode.put("deaf", userDeafened.get(member));
            patchMember = true;
        }
        if (userMoveTargets.containsKey(member)) {
            ServerVoiceChannel channel = userMoveTargets.get(member);
            if (member.isYourself()) {
                ((DiscordApiImpl) server.getApi()).getWebSocketAdapter().sendVoiceStateUpdate(server, channel, null, null);
            } else if (channel != null) {
                updateNode.put("channel_id", channel.getId());
                patchMember = true;
            } else {
                updateNode.putNull("channel_id");
                patchMember = true;
            }
        }
        if (patchMember) {
            tasks.add(new RestRequest<Void>(server.getApi(), RestMethod.PATCH, RestEndpoint.SERVER_MEMBER).setUrlParameters(server.getIdAsString(), member.getIdAsString()).setBody(updateNode).setAuditLogReason(reason).execute(result -> null));
        }
    });
    if (newRolesOrder != null) {
        tasks.add(server.reorderRoles(newRolesOrder, reason));
    }
    // Server settings
    boolean patchServer = false;
    ObjectNode body = JsonNodeFactory.instance.objectNode();
    if (name != null) {
        body.put("name", name);
        patchServer = true;
    }
    if (region != null) {
        body.put("region", region.getKey());
        patchServer = true;
    }
    if (explicitContentFilterLevel != null) {
        body.put("explicit_content_filter", explicitContentFilterLevel.getId());
        patchServer = true;
    }
    if (verificationLevel != null) {
        body.put("verification_level", verificationLevel.getId());
        patchServer = true;
    }
    if (defaultMessageNotificationLevel != null) {
        body.put("default_message_notifications", defaultMessageNotificationLevel.getId());
        patchServer = true;
    }
    if (updateAfkChannel) {
        if (afkChannel != null) {
            body.put("afk_channel_id", afkChannel.getIdAsString());
        } else {
            body.putNull("afk_channel_id");
        }
        patchServer = true;
    }
    if (afkTimeout != null) {
        body.put("afk_timeout", afkTimeout.intValue());
        patchServer = true;
    }
    if (updateIcon) {
        if (icon == null) {
            body.putNull("icon");
        }
        patchServer = true;
    }
    if (updateSplash) {
        if (splash == null) {
            body.putNull("splash");
        }
        patchServer = true;
    }
    if (owner != null) {
        body.put("owner_id", owner.getIdAsString());
        patchServer = true;
    }
    if (updateSystemChannel) {
        if (systemChannel != null) {
            body.put("system_channel_id", systemChannel.getIdAsString());
        } else {
            body.putNull("system_channel_id");
        }
        patchServer = true;
    }
    if (updateModeratorsOnlyChannel) {
        if (moderatorsOnlyChannel != null) {
            body.put("public_updates_channel_id", moderatorsOnlyChannel.getIdAsString());
        } else {
            body.putNull("public_updates_channel_id");
        }
        patchServer = true;
    }
    if (updateRulesChannel) {
        if (rulesChannel != null) {
            body.put("rules_channel_id", rulesChannel.getIdAsString());
        } else {
            body.putNull("rules_channel_id");
        }
        patchServer = true;
    }
    if (updateBanner) {
        if (banner == null) {
            body.putNull("banner");
        }
        patchServer = true;
    }
    if (updateLocale) {
        if (locale == null) {
            body.putNull("preferred_locale");
        } else {
            body.put("preferred_locale", locale.toLanguageTag());
        }
        patchServer = true;
    }
    // Only make a REST call, if we really want to update something
    if (patchServer) {
        if (icon != null || splash != null || banner != null) {
            CompletableFuture<Void> iconFuture = null;
            if (icon != null) {
                iconFuture = icon.asByteArray(server.getApi()).thenAccept(bytes -> {
                    String base64Icon = "data:image/" + icon.getFileType() + ";base64," + Base64.getEncoder().encodeToString(bytes);
                    body.put("icon", base64Icon);
                });
            }
            CompletableFuture<Void> splashFuture = null;
            if (splash != null) {
                splashFuture = splash.asByteArray(server.getApi()).thenAccept(bytes -> {
                    String base64Splash = "data:image/" + splash.getFileType() + ";base64," + Base64.getEncoder().encodeToString(bytes);
                    body.put("splash", base64Splash);
                });
            }
            CompletableFuture<Void> bannerFuture = null;
            if (banner != null) {
                bannerFuture = banner.asByteArray(server.getApi()).thenAccept(bytes -> {
                    String base64Banner = "data:image/" + banner.getFileType() + ";base64," + Base64.getEncoder().encodeToString(bytes);
                    body.put("banner", base64Banner);
                });
            }
            CompletableFuture<Void> future;
            List<CompletableFuture<Void>> futureList = new ArrayList<>();
            if (iconFuture != null) {
                futureList.add(iconFuture);
            }
            if (splashFuture != null) {
                futureList.add(splashFuture);
            }
            if (bannerFuture != null) {
                futureList.add(bannerFuture);
            }
            future = CompletableFuture.allOf(futureList.toArray(new CompletableFuture[futureList.size()]));
            tasks.add(future.thenCompose(aVoid -> new RestRequest<Void>(server.getApi(), RestMethod.PATCH, RestEndpoint.SERVER).setUrlParameters(server.getIdAsString()).setBody(body).setAuditLogReason(reason).execute(result -> null)));
        } else {
            tasks.add(new RestRequest<Void>(server.getApi(), RestMethod.PATCH, RestEndpoint.SERVER).setUrlParameters(server.getIdAsString()).setBody(body).setAuditLogReason(reason).execute(result -> null));
        }
    }
    CompletableFuture<?>[] tasksArray = tasks.toArray(new CompletableFuture<?>[tasks.size()]);
    return CompletableFuture.allOf(tasksArray);
}
Also used : ServerChannel(org.javacord.api.entity.channel.ServerChannel) URL(java.net.URL) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) RestMethod(org.javacord.core.util.rest.RestMethod) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) FileContainer(org.javacord.core.util.FileContainer) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) DiscordEntity(org.javacord.api.entity.DiscordEntity) Region(org.javacord.api.entity.Region) Locale(java.util.Locale) Map(java.util.Map) Icon(org.javacord.api.entity.Icon) RestRequest(org.javacord.core.util.rest.RestRequest) ServerTextChannel(org.javacord.api.entity.channel.ServerTextChannel) DefaultMessageNotificationLevel(org.javacord.api.entity.server.DefaultMessageNotificationLevel) BufferedImage(java.awt.image.BufferedImage) Collection(java.util.Collection) DiscordApiImpl(org.javacord.core.DiscordApiImpl) File(java.io.File) ArrayNode(com.fasterxml.jackson.databind.node.ArrayNode) ServerVoiceChannel(org.javacord.api.entity.channel.ServerVoiceChannel) ExplicitContentFilterLevel(org.javacord.api.entity.server.ExplicitContentFilterLevel) RestEndpoint(org.javacord.core.util.rest.RestEndpoint) Base64(java.util.Base64) List(java.util.List) User(org.javacord.api.entity.user.User) JsonNodeFactory(com.fasterxml.jackson.databind.node.JsonNodeFactory) Role(org.javacord.api.entity.permission.Role) VerificationLevel(org.javacord.api.entity.server.VerificationLevel) Server(org.javacord.api.entity.server.Server) ServerUpdaterDelegate(org.javacord.api.entity.server.internal.ServerUpdaterDelegate) InputStream(java.io.InputStream) User(org.javacord.api.entity.user.User) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) ArrayList(java.util.ArrayList) Role(org.javacord.api.entity.permission.Role) CompletableFuture(java.util.concurrent.CompletableFuture) RestRequest(org.javacord.core.util.rest.RestRequest) ArrayNode(com.fasterxml.jackson.databind.node.ArrayNode) ServerVoiceChannel(org.javacord.api.entity.channel.ServerVoiceChannel) HashSet(java.util.HashSet)

Example 2 with User

use of org.javacord.api.entity.user.User in project Javacord by BtoBastian.

the class RegularServerChannel method getEffectivePermissions.

/**
 * Gets the effective permissions of a user in this channel.
 * The returned permission object will only have {@link PermissionState#ALLOWED} and
 * {@link PermissionState#DENIED} states!
 * It takes into account global permissions and the effective overwritten permissions of a user.
 * Remember, that some permissions affect others!
 * E.g. a user who has {@link PermissionType#SEND_MESSAGES} but not {@link PermissionType#READ_MESSAGES} cannot
 * send messages, even though he has the {@link PermissionType#SEND_MESSAGES} permission.
 *
 * @param user The user.
 * @return The effective permissions of the user in this channel.
 */
default Permissions getEffectivePermissions(User user) {
    if (getServer().isOwner(user)) {
        return getServer().getPermissions(user);
    }
    PermissionsBuilder builder = new PermissionsBuilder(getServer().getPermissions(user));
    Permissions effectiveOverwrittenPermissions = getEffectiveOverwrittenPermissions(user);
    Arrays.stream(PermissionType.values()).filter(type -> effectiveOverwrittenPermissions.getState(type) != PermissionState.UNSET).forEachOrdered(type -> builder.setState(type, effectiveOverwrittenPermissions.getState(type)));
    Arrays.stream(PermissionType.values()).filter(type -> builder.getState(type) == PermissionState.UNSET).forEachOrdered(type -> builder.setState(type, PermissionState.DENIED));
    return builder.build();
}
Also used : PermissionType(org.javacord.api.entity.permission.PermissionType) Arrays(java.util.Arrays) PermissionsBuilder(org.javacord.api.entity.permission.PermissionsBuilder) Collection(java.util.Collection) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) Permissionable(org.javacord.api.entity.Permissionable) Permissions(org.javacord.api.entity.permission.Permissions) DiscordEntity(org.javacord.api.entity.DiscordEntity) PermissionState(org.javacord.api.entity.permission.PermissionState) User(org.javacord.api.entity.user.User) Map(java.util.Map) Optional(java.util.Optional) NoSuchElementException(java.util.NoSuchElementException) Collections(java.util.Collections) Permissions(org.javacord.api.entity.permission.Permissions) PermissionsBuilder(org.javacord.api.entity.permission.PermissionsBuilder)

Example 3 with User

use of org.javacord.api.entity.user.User 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);
            }
        }
    });
}
Also used : UserChangeNameEventImpl(org.javacord.core.event.user.UserChangeNameEventImpl) Member(org.javacord.core.entity.user.Member) UserChangeServerAvatarEventImpl(org.javacord.core.event.user.UserChangeServerAvatarEventImpl) UserChangePendingEvent(org.javacord.api.event.user.UserChangePendingEvent) UserRoleRemoveEventImpl(org.javacord.core.event.server.role.UserRoleRemoveEventImpl) UserChangeAvatarEvent(org.javacord.api.event.user.UserChangeAvatarEvent) UserChangeAvatarEventImpl(org.javacord.core.event.user.UserChangeAvatarEventImpl) UserChangeNicknameEvent(org.javacord.api.event.user.UserChangeNicknameEvent) UserChangeServerAvatarEvent(org.javacord.api.event.user.UserChangeServerAvatarEvent) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) MessageCacheImpl(org.javacord.core.util.cache.MessageCacheImpl) UserRoleRemoveEvent(org.javacord.api.event.server.role.UserRoleRemoveEvent) UserChangePendingEventImpl(org.javacord.core.event.user.UserChangePendingEventImpl) ServerTextChannel(org.javacord.api.entity.channel.ServerTextChannel) JsonNode(com.fasterxml.jackson.databind.JsonNode) UserChangeDiscriminatorEventImpl(org.javacord.core.event.user.UserChangeDiscriminatorEventImpl) ServerImpl(org.javacord.core.entity.server.ServerImpl) Predicate(java.util.function.Predicate) UserImpl(org.javacord.core.entity.user.UserImpl) Collection(java.util.Collection) MemberImpl(org.javacord.core.entity.user.MemberImpl) Set(java.util.Set) Collectors(java.util.stream.Collectors) UserRoleAddEvent(org.javacord.api.event.server.role.UserRoleAddEvent) UserChangeNameEvent(org.javacord.api.event.user.UserChangeNameEvent) Objects(java.util.Objects) LoggerUtil(org.javacord.core.util.logging.LoggerUtil) Logger(org.apache.logging.log4j.Logger) User(org.javacord.api.entity.user.User) UserRoleAddEventImpl(org.javacord.core.event.server.role.UserRoleAddEventImpl) Role(org.javacord.api.entity.permission.Role) PacketHandler(org.javacord.core.util.gateway.PacketHandler) DiscordApi(org.javacord.api.DiscordApi) UserChangeNicknameEventImpl(org.javacord.core.event.user.UserChangeNicknameEventImpl) DispatchQueueSelector(org.javacord.core.util.event.DispatchQueueSelector) Collections(java.util.Collections) UserChangeDiscriminatorEvent(org.javacord.api.event.user.UserChangeDiscriminatorEvent) UserChangePendingEvent(org.javacord.api.event.user.UserChangePendingEvent) ArrayList(java.util.ArrayList) JsonNode(com.fasterxml.jackson.databind.JsonNode) UserChangeNicknameEventImpl(org.javacord.core.event.user.UserChangeNicknameEventImpl) UserChangePendingEventImpl(org.javacord.core.event.user.UserChangePendingEventImpl) ServerImpl(org.javacord.core.entity.server.ServerImpl) UserRoleRemoveEvent(org.javacord.api.event.server.role.UserRoleRemoveEvent) UserImpl(org.javacord.core.entity.user.UserImpl) Member(org.javacord.core.entity.user.Member) HashSet(java.util.HashSet) UserRoleAddEventImpl(org.javacord.core.event.server.role.UserRoleAddEventImpl) MemberImpl(org.javacord.core.entity.user.MemberImpl) UserChangeServerAvatarEventImpl(org.javacord.core.event.user.UserChangeServerAvatarEventImpl) Role(org.javacord.api.entity.permission.Role) UserRoleAddEvent(org.javacord.api.event.server.role.UserRoleAddEvent) ServerTextChannel(org.javacord.api.entity.channel.ServerTextChannel) MessageCacheImpl(org.javacord.core.util.cache.MessageCacheImpl) UserChangeServerAvatarEvent(org.javacord.api.event.user.UserChangeServerAvatarEvent) UserChangeNicknameEvent(org.javacord.api.event.user.UserChangeNicknameEvent) UserRoleRemoveEventImpl(org.javacord.core.event.server.role.UserRoleRemoveEventImpl)

Example 4 with User

use of org.javacord.api.entity.user.User in project Javacord by BtoBastian.

the class ChannelUpdateHandler method handleRegularServerChannel.

private void handleRegularServerChannel(JsonNode jsonChannel) {
    long channelId = jsonChannel.get("id").asLong();
    Optional<RegularServerChannel> optionalChannel = api.getRegularServerChannelById(channelId);
    if (!optionalChannel.isPresent()) {
        LoggerUtil.logMissingChannel(logger, channelId);
        return;
    }
    RegularServerChannelImpl channel = (RegularServerChannelImpl) optionalChannel.get();
    ServerImpl server = (ServerImpl) channel.getServer();
    final AtomicBoolean areYouAffected = new AtomicBoolean(false);
    ChannelCategory oldCategory = channel.asCategorizable().flatMap(Categorizable::getCategory).orElse(null);
    ChannelCategory newCategory = jsonChannel.hasNonNull("parent_id") ? channel.getServer().getChannelCategoryById(jsonChannel.get("parent_id").asLong(-1)).orElse(null) : null;
    final RegularServerChannelImpl regularServerChannel = (RegularServerChannelImpl) channel;
    final int oldRawPosition = regularServerChannel.getRawPosition();
    final int newRawPosition = jsonChannel.get("position").asInt();
    if (oldRawPosition != newRawPosition || !Objects.deepEquals(oldCategory, newCategory)) {
        final int oldPosition = regularServerChannel.getPosition();
        if (regularServerChannel instanceof ServerTextChannelImpl) {
            ((ServerTextChannelImpl) regularServerChannel).setParentId(newCategory == null ? -1 : newCategory.getId());
        } else if (regularServerChannel instanceof ServerVoiceChannelImpl) {
            ((ServerVoiceChannelImpl) regularServerChannel).setParentId(newCategory == null ? -1 : newCategory.getId());
        }
        regularServerChannel.setRawPosition(newRawPosition);
        final int newPosition = regularServerChannel.getPosition();
        final ServerChannelChangePositionEvent event = new ServerChannelChangePositionEventImpl(regularServerChannel, newPosition, oldPosition, newRawPosition, oldRawPosition, newCategory, oldCategory);
        if (server.isReady()) {
            api.getEventDispatcher().dispatchServerChannelChangePositionEvent((DispatchQueueSelector) regularServerChannel.getServer(), regularServerChannel.getServer(), regularServerChannel, event);
        }
    }
    Collection<Long> rolesWithOverwrittenPermissions = new HashSet<>();
    Collection<Long> usersWithOverwrittenPermissions = new HashSet<>();
    if (jsonChannel.has("permission_overwrites") && !jsonChannel.get("permission_overwrites").isNull()) {
        for (JsonNode permissionOverwriteJson : jsonChannel.get("permission_overwrites")) {
            Permissions oldOverwrittenPermissions;
            ConcurrentHashMap<Long, Permissions> overwrittenPermissions;
            long entityId = permissionOverwriteJson.get("id").asLong();
            Optional<DiscordEntity> entity;
            switch(permissionOverwriteJson.get("type").asInt()) {
                case 0:
                    Role role = server.getRoleById(entityId).orElseThrow(() -> new IllegalStateException("Received channel update event with unknown role!"));
                    entity = Optional.of(role);
                    oldOverwrittenPermissions = regularServerChannel.getOverwrittenPermissions(role);
                    overwrittenPermissions = regularServerChannel.getInternalOverwrittenRolePermissions();
                    rolesWithOverwrittenPermissions.add(entityId);
                    break;
                case 1:
                    oldOverwrittenPermissions = regularServerChannel.getOverwrittenUserPermissions().getOrDefault(entityId, PermissionsImpl.EMPTY_PERMISSIONS);
                    entity = api.getCachedUserById(entityId).map(DiscordEntity.class::cast);
                    overwrittenPermissions = regularServerChannel.getInternalOverwrittenUserPermissions();
                    usersWithOverwrittenPermissions.add(entityId);
                    break;
                default:
                    throw new IllegalStateException("Permission overwrite object with unknown type: " + permissionOverwriteJson);
            }
            long allow = permissionOverwriteJson.get("allow").asLong(0);
            long deny = permissionOverwriteJson.get("deny").asLong(0);
            Permissions newOverwrittenPermissions = new PermissionsImpl(allow, deny);
            if (!newOverwrittenPermissions.equals(oldOverwrittenPermissions)) {
                overwrittenPermissions.put(entityId, newOverwrittenPermissions);
                if (server.isReady()) {
                    dispatchServerChannelChangeOverwrittenPermissionsEvent(channel, newOverwrittenPermissions, oldOverwrittenPermissions, entityId, entity.orElse(null));
                    areYouAffected.compareAndSet(false, entityId == api.getYourself().getId());
                    entity.filter(e -> e instanceof Role).map(Role.class::cast).ifPresent(role -> areYouAffected.compareAndSet(false, role.getUsers().stream().anyMatch(User::isYourself)));
                }
            }
        }
    }
    ConcurrentHashMap<Long, Permissions> overwrittenRolePermissions;
    ConcurrentHashMap<Long, Permissions> overwrittenUserPermissions;
    overwrittenRolePermissions = regularServerChannel.getInternalOverwrittenRolePermissions();
    overwrittenUserPermissions = regularServerChannel.getInternalOverwrittenUserPermissions();
    Iterator<Map.Entry<Long, Permissions>> userIt = overwrittenUserPermissions.entrySet().iterator();
    while (userIt.hasNext()) {
        Map.Entry<Long, Permissions> entry = userIt.next();
        if (usersWithOverwrittenPermissions.contains(entry.getKey())) {
            continue;
        }
        Permissions oldPermissions = entry.getValue();
        userIt.remove();
        if (server.isReady()) {
            dispatchServerChannelChangeOverwrittenPermissionsEvent(channel, PermissionsImpl.EMPTY_PERMISSIONS, oldPermissions, entry.getKey(), api.getCachedUserById(entry.getKey()).orElse(null));
            areYouAffected.compareAndSet(false, entry.getKey() == api.getYourself().getId());
        }
    }
    Iterator<Map.Entry<Long, Permissions>> roleIt = overwrittenRolePermissions.entrySet().iterator();
    while (roleIt.hasNext()) {
        Map.Entry<Long, Permissions> entry = roleIt.next();
        if (rolesWithOverwrittenPermissions.contains(entry.getKey())) {
            continue;
        }
        api.getRoleById(entry.getKey()).ifPresent(role -> {
            Permissions oldPermissions = entry.getValue();
            roleIt.remove();
            if (server.isReady()) {
                dispatchServerChannelChangeOverwrittenPermissionsEvent(channel, PermissionsImpl.EMPTY_PERMISSIONS, oldPermissions, role.getId(), role);
                areYouAffected.compareAndSet(false, role.getUsers().stream().anyMatch(User::isYourself));
            }
        });
    }
    if (areYouAffected.get() && !channel.canYouSee()) {
        api.forEachCachedMessageWhere(msg -> msg.getChannel().getId() == channelId, msg -> {
            api.removeMessageFromCache(msg.getId());
            ((MessageCacheImpl) ((TextChannel) channel).getMessageCache()).removeMessage(msg);
        });
    }
}
Also used : User(org.javacord.api.entity.user.User) RegularServerChannel(org.javacord.api.entity.channel.RegularServerChannel) RegularServerChannelImpl(org.javacord.core.entity.channel.RegularServerChannelImpl) JsonNode(com.fasterxml.jackson.databind.JsonNode) ServerChannelChangePositionEvent(org.javacord.api.event.channel.server.ServerChannelChangePositionEvent) ServerImpl(org.javacord.core.entity.server.ServerImpl) PermissionsImpl(org.javacord.core.entity.permission.PermissionsImpl) Permissions(org.javacord.api.entity.permission.Permissions) ServerTextChannelImpl(org.javacord.core.entity.channel.ServerTextChannelImpl) HashSet(java.util.HashSet) ServerVoiceChannelImpl(org.javacord.core.entity.channel.ServerVoiceChannelImpl) Role(org.javacord.api.entity.permission.Role) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) MessageCacheImpl(org.javacord.core.util.cache.MessageCacheImpl) ServerChannelChangePositionEventImpl(org.javacord.core.event.channel.server.ServerChannelChangePositionEventImpl) ChannelCategory(org.javacord.api.entity.channel.ChannelCategory) Map(java.util.Map) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) DiscordEntity(org.javacord.api.entity.DiscordEntity)

Example 5 with User

use of org.javacord.api.entity.user.User in project Javacord by BtoBastian.

the class GuildBanAddHandler method handle.

@Override
public void handle(JsonNode packet) {
    api.getPossiblyUnreadyServerById(packet.get("guild_id").asLong()).map(server -> (ServerImpl) server).ifPresent(server -> {
        User user = new UserImpl(api, packet.get("user"), (MemberImpl) null, server);
        server.removeMember(user.getId());
        ServerMemberBanEvent event = new ServerMemberBanEventImpl(server, user);
        api.getEventDispatcher().dispatchServerMemberBanEvent(server, server, user, event);
    });
}
Also used : ServerImpl(org.javacord.core.entity.server.ServerImpl) ServerMemberBanEvent(org.javacord.api.event.server.member.ServerMemberBanEvent) User(org.javacord.api.entity.user.User) PacketHandler(org.javacord.core.util.gateway.PacketHandler) DiscordApi(org.javacord.api.DiscordApi) UserImpl(org.javacord.core.entity.user.UserImpl) ServerMemberBanEventImpl(org.javacord.core.event.server.member.ServerMemberBanEventImpl) MemberImpl(org.javacord.core.entity.user.MemberImpl) JsonNode(com.fasterxml.jackson.databind.JsonNode) User(org.javacord.api.entity.user.User) ServerImpl(org.javacord.core.entity.server.ServerImpl) UserImpl(org.javacord.core.entity.user.UserImpl) ServerMemberBanEvent(org.javacord.api.event.server.member.ServerMemberBanEvent) ServerMemberBanEventImpl(org.javacord.core.event.server.member.ServerMemberBanEventImpl)

Aggregations

User (org.javacord.api.entity.user.User)12 JsonNode (com.fasterxml.jackson.databind.JsonNode)7 DiscordApi (org.javacord.api.DiscordApi)6 ServerImpl (org.javacord.core.entity.server.ServerImpl)6 PacketHandler (org.javacord.core.util.gateway.PacketHandler)6 MemberImpl (org.javacord.core.entity.user.MemberImpl)5 UserImpl (org.javacord.core.entity.user.UserImpl)5 Role (org.javacord.api.entity.permission.Role)4 Collection (java.util.Collection)3 HashSet (java.util.HashSet)3 Map (java.util.Map)3 DiscordEntity (org.javacord.api.entity.DiscordEntity)3 ServerTextChannel (org.javacord.api.entity.channel.ServerTextChannel)3 Permissions (org.javacord.api.entity.permission.Permissions)3 MessageCacheImpl (org.javacord.core.util.cache.MessageCacheImpl)3 ObjectNode (com.fasterxml.jackson.databind.node.ObjectNode)2 ArrayList (java.util.ArrayList)2 Collections (java.util.Collections)2 HashMap (java.util.HashMap)2 Set (java.util.Set)2