Reputation: 13
I tried to create a discord bot with Discord4J. When i start the application it connect to the discord but then it stopped. I follow some recent tuto which used the same things and it works... I don't know why it doesn't work here...
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class GodCreatorApplication {
public static void main(String[] args) {
SpringApplication.run(GodCreatorApplication.class, args);
}
}
BotConfiguration :
import discord4j.core.DiscordClientBuilder;
import discord4j.core.GatewayDiscordClient;
import discord4j.core.event.domain.Event;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.List;
@Configuration
public class BotConfiguration {
@Value("${discord.token}")
private String token;
@Bean
public <T extends Event> GatewayDiscordClient gatewayDiscordClient(List<EventListener<T>> eventListeners) {
GatewayDiscordClient client = DiscordClientBuilder.create(token)
.build()
.login()
.block();
for(EventListener<T> listener : eventListeners) {
assert client != null;
client.on(listener.getEventType())
.flatMap(listener::execute)
.onErrorResume(listener::handleError)
.subscribe();
}
return client;
}
}
MessageListener :
import discord4j.core.object.entity.Message;
import reactor.core.publisher.Mono;
public abstract class MessageListener {
public Mono<Void> processCommand(Message eventMessage) {
return Mono.just(eventMessage)
.filter(message -> message.getAuthor().map(user -> !user.isBot()).orElse(false))
.filter(message -> message.getContent().equalsIgnoreCase("!todo"))
.flatMap(Message::getChannel)
.flatMap(channel -> channel.createMessage("Things to do today:\n - write a bot\n - eat lunch\n - play a game"))
.then();
}
}
MassageCreateListener :
import discord4j.core.event.domain.message.MessageCreateEvent;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
@Service
public class MessageCreateListener extends MessageListener implements EventListener<MessageCreateEvent> {
@Override
public Class<MessageCreateEvent> getEventType() {
return MessageCreateEvent.class;
}
@Override
public Mono<Void> execute(MessageCreateEvent event) {
return processCommand(event.getMessage());
}
}
And I have this result :
Upvotes: 0
Views: 176
Reputation: 91
Without the code in your GodCreatorApplication
class it will be harder to help you. Nevertheless, it is most likely that you're not blocking the main thread and thus the JVS exits. I never used Spring so I cannot help you on how to implement this, but the D4J method to block until the bot is disconnected is client.onDisconnect().block();
.
Upvotes: 0