Skip to content

Commit

Permalink
feat(paper): add a provided sender mapper
Browse files Browse the repository at this point in the history
modern paper manager requires the use of CommandSourceStack which doesn't have built in ways to require a Player or Console sender. this adds a built-in way for common behaviour.
  • Loading branch information
broccolai committed Aug 3, 2024
1 parent 34bef65 commit b77c2f1
Show file tree
Hide file tree
Showing 8 changed files with 280 additions and 9 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
//
// MIT License
//
// Copyright (c) 2024 Incendo
//
// 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.
//
package org.incendo.cloud.paper.sender;

import io.papermc.paper.command.brigadier.CommandSourceStack;
import org.bukkit.command.ConsoleCommandSender;
import org.checkerframework.checker.nullness.qual.NonNull;

@SuppressWarnings("UnstableApiUsage")
public final class ConsoleSender extends GenericSender {

ConsoleSender(final CommandSourceStack commandSourceStack) {
super(commandSourceStack);
}

@Override
public @NonNull ConsoleCommandSender sender() {
return (ConsoleCommandSender) super.sender();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
//
// MIT License
//
// Copyright (c) 2024 Incendo
//
// 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.
//
package org.incendo.cloud.paper.sender;

import io.papermc.paper.command.brigadier.CommandSourceStack;
import org.bukkit.command.CommandSender;
import org.checkerframework.checker.nullness.qual.NonNull;

@SuppressWarnings("UnstableApiUsage")
public class GenericSender implements Sender {

private final CommandSourceStack commandSourceStack;

GenericSender(final @NonNull CommandSourceStack commandSourceStack) {
this.commandSourceStack = commandSourceStack;
}

@Override
public final @NonNull CommandSourceStack commandSourceStack() {
return this.commandSourceStack;
}

/**
* @see Sender#sender()
*/
@Override
public @NonNull CommandSender sender() {
return this.commandSourceStack.getSender();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
//
// MIT License
//
// Copyright (c) 2024 Incendo
//
// 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.
//
package org.incendo.cloud.paper.sender;

import io.papermc.paper.command.brigadier.CommandSourceStack;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.incendo.cloud.SenderMapper;

@SuppressWarnings("UnstableApiUsage")
public final class ModernProvidedSenderMapper implements SenderMapper<CommandSourceStack, Sender> {

/**
* Create a new instance of {@link ModernProvidedSenderMapper}.
*
* @return a new instance of {@link ModernProvidedSenderMapper}
*/
public static @NonNull ModernProvidedSenderMapper providedSenderMapper() {
return new ModernProvidedSenderMapper();
}

ModernProvidedSenderMapper() {
}

@Override
public @NonNull Sender map(final @NonNull CommandSourceStack base) {
CommandSender commandSender = base.getSender();

if (commandSender instanceof ConsoleCommandSender) {
return new ConsoleSender(base);
}

if (commandSender instanceof Player) {
return new PlayerSender(base);
}

return new GenericSender(base);
}

@Override
public @NonNull CommandSourceStack reverse(final @NonNull Sender mapped) {
return mapped.commandSourceStack();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
//
// MIT License
//
// Copyright (c) 2024 Incendo
//
// 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.
//
package org.incendo.cloud.paper.sender;

import io.papermc.paper.command.brigadier.CommandSourceStack;
import org.bukkit.entity.Player;
import org.checkerframework.checker.nullness.qual.NonNull;

@SuppressWarnings("UnstableApiUsage")
public final class PlayerSender extends GenericSender {

PlayerSender(final CommandSourceStack commandSourceStack) {
super(commandSourceStack);
}

@Override
public @NonNull Player sender() {
return (Player) super.sender();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
//
// MIT License
//
// Copyright (c) 2024 Incendo
//
// 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.
//
package org.incendo.cloud.paper.sender;

import io.papermc.paper.command.brigadier.CommandSourceStack;
import org.bukkit.command.CommandSender;
import org.checkerframework.checker.nullness.qual.NonNull;

@SuppressWarnings("UnstableApiUsage")
public interface Sender {

/**
* Gets the command source stack.
*
* @return the command source stack
*/
@NonNull CommandSourceStack commandSourceStack();

/**
* Gets the underlying command sender from the command source stack.
*
* @return the sender.
*/
@NonNull CommandSender sender();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/**
* Built in CommandSender mappings for Modern Paper.
*/
package org.incendo.cloud.paper.sender;
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,17 @@
//
package org.incendo.cloud.examples.paper;

import io.papermc.paper.command.brigadier.CommandSourceStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.framework.qual.DefaultQualifier;
import org.incendo.cloud.paper.PaperCommandManager;
import org.incendo.cloud.paper.sender.Sender;

@SuppressWarnings("UnstableApiUsage")
@DefaultQualifier(NonNull.class)
public final class PaperPlugin extends JavaPlugin {
private final PaperCommandManager.Bootstrapped<CommandSourceStack> commandManager;
private final PaperCommandManager.Bootstrapped<Sender> commandManager;

public PaperPlugin(final PaperCommandManager.Bootstrapped<CommandSourceStack> commandManager) {
public PaperPlugin(final PaperCommandManager.Bootstrapped<Sender> commandManager) {
this.commandManager = commandManager;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,28 +23,33 @@
//
package org.incendo.cloud.examples.paper;

import io.papermc.paper.command.brigadier.CommandSourceStack;
import io.papermc.paper.plugin.bootstrap.BootstrapContext;
import io.papermc.paper.plugin.bootstrap.PluginProviderContext;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.framework.qual.DefaultQualifier;
import org.incendo.cloud.execution.ExecutionCoordinator;
import org.incendo.cloud.paper.PaperCommandManager;
import org.incendo.cloud.paper.sender.ConsoleSender;
import org.incendo.cloud.paper.sender.ModernProvidedSenderMapper;
import org.incendo.cloud.paper.sender.PlayerSender;
import org.incendo.cloud.paper.sender.Sender;
import org.incendo.cloud.setting.ManagerSetting;

import static org.incendo.cloud.parser.standard.StringParser.stringParser;

@SuppressWarnings("UnstableApiUsage")
@DefaultQualifier(NonNull.class)
public final class PluginBootstrap implements io.papermc.paper.plugin.bootstrap.PluginBootstrap {
private PaperCommandManager.@MonotonicNonNull Bootstrapped<CommandSourceStack> commandManager;
private PaperCommandManager.@MonotonicNonNull Bootstrapped<Sender> commandManager;

@Override
public void bootstrap(final BootstrapContext context) {
final PaperCommandManager.Bootstrapped<CommandSourceStack> mgr =
PaperCommandManager.builder()
final PaperCommandManager.Bootstrapped<Sender> mgr =
PaperCommandManager.builder(ModernProvidedSenderMapper.providedSenderMapper())
.executionCoordinator(ExecutionCoordinator.simpleCoordinator())
.buildBootstrapped(context);

Expand All @@ -58,7 +63,7 @@ public void bootstrap(final BootstrapContext context) {
final String name = ctx.get("name");
mgr.command(
mgr.commandBuilder(name).handler(ctx1 -> {
ctx1.sender().getSender().sendMessage("HI");
ctx1.sender().sender().sendMessage("HI");
})
);
})
Expand All @@ -71,6 +76,22 @@ public void bootstrap(final BootstrapContext context) {
mgr.deleteRootCommand(name);
})
);
mgr.command(
mgr.commandBuilder("player_command")
.senderType(PlayerSender.class)
.handler(ctx -> {
final Player player = ctx.sender().sender();
player.sendMessage("hello player!");
})
);
mgr.command(
mgr.commandBuilder("console_command")
.senderType(ConsoleSender.class)
.handler(ctx -> {
final ConsoleCommandSender console = ctx.sender().sender();
console.sendMessage("hello console!");
})
);
}

@Override
Expand Down

0 comments on commit b77c2f1

Please sign in to comment.