Skip to content

Commit c4e5347

Browse files
author
yitzy299
committed
Big refactor (#14)
Key changes: - BlockBot API for handling of events and listeners - Mixins now trigger events - When adding a bot, the registerBot method in BlockBot should be called. This will handle all the listeners needed for the bot - All bots need to implement the Bot interface and call the registerBot method This is not final but makes up the framework for the future layout of BlockBot. Any suggestions please contact me on the discord Signed-off-by: yitzy299 <[email protected]>
1 parent d14f22e commit c4e5347

13 files changed

+266
-151
lines changed
Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,57 @@
11
package com.github.quiltservertools.blockbot;
22

3+
import com.github.quiltservertools.blockbot.api.Bot;
4+
import com.github.quiltservertools.blockbot.api.event.ChatMessageEvent;
5+
import com.github.quiltservertools.blockbot.api.event.PlayerAdvancementGrantEvent;
6+
import com.github.quiltservertools.blockbot.api.event.PlayerDeathEvent;
37
import net.fabricmc.api.DedicatedServerModInitializer;
48
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
9+
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
10+
import net.minecraft.server.MinecraftServer;
511
import org.apache.logging.log4j.LogManager;
612
import org.apache.logging.log4j.Logger;
713

814
import javax.security.auth.login.LoginException;
15+
import java.util.ArrayList;
16+
import java.util.List;
917

1018
public class BlockBot implements DedicatedServerModInitializer {
1119
public static Config CONFIG;
1220
public static Logger LOG;
13-
public static Discord DISCORD;
21+
public static final List<Bot> bots = new ArrayList<>();
1422

1523
@Override
1624
public void onInitializeServer() {
1725
LOG = LogManager.getLogger();
26+
CONFIG = new Config();
1827
ServerLifecycleEvents.SERVER_STARTING.register(server -> {
19-
CONFIG = new Config();
2028
try {
21-
DISCORD = new Discord(CONFIG, server);
22-
DISCORD.serverStatus(true);
29+
var bot = new BlockBotDiscord();
30+
registerBot(bot, CONFIG, server);
2331
} catch (LoginException e) {
2432
e.printStackTrace();
2533
server.stop(false);
2634
}
2735
});
36+
ServerLifecycleEvents.SERVER_STARTED.register(server -> bots.forEach(bot -> bot.serverStatus(true)));
2837
ServerLifecycleEvents.SERVER_STOPPING.register(server -> {
2938
CONFIG.shutdown();
30-
DISCORD.serverStatus(false);
31-
DISCORD.shutdown();
39+
bots.forEach(bot -> {
40+
bot.serverStatus(false);
41+
bot.onShutdown();
42+
});
3243
});
3344
}
45+
46+
public void registerBot(Bot bot, Config config, MinecraftServer server) throws LoginException {
47+
bots.add(bot);
48+
bot.registerListeners(config, server);
49+
// Events
50+
ChatMessageEvent.EVENT.register(bot::onChatMessage);
51+
PlayerDeathEvent.EVENT.register(bot::onDeathMessage);
52+
PlayerAdvancementGrantEvent.EVENT.register(bot::onAdvancementGrant);
53+
54+
ServerPlayConnectionEvents.JOIN.register(bot::onPlayerConnect);
55+
ServerPlayConnectionEvents.DISCONNECT.register(bot::onPlayerDisconnect);
56+
}
3457
}
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
package com.github.quiltservertools.blockbot;
2+
3+
import club.minnced.discord.webhook.WebhookClient;
4+
import club.minnced.discord.webhook.WebhookClientBuilder;
5+
import club.minnced.discord.webhook.send.*;
6+
import com.github.quiltservertools.blockbot.api.Bot;
7+
import com.github.quiltservertools.blockbot.api.event.ChatMessageEvent;
8+
import com.github.quiltservertools.blockbot.api.event.PlayerAdvancementGrantEvent;
9+
import com.github.quiltservertools.blockbot.api.event.PlayerDeathEvent;
10+
import net.dv8tion.jda.api.JDA;
11+
import net.dv8tion.jda.api.JDABuilder;
12+
import net.dv8tion.jda.api.entities.Activity;
13+
import net.dv8tion.jda.api.managers.Presence;
14+
import net.fabricmc.fabric.api.networking.v1.PacketSender;
15+
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
16+
import net.minecraft.advancement.Advancement;
17+
import net.minecraft.server.MinecraftServer;
18+
import net.minecraft.server.network.ServerPlayNetworkHandler;
19+
import net.minecraft.server.network.ServerPlayerEntity;
20+
import net.minecraft.text.Text;
21+
import okhttp3.OkHttpClient;
22+
import okhttp3.Protocol;
23+
import org.apache.commons.lang3.StringUtils;
24+
25+
import javax.security.auth.login.LoginException;
26+
import java.util.Collections;
27+
import java.util.Objects;
28+
29+
import static com.github.quiltservertools.blockbot.BlockBotUtils.getAvatarUrl;
30+
31+
public class BlockBotDiscord implements Bot {
32+
private WebhookClient webhook;
33+
private JDA jda;
34+
private Status status;
35+
36+
@Override
37+
public void registerListeners(Config config, MinecraftServer server) throws LoginException {
38+
jda = JDABuilder.createDefault(config.getIdentifier()).build();
39+
jda.addEventListener(new Listeners(config, server));
40+
BlockBot.LOG.info("Setup discord bot with token provided");
41+
// Init webhook
42+
WebhookClientBuilder builder = new WebhookClientBuilder(config.getWebhook());
43+
builder.setHttpClient(new OkHttpClient.Builder()
44+
.protocols(Collections.singletonList(Protocol.HTTP_1_1))
45+
.build());
46+
builder.setDaemon(true);
47+
builder.setAllowedMentions(AllowedMentions.none().withParseUsers(true));
48+
this.webhook = builder.build();
49+
50+
this.status = new Status();
51+
}
52+
53+
public JDA getBot() {
54+
return jda;
55+
}
56+
57+
@Override
58+
public void onChatMessage(ServerPlayerEntity player, String message) {
59+
webhook.send(prepareChatMessage(player, message));
60+
}
61+
62+
private WebhookMessage prepareChatMessage(ServerPlayerEntity player, String message) {
63+
WebhookMessageBuilder builder = new WebhookMessageBuilder();
64+
builder.setUsername(player.getName().getString());
65+
builder.setAvatarUrl(getAvatarUrl(player));
66+
builder.setContent(message);
67+
return builder.build();
68+
}
69+
70+
@Override
71+
public void serverStatus(boolean starting) {
72+
System.out.println(BlockBot.CONFIG.sendStatusMessages());
73+
if (!BlockBot.CONFIG.sendStatusMessages()) return;
74+
WebhookEmbedBuilder builder = new WebhookEmbedBuilder();
75+
builder.setAuthor(new WebhookEmbed.EmbedAuthor(BlockBot.CONFIG.getName(), BlockBot.CONFIG.getLogo(), null));
76+
builder.setColor(starting ? 3334259 : 14695980);
77+
builder.setDescription(starting ? "Server Started" : "Server Stopped");
78+
webhook.send(builder.build());
79+
}
80+
81+
@Override
82+
public void onDeathMessage(ServerPlayerEntity player, Text message) {
83+
WebhookEmbedBuilder builder = new WebhookEmbedBuilder();
84+
builder.setAuthor(new WebhookEmbed.EmbedAuthor(player.getName().asString(), getAvatarUrl(player), null));
85+
String msg = message.getString().replaceFirst(player.getName().asString() + " ", "");
86+
msg = StringUtils.capitalize(msg);
87+
builder.setDescription(msg);
88+
builder.setColor(15789375);
89+
webhook.send(builder.build());
90+
}
91+
92+
@Override
93+
public void onAdvancementGrant(ServerPlayerEntity player, Advancement advancement) {
94+
if (!BlockBot.CONFIG.sendAdvancementMessages()) return;
95+
WebhookEmbedBuilder builder = new WebhookEmbedBuilder();
96+
builder.setDescription(player.getName().getString() + " has made the advancement [" + Objects.requireNonNull(advancement.getDisplay()).getTitle().getString() + "]");
97+
builder.setColor(16771646);
98+
builder.setAuthor(new WebhookEmbed.EmbedAuthor(player.getName().asString(), getAvatarUrl(player), null));
99+
webhook.send(builder.build());
100+
}
101+
102+
@Override
103+
public void onShutdown() {
104+
jda.shutdown();
105+
webhook.close();
106+
}
107+
108+
@Override
109+
public void tickStatus(MinecraftServer server) {
110+
if (!BlockBot.CONFIG.showPresence()) return;
111+
Presence presence = jda.getPresence();
112+
Activity status = Activity.playing(BlockBot.CONFIG.getName() + " - " + this.status.getPlayerCount() + " online");
113+
presence.setActivity(status);
114+
}
115+
116+
@Override
117+
public void onPlayerConnect(ServerPlayNetworkHandler handler, PacketSender packetSender, MinecraftServer server) {
118+
webhook.send(buildConnectMessage(handler.getPlayer(), true));
119+
tickStatus(server);
120+
}
121+
122+
@Override
123+
public void onPlayerDisconnect(ServerPlayNetworkHandler handler, MinecraftServer server) {
124+
webhook.send(buildConnectMessage(handler.getPlayer(), false));
125+
tickStatus(server);
126+
}
127+
128+
private WebhookEmbed buildConnectMessage(ServerPlayerEntity player, boolean joined) {
129+
WebhookEmbedBuilder builder = new WebhookEmbedBuilder();
130+
builder.setAuthor(new WebhookEmbed.EmbedAuthor(player.getName().asString(), getAvatarUrl(player), null));
131+
builder.setDescription(joined ? "Joined the game" : "Left the game");
132+
builder.setColor(joined ? 3334259 : 14695980);
133+
return builder.build();
134+
}
135+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.github.quiltservertools.blockbot;
2+
3+
import net.minecraft.server.network.ServerPlayerEntity;
4+
5+
import java.time.LocalDateTime;
6+
7+
public class BlockBotUtils {
8+
public static String getAvatarUrl(ServerPlayerEntity player) {
9+
String url = "https://crafatar.com/avatars/" + player.getUuidAsString() + "?t=" + LocalDateTime.now().getHour();
10+
if (BlockBot.CONFIG.enableSkinOverlay()) url = url.concat("&overlay");
11+
return url;
12+
}
13+
}

src/main/java/com/github/quiltservertools/blockbot/Discord.java

Lines changed: 0 additions & 115 deletions
This file was deleted.

src/main/java/com/github/quiltservertools/blockbot/Listeners.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import net.dv8tion.jda.api.entities.Message;
66
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
77
import net.dv8tion.jda.api.hooks.ListenerAdapter;
8-
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
98
import net.minecraft.network.MessageType;
109
import net.minecraft.server.MinecraftServer;
1110
import net.minecraft.text.*;
@@ -21,16 +20,6 @@ public class Listeners extends ListenerAdapter {
2120
public Listeners(Config config, MinecraftServer server) {
2221
this.config = config;
2322
this.server = server;
24-
ServerPlayConnectionEvents.JOIN.register((handler, sender, server1) -> {
25-
BlockBot.DISCORD.joinLeaveToDiscord(false, handler.player);
26-
BlockBot.DISCORD.getStatus().addPlayer(handler.player.getUuid());
27-
BlockBot.DISCORD.getStatus().update();
28-
});
29-
ServerPlayConnectionEvents.DISCONNECT.register((handler, sender) -> {
30-
BlockBot.DISCORD.joinLeaveToDiscord(true, handler.player);
31-
BlockBot.DISCORD.getStatus().removePlayer(handler.player.getUuid());
32-
BlockBot.DISCORD.getStatus().update();
33-
});
3423
}
3524

3625
@Override
Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,26 @@
11
package com.github.quiltservertools.blockbot;
22

3-
import net.dv8tion.jda.api.entities.Activity;
4-
import net.dv8tion.jda.api.managers.Presence;
5-
63
import java.util.ArrayList;
74
import java.util.List;
85
import java.util.UUID;
96

107
public class Status {
11-
private List<UUID> players;
8+
private final List<UUID> players;
9+
1210
public Status() {
1311
players = new ArrayList<>();
1412
}
1513

16-
private int getPlayerCount() {
14+
public int getPlayerCount() {
1715
return players.size();
1816
}
1917

2018
public void addPlayer(UUID uuid) {
2119
players.add(uuid);
2220
}
21+
2322
public void removePlayer(UUID uuid) {
2423
players.remove(uuid);
2524
}
2625

27-
public void update() {
28-
if (!BlockBot.CONFIG.showPresence()) return;
29-
Presence presence = BlockBot.DISCORD.getJda().getPresence();
30-
Activity status = Activity.playing(BlockBot.CONFIG.getName() + " - " + getPlayerCount() + " online");
31-
presence.setActivity(status);
32-
}
3326
}

0 commit comments

Comments
 (0)