diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/security/antiGrief/AntiGrief.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/security/antiGrief/AntiGrief.java new file mode 100644 index 0000000..5995eb6 --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/security/antiGrief/AntiGrief.java @@ -0,0 +1,33 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.security.antiGrief; + +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import eu.mhsl.craftattack.spawn.craftattack.appliances.security.antiGrief.player.PlayerGriefListener; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.util.*; + +public class AntiGrief extends Appliance { + public record GriefIncident(Location location, @Nullable Block block) { + public static final Long timestamp = System.currentTimeMillis(); + } + private final Map> griefRegistry = new HashMap<>(); + + public void addTracking(Player player, GriefIncident incident) { + this.griefRegistry.computeIfAbsent(player.getUniqueId(), uuid -> new ArrayList<>()); + this.griefRegistry.get(player.getUniqueId()).add(incident); + } + + public Map> getGriefRegistry() { + return this.griefRegistry; + } + + @Override + protected @NotNull List listeners() { + return List.of(new PlayerGriefListener()); + } +} diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/security/antiGrief/commands/GriefOverviewCommand.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/security/antiGrief/commands/GriefOverviewCommand.java new file mode 100644 index 0000000..d803910 --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/security/antiGrief/commands/GriefOverviewCommand.java @@ -0,0 +1,39 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.security.antiGrief.commands; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.craftattack.appliances.security.antiGrief.AntiGrief; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentBuilder; +import net.kyori.adventure.text.ScopedComponent; +import net.kyori.adventure.text.TextComponent; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class GriefOverviewCommand extends ApplianceCommand { + public GriefOverviewCommand() { + super("griefOverview"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) throws Exception { + sender.sendMessage( + this.getAppliance().getGriefRegistry().entrySet().stream() + .map(griefEntry -> { + List entries = griefEntry.getValue().stream() + .map(incident -> Component.text(incident.location().toString())) + .toList(); + ComponentBuilder builder = Component.text() + .append(Component.text(griefEntry.getKey().toString())) + .append(Component.text(": ")); + entries.forEach(builder::append); + + return builder.build(); + }) + .reduce(ScopedComponent::append) + .orElseThrow() + ); + } +} diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/security/antiGrief/player/PlayerGriefListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/security/antiGrief/player/PlayerGriefListener.java new file mode 100644 index 0000000..8382637 --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/security/antiGrief/player/PlayerGriefListener.java @@ -0,0 +1,20 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.security.antiGrief.player; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.craftattack.appliances.security.antiGrief.AntiGrief; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.BlockIgniteEvent; +import org.bukkit.event.entity.ExplosionPrimeEvent; + +public class PlayerGriefListener extends ApplianceListener { + @EventHandler + public void onIgnite(BlockIgniteEvent event) { + if(event.getPlayer() == null) return; + this.getAppliance().addTracking(event.getPlayer(), new AntiGrief.GriefIncident(event.getBlock().getLocation(), event.getBlock())); + } + + @EventHandler + public void onTnt(ExplosionPrimeEvent event) { + + } +}