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

Added ProxyDefineCommandsEvent #3642

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package net.md_5.bungee.api.event;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import net.md_5.bungee.api.connection.Connection;
import net.md_5.bungee.api.plugin.Command;

/**
* Called when the proxy intercepts the Commands packet, allowing plugins to
* hide commands that clients have permission for without disabling them.
*/
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class ProxyDefineCommandsEvent extends TargetedEvent
{
/**
* The commands to send to the player
*/
private final Map<String, Command> commands;

public ProxyDefineCommandsEvent(Connection sender, Connection receiver, Collection<Map.Entry<String, Command>> commands)
{
super( sender, receiver );
this.commands = new HashMap<>( commands.size() );
for ( Map.Entry<String, Command> command : commands )
{
this.commands.put( command.getKey(), command.getValue() );
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.io.DataInput;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;
Expand All @@ -36,6 +37,7 @@
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.connection.Server;
import net.md_5.bungee.api.event.PluginMessageEvent;
import net.md_5.bungee.api.event.ProxyDefineCommandsEvent;
import net.md_5.bungee.api.event.ServerConnectEvent;
import net.md_5.bungee.api.event.ServerDisconnectEvent;
import net.md_5.bungee.api.event.ServerKickEvent;
Expand Down Expand Up @@ -743,13 +745,32 @@ public void handle(Respawn respawn)
@Override
public void handle(Commands commands) throws Exception
{
final Collection<Map.Entry<String, Command>> unmodifiedCommandMap = bungee.getPluginManager().getCommands();
final ProxyDefineCommandsEvent event = new ProxyDefineCommandsEvent( server, con, unmodifiedCommandMap );
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think there is a design question about whether the event includes all commands or just bungee commands. Including all commands would give more flexibility (like the Spigot event https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/player/PlayerCommandSendEvent.html)

Copy link
Author

@brickmonster brickmonster Apr 13, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahh you're right, I forgot that it only has the bungee commands. The other two places that you left comments are because of that.

Supporting non-bungee commands doesn't add extra features if they can edit downstream commands on the downstream, but it would be convenient to have it in one place.

As it stands the event handler gets complete information with the Command type. To support non-bungee commands we would have do one of the following:

  1. Limit the information they get to support both sources (maybe even just a key).
  2. Create a new union type of bungee (Command) and non-bungee (brigadier node or a new type).
  3. Add a second collection to the event containing only the brigadier node or a new type.

I don't like any of those options just to get plugin convenience so, unless you can think of another or you disagree, I'm in favour of committing as is but with the removal of the additional assignments of modified.

bungee.getPluginManager().callEvent( event );

boolean modified = false;

for ( Map.Entry<String, Command> command : bungee.getPluginManager().getCommands() )
// If an event handler REMOVED OR CHANGED a command then set modified.
for ( Map.Entry<String, Command> unmodifiedCommand : unmodifiedCommandMap )
{
if ( event.getCommands().get( unmodifiedCommand.getKey() ) != unmodifiedCommand.getValue() )
brickmonster marked this conversation as resolved.
Show resolved Hide resolved
{
modified = true;
}
}

for ( Map.Entry<String, Command> command : event.getCommands().entrySet() )
{
// If an event handler ADDED a command then set modified.
if ( unmodifiedCommandMap.stream().noneMatch( entry -> entry.getKey().equals( command.getKey() ) ) )
brickmonster marked this conversation as resolved.
Show resolved Hide resolved
{
modified = true;
}

if ( !bungee.getDisabledCommands().contains( command.getKey() ) && commands.getRoot().getChild( command.getKey() ) == null && command.getValue().hasPermission( con ) )
{
CommandNode dummy = LiteralArgumentBuilder.literal( command.getKey() ).executes( DUMMY_COMMAND )
CommandNode<?> dummy = LiteralArgumentBuilder.literal( command.getKey() ).executes( DUMMY_COMMAND )
.then( RequiredArgumentBuilder.argument( "args", StringArgumentType.greedyString() )
.suggests( Commands.SuggestionRegistry.ASK_SERVER ).executes( DUMMY_COMMAND ) )
.build();
Expand Down