diff --git a/src/main/java/com/mewna/catnip/rest/MultipartBodyPublisher.java b/src/main/java/com/mewna/catnip/rest/MultipartBodyPublisher.java index 1934b50011..8f15310845 100644 --- a/src/main/java/com/mewna/catnip/rest/MultipartBodyPublisher.java +++ b/src/main/java/com/mewna/catnip/rest/MultipartBodyPublisher.java @@ -22,34 +22,35 @@ */ @SuppressWarnings("UnusedReturnValue") + public class MultipartBodyPublisher { - private final Collection partsSpecificationList = new ArrayList<>(); + private final Collection partsList = new ArrayList<>(); @Getter private final String boundary = UUID.randomUUID().toString(); public BodyPublisher build() { - if(partsSpecificationList.isEmpty()) { + if(partsList.isEmpty()) { throw new IllegalStateException("Must have at least one part to build multipart message."); } addFinalBoundary(); return BodyPublishers.ofByteArrays(PartsIterator::new); } + private void addFinalBoundary() { + partsList.add(new PartsSpecification(Type.FINAL_BOUNDARY, null)); + } @ParametersAreNonnullByDefault public MultipartBodyPublisher addPart(final String name, final String value) { - partsSpecificationList.add(new PartsSpecification(Type.STRING, name).value(value.getBytes(StandardCharsets.UTF_8))); + partsList.add(new PartsSpecification(Type.STRING, name).value(value.getBytes(StandardCharsets.UTF_8))); return this; } @ParametersAreNonnullByDefault public MultipartBodyPublisher addPart(final String name, final String filename, final byte[] value) { - partsSpecificationList.add(new PartsSpecification(Type.FILE, name).filename(filename).value(value)); + partsList.add(new PartsSpecification(Type.FILE, name).filename(filename).value(value)); return this; } - private void addFinalBoundary() { - partsSpecificationList.add(new PartsSpecification(Type.FINAL_BOUNDARY, null)); - } public enum Type { STRING, FILE, FINAL_BOUNDARY @@ -63,7 +64,8 @@ protected class PartsSpecification { protected final String name; protected byte[] value; protected String filename; - + protected String contentType; + public String toString() { if(type == Type.FINAL_BOUNDARY) { return "--" + boundary + "--"; @@ -81,7 +83,7 @@ class PartsIterator implements Iterator { private boolean done; PartsIterator() { - parts = partsSpecificationList.iterator(); + parts = partsList.iterator(); } @Override @@ -107,17 +109,26 @@ public byte[] next() { } return next.remove(0); } + + private void processNextPart(PartsSpecification part, List next) { + next.add(part.toString().getBytes(StandardCharsets.UTF_8)); + if(part.type != Type.FINAL_BOUNDARY) { + next.add(part.value); + next.add(new byte[] {'\r', '\n'}); + } + } private void computeNext() { if(!parts.hasNext()) { return; } final var part = parts.next(); - next.add(part.toString().getBytes(StandardCharsets.UTF_8)); - if(part.type != Type.FINAL_BOUNDARY) { - next.add(part.value); - next.add(new byte[] {'\r', '\n'}); - } + processNextPart(part, next); + } +// next.add(part.toString().getBytes(StandardCharsets.UTF_8)); +// if(part.type != Type.FINAL_BOUNDARY) { +// next.add(part.value); +// next.add(new byte[] {'\r', '\n'}); +// } } } -} \ No newline at end of file diff --git a/src/main/java/com/mewna/catnip/rest/ResponsePayload.java b/src/main/java/com/mewna/catnip/rest/ResponsePayload.java index f2c360a189..11190f51cb 100644 --- a/src/main/java/com/mewna/catnip/rest/ResponsePayload.java +++ b/src/main/java/com/mewna/catnip/rest/ResponsePayload.java @@ -34,9 +34,11 @@ public class ResponsePayload { private final String body; - + private final String jsonString; public ResponsePayload(final String body) { + this.body = body; + this.jsonString=body; } public String string() { @@ -45,7 +47,7 @@ public String string() { public JsonObject object() { try { - return JsonParser.object().from(body); + return JsonParser.object().from(jsonString); } catch(final JsonParserException e) { throw new IllegalStateException(e); } @@ -53,7 +55,7 @@ public JsonObject object() { public JsonArray array() { try { - return JsonParser.array().from(body); + return JsonParser.array().from(jsonString); } catch(final JsonParserException e) { throw new IllegalStateException(e); } diff --git a/src/main/java/com/mewna/catnip/rest/guild/RoleData.java b/src/main/java/com/mewna/catnip/rest/guild/RoleData.java index 22ff70d557..96a5d77ccc 100644 --- a/src/main/java/com/mewna/catnip/rest/guild/RoleData.java +++ b/src/main/java/com/mewna/catnip/rest/guild/RoleData.java @@ -48,7 +48,7 @@ @SuppressWarnings("WeakerAccess") public class RoleData implements JsonConvertible { private final int id; - private final boolean publicRole; + protected boolean publicRole; private Long permissions; private String name; private Integer color; diff --git a/src/main/java/com/mewna/catnip/rest/handler/GlobalApplicationCommands.java b/src/main/java/com/mewna/catnip/rest/handler/GlobalApplicationCommands.java new file mode 100644 index 0000000000..162ed7c1cb --- /dev/null +++ b/src/main/java/com/mewna/catnip/rest/handler/GlobalApplicationCommands.java @@ -0,0 +1,54 @@ +package com.mewna.catnip.rest.handler; + +import com.grack.nanojson.JsonArray; +import com.grack.nanojson.JsonObject; +import com.mewna.catnip.entity.interaction.command.ApplicationCommand; +import com.mewna.catnip.entity.interaction.command.ApplicationCommandOption; +import com.mewna.catnip.entity.interaction.command.ApplicationCommandType; +import com.mewna.catnip.internal.CatnipImpl; +import com.mewna.catnip.rest.ResponsePayload; +import com.mewna.catnip.rest.Routes; +import com.mewna.catnip.rest.requester.Requester; +import com.mewna.catnip.util.JsonUtil; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.core.Single; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Collection; +import java.util.Map; + +public class GlobalApplicationCommands extends RestInteraction{ + + public GlobalApplicationCommands(final CatnipImpl catnip) { + super(catnip); + } + + public Observable getGlobalApplicationCommands() { + return getGlobalApplicationCommandsRaw() + .map(e -> JsonUtil.mapObjectContents(entityBuilder()::createApplicationCommand).apply(e)) + .flatMapIterable(e -> e); + } + public Single createGlobalApplicationCommand(@Nonnull final ApplicationCommandType type, + @Nonnull final String name, @Nullable final String description, + @Nonnull final Collection options) { + return Single.fromObservable(createGlobalApplicationCommandRaw(type, name, description, options) + .map(entityBuilder()::createApplicationCommand)); + } + + public Observable createGlobalApplicationCommandRaw(@Nonnull final ApplicationCommandType type, + @Nonnull final String name, @Nullable final String description, + @Nonnull final Collection options) { + final JsonObject body = createCommandBody(type, name, description, options); + return catnip().requester().queue(new Requester.OutboundRequest(Routes.CREATE_GLOBAL_APPLICATION_COMMAND + .withMajorParam(catnip().clientId()), Map.of()).object(body)).map(ResponsePayload::object); + } + + public Single editGlobalApplicationCommand(@Nonnull final ApplicationCommandType type, + @Nonnull final String name, @Nullable final String description, + @Nonnull final String commandId, + @Nonnull final Collection options) { + return Single.fromObservable(editGlobalApplicationCommandRaw(type, name, description, commandId, options) + .map(entityBuilder()::createApplicationCommand)); + } +} diff --git a/src/main/java/com/mewna/catnip/rest/handler/RestInteraction.java b/src/main/java/com/mewna/catnip/rest/handler/RestInteraction.java index 8504777693..0a3d746258 100644 --- a/src/main/java/com/mewna/catnip/rest/handler/RestInteraction.java +++ b/src/main/java/com/mewna/catnip/rest/handler/RestInteraction.java @@ -221,11 +221,11 @@ public Completable deleteInteractionFollowup(@Nonnull final String interactionId // Global commands - public Observable getGlobalApplicationCommands() { - return getGlobalApplicationCommandsRaw() - .map(e -> JsonUtil.mapObjectContents(entityBuilder()::createApplicationCommand).apply(e)) - .flatMapIterable(e -> e); - } +// public Observable getGlobalApplicationCommands() { +// return getGlobalApplicationCommandsRaw() +// .map(e -> JsonUtil.mapObjectContents(entityBuilder()::createApplicationCommand).apply(e)) +// .flatMapIterable(e -> e); +// } public Observable getGlobalApplicationCommandsRaw() { return catnip().requester().queue(new OutboundRequest(Routes.GET_GLOBAL_APPLICATION_COMMANDS.withMajorParam(catnip().clientId()), @@ -233,28 +233,28 @@ public Observable getGlobalApplicationCommandsRaw() { .map(ResponsePayload::array); } - public Single createGlobalApplicationCommand(@Nonnull final ApplicationCommandType type, - @Nonnull final String name, @Nullable final String description, - @Nonnull final Collection options) { - return Single.fromObservable(createGlobalApplicationCommandRaw(type, name, description, options) - .map(entityBuilder()::createApplicationCommand)); - } - - public Observable createGlobalApplicationCommandRaw(@Nonnull final ApplicationCommandType type, - @Nonnull final String name, @Nullable final String description, - @Nonnull final Collection options) { - final JsonObject body = createCommandBody(type, name, description, options); - return catnip().requester().queue(new OutboundRequest(Routes.CREATE_GLOBAL_APPLICATION_COMMAND - .withMajorParam(catnip().clientId()), Map.of()).object(body)).map(ResponsePayload::object); - } - - public Single editGlobalApplicationCommand(@Nonnull final ApplicationCommandType type, - @Nonnull final String name, @Nullable final String description, - @Nonnull final String commandId, - @Nonnull final Collection options) { - return Single.fromObservable(editGlobalApplicationCommandRaw(type, name, description, commandId, options) - .map(entityBuilder()::createApplicationCommand)); - } +// public Single createGlobalApplicationCommand(@Nonnull final ApplicationCommandType type, +// @Nonnull final String name, @Nullable final String description, +// @Nonnull final Collection options) { +// return Single.fromObservable(createGlobalApplicationCommandRaw(type, name, description, options) +// .map(entityBuilder()::createApplicationCommand)); +// } + +// public Observable createGlobalApplicationCommandRaw(@Nonnull final ApplicationCommandType type, +// @Nonnull final String name, @Nullable final String description, +// @Nonnull final Collection options) { +// final JsonObject body = createCommandBody(type, name, description, options); +// return catnip().requester().queue(new OutboundRequest(Routes.CREATE_GLOBAL_APPLICATION_COMMAND +// .withMajorParam(catnip().clientId()), Map.of()).object(body)).map(ResponsePayload::object); +// } +// +// public Single editGlobalApplicationCommand(@Nonnull final ApplicationCommandType type, +// @Nonnull final String name, @Nullable final String description, +// @Nonnull final String commandId, +// @Nonnull final Collection options) { +// return Single.fromObservable(editGlobalApplicationCommandRaw(type, name, description, commandId, options) +// .map(entityBuilder()::createApplicationCommand)); +// } public Observable editGlobalApplicationCommandRaw(@Nonnull final ApplicationCommandType type, @Nonnull final String name, @Nullable final String description, @@ -399,8 +399,8 @@ private JsonObject createSendBody(@Nullable final InteractionResponseType type, return builder.done(); } - private JsonObject createCommandBody(@Nonnull final ApplicationCommandType type, @Nonnull final String name, - @Nullable final String description, @Nonnull final Collection options) { + JsonObject createCommandBody(@Nonnull final ApplicationCommandType type, @Nonnull final String name, + @Nullable final String description, @Nonnull final Collection options) { final var builder = JsonObject.builder(); if(type == ApplicationCommandType.CHAT_INPUT) { if(!name.matches("^[\\w-]{1,32}$") || !name.toLowerCase(Locale.ROOT).equals(name)) { diff --git a/src/main/java/com/mewna/catnip/util/PermissionUtil.java b/src/main/java/com/mewna/catnip/util/PermissionUtil.java index 46fd19c040..74bef23911 100644 --- a/src/main/java/com/mewna/catnip/util/PermissionUtil.java +++ b/src/main/java/com/mewna/catnip/util/PermissionUtil.java @@ -48,6 +48,11 @@ public final class PermissionUtil { private PermissionUtil() { } + public boolean isPresent(final long permissions) { + final long value = 1; + return (permissions & value) == value; + } + private static long basePermissions(final Permissable holder) { final Catnip catnip = holder.catnip(); final Guild guild = catnip.cache().guild(holder.guildId()).blockingGet();