Skip to content

Commit 60a53b6

Browse files
My changes
1 parent c7e36c7 commit 60a53b6

8 files changed

Lines changed: 443 additions & 47 deletions

File tree

.github/workflows/build-dev.yml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
name: Build Development
2+
3+
on:
4+
push:
5+
branches: [main]
6+
7+
permissions:
8+
contents: write
9+
10+
jobs:
11+
build:
12+
runs-on: ubuntu-latest
13+
steps:
14+
- name: Checkout repository
15+
uses: actions/checkout@v4
16+
17+
- name: Set up JDK 17
18+
uses: actions/setup-java@v4
19+
with:
20+
java-version: 17
21+
distribution: temurin
22+
23+
- name: Build
24+
run: mvn package --file pom.xml
25+
26+
- name: Extract repository name
27+
run: echo "NAME=$(basename ${{ github.repository }})" >> $GITHUB_ENV
28+
29+
- name: Upload Build
30+
uses: marvinpinto/action-automatic-releases@master
31+
with:
32+
title: "${{ env.NAME }}"
33+
automatic_release_tag: "latest"
34+
repo_token: "${{ secrets.GITHUB_TOKEN }}"
35+
files: "target/*.jar"
36+
prerelease: false

src/main/java/net/aerh/discordbridge/DiscordBridgePlugin.java

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public final class DiscordBridgePlugin extends JavaPlugin {
3333
private static final Pattern INBOUND_PLACEHOLDER = Pattern.compile("%(label|role|username|message)%");
3434
private static final String INBOUND_TEMPLATE = "%label% %role% %username%: %message%";
3535
private static final String DISCORD_LABEL = "[Discord]";
36-
private static final String OUTBOUND_TEMPLATE = "**%player%**: %message%";
36+
3737
private static final Color LABEL_COLOR = Color.decode("#5865F2");
3838
private static final Color DEFAULT_ROLE_COLOR = Color.decode("#99AAB5");
3939
private static final Color CONTENT_COLOR = Color.decode("#FFFFFF");
@@ -131,25 +131,31 @@ private void onPlayerChat(@NotNull PlayerChatEvent event) {
131131
return;
132132
}
133133

134-
String payload = OUTBOUND_TEMPLATE
135-
.replace("%player%", event.getSender().getUsername())
136-
.replace("%message%", cleaned);
137-
138-
sendToDiscord(payload, cfg);
134+
DiscordConfig discordConfig = cfg.getDiscordConfig();
135+
if (discordConfig.isUseWebhookForChat()) {
136+
botConnection.sendWebhookMessage(discordConfig.getWebhookUrl(), event.getSender().getUsername(), cleaned);
137+
} else {
138+
MessagesConfig messages = cfg.getMessagesConfig();
139+
String payload = messages.getGameToDiscord()
140+
.replace("%player%", event.getSender().getUsername())
141+
.replace("%message%", cleaned);
142+
143+
sendToDiscord(payload, cfg);
144+
}
139145
}
140146

141147
private void onPlayerConnect(@NotNull PlayerConnectEvent event) {
142148
DiscordBridgeConfig cfg = config.get();
143149
EventsConfig events = cfg.getEventsConfig();
144150
MessagesConfig messages = cfg.getMessagesConfig();
145-
sendEventMessage(events.isPlayerJoin(), messages.getPlayerJoin(), "%player%", event.getPlayerRef().getUsername());
151+
sendEventMessage(events.isPlayerJoin(), messages.getPlayerJoin(), events.isPlayerJoinEmbed(), events.getPlayerJoinEmbedColor(), events.getPlayerJoinEmbedContentType(), "%player%", event.getPlayerRef().getUsername());
146152
}
147153

148154
private void onPlayerDisconnect(@NotNull PlayerDisconnectEvent event) {
149155
DiscordBridgeConfig cfg = config.get();
150156
EventsConfig events = cfg.getEventsConfig();
151157
MessagesConfig messages = cfg.getMessagesConfig();
152-
sendEventMessage(events.isPlayerLeave(), messages.getPlayerLeave(), "%player%", event.getPlayerRef().getUsername());
158+
sendEventMessage(events.isPlayerLeave(), messages.getPlayerLeave(), events.isPlayerLeaveEmbed(), events.getPlayerLeaveEmbedColor(), events.getPlayerLeaveEmbedContentType(), "%player%", event.getPlayerRef().getUsername());
153159
}
154160

