310 lines
15 KiB
Java
310 lines
15 KiB
Java
package com.discord.utilities.messagesend;
|
|
|
|
import android.content.ContentResolver;
|
|
import android.content.Context;
|
|
import com.discord.api.activity.Activity;
|
|
import com.discord.api.application.Application;
|
|
import com.discord.api.message.Message;
|
|
import com.discord.api.message.MessageReference;
|
|
import com.discord.api.message.activity.MessageActivity;
|
|
import com.discord.api.message.allowedmentions.MessageAllowedMentions;
|
|
import com.discord.api.sticker.Sticker;
|
|
import com.discord.api.sticker.StickerPartial;
|
|
import com.discord.restapi.RestAPIParams;
|
|
import com.discord.utilities.error.Error;
|
|
import com.discord.utilities.messagesend.MessageRequest;
|
|
import com.discord.utilities.messagesend.MessageResult;
|
|
import com.discord.utilities.networking.Backoff;
|
|
import com.discord.utilities.rest.RestAPI;
|
|
import com.discord.utilities.rest.SendUtils;
|
|
import com.discord.utilities.rx.ObservableExtensionsKt;
|
|
import com.discord.utilities.time.Clock;
|
|
import d0.t.o;
|
|
import d0.z.d.m;
|
|
import java.util.ArrayDeque;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.concurrent.ExecutorService;
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
import kotlin.Unit;
|
|
import kotlin.jvm.functions.Function0;
|
|
import kotlin.jvm.functions.Function1;
|
|
import kotlin.jvm.internal.DefaultConstructorMarker;
|
|
import rx.Observable;
|
|
import rx.Subscription;
|
|
/* compiled from: MessageQueue.kt */
|
|
public final class MessageQueue {
|
|
private static final Companion Companion = new Companion(null);
|
|
@Deprecated
|
|
private static final long DEFAULT_MESSAGE_TIMEOUT_MS = 3600000;
|
|
@Deprecated
|
|
private static final long DEFAULT_NETWORK_INITIAL_FAILURE_RETRY_MS = 5000;
|
|
@Deprecated
|
|
private static final long DEFAULT_RETRY_MS = 100;
|
|
private final Clock clock;
|
|
private final ContentResolver contentResolver;
|
|
private final ExecutorService executorService;
|
|
private InflightRequest inFlightRequest;
|
|
private boolean isDraining;
|
|
private final Backoff networkBackoff = new Backoff(5000, 3600000, 0, false, null, 28, null);
|
|
private final ArrayDeque<MessageRequest> queue = new ArrayDeque<>();
|
|
private Subscription retrySubscription;
|
|
|
|
/* compiled from: MessageQueue.kt */
|
|
public static final class Companion {
|
|
private Companion() {
|
|
}
|
|
|
|
public /* synthetic */ Companion(DefaultConstructorMarker defaultConstructorMarker) {
|
|
this();
|
|
}
|
|
}
|
|
|
|
/* compiled from: MessageQueue.kt */
|
|
public static final class DrainListener {
|
|
private AtomicBoolean isCompleted = new AtomicBoolean(false);
|
|
private final Function1<MessageResult, Unit> onCompleted;
|
|
|
|
/* JADX DEBUG: Multi-variable search result rejected for r2v0, resolved type: kotlin.jvm.functions.Function1<? super com.discord.utilities.messagesend.MessageResult, kotlin.Unit> */
|
|
/* JADX WARN: Multi-variable type inference failed */
|
|
public DrainListener(Function1<? super MessageResult, Unit> function1) {
|
|
m.checkNotNullParameter(function1, "onCompleted");
|
|
this.onCompleted = function1;
|
|
}
|
|
|
|
public final synchronized void complete(MessageResult messageResult) {
|
|
m.checkNotNullParameter(messageResult, "result");
|
|
if (!this.isCompleted.getAndSet(true)) {
|
|
this.onCompleted.invoke(messageResult);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* compiled from: MessageQueue.kt */
|
|
public static final class InflightRequest {
|
|
private final MessageRequest baseRequest;
|
|
private final DrainListener drainListener;
|
|
private final Subscription networkSubscription;
|
|
|
|
public InflightRequest(MessageRequest messageRequest, Subscription subscription, DrainListener drainListener) {
|
|
m.checkNotNullParameter(messageRequest, "baseRequest");
|
|
m.checkNotNullParameter(subscription, "networkSubscription");
|
|
m.checkNotNullParameter(drainListener, "drainListener");
|
|
this.baseRequest = messageRequest;
|
|
this.networkSubscription = subscription;
|
|
this.drainListener = drainListener;
|
|
}
|
|
|
|
public final MessageRequest getBaseRequest() {
|
|
return this.baseRequest;
|
|
}
|
|
|
|
public final DrainListener getDrainListener() {
|
|
return this.drainListener;
|
|
}
|
|
|
|
public final Subscription getNetworkSubscription() {
|
|
return this.networkSubscription;
|
|
}
|
|
}
|
|
|
|
public MessageQueue(ContentResolver contentResolver, ExecutorService executorService, Clock clock) {
|
|
m.checkNotNullParameter(contentResolver, "contentResolver");
|
|
m.checkNotNullParameter(executorService, "executorService");
|
|
m.checkNotNullParameter(clock, "clock");
|
|
this.contentResolver = contentResolver;
|
|
this.executorService = executorService;
|
|
this.clock = clock;
|
|
}
|
|
|
|
public static final /* synthetic */ ExecutorService access$getExecutorService$p(MessageQueue messageQueue) {
|
|
return messageQueue.executorService;
|
|
}
|
|
|
|
public static final /* synthetic */ InflightRequest access$getInFlightRequest$p(MessageQueue messageQueue) {
|
|
return messageQueue.inFlightRequest;
|
|
}
|
|
|
|
public static final /* synthetic */ Backoff access$getNetworkBackoff$p(MessageQueue messageQueue) {
|
|
return messageQueue.networkBackoff;
|
|
}
|
|
|
|
public static final /* synthetic */ ArrayDeque access$getQueue$p(MessageQueue messageQueue) {
|
|
return messageQueue.queue;
|
|
}
|
|
|
|
public static final /* synthetic */ Subscription access$getRetrySubscription$p(MessageQueue messageQueue) {
|
|
return messageQueue.retrySubscription;
|
|
}
|
|
|
|
public static final /* synthetic */ void access$handleError(MessageQueue messageQueue, Error error, DrainListener drainListener) {
|
|
messageQueue.handleError(error, drainListener);
|
|
}
|
|
|
|
public static final /* synthetic */ void access$handleSuccess(MessageQueue messageQueue, Message message, DrainListener drainListener) {
|
|
messageQueue.handleSuccess(message, drainListener);
|
|
}
|
|
|
|
public static final /* synthetic */ void access$onDrainingCompleted(MessageQueue messageQueue) {
|
|
messageQueue.onDrainingCompleted();
|
|
}
|
|
|
|
public static final /* synthetic */ void access$processNextRequest(MessageQueue messageQueue) {
|
|
messageQueue.processNextRequest();
|
|
}
|
|
|
|
public static final /* synthetic */ void access$setInFlightRequest$p(MessageQueue messageQueue, InflightRequest inflightRequest) {
|
|
messageQueue.inFlightRequest = inflightRequest;
|
|
}
|
|
|
|
public static final /* synthetic */ void access$setRetrySubscription$p(MessageQueue messageQueue, Subscription subscription) {
|
|
messageQueue.retrySubscription = subscription;
|
|
}
|
|
|
|
private final void doEdit(MessageRequest.Edit edit, DrainListener drainListener) {
|
|
RestAPI api = RestAPI.Companion.getApi();
|
|
long channelId = edit.getChannelId();
|
|
long messageId = edit.getMessageId();
|
|
String content = edit.getContent();
|
|
MessageAllowedMentions allowedMentions = edit.getAllowedMentions();
|
|
ObservableExtensionsKt.appSubscribe$default(ObservableExtensionsKt.restSubscribeOn(api.editMessage(channelId, messageId, new RestAPIParams.Message(content, null, null, null, null, null, allowedMentions != null ? RestAPIParams.Message.AllowedMentions.Companion.create(allowedMentions) : null, 60, null)), false), MessageQueue.class, (Context) null, new MessageQueue$doEdit$4(this, edit, drainListener), new MessageQueue$doEdit$3(this, drainListener), (Function0) null, (Function0) null, new MessageQueue$doEdit$2(this, drainListener), 50, (Object) null);
|
|
}
|
|
|
|
private final void doSend(MessageRequest.Send send, DrainListener drainListener) {
|
|
RestAPIParams.Message.Activity activity;
|
|
RestAPIParams.Message.MessageReference messageReference;
|
|
String k;
|
|
MessageResult.ValidationError validateMessage = send.validateMessage();
|
|
if (validateMessage != null) {
|
|
drainListener.complete(validateMessage);
|
|
return;
|
|
}
|
|
com.discord.models.message.Message message = send.getMessage();
|
|
boolean z2 = message.getNonce() != null;
|
|
MessageActivity activity2 = message.getActivity();
|
|
ArrayList arrayList = null;
|
|
if (activity2 != null) {
|
|
Activity activity3 = send.getActivity();
|
|
activity = (activity3 == null || (k = activity3.k()) == null) ? null : new RestAPIParams.Message.Activity(activity2.b(), activity2.a(), k);
|
|
} else {
|
|
activity = null;
|
|
}
|
|
MessageReference messageReference2 = message.getMessageReference();
|
|
if (messageReference2 != null) {
|
|
Long b = messageReference2.b();
|
|
Long a = messageReference2.a();
|
|
m.checkNotNull(a);
|
|
messageReference = new RestAPIParams.Message.MessageReference(b, a.longValue(), messageReference2.c());
|
|
} else {
|
|
messageReference = null;
|
|
}
|
|
MessageAllowedMentions allowedMentions = message.getAllowedMentions();
|
|
RestAPIParams.Message.AllowedMentions create = allowedMentions != null ? RestAPIParams.Message.AllowedMentions.Companion.create(allowedMentions) : null;
|
|
String content = message.getContent();
|
|
String nonce = message.getNonce();
|
|
Application application = message.getApplication();
|
|
Long valueOf = application != null ? Long.valueOf(application.f()) : null;
|
|
List<StickerPartial> stickerItems = message.getStickerItems();
|
|
if (stickerItems != null) {
|
|
arrayList = new ArrayList(o.collectionSizeOrDefault(stickerItems, 10));
|
|
for (StickerPartial stickerPartial : stickerItems) {
|
|
arrayList.add(Long.valueOf(stickerPartial.getId()));
|
|
}
|
|
} else {
|
|
List<Sticker> stickers = message.getStickers();
|
|
if (stickers != null) {
|
|
arrayList = new ArrayList(o.collectionSizeOrDefault(stickers, 10));
|
|
for (Sticker sticker : stickers) {
|
|
arrayList.add(Long.valueOf(sticker.getId()));
|
|
}
|
|
}
|
|
}
|
|
Observable<SendUtils.SendPayload> t = SendUtils.INSTANCE.getSendPayload(this.contentResolver, new RestAPIParams.Message(content, nonce, valueOf, activity, arrayList, messageReference, create), send.getAttachments()).t(new MessageQueue$doSend$1(send));
|
|
m.checkNotNullExpressionValue(t, "SendUtils\n .getSe… }\n }\n }");
|
|
Observable<R> F = t.x(MessageQueue$doSend$$inlined$filterIs$1.INSTANCE).F(MessageQueue$doSend$$inlined$filterIs$2.INSTANCE);
|
|
m.checkNotNullExpressionValue(F, "filter { it is T }.map { it as T }");
|
|
Observable z3 = F.Z(1).z(new MessageQueue$doSend$2(message));
|
|
m.checkNotNullExpressionValue(z3, "SendUtils\n .getSe…ge)\n }\n }");
|
|
ObservableExtensionsKt.appSubscribe$default(ObservableExtensionsKt.restSubscribeOn(z3, z2), MessageQueue.class, (Context) null, new MessageQueue$doSend$5(this, send, drainListener), new MessageQueue$doSend$4(this, drainListener), (Function0) null, (Function0) null, new MessageQueue$doSend$3(this, drainListener), 50, (Object) null);
|
|
}
|
|
|
|
private final void doSendApplicationCommand(MessageRequest.SendApplicationCommand sendApplicationCommand, DrainListener drainListener) {
|
|
Observable restSubscribeOn = ObservableExtensionsKt.restSubscribeOn(RestAPI.Companion.getApi().sendApplicationCommand(sendApplicationCommand.getApplicationCommandSendData().toRestApiParam()), false);
|
|
MessageQueue$doSendApplicationCommand$1 messageQueue$doSendApplicationCommand$1 = new MessageQueue$doSendApplicationCommand$1(this, sendApplicationCommand, drainListener);
|
|
ObservableExtensionsKt.appSubscribe$default(restSubscribeOn, MessageQueue.class, (Context) null, new MessageQueue$doSendApplicationCommand$3(this, sendApplicationCommand, drainListener), new MessageQueue$doSendApplicationCommand$2(this, drainListener), (Function0) null, (Function0) null, messageQueue$doSendApplicationCommand$1, 50, (Object) null);
|
|
}
|
|
|
|
private final void handleError(Error error, DrainListener drainListener) {
|
|
MessageResult messageResult;
|
|
Error.Response response = error.getResponse();
|
|
m.checkNotNullExpressionValue(response, "error.response");
|
|
Long l = 100L;
|
|
if (response.getCode() == 20016) {
|
|
Error.Response response2 = error.getResponse();
|
|
m.checkNotNullExpressionValue(response2, "error.response");
|
|
Long retryAfterMs = response2.getRetryAfterMs();
|
|
if (retryAfterMs != null) {
|
|
l = retryAfterMs;
|
|
}
|
|
m.checkNotNullExpressionValue(l, "error.response.retryAfterMs ?: DEFAULT_RETRY_MS");
|
|
messageResult = new MessageResult.Slowmode(l.longValue());
|
|
} else if (error.getType() == Error.Type.RATE_LIMITED) {
|
|
Error.Response response3 = error.getResponse();
|
|
m.checkNotNullExpressionValue(response3, "error.response");
|
|
Long retryAfterMs2 = response3.getRetryAfterMs();
|
|
if (retryAfterMs2 != null) {
|
|
l = retryAfterMs2;
|
|
}
|
|
m.checkNotNullExpressionValue(l, "error.response.retryAfterMs ?: DEFAULT_RETRY_MS");
|
|
messageResult = new MessageResult.RateLimited(l.longValue());
|
|
} else {
|
|
messageResult = error.getType() == Error.Type.NETWORK ? MessageResult.NetworkFailure.INSTANCE : new MessageResult.UnknownFailure(error);
|
|
}
|
|
drainListener.complete(messageResult);
|
|
}
|
|
|
|
private final void handleSuccess(Message message, DrainListener drainListener) {
|
|
drainListener.complete(new MessageResult.Success(message));
|
|
}
|
|
|
|
private final void onDrainingCompleted() {
|
|
this.isDraining = false;
|
|
this.inFlightRequest = null;
|
|
}
|
|
|
|
private final void processNextRequest() {
|
|
MessageRequest remove;
|
|
if (this.queue.isEmpty() || this.retrySubscription != null || this.networkBackoff.isPending() || this.isDraining || (remove = this.queue.remove()) == null) {
|
|
return;
|
|
}
|
|
if (this.clock.currentTimeMillis() - remove.getAttemptTimestamp() > 3600000) {
|
|
remove.getOnCompleted().invoke(MessageResult.Timeout.INSTANCE, Boolean.valueOf(this.queue.isEmpty()));
|
|
this.networkBackoff.succeed();
|
|
processNextRequest();
|
|
return;
|
|
}
|
|
this.isDraining = true;
|
|
DrainListener drainListener = new DrainListener(new MessageQueue$processNextRequest$listener$1(this, remove));
|
|
if (remove instanceof MessageRequest.Send) {
|
|
doSend((MessageRequest.Send) remove, drainListener);
|
|
} else if (remove instanceof MessageRequest.Edit) {
|
|
doEdit((MessageRequest.Edit) remove, drainListener);
|
|
} else if (remove instanceof MessageRequest.SendApplicationCommand) {
|
|
doSendApplicationCommand((MessageRequest.SendApplicationCommand) remove, drainListener);
|
|
}
|
|
}
|
|
|
|
public final void cancel(String str) {
|
|
m.checkNotNullParameter(str, "requestId");
|
|
this.executorService.submit(new MessageQueue$cancel$1(this, str));
|
|
}
|
|
|
|
public final void enqueue(MessageRequest messageRequest) {
|
|
m.checkNotNullParameter(messageRequest, "request");
|
|
this.executorService.submit(new MessageQueue$enqueue$1(this, messageRequest));
|
|
}
|
|
|
|
public final void handleConnected() {
|
|
this.executorService.submit(new MessageQueue$handleConnected$1(this));
|
|
}
|
|
}
|