tweaks724/src/main/java/eu/m724/tweaks/module/alert/AlertCommand.java
2025-01-24 10:05:49 +01:00

101 lines
4.4 KiB
Java

/*
* Copyright (C) 2025 Minecon724
* Tweaks724 is licensed under the GNU General Public License. See the LICENSE.md file
* in the project root for the full license text.
*/
package eu.m724.tweaks.module.alert;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.meta.BookMeta;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class AlertCommand implements CommandExecutor {
private List<String> pending;
private long when;
private final AlertModule manager;
public AlertCommand(AlertModule manager) {
this.manager = manager;
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (args.length == 0) {
sender.sendMessage("/emergencyalert manages emergency alerts");
sender.sendMessage("/emergencyalert cancel - cancels a pending or an active alert");
sender.sendMessage("/emergencyalert new <content> - creates a new alert with given text");
sender.sendMessage("/emergencyalert new - creates a new alert with contents of held book");
} else {
if (args[0].equals("CONFIRM")) {
if (pending != null) {
if (System.currentTimeMillis() - when > 15 * 1000) {
sender.sendMessage("There was a pending alert, but you took too long to confirm it, please create it again");
pending = null;
return true;
}
sender.sendMessage("Alert broadcast");
manager.start(pending.toArray(String[]::new));
pending = null;
} else {
sender.sendMessage("There is no pending alert to confirm");
}
} else if (args[0].equalsIgnoreCase("confirm")) {
sender.sendMessage("CONFIRM must be in all caps");
} else if (args[0].equalsIgnoreCase("cancel")) {
if (AlertModule.current != null) {
manager.stop();
sender.sendMessage("Cancelled alert");
} else if (pending != null) {
sender.sendMessage("Cancelled pending alert");
pending = null;
} else {
sender.sendMessage("There is no alert to cancel");
}
} else if (args[0].equalsIgnoreCase("new")) {
if (pending != null) {
sender.sendMessage("Another alert already waiting for confirmation. /emergencyalert cancel?");
return true;
}
if (args.length == 1) {
if (sender instanceof Player player) {
var is = player.getInventory().getItemInMainHand();
if (is.getType() == Material.WRITTEN_BOOK) {
player.swingMainHand();
pending = ((BookMeta) is.getItemMeta()).getPages();
sender.sendMessage("Used book content as alert text");
} else {
sender.sendMessage("You must hold a written book in your hand or pass a command argument to use as alert text");
}
} else {
sender.sendMessage("You must pass some text to alert, or be a player to use a book");
}
} else {
pending = List.of(String.join(" " , args));
sender.sendMessage("Used command argument as alert text");
}
if (pending != null) {
when = System.currentTimeMillis();
if (AlertModule.current != null) {
sender.sendMessage("Broadcasting a new alert will cancel the currently active one");
}
sender.sendMessage("Please confirm broadcast with /emergencyalert CONFIRM within 15 seconds");
}
} else {
sender.sendMessage("Unknown argument \"%s\". Run this command without any arguments to see help.".formatted(args[0]));
}
}
return true;
}
}