Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
20 changes: 18 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ jobs:
run: ./gradlew build -PVERSION="${{ env.VERSION }}"

- name: Archive artifacts
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: geyser-voice-artifact
path: build/libs/
Expand All @@ -52,7 +52,7 @@ jobs:
uses: actions/checkout@v2

- name: Download artifacts
uses: actions/download-artifact@v3
uses: actions/download-artifact@v4
with:
name: geyser-voice-artifact
path: build/libs/
Expand All @@ -78,3 +78,19 @@ jobs:
build/libs/GeyserVoice-*.jar
env:
GITHUB_REPOSITORY: AvionBlock/GeyserVoice

- name: Create Modrinth release
if: github.event.inputs.status == 'stable'
uses: dsx137/modrinth-release-action@main
env:
MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }}
with:
name: GeyserVoice ${{ github.event.inputs.tag }}
project_id: WtPu56Wa
loaders: paper, spigot, bukkit, purpur, velocity, bungeecord
game_versions: 1.20.2:1.21.4
version_number: ${{ github.event.inputs.tag }}
featured: github.event.inputs.status == 'stable'
version_type: ${{ github.event.inputs.status == 'stable' && 'release' || 'beta' }}
files: |
./build/libs/GeyserVoice-*.jar
160 changes: 148 additions & 12 deletions src/main/java/io/greitan/avion/bungeecord/GeyserVoice.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import net.md_5.bungee.config.ConfigurationProvider;
import net.md_5.bungee.config.Configuration;
import net.md_5.bungee.config.YamlConfiguration;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.connection.ProxiedPlayer;

