Skip to content
This repository has been archived by the owner on Jun 9, 2024. It is now read-only.

code after refactor #727

Open
wants to merge 1 commit into
base: mistress
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 26 additions & 15 deletions src/main/java/com/mewna/catnip/rest/MultipartBodyPublisher.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,34 +22,35 @@
*/

@SuppressWarnings("UnusedReturnValue")

public class MultipartBodyPublisher {
private final Collection<PartsSpecification> partsSpecificationList = new ArrayList<>();
private final Collection<PartsSpecification> 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
Expand All @@ -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 + "--";
Expand All @@ -81,7 +83,7 @@ class PartsIterator implements Iterator<byte[]> {
private boolean done;

PartsIterator() {
parts = partsSpecificationList.iterator();
parts = partsList.iterator();
}

@Override
Expand All @@ -107,17 +109,26 @@ public byte[] next() {
}
return next.remove(0);
}

private void processNextPart(PartsSpecification part, List<byte[]> 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'});
// }
}
}
}
8 changes: 5 additions & 3 deletions src/main/java/com/mewna/catnip/rest/ResponsePayload.java
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -45,15 +47,15 @@ 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);
}
}

public JsonArray array() {
try {
return JsonParser.array().from(body);
return JsonParser.array().from(jsonString);
} catch(final JsonParserException e) {
throw new IllegalStateException(e);
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/mewna/catnip/rest/guild/RoleData.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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<ApplicationCommand> getGlobalApplicationCommands() {
return getGlobalApplicationCommandsRaw()
.map(e -> JsonUtil.mapObjectContents(entityBuilder()::createApplicationCommand).apply(e))
.flatMapIterable(e -> e);
}
public Single<ApplicationCommand> createGlobalApplicationCommand(@Nonnull final ApplicationCommandType type,
@Nonnull final String name, @Nullable final String description,
@Nonnull final Collection<ApplicationCommandOption> options) {
return Single.fromObservable(createGlobalApplicationCommandRaw(type, name, description, options)
.map(entityBuilder()::createApplicationCommand));
}

public Observable<JsonObject> createGlobalApplicationCommandRaw(@Nonnull final ApplicationCommandType type,
@Nonnull final String name, @Nullable final String description,
@Nonnull final Collection<ApplicationCommandOption> 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<ApplicationCommand> editGlobalApplicationCommand(@Nonnull final ApplicationCommandType type,
@Nonnull final String name, @Nullable final String description,
@Nonnull final String commandId,
@Nonnull final Collection<ApplicationCommandOption> options) {
return Single.fromObservable(editGlobalApplicationCommandRaw(type, name, description, commandId, options)
.map(entityBuilder()::createApplicationCommand));
}
}
58 changes: 29 additions & 29 deletions src/main/java/com/mewna/catnip/rest/handler/RestInteraction.java
Original file line number Diff line number Diff line change
Expand Up @@ -221,40 +221,40 @@ public Completable deleteInteractionFollowup(@Nonnull final String interactionId

// Global commands

public Observable<ApplicationCommand> getGlobalApplicationCommands() {
return getGlobalApplicationCommandsRaw()
.map(e -> JsonUtil.mapObjectContents(entityBuilder()::createApplicationCommand).apply(e))
.flatMapIterable(e -> e);
}
// public Observable<ApplicationCommand> getGlobalApplicationCommands() {
// return getGlobalApplicationCommandsRaw()
// .map(e -> JsonUtil.mapObjectContents(entityBuilder()::createApplicationCommand).apply(e))
// .flatMapIterable(e -> e);
// }

public Observable<JsonArray> getGlobalApplicationCommandsRaw() {
return catnip().requester().queue(new OutboundRequest(Routes.GET_GLOBAL_APPLICATION_COMMANDS.withMajorParam(catnip().clientId()),
Map.of()))
.map(ResponsePayload::array);
}

public Single<ApplicationCommand> createGlobalApplicationCommand(@Nonnull final ApplicationCommandType type,
@Nonnull final String name, @Nullable final String description,
@Nonnull final Collection<ApplicationCommandOption> options) {
return Single.fromObservable(createGlobalApplicationCommandRaw(type, name, description, options)
.map(entityBuilder()::createApplicationCommand));
}

public Observable<JsonObject> createGlobalApplicationCommandRaw(@Nonnull final ApplicationCommandType type,
@Nonnull final String name, @Nullable final String description,
@Nonnull final Collection<ApplicationCommandOption> 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<ApplicationCommand> editGlobalApplicationCommand(@Nonnull final ApplicationCommandType type,
@Nonnull final String name, @Nullable final String description,
@Nonnull final String commandId,
@Nonnull final Collection<ApplicationCommandOption> options) {
return Single.fromObservable(editGlobalApplicationCommandRaw(type, name, description, commandId, options)
.map(entityBuilder()::createApplicationCommand));
}
// public Single<ApplicationCommand> createGlobalApplicationCommand(@Nonnull final ApplicationCommandType type,
// @Nonnull final String name, @Nullable final String description,
// @Nonnull final Collection<ApplicationCommandOption> options) {
// return Single.fromObservable(createGlobalApplicationCommandRaw(type, name, description, options)
// .map(entityBuilder()::createApplicationCommand));
// }

// public Observable<JsonObject> createGlobalApplicationCommandRaw(@Nonnull final ApplicationCommandType type,
// @Nonnull final String name, @Nullable final String description,
// @Nonnull final Collection<ApplicationCommandOption> 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<ApplicationCommand> editGlobalApplicationCommand(@Nonnull final ApplicationCommandType type,
// @Nonnull final String name, @Nullable final String description,
// @Nonnull final String commandId,
// @Nonnull final Collection<ApplicationCommandOption> options) {
// return Single.fromObservable(editGlobalApplicationCommandRaw(type, name, description, commandId, options)
// .map(entityBuilder()::createApplicationCommand));
// }

public Observable<JsonObject> editGlobalApplicationCommandRaw(@Nonnull final ApplicationCommandType type,
@Nonnull final String name, @Nullable final String description,
Expand Down Expand Up @@ -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<ApplicationCommandOption> options) {
JsonObject createCommandBody(@Nonnull final ApplicationCommandType type, @Nonnull final String name,
@Nullable final String description, @Nonnull final Collection<ApplicationCommandOption> options) {
final var builder = JsonObject.builder();
if(type == ApplicationCommandType.CHAT_INPUT) {
if(!name.matches("^[\\w-]{1,32}$") || !name.toLowerCase(Locale.ROOT).equals(name)) {
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/com/mewna/catnip/util/PermissionUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down