Skip to content

Commit ef2f76c

Browse files
completely rewrite the discord system
1 parent eb66944 commit ef2f76c

16 files changed

+209
-501
lines changed

src/main/java/one/devos/nautical/teabridge/Config.java

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,44 +2,37 @@
22

33
import java.io.BufferedReader;
44
import java.io.BufferedWriter;
5-
import java.net.URI;
6-
import java.net.URLDecoder;
7-
import java.net.URLEncoder;
8-
import java.nio.charset.StandardCharsets;
95
import java.nio.file.Files;
106
import java.nio.file.Path;
117
import java.nio.file.StandardOpenOption;
12-
import java.util.function.Function;
138

149
import com.google.gson.Gson;
1510
import com.google.gson.GsonBuilder;
1611
import com.google.gson.JsonParser;
12+
import com.google.gson.Strictness;
1713
import com.mojang.serialization.Codec;
1814
import com.mojang.serialization.DataResult;
1915
import com.mojang.serialization.JsonOps;
2016
import com.mojang.serialization.codecs.RecordCodecBuilder;
2117

2218
import net.fabricmc.loader.api.FabricLoader;
23-
import one.devos.nautical.teabridge.util.MoreCodecs;
2419

2520
public record Config(
2621
Discord discord,
2722
Avatars avatars,
2823
Game game,
29-
Crashes crashes,
30-
boolean debug
24+
Crashes crashes
3125
) {
32-
private static final Gson GSON = new GsonBuilder().setPrettyPrinting().setLenient().disableHtmlEscaping().create();
26+
private static final Gson GSON = new GsonBuilder().setPrettyPrinting().setStrictness(Strictness.LENIENT).disableHtmlEscaping().create();
3327

3428
public static final Codec<Config> CODEC = RecordCodecBuilder.create(instance -> instance.group(
3529
Discord.CODEC.fieldOf("discord").forGetter(Config::discord),
3630
Avatars.CODEC.fieldOf("avatars").forGetter(Config::avatars),
3731
Game.CODEC.fieldOf("game").forGetter(Config::game),
38-
Crashes.CODEC.fieldOf("crashes").forGetter(Config::crashes),
39-
Codec.BOOL.optionalFieldOf("debug", false).forGetter(Config::debug)
32+
Crashes.CODEC.fieldOf("crashes").forGetter(Config::crashes)
4033
).apply(instance, Config::new));
4134

42-
public static final Config DEFAULT = new Config(Discord.DEFAULT, Avatars.DEFAULT, Game.DEFAULT, Crashes.DEFAULT, false);
35+
public static final Config DEFAULT = new Config(Discord.DEFAULT, Avatars.DEFAULT, Game.DEFAULT, Crashes.DEFAULT);
4336
public static final Path PATH = FabricLoader.getInstance().getConfigDir().resolve(TeaBridge.ID + ".json");
4437

4538
public static DataResult<Config> load() {
@@ -61,18 +54,18 @@ public static DataResult<Config> load() {
6154

6255
public record Discord(
6356
String token,
64-
URI webhook,
57+
String webhook,
6558
int pkMessageDelay,
6659
boolean pkMessageDelayMilliseconds
6760
) {
6861
public static final String DEFAULT_TOKEN = "";
69-
public static final URI DEFAULT_WEBHOOK = URI.create("");
62+
public static final String DEFAULT_WEBHOOK = "";
7063
public static final int DEFAULT_PK_MESSAGE_DELAY = 0;
7164
public static final boolean DEFAULT_PK_MESSAGE_DELAY_MILLISECONDS = true;
7265

7366
public static final Codec<Discord> CODEC = RecordCodecBuilder.create(instance -> instance.group(
7467
Codec.STRING.fieldOf("token").forGetter(Discord::token),
75-
MoreCodecs.URI.fieldOf("webhook").forGetter(Discord::webhook),
68+
Codec.STRING.fieldOf("webhook").forGetter(Discord::webhook),
7669
Codec.INT.fieldOf("pkMessageDelay").forGetter(Discord::pkMessageDelay),
7770
Codec.BOOL.fieldOf("pkMessageDelayMilliseconds").forGetter(Discord::pkMessageDelayMilliseconds)
7871
).apply(instance, Discord::new));
@@ -85,18 +78,12 @@ public record Discord(
8578
);
8679
}
8780

88-
public record Avatars(Function<String, URI> avatarUrl, boolean useTextureId) {
89-
public static final Function<String, URI> DEFAULT_AVATAR_URL = a -> URI.create("https://api.nucleoid.xyz/skin/face/256/%s".formatted(a));
81+
public record Avatars(String avatarUrl, boolean useTextureId) {
82+
public static final String DEFAULT_AVATAR_URL = "https://api.nucleoid.xyz/skin/face/256/%s";
9083
public static final boolean DEFAULT_USE_TEXTURE_ID = false;
9184

9285
public static final Codec<Avatars> CODEC = RecordCodecBuilder.create(instance -> instance.group(
93-
Codec.STRING
94-
.comapFlatMap(
95-
MoreCodecs.checkedMapper(a -> (Function<String, URI>) b -> URI.create(a.formatted(b))),
96-
b -> URLDecoder.decode(b.apply(URLEncoder.encode("%s", StandardCharsets.UTF_8)).toString(), StandardCharsets.UTF_8)
97-
)
98-
.fieldOf("avatarUrl")
99-
.forGetter(Avatars::avatarUrl),
86+
Codec.STRING.fieldOf("avatarUrl").forGetter(Avatars::avatarUrl),
10087
Codec.BOOL.fieldOf("useTextureId").forGetter(Avatars::useTextureId)
10188
).apply(instance, Avatars::new));
10289

src/main/java/one/devos/nautical/teabridge/TeaBridge.java

Lines changed: 43 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package one.devos.nautical.teabridge;
22

3-
import java.net.http.HttpClient;
4-
53
import org.slf4j.Logger;
64
import org.slf4j.LoggerFactory;
75

@@ -23,72 +21,79 @@
2321
import net.minecraft.resources.ResourceLocation;
2422
import net.minecraft.server.MinecraftServer;
2523
import net.minecraft.server.level.ServerPlayer;
26-
import one.devos.nautical.teabridge.discord.ChannelListener;
2724
import one.devos.nautical.teabridge.discord.Discord;
28-
import one.devos.nautical.teabridge.discord.PlayerWebHook;
25+
import one.devos.nautical.teabridge.discord.PlayerWebhook;
2926
import one.devos.nautical.teabridge.util.CrashHandler;
3027

3128
public class TeaBridge implements DedicatedServerModInitializer {
3229
public static final String ID = "teabridge";
3330
public static final Logger LOGGER = LoggerFactory.getLogger("TeaBridge");
3431

35-
public static final HttpClient CLIENT = HttpClient.newBuilder().build();
32+
public static Config config;
3633

37-
public static Config config = Config.DEFAULT;
34+
private static Discord discord;
3835

3936
@Override
4037
public void onInitializeServer() {
41-
ServerLifecycleEvents.SERVER_STARTING.register(this::onServerStarting);
42-
ServerLifecycleEvents.SERVER_STARTED.register(this::onServerStart);
43-
ServerLifecycleEvents.SERVER_STOPPED.register(this::onServerStop);
38+
ServerLifecycleEvents.SERVER_STARTING.register(TeaBridge::onServerStarting);
39+
ServerLifecycleEvents.SERVER_STARTED.register(TeaBridge::onServerStart);
40+
ServerLifecycleEvents.SERVER_STOPPED.register(TeaBridge::onServerStop);
4441

4542
ResourceLocation phaseId = ResourceLocation.fromNamespaceAndPath(ID, "mirror");
4643
ServerMessageEvents.CHAT_MESSAGE.addPhaseOrdering(ResourceLocation.fromNamespaceAndPath("switchy_proxy", "set_args"), phaseId);
4744
ServerMessageEvents.CHAT_MESSAGE.addPhaseOrdering(phaseId, ResourceLocation.fromNamespaceAndPath("switchy_proxy", "clear"));
48-
ServerMessageEvents.CHAT_MESSAGE.register(phaseId, this::onChatMessage);
45+
ServerMessageEvents.CHAT_MESSAGE.register(phaseId, TeaBridge::onChatMessage);
46+
47+
ServerMessageEvents.COMMAND_MESSAGE.register(TeaBridge::onCommandMessage);
48+
49+
CommandRegistrationCallback.EVENT.register(TeaBridge::registerCommands);
50+
}
4951

50-
ServerMessageEvents.COMMAND_MESSAGE.register(this::onCommandMessage);
52+
private static void onConfigLoad(Config config, MinecraftServer server) {
53+
TeaBridge.config = config;
5154

52-
CommandRegistrationCallback.EVENT.register(this::registerCommands);
55+
if (TeaBridge.discord != null)
56+
TeaBridge.discord.shutdown();
57+
TeaBridge.discord = Discord.initialize(config.discord(), server);
58+
}
5359

60+
private static void onServerStarting(MinecraftServer server) {
5461
Config.load()
5562
.ifError(e -> LOGGER.error("Failed to load config using defaults : {}", e))
56-
.ifSuccess(loaded -> {
57-
config = loaded;
58-
if (config.debug())
59-
LOGGER.warn("!!Debug mode enabled in config!!");
60-
this.onConfigLoad();
61-
});
62-
}
63+
.ifSuccess(config -> onConfigLoad(config, server));
6364

64-
private void onConfigLoad() {
65-
Discord.onConfigLoad(config.discord());
65+
if (Discord.instance() != null)
66+
Discord.instance().sendSystemMessage(config.game().serverStartingMessage());
6667
}
6768

68-
private void onServerStarting(MinecraftServer server) {
69-
Discord.send(config.game().serverStartingMessage());
69+
private static void onServerStart(MinecraftServer server) {
70+
if (Discord.instance() != null)
71+
Discord.instance().sendSystemMessage(config.game().serverStartMessage());
7072
}
7173

72-
private void onServerStart(MinecraftServer server) {
73-
ChannelListener.INSTANCE.setServer(server);
74-
Discord.send(config.game().serverStartMessage());
75-
}
74+
private static void onServerStop(MinecraftServer server) {
75+
Discord discord = Discord.instance();
76+
if (discord == null)
77+
return;
7678

77-
private void onServerStop(MinecraftServer server) {
78-
if (!CrashHandler.didCrash) Discord.send(config.game().serverStopMessage());
79-
Discord.stop();
79+
if (!CrashHandler.didCrash)
80+
discord.sendSystemMessage(config.game().serverStopMessage());
81+
discord.shutdown();
8082
}
8183

82-
private void onChatMessage(PlayerChatMessage message, ServerPlayer sender, ChatType.Bound params) {
83-
((PlayerWebHook) sender.connection).teabridge$send(message);
84+
private static void onChatMessage(PlayerChatMessage message, ServerPlayer sender, ChatType.Bound params) {
85+
((PlayerWebhook) sender.connection).teabridge$send(message);
8486
}
8587

86-
private void onCommandMessage(PlayerChatMessage message, CommandSourceStack source, ChatType.Bound params) {
87-
if (!config.game().mirrorCommandMessages()) return;
88-
if (!source.isPlayer()) Discord.send(message.signedContent());
88+
private static void onCommandMessage(PlayerChatMessage message, CommandSourceStack source, ChatType.Bound params) {
89+
if (!config.game().mirrorCommandMessages())
90+
return;
91+
92+
if (Discord.instance() != null && !source.isPlayer())
93+
Discord.instance().sendSystemMessage(message.signedContent());
8994
}
9095

91-
private void registerCommands(CommandDispatcher<CommandSourceStack> dispatcher, CommandBuildContext registryAccess, Commands.CommandSelection environment) {
96+
private static void registerCommands(CommandDispatcher<CommandSourceStack> dispatcher, CommandBuildContext registryAccess, Commands.CommandSelection environment) {
9297
dispatcher.register(Commands.literal(ID)
9398
.requires(source -> source.hasPermission(2))
9499
.then(
@@ -104,9 +109,8 @@ private void registerCommands(CommandDispatcher<CommandSourceStack> dispatcher,
104109
);
105110
LOGGER.warn("Failed to reload config : {}", e);
106111
})
107-
.ifSuccess(loaded -> {
108-
config = loaded;
109-
this.onConfigLoad();
112+
.ifSuccess(config -> {
113+
onConfigLoad(config, source.getServer());
110114
source.sendSuccess(
111115
() -> Component.literal("Config reloaded!")
112116
.withStyle(ChatFormatting.GREEN),

src/main/java/one/devos/nautical/teabridge/discord/ChannelListener.java

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

0 commit comments

Comments
 (0)