155161
private void onPlayerEnterWorld(@NotNull AddPlayerToWorldEvent event) {
@@ -165,7 +171,7 @@ private void onPlayerEnterWorld(@NotNull AddPlayerToWorldEvent event) {
165171
}
166172

167173
MessagesConfig messages = cfg.getMessagesConfig();
168-
sendEventMessage(true, messages.getWorldEnter(),
174+
sendEventMessage(true, messages.getWorldEnter(), events.isWorldEnterEmbed(), events.getWorldEnterEmbedColor(), events.getWorldEnterEmbedContentType(),
169175
"%player%", playerRef.getUsername(),
170176
"%world%", event.getWorld().getName()
171177
);
@@ -186,7 +192,7 @@ private void onPlayerLeaveWorld(@NotNull DrainPlayerFromWorldEvent event) {
186192
World world = event.getWorld();
187193
String worldName = world.getName();
188194
MessagesConfig messages = cfg.getMessagesConfig();
189-
sendEventMessage(true, messages.getWorldLeave(),
195+
sendEventMessage(true, messages.getWorldLeave(), events.isWorldLeaveEmbed(), events.getWorldLeaveEmbedColor(), events.getWorldLeaveEmbedContentType(),
190196
"%player%", playerRef.getUsername(),
191197
"%world%", worldName
192198
);
@@ -310,7 +316,7 @@ private void sendServerStartMessage() {
310316
EventsConfig events = cfg.getEventsConfig();
311317
MessagesConfig messages = cfg.getMessagesConfig();
312318

313-
sendEventMessage(events.isServerStart(), messages.getServerStart());
319+
sendEventMessage(events.isServerStart(), messages.getServerStart(), events.isServerStartEmbed(), events.getServerStartEmbedColor(), events.getServerStartEmbedContentType());
314320
}
315321

316322
private void sendServerStopMessage() {
@@ -322,17 +328,20 @@ private void sendServerStopMessage() {
322328
EventsConfig events = cfg.getEventsConfig();
323329
MessagesConfig messages = cfg.getMessagesConfig();
324330

325-
sendEventMessage(events.isServerStop(), messages.getServerStop());
331+
sendEventMessage(events.isServerStop(), messages.getServerStop(), events.isServerStopEmbed(), events.getServerStopEmbedColor(), events.getServerStopEmbedContentType());
326332
}
327333

328334
/**
329335
* Sends an event message to Discord if enabled.
330336
*
331-
* @param enabled whether this event type is enabled
332-
* @param template the message template
333-
* @param replacements pairs of placeholder and value (e.g., "%player%", "Steve")
337+
* @param enabled whether this event type is enabled
338+
* @param template the message template
339+
* @param embedEnabled whether to send as embed
340+
* @param embedColor the embed color hex
341+
* @param embedContentType "description" or "title"
342+
* @param replacements pairs of placeholder and value (e.g., "%player%", "Steve")
334343
*/
335-
private void sendEventMessage(boolean enabled, @NotNull String template, @NotNull String... replacements) {
344+
private void sendEventMessage(boolean enabled, @NotNull String template, boolean embedEnabled, @NotNull String embedColor, @NotNull String embedContentType, @NotNull String... replacements) {
336345
if (!enabled) {
337346
return;
338347
}
@@ -342,7 +351,14 @@ private void sendEventMessage(boolean enabled, @NotNull String template, @NotNul
342351
message = message.replace(replacements[i], replacements[i + 1]);
343352
}
344353

345-
sendToDiscord(message, config.get());
354+
if (embedEnabled) {
355+
if (botConnection == null || !botConnection.isReady()) {
356+
return;
357+
}
358+
botConnection.sendEmbed(message, embedColor, embedContentType);
359+
} else {
360+
sendToDiscord(message, config.get());
361+
}
346362
}
347363

348364
private void ensureConfigExists(@NotNull Path dataDir) throws IOException {

src/main/java/net/aerh/discordbridge/config/DiscordConfig.java

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,19 @@ public final class DiscordConfig {
3232
(cfg, value) -> cfg.ignoreWebhookMessages = value,
3333
cfg -> cfg.ignoreWebhookMessages)
3434
.add()
35-
.append(new KeyedCodec<>("AllowMentions", Codec.BOOLEAN),
36-
(cfg, value) -> cfg.allowMentions = value,
37-
cfg -> cfg.allowMentions)
38-
.add()
39-
.build();
35+
.append(new KeyedCodec<>("AllowMentions", Codec.BOOLEAN),
36+
(cfg, value) -> cfg.allowMentions = value,
37+
cfg -> cfg.allowMentions)
38+
.add()
39+
.append(new KeyedCodec<>("WebhookUrl", Codec.STRING),
40+
(cfg, value) -> cfg.webhookUrl = value,
41+
cfg -> cfg.webhookUrl)
42+
.add()
43+
.append(new KeyedCodec<>("UseWebhookForChat", Codec.BOOLEAN),
44+
(cfg, value) -> cfg.useWebhookForChat = value,
45+
cfg -> cfg.useWebhookForChat)
46+
.add()
47+
.build();
4048

4149
private static final String DEFAULT_PRESENCE = "Watching the server";
4250

@@ -46,6 +54,8 @@ public final class DiscordConfig {
4654
private boolean ignoreBotMessages = true;
4755
private boolean ignoreWebhookMessages = true;
4856
private boolean allowMentions = false;
57+
private String webhookUrl = "";
58+
private boolean useWebhookForChat = false;
4959

5060
@NotNull
5161
public String getBotToken() {
@@ -76,6 +86,15 @@ public boolean isAllowMentions() {
7686
return allowMentions;
7787
}
7888

89+
@NotNull
90+
public String getWebhookUrl() {
91+
return webhookUrl == null ? "" : webhookUrl;
92+
}
93+
94+
public boolean isUseWebhookForChat() {
95+
return useWebhookForChat;
96+
}
97+
7998
/**
8099
* @return {@code true} if the bot can be started with these settings.
81100
*/

0 commit comments

Comments
 (0)