mirror of
https://github.com/AtlasMediaGroup/TotalFreedomMod.git
synced 2025-07-01 12:36:41 +00:00
Compare commits
67 Commits
RELEASE-20
...
dependabot
Author | SHA1 | Date | |
---|---|---|---|
ff47adf987 | |||
1615ab416c | |||
ed7f8b4b8e | |||
9149b279a7 | |||
243cba689f | |||
1364b551d8 | |||
8fee6c7f14 | |||
0559e99fb1 | |||
1251276451 | |||
9e584069e6 | |||
11c24cff68 | |||
476c87ceb0 | |||
9bef4581aa | |||
794a25ba16 | |||
b4dd35c4df | |||
ec19b6d398 | |||
b2c636f919 | |||
8876076a9d | |||
80f19f0349 | |||
011535cf16 | |||
eb99dcd3a3 | |||
597a464623 | |||
08c8393abc | |||
ac704614c0 | |||
04029eb144 | |||
00e5403491 | |||
08115470b0 | |||
6e140ace7d | |||
9ce4dc6f3a | |||
f67db2286d | |||
07b3553748 | |||
bbbccc2b10 | |||
d471490a94 | |||
8f6d276bb6 | |||
b5178e6761 | |||
e11d72b54b | |||
ee594e7c63 | |||
41cf62c8c0 | |||
268b71f8a3 | |||
a84a47980a | |||
3a502713ea | |||
5dc5e5dcc5 | |||
171daf25a4 | |||
2fa7b6855b | |||
7faf719555 | |||
3bcf0f5082 | |||
c5f24b46d5 | |||
3016c57e3e | |||
00351f1163 | |||
40d22fa2e3 | |||
41923b29d7 | |||
0e7a2d9bce | |||
dcebf7bbe7 | |||
d30e335f57 | |||
cca95dc3f1 | |||
42b68011ea | |||
87d7ba19de | |||
16c00e3ed6 | |||
79e7f6904b | |||
1c096b97e3 | |||
cc48f93556 | |||
dd373fc9aa | |||
41331e719d | |||
72c83ba84a | |||
3deaaafb88 | |||
520bd97176 | |||
654f5900ba |
2
.github/workflows/codacy-analysis.yml
vendored
2
.github/workflows/codacy-analysis.yml
vendored
@ -25,7 +25,7 @@ jobs:
|
||||
|
||||
# Execute Codacy Analysis CLI and generate a SARIF output with the security issues identified during the analysis
|
||||
- name: Run Codacy Analysis CLI
|
||||
uses: codacy/codacy-analysis-cli-action@v4.2.0
|
||||
uses: codacy/codacy-analysis-cli-action@v4
|
||||
with:
|
||||
# Check https://github.com/codacy/codacy-analysis-cli#project-token to get your project token from your Codacy repository
|
||||
# You can also omit the token and run the tools that support default configurations
|
||||
|
2
.github/workflows/codeql-analysis.yml
vendored
2
.github/workflows/codeql-analysis.yml
vendored
@ -38,7 +38,7 @@ jobs:
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Java JDK
|
||||
uses: actions/setup-java@v3.9.0
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
# The Java version to make available on the path. Takes a whole or semver Java version, or 1.x syntax (e.g. 1.8 => Java 8.x). Early access versions can be specified in the form of e.g. 14-ea, 14.0.0-ea, or 14.0.0-ea.28
|
||||
java-version: 17
|
||||
|
2
.github/workflows/java17-maven.yml
vendored
2
.github/workflows/java17-maven.yml
vendored
@ -13,7 +13,7 @@ jobs:
|
||||
|
||||
# Java 16 Builds
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3.9.0
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: 17
|
||||
distribution: 'adopt'
|
||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -39,3 +39,6 @@ manifest.mf
|
||||
ehthumbs.db
|
||||
Thumbs.db
|
||||
.idea/inspectionProfiles/Project_Default.xml
|
||||
|
||||
# Common working directory
|
||||
run/
|
48
pom.xml
48
pom.xml
@ -5,7 +5,7 @@
|
||||
|
||||
<groupId>me.totalfreedom</groupId>
|
||||
<artifactId>TotalFreedomMod</artifactId>
|
||||
<version>2022.06</version>
|
||||
<version>2022.06.1</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
@ -65,11 +65,6 @@
|
||||
<url>https://maven.elmakers.com/repository/</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>sk89q-snapshots</id>
|
||||
<url>https://maven.sk89q.com/artifactory/repo</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>dv8tion</id>
|
||||
<name>m2-dv8tion</name>
|
||||
@ -91,11 +86,6 @@
|
||||
<url>https://repo.dmulloy2.net/nexus/repository/public/</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>sk89q-repo</id>
|
||||
<url>https://maven.sk89q.com/repo/</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>esentialsx-repo</id>
|
||||
<url>https://repo.essentialsx.net/releases/</url>
|
||||
@ -108,28 +98,28 @@
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>2.11.0</version>
|
||||
<version>2.13.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>3.12.0</version>
|
||||
<version>3.13.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.bstats</groupId>
|
||||
<artifactId>bstats-bukkit</artifactId>
|
||||
<version>3.0.0</version>
|
||||
<version>3.0.2</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>me.totalfreedom.scissors</groupId>
|
||||
<artifactId>scissors-api</artifactId>
|
||||
<version>1.17.1-R0.1-SNAPSHOT</version>
|
||||
<artifactId>Scissors-API</artifactId>
|
||||
<version>1.19.4-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
@ -150,35 +140,35 @@
|
||||
<dependency>
|
||||
<groupId>com.sk89q.worldedit</groupId>
|
||||
<artifactId>worldedit-bukkit</artifactId>
|
||||
<version>7.2.12</version>
|
||||
<version>7.2.15</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.dv8tion</groupId>
|
||||
<artifactId>JDA</artifactId>
|
||||
<version>4.4.0_352</version>
|
||||
<version>4.4.1_353</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.coreprotect</groupId>
|
||||
<artifactId>coreprotect</artifactId>
|
||||
<version>21.2</version>
|
||||
<version>21.3</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.sk89q.worldguard</groupId>
|
||||
<artifactId>worldguard-bukkit</artifactId>
|
||||
<version>7.0.7</version>
|
||||
<version>7.0.8</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.papermc</groupId>
|
||||
<artifactId>paperlib</artifactId>
|
||||
<version>1.0.7</version>
|
||||
<version>1.0.8</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
@ -192,7 +182,7 @@
|
||||
<dependency>
|
||||
<groupId>net.essentialsx</groupId>
|
||||
<artifactId>EssentialsX</artifactId>
|
||||
<version>2.19.6</version>
|
||||
<version>2.20.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
@ -213,21 +203,21 @@
|
||||
<dependency>
|
||||
<groupId>org.jetbrains</groupId>
|
||||
<artifactId>annotations</artifactId>
|
||||
<version>23.0.0</version>
|
||||
<version>24.0.1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||
<version>3.1.2</version>
|
||||
<version>3.3.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter</artifactId>
|
||||
<version>5.9.0</version>
|
||||
<version>5.10.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
@ -259,7 +249,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.10.1</version>
|
||||
<version>3.11.0</version>
|
||||
<configuration>
|
||||
<outputFileName>TotalFreedomMod.jar</outputFileName>
|
||||
<compilerVersion>17</compilerVersion>
|
||||
@ -343,7 +333,7 @@
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>properties-maven-plugin</artifactId>
|
||||
<version>1.1.0</version>
|
||||
<version>1.2.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>initialize</phase>
|
||||
@ -363,7 +353,7 @@
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>buildnumber-maven-plugin</artifactId>
|
||||
<version>3.0.0</version>
|
||||
<version>3.2.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>generate-resources</phase>
|
||||
@ -388,7 +378,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.3.0</version>
|
||||
<version>3.4.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
|
@ -46,8 +46,13 @@ public class ChatManager extends FreedomService
|
||||
private void handleChatEvent(AsyncPlayerChatEvent event)
|
||||
{
|
||||
final Player player = event.getPlayer();
|
||||
String message = event.getMessage().trim();
|
||||
|
||||
String originalMessage = event.getMessage();
|
||||
if (plugin.mu.onPlayerChat(player) || plugin.sh.handlePlayerChat(player, originalMessage))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
String message = originalMessage.trim();
|
||||
// Format colors and strip &k
|
||||
message = FUtil.colorize(message);
|
||||
message = message.replaceAll(ChatColor.MAGIC.toString(), "&k");
|
||||
@ -82,6 +87,8 @@ public class ChatManager extends FreedomService
|
||||
return;
|
||||
}
|
||||
|
||||
plugin.dc.onPlayerChat(player, ChatColor.stripColor(message));
|
||||
|
||||
// Check for 4chan trigger
|
||||
if (ConfigEntry.FOURCHAN_ENABLED.getBoolean())
|
||||
{
|
||||
|
@ -1,7 +1,7 @@
|
||||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.event.ClickEvent;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
@ -23,7 +23,7 @@ public class CommandSpy extends FreedomService
|
||||
{
|
||||
server.getOnlinePlayers().stream().filter(player -> plugin.al.isAdmin(player)
|
||||
&& plugin.al.getAdmin(player).getCommandSpy() && player != event.getPlayer()).forEach(player ->
|
||||
player.sendMessage(Component.text(event.getPlayer().getName()).append(Component.text(": "))
|
||||
.append(Component.text(event.getMessage()))));
|
||||
player.sendMessage(Component.text(event.getPlayer().getName(), NamedTextColor.GRAY).append(Component.text(": ", NamedTextColor.GRAY))
|
||||
.append(Component.text(event.getMessage(), NamedTextColor.GRAY))));
|
||||
}
|
||||
}
|
@ -1,25 +1,17 @@
|
||||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import com.google.common.collect.Multimap;
|
||||
import io.papermc.lib.PaperLib;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import org.bukkit.ChatColor;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.attribute.Attribute;
|
||||
import org.bukkit.attribute.AttributeModifier;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.PlayerItemHeldEvent;
|
||||
import org.bukkit.event.player.PlayerLoginEvent;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.spigotmc.event.player.PlayerSpawnLocationEvent;
|
||||
|
||||
public class MovementValidator extends FreedomService
|
||||
{
|
||||
@ -41,67 +33,36 @@ public class MovementValidator extends FreedomService
|
||||
public void onPlayerTeleport(PlayerTeleportEvent event)
|
||||
{
|
||||
// Check absolute value to account for negatives
|
||||
if (Math.abs(Objects.requireNonNull(event.getTo()).getX()) >= MAX_XYZ_COORD || Math.abs(event.getTo().getZ()) >= MAX_XYZ_COORD || Math.abs(event.getTo().getY()) >= MAX_XYZ_COORD)
|
||||
if (isOutOfBounds(event.getTo()))
|
||||
{
|
||||
event.setCancelled(true); // illegal position, cancel it
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isOutOfBounds(final Location position)
|
||||
{
|
||||
return Math.abs(position.getX()) >= MAX_XYZ_COORD || Math.abs(position.getY()) >= MAX_XYZ_COORD || Math.abs(position.getZ()) >= MAX_XYZ_COORD;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onPlayerMove(PlayerMoveEvent event)
|
||||
{
|
||||
final Player player = event.getPlayer();
|
||||
Location from = event.getFrom();
|
||||
Location to = event.getTo();
|
||||
assert to != null;
|
||||
if (to.getX() >= from.getX() + MAX_DISTANCE_TRAVELED || to.getY() >= from.getY() + MAX_DISTANCE_TRAVELED || to.getZ() >= from.getZ() + MAX_DISTANCE_TRAVELED)
|
||||
double distance = from.distanceSquared(to);
|
||||
|
||||
if (distance >= MAX_DISTANCE_TRAVELED)
|
||||
{
|
||||
event.setCancelled(true);
|
||||
player.kickPlayer(ChatColor.RED + "You were moving too quickly!");
|
||||
player.kick(Component.text("You were moving too quickly!", NamedTextColor.RED));
|
||||
}
|
||||
// Check absolute value to account for negatives
|
||||
if (Math.abs(event.getTo().getX()) >= MAX_XYZ_COORD || Math.abs(event.getTo().getZ()) >= MAX_XYZ_COORD || Math.abs(event.getTo().getY()) >= MAX_XYZ_COORD)
|
||||
if (isOutOfBounds(event.getTo()))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
PaperLib.teleportAsync(player, player.getWorld().getSpawnLocation());
|
||||
}
|
||||
|
||||
if (exploitItem(event.getPlayer().getInventory().getHelmet()))
|
||||
{
|
||||
event.getPlayer().getInventory().setHelmet(new ItemStack(Material.AIR));
|
||||
event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your helmet slot.");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
if (exploitItem(event.getPlayer().getInventory().getBoots()))
|
||||
{
|
||||
event.getPlayer().getInventory().setBoots(new ItemStack(Material.AIR));
|
||||
event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your boots slot.");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
if (exploitItem(event.getPlayer().getInventory().getLeggings()))
|
||||
{
|
||||
event.getPlayer().getInventory().setLeggings(new ItemStack(Material.AIR));
|
||||
event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your leggings slot.");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
if (exploitItem(event.getPlayer().getInventory().getChestplate()))
|
||||
{
|
||||
event.getPlayer().getInventory().setChestplate(new ItemStack(Material.AIR));
|
||||
event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your chestplate slot.");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
if (exploitItem(event.getPlayer().getInventory().getItemInMainHand()))
|
||||
{
|
||||
event.getPlayer().getInventory().setItemInMainHand(new ItemStack(Material.AIR));
|
||||
event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your hand.");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
if (exploitItem(event.getPlayer().getInventory().getItemInOffHand()))
|
||||
{
|
||||
event.getPlayer().getInventory().setItemInOffHand(new ItemStack(Material.AIR));
|
||||
event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your offhand.");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
@ -110,72 +71,28 @@ public class MovementValidator extends FreedomService
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
// Validate position
|
||||
if (Math.abs(player.getLocation().getX()) >= MAX_XYZ_COORD || Math.abs(player.getLocation().getZ()) >= MAX_XYZ_COORD || Math.abs(player.getLocation().getY()) >= MAX_XYZ_COORD)
|
||||
if (isOutOfBounds(player.getLocation()))
|
||||
{
|
||||
PaperLib.teleportAsync(player, player.getWorld().getSpawnLocation()); // Illegal position, teleport to spawn
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerHoldItem(PlayerItemHeldEvent event)
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onPlayerSpawn(PlayerSpawnLocationEvent event)
|
||||
{
|
||||
if (exploitItem(event.getPlayer().getInventory().getItemInMainHand()))
|
||||
final Location playerSpawn = event.getSpawnLocation();
|
||||
final Location worldSpawn = event.getPlayer().getWorld().getSpawnLocation();
|
||||
|
||||
// If the player's spawn is equal to the world's spawn, there is no need to check.
|
||||
// This will also prevent any possible feedback loops pertaining to setting an out of bounds world spawn to the same world spawn.
|
||||
if (playerSpawn == worldSpawn)
|
||||
{
|
||||
event.getPlayer().getInventory().setItemInMainHand(new ItemStack(Material.AIR));
|
||||
event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your hand.");
|
||||
}
|
||||
if (exploitItem(event.getPlayer().getInventory().getItemInOffHand()))
|
||||
{
|
||||
event.getPlayer().getInventory().setItemInOffHand(new ItemStack(Material.AIR));
|
||||
event.getPlayer().sendMessage(ChatColor.RED + "An item with both negative infinity and positive infinity attributes was cleared from your offhand.");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
private Boolean exploitItem(ItemStack item)
|
||||
if (isOutOfBounds(worldSpawn))
|
||||
{
|
||||
if (item == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (meta != null)
|
||||
{
|
||||
Multimap<Attribute, AttributeModifier> attributes = meta.getAttributeModifiers();
|
||||
if (attributes != null)
|
||||
{
|
||||
Map<Attribute, Collection<AttributeModifier>> attrMap = attributes.asMap();
|
||||
|
||||
// For every attribute...
|
||||
for (Attribute attr : attributes.keySet())
|
||||
{
|
||||
// Default values
|
||||
boolean posInf = false;
|
||||
boolean negInf = false;
|
||||
|
||||
// For every AttributeModifier...
|
||||
for (AttributeModifier modifier : attrMap.get(attr))
|
||||
{
|
||||
// Are they ∞ or -∞?
|
||||
if (modifier.getAmount() == Double.POSITIVE_INFINITY)
|
||||
{
|
||||
posInf = true;
|
||||
}
|
||||
else if (modifier.getAmount() == Double.NEGATIVE_INFINITY)
|
||||
{
|
||||
negInf = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Are both values set as true?
|
||||
if (posInf && negInf)
|
||||
{
|
||||
return true;
|
||||
event.setSpawnLocation(worldSpawn);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
@ -3,7 +3,6 @@ package me.totalfreedom.totalfreedommod;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FSync;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import org.bukkit.ChatColor;
|
||||
@ -11,7 +10,6 @@ import org.bukkit.command.Command;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
|
||||
public class Muter extends FreedomService
|
||||
@ -26,26 +24,23 @@ public class Muter extends FreedomService
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST)
|
||||
public void onAsyncPlayerChatEvent(AsyncPlayerChatEvent event)
|
||||
public boolean onPlayerChat(Player player)
|
||||
{
|
||||
Player player = event.getPlayer();
|
||||
|
||||
FPlayer fPlayer = plugin.pl.getPlayerSync(player);
|
||||
|
||||
if (!fPlayer.isMuted())
|
||||
{
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (plugin.al.isAdminSync(player))
|
||||
{
|
||||
fPlayer.setMuted(false);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
player.sendMessage(Component.text("You are muted.", NamedTextColor.RED));
|
||||
event.setCancelled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW)
|
||||
|
@ -66,8 +66,13 @@ public class ActivityLogEntry implements IConfig
|
||||
|
||||
public void addLogin()
|
||||
{
|
||||
Date currentTime = Date.from(Instant.now());
|
||||
timestamps.add("Login: " + FUtil.dateToString(currentTime));
|
||||
this.addLogin(System.currentTimeMillis());
|
||||
}
|
||||
|
||||
public void addLogin(final long timestamp)
|
||||
{
|
||||
Date time = Date.from(Instant.ofEpochMilli(timestamp));
|
||||
timestamps.add("Login: " + FUtil.dateToString(time));
|
||||
}
|
||||
|
||||
public void addLogout()
|
||||
|
@ -156,7 +156,7 @@ public class Admin
|
||||
}
|
||||
|
||||
// Ensure admins don't have admin functionality when removed (FS-222)
|
||||
AdminList.vanished.remove(getName());
|
||||
AdminList.vanished.remove(getUuid());
|
||||
|
||||
if (plugin.esb != null)
|
||||
{
|
||||
|
@ -194,6 +194,15 @@ public class AdminList extends FreedomService
|
||||
// Save admin
|
||||
plugin.sql.addAdmin(admin);
|
||||
|
||||
// Add login time
|
||||
UUID uuid = admin.getUuid();
|
||||
Player player = Bukkit.getPlayer(uuid);
|
||||
|
||||
if (player != null)
|
||||
{
|
||||
plugin.acl.getActivityLog(player).addLogin(player.getLastLogin());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -265,7 +274,8 @@ public class AdminList extends FreedomService
|
||||
ResultSet currentSave = plugin.sql.getAdminByUuid(admin.getUuid());
|
||||
for (Map.Entry<String, Object> entry : admin.toSQLStorable().entrySet())
|
||||
{
|
||||
Object storedValue = plugin.sql.getValue(currentSave, entry.getKey(), entry.getValue()); if (storedValue != null && !storedValue.equals(entry.getValue()) || storedValue == null && entry.getValue() != null || entry.getValue() == null)
|
||||
Object storedValue = plugin.sql.getValue(currentSave, entry.getKey(), entry.getValue());
|
||||
if (storedValue != null && !storedValue.equals(entry.getValue()) || storedValue == null && entry.getValue() != null || entry.getValue() == null)
|
||||
{
|
||||
plugin.sql.setAdminValue(admin, entry.getKey(), entry.getValue());
|
||||
}
|
||||
|
@ -4,8 +4,7 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
/* TODO This will have to be changed from com.github.atlasmediagroup.scissors to me.totalfreedom.scissors when we migrate to 1.19 */
|
||||
import com.github.atlasmediagroup.scissors.event.block.MasterBlockFireEvent;
|
||||
import me.totalfreedom.scissors.event.block.MasterBlockFireEvent;
|
||||
import io.papermc.paper.event.player.PlayerSignCommandPreprocessEvent;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
@ -173,7 +172,7 @@ public class EventBlocker extends FreedomService
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerDropItem(PlayerDropItemEvent event)
|
||||
{
|
||||
if (!plugin.al.isAdmin(event.getPlayer()))
|
||||
if (!plugin.al.isAdmin(event.getPlayer()) && !ConfigEntry.ALLOW_ITEM_DROPS.getBoolean())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.Groups;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.EntityType;
|
||||
@ -26,7 +27,7 @@ public class InteractBlocker extends FreedomService
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||
public void onPlayerInteract(PlayerInteractEvent event)
|
||||
{
|
||||
switch (event.getAction())
|
||||
@ -69,6 +70,10 @@ public class InteractBlocker extends FreedomService
|
||||
private void handleRightClick(PlayerInteractEvent event)
|
||||
{
|
||||
final Player player = event.getPlayer();
|
||||
if (player.getGameMode().equals(GameMode.SPECTATOR)) {
|
||||
return;
|
||||
}
|
||||
|
||||
final Block clickedBlock = event.getClickedBlock();
|
||||
|
||||
if (clickedBlock != null && clickedBlock.getType() == Material.RESPAWN_ANCHOR && !ConfigEntry.ALLOW_RESPAWN_ANCHORS.getBoolean())
|
||||
|
@ -24,30 +24,12 @@ import org.bukkit.plugin.SimplePluginManager;
|
||||
|
||||
public class CommandBlocker extends FreedomService
|
||||
{
|
||||
|
||||
private final Pattern whitespacePattern = Pattern.compile("^/?( +)(.*)?");
|
||||
private final Pattern flagPattern = Pattern.compile("(:([0-9]){5,})");
|
||||
//
|
||||
private final Map<String, CommandBlockerEntry> entryList = Maps.newHashMap();
|
||||
private final List<String> unknownCommands = Lists.newArrayList();
|
||||
|
||||
public static CommandMap getCommandMap()
|
||||
{
|
||||
try
|
||||
{
|
||||
SimplePluginManager simplePluginManager = (SimplePluginManager)Bukkit.getServer().getPluginManager();
|
||||
|
||||
Field commandMapField = SimplePluginManager.class.getDeclaredField("commandMap");
|
||||
commandMapField.setAccessible(true);
|
||||
|
||||
return (SimpleCommandMap)commandMapField.get(simplePluginManager);
|
||||
}
|
||||
catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e)
|
||||
{
|
||||
FLog.severe("Failed to get command map field (" + e.getMessage() + ")");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
@ -65,7 +47,7 @@ public class CommandBlocker extends FreedomService
|
||||
entryList.clear();
|
||||
unknownCommands.clear();
|
||||
|
||||
final CommandMap commandMap = getCommandMap();
|
||||
final CommandMap commandMap = Bukkit.getCommandMap();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
List<String> blockedCommands = (List<String>)ConfigEntry.BLOCKED_COMMANDS.getList();
|
||||
@ -156,6 +138,14 @@ public class CommandBlocker extends FreedomService
|
||||
|
||||
// Format
|
||||
command = command.toLowerCase().trim();
|
||||
|
||||
// Whitespaces
|
||||
Matcher whitespaceMatcher = whitespacePattern.matcher(command);
|
||||
if (whitespaceMatcher.matches() && whitespaceMatcher.groupCount() == 2)
|
||||
{
|
||||
command = whitespaceMatcher.group(2);
|
||||
}
|
||||
|
||||
command = command.startsWith("/") ? command.substring(1) : command;
|
||||
|
||||
// Check for plugin specific commands
|
||||
|
@ -6,7 +6,6 @@ import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.entity.HumanEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
@ -14,7 +13,6 @@ import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
import org.bukkit.event.inventory.InventoryType;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
@ -129,7 +127,7 @@ public class EssentialsBridge extends FreedomService
|
||||
try
|
||||
{
|
||||
User user = getEssentialsUser(username);
|
||||
if (user != null)
|
||||
if (user != null && user.getBase().isOnline())
|
||||
{
|
||||
user.setVanished(vanished);
|
||||
}
|
||||
|
@ -1,6 +1,8 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import org.apache.commons.lang.ArrayUtils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.ChatColor;
|
||||
@ -8,11 +10,28 @@ import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME, blockHostConsole = true)
|
||||
@CommandParameters(description = "Report a player for all admins to see.", usage = "/<command> <player> <reason>")
|
||||
public class Command_report extends FreedomCommand
|
||||
{
|
||||
private void handleLog(final @Nullable Boolean value, final @Nullable Throwable ex, final CommandSender sender)
|
||||
{
|
||||
if (ex != null)
|
||||
{
|
||||
sender.sendMessage(Component.text("An error occurred while attempting to log your previously filed report to a Discord channel.", NamedTextColor.RED));
|
||||
ex.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Boolean.FALSE.equals(value))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
sender.sendMessage(Component.text("The report you previously filed has been successfully logged to a Discord channel. Please note that spamming reports is not allowed, and you will be sanctioned if you are found to be doing it.", NamedTextColor.GRAY));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
@ -50,18 +69,16 @@ public class Command_report extends FreedomCommand
|
||||
}
|
||||
|
||||
String report = StringUtils.join(ArrayUtils.subarray(args, 1, args.length), " ");
|
||||
plugin.cm.reportAction(playerSender, (player == null) ? offlinePlayer.getName() : player.getName(), report);
|
||||
String reportedUsername = (player == null) ? offlinePlayer.getName() : player.getName();
|
||||
plugin.cm.reportAction(playerSender, reportedUsername, report);
|
||||
|
||||
boolean logged = false;
|
||||
msg(ChatColor.GREEN + "Thank you, your report is being processed.");
|
||||
|
||||
if (plugin.dc.enabled)
|
||||
{
|
||||
logged = (player == null) ? plugin.dc.sendReportOffline(playerSender, offlinePlayer, report) : plugin.dc.sendReport(playerSender, player, report);
|
||||
plugin.dc.sendReport(playerSender.getName(), reportedUsername, report).whenCompleteAsync((logged, ex) -> handleLog(logged, ex, sender));
|
||||
}
|
||||
|
||||
msg(ChatColor.GREEN + "Thank you, your report has been successfully logged."
|
||||
+ (logged ? ChatColor.RED + "\nNote: This report has been logged to a discord channel, as with any report system, spamming reports can lead to you getting banned." : ""));
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
@ -19,9 +19,9 @@ public class Command_toggle extends FreedomCommand
|
||||
private final List<String> toggles = Arrays.asList(
|
||||
"waterplace", "fireplace", "lavaplace", "fluidspread", "lavadmg", "firespread", "frostwalk",
|
||||
"firework", "prelog", "lockdown", "petprotect", "entitywipe", "nonuke [range] [count]",
|
||||
"explosives [radius]", "unsafeenchs", "bells", "armorstands", "masterblocks", "books", "grindstones",
|
||||
"jukeboxes", "spawners", "4chan", "beehives", "respawnanchors", "autotp", "autoclear", "minecarts", "mp44",
|
||||
"landmines", "tossmob", "gravity");
|
||||
"explosives [radius]", "unsafeenchs", "bells", "armorstands", "masterblocks", "item_drops",
|
||||
"grindstones", "jukeboxes", "spawners", "4chan", "beehives", "respawnanchors", "autotp", "autoclear", "minecarts",
|
||||
"mp44", "landmines", "tossmob", "gravity");
|
||||
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
@ -205,6 +205,12 @@ public class Command_toggle extends FreedomCommand
|
||||
break;
|
||||
}
|
||||
|
||||
case "item_drops":
|
||||
{
|
||||
toggle("Item drops are", ConfigEntry.ALLOW_ITEM_DROPS);
|
||||
break;
|
||||
}
|
||||
|
||||
case "grindstones":
|
||||
{
|
||||
toggle("Grindstones are", ConfigEntry.ALLOW_GRINDSTONES);
|
||||
|
@ -35,6 +35,7 @@ public enum ConfigEntry
|
||||
ALLOW_GRAVITY(Boolean.class, "allow.gravity"),
|
||||
ALLOW_MASTERBLOCKS(Boolean.class, "allow.masterblocks"),
|
||||
ALLOW_BOOKS(Boolean.class, "allow.books"),
|
||||
ALLOW_ITEM_DROPS(Boolean.class, "allow.item_drops"),
|
||||
//
|
||||
BLOCKED_CHATCODES(String.class, "blocked_chatcodes"),
|
||||
//
|
||||
|
@ -3,10 +3,7 @@ package me.totalfreedom.totalfreedommod.discord;
|
||||
import com.google.common.base.Strings;
|
||||
import java.time.Instant;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
import javax.security.auth.login.LoginException;
|
||||
@ -26,11 +23,9 @@ import net.dv8tion.jda.api.entities.Guild;
|
||||
import net.dv8tion.jda.api.entities.Member;
|
||||
import net.dv8tion.jda.api.entities.Message;
|
||||
import net.dv8tion.jda.api.entities.MessageEmbed;
|
||||
import net.dv8tion.jda.api.entities.PrivateChannel;
|
||||
import net.dv8tion.jda.api.entities.Role;
|
||||
import net.dv8tion.jda.api.entities.SelfUser;
|
||||
import net.dv8tion.jda.api.entities.TextChannel;
|
||||
import net.dv8tion.jda.api.entities.User;
|
||||
import net.dv8tion.jda.api.events.ReadyEvent;
|
||||
import net.dv8tion.jda.api.hooks.ListenerAdapter;
|
||||
import net.dv8tion.jda.api.requests.GatewayIntent;
|
||||
@ -42,16 +37,18 @@ import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.apache.commons.lang.WordUtils;
|
||||
import org.apache.commons.lang3.RandomStringUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.GameRule;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.entity.PlayerDeathEvent;
|
||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class Discord extends FreedomService
|
||||
{
|
||||
@ -282,12 +279,6 @@ public class Discord extends FreedomService
|
||||
{
|
||||
String newMessage = message;
|
||||
|
||||
if (message.contains("@"))
|
||||
{
|
||||
// \u200B is Zero Width Space, invisible on Discord
|
||||
newMessage = message.replaceAll("@", "@\u200B");
|
||||
}
|
||||
|
||||
if (message.toLowerCase().contains("discord.gg")) // discord.gg/invite works as an invite
|
||||
{
|
||||
return "";
|
||||
@ -303,10 +294,10 @@ public class Discord extends FreedomService
|
||||
|
||||
if (message.contains("§"))
|
||||
{
|
||||
newMessage = message.replaceAll("§", "");
|
||||
newMessage = message.replace("§", "");
|
||||
}
|
||||
|
||||
return deformat(newMessage);
|
||||
return newMessage;
|
||||
}
|
||||
|
||||
public void messageChatChannel(String message)
|
||||
@ -324,7 +315,7 @@ public class Discord extends FreedomService
|
||||
|
||||
if (enabled && !chat_channel_id.isEmpty())
|
||||
{
|
||||
CompletableFuture<Message> sentMessage = Objects.requireNonNull(bot.getTextChannelById(chat_channel_id)).sendMessage(sanitizedMessage).submit(true);
|
||||
CompletableFuture<Message> sentMessage = Objects.requireNonNull(bot.getTextChannelById(chat_channel_id)).sendMessage(sanitizedMessage).allowedMentions(Collections.emptyList()).submit(true);
|
||||
sentMessages.add(sentMessage);
|
||||
}
|
||||
}
|
||||
@ -344,7 +335,7 @@ public class Discord extends FreedomService
|
||||
|
||||
if (enabled && !chat_channel_id.isEmpty())
|
||||
{
|
||||
CompletableFuture<Message> sentMessage = Objects.requireNonNull(bot.getTextChannelById(chat_channel_id)).sendMessage(sanitizedMessage).submit(true);
|
||||
CompletableFuture<Message> sentMessage = Objects.requireNonNull(bot.getTextChannelById(chat_channel_id)).sendMessage(sanitizedMessage).allowedMentions(Collections.emptyList()).submit(true);
|
||||
sentMessages.add(sentMessage);
|
||||
}
|
||||
}
|
||||
@ -402,7 +393,9 @@ public class Discord extends FreedomService
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean sendReportOffline(Player reporter, OfflinePlayer reported, String reason)
|
||||
public CompletableFuture<Boolean> sendReport(String reporterName, String reportedName, String reason)
|
||||
{
|
||||
return CompletableFuture.supplyAsync(() ->
|
||||
{
|
||||
if (!shouldISendReport())
|
||||
{
|
||||
@ -425,73 +418,49 @@ public class Discord extends FreedomService
|
||||
return false;
|
||||
}
|
||||
|
||||
final EmbedBuilder embedBuilder = new EmbedBuilder();
|
||||
embedBuilder.setTitle("Report for " + reported.getName() + " (offline)");
|
||||
embedBuilder.setDescription(reason);
|
||||
embedBuilder.setFooter("Reported by " + reporter.getName(), "https://minotar.net/helm/" + reporter.getName() + ".png");
|
||||
embedBuilder.setTimestamp(Instant.from(ZonedDateTime.now()));
|
||||
if (plugin.esb.isEnabled())
|
||||
{
|
||||
com.earth2me.essentials.User user = plugin.esb.getEssentialsUser(reported.getName());
|
||||
String location = "World: " + Objects.requireNonNull(user.getLastLocation().getWorld()).getName() + ", X: " + user.getLastLocation().getBlockX() + ", Y: " + user.getLastLocation().getBlockY() + ", Z: " + user.getLastLocation().getBlockZ();
|
||||
embedBuilder.addField("Location", location, true);
|
||||
embedBuilder.addField("God Mode", WordUtils.capitalizeFully(String.valueOf(user.isGodModeEnabled())), true);
|
||||
if (user.getNickname() != null)
|
||||
{
|
||||
embedBuilder.addField("Nickname", user.getNickname(), true);
|
||||
}
|
||||
}
|
||||
MessageEmbed embed = embedBuilder.build();
|
||||
Message message = channel.sendMessageEmbeds(embed).complete();
|
||||
|
||||
if (!ConfigEntry.DISCORD_REPORT_ARCHIVE_CHANNEL_ID.getString().isEmpty())
|
||||
{
|
||||
message.addReaction("\uD83D\uDCCB").complete();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean sendReport(Player reporter, Player reported, String reason)
|
||||
{
|
||||
if (!shouldISendReport())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
final Guild server = bot.getGuildById(ConfigEntry.DISCORD_SERVER_ID.getString());
|
||||
|
||||
if (server == null)
|
||||
{
|
||||
FLog.severe("The guild ID specified in the config is invalid.");
|
||||
return false;
|
||||
}
|
||||
|
||||
final TextChannel channel = server.getTextChannelById(ConfigEntry.DISCORD_REPORT_CHANNEL_ID.getString());
|
||||
|
||||
if (channel == null)
|
||||
{
|
||||
FLog.severe("The report channel ID specified in the config is invalid.");
|
||||
return false;
|
||||
}
|
||||
Player onlinePlayer = Bukkit.getPlayer(reportedName);
|
||||
boolean online = onlinePlayer != null;
|
||||
|
||||
final EmbedBuilder embedBuilder = new EmbedBuilder();
|
||||
embedBuilder.setTitle("Report for " + reported.getName());
|
||||
embedBuilder.setTitle("Report for " + reportedName + (online ? "" : " (offline)"));
|
||||
embedBuilder.setDescription(reason);
|
||||
embedBuilder.setFooter("Reported by " + reporter.getName(), "https://minotar.net/helm/" + reporter.getName() + ".png");
|
||||
embedBuilder.setFooter("Reported by " + reporterName, "https://minotar.net/helm/" + reporterName + ".png");
|
||||
embedBuilder.setTimestamp(Instant.from(ZonedDateTime.now()));
|
||||
String location = "World: " + Objects.requireNonNull(reported.getLocation().getWorld()).getName() + ", X: " + reported.getLocation().getBlockX() + ", Y: " + reported.getLocation().getBlockY() + ", Z: " + reported.getLocation().getBlockZ();
|
||||
embedBuilder.addField("Location", location, true);
|
||||
embedBuilder.addField("Game Mode", WordUtils.capitalizeFully(reported.getGameMode().name()), true);
|
||||
|
||||
Location location = null;
|
||||
Boolean godMode = null;
|
||||
String nickName = null;
|
||||
|
||||
if (plugin.esb.isEnabled())
|
||||
{
|
||||
com.earth2me.essentials.User user = plugin.esb.getEssentialsUser(reported.getName());
|
||||
embedBuilder.addField("God Mode", WordUtils.capitalizeFully(String.valueOf(user.isGodModeEnabled())), true);
|
||||
if (user.getNickname() != null)
|
||||
com.earth2me.essentials.User user = plugin.esb.getEssentialsUser(reportedName);
|
||||
if (!online)
|
||||
{
|
||||
embedBuilder.addField("Nickname", user.getNickname(), true);
|
||||
location = user.getLastLocation();
|
||||
}
|
||||
|
||||
godMode = user.isGodModeEnabled();
|
||||
nickName = user.getNickname();
|
||||
}
|
||||
|
||||
if (location == null && online)
|
||||
{
|
||||
location = onlinePlayer.getLocation();
|
||||
}
|
||||
|
||||
if (location != null)
|
||||
{
|
||||
embedBuilder.addField("Location", "World: " + location.getWorld().getName() + ", X: " + location.getBlockX() + ", Y: " + location.getBlockY() + ", Z: " + location.getBlockZ(), true);
|
||||
}
|
||||
|
||||
if (godMode != null)
|
||||
{
|
||||
embedBuilder.addField("God Mode", WordUtils.capitalizeFully(godMode.toString()), true);
|
||||
}
|
||||
|
||||
if (nickName != null)
|
||||
{
|
||||
embedBuilder.addField("Nickname", nickName, true);
|
||||
}
|
||||
|
||||
MessageEmbed embed = embedBuilder.build();
|
||||
@ -503,6 +472,7 @@ public class Discord extends FreedomService
|
||||
}
|
||||
|
||||
return true;
|
||||
}, t -> Bukkit.getScheduler().runTaskAsynchronously(plugin, t));
|
||||
}
|
||||
|
||||
// Do no ask why this is here. I spent two hours trying to make a simple thing work
|
||||
@ -514,16 +484,28 @@ public class Discord extends FreedomService
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onAsyncPlayerChat(AsyncPlayerChatEvent event)
|
||||
public void onPlayerChat(Player player, String message)
|
||||
{
|
||||
Player player = event.getPlayer();
|
||||
String message = event.getMessage();
|
||||
if (ConfigEntry.ADMIN_ONLY_MODE.getBoolean())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ConfigEntry.ADMIN_ONLY_MODE.getBoolean() && !server.hasWhitelist()
|
||||
&& !plugin.pl.getPlayer(player).isMuted() && bot != null)
|
||||
if (server.hasWhitelist())
|
||||
{
|
||||
messageChatChannel(player.getName() + " \u00BB " + ChatColor.stripColor(message));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (plugin.pl.getPlayer(player).isMuted())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (bot == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
messageChatChannel(deformat(player.getName()) + " \u00BB " + ChatColor.stripColor(message));
|
||||
}
|
||||
}
|
@ -58,9 +58,8 @@ public class DiscordToMinecraftListener extends ListenerAdapter
|
||||
final Message msg = event.getMessage();
|
||||
final String content = msg.getContentStripped();
|
||||
|
||||
if (content.startsWith(ConfigEntry.DISCORD_PREFIX.getString()))
|
||||
if (content.toLowerCase().startsWith(ConfigEntry.DISCORD_PREFIX.getString().toLowerCase()) && Discord.DISCORD_COMMAND_MANAGER.parse(content, member, textChannel))
|
||||
{
|
||||
Discord.DISCORD_COMMAND_MANAGER.parse(content, member, textChannel);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -10,6 +10,8 @@ import net.dv8tion.jda.api.entities.TextChannel;
|
||||
import net.dv8tion.jda.api.events.message.react.MessageReactionAddEvent;
|
||||
import net.dv8tion.jda.api.hooks.ListenerAdapter;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
public class MessageReactionListener extends ListenerAdapter
|
||||
{
|
||||
public void onMessageReactionAdd(MessageReactionAddEvent messageReactionAddEvent)
|
||||
@ -59,7 +61,8 @@ public class MessageReactionListener extends ListenerAdapter
|
||||
final MessageEmbed embed = message.getEmbeds().get(0);
|
||||
final MessageBuilder archiveMessageBuilder = new MessageBuilder();
|
||||
archiveMessageBuilder.setContent("Report completed by " + completer.getUser().getAsMention() + " (" + Discord.deformat(completer.getUser().getAsTag() + ")"));
|
||||
archiveMessageBuilder.setEmbed(embed);
|
||||
archiveMessageBuilder.setAllowedMentions(Collections.emptyList());
|
||||
archiveMessageBuilder.setEmbeds(embed);
|
||||
final Message archiveMessage = archiveMessageBuilder.build();
|
||||
|
||||
archiveChannel.sendMessage(archiveMessage).complete();
|
||||
|
@ -46,11 +46,21 @@ public class DiscordCommandManager
|
||||
FLog.info("Loaded " + commands.size() + " Discord commands.");
|
||||
}
|
||||
|
||||
public void parse(String content, Member member, TextChannel channel)
|
||||
public boolean parse(String content, Member member, TextChannel channel)
|
||||
{
|
||||
List<String> args = new ArrayList<>(Arrays.asList(content.split(" ")));
|
||||
final String actualContent = content.substring(PREFIX.length()).trim();
|
||||
List<String> args = new ArrayList<>(Arrays.asList(actualContent.split(" ")));
|
||||
if (args.isEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
final String alias = args.remove(0).split(PREFIX)[1]; // The joys of command parsing
|
||||
final String alias = args.get(0);
|
||||
|
||||
if (alias.isEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (DiscordCommand command : commands)
|
||||
{
|
||||
@ -63,6 +73,7 @@ public class DiscordCommandManager
|
||||
final CompletableFuture<Message> futureMessage = channel.sendMessage(message).submit(true);
|
||||
|
||||
this.discord.sentMessages.add(futureMessage);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -71,14 +82,17 @@ public class DiscordCommandManager
|
||||
embedBuilder.setTitle("Command error");
|
||||
embedBuilder.setColor(Color.RED);
|
||||
embedBuilder.setDescription("You don't have permission to execute this command.");
|
||||
messageBuilder.setEmbed(embedBuilder.build());
|
||||
messageBuilder.setEmbeds(embedBuilder.build());
|
||||
final Message message = messageBuilder.build();
|
||||
|
||||
final CompletableFuture<Message> futureMessage = channel.sendMessage(message).submit(true);
|
||||
|
||||
this.discord.sentMessages.add(futureMessage);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -13,13 +13,7 @@ import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
import me.totalfreedom.totalfreedommod.shop.ShopItem;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Color;
|
||||
import org.bukkit.FireworkEffect;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.SoundCategory;
|
||||
import org.bukkit.*;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Arrow;
|
||||
import org.bukkit.entity.EnderPearl;
|
||||
@ -95,11 +89,16 @@ public class ItemFun extends FreedomService
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onPlayerEntityInteract(PlayerInteractEntityEvent event)
|
||||
{
|
||||
|
||||
Player player = event.getPlayer();
|
||||
if (player.getGameMode().equals(GameMode.SPECTATOR))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Entity entity = event.getRightClicked();
|
||||
FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||
|
||||
|
@ -21,7 +21,6 @@ import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.PlayerInventory;
|
||||
@ -412,23 +411,35 @@ public class Shop extends FreedomService
|
||||
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerChat(AsyncPlayerChatEvent event)
|
||||
public boolean handlePlayerChat(Player player, String message)
|
||||
{
|
||||
String message = event.getMessage();
|
||||
Player player = event.getPlayer();
|
||||
if (!ConfigEntry.SHOP_ENABLED.getBoolean())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (ConfigEntry.SHOP_ENABLED.getBoolean() && ConfigEntry.SHOP_REACTIONS_ENABLED.getBoolean()
|
||||
&& !plugin.sh.reactionString.isEmpty() && message.equals(plugin.sh.reactionString))
|
||||
if (!ConfigEntry.SHOP_REACTIONS_ENABLED.getBoolean())
|
||||
{
|
||||
event.setCancelled(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (plugin.sh.reactionString.isEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!message.equals(plugin.sh.reactionString))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
PlayerData data = plugin.pl.getData(player);
|
||||
data.setCoins(data.getCoins() + plugin.sh.coinsPerReactionWin);
|
||||
plugin.pl.save(data);
|
||||
plugin.sh.endReaction(player.getName());
|
||||
player.sendMessage(ChatColor.GREEN + "You have been given " + ChatColor.GOLD
|
||||
+ plugin.sh.coinsPerReactionWin + ChatColor.GREEN + " coins!");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public ShopItem getShopItem(int slot)
|
||||
|
@ -90,6 +90,15 @@ public class SQLite extends FreedomService
|
||||
{
|
||||
FLog.severe("Failed to create the admins table: " + e.getMessage());
|
||||
}
|
||||
} else
|
||||
{
|
||||
try
|
||||
{
|
||||
connection.createStatement().execute("ALTER TABLE `admins` DROP COLUMN `ptero_id`");
|
||||
} catch (SQLException e)
|
||||
{
|
||||
// Ignore the error. If someone else wants to add WORKING AND TESTED CODE to check if the `ptero_id` column exists, they can, but I couldn't find a good way.
|
||||
}
|
||||
}
|
||||
if (tableExists(meta, "players"))
|
||||
{
|
||||
|
@ -21,6 +21,7 @@ import java.time.Instant;
|
||||
import java.util.*;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.bukkit.Bukkit.getServer;
|
||||
|
||||
@ -49,7 +50,10 @@ public class FUtil
|
||||
"78408086-1991-4c33-a571-d8fa325465b2", // Telesphoreo
|
||||
"f5cd54c4-3a24-4213-9a56-c06c49594dff", // Taahh
|
||||
"a52f1f08-a398-400a-bca4-2b74b81feae6", // G6_
|
||||
"ca83b658-c03b-4106-9edc-72f70a80656d" // ayunami2000
|
||||
"ca83b658-c03b-4106-9edc-72f70a80656d", // ayunami2000
|
||||
"4d708f0c-cb2a-4a1e-928f-214daccc9d18", // evakc
|
||||
"38e38fbd-c027-4cac-8e37-4158710a287d", // EnZaXD
|
||||
"7076dcf5-b940-4e86-9a6d-a3b1d16b3649" // Gommeh
|
||||
);
|
||||
public static final List<String> DEVELOPER_NAMES = Arrays.asList(
|
||||
"Madgeek1450",
|
||||
@ -70,7 +74,10 @@ public class FUtil
|
||||
"videogamesm12",
|
||||
"Taahh",
|
||||
"G6_",
|
||||
"ayunami2000");
|
||||
"ayunami2000",
|
||||
"evakc",
|
||||
"EnZaXD",
|
||||
"Gommeh");
|
||||
public static final Map<String, ChatColor> CHAT_COLOR_NAMES = new HashMap<>();
|
||||
public static final List<ChatColor> CHAT_COLOR_POOL = Arrays.asList(
|
||||
ChatColor.DARK_RED,
|
||||
@ -144,10 +151,11 @@ public class FUtil
|
||||
return (count == 1 ? "" : "s");
|
||||
}
|
||||
|
||||
@SuppressWarnings("java:S6204")
|
||||
public static List<String> getPlayerList()
|
||||
{
|
||||
return getServer().getOnlinePlayers().stream().filter(player ->
|
||||
!TotalFreedomMod.getPlugin().al.isVanished(player.getUniqueId())).map(HumanEntity::getName).toList();
|
||||
!TotalFreedomMod.getPlugin().al.isVanished(player.getUniqueId())).map(HumanEntity::getName).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public static String listToString(List<String> list)
|
||||
|
@ -221,6 +221,7 @@ allow:
|
||||
gravity: false
|
||||
masterblocks: false
|
||||
books: true
|
||||
item_drops: false
|
||||
|
||||
blocked_commands:
|
||||
#
|
||||
|
@ -13,9 +13,9 @@ softdepend:
|
||||
- JDA
|
||||
- Votifier
|
||||
authors: [Madgeek1450, Prozza]
|
||||
api-version: "1.17"
|
||||
api-version: "1.20"
|
||||
libraries:
|
||||
- org.apache.commons:commons-lang3:3.12.0
|
||||
- commons-io:commons-io:2.11.0
|
||||
- org.apache.commons:commons-lang3:3.13.0
|
||||
- commons-io:commons-io:2.13.0
|
||||
- org.jetbrains:annotations:23.0.0
|
||||
- org.javassist:javassist:3.29.1-GA
|
Reference in New Issue
Block a user