Coder Social home page Coder Social logo

Comments (5)

Gregory-Widmer avatar Gregory-Widmer commented on June 6, 2024 1

Oops, probably my bad when I wrote #1126 even after review.

However, that is kinda weird because I am using this to perform some actions in my bots, maybe it has been updated ? Edit: No, I'm using ID only, so nevermind

I am going to write a PR for this as it seems to be kinda boring.

from discord4j.

Gregory-Widmer avatar Gregory-Widmer commented on June 6, 2024 1

I'm publishing a snapshot on my own nexus and writing the PR, the easiest solution is updating the ThreadChannel#getParent method signature, that would introduce a breaking change but as
3.3.0 is still pre-released I think it won't matter that much.

from discord4j.

Doc94 avatar Doc94 commented on June 6, 2024

Oops, probably my bad when I wrote #1126 even after review.

However, that is kinda weird because I am using this to perform some actions in my bots, maybe it has been updated ? Edit: No, I'm using ID only, so nevermind

I am going to write a PR for this as it seems to be kinda boring.

yeah that was my workarround using the method byId for get the channel xd

from discord4j.

Gregory-Widmer avatar Gregory-Widmer commented on June 6, 2024

Here is a simple reproduction code with some minor logging to check it out :

import discord4j.core.DiscordClient;
import discord4j.core.event.domain.message.MessageCreateEvent;
import discord4j.core.object.entity.channel.ThreadChannel;
import reactor.core.publisher.Mono;

import java.util.Optional;

public class Main {


    public static void main(String[] args) {
        DiscordClient.create(Optional.ofNullable(System.getenv("DISCORD_TOKEN")).or(() -> Optional.ofNullable(args.length > 0 ? args[0] : null)).orElseThrow())
                .withGateway(gatewayDiscordClient -> {
                    Mono<Void> forumThreadListener = gatewayDiscordClient.on(MessageCreateEvent.class, messageCreateEvent -> messageCreateEvent.getMessage().getChannel()
                            .doOnNext(messageChannel -> System.out.printf("Received message in channel ID %s of type %s\n", messageChannel.getId().asString(), messageChannel.getType().name()))
                            .ofType(ThreadChannel.class)
                            .doOnNext(threadChannel -> System.out.printf("Channel ID %s is a ThreadChannel, getting its parent\n", threadChannel.getId().asString()))
                            .flatMap(ThreadChannel::getParent)
                            .doOnNext(topLevelGuildMessageChannel -> System.out.printf("Parent channel ID is %s, its type is %s\n", topLevelGuildMessageChannel.getId().asString(), topLevelGuildMessageChannel.getType().name()))
                            .onErrorResume(throwable -> {
                                System.err.println("Cannot handle event");
                                throwable.printStackTrace();
                                return Mono.empty();
                            })).then();

                    return Mono.zipDelayError(
                            gatewayDiscordClient.onDisconnect(),
                            forumThreadListener
                    );
                })
                .block();
    }

}

We can see pretty well the kind of issue (first message is in a text channel, second one in a thread :

eceived message in channel ID 1092456914719358999 of type GUILD_TEXT
Received message in channel ID 1172561366813528114 of type GUILD_PUBLIC_THREAD
Channel ID 1172561366813528114 is a ThreadChannel, getting its parent
Cannot handle event
java.lang.ClassCastException: Cannot cast discord4j.core.object.entity.channel.ForumChannel to discord4j.core.object.entity.channel.TopLevelGuildMessageChannel
	at java.base/java.lang.Class.cast(Class.java:3889)
	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:113)
	at reactor.core.publisher.FluxHide$SuppressFuseableSubscriber.onNext(FluxHide.java:137)
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74)
	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129)
	at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2400)
	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:171)
	at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2196)
	at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2070)
	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:96)
	at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55)
	at reactor.core.publisher.Mono.subscribe(Mono.java:4490)
	at reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:203)
	at reactor.core.publisher.MonoFlatMap.subscribeOrReturn(MonoFlatMap.java:53)
	at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:57)
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:157)
	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:200)
	at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:122)
	at reactor.core.publisher.FluxFilter$FilterSubscriber.onNext(FluxFilter.java:113)
	at reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.onNext(FluxPeekFuseable.java:854)
	at reactor.core.publisher.FluxMap$MapConditionalSubscriber.onNext(FluxMap.java:224)
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74)
	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129)
	at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2400)
	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:171)
	at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2196)
	at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2070)
	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:96)
	at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55)
	at reactor.core.publisher.FluxFromMonoOperator.subscribe(FluxFromMonoOperator.java:83)
	at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:54)
	at reactor.core.publisher.Flux.subscribe(Flux.java:8642)
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:427)
	at reactor.core.publisher.FluxDoFinally$DoFinallySubscriber.onNext(FluxDoFinally.java:113)
	at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:210)
	at reactor.core.publisher.FluxHandleFuseable$HandleFuseableSubscriber.tryOnNext(FluxHandleFuseable.java:132)
	at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.tryOnNext(FluxMapFuseable.java:317)
	at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.tryOnNext(FluxFilterFuseable.java:367)
	at reactor.core.publisher.FluxPublishOn$PublishOnConditionalSubscriber.runAsync(FluxPublishOn.java:992)
	at reactor.core.publisher.FluxPublishOn$PublishOnConditionalSubscriber.run(FluxPublishOn.java:1067)
	at reactor.scheduler.forkjoin.ForkJoinPoolScheduler$DisposableWorkerTask.run(ForkJoinPoolScheduler.java:443)
	at reactor.scheduler.forkjoin.ForkJoinPoolScheduler$Worker.processTaskQueue(ForkJoinPoolScheduler.java:407)
	at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)

from discord4j.

Doc94 avatar Doc94 commented on June 6, 2024

Closed by 6395a9b

from discord4j.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.