import com.fasterxml.jackson.databind.ObjectMapper;
Expand Down Expand Up @@ -97,7 +99,8 @@ public void reload() {
port = getConfig().getInt("config.port");
serverKey = getConfig().getString("config.server-key");

isConnected = connect(true);
if (getConfig().getBoolean("config.auto-reconnect"))
isConnected = reconnect(true);

int positionTaskInterval = getConfig().getInt("config.voice.position-task-interval", 1);
taskRunner.cancel();
Expand All @@ -112,26 +115,52 @@ public void reload() {
updateSettings(proximityDistance, proximityToggle, voiceEffects);
}

/**
* Connects to a new server.
*
* @param host The host to connect to.
* @param port The port to connect to.
* @param serverKey The server key.
* @return True if connected successfully, otherwise false.
*/
public Boolean connect(String host, int port, String serverKey) {
if (Objects.nonNull(host) && Objects.nonNull(serverKey)) {
getConfig().set("config.host", host);
getConfig().set("config.port", port);
getConfig().set("config.server-key", serverKey);
saveConfig();
reloadConfig();
reload();

return isConnected;
} else {
Logger.warn(Language.getMessage(lang, "plugin-connect-invalid-data"));
return false;
}
}

/**
* Connects to the server.
*
* @param force Indicates whether to force a connection.
* @return True if connected successfully, otherwise false.
*/
public Boolean connect(Boolean force) {
public Boolean reconnect(Boolean force) {
if (isConnected && !force)
return true;
isConnected = false;
if (isConnected) {
disconnect("Reconnecting to another server.");
}

if (Objects.nonNull(host) && Objects.nonNull(serverKey)) {
String link = "http://" + host + ":" + port;
String Token = network.sendLoginRequest(link, serverKey);
if (Objects.nonNull(Token)) {
Logger.info(Language.getMessage(lang, "plugin-connect-connect"));
Logger.info(Language.getMessage(lang, "plugin-connect-connected"));
isConnected = true;
token = Token;
} else {
Logger.warn(Language.getMessage(lang, "plugin-connect-disconnect"));
Logger.warn(Language.getMessage(lang, "plugin-connect-failed"));
}
return isConnected;
} else {
Expand All @@ -140,6 +169,39 @@ public Boolean connect(Boolean force) {
}
}

/**
* Disconnects from the server.
*
* @param reason The reason why we disconnected
*/
public void disconnect(String reason) {
if (!isConnected)
return;

if (Objects.nonNull(host) && Objects.nonNull(serverKey)) {
String link = "http://" + host + ":" + port;
network.sendLogoutRequest(link, token);
isConnected = false;

String disconnectMessage = Language.getMessage(lang, "plugin-connection-disconnect").replace("$reason", reason);
Logger.info(disconnectMessage);

boolean sendVoipDisconnectMessage = getConfig().getBoolean("config.voice.send-voip-disconnect-message");
if (sendVoipDisconnectMessage) {
getProxy().broadcast(new ComponentBuilder(disconnectMessage).color(ChatColor.YELLOW).create());
}
} else {
Logger.warn(Language.getMessage(lang, "plugin-connect-invalid-data"));
}
}

/**
* Disconnects from the server.
*/
public void disconnect() {
disconnect("N.A.");
}

/**
* Binds a player to the voice chat server.
*
Expand All @@ -150,6 +212,11 @@ public Boolean connect(Boolean force) {
public Boolean bind(int playerKey, ProxiedPlayer player, int tries) {
if (!isConnected || Objects.isNull(host) || Objects.isNull(serverKey))
return false;

if (playerBinds.containsKey(player.getName()) && playerBinds.get(player.getName())) {
return true;
}

String link = "http://" + host + ":" + port;

getConfig().set("config.players." + player.getName(), playerKey);
Expand All @@ -162,13 +229,28 @@ public Boolean bind(int playerKey, ProxiedPlayer player, int tries) {
if (result == "SUCCESS") {
playerBinds.put(player.getName(), true);
messageHandler.sendPlayerBindSync(player);
return true;
} else {
if (result == "Invalid Token!" && tries == 0) {
Logger.info("Invalid Token detected, reconnecting...");
isConnected = connect(true);
return bind(playerKey, player, 1);

Logger.info(Language.getMessage(lang, "player-binded").replace("$player",player.getName()));

boolean sendBindedMessage = getConfig().getBoolean("config.voice.send-binded-message");
if (sendBindedMessage) {
getProxy().broadcast(
new ComponentBuilder(player.getName()).bold(true)
.append(
new ComponentBuilder(
Language.getMessage(lang, "player-binded")
.replace("$player", "")
)
.color(ChatColor.DARK_GREEN)
.create()
).create()
);
}
return true;
} else if (result == "Invalid Token!" && tries == 0) {
Logger.info("Invalid Token detected, reconnecting...");
isConnected = reconnect(true);
return bind(playerKey, player, 1);
}
}
messageHandler.sendPlayerBindSync(player);
Expand All @@ -179,6 +261,60 @@ public Boolean bind(int playerKey, ProxiedPlayer player) {
return bind(playerKey, player, 0);
}

/**
* Bind a fake player
* @param bindKey
* @param name
* @return
*/
public Boolean bindFake(int playerKey, String name, int tries) {
if (!isConnected || Objects.isNull(host) || Objects.isNull(serverKey))
return false;

if (playerBinds.containsKey(name) && playerBinds.get(name)) {
return true;
}

String link = "http://" + host + ":" + port;

String result = network.sendBindRequest(link, token, playerKey, String.format("%0", playerKey), name);
playerBinds.put(name, false);
if (result != null) {
if (result == "SUCCESS") {
playerBinds.put(name, true);
// messageHandler.sendPlayerBindSync(player);

Logger.info(Language.getMessage(lang, "player-binded").replace("$player", name));

boolean sendBindedMessage = getConfig().getBoolean("config.voice.send-binded-message");
if (sendBindedMessage) {
getProxy().broadcast(
new ComponentBuilder(name).bold(true)
.append(
new ComponentBuilder(
Language.getMessage(lang, "player-binded")
.replace("$player", "")
)
.color(ChatColor.DARK_GREEN)
.create()
).create()
);
}
return true;
} else if (result == "Invalid Token!" && tries == 0) {
Logger.info("Invalid Token detected, reconnecting...");
isConnected = reconnect(true);
return bindFake(playerKey, name, 1);
}
}
// messageHandler.sendPlayerBindSync(player);
return false;
}

public Boolean bindFake(int playerKey, String name) {
return bindFake(playerKey, name, 0);
}

/**
* Disconnects a player from the voice chat server.
*
Expand All @@ -198,7 +334,7 @@ public Boolean disconnectPlayer(ProxiedPlayer player, int tries) {
return true;
} else if (result == "Invalid Token!" && tries == 0) {
Logger.info("Invalid Token detected, reconnecting...");
isConnected = connect(true);
isConnected = reconnect(true);
return disconnectPlayer(player, 1);
}
}
Expand Down
Loading