Skip to content

Commit 3ed55fe

Browse files
more stuff
1 parent 7120f3b commit 3ed55fe

File tree

34 files changed

+1102
-19
lines changed

34 files changed

+1102
-19
lines changed

build.gradle

+3
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ subprojects {
4949
checkers = [
5050
'org.checkerframework.checker.nullness.NullnessChecker'
5151
]
52+
extraJavacArgs = [
53+
'-AsuppressWarnings=initialization'
54+
]
5255
}
5356

5457
sourceCompatibility = '1.8'

client-paper/build.gradle

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
plugins {
2+
id 'com.github.johnrengelman.shadow' version '6.1.0'
3+
}
4+
5+
repositories {
6+
maven {
7+
url 'https://papermc.io/repo/repository/maven-public/'
8+
}
9+
}
10+
11+
description = 'Paper-Client'
12+
13+
dependencies {
14+
implementation project(":client")
15+
16+
compileOnly "com.destroystokyo.paper:paper-api:${vers["paper-api"]}"
17+
}
18+
19+
shadowJar {
20+
archiveClassifier.set("")
21+
archiveBaseName.set(rootProject.description + '-' + project.description)
22+
archiveVersion.set(projectVersion)
23+
}
24+
25+
jar {
26+
enabled(false)
27+
}
28+
29+
tasks.build.dependsOn tasks.shadowJar
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package io.github.underscore11code.ccord.client;
2+
3+
import io.papermc.paper.event.player.AsyncChatEvent;
4+
import net.kyori.adventure.text.serializer.plain.PlainComponentSerializer;
5+
import org.bukkit.event.EventHandler;
6+
import org.bukkit.event.Listener;
7+
import org.bukkit.plugin.java.JavaPlugin;
8+
9+
@SuppressWarnings("initialization.fields.uninitialized") // I know :(
10+
public class CarbonClientPaper extends JavaPlugin implements Listener {
11+
private CarbonClient carbonClient;
12+
13+
@Override
14+
public void onEnable() {
15+
try {
16+
this.carbonClient = new CarbonClient(this.getDataFolder(), new PaperClientAdapter(this));
17+
} catch (final Exception e) {
18+
e.printStackTrace();
19+
}
20+
21+
this.getServer().getPluginManager().registerEvents(this, this);
22+
}
23+
24+
@Override
25+
public void onDisable() {
26+
this.carbonClient.shutdown();
27+
}
28+
29+
@EventHandler
30+
public void onChat(final AsyncChatEvent chatEvent) {
31+
this.carbonClient.handleMessage(chatEvent.getPlayer(), "global", PlainComponentSerializer.plain().serialize(chatEvent.message()));
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package io.github.underscore11code.ccord.client;
2+
3+
import net.kyori.adventure.audience.Audience;
4+
import org.bukkit.entity.Player;
5+
import org.checkerframework.checker.nullness.qual.Nullable;
6+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
import java.util.UUID;
10+
11+
public class PaperClientAdapter implements ClientPlatformAdapter {
12+
private final CarbonClientPaper client;
13+
14+
public PaperClientAdapter(final CarbonClientPaper client) {
15+
this.client = client;
16+
}
17+
18+
@Override
19+
public Audience global() {
20+
return this.client.getServer();
21+
}
22+
23+
@Override
24+
public @Nullable Audience player(final UUID uuid) {
25+
return this.client.getServer().getPlayer(uuid);
26+
}
27+
28+
@Override
29+
public List<UUID> onlineList() {
30+
final List<UUID> online = new ArrayList<>();
31+
for (final Player onlinePlayer : this.client.getServer().getOnlinePlayers()) {
32+
online.add(onlinePlayer.getUniqueId());
33+
}
34+
return online;
35+
}
36+
37+
@Override
38+
public boolean isOnline(final UUID uuid) {
39+
return this.onlineList().contains(uuid);
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
name: "CarbonCord"
2+
main: "io.github.underscore11code.ccord.client.CarbonClientPaper"
3+
version: "<ver>"
4+
api-version: "1.16"

client/build.gradle

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
plugins {
2+
id 'java-library'
3+
}
4+
5+
dependencies {
6+
api project(":common")
7+
api project(":redis-messaging")
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package io.github.underscore11code.ccord.client;
2+
3+
import io.github.underscore11code.ccord.client.config.CarbonCordClientConfig;
4+
import io.github.underscore11code.ccord.client.listeners.AdventureListener;
5+
import io.github.underscore11code.ccord.common.Config;
6+
import io.github.underscore11code.ccord.common.VersionChecker;
7+
import io.github.underscore11code.ccord.messaging.MessageService;
8+
import io.github.underscore11code.ccord.messaging.RedisMessagingService;
9+
import io.github.underscore11code.ccord.messaging.packets.ClientConnectPacket;
10+
import io.github.underscore11code.ccord.messaging.packets.PingPacket;
11+
import io.github.underscore11code.ccord.messaging.packets.PingResponsePacket;
12+
import io.github.underscore11code.ccord.messaging.packets.RawChatPacket;
13+
import net.kyori.adventure.identity.Identified;
14+
import net.kyori.adventure.identity.Identity;
15+
import org.checkerframework.checker.nullness.qual.Nullable;
16+
import org.slf4j.Logger;
17+
import org.slf4j.LoggerFactory;
18+
19+
import java.io.File;
20+
import java.util.UUID;
21+
22+
public class CarbonClient {
23+
private static @Nullable CarbonClient instance = null;
24+
private static final Logger logger = LoggerFactory.getLogger(CarbonClient.class);
25+
26+
private final File configDir;
27+
private final Config<CarbonCordClientConfig> config;
28+
private final MessageService messageService;
29+
private final ClientPlatformAdapter adapter;
30+
31+
@SuppressWarnings({"assignment.type.incompatible", "argument.type.incompatible"})
32+
public CarbonClient(final File configDir, final ClientPlatformAdapter adapter) throws Exception {
33+
if (instance != null) {
34+
throw new IllegalStateException("Attempted to load CarbonClient when it's already running!");
35+
}
36+
instance = this;
37+
38+
if (!VersionChecker.checkJvmVersion()) {
39+
throw new Exception();
40+
}
41+
42+
this.adapter = adapter;
43+
44+
this.configDir = configDir;
45+
this.config = new Config<>(CarbonCordClientConfig.class, new File(configDir, "client.conf"));
46+
this.config.load();
47+
this.config.save();
48+
49+
// TODO Remove when a second messaging service is added
50+
//noinspection SwitchStatementWithTooFewBranches
51+
switch (this.config.get().messaging().serviceType()) {
52+
case "redis":
53+
this.messageService = new RedisMessagingService(this.config.get().messaging().redis().toRedisUri());
54+
break;
55+
56+
default:
57+
logger.error("Invalid messaging service type \"{}\"!", this.config.get().messaging().serviceType());
58+
throw new Exception();
59+
}
60+
61+
this.messageService.connect();
62+
63+
this.messageService.bus().register(PingPacket.class, p -> {
64+
if (!p.isFromThis()) this.messageService.send(new PingResponsePacket(p));
65+
});
66+
new AdventureListener(this);
67+
this.messageService.send(new ClientConnectPacket(this.config.get().serverName()));
68+
}
69+
70+
public void shutdown() {
71+
this.messageService.disconnect();
72+
instance = null;
73+
}
74+
75+
public void handleMessage(final Identified player, final String channel, final String message) {
76+
this.messageService.send(new RawChatPacket(player.identity().uuid(), channel, message));
77+
}
78+
79+
public void handleMessage(final Identity identity, final String channel, final String message) {
80+
this.messageService.send(new RawChatPacket(identity.uuid(), channel, message));
81+
}
82+
83+
public void handleMessage(final UUID uuid, final String channel, final String message) {
84+
this.messageService.send(new RawChatPacket(uuid, channel, message));
85+
}
86+
87+
public File configDir() {
88+
return this.configDir;
89+
}
90+
91+
public Config<CarbonCordClientConfig> config() {
92+
return this.config;
93+
}
94+
95+
public MessageService messageService() {
96+
return this.messageService;
97+
}
98+
99+
public ClientPlatformAdapter adapter() {
100+
return this.adapter;
101+
}
102+
103+
public static @Nullable CarbonClient instance() {
104+
return instance;
105+
}
106+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.github.underscore11code.ccord.client;
2+
3+
import net.kyori.adventure.audience.Audience;
4+
import org.checkerframework.checker.nullness.qual.Nullable;
5+
6+
import java.util.List;
7+
import java.util.UUID;
8+
9+
public interface ClientPlatformAdapter {
10+
Audience global();
11+
12+
@Nullable Audience player(final UUID uuid);
13+
14+
List<UUID> onlineList();
15+
16+
boolean isOnline(final UUID uuid);
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package io.github.underscore11code.ccord.client.config;
2+
3+
import org.spongepowered.configurate.objectmapping.ConfigSerializable;
4+
5+
@SuppressWarnings("FieldMayBeFinal")
6+
@ConfigSerializable
7+
public class CarbonCordClientConfig {
8+
private String serverName = "server";
9+
10+
private ClientMessagingConfig messaging = new ClientMessagingConfig();
11+
12+
public String serverName() {
13+
return this.serverName;
14+
}
15+
16+
public void serverName(final String serverName) {
17+
this.serverName = serverName;
18+
}
19+
20+
public ClientMessagingConfig messaging() {
21+
return this.messaging;
22+
}
23+
24+
public void messaging(final ClientMessagingConfig messaging) {
25+
this.messaging = messaging;
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package io.github.underscore11code.ccord.client.config;
2+
3+
import io.github.underscore11code.ccord.messaging.RedisConfig;
4+
import org.spongepowered.configurate.objectmapping.ConfigSerializable;
5+
import org.spongepowered.configurate.objectmapping.meta.Comment;
6+
import org.spongepowered.configurate.objectmapping.meta.Setting;
7+
8+
@ConfigSerializable
9+
@SuppressWarnings("FieldMayBeFinal")
10+
public class ClientMessagingConfig {
11+
@Setting
12+
@Comment("Type of message service to use. Currently only redis supported")
13+
private String serviceType = "redis";
14+
15+
@Setting
16+
@Comment("Configuration for the \"redis\" message service")
17+
private RedisConfig redis = new RedisConfig();
18+
19+
public String serviceType() {
20+
return this.serviceType;
21+
}
22+
23+
public void serviceType(final String serviceType) {
24+
this.serviceType = serviceType;
25+
}
26+
27+
public RedisConfig redis() {
28+
return this.redis;
29+
}
30+
31+
public void redis(final RedisConfig redis) {
32+
this.redis = redis;
33+
}
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package io.github.underscore11code.ccord.client.listeners;
2+
3+
import io.github.underscore11code.ccord.client.CarbonClient;
4+
import io.github.underscore11code.ccord.messaging.MessageService;
5+
import io.github.underscore11code.ccord.messaging.packets.AdventureChatPacket;
6+
import net.kyori.adventure.audience.Audience;
7+
import net.kyori.adventure.identity.Identity;
8+
import org.checkerframework.checker.nullness.qual.Nullable;
9+
10+
import java.util.UUID;
11+
12+
public class AdventureListener {
13+
private final CarbonClient carbonClient;
14+
15+
@SuppressWarnings("methodref.receiver.bound.invalid")
16+
public AdventureListener(final CarbonClient carbonClient) {
17+
this.carbonClient = carbonClient;
18+
19+
this.carbonClient.messageService().bus().register(AdventureChatPacket.class, this::onPacket);
20+
}
21+
22+
private void onPacket(final AdventureChatPacket p) {
23+
final Audience audience = this.audienceFor(p);
24+
if (audience == null) return;
25+
26+
final UUID identity = p.identity();
27+
if (identity != null) {
28+
audience.sendMessage(Identity.identity(identity), p.deserializedComponent());
29+
} else {
30+
audience.sendMessage(p.deserializedComponent());
31+
}
32+
}
33+
34+
private @Nullable Audience audienceFor(final AdventureChatPacket p) {
35+
if (p.targetedClient() == null && p.targetedPlayer() == null) return null;
36+
37+
final UUID targetedClient = p.targetedClient();
38+
final UUID targetedPlayer = p.targetedPlayer();
39+
40+
// If given both client and player & they're both valid, use that
41+
if (targetedClient != null && targetedPlayer != null) {
42+
if (targetedClient.equals(MessageService.SERVER_ID) && this.carbonClient.adapter().isOnline(targetedPlayer)) {
43+
return this.carbonClient.adapter().player(targetedPlayer);
44+
}
45+
return null;
46+
}
47+
48+
if (targetedClient != null && targetedClient.equals(MessageService.SERVER_ID)) {
49+
return this.carbonClient.adapter().global();
50+
}
51+
52+
if (targetedPlayer != null && this.carbonClient.adapter().isOnline(targetedPlayer)) {
53+
return this.carbonClient.adapter().player(targetedPlayer);
54+
}
55+
56+
return null;
57+
}
58+
}

common/build.gradle

+3
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,7 @@ dependencies {
66
api "org.slf4j:slf4j-api:${vers['slf4j-api']}"
77
api "org.spongepowered:configurate-core:${vers['configurate']}"
88
api "org.spongepowered:configurate-hocon:${vers['configurate']}"
9+
api "net.kyori:adventure-api:${vers['adventure']}"
10+
api "net.kyori:adventure-text-serializer-gson:${vers['adventure']}"
11+
api "net.kyori:adventure-text-serializer-plain:${vers['adventure']}"
912
}

common/src/main/java/io/github/underscore11/ccord/common/Config.java renamed to common/src/main/java/io/github/underscore11code/ccord/common/Config.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.github.underscore11.ccord.common;
1+
package io.github.underscore11code.ccord.common;
22

33
import org.checkerframework.checker.nullness.qual.Nullable;
44
import org.slf4j.Logger;

0 commit comments

Comments
 (0)