Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ready for Release v0.0.0 #1

Merged
merged 23 commits into from
Feb 27, 2024
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/codeql-maven-workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ jobs:
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v3
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'openjdk'
distribution: 'oracle'
cache: maven
- name: Build and Test with Maven
run: mvn test
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# ProxyChat

A simple plugin to send chat messages to other servers on the network.
A simple plugin to send chat messages to other servers on the network. This also includes to a Discord server.

Java Version
> JDK 17
62 changes: 62 additions & 0 deletions dependency-reduced-pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.plyblox</groupId>
<artifactId>ProxyChat</artifactId>
<name>ProxyChat</name>
<version>0.0.0</version>
<description>A simple plugin to send chat messages between servers.</description>
<build>
<defaultGoal>clean package</defaultGoal>
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>sonatype</id>
<url>https://oss.sonatype.org/content/groups/public/</url>
</repository>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId>
<version>1.20-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
<properties>
<java.version>17</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
48 changes: 37 additions & 11 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

<description>A simple plugin to send chat messages between servers.</description>
<properties>
<java.version>1.8</java.version>
<java.version>17</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

Expand Down Expand Up @@ -52,18 +52,44 @@
</build>

<repositories>
<repository>
<id>sonatype</id>
<url>https://oss.sonatype.org/content/groups/public/</url>
</repository>
<repository>
<id>sonatype</id>
<url>https://oss.sonatype.org/content/groups/public/</url>
</repository>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>

<dependencies>
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId>
<version>1.20-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<!-- Bungee Code -->
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId>
<version>1.20-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>

<!-- Annotations (Code Only) -->
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>24.1.0</version>
<scope>compile</scope>
</dependency>

<!-- Discord Stuff -->
<dependency>
<groupId>net.dv8tion</groupId>
<artifactId>JDA</artifactId>
<version>5.0.0-beta.20</version>
<exclusions>
<exclusion>
<groupId>club.minnced</groupId>
<artifactId>opus-java</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
54 changes: 52 additions & 2 deletions src/main/java/com/plyblox/proxychat/ProxyChat.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,67 @@
package com.plyblox.proxychat;

import com.plyblox.proxychat.chat.ServerChatHandler;
import com.plyblox.proxychat.discord.Bot;
import com.plyblox.proxychat.utility.config.Config;
import com.plyblox.proxychat.utility.config.ConfigDataKey;
import net.dv8tion.jda.api.EmbedBuilder;
import net.md_5.bungee.api.plugin.Plugin;
import org.jetbrains.annotations.NotNull;

import java.awt.*;
import java.util.logging.Level;

public final class ProxyChat extends Plugin {

private Config config;
private Bot discordBot;

@Override
public void onEnable() {
// Plugin startup logic
this.config = new Config(this);
this.config.initialize();

this.getLogger().log(Level.INFO, "The plugin is starting.");
this.getLogger().log(Level.INFO, "Initializing discord bot.");

try { discordBot = new Bot((String) config.get(ConfigDataKey.BOT_TOKEN), this); }
catch (InterruptedException e) { throw new RuntimeException(e); }

discordBot.sendMessageEmbed(
new EmbedBuilder()
.setTitle("✅ Proxy enabled!")
.setColor(Color.GREEN)
.build()
);

// Registering Chat Listener
this.getProxy().getPluginManager().registerListener(this, new ServerChatHandler(this));
discordBot.startChannelTopicUpdater();

this.getLogger().log(Level.INFO, "The plugin has been started.");
}

@Override
public void onDisable() {
// Plugin shutdown logic
this.getLogger().log(Level.INFO, "The plugin is shutting down.");
discordBot.sendMessageEmbed(
new EmbedBuilder()
.setTitle("⛔ Proxy disabled.")
.setColor(Color.RED)
.build()
);

discordBot.updateChannelTopic("The proxy is offline.");
}

@NotNull
public Config getConfig() {
return config;
}

@NotNull
public Bot getBot() {
return discordBot;
}

}
171 changes: 171 additions & 0 deletions src/main/java/com/plyblox/proxychat/chat/ServerChatHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
package com.plyblox.proxychat.chat;

import com.plyblox.proxychat.ProxyChat;
import com.plyblox.proxychat.utility.config.ConfigDataKey;
import net.dv8tion.jda.api.EmbedBuilder;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.connection.Server;
import net.md_5.bungee.api.event.ChatEvent;
import net.md_5.bungee.api.event.PlayerDisconnectEvent;
import net.md_5.bungee.api.event.PostLoginEvent;
import net.md_5.bungee.api.event.ServerSwitchEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
import org.jetbrains.annotations.NotNull;

import java.awt.*;
import java.util.logging.Level;

