Files
fabric-carpet/src/main/java/carpet/commands/LogCommand.java
T
2020-10-01 14:14:01 -03:00

216 lines
8.6 KiB
Java

package carpet.commands;
import carpet.CarpetSettings;
import carpet.logging.Logger;
import carpet.logging.LoggerRegistry;
import carpet.settings.SettingsManager;
import carpet.utils.Messenger;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.server.command.CommandManager;
import net.minecraft.entity.player.PlayerEntity;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.mojang.brigadier.arguments.StringArgumentType.getString;
import static net.minecraft.command.CommandSource.suggestMatching;
public class LogCommand
{
public static void register(CommandDispatcher<ServerCommandSource> dispatcher)
{
LiteralArgumentBuilder<ServerCommandSource> literalargumentbuilder = CommandManager.literal("log").
requires((player) -> SettingsManager.canUseCommand(player, CarpetSettings.commandLog)).
executes((context) -> listLogs(context.getSource())).
then(CommandManager.literal("clear").
executes( (c) -> unsubFromAll(c.getSource(), c.getSource().getName())).
then(CommandManager.argument("player", StringArgumentType.word()).
suggests( (c, b)-> suggestMatching(c.getSource().getPlayerNames(),b)).
executes( (c) -> unsubFromAll(c.getSource(), getString(c, "player")))));
literalargumentbuilder.then(CommandManager.argument("log name",StringArgumentType.word()).
suggests( (c, b)-> suggestMatching(LoggerRegistry.getLoggerNames(),b)).
executes( (c)-> toggleSubscription(c.getSource(), c.getSource().getName(), getString(c, "log name"))).
then(CommandManager.literal("clear").
executes( (c) -> unsubFromLogger(
c.getSource(),
c.getSource().getName(),
getString(c, "log name")))).
then(CommandManager.argument("option", StringArgumentType.greedyString()).
suggests( (c, b) -> suggestMatching(
(LoggerRegistry.getLogger(getString(c, "log name"))==null
?new String[]{}
:LoggerRegistry.getLogger(getString(c, "log name")).getOptions()),
b)).
executes( (c) -> subscribePlayer(
c.getSource(),
c.getSource().getName(),
getString(c, "log name"),
getString(c, "option"))).
then(CommandManager.argument("player", StringArgumentType.word()).
suggests( (c, b) -> suggestMatching(c.getSource().getPlayerNames(),b)).
executes( (c) -> subscribePlayer(
c.getSource(),
getString(c, "player"),
getString(c, "log name"),
getString(c, "option"))))));
dispatcher.register(literalargumentbuilder);
}
private static int listLogs(ServerCommandSource source)
{
PlayerEntity player;
try
{
player = source.getPlayer();
}
catch (CommandSyntaxException e)
{
Messenger.m(source, "For players only");
return 0;
}
Map<String,String> subs = LoggerRegistry.getPlayerSubscriptions(source.getName());
if (subs == null)
{
subs = new HashMap<>();
}
List<String> all_logs = new ArrayList<>(LoggerRegistry.getLoggerNames());
Collections.sort(all_logs);
Messenger.m(player, "w _____________________");
Messenger.m(player, "w Available logging options:");
for (String lname: all_logs)
{
List<Object> comp = new ArrayList<>();
String color = subs.containsKey(lname)?"w":"g";
comp.add("w - "+lname+": ");
Logger logger = LoggerRegistry.getLogger(lname);
String [] options = logger.getOptions();
if (options.length == 0)
{
if (subs.containsKey(lname))
{
comp.add("l Subscribed ");
}
else
{
comp.add(color + " [Subscribe] ");
comp.add("^w subscribe to " + lname);
comp.add("!/log " + lname);
}
}
else
{
for (String option : logger.getOptions())
{
if (subs.containsKey(lname) && subs.get(lname).equalsIgnoreCase(option))
{
comp.add("l [" + option + "] ");
} else
{
comp.add(color + " [" + option + "] ");
comp.add("^w subscribe to " + lname + " " + option);
comp.add("!/log " + lname + " " + option);
}
}
}
if (subs.containsKey(lname))
{
comp.add("nb [X]");
comp.add("^w Click to unsubscribe");
comp.add("!/log "+lname);
}
Messenger.m(player,comp.toArray(new Object[0]));
}
return 1;
}
private static int unsubFromAll(ServerCommandSource source, String player_name)
{
PlayerEntity player = source.getMinecraftServer().getPlayerManager().getPlayer(player_name);
if (player == null)
{
Messenger.m(source, "r No player specified");
return 0;
}
for (String logname : LoggerRegistry.getLoggerNames())
{
LoggerRegistry.unsubscribePlayer(player_name, logname);
}
Messenger.m(source, "gi Unsubscribed from all logs");
return 1;
}
private static int unsubFromLogger(ServerCommandSource source, String player_name, String logname)
{
PlayerEntity player = source.getMinecraftServer().getPlayerManager().getPlayer(player_name);
if (player == null)
{
Messenger.m(source, "r No player specified");
return 0;
}
if (LoggerRegistry.getLogger(logname) == null)
{
Messenger.m(source, "r Unknown logger: ","rb "+logname);
return 0;
}
LoggerRegistry.unsubscribePlayer(player_name, logname);
Messenger.m(source, "gi Unsubscribed from "+logname);
return 1;
}
private static int toggleSubscription(ServerCommandSource source, String player_name, String logName)
{
PlayerEntity player = source.getMinecraftServer().getPlayerManager().getPlayer(player_name);
if (player == null)
{
Messenger.m(source, "r No player specified");
return 0;
}
if (LoggerRegistry.getLogger(logName) == null)
{
Messenger.m(source, "r Unknown logger: ","rb "+logName);
return 0;
}
boolean subscribed = LoggerRegistry.togglePlayerSubscription(player_name, logName);
if (subscribed)
{
Messenger.m(source, "gi "+player_name+" subscribed to " + logName + ".");
}
else
{
Messenger.m(source, "gi "+player_name+" unsubscribed from " + logName + ".");
}
return 1;
}
private static int subscribePlayer(ServerCommandSource source, String player_name, String logname, String option)
{
PlayerEntity player = source.getMinecraftServer().getPlayerManager().getPlayer(player_name);
if (player == null)
{
Messenger.m(source, "r No player specified");
return 0;
}
if (LoggerRegistry.getLogger(logname) == null)
{
Messenger.m(source, "r Unknown logger: ","rb "+logname);
return 0;
}
LoggerRegistry.subscribePlayer(player_name, logname, option);
if (option!=null)
{
Messenger.m(source, "gi Subscribed to " + logname + "(" + option + ")");
}
else
{
Messenger.m(source, "gi Subscribed to " + logname);
}
return 1;
}
}