-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: ✨ support discord (resolve #14)
- Loading branch information
1 parent
74714fc
commit cc17a9a
Showing
7 changed files
with
266 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
118 changes: 118 additions & 0 deletions
118
src/main/java/com/zhanganzhi/chathub/adaptors/discord/DiscordAdaptor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
package com.zhanganzhi.chathub.adaptors.discord; | ||
|
||
import net.dv8tion.jda.api.JDA; | ||
import net.dv8tion.jda.api.JDABuilder; | ||
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; | ||
import net.dv8tion.jda.api.interactions.commands.build.Commands; | ||
import net.dv8tion.jda.api.requests.GatewayIntent; | ||
|
||
import com.zhanganzhi.chathub.ChatHub; | ||
import com.zhanganzhi.chathub.adaptors.IAdaptor; | ||
import com.zhanganzhi.chathub.core.Config; | ||
import com.zhanganzhi.chathub.entity.Platform; | ||
import com.zhanganzhi.chathub.event.MessageEvent; | ||
import com.zhanganzhi.chathub.event.ServerChangeEvent; | ||
|
||
public class DiscordAdaptor implements IAdaptor { | ||
private static final Platform platform = Platform.DISCORD; | ||
private final Config config = Config.getInstance(); | ||
private final ChatHub chatHub; | ||
private JDA jda; | ||
private TextChannel channel; | ||
|
||
public DiscordAdaptor(ChatHub chatHub) { | ||
this.chatHub = chatHub; | ||
} | ||
|
||
@Override | ||
public Platform getPlatform() { | ||
return platform; | ||
} | ||
|
||
@Override | ||
public void onUserChat(MessageEvent event) { | ||
sendMessage(config.getDiscordChatMessage( | ||
event.getServerName(), | ||
event.user(), | ||
event.content() | ||
)); | ||
} | ||
|
||
@Override | ||
public void onJoinServer(ServerChangeEvent event) { | ||
sendMessage(config.getDiscordJoinMessage( | ||
event.server, | ||
event.player.getUsername() | ||
)); | ||
} | ||
|
||
@Override | ||
public void onLeaveServer(ServerChangeEvent event) { | ||
sendMessage(config.getDiscordLeaveMessage( | ||
event.player.getUsername() | ||
)); | ||
} | ||
|
||
@Override | ||
public void onSwitchServer(ServerChangeEvent event) { | ||
sendMessage(config.getDiscordSwitchMessage( | ||
event.player.getUsername(), | ||
event.serverPrev, | ||
event.server | ||
)); | ||
} | ||
|
||
@Override | ||
public void sendListMessage(String source) { | ||
} | ||
|
||
void sendMessage(String message) { | ||
if (config.isDiscordEnabled()) { | ||
new Thread(() -> channel.sendMessage(message).queue()).start(); | ||
} | ||
} | ||
|
||
@Override | ||
public void start() { | ||
if (config.isDiscordEnabled()) { | ||
// logger | ||
chatHub.getLogger().info("Discord enabled"); | ||
|
||
// build jda | ||
jda = JDABuilder.createLight(config.getDiscordToken()) | ||
.enableIntents( | ||
GatewayIntent.MESSAGE_CONTENT | ||
) | ||
.addEventListeners(new DiscordReceiver(chatHub)) | ||
.build(); | ||
|
||
// commands | ||
jda.updateCommands().addCommands( | ||
Commands | ||
.slash("list", "List online players") | ||
.setGuildOnly(true) | ||
).queue(); | ||
|
||
// await jda ready | ||
try { | ||
jda.awaitReady(); | ||
} catch (InterruptedException e) { | ||
chatHub.getLogger().error("Discord jda failed to start: " + e.getMessage()); | ||
} | ||
|
||
// get channel | ||
channel = jda.getTextChannelById(config.getDiscordChannelId()); | ||
} | ||
} | ||
|
||
@Override | ||
public void stop() { | ||
if (config.isDiscordEnabled() && jda != null) { | ||
jda.shutdownNow(); | ||
} | ||
} | ||
|
||
@Override | ||
public void restart() { | ||
} | ||
} |
65 changes: 65 additions & 0 deletions
65
src/main/java/com/zhanganzhi/chathub/adaptors/discord/DiscordReceiver.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
package com.zhanganzhi.chathub.adaptors.discord; | ||
|
||
import com.velocitypowered.api.proxy.Player; | ||
import com.velocitypowered.api.proxy.server.RegisteredServer; | ||
import net.dv8tion.jda.api.hooks.ListenerAdapter; | ||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent; | ||
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; | ||
|
||
import com.zhanganzhi.chathub.ChatHub; | ||
import com.zhanganzhi.chathub.core.Config; | ||
import com.zhanganzhi.chathub.core.EventHub; | ||
import com.zhanganzhi.chathub.entity.Platform; | ||
import com.zhanganzhi.chathub.event.MessageEvent; | ||
|
||
public class DiscordReceiver extends ListenerAdapter { | ||
private static final Platform PLATFORM = Platform.DISCORD; | ||
private final Config config = Config.getInstance(); | ||
private final ChatHub chatHub; | ||
private final EventHub eventHub; | ||
|
||
public DiscordReceiver(ChatHub chatHub) { | ||
this.chatHub = chatHub; | ||
this.eventHub = chatHub.getEventHub(); | ||
} | ||
|
||
@Override | ||
public void onMessageReceived(MessageReceivedEvent messageReceivedEvent) { | ||
// ignore bot message | ||
if (messageReceivedEvent.getAuthor().isBot()) { | ||
return; | ||
} | ||
|
||
// check channel id | ||
if (!messageReceivedEvent.getChannel().getId().equals(config.getDiscordChannelId())) { | ||
return; | ||
} | ||
|
||
// handle message | ||
String content = messageReceivedEvent.getMessage().getContentStripped(); | ||
eventHub.onUserChat(new MessageEvent( | ||
PLATFORM, | ||
null, | ||
messageReceivedEvent.getAuthor().getEffectiveName(), | ||
content | ||
)); | ||
} | ||
|
||
@Override | ||
public void onSlashCommandInteraction(SlashCommandInteractionEvent slashCommandInteractionEvent) { | ||
if (slashCommandInteractionEvent.getName().equals("list")) { | ||
StringBuilder stringBuilder = new StringBuilder(); | ||
for (RegisteredServer registeredServer : chatHub.getProxyServer().getAllServers()) { | ||
if (!registeredServer.getPlayersConnected().isEmpty()) { | ||
stringBuilder.append(config.getDiscordListMessage( | ||
registeredServer.getServerInfo().getName(), | ||
registeredServer.getPlayersConnected().size(), | ||
registeredServer.getPlayersConnected().stream().map(Player::getUsername).toArray(String[]::new) | ||
)); | ||
stringBuilder.append("\n"); | ||
} | ||
} | ||
slashCommandInteractionEvent.reply(stringBuilder.isEmpty() ? config.getDiscordListEmptyMessage() : stringBuilder.toString()).queue(); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters