Implement update notifications for Geyser

Geyser installations will now get notified when a new Bedrock release is out and Geyser must be updated. The system works similarly to ViaVersion where OPs get a notification of an update when they join. The permission node for players to see update notifications is `geyser.update` and the backing JSON that controls this can be found at https://github.com/GeyserMC/GeyserSite/blob/gh-pages/versions.json. There is also a config option to disable update checking.

This update also fixes modern Paper installations not being able to see colored text logged from Geyser in the console.
This commit is contained in:
Camotoy 2022-08-21 21:22:15 -04:00
parent a3b1cf61ad
commit 67a65c45d3
No known key found for this signature in database
GPG key ID: 7EEFB66FE798081F
26 changed files with 558 additions and 34 deletions

View file

@ -24,6 +24,12 @@
<version>a7c6ede</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-text-serializer-bungeecord</artifactId>
<version>${adventure-platform.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<finalName>${outputName}-BungeeCord</finalName>

View file

@ -149,6 +149,8 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap {
}
this.getProxy().getPluginManager().registerCommand(this, new GeyserBungeeCommandExecutor(geyser));
this.getProxy().getPluginManager().registerListener(this, new GeyserBungeeUpdateListener());
}
@Override

View file

@ -0,0 +1,48 @@
/*
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.platform.bungeecord;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.PostLoginEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
import org.geysermc.geyser.Constants;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.platform.bungeecord.command.BungeeCommandSender;
import org.geysermc.geyser.util.VersionCheckUtils;
public final class GeyserBungeeUpdateListener implements Listener {
@EventHandler
public void onPlayerJoin(final PostLoginEvent event) {
if (GeyserImpl.getInstance().getConfig().isNotifyOnNewBedrockUpdate()) {
final ProxiedPlayer player = event.getPlayer();
if (player.hasPermission(Constants.UPDATE_PERMISSION)) {
VersionCheckUtils.checkForGeyserUpdate(() -> new BungeeCommandSender(player));
}
}
}
}

View file

@ -25,11 +25,15 @@
package org.geysermc.geyser.platform.bungeecord.command;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import org.geysermc.geyser.command.CommandSender;
import org.geysermc.geyser.text.GeyserLocale;
import java.util.Locale;
public class BungeeCommandSender implements CommandSender {
private final net.md_5.bungee.api.CommandSender handle;
@ -50,6 +54,18 @@ public class BungeeCommandSender implements CommandSender {
handle.sendMessage(TextComponent.fromLegacyText(message));
}
private static final int PROTOCOL_HEX_COLOR = 713; // Added 20w17a
@Override
public void sendMessage(Component message) {
if (handle instanceof ProxiedPlayer player && player.getPendingConnection().getVersion() >= PROTOCOL_HEX_COLOR) {
// Include hex colors
handle.sendMessage(BungeeComponentSerializer.get().serialize(message));
return;
}
handle.sendMessage(BungeeComponentSerializer.legacy().serialize(message));
}
@Override
public boolean isConsole() {
return !(handle instanceof ProxiedPlayer);
@ -58,8 +74,11 @@ public class BungeeCommandSender implements CommandSender {
@Override
public String getLocale() {
if (handle instanceof ProxiedPlayer player) {
String locale = player.getLocale().getLanguage() + "_" + player.getLocale().getCountry();
return GeyserLocale.formatLocale(locale);
Locale locale = player.getLocale();
if (locale != null) {
// Locale can be null early on in the conneciton
return GeyserLocale.formatLocale(locale.getLanguage() + "_" + locale.getCountry());
}
}
return GeyserLocale.getDefaultLocale();
}