public class ServerChatHandler implements Listener {

private final ProxyChat plugin;

private final String MINECRAFT_PLAYER_HEAD_URL = "https://crafthead.net/avatar/{PLAYER_UUID}";

public ServerChatHandler(@NotNull ProxyChat plugin) {
this.plugin = plugin;
}

@EventHandler
public void onProxyChatEvent(ChatEvent event) {
if (event.isCommand() || event.isProxyCommand()) return; // Ignore if it is a command.

String minecraftConfigString = (String) this.plugin.getConfig().get(ConfigDataKey.MESSAGE_FORMAT);
String discordConfigString = (String) this.plugin.getConfig().get(ConfigDataKey.MINECRAFT_TO_DISCORD_MESSAGE);
Server currentServer = (Server) event.getReceiver();
String serverName = currentServer.getInfo().getName().toUpperCase();
ProxiedPlayer player = (ProxiedPlayer) event.getSender();
String playerName = player.getName();
String playerMessage = event.getMessage();

String minecraftMessage = minecraftConfigString
.replace("%message%", playerMessage)
.replace("%server%", serverName)
.replace("%player%", playerName);

String discordMessage = discordConfigString
.replace("%message%", playerMessage)
.replace("%server%", serverName)
.replace("%player%", playerName);

// Log to Console
plugin.getLogger().log(Level.INFO, minecraftMessage);

// Log to Discord
plugin.getBot().sendMessage(discordMessage);

// Log to Minecraft
sendToOtherServers(currentServer, minecraftMessage);
}

@EventHandler
public void onPlayerLeaveProxy(PlayerDisconnectEvent event) {
String configString = (String) this.plugin.getConfig().get(ConfigDataKey.LEAVE_FORMAT);
ProxiedPlayer player = event.getPlayer();
String playerName = player.getName();

String message = configString
.replace("%player%", playerName);

// Log to Console
plugin.getLogger().log(Level.INFO, message);

// Log to Discord
String discordConfigString = (String) this.plugin.getConfig().get(ConfigDataKey.MINECRAFT_TO_DISCORD_LEAVE);
String discordMessage = discordConfigString.replace("%player%", playerName);
plugin.getBot().sendMessageEmbed(simpleAuthorEmbedBuilder(player, discordMessage).setColor(Color.RED).build());

// Log to Minecraft
sendToAllServers(message);
}

@EventHandler
public void onPlayerJoinProxy(PostLoginEvent event) {
String configString = (String) this.plugin.getConfig().get(ConfigDataKey.JOIN_FORMAT);
ProxiedPlayer player = event.getPlayer();
String playerName = player.getName();

String message = configString
.replace("%player%", playerName);

// Log to Console
plugin.getLogger().log(Level.INFO, message);

// Log to Discord
String discordConfigString = (String) this.plugin.getConfig().get(ConfigDataKey.MINECRAFT_TO_DISCORD_JOIN);
String discordMessage = discordConfigString.replace("%player%", playerName);
plugin.getBot().sendMessageEmbed(simpleAuthorEmbedBuilder(player, discordMessage).setColor(Color.GREEN).build());

// Log to Minecraft
sendToAllServers(message);
}

@EventHandler
public void onPlayerServerSwitch(ServerSwitchEvent event) {
if (event.getFrom() == null) return; // This means the player just joined the network.

String consoleConfigString = (String) this.plugin.getConfig().get(ConfigDataKey.SWITCH_FORMAT);
String discordConfigString = (String) this.plugin.getConfig().get(ConfigDataKey.MINECRAFT_TO_DISCORD_SWITCH);
String minecraftConfigString = (String) this.plugin.getConfig().get(ConfigDataKey.SWITCH_FORMAT_NO_FROM);

ServerInfo from = event.getFrom();
ProxiedPlayer player = event.getPlayer();

String fromString = from.getName().toUpperCase();
String toString = player.getServer().getInfo().getName().toUpperCase();

String consoleMessage = consoleConfigString
.replace("%from%", fromString)
.replace("%to%", toString)
.replace("%player%", player.getName());

String discordMessage = discordConfigString
.replace("%from%", fromString)
.replace("%to%", toString)
.replace("%player%", player.getName());

String minecraftMessage = minecraftConfigString
.replace("%from%", fromString)
.replace("%to%", toString)
.replace("%player%", player.getName());

// Log to Console
plugin.getLogger().log(Level.INFO, consoleMessage);

// Log to Discord
plugin.getBot().sendMessageEmbed(simpleAuthorEmbedBuilder(player, discordMessage).setColor(Color.YELLOW).build());

// Log to Minecraft
sendToSpecificServer(minecraftMessage, event.getFrom(), event.getPlayer());
}

private EmbedBuilder simpleAuthorEmbedBuilder(@NotNull ProxiedPlayer player, @NotNull String message) {
EmbedBuilder embedBuilder = new EmbedBuilder();
embedBuilder.setAuthor(message, null, getPlayerHeadURL(player));
return embedBuilder;
}

private void sendToOtherServers(@NotNull Server currentServer, @NotNull String message) {
plugin.getProxy().getPlayers().stream()
.filter((player) -> player.getServer() != currentServer)
.forEach((player) -> player.sendMessage(ChatMessageType.CHAT, new ComponentBuilder().append(message).create()));
}

private void sendToSpecificServer(@NotNull String message, @NotNull ServerInfo server, @NotNull ProxiedPlayer blacklistedPlayer) {
server.getPlayers().stream()
.filter((player) -> player != blacklistedPlayer)
.forEach((player) -> player.sendMessage(ChatMessageType.CHAT, new ComponentBuilder().append(message).create()));
}

private void sendToAllServers(@NotNull String message) {
plugin.getProxy().broadcast(new ComponentBuilder().append(message).create());
}

private String getPlayerHeadURL(@NotNull ProxiedPlayer player) {
return MINECRAFT_PLAYER_HEAD_URL.replace("{PLAYER_UUID}", player.getUniqueId().toString());
}

}
Loading
Loading