mirror of
https://github.com/AtlasMediaGroup/TotalFreedomMod.git
synced 2025-07-01 04:26:42 +00:00
Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
618d5c5ecb |
4
.github/dependabot.yml
vendored
4
.github/dependabot.yml
vendored
@ -9,15 +9,11 @@ updates:
|
||||
# Maintain Maven Updates
|
||||
- package-ecosystem: "maven" # See documentation for possible values
|
||||
directory: "/" # Location of package manifests
|
||||
target-branch: "development"
|
||||
open-pull-requests-limit: 50
|
||||
schedule:
|
||||
interval: "daily"
|
||||
|
||||
# Maintain dependencies for GitHub Actions
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
target-branch: "development"
|
||||
open-pull-requests-limit: 50
|
||||
schedule:
|
||||
interval: "daily"
|
||||
|
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@4.0.0
|
||||
uses: codacy/codacy-analysis-cli-action@1.1.0
|
||||
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
|
||||
|
5
.github/workflows/codeql-analysis.yml
vendored
5
.github/workflows/codeql-analysis.yml
vendored
@ -38,11 +38,10 @@ jobs:
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Setup Java JDK
|
||||
uses: actions/setup-java@v2.3.0
|
||||
uses: actions/setup-java@v1.4.3
|
||||
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
|
||||
distribution: 'adopt'
|
||||
java-version: 11
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
|
4
.github/workflows/downstream.yml
vendored
4
.github/workflows/downstream.yml
vendored
@ -26,11 +26,11 @@ jobs:
|
||||
# Step 2: run this sync action - specify the upstream repo, upstream branch to sync with, and target sync branch
|
||||
- name: Pull (Fast-Forward) upstream changes
|
||||
id: sync
|
||||
uses: aormsby/Fork-Sync-With-Upstream-action@v3.3
|
||||
uses: aormsby/Fork-Sync-With-Upstream-action@v2.1
|
||||
with:
|
||||
upstream_repository: AtlasMediaGroup/TotalFreedomMod
|
||||
upstream_branch: main
|
||||
target_branch: development
|
||||
target_branch: main
|
||||
git_pull_args: --ff-only # optional arg use, defaults to simple 'pull'
|
||||
|
||||
# Step 3: Display a message if 'sync' step had new commits (simple test)
|
||||
|
21
.github/workflows/java17-maven.yml
vendored
21
.github/workflows/java17-maven.yml
vendored
@ -1,21 +0,0 @@
|
||||
name: Java17-Maven-Build
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build-java-17:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
# Checkout the code
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
# Java 16 Builds
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v2.3.0
|
||||
with:
|
||||
java-version: 17
|
||||
distribution: 'adopt'
|
||||
- name: Build with Maven
|
||||
run: mvn -B package --file pom.xml
|
27
.github/workflows/maven.yml
vendored
Normal file
27
.github/workflows/maven.yml
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
name: Maven-Build
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
# Java 11 Builds
|
||||
- uses: actions/checkout@v1
|
||||
- name: Set up JDK 11
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 11
|
||||
- name: Build with Maven
|
||||
run: mvn -B package --file pom.xml
|
||||
|
||||
# Java 16 Builds
|
||||
- uses: actions/checkout@v1
|
||||
- name: Set up JDK 16
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 16
|
||||
- name: Build with Maven
|
||||
run: mvn -B package --file pom.xml
|
@ -11,23 +11,20 @@ These versions are currently actively supported by our team, and you should expe
|
||||
|
||||
| Version | Supported | Support End: |
|
||||
| ------------------- | ------------------ | ------------------------------ |
|
||||
| 2021.09 | :white_check_mark: | No Earlier than December 2021 |
|
||||
| 2021.05 | :white_check_mark: | No Earlier than August 2021 |
|
||||
|
||||
### Legacy Supported
|
||||
These versions are no longer under active development, however we will look to release critical secuirty patches where appropriate.
|
||||
|
||||
| Version | Supported | Support End: |
|
||||
| ------------------- | ------------------ | ------------ |
|
||||
| 2021.06 | :white_check_mark: | October 2021 |
|
||||
|
||||
| 2021.04 | :white_check_mark: | July 2021 |
|
||||
|
||||
### No Longer Supported
|
||||
These versions are no longer supported at all. It is strongly advised to update if you are running any of these versions.
|
||||
|
||||
| Version | Supported | Support Ended: |
|
||||
| ------------------- | ------------------ | ------------------- |
|
||||
| 2021.05 | :white_check_mark: | September 2021 |
|
||||
| 2021.04 | :white_check_mark: | July 2021 |
|
||||
| 2021.02 | :x: | 6 June 2021 |
|
||||
| 2020.11 | :x: | 3 May 2021 |
|
||||
| 6.0.x (Pre-Release) | :x: | December 2020 |
|
||||
|
143
pom.xml
143
pom.xml
@ -5,7 +5,7 @@
|
||||
|
||||
<groupId>me.totalfreedom</groupId>
|
||||
<artifactId>TotalFreedomMod</artifactId>
|
||||
<version>2022.02-RC01</version>
|
||||
<version>2021.05</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
@ -39,27 +39,21 @@
|
||||
</scm>
|
||||
|
||||
<repositories>
|
||||
|
||||
<repository>
|
||||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>networkmanager-repo</id>
|
||||
<url>https://repo.networkmanager.xyz/repository/maven-public/</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>atlas-nexus-01-totalfreedom-development</id>
|
||||
<url>https://nexus-01.core.atlas-media.co.uk/repository/totalfreedom-development/</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>CodeMC</id>
|
||||
<url>https://repo.codemc.org/repository/maven-public/</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>nms-repo</id>
|
||||
<url>https://repo.codemc.org/repository/nms/</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>spigot-repo</id>
|
||||
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
||||
@ -107,11 +101,14 @@
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>esentialsx-repo</id>
|
||||
<url>https://repo.essentialsx.net/releases/</url>
|
||||
<id>papermc</id>
|
||||
<url>https://papermc.io/repo/repository/maven-public/</url>
|
||||
</repository>
|
||||
|
||||
|
||||
<repository>
|
||||
<id>ess-repo</id>
|
||||
<url>https://ci.ender.zone/plugin/repository/everything/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
@ -119,28 +116,42 @@
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>2.11.0</version>
|
||||
<version>2.8.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>3.12.0</version>
|
||||
<version>3.11</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>commons-codec</groupId>
|
||||
<artifactId>commons-codec</artifactId>
|
||||
<version>1.15</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.speedxx</groupId>
|
||||
<artifactId>Mojangson</artifactId>
|
||||
<version>1957eef8d6</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.bstats</groupId>
|
||||
<artifactId>bstats-bukkit</artifactId>
|
||||
<version>2.2.1</version>
|
||||
<version>1.8</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.papermc.paper</groupId>
|
||||
<artifactId>paper-api</artifactId>
|
||||
<version>1.17.1-R0.1-SNAPSHOT</version>
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot</artifactId>
|
||||
<version>1.16.5-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
@ -161,7 +172,14 @@
|
||||
<dependency>
|
||||
<groupId>com.sk89q.worldedit</groupId>
|
||||
<artifactId>worldedit-bukkit</artifactId>
|
||||
<version>7.2.8</version>
|
||||
<version>7.3.0-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.ess3</groupId>
|
||||
<artifactId>EssentialsX</artifactId>
|
||||
<version>2.18.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
@ -175,14 +193,14 @@
|
||||
<dependency>
|
||||
<groupId>net.coreprotect</groupId>
|
||||
<artifactId>coreprotect</artifactId>
|
||||
<version>21.2</version>
|
||||
<version>19.3</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.sk89q.worldguard</groupId>
|
||||
<artifactId>worldguard-bukkit</artifactId>
|
||||
<version>7.0.6</version>
|
||||
<version>7.0.4</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
@ -201,9 +219,9 @@
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.essentialsx</groupId>
|
||||
<artifactId>EssentialsX</artifactId>
|
||||
<version>2.19.0</version>
|
||||
<groupId>net.goldtreeservers</groupId>
|
||||
<artifactId>worldguardextraflags</artifactId>
|
||||
<version>4.0.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
@ -217,83 +235,43 @@
|
||||
<dependency>
|
||||
<groupId>org.javassist</groupId>
|
||||
<artifactId>javassist</artifactId>
|
||||
<version>3.28.0-GA</version>
|
||||
<version>3.27.0-GA</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>me.totalfreedom</groupId>
|
||||
<artifactId>tfguilds</artifactId>
|
||||
<version>2021.06-RC2</version>
|
||||
<groupId>com.github.AtlasMediaGroup</groupId>
|
||||
<artifactId>TFGuilds</artifactId>
|
||||
<version>master-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.jetbrains</groupId>
|
||||
<artifactId>annotations</artifactId>
|
||||
<version>22.0.0</version>
|
||||
<version>20.1.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||
<version>3.1.2</version>
|
||||
<version>3.1.1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter</artifactId>
|
||||
<version>5.8.0</version>
|
||||
<version>5.4.2</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.eclipse.sisu</groupId>
|
||||
<artifactId>org.eclipse.sisu.inject</artifactId>
|
||||
<version>0.3.4</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.MilkBowl</groupId>
|
||||
<artifactId>VaultAPI</artifactId>
|
||||
<version>1.7</version>
|
||||
<scope>provided</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.bstats</groupId>
|
||||
<artifactId>bstats</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>nl.chimpgamer.networkmanager</groupId>
|
||||
<artifactId>api</artifactId>
|
||||
<version>2.11.4</version>
|
||||
<scope>provided</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>io.github.slimjar</groupId>
|
||||
<artifactId>slimjar</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.json</groupId>
|
||||
<artifactId>json</artifactId>
|
||||
<version>20220320</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>apache.snapshots</id>
|
||||
<url>https://repository.apache.org/snapshots/</url>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
|
||||
<build>
|
||||
<!-- Filter resources for build.properties -->
|
||||
<resources>
|
||||
@ -311,9 +289,9 @@
|
||||
<version>3.8.1</version>
|
||||
<configuration>
|
||||
<outputFileName>TotalFreedomMod.jar</outputFileName>
|
||||
<compilerVersion>17</compilerVersion>
|
||||
<source>17</source>
|
||||
<target>17</target>
|
||||
<compilerVersion>11</compilerVersion>
|
||||
<source>11</source>
|
||||
<target>11</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
@ -321,7 +299,7 @@
|
||||
<plugin>
|
||||
<groupId>pl.project13.maven</groupId>
|
||||
<artifactId>git-commit-id-plugin</artifactId>
|
||||
<version>4.9.10</version>
|
||||
<version>4.0.2</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>get-the-git-infos</id>
|
||||
@ -362,7 +340,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-antrun-plugin</artifactId>
|
||||
<version>3.0.0</version>
|
||||
<version>1.8</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>default-cli</id>
|
||||
@ -437,7 +415,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.3.1-SNAPSHOT</version>
|
||||
<version>3.2.4</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
@ -461,11 +439,12 @@
|
||||
<includes>
|
||||
<include>commons-io:commons-io</include>
|
||||
<include>org.apache.commons:commons-lang3</include>
|
||||
<include>commons-codec:commons-codec</include>
|
||||
<include>org.reflections:reflections</include>
|
||||
<include>org.javassist:javassist</include>
|
||||
<include>io.papermc:paperlib</include>
|
||||
<include>com.github.speedxx:Mojangson</include>
|
||||
<include>org.bstats:bstats-bukkit</include>
|
||||
<include>org.bstats:bstats-base</include>
|
||||
<include>org.jetbrains:annotations</include>
|
||||
</includes>
|
||||
</artifactSet>
|
||||
@ -483,7 +462,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||
<version>3.1.2</version>
|
||||
<version>3.1.1</version>
|
||||
<configuration>
|
||||
<configLocation>checkstyle.xml</configLocation>
|
||||
<failOnViolation>true</failOnViolation>
|
||||
|
@ -3,10 +3,7 @@ package me.totalfreedom.totalfreedommod;
|
||||
import io.papermc.lib.PaperLib;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
@ -22,7 +19,6 @@ import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerLoginEvent;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
public class LoginProcess extends FreedomService
|
||||
{
|
||||
@ -61,13 +57,13 @@ public class LoginProcess extends FreedomService
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event)
|
||||
{
|
||||
final Admin entry = plugin.al.getEntryByUuid(event.getUniqueId());
|
||||
final boolean isAdmin = entry != null && entry.isActive();
|
||||
final String ip = event.getAddress().getHostAddress().trim();
|
||||
final boolean isAdmin = plugin.al.getEntryByIp(ip) != null;
|
||||
|
||||
// Check if the player is already online
|
||||
for (Player onlinePlayer : server.getOnlinePlayers())
|
||||
{
|
||||
if (!onlinePlayer.getUniqueId().equals(event.getUniqueId()))
|
||||
if (!onlinePlayer.getName().equalsIgnoreCase(event.getName()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@ -89,7 +85,7 @@ public class LoginProcess extends FreedomService
|
||||
{
|
||||
final Player player = event.getPlayer();
|
||||
final String username = player.getName();
|
||||
final UUID uuid = player.getUniqueId();
|
||||
final String ip = event.getAddress().getHostAddress().trim();
|
||||
|
||||
// Check username length
|
||||
if (username.length() < MIN_USERNAME_LENGTH || username.length() > MAX_USERNAME_LENGTH)
|
||||
@ -123,8 +119,7 @@ public class LoginProcess extends FreedomService
|
||||
}
|
||||
|
||||
// Validation below this point
|
||||
final Admin entry = plugin.al.getEntryByUuid(uuid);
|
||||
if (entry != null && entry.isActive()) // Check if player is admin
|
||||
if (plugin.al.getEntryByIp(ip) != null) // Check if player is admin
|
||||
{
|
||||
// Force-allow log in
|
||||
event.allow();
|
||||
@ -179,9 +174,12 @@ public class LoginProcess extends FreedomService
|
||||
}
|
||||
|
||||
// Whitelist
|
||||
if (server.isWhitelistEnforced() && !player.isWhitelisted())
|
||||
if (plugin.si.isWhitelisted())
|
||||
{
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "You are not whitelisted on this server.");
|
||||
if (!plugin.si.getWhitelisted().contains(username.toLowerCase()))
|
||||
{
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "You are not whitelisted on this server.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -192,22 +190,6 @@ public class LoginProcess extends FreedomService
|
||||
final FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||
final PlayerData playerData = plugin.pl.getData(player);
|
||||
|
||||
// Sends a message to the player if they have never joined before (or simply lack player data).
|
||||
if (!event.getPlayer().hasPlayedBefore() && ConfigEntry.FIRST_JOIN_INFO_ENABLED.getBoolean())
|
||||
{
|
||||
new BukkitRunnable()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
for (String line : ConfigEntry.FIRST_JOIN_INFO.getStringList())
|
||||
{
|
||||
player.sendMessage(FUtil.colorize(line));
|
||||
}
|
||||
}
|
||||
}.runTaskLater(plugin, 20);
|
||||
}
|
||||
|
||||
player.sendTitle(FUtil.colorize(ConfigEntry.SERVER_LOGIN_TITLE.getString()), FUtil.colorize(ConfigEntry.SERVER_LOGIN_SUBTITLE.getString()), 20, 100, 60);
|
||||
player.setOp(true);
|
||||
|
||||
@ -222,7 +204,7 @@ public class LoginProcess extends FreedomService
|
||||
return;
|
||||
}
|
||||
|
||||
if (!playerData.getIps().contains(FUtil.getIp(player)))
|
||||
if (!playerData.hasVerification() && !playerData.getIps().contains(FUtil.getIp(player)))
|
||||
{
|
||||
playerData.addIp(FUtil.getIp(player));
|
||||
plugin.pl.save(playerData);
|
||||
|
@ -1,16 +1,17 @@
|
||||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import com.google.common.collect.Multimap;
|
||||
import ca.momothereal.mojangson.ex.MojangsonParseException;
|
||||
import ca.momothereal.mojangson.value.MojangsonCompound;
|
||||
import ca.momothereal.mojangson.value.MojangsonValue;
|
||||
import io.papermc.lib.PaperLib;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import net.minecraft.server.v1_16_R3.NBTTagCompound;
|
||||
import net.minecraft.server.v1_16_R3.NBTTagList;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.attribute.Attribute;
|
||||
import org.bukkit.attribute.AttributeModifier;
|
||||
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
@ -19,7 +20,6 @@ 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;
|
||||
|
||||
public class MovementValidator extends FreedomService
|
||||
{
|
||||
@ -133,49 +133,55 @@ public class MovementValidator extends FreedomService
|
||||
|
||||
private Boolean exploitItem(ItemStack item)
|
||||
{
|
||||
if (item == null)
|
||||
net.minecraft.server.v1_16_R3.ItemStack nmsStack = CraftItemStack.asNMSCopy(item);
|
||||
NBTTagList modifiers = getAttributeList(nmsStack);
|
||||
MojangsonCompound compound = new MojangsonCompound();
|
||||
boolean foundNegative = false;
|
||||
boolean foundPositive = false;
|
||||
try
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (meta != null)
|
||||
{
|
||||
Multimap<Attribute, AttributeModifier> attributes = meta.getAttributeModifiers();
|
||||
if (attributes != null)
|
||||
String mod = modifiers.toString();
|
||||
String fancy = ("{" + (mod.substring(1, mod.length() - 1).replace("{", "").replace("}", "")) + "}");
|
||||
compound.read(fancy);
|
||||
for (String key : compound.keySet())
|
||||
{
|
||||
Map<Attribute, Collection<AttributeModifier>> attrMap = attributes.asMap();
|
||||
|
||||
// For every attribute...
|
||||
for (Attribute attr : attributes.keySet())
|
||||
if (Objects.equals(key, "Amount")) //null-safe .equals()
|
||||
{
|
||||
// Default values
|
||||
boolean posInf = false;
|
||||
boolean negInf = false;
|
||||
|
||||
// For every AttributeModifier...
|
||||
for (AttributeModifier modifier : attrMap.get(attr))
|
||||
@SuppressWarnings("rawtypes")
|
||||
List<MojangsonValue> values = compound.get(key);
|
||||
for (MojangsonValue<?> val : values)
|
||||
{
|
||||
// Are they ∞ or -∞?
|
||||
if (modifier.getAmount() == Double.POSITIVE_INFINITY)
|
||||
if (val.getValue().toString().equals("Infinityd"))
|
||||
{
|
||||
posInf = true;
|
||||
foundPositive = true;
|
||||
}
|
||||
else if (modifier.getAmount() == Double.NEGATIVE_INFINITY)
|
||||
if (val.getValue().toString().equals("-Infinityd"))
|
||||
{
|
||||
negInf = true;
|
||||
foundNegative = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Are both values set as true?
|
||||
if (posInf && negInf)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return false;
|
||||
catch (MojangsonParseException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
return foundNegative && foundPositive;
|
||||
}
|
||||
|
||||
|
||||
private NBTTagList getAttributeList(net.minecraft.server.v1_16_R3.ItemStack stack)
|
||||
{
|
||||
if (stack.getTag() == null)
|
||||
{
|
||||
stack.setTag(new NBTTagCompound());
|
||||
}
|
||||
NBTTagList attr = stack.getTag().getList("AttributeModifiers", 10);
|
||||
if (attr == null)
|
||||
{
|
||||
stack.getTag().set("AttributeModifiers", new NBTTagList());
|
||||
}
|
||||
return stack.getTag().getList("AttributeModifiers", 10);
|
||||
}
|
||||
}
|
@ -3,7 +3,7 @@ package me.totalfreedom.totalfreedommod;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import com.google.common.base.Strings;
|
||||
import joptsimple.internal.Strings;
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
|
@ -0,0 +1,98 @@
|
||||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import static me.totalfreedom.totalfreedommod.util.FUtil.SAVED_FLAGS_FILENAME;
|
||||
|
||||
public class SavedFlags extends FreedomService
|
||||
{
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public Map<String, Boolean> getSavedFlags()
|
||||
{
|
||||
Map<String, Boolean> flags = null;
|
||||
File input = new File(TotalFreedomMod.getPlugin().getDataFolder(), SAVED_FLAGS_FILENAME);
|
||||
|
||||
if (input.exists())
|
||||
{
|
||||
try
|
||||
{
|
||||
try (FileInputStream fis = new FileInputStream(input); ObjectInputStream ois = new ObjectInputStream(fis))
|
||||
{
|
||||
flags = (HashMap<String, Boolean>)ois.readObject();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
public boolean getSavedFlag(String flag) throws Exception
|
||||
{
|
||||
Boolean flagValue = null;
|
||||
|
||||
Map<String, Boolean> flags = getSavedFlags();
|
||||
|
||||
if (flags != null)
|
||||
{
|
||||
if (flags.containsKey(flag))
|
||||
{
|
||||
flagValue = flags.get(flag);
|
||||
}
|
||||
}
|
||||
|
||||
if (flagValue != null)
|
||||
{
|
||||
return flagValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception();
|
||||
}
|
||||
}
|
||||
|
||||
public void setSavedFlag(String flag, boolean value)
|
||||
{
|
||||
Map<String, Boolean> flags = getSavedFlags();
|
||||
|
||||
if (flags == null)
|
||||
{
|
||||
flags = new HashMap<>();
|
||||
}
|
||||
|
||||
flags.put(flag, value);
|
||||
|
||||
try
|
||||
{
|
||||
final FileOutputStream fos = new FileOutputStream(new File(plugin.getDataFolder(), SAVED_FLAGS_FILENAME));
|
||||
final ObjectOutputStream oos = new ObjectOutputStream(fos);
|
||||
oos.writeObject(flags);
|
||||
oos.close();
|
||||
fos.close();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,83 @@
|
||||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.minecraft.server.v1_16_R3.EntityPlayer;
|
||||
import net.minecraft.server.v1_16_R3.MinecraftServer;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.craftbukkit.v1_16_R3.CraftServer;
|
||||
|
||||
public class ServerInterface extends FreedomService
|
||||
{
|
||||
public static final String COMPILE_NMS_VERSION = "v1_16_R3";
|
||||
|
||||
public static void warnVersion()
|
||||
{
|
||||
final String nms = FUtil.getNMSVersion();
|
||||
|
||||
if (!COMPILE_NMS_VERSION.equals(nms))
|
||||
{
|
||||
FLog.warning(TotalFreedomMod.pluginName + " is compiled for " + COMPILE_NMS_VERSION + " but the server is running version " + nms + "!");
|
||||
FLog.warning("This might result in unexpected behaviour!");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
public void setOnlineMode(boolean mode)
|
||||
{
|
||||
getServer().setOnlineMode(mode);
|
||||
}
|
||||
|
||||
public int purgeWhitelist()
|
||||
{
|
||||
String[] whitelisted = getServer().getPlayerList().getWhitelisted();
|
||||
int size = whitelisted.length;
|
||||
for (EntityPlayer player : getServer().getPlayerList().players)
|
||||
{
|
||||
getServer().getPlayerList().getWhitelist().remove(player.getProfile());
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
getServer().getPlayerList().getWhitelist().save();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.warning("Could not purge the whitelist!");
|
||||
FLog.warning(ex);
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
public boolean isWhitelisted()
|
||||
{
|
||||
return getServer().getPlayerList().getHasWhitelist();
|
||||
}
|
||||
|
||||
public List<?> getWhitelisted()
|
||||
{
|
||||
return Arrays.asList(getServer().getPlayerList().getWhitelisted());
|
||||
}
|
||||
|
||||
public String getVersion()
|
||||
{
|
||||
return getServer().getVersion();
|
||||
}
|
||||
|
||||
private MinecraftServer getServer()
|
||||
{
|
||||
return ((CraftServer)Bukkit.getServer()).getServer();
|
||||
}
|
||||
|
||||
}
|
@ -1,6 +1,5 @@
|
||||
package me.totalfreedom.totalfreedommod;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.Bukkit;
|
||||
@ -8,13 +7,8 @@ import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.server.ServerListPingEvent;
|
||||
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
public class ServerPing extends FreedomService
|
||||
{
|
||||
private final Gson gson = new Gson();
|
||||
private final VersionMeta meta = gson.fromJson(new InputStreamReader(Bukkit.class.getClassLoader().getResourceAsStream("version.json")),VersionMeta.class);
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
@ -60,7 +54,7 @@ public class ServerPing extends FreedomService
|
||||
return;
|
||||
}
|
||||
|
||||
String baseMotd = ConfigEntry.SERVER_MOTD.getString().replace("%mcversion%", meta.id);
|
||||
String baseMotd = ConfigEntry.SERVER_MOTD.getString().replace("%mcversion%", plugin.si.getVersion());
|
||||
baseMotd = baseMotd.replace("\\n", "\n");
|
||||
baseMotd = FUtil.colorize(baseMotd);
|
||||
|
||||
@ -79,9 +73,4 @@ public class ServerPing extends FreedomService
|
||||
|
||||
event.setMotd(motd.toString().trim());
|
||||
}
|
||||
|
||||
private static class VersionMeta
|
||||
{
|
||||
private String id;
|
||||
}
|
||||
}
|
@ -3,7 +3,6 @@ package me.totalfreedom.totalfreedommod;
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.util.Properties;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.admin.ActivityLog;
|
||||
import me.totalfreedom.totalfreedommod.admin.AdminList;
|
||||
import me.totalfreedom.totalfreedommod.banning.BanManager;
|
||||
@ -15,6 +14,7 @@ import me.totalfreedom.totalfreedommod.blocking.InteractBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.MobBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.PVPBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.PotionBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.SignBlocker;
|
||||
import me.totalfreedom.totalfreedommod.blocking.command.CommandBlocker;
|
||||
import me.totalfreedom.totalfreedommod.bridge.BukkitTelnetBridge;
|
||||
import me.totalfreedom.totalfreedommod.bridge.CoreProtectBridge;
|
||||
@ -36,10 +36,6 @@ import me.totalfreedom.totalfreedommod.fun.Trailer;
|
||||
import me.totalfreedom.totalfreedommod.httpd.HTTPDaemon;
|
||||
import me.totalfreedom.totalfreedommod.permissions.PermissionConfig;
|
||||
import me.totalfreedom.totalfreedommod.permissions.PermissionManager;
|
||||
import me.totalfreedom.totalfreedommod.permissions.handler.DefaultPermissionHandler;
|
||||
import me.totalfreedom.totalfreedommod.permissions.handler.IPermissionHandler;
|
||||
import me.totalfreedom.totalfreedommod.permissions.handler.NMPermissionHandler;
|
||||
import me.totalfreedom.totalfreedommod.permissions.handler.VaultPermissionHandler;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerList;
|
||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentList;
|
||||
import me.totalfreedom.totalfreedommod.rank.RankManager;
|
||||
@ -58,6 +54,7 @@ import org.bukkit.generator.ChunkGenerator;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.spigotmc.SpigotConfig;
|
||||
|
||||
public class TotalFreedomMod extends JavaPlugin
|
||||
{
|
||||
@ -77,6 +74,8 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
// Command Loader
|
||||
public CommandLoader cl;
|
||||
// Services
|
||||
public ServerInterface si;
|
||||
public SavedFlags sf;
|
||||
public WorldManager wm;
|
||||
public LogViewer lv;
|
||||
public AdminList al;
|
||||
@ -123,6 +122,7 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
public Trailer tr;
|
||||
public HTTPDaemon hd;
|
||||
public WorldRestrictions wr;
|
||||
public SignBlocker snp;
|
||||
public EntityWiper ew;
|
||||
public Sitter st;
|
||||
public VanishHandler vh;
|
||||
@ -137,8 +137,6 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
public WorldEditBridge web;
|
||||
public WorldGuardBridge wgb;
|
||||
|
||||
public IPermissionHandler permissionHandler;
|
||||
|
||||
public static TotalFreedomMod getPlugin()
|
||||
{
|
||||
return plugin;
|
||||
@ -150,7 +148,7 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
{
|
||||
if (plugin.getName().equalsIgnoreCase(pluginName))
|
||||
{
|
||||
return (TotalFreedomMod) plugin;
|
||||
return (TotalFreedomMod)plugin;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
@ -179,6 +177,9 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
final MethodTimer timer = new MethodTimer();
|
||||
timer.start();
|
||||
|
||||
// Warn if we're running on a wrong version
|
||||
ServerInterface.warnVersion();
|
||||
|
||||
// Delete unused files
|
||||
FUtil.deleteCoreDumps();
|
||||
FUtil.deleteFolder(new File("./_deleteme"));
|
||||
@ -186,6 +187,7 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
fsh = new FreedomServiceHandler();
|
||||
|
||||
config = new MainConfig();
|
||||
config.load();
|
||||
|
||||
if (FUtil.inDeveloperMode())
|
||||
{
|
||||
@ -211,24 +213,13 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
FLog.info("Started " + fsh.getServiceAmount() + " services.");
|
||||
|
||||
timer.update();
|
||||
FLog.info("Version " + pluginVersion + " enabled in " + timer.getTotal() + "ms");
|
||||
FLog.info("Version " + pluginVersion + " for " + ServerInterface.COMPILE_NMS_VERSION + " enabled in " + timer.getTotal() + "ms");
|
||||
|
||||
// Metrics @ https://bstats.org/plugin/bukkit/TotalFreedomMod/2966
|
||||
new Metrics(this, 2966);
|
||||
|
||||
if (getServer().getPluginManager().isPluginEnabled("NetworkManager"))
|
||||
{
|
||||
FLog.info("Using NetworkManager's permission handling");
|
||||
this.permissionHandler = new NMPermissionHandler(this);
|
||||
} else if (getServer().getPluginManager().isPluginEnabled("Vault"))
|
||||
{
|
||||
FLog.info("Using Vault's permission handling");
|
||||
this.permissionHandler = new VaultPermissionHandler(this);
|
||||
} else
|
||||
{
|
||||
FLog.info("Using Bukkit's native permission handling");
|
||||
this.permissionHandler = new DefaultPermissionHandler();
|
||||
}
|
||||
// little workaround to stop spigot from autorestarting - causing AMP to detach from process.
|
||||
SpigotConfig.config.set("settings.restart-on-crash", false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -276,7 +267,8 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
date = props.getProperty("buildDate", "unknown");
|
||||
// Need to do this or it will display ${git.commit.id.abbrev}
|
||||
head = props.getProperty("buildHead", "unknown").replace("${git.commit.id.abbrev}", "unknown");
|
||||
} catch (Exception ex)
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe("Could not load build properties! Did you compile with NetBeans/Maven?");
|
||||
FLog.severe(ex);
|
||||
@ -306,6 +298,8 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
private void initServices()
|
||||
{
|
||||
// Start services
|
||||
si = new ServerInterface();
|
||||
sf = new SavedFlags();
|
||||
wm = new WorldManager();
|
||||
lv = new LogViewer();
|
||||
sql = new SQLite();
|
||||
@ -333,6 +327,7 @@ public class TotalFreedomMod extends JavaPlugin
|
||||
im = new IndefiniteBanList();
|
||||
pem = new PermissionManager();
|
||||
gr = new GameRuleHandler();
|
||||
snp = new SignBlocker();
|
||||
ew = new EntityWiper();
|
||||
st = new Sitter();
|
||||
vh = new VanishHandler();
|
||||
|
@ -2,8 +2,11 @@ package me.totalfreedom.totalfreedommod.admin;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import me.totalfreedom.totalfreedommod.LogViewer.LogsRegistrationMode;
|
||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
@ -15,8 +18,10 @@ import org.bukkit.entity.Player;
|
||||
|
||||
public class Admin
|
||||
{
|
||||
|
||||
|
||||
private final List<String> ips = new ArrayList<>();
|
||||
private UUID uuid;
|
||||
private String name;
|
||||
private boolean active = true;
|
||||
private Rank rank = Rank.ADMIN;
|
||||
private Date lastLogin = new Date();
|
||||
@ -27,7 +32,7 @@ public class Admin
|
||||
|
||||
public Admin(Player player)
|
||||
{
|
||||
uuid = player.getUniqueId();
|
||||
this.name = player.getName();
|
||||
this.ips.add(FUtil.getIp(player));
|
||||
}
|
||||
|
||||
@ -35,7 +40,7 @@ public class Admin
|
||||
{
|
||||
try
|
||||
{
|
||||
this.uuid = UUID.fromString(resultSet.getString("uuid"));
|
||||
this.name = resultSet.getString("username");
|
||||
this.active = resultSet.getBoolean("active");
|
||||
this.rank = Rank.findRank(resultSet.getString("rank"));
|
||||
this.ips.clear();
|
||||
@ -57,7 +62,7 @@ public class Admin
|
||||
{
|
||||
final StringBuilder output = new StringBuilder();
|
||||
|
||||
output.append("Admin: ").append(getName()).append("\n")
|
||||
output.append("Admin: ").append(name).append("\n")
|
||||
.append("- IPs: ").append(StringUtils.join(ips, ", ")).append("\n")
|
||||
.append("- Last Login: ").append(FUtil.dateToString(lastLogin)).append("\n")
|
||||
.append("- Rank: ").append(rank.getName()).append("\n")
|
||||
@ -73,7 +78,7 @@ public class Admin
|
||||
{
|
||||
Map<String, Object> map = new HashMap<String, Object>()
|
||||
{{
|
||||
put("uuid", uuid.toString());
|
||||
put("username", name);
|
||||
put("active", active);
|
||||
put("rank", rank.toString());
|
||||
put("ips", FUtil.listToString(ips));
|
||||
@ -115,20 +120,20 @@ public class Admin
|
||||
|
||||
public boolean isValid()
|
||||
{
|
||||
return uuid != null
|
||||
return name != null
|
||||
&& rank != null
|
||||
&& !ips.isEmpty()
|
||||
&& lastLogin != null;
|
||||
}
|
||||
|
||||
public UUID getUuid()
|
||||
{
|
||||
return uuid;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
{
|
||||
return Bukkit.getOfflinePlayer(uuid).getName();
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name)
|
||||
{
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public boolean isActive()
|
||||
|
@ -2,31 +2,30 @@ package me.totalfreedom.totalfreedommod.admin;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Sets;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.permissions.handler.NMPermissionHandler;
|
||||
import me.totalfreedom.totalfreedommod.permissions.handler.VaultPermissionHandler;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.ConsoleCommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class AdminList extends FreedomService
|
||||
{
|
||||
public static final List<String> vanished = new ArrayList<>();
|
||||
public final Map<String, List<String>> verifiedNoAdmin = Maps.newHashMap();
|
||||
private final Set<Admin> allAdmins = Sets.newHashSet(); // Includes disabled admins
|
||||
// Only active admins below
|
||||
private final Set<Admin> activeAdmins = Sets.newHashSet();
|
||||
private final Map<UUID, Admin> uuidTable = Maps.newHashMap();
|
||||
private final Map<String, Admin> nameTable = Maps.newHashMap();
|
||||
private final Map<String, Admin> ipTable = Maps.newHashMap();
|
||||
|
||||
@ -60,13 +59,14 @@ public class AdminList extends FreedomService
|
||||
allAdmins.add(admin);
|
||||
}
|
||||
}
|
||||
} catch (SQLException e)
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
FLog.severe("Failed to load admin list: " + e.getMessage());
|
||||
}
|
||||
|
||||
updateTables();
|
||||
FLog.info("Loaded " + allAdmins.size() + " admins (" + uuidTable.size() + " active, " + ipTable.size() + " IPs)");
|
||||
FLog.info("Loaded " + allAdmins.size() + " admins (" + nameTable.size() + " active, " + ipTable.size() + " IPs)");
|
||||
}
|
||||
|
||||
public void messageAllAdmins(String message)
|
||||
@ -114,7 +114,7 @@ public class AdminList extends FreedomService
|
||||
return true;
|
||||
}
|
||||
|
||||
Admin admin = getAdmin((Player) sender);
|
||||
Admin admin = getAdmin((Player)sender);
|
||||
|
||||
return admin != null && admin.isActive();
|
||||
}
|
||||
@ -125,48 +125,28 @@ public class AdminList extends FreedomService
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (plugin.permissionHandler instanceof NMPermissionHandler || plugin.permissionHandler instanceof VaultPermissionHandler)
|
||||
{
|
||||
// FLog.debug("Using " + plugin.permissionHandler.getClass().getSimpleName() + " for AdminList#isAdmin");
|
||||
return plugin.permissionHandler.inGroup(player, ConfigEntry.PERMISSIONS_GROUPS_ADMIN.getString());
|
||||
}
|
||||
// FLog.debug("AdminList#isAdmin: Returning false because there is no permissions plugin that supports groups on the server");
|
||||
return false;
|
||||
|
||||
/*Admin admin = getAdmin(player);
|
||||
Admin admin = getAdmin(player);
|
||||
|
||||
return admin != null && admin.isActive();*/
|
||||
return admin != null && admin.isActive();
|
||||
}
|
||||
|
||||
public boolean isSeniorAdmin(CommandSender sender)
|
||||
{
|
||||
//TODO: BukkitTelnet checks, but fuck that plugin
|
||||
if (sender instanceof ConsoleCommandSender)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (sender instanceof Player player && (plugin.permissionHandler instanceof NMPermissionHandler || plugin.permissionHandler instanceof VaultPermissionHandler))
|
||||
{
|
||||
// FLog.debug("Using " + plugin.permissionHandler.getClass().getSimpleName() + " for AdminList#isSeniorAdmin");
|
||||
return plugin.permissionHandler.inGroup(player, ConfigEntry.PERMISSIONS_GROUPS_SENIOR.getString());
|
||||
}
|
||||
// FLog.debug("AdminList#isSeniorAdmin: Returning false because there is no permissions plugin that supports groups on the server");
|
||||
return false;
|
||||
// return plugin.permissionHandler.hasPermission(sender, "totalfreedommod.admin");
|
||||
/*Admin admin = getAdmin(sender);
|
||||
Admin admin = getAdmin(sender);
|
||||
if (admin == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return admin.getRank().ordinal() >= Rank.SENIOR_ADMIN.ordinal();*/
|
||||
return admin.getRank().ordinal() >= Rank.SENIOR_ADMIN.ordinal();
|
||||
}
|
||||
|
||||
public Admin getAdmin(CommandSender sender)
|
||||
{
|
||||
if (sender instanceof Player)
|
||||
{
|
||||
return getAdmin((Player) sender);
|
||||
return getAdmin((Player)sender);
|
||||
}
|
||||
|
||||
return getEntryByName(sender.getName());
|
||||
@ -174,20 +154,40 @@ public class AdminList extends FreedomService
|
||||
|
||||
public Admin getAdmin(Player player)
|
||||
{
|
||||
final String ip = FUtil.getIp(player);
|
||||
final Admin entry = getEntryByUuid(player.getUniqueId());
|
||||
// Find admin
|
||||
String ip = FUtil.getIp(player);
|
||||
Admin admin = getEntryByName(player.getName());
|
||||
|
||||
if (entry != null && !entry.getIps().contains(ip))
|
||||
// Admin by name
|
||||
if (admin != null)
|
||||
{
|
||||
entry.addIp(ip);
|
||||
// Check if we're in online mode,
|
||||
// Or the players IP is in the admin entry
|
||||
if (Bukkit.getOnlineMode() || admin.getIps().contains(ip))
|
||||
{
|
||||
if (!admin.getIps().contains(ip))
|
||||
{
|
||||
// Add the new IP if we have to
|
||||
admin.addIp(ip);
|
||||
save(admin);
|
||||
updateTables();
|
||||
}
|
||||
return admin;
|
||||
}
|
||||
}
|
||||
|
||||
return entry;
|
||||
}
|
||||
// Admin by ip
|
||||
admin = getEntryByIp(ip);
|
||||
if (admin != null)
|
||||
{
|
||||
// Set the new username
|
||||
String oldName = admin.getName();
|
||||
admin.setName(player.getName());
|
||||
plugin.sql.updateAdminName(oldName, admin.getName());
|
||||
updateTables();
|
||||
}
|
||||
|
||||
public Admin getEntryByUuid(UUID uuid)
|
||||
{
|
||||
return uuidTable.get(uuid);
|
||||
return null;
|
||||
}
|
||||
|
||||
public Admin getEntryByName(String name)
|
||||
@ -200,6 +200,25 @@ public class AdminList extends FreedomService
|
||||
return ipTable.get(ip);
|
||||
}
|
||||
|
||||
public Admin getEntryByIpFuzzy(String needleIp)
|
||||
{
|
||||
final Admin directAdmin = getEntryByIp(needleIp);
|
||||
if (directAdmin != null)
|
||||
{
|
||||
return directAdmin;
|
||||
}
|
||||
|
||||
for (String ip : ipTable.keySet())
|
||||
{
|
||||
if (FUtil.fuzzyIpMatch(needleIp, ip, 3))
|
||||
{
|
||||
return ipTable.get(ip);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void updateLastLogin(Player player)
|
||||
{
|
||||
final Admin admin = getAdmin(player);
|
||||
@ -209,9 +228,31 @@ public class AdminList extends FreedomService
|
||||
}
|
||||
|
||||
admin.setLastLogin(new Date());
|
||||
admin.setName(player.getName());
|
||||
save(admin);
|
||||
}
|
||||
|
||||
public boolean isAdminImpostor(Player player)
|
||||
{
|
||||
return getEntryByName(player.getName()) != null && !isAdmin(player) && !isVerifiedAdmin(player);
|
||||
}
|
||||
|
||||
public boolean isVerifiedAdmin(Player player)
|
||||
{
|
||||
return verifiedNoAdmin.containsKey(player.getName()) && verifiedNoAdmin.get(player.getName()).contains(FUtil.getIp(player));
|
||||
}
|
||||
|
||||
public boolean isIdentityMatched(Player player)
|
||||
{
|
||||
if (Bukkit.getOnlineMode())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
Admin admin = getAdmin(player);
|
||||
return admin != null && admin.getName().equalsIgnoreCase(player.getName());
|
||||
}
|
||||
|
||||
public boolean addAdmin(Admin admin)
|
||||
{
|
||||
if (!admin.isValid())
|
||||
@ -256,7 +297,6 @@ public class AdminList extends FreedomService
|
||||
public void updateTables()
|
||||
{
|
||||
activeAdmins.clear();
|
||||
uuidTable.clear();
|
||||
nameTable.clear();
|
||||
ipTable.clear();
|
||||
|
||||
@ -268,13 +308,13 @@ public class AdminList extends FreedomService
|
||||
}
|
||||
|
||||
activeAdmins.add(admin);
|
||||
uuidTable.put(admin.getUuid(), admin);
|
||||
nameTable.put(admin.getName().toLowerCase(), admin);
|
||||
|
||||
for (String ip : admin.getIps())
|
||||
{
|
||||
ipTable.put(ip, admin);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -292,7 +332,7 @@ public class AdminList extends FreedomService
|
||||
{
|
||||
try
|
||||
{
|
||||
ResultSet currentSave = plugin.sql.getAdminByUuid(admin.getUuid());
|
||||
ResultSet currentSave = plugin.sql.getAdminByName(admin.getName());
|
||||
for (Map.Entry<String, Object> entry : admin.toSQLStorable().entrySet())
|
||||
{
|
||||
Object storedValue = plugin.sql.getValue(currentSave, entry.getKey(), entry.getValue());
|
||||
@ -301,7 +341,8 @@ public class AdminList extends FreedomService
|
||||
plugin.sql.setAdminValue(admin, entry.getKey(), entry.getValue());
|
||||
}
|
||||
}
|
||||
} catch (SQLException e)
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
FLog.severe("Failed to save admin: " + e.getMessage());
|
||||
}
|
||||
@ -360,4 +401,9 @@ public class AdminList extends FreedomService
|
||||
{
|
||||
return ipTable;
|
||||
}
|
||||
|
||||
public Map<String, List<String>> getVerifiedNoAdmin()
|
||||
{
|
||||
return verifiedNoAdmin;
|
||||
}
|
||||
}
|
@ -4,8 +4,6 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import io.papermc.paper.event.player.PlayerSignCommandPreprocessEvent;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
@ -267,10 +265,4 @@ public class EventBlocker extends FreedomService
|
||||
FUtil.fixCommandVoid(event.getEntity());
|
||||
event.setDeathMessage(event.getDeathMessage());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onSignInteract(PlayerSignCommandPreprocessEvent event)
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,67 @@
|
||||
package me.totalfreedom.totalfreedommod.blocking;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import net.minecraft.server.v1_16_R3.NBTTagCompound;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Tag;
|
||||
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
//codebeat:disable[LOC,ABC]
|
||||
|
||||
public class SignBlocker extends FreedomService
|
||||
{
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop()
|
||||
{
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public void onPlayerPlaceBlock(BlockPlaceEvent event)
|
||||
{
|
||||
|
||||
final Player player = event.getPlayer();
|
||||
if (Tag.SIGNS.getValues().contains(event.getBlock().getType()))
|
||||
{
|
||||
ItemStack sign = event.getItemInHand();
|
||||
net.minecraft.server.v1_16_R3.ItemStack nmsSign = CraftItemStack.asNMSCopy(sign);
|
||||
NBTTagCompound compound = (nmsSign.hasTag()) ? nmsSign.getTag() : new NBTTagCompound();
|
||||
assert compound != null;
|
||||
NBTTagCompound bet = compound.getCompound("BlockEntityTag");
|
||||
String line1 = bet.getString("Text1");
|
||||
String line2 = bet.getString("Text2");
|
||||
String line3 = bet.getString("Text3");
|
||||
String line4 = bet.getString("Text4");
|
||||
if (line1.contains("run_command") || line2.contains("run_command") || line3.contains("run_command") || line4.contains("run_command"))
|
||||
{
|
||||
player.sendMessage(ChatColor.GRAY + "You are not allowed to place command signs.");
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void onPlayerInteractSign(PlayerInteractEvent event)
|
||||
{
|
||||
if (event.getAction() != Action.RIGHT_CLICK_BLOCK)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.getClickedBlock() != null && Tag.SIGNS.getValues().contains(event.getClickedBlock().getType()))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
@ -2,10 +2,10 @@ package me.totalfreedom.totalfreedommod.blocking.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.spigotmc.SpigotConfig;
|
||||
|
||||
public class CommandBlockerEntry
|
||||
{
|
||||
@ -45,7 +45,7 @@ public class CommandBlockerEntry
|
||||
}
|
||||
if (action == CommandBlockerAction.BLOCK_UNKNOWN)
|
||||
{
|
||||
sender.sendMessage(Bukkit.spigot().getSpigotConfig().getString("messages.unknown-command"));
|
||||
sender.sendMessage(SpigotConfig.unknownCommandMessage);
|
||||
return;
|
||||
}
|
||||
FUtil.playerMsg(sender, FUtil.colorize(message));
|
||||
|
@ -42,7 +42,7 @@ public class BukkitTelnetBridge extends FreedomService
|
||||
return;
|
||||
}
|
||||
|
||||
final Admin admin = plugin.al.getEntryByIp(ip);
|
||||
final Admin admin = plugin.al.getEntryByIpFuzzy(ip);
|
||||
|
||||
if (admin == null || !admin.isActive() || !admin.getRank().hasConsoleVariant())
|
||||
{
|
||||
|
@ -192,6 +192,7 @@ public class CoreProtectBridge extends FreedomService
|
||||
return (megabytes / 1024);
|
||||
}
|
||||
|
||||
// Wipes DB for the specified world
|
||||
public void clearDatabase(World world)
|
||||
{
|
||||
clearDatabase(world, false);
|
||||
@ -259,6 +260,12 @@ public class CoreProtectBridge extends FreedomService
|
||||
{
|
||||
FLog.warning("Failed to delete the CoreProtect data for the " + world.getName());
|
||||
}
|
||||
|
||||
// This exits for flatlands wipes
|
||||
if (shutdown)
|
||||
{
|
||||
server.shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
@ -269,25 +276,8 @@ public class CoreProtectBridge extends FreedomService
|
||||
Block block = event.getClickedBlock();
|
||||
final CoreProtectAPI coreProtect = getCoreProtectAPI();
|
||||
|
||||
// TODO: Rewrite this
|
||||
if (data.hasInspection())
|
||||
{
|
||||
int cooldownTime = 3;
|
||||
|
||||
// Cooldown check
|
||||
if ((event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_BLOCK)
|
||||
&& cooldown.containsKey(player.getName()))
|
||||
{
|
||||
long secondsLeft = getSecondsLeft(cooldown.get(player.getName()), cooldownTime);
|
||||
if (secondsLeft > 0L)
|
||||
{
|
||||
event.setCancelled(true);
|
||||
player.sendMessage(ChatColor.RED + String.valueOf(secondsLeft) + " seconds left before next query.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Actual lookup time
|
||||
if (event.getAction() == Action.LEFT_CLICK_BLOCK)
|
||||
{
|
||||
if (block != null)
|
||||
@ -295,6 +285,19 @@ public class CoreProtectBridge extends FreedomService
|
||||
event.setCancelled(true);
|
||||
List<String[]> lookup = coreProtect.blockLookup(block, -1);
|
||||
|
||||
int cooldownTime = 3;
|
||||
|
||||
if (cooldown.containsKey(player.getName()))
|
||||
{
|
||||
long secondsLeft = getSecondsLeft(cooldown.get(player.getName()), cooldownTime);
|
||||
if (secondsLeft > 0L)
|
||||
{
|
||||
event.setCancelled(true);
|
||||
player.sendMessage(ChatColor.RED + String.valueOf(secondsLeft) + " seconds left before next query.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!plugin.al.isAdmin(player))
|
||||
{
|
||||
cooldown.put(player.getName(), System.currentTimeMillis());
|
||||
@ -361,75 +364,91 @@ public class CoreProtectBridge extends FreedomService
|
||||
{
|
||||
if (block != null)
|
||||
{
|
||||
BlockState blockState = block.getRelative(event.getBlockFace()).getState();
|
||||
Block placedBlock = blockState.getBlock();
|
||||
event.setCancelled(true);
|
||||
List<String[]> lookup = coreProtect.blockLookup(placedBlock, -1);
|
||||
|
||||
if (lookup.isEmpty())
|
||||
if (data.hasInspection())
|
||||
{
|
||||
lookup = coreProtect.blockLookup(block, -1);
|
||||
}
|
||||
BlockState blockState = block.getRelative(event.getBlockFace()).getState();
|
||||
Block placedBlock = blockState.getBlock();
|
||||
event.setCancelled(true);
|
||||
List<String[]> lookup = coreProtect.blockLookup(placedBlock, -1);
|
||||
|
||||
if (!plugin.al.isAdmin(player))
|
||||
{
|
||||
cooldown.put(player.getName(), System.currentTimeMillis());
|
||||
}
|
||||
|
||||
if (lookup != null)
|
||||
{
|
||||
if (lookup.isEmpty())
|
||||
{
|
||||
player.sendMessage(net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector " + ChatColor.WHITE + "- " + "No block data found for this location");
|
||||
return;
|
||||
lookup = coreProtect.blockLookup(block, -1);
|
||||
}
|
||||
|
||||
HISTORY_MAP.remove(event.getPlayer());
|
||||
HISTORY_MAP.put(event.getPlayer(), new FUtil.PaginationList<>(10));
|
||||
FUtil.PaginationList<String> paged = HISTORY_MAP.get(event.getPlayer());
|
||||
int cooldownTime = 3;
|
||||
|
||||
player.sendMessage("---- " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector" + ChatColor.WHITE + " ---- " +
|
||||
ChatColor.GRAY + "(x" + block.getX() + "/" + "y" + block.getY() + "/" + "z" + block.getZ() + ")");
|
||||
|
||||
for (String[] value : lookup)
|
||||
if (cooldown.containsKey(player.getName()))
|
||||
{
|
||||
CoreProtectAPI.ParseResult result = coreProtect.parseResult(value);
|
||||
BlockData bl = result.getBlockData();
|
||||
|
||||
String s;
|
||||
String st = "";
|
||||
|
||||
if (result.getActionString().equals("Placement"))
|
||||
long secondsLeft = getSecondsLeft(cooldown.get(player.getName()), cooldownTime);
|
||||
if (secondsLeft > 0L)
|
||||
{
|
||||
s = " placed ";
|
||||
event.setCancelled(true);
|
||||
player.sendMessage(ChatColor.RED + String.valueOf(secondsLeft) + " seconds left before next query.");
|
||||
return;
|
||||
}
|
||||
else if (result.getActionString().equals("Removal"))
|
||||
{
|
||||
s = " broke ";
|
||||
}
|
||||
else
|
||||
{
|
||||
s = " interacted with ";
|
||||
}
|
||||
|
||||
if (result.isRolledBack())
|
||||
{
|
||||
st += "§m";
|
||||
}
|
||||
|
||||
int time = (int)(System.currentTimeMillis() / 1000L);
|
||||
|
||||
paged.add(ChatColor.GRAY + getTimeAgo(result.getTime(), time) + ChatColor.WHITE + " - " + net.md_5.bungee.api.ChatColor.of("#30ade4") +
|
||||
st + result.getPlayer() + ChatColor.WHITE + st + s + net.md_5.bungee.api.ChatColor.of("#30ade4") + st + bl.getMaterial().toString().toLowerCase());
|
||||
}
|
||||
|
||||
List<String> page = paged.getPage(1);
|
||||
for (String entries : page)
|
||||
if (!plugin.al.isAdmin(player))
|
||||
{
|
||||
player.sendMessage(entries);
|
||||
cooldown.put(player.getName(), System.currentTimeMillis());
|
||||
}
|
||||
|
||||
player.sendMessage("Page 1/" + paged.getPageCount() + " | To index through the pages, type " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "/ins history <page>");
|
||||
if (lookup != null)
|
||||
{
|
||||
if (lookup.isEmpty())
|
||||
{
|
||||
player.sendMessage(net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector " + ChatColor.WHITE + "- " + "No block data found for this location");
|
||||
return;
|
||||
}
|
||||
|
||||
HISTORY_MAP.remove(event.getPlayer());
|
||||
HISTORY_MAP.put(event.getPlayer(), new FUtil.PaginationList<>(10));
|
||||
FUtil.PaginationList<String> paged = HISTORY_MAP.get(event.getPlayer());
|
||||
|
||||
player.sendMessage("---- " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector" + ChatColor.WHITE + " ---- " +
|
||||
ChatColor.GRAY + "(x" + block.getX() + "/" + "y" + block.getY() + "/" + "z" + block.getZ() + ")");
|
||||
|
||||
for (String[] value : lookup)
|
||||
{
|
||||
CoreProtectAPI.ParseResult result = coreProtect.parseResult(value);
|
||||
BlockData bl = result.getBlockData();
|
||||
|
||||
String s;
|
||||
String st = "";
|
||||
|
||||
if (result.getActionString().equals("Placement"))
|
||||
{
|
||||
s = " placed ";
|
||||
}
|
||||
else if (result.getActionString().equals("Removal"))
|
||||
{
|
||||
s = " broke ";
|
||||
}
|
||||
else
|
||||
{
|
||||
s = " interacted with ";
|
||||
}
|
||||
|
||||
if (result.isRolledBack())
|
||||
{
|
||||
st += "§m";
|
||||
}
|
||||
|
||||
int time = (int)(System.currentTimeMillis() / 1000L);
|
||||
|
||||
paged.add(ChatColor.GRAY + getTimeAgo(result.getTime(), time) + ChatColor.WHITE + " - " + net.md_5.bungee.api.ChatColor.of("#30ade4") +
|
||||
st + result.getPlayer() + ChatColor.WHITE + st + s + net.md_5.bungee.api.ChatColor.of("#30ade4") + st + bl.getMaterial().toString().toLowerCase());
|
||||
}
|
||||
|
||||
List<String> page = paged.getPage(1);
|
||||
for (String entries : page)
|
||||
{
|
||||
player.sendMessage(entries);
|
||||
}
|
||||
|
||||
player.sendMessage("Page 1/" + paged.getPageCount() + " | To index through the pages, type " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "/ins history <page>");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -114,7 +114,8 @@ public class EssentialsBridge extends FreedomService
|
||||
User user = getEssentialsUser(username);
|
||||
if (user != null)
|
||||
{
|
||||
return user.getLastOnlineActivity();
|
||||
Long l = FUtil.getField(user, "lastActivity");
|
||||
return (l != null) ? l : 0L;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@ -48,6 +48,52 @@ public class WorldEditBridge extends FreedomService
|
||||
return worldeditPlugin;
|
||||
}
|
||||
|
||||
public void undo(Player player, int count)
|
||||
{
|
||||
try
|
||||
{
|
||||
LocalSession session = getPlayerSession(player);
|
||||
if (session != null)
|
||||
{
|
||||
final BukkitPlayer bukkitPlayer = getBukkitPlayer(player);
|
||||
if (bukkitPlayer != null)
|
||||
{
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
session.undo(session.getBlockBag(bukkitPlayer), bukkitPlayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public void redo(Player player, int count)
|
||||
{
|
||||
try
|
||||
{
|
||||
LocalSession session = getPlayerSession(player);
|
||||
if (session != null)
|
||||
{
|
||||
final BukkitPlayer bukkitPlayer = getBukkitPlayer(player);
|
||||
if (bukkitPlayer != null)
|
||||
{
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
session.redo(session.getBlockBag(bukkitPlayer), bukkitPlayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public void setLimit(Player player, int limit)
|
||||
{
|
||||
try
|
||||
@ -107,4 +153,23 @@ public class WorldEditBridge extends FreedomService
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private BukkitPlayer getBukkitPlayer(Player player)
|
||||
{
|
||||
final WorldEditPlugin wep = getWorldEditPlugin();
|
||||
if (wep == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return wep.wrapPlayer(player);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,13 +1,13 @@
|
||||
package me.totalfreedom.totalfreedommod.bridge;
|
||||
|
||||
import com.sk89q.worldguard.LocalPlayer;
|
||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||
import com.sk89q.worldguard.WorldGuard;
|
||||
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
|
||||
import com.sk89q.worldguard.protection.managers.RegionManager;
|
||||
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
|
||||
import com.sk89q.worldguard.protection.regions.RegionContainer;
|
||||
|
||||
import com.sk89q.worldguard.protection.regions.RegionQuery;
|
||||
import java.util.Map;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
public class WorldGuardBridge extends FreedomService
|
||||
@ -15,6 +15,7 @@ public class WorldGuardBridge extends FreedomService
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
plugin.wr.protectWorld(plugin.wm.masterBuilderWorld.getWorld());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -22,21 +23,26 @@ public class WorldGuardBridge extends FreedomService
|
||||
{
|
||||
}
|
||||
|
||||
public boolean canEditCurrentWorld(Player player)
|
||||
public RegionManager getRegionManager(World world)
|
||||
{
|
||||
// If WorldGuard integration is enabled, do a check with it.
|
||||
if (isEnabled())
|
||||
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
|
||||
return container.get(BukkitAdapter.adapt(world));
|
||||
}
|
||||
|
||||
public int wipeRegions(World world)
|
||||
{
|
||||
int count = 0;
|
||||
RegionManager regionManager = getRegionManager(world);
|
||||
if (regionManager != null)
|
||||
{
|
||||
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
|
||||
|
||||
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
|
||||
RegionQuery query = container.createQuery();
|
||||
|
||||
return query.testBuild(localPlayer.getLocation(), localPlayer);
|
||||
Map<String, ProtectedRegion> regions = regionManager.getRegions();
|
||||
for (ProtectedRegion region : regions.values())
|
||||
{
|
||||
regionManager.removeRegion(region.getId());
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
// If the plugin isn't present, return true.
|
||||
return true;
|
||||
return count;
|
||||
}
|
||||
|
||||
public boolean isEnabled()
|
||||
|
@ -10,12 +10,9 @@ public @interface CommandPermissions
|
||||
|
||||
Rank level() default Rank.NON_OP;
|
||||
|
||||
String permission() default "";
|
||||
|
||||
SourceType source() default SourceType.BOTH;
|
||||
|
||||
boolean blockHostConsole() default false;
|
||||
|
||||
int cooldown() default 0;
|
||||
|
||||
}
|
@ -1,8 +1,8 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import com.earth2me.essentials.User;
|
||||
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||
@ -60,39 +60,28 @@ public class Command_ban extends FreedomCommand
|
||||
}
|
||||
|
||||
final String username;
|
||||
final String ip;
|
||||
final List<String> ips = new ArrayList<>();
|
||||
|
||||
final Player player = getPlayer(args[0]);
|
||||
if (player == null)
|
||||
{
|
||||
// Gets the IP using Essentials data if available
|
||||
if (plugin.esb.isEnabled() && plugin.esb.getEssentialsUser(args[0]) != null)
|
||||
final PlayerData entry = plugin.pl.getData(args[0]);
|
||||
|
||||
if (entry == null)
|
||||
{
|
||||
User essUser = plugin.esb.getEssentialsUser(args[0]);
|
||||
//
|
||||
username = essUser.getName();
|
||||
ip = essUser.getLastLoginAddress();
|
||||
}
|
||||
// Last resort - Getting the first result from the username itself
|
||||
else
|
||||
{
|
||||
PlayerData entry = plugin.pl.getData(args[0]);
|
||||
if (entry == null)
|
||||
{
|
||||
msg(PLAYER_NOT_FOUND);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
username = entry.getName();
|
||||
ip = entry.getIps().get(0);
|
||||
}
|
||||
msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly.");
|
||||
return true;
|
||||
}
|
||||
|
||||
username = entry.getName();
|
||||
ips.addAll(entry.getIps());
|
||||
}
|
||||
else
|
||||
{
|
||||
final PlayerData entry = plugin.pl.getData(player);
|
||||
username = player.getName();
|
||||
ip = FUtil.getIp(player);
|
||||
//ips.addAll(entry.getIps());/
|
||||
ips.add(FUtil.getIp(player));
|
||||
|
||||
// Deop
|
||||
player.setOp(false);
|
||||
@ -137,6 +126,7 @@ public class Command_ban extends FreedomCommand
|
||||
|
||||
// Ban player
|
||||
Ban ban;
|
||||
|
||||
if (player != null)
|
||||
{
|
||||
ban = Ban.forPlayer(player, sender, null, reason);
|
||||
@ -145,8 +135,12 @@ public class Command_ban extends FreedomCommand
|
||||
{
|
||||
ban = Ban.forPlayerName(username, sender, null, reason);
|
||||
}
|
||||
ban.addIp(ip);
|
||||
|
||||
for (String ip : ips)
|
||||
{
|
||||
ban.addIp(ip);
|
||||
ban.addIp(FUtil.getFuzzyIp(ip));
|
||||
}
|
||||
plugin.bm.addBan(ban);
|
||||
|
||||
|
||||
@ -160,7 +154,7 @@ public class Command_ban extends FreedomCommand
|
||||
{
|
||||
bcast.append(" - Reason: ").append(ChatColor.YELLOW).append(reason);
|
||||
}
|
||||
msg(sender, ChatColor.GRAY + username + " has been banned and IP is: " + ip);
|
||||
msg(sender, ChatColor.GRAY + username + " has been banned and IP is: " + StringUtils.join(ips, ", "));
|
||||
FUtil.adminAction(sender.getName(), bcast.toString(), true);
|
||||
}
|
||||
|
||||
@ -178,7 +172,7 @@ public class Command_ban extends FreedomCommand
|
||||
}
|
||||
|
||||
// Log ban
|
||||
plugin.pul.logPunishment(new Punishment(username, ip, sender.getName(), PunishmentType.BAN, reason));
|
||||
plugin.pul.logPunishment(new Punishment(username, ips.get(0), sender.getName(), PunishmentType.BAN, reason));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -67,6 +67,11 @@ public class Command_cage extends FreedomCommand
|
||||
outerMaterial = Material.PLAYER_HEAD;
|
||||
if (args.length >= 3)
|
||||
{
|
||||
if (!args[2].matches("([A-z]*)") || args[2].length() < 3 || args[2].length() > 16)
|
||||
{
|
||||
msg("Invalid name!", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
skullName = args[2];
|
||||
}
|
||||
else
|
||||
|
@ -9,11 +9,8 @@ import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Shows the amount of coins you or another player has. Also allows you to give coins to other players.", usage = "/<command> [player] | pay <player> <amount>")
|
||||
@CommandParameters(description = "Shows the amount of coins you have or another player has", usage = "/<command> [playername]")
|
||||
public class Command_coins extends FreedomCommand
|
||||
{
|
||||
@Override
|
||||
@ -24,119 +21,34 @@ public class Command_coins extends FreedomCommand
|
||||
msg("The shop is currently disabled!", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
Player p;
|
||||
final String prefix = FUtil.colorize(ConfigEntry.SHOP_PREFIX.getString() + " ");
|
||||
|
||||
switch (args.length)
|
||||
if (args.length > 0)
|
||||
{
|
||||
// Mode for seeing how many coins the sender has (doesn't work from console)
|
||||
case 0:
|
||||
if (getPlayer(args[0]) != null)
|
||||
{
|
||||
if (senderIsConsole)
|
||||
{
|
||||
msg("When used from the console, you must define a target player.");
|
||||
}
|
||||
else
|
||||
{
|
||||
PlayerData playerData = getData(playerSender);
|
||||
msg(prefix + ChatColor.GREEN + "You have " + ChatColor.RED + playerData.getCoins() + ChatColor.GREEN
|
||||
+ " coins.");
|
||||
}
|
||||
p = getPlayer(args[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
msg(PLAYER_NOT_FOUND);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Mode for seeing how many coins a player has.
|
||||
case 1:
|
||||
}
|
||||
else
|
||||
{
|
||||
if (senderIsConsole)
|
||||
{
|
||||
Player target = getPlayer(args[0]);
|
||||
|
||||
if (target == null)
|
||||
{
|
||||
msg(PLAYER_NOT_FOUND);
|
||||
}
|
||||
else
|
||||
{
|
||||
PlayerData playerData = getData(target);
|
||||
msg(prefix + ChatColor.GREEN + target.getName() + " has " + ChatColor.RED + playerData.getCoins() + ChatColor.GREEN + " coins.");
|
||||
}
|
||||
msg(prefix + ChatColor.RED + "You are not a player, use /coins <playername>");
|
||||
return true;
|
||||
}
|
||||
|
||||
// Mode for paying another player coins
|
||||
case 3:
|
||||
else
|
||||
{
|
||||
if (args[0].equalsIgnoreCase("pay"))
|
||||
{
|
||||
checkPlayer();
|
||||
|
||||
final Player target = getPlayer(args[1]);
|
||||
final PlayerData senderData = getData(playerSender);
|
||||
|
||||
int coinsToTransfer;
|
||||
|
||||
// Processes args[2]
|
||||
try
|
||||
{
|
||||
// Prevents players from trying to be cheeky with negative numbers.
|
||||
coinsToTransfer = Math.max(Math.abs(Integer.parseInt(args[2])), 1);
|
||||
}
|
||||
catch (NumberFormatException ex)
|
||||
{
|
||||
msg("Invalid number: " + args[2], ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Prevents players from performing transactions they can't afford to do.
|
||||
if (senderData.getCoins() < coinsToTransfer)
|
||||
{
|
||||
msg("You don't have enough coins to perform this transaction.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (target == null)
|
||||
{
|
||||
msg(PLAYER_NOT_FOUND);
|
||||
}
|
||||
else
|
||||
{
|
||||
PlayerData playerData = getData(target);
|
||||
playerData.setCoins(playerData.getCoins() + coinsToTransfer);
|
||||
senderData.setCoins(senderData.getCoins() - coinsToTransfer);
|
||||
|
||||
msg(target, sender.getName()
|
||||
+ ChatColor.GREEN + " has given you "
|
||||
+ ChatColor.GOLD + coinsToTransfer
|
||||
+ ChatColor.GREEN + " coin" + (coinsToTransfer > 1 ? "s" : "") + "!", ChatColor.GOLD);
|
||||
|
||||
msg("You have given "
|
||||
+ ChatColor.GOLD + coinsToTransfer
|
||||
+ ChatColor.GREEN + " coin" + (coinsToTransfer > 1 ? "s" : "")
|
||||
+ " to " + ChatColor.GOLD + target.getName() + ChatColor.GREEN + ".", ChatColor.GREEN);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
return false;
|
||||
p = playerSender;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args)
|
||||
{
|
||||
if (args.length == 1)
|
||||
{
|
||||
List<String> options = new ArrayList<>(FUtil.getPlayerList());
|
||||
|
||||
options.add("pay");
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
return FUtil.getPlayerList();
|
||||
PlayerData playerData = plugin.pl.getData(p);
|
||||
msg(prefix + ChatColor.GREEN + (args.length > 0 ? p.getName() + " has " : "You have ") + ChatColor.RED + playerData.getCoins() + ChatColor.GREEN + " coins.");
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.Objects;
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
@ -42,7 +43,7 @@ public class Command_doom extends FreedomCommand
|
||||
FUtil.adminAction(sender.getName(), "Casting oblivion over " + player.getName(), true);
|
||||
FUtil.bcastMsg(player.getName() + " will be completely obliviated!", ChatColor.RED);
|
||||
|
||||
final String ip = FUtil.getIp(player);
|
||||
final String ip = Objects.requireNonNull(player.getAddress()).getAddress().getHostAddress().trim();
|
||||
|
||||
// Remove from admin
|
||||
Admin admin = getAdmin(player);
|
||||
@ -75,7 +76,10 @@ public class Command_doom extends FreedomCommand
|
||||
// Ban player
|
||||
Ban ban = Ban.forPlayer(player, sender);
|
||||
ban.setReason((reason == null ? "FUCKOFF" : reason));
|
||||
ban.addIp(ip);
|
||||
for (String playerIp : plugin.pl.getData(player).getIps())
|
||||
{
|
||||
ban.addIp(playerIp);
|
||||
}
|
||||
plugin.bm.addBan(ban);
|
||||
|
||||
// Set gamemode to survival
|
||||
|
@ -1,50 +1,40 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
||||
@CommandParameters(description = "Eject any entities that are riding you.", usage = "/<command>")
|
||||
@CommandParameters(description = "Eject players that are riding you.", usage = "/<command>")
|
||||
public class Command_eject extends FreedomCommand
|
||||
{
|
||||
/* Player.getShoulderEntityLeft() and Player.getShoulderEntityRight() are deprecated, however unless
|
||||
Player.getPassengers() also includes shoulders (which isn't likely, given the official documentation doesn't
|
||||
state an alternative method to use instead), these methods will continue to be used here. */
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
// Uses the size of the return value of Player.getPassengers() as the starting number of entities ejected
|
||||
int count = playerSender.getPassengers().size();
|
||||
|
||||
// Removes any entities from the sender's shoulders
|
||||
if (playerSender.getShoulderEntityLeft() != null)
|
||||
List<String> names = new ArrayList<>();
|
||||
|
||||
for (Entity entity : playerSender.getPassengers())
|
||||
{
|
||||
playerSender.setShoulderEntityLeft(null);
|
||||
count++;
|
||||
}
|
||||
if (playerSender.getShoulderEntityRight() != null)
|
||||
{
|
||||
playerSender.setShoulderEntityLeft(null);
|
||||
count++;
|
||||
names.add(entity.getName());
|
||||
}
|
||||
|
||||
// Removes anything riding the sender
|
||||
playerSender.eject();
|
||||
|
||||
if (count != 0)
|
||||
{
|
||||
msg(count + " entit" + (count == 1 ? "y was" : "ies were") + " ejected.", ChatColor.GREEN);
|
||||
}
|
||||
else
|
||||
if (names.isEmpty())
|
||||
{
|
||||
msg("Nothing was ejected.", ChatColor.GREEN);
|
||||
return true;
|
||||
}
|
||||
|
||||
msg("Ejecting " + StringUtils.join(names, ", ") + ".", ChatColor.GREEN);
|
||||
playerSender.eject();
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -18,7 +18,7 @@ public class Command_linkdiscord extends FreedomCommand
|
||||
{
|
||||
if (!plugin.dc.enabled)
|
||||
{
|
||||
msg("The Discord integration system is currently disabled.", ChatColor.RED);
|
||||
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -32,7 +32,7 @@ public class Command_linkdiscord extends FreedomCommand
|
||||
}
|
||||
|
||||
playerData.setDiscordID(args[1]);
|
||||
msg("Linked " + args[0] + "'s Discord account.", ChatColor.GREEN);
|
||||
msg("Linked " + args[0] + "'s discord account.", ChatColor.GREEN);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -15,8 +15,8 @@ import org.bukkit.entity.Player;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@CommandPermissions(level = Rank.NON_OP, source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Lists the real names of all online players.", usage = "/<command> [-s | -f | -v]", aliases = "who,lsit")
|
||||
@CommandPermissions(level = Rank.IMPOSTOR, source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Lists the real names of all online players.", usage = "/<command> [-s | -i | -f | -v]", aliases = "who,lsit")
|
||||
public class Command_list extends FreedomCommand
|
||||
{
|
||||
|
||||
@ -63,6 +63,11 @@ public class Command_list extends FreedomCommand
|
||||
listFilter = ListFilter.TELNET_SESSIONS;
|
||||
break;
|
||||
}
|
||||
case "-i":
|
||||
{
|
||||
listFilter = ListFilter.IMPOSTORS;
|
||||
break;
|
||||
}
|
||||
case "-f":
|
||||
{
|
||||
listFilter = ListFilter.FAMOUS_PLAYERS;
|
||||
@ -117,6 +122,10 @@ public class Command_list extends FreedomCommand
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (listFilter == ListFilter.IMPOSTORS && !plugin.al.isAdminImpostor(p))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (listFilter == ListFilter.FAMOUS_PLAYERS && !ConfigEntry.FAMOUS_PLAYERS.getList().contains(p.getName().toLowerCase()))
|
||||
{
|
||||
continue;
|
||||
@ -155,6 +164,7 @@ public class Command_list extends FreedomCommand
|
||||
ADMINS,
|
||||
VANISHED_ADMINS,
|
||||
TELNET_SESSIONS,
|
||||
FAMOUS_PLAYERS
|
||||
FAMOUS_PLAYERS,
|
||||
IMPOSTORS
|
||||
}
|
||||
}
|
@ -0,0 +1,96 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import com.sk89q.worldedit.IncompleteRegionException;
|
||||
import com.sk89q.worldedit.LocalSession;
|
||||
import com.sk89q.worldedit.regions.Region;
|
||||
import com.sk89q.worldguard.domains.DefaultDomain;
|
||||
import com.sk89q.worldguard.protection.flags.Flag;
|
||||
import com.sk89q.worldguard.protection.flags.Flags;
|
||||
import com.sk89q.worldguard.protection.flags.RegionGroup;
|
||||
import com.sk89q.worldguard.protection.flags.StateFlag;
|
||||
import com.sk89q.worldguard.protection.managers.RegionManager;
|
||||
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
|
||||
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.ONLY_IN_GAME)
|
||||
@CommandParameters(description = "Make a WorldGuard region for an OP.", usage = "/<command> <playername> <name>", aliases = "mor")
|
||||
public class Command_makeopregion extends FreedomCommand
|
||||
{
|
||||
|
||||
final Map<Flag<?>, Object> flags = new HashMap<Flag<?>, Object>()
|
||||
{{
|
||||
put(Flags.BLOCK_PLACE, StateFlag.State.ALLOW);
|
||||
put(Flags.BLOCK_BREAK, StateFlag.State.ALLOW);
|
||||
put(Flags.BUILD, StateFlag.State.ALLOW);
|
||||
put(Flags.PLACE_VEHICLE, StateFlag.State.ALLOW);
|
||||
put(Flags.DESTROY_VEHICLE, StateFlag.State.ALLOW);
|
||||
put(Flags.ENTITY_ITEM_FRAME_DESTROY, StateFlag.State.ALLOW);
|
||||
put(Flags.ENTITY_PAINTING_DESTROY, StateFlag.State.ALLOW);
|
||||
put(net.goldtreeservers.worldguardextraflags.flags.Flags.WORLDEDIT, StateFlag.State.ALLOW);
|
||||
}};
|
||||
|
||||
public boolean run(final CommandSender sender, final Player playerSender, final Command cmd, final String commandLabel, final String[] args, final boolean senderIsConsole)
|
||||
{
|
||||
if (args.length < 2)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
final Player player = getPlayer(args[0]);
|
||||
|
||||
if (player == null)
|
||||
{
|
||||
msg(FreedomCommand.PLAYER_NOT_FOUND);
|
||||
return true;
|
||||
}
|
||||
|
||||
String name = args[1];
|
||||
|
||||
LocalSession session = plugin.web.getWorldEditPlugin().getSession(playerSender);
|
||||
|
||||
Region selection;
|
||||
|
||||
try
|
||||
{
|
||||
selection = session.getSelection(session.getSelectionWorld());
|
||||
}
|
||||
catch (IncompleteRegionException e)
|
||||
{
|
||||
msg("Please make a WorldEdit selection", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (selection == null)
|
||||
{
|
||||
msg("Please make a WorldEdit selection", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
ProtectedRegion region = new ProtectedCuboidRegion(name, selection.getMinimumPoint(), selection.getMaximumPoint());
|
||||
|
||||
DefaultDomain owners = new DefaultDomain();
|
||||
owners.addPlayer(playerSender.getName());
|
||||
owners.addPlayer(player.getName());
|
||||
region.setOwners(owners);
|
||||
region.setFlags(flags);
|
||||
|
||||
for (Flag<?> flag : flags.keySet())
|
||||
{
|
||||
region.setFlag(flag.getRegionGroupFlag(), RegionGroup.MEMBERS);
|
||||
}
|
||||
|
||||
RegionManager regionManager = plugin.wgb.getRegionManager(playerSender.getWorld());
|
||||
|
||||
regionManager.addRegion(region);
|
||||
|
||||
msg("Successfully created the region '" + name + "' for " + player.getName(), ChatColor.GREEN);
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Manually verify someone", usage = "/<command> <playername>", aliases = "mv")
|
||||
public class Command_manuallyverify extends FreedomCommand
|
||||
{
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
boolean verificationEnabled = ConfigEntry.DISCORD_VERIFICATION.getBoolean();
|
||||
if (!plugin.dc.enabled)
|
||||
{
|
||||
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!verificationEnabled)
|
||||
{
|
||||
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args.length == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
final Player player = getPlayer(args[0]);
|
||||
if (player == null)
|
||||
{
|
||||
msg(FreedomCommand.PLAYER_NOT_FOUND);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!plugin.pl.IsImpostor(player))
|
||||
{
|
||||
msg("That player is not an impostor.");
|
||||
return true;
|
||||
}
|
||||
|
||||
FUtil.adminAction(sender.getName(), "Manually verifying player " + player.getName(), false);
|
||||
player.setOp(true);
|
||||
msg(player, YOU_ARE_OP);
|
||||
|
||||
if (plugin.pl.getPlayer(player).getFreezeData().isFrozen())
|
||||
{
|
||||
plugin.pl.getPlayer(player).getFreezeData().setFrozen(false);
|
||||
msg(player, "You have been unfrozen.");
|
||||
}
|
||||
|
||||
plugin.pl.verify(player, null);
|
||||
plugin.rm.updateDisplay(player);
|
||||
return true;
|
||||
}
|
||||
}
|
@ -116,21 +116,39 @@ public class Command_mbconfig extends FreedomCommand
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!data.isMasterBuilder())
|
||||
if (data.isMasterBuilder() && plugin.pl.isPlayerImpostor(player))
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Re-adding " + data.getName() + " to the Master Builder list", true);
|
||||
|
||||
if (plugin.pl.getPlayer(player).getFreezeData().isFrozen())
|
||||
{
|
||||
plugin.pl.getPlayer(player).getFreezeData().setFrozen(false);
|
||||
}
|
||||
if (player != null)
|
||||
{
|
||||
plugin.pl.verify(player, null);
|
||||
plugin.rm.updateDisplay(player);
|
||||
player.setOp(true);
|
||||
msg(player, YOU_ARE_OP);
|
||||
}
|
||||
}
|
||||
else if (!data.isMasterBuilder())
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Adding " + data.getName() + " to the Master Builder list", true);
|
||||
data.setMasterBuilder(true);
|
||||
data.setVerification(true);
|
||||
plugin.pl.save(data);
|
||||
if (player != null)
|
||||
{
|
||||
plugin.rm.updateDisplay(player);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
msg("That player is already on the Master Builder list.");
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case "remove":
|
||||
{
|
||||
@ -155,6 +173,10 @@ public class Command_mbconfig extends FreedomCommand
|
||||
|
||||
FUtil.adminAction(sender.getName(), "Removing " + data.getName() + " from the Master Builder list", true);
|
||||
data.setMasterBuilder(false);
|
||||
if (data.getDiscordID() == null)
|
||||
{
|
||||
data.setVerification(false);
|
||||
}
|
||||
plugin.pl.save(data);
|
||||
if (player != null)
|
||||
{
|
||||
|
@ -0,0 +1,266 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.SplittableRandom;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.minecraft.server.v1_16_R3.NBTTagCompound;
|
||||
import net.minecraft.server.v1_16_R3.NBTTagList;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.inventory.meta.PotionMeta;
|
||||
import org.bukkit.potion.PotionEffectType;
|
||||
|
||||
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
||||
@CommandParameters(description = "Modify the current item you are holding.", usage = "/<command> <name <message> | lore <message> | enchant <enchantment> <level> | potion <effect> <duration> <amplifier> | attribute <name> <amount> | clear>", aliases = "mi")
|
||||
public class Command_modifyitem extends FreedomCommand
|
||||
{
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public boolean run(final CommandSender sender, final Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
if (args.length < 1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
ItemStack item = playerSender.getInventory().getItemInMainHand();
|
||||
if (item.getType().equals(Material.AIR))
|
||||
{
|
||||
msg("You must have an item in your hand!");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args[0].equalsIgnoreCase("clear"))
|
||||
{
|
||||
item.setItemMeta(null);
|
||||
playerSender.getInventory().setItemInMainHand(item);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args.length < 2)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
assert meta != null;
|
||||
switch (args[0])
|
||||
{
|
||||
case "name":
|
||||
String name = FUtil.colorize(StringUtils.join(args, " ", 1, args.length));
|
||||
meta.setDisplayName(name);
|
||||
item.setItemMeta(meta);
|
||||
break;
|
||||
|
||||
case "lore":
|
||||
List<String> lore = new ArrayList<>();
|
||||
for (String line : StringUtils.join(args, " ", 1, args.length).split("\\\\n"))
|
||||
{
|
||||
lore.add(FUtil.colorize(line));
|
||||
}
|
||||
meta.setLore(lore);
|
||||
item.setItemMeta(meta);
|
||||
break;
|
||||
|
||||
case "enchant":
|
||||
if (args.length < 3)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Enchantment enchantment = Enchantment.getByName(args[1].toUpperCase());
|
||||
if (enchantment == null)
|
||||
{
|
||||
msg("Invalid enchantment. Please run /enchant list for a list of valid enchantments.");
|
||||
return true;
|
||||
}
|
||||
|
||||
int level;
|
||||
try
|
||||
{
|
||||
level = Integer.parseInt(args[2]);
|
||||
}
|
||||
catch (NumberFormatException ex)
|
||||
{
|
||||
msg("The level specified is not a valid integer.");
|
||||
return true;
|
||||
}
|
||||
meta.addEnchant(enchantment, level, true);
|
||||
item.setItemMeta(meta);
|
||||
break;
|
||||
|
||||
case "potion":
|
||||
{
|
||||
if (!item.getType().equals(Material.POTION) & !item.getType().equals(Material.SPLASH_POTION) & !item.getType().equals(Material.LINGERING_POTION) & !item.getType().equals(Material.TIPPED_ARROW))
|
||||
{
|
||||
msg("This item can not have potion effects added to it.");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args.length < 4)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
PotionEffectType type = PotionEffectType.getByName(args[1]);
|
||||
if (type == null)
|
||||
{
|
||||
msg("Invalid potion effect. Please run /potion list for a list of valid potion effects.");
|
||||
return true;
|
||||
}
|
||||
|
||||
int duration;
|
||||
try
|
||||
{
|
||||
duration = Math.max(1, Math.min(1000000, Integer.parseInt(args[2])));
|
||||
}
|
||||
catch (NumberFormatException ex)
|
||||
{
|
||||
msg("The duration specified is not a valid integer.");
|
||||
return true;
|
||||
}
|
||||
|
||||
int amplifier;
|
||||
try
|
||||
{
|
||||
amplifier = Math.max(1, Math.min(256, Integer.parseInt(args[2])));
|
||||
}
|
||||
catch (NumberFormatException ex)
|
||||
{
|
||||
msg("The amplifier specified is not a valid integer.");
|
||||
return true;
|
||||
}
|
||||
PotionMeta potionMeta = (PotionMeta)meta;
|
||||
potionMeta.addCustomEffect(type.createEffect(duration, amplifier), true);
|
||||
item.setItemMeta(potionMeta);
|
||||
break;
|
||||
}
|
||||
|
||||
case "attribute":
|
||||
if (args.length < 3)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
net.minecraft.server.v1_16_R3.ItemStack nmsStack = CraftItemStack.asNMSCopy(item);
|
||||
NBTTagCompound compound = (nmsStack.hasTag()) ? nmsStack.getTag() : new NBTTagCompound();
|
||||
NBTTagList modifiers = getAttributeList(nmsStack);
|
||||
NBTTagCompound cmpnd = new NBTTagCompound();
|
||||
Attribute attribute = Attribute.getByName(args[1].toUpperCase());
|
||||
if (attribute == null)
|
||||
{
|
||||
msg("Invalid attribute. Please run /attributelist for a list of valid attributes.");
|
||||
return true;
|
||||
}
|
||||
cmpnd.setString("AttributeName", attribute.getAttribute());
|
||||
cmpnd.setString("Name", attribute.getAttribute());
|
||||
double amount;
|
||||
try
|
||||
{
|
||||
amount = Double.parseDouble(args[2]);
|
||||
}
|
||||
catch (NumberFormatException ex)
|
||||
{
|
||||
msg("The amount specified is not a valid integer.");
|
||||
return true;
|
||||
}
|
||||
if (Double.isNaN(amount))
|
||||
{
|
||||
msg("The amount specified is illegal.");
|
||||
return true;
|
||||
}
|
||||
cmpnd.setDouble("Amount", amount);
|
||||
cmpnd.setInt("Operation", 0);
|
||||
SplittableRandom random = new SplittableRandom();
|
||||
cmpnd.setIntArray("UUID", new int[]
|
||||
{
|
||||
random.nextInt(),
|
||||
random.nextInt(),
|
||||
random.nextInt(),
|
||||
random.nextInt()
|
||||
});
|
||||
cmpnd.setString("Slot", "mainhand");
|
||||
modifiers.add(cmpnd);
|
||||
assert compound != null;
|
||||
compound.set("AttributeModifiers", modifiers);
|
||||
nmsStack.setTag(compound);
|
||||
item = CraftItemStack.asBukkitCopy(nmsStack);
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
playerSender.getInventory().setItemInMainHand(item);
|
||||
return true;
|
||||
}
|
||||
|
||||
private NBTTagList getAttributeList(net.minecraft.server.v1_16_R3.ItemStack stack)
|
||||
{
|
||||
if (stack.getTag() == null)
|
||||
{
|
||||
stack.setTag(new NBTTagCompound());
|
||||
}
|
||||
NBTTagList attr = stack.getTag().getList("AttributeModifiers", 10);
|
||||
if (attr == null)
|
||||
{
|
||||
stack.getTag().set("AttributeModifiers", new NBTTagList());
|
||||
}
|
||||
return stack.getTag().getList("AttributeModifiers", 10);
|
||||
}
|
||||
|
||||
private enum Attribute
|
||||
{
|
||||
GENERIC_MAX_HEALTH("GENERIC_MAX_HEALTH", "generic.max_health"),
|
||||
GENERIC_FOLLOW_RANGE("GENERIC_FOLLOW_RANGE", "generic.follow_range"),
|
||||
GENERIC_KNOCKBACK_RESISTANCE("GENERIC_KNOCKBACK_RESISTANCE", "generic.knockback_resistance"),
|
||||
GENERIC_MOVEMENT_SPEED("GENERIC_MOVEMENT_SPEED", "generic.movement_speed"),
|
||||
GENERIC_FLYING_SPEED("GENERIC_FLYING_SPEED", "generic.flying_speed"),
|
||||
GENERIC_ATTACK_DAMAGE("GENERIC_ATTACK_DAMAGE", "generic.attack_damage"),
|
||||
GENERIC_ATTACK_SPEED("GENERIC_ATTACK_SPEED", "generic.attack_speed"),
|
||||
GENERIC_ARMOR("GENERIC_ARMOR", "generic.armor"),
|
||||
GENERIC_ARMOR_TOUGHNESS("GENERIC_ARMOR_TOUGHNESS", "generic.armor_toughmess"),
|
||||
GENERIC_LUCK("GENERIC_LUCK", "generic.luck"),
|
||||
HORSE_JUMP_STRENGTH("GENERIC_MAX_HEALTH", "horse.jump_strength"),
|
||||
ZOMBIE_SPAWN_REINFORCEMENTS("ZOMBIE_SPAWN_REINFORCEMENTS", "zombie.spawn_reinforcements");
|
||||
|
||||
private final String name;
|
||||
private final String attribute;
|
||||
|
||||
Attribute(String name, String attribute)
|
||||
{
|
||||
this.name = name;
|
||||
this.attribute = attribute;
|
||||
}
|
||||
|
||||
public static Attribute getByName(String name)
|
||||
{
|
||||
for (Attribute attr : Attribute.values())
|
||||
{
|
||||
if (attr.toString().toUpperCase().equals(name))
|
||||
{
|
||||
return attr;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getAttribute()
|
||||
{
|
||||
return attribute;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
}
|
||||
}
|
@ -130,19 +130,17 @@ public class Command_mute extends FreedomCommand
|
||||
{
|
||||
playerdata.setMuted(true);
|
||||
player.sendTitle(ChatColor.RED + "You've been muted.", ChatColor.YELLOW + "Be sure to follow the rules!", 20, 100, 60);
|
||||
|
||||
if (quiet)
|
||||
{
|
||||
msg("Muted " + player.getName() + " quietly");
|
||||
return true; // doesn't announce reason
|
||||
}
|
||||
|
||||
FUtil.adminAction(sender.getName(), "Muting " + player.getName(), true);
|
||||
|
||||
if (reason != null)
|
||||
{
|
||||
msg(player, ChatColor.RED + "Reason: " + ChatColor.YELLOW + reason);
|
||||
}
|
||||
if (quiet)
|
||||
{
|
||||
msg("Muted " + player.getName() + " quietly");
|
||||
return true;
|
||||
}
|
||||
|
||||
FUtil.adminAction(sender.getName(), "Muting " + player.getName(), true);
|
||||
|
||||
if (smite)
|
||||
{
|
||||
|
@ -24,10 +24,6 @@ public class Command_opall extends FreedomCommand
|
||||
msg(player, YOU_ARE_OP);
|
||||
plugin.rm.updateDisplay(player);
|
||||
}
|
||||
else
|
||||
{
|
||||
player.recalculatePermissions();
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -0,0 +1,158 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
||||
@CommandParameters(description = "Manage your verification", usage = "/<command> <enable | disable | clearips | clearip <ip> | status | genbackupcodes>", aliases = "playerverify,pv")
|
||||
public class Command_playerverification extends FreedomCommand
|
||||
{
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
PlayerData target = plugin.pl.getData(playerSender);
|
||||
boolean verificationEnabled = ConfigEntry.DISCORD_VERIFICATION.getBoolean();
|
||||
List<String> ips = new ArrayList<>(target.getIps());
|
||||
|
||||
if (verificationEnabled)
|
||||
{
|
||||
if (args.length == 1)
|
||||
{
|
||||
if (args[0].equalsIgnoreCase("clearips"))
|
||||
{
|
||||
int cleared = 0;
|
||||
for (String ip : ips)
|
||||
{
|
||||
if (!ip.equals(FUtil.getIp(playerSender)))
|
||||
{
|
||||
target.removeIp(ip);
|
||||
cleared++;
|
||||
}
|
||||
}
|
||||
|
||||
msg("Cleared all IP's except your current IP \"" + FUtil.getIp(playerSender) + "\"");
|
||||
msg("Cleared " + cleared + " IP's.");
|
||||
plugin.pl.save(target);
|
||||
plugin.pl.syncIps(target);
|
||||
return true;
|
||||
}
|
||||
else if (args[0].equalsIgnoreCase("clearip"))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (args.length < 1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
PlayerData data = plugin.pl.getData(playerSender);
|
||||
|
||||
switch (args[0].toLowerCase())
|
||||
{
|
||||
case "enable":
|
||||
{
|
||||
if (!plugin.dc.enabled)
|
||||
{
|
||||
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
else if (data.hasVerification())
|
||||
{
|
||||
msg("Discord verification is already enabled for you.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
else if (data.getDiscordID() == null)
|
||||
{
|
||||
msg("Please link a discord account with /linkdiscord.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
data.setVerification(true);
|
||||
plugin.pl.save(data);
|
||||
msg("Re-enabled Discord verification.", ChatColor.GREEN);
|
||||
return true;
|
||||
}
|
||||
|
||||
case "disable":
|
||||
{
|
||||
if (!data.hasVerification())
|
||||
{
|
||||
msg("Discord verification is already disabled for you.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
data.setVerification(false);
|
||||
plugin.pl.save(data);
|
||||
msg("Disabled Discord verification.", ChatColor.GREEN);
|
||||
return true;
|
||||
}
|
||||
|
||||
case "status":
|
||||
{
|
||||
boolean enabled = target.hasVerification();
|
||||
boolean specified = target.getDiscordID() != null;
|
||||
msg(ChatColor.GRAY + "Discord Verification Enabled: " + (enabled ? ChatColor.GREEN + "true" : ChatColor.RED + "false"));
|
||||
msg(ChatColor.GRAY + "Discord ID: " + (specified ? ChatColor.GREEN + target.getDiscordID() : ChatColor.RED + "not set"));
|
||||
msg(ChatColor.GRAY + "Backup Codes: " + data.getBackupCodes().size() + "/" + "10");
|
||||
return true;
|
||||
}
|
||||
|
||||
case "genbackupcodes":
|
||||
{
|
||||
if (!plugin.dc.enabled)
|
||||
{
|
||||
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
else if (!data.hasVerification())
|
||||
{
|
||||
msg("Discord verification is not enabled for you.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean generated = plugin.dc.sendBackupCodes(data);
|
||||
|
||||
if (generated)
|
||||
{
|
||||
msg("Your backup codes have been sent to your discord account. They can be re-generated at anytime.", ChatColor.GREEN);
|
||||
}
|
||||
else
|
||||
{
|
||||
msg("Failed to generate backup codes, please contact a developer.", ChatColor.RED);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args)
|
||||
{
|
||||
if (args.length == 1)
|
||||
{
|
||||
return Arrays.asList("enable", "disable", "status", "clearips", "genbackupcodes");
|
||||
}
|
||||
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
||||
@CommandParameters(description = "Release parrots from your shoulders.", usage = "/<command>", aliases = "removeparrots")
|
||||
public class Command_releaseparrots extends FreedomCommand
|
||||
{
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
Entity leftShoulderEntity = playerSender.getShoulderEntityLeft();
|
||||
Entity rightShoulderEntity = playerSender.getShoulderEntityRight();
|
||||
|
||||
if (rightShoulderEntity == null && leftShoulderEntity == null)
|
||||
{
|
||||
msg("No parrots were detected on either of your shoulders.");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (leftShoulderEntity != null && leftShoulderEntity.getType().equals(EntityType.PARROT))
|
||||
{
|
||||
playerSender.setShoulderEntityLeft(null);
|
||||
msg("Removed the parrot on your left shoulder.");
|
||||
}
|
||||
|
||||
if (rightShoulderEntity != null && rightShoulderEntity.getType().equals(EntityType.PARROT))
|
||||
{
|
||||
playerSender.setShoulderEntityRight(null);
|
||||
msg("Removed the parrot on your right shoulder.");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -187,6 +187,12 @@ public class Command_saconfig extends FreedomCommand
|
||||
}
|
||||
}
|
||||
|
||||
if (plugin.pl.isPlayerImpostor(player))
|
||||
{
|
||||
msg("This player was labeled as a Player impostor and is not an admin, therefore they cannot be added to the admin list.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (admin == null) // New admin
|
||||
{
|
||||
|
||||
@ -199,10 +205,23 @@ public class Command_saconfig extends FreedomCommand
|
||||
else // Existing admin
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Re-adding " + player.getName() + " to the admin list", true);
|
||||
|
||||
String oldName = admin.getName();
|
||||
if (!oldName.equals(player.getName()))
|
||||
{
|
||||
admin.setName(player.getName());
|
||||
plugin.sql.updateAdminName(oldName, admin.getName());
|
||||
}
|
||||
admin.addIp(FUtil.getIp(player));
|
||||
|
||||
admin.setActive(true);
|
||||
admin.setLastLogin(new Date());
|
||||
|
||||
if (plugin.al.isVerifiedAdmin(player))
|
||||
{
|
||||
plugin.al.verifiedNoAdmin.remove(player.getName());
|
||||
}
|
||||
|
||||
plugin.al.save(admin);
|
||||
plugin.al.updateTables();
|
||||
plugin.rm.updateDisplay(player);
|
||||
|
@ -0,0 +1,49 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
||||
@CommandParameters(description = "Sets your experience level (XP).", usage = "/<command> [level]")
|
||||
public class Command_setlevel extends FreedomCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
if (args.length != 1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int new_level;
|
||||
|
||||
try
|
||||
{
|
||||
new_level = Integer.parseInt(args[0]);
|
||||
|
||||
if (new_level < 0)
|
||||
{
|
||||
new_level = 0;
|
||||
}
|
||||
else if (new_level > 50)
|
||||
{
|
||||
new_level = 50;
|
||||
}
|
||||
}
|
||||
catch (NumberFormatException ex)
|
||||
{
|
||||
msg("Invalid level.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
playerSender.setLevel(new_level);
|
||||
|
||||
msg("Your XP level is now set to " + ChatColor.GOLD + new_level);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,8 +1,6 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.lang3.EnumUtils;
|
||||
@ -57,7 +55,6 @@ public class Command_spawnmob extends FreedomCommand
|
||||
return true;
|
||||
}
|
||||
|
||||
int max = ConfigEntry.SPAWNMOB_MAX.getInteger();
|
||||
int amount = 1;
|
||||
if (args.length > 1)
|
||||
{
|
||||
@ -72,9 +69,9 @@ public class Command_spawnmob extends FreedomCommand
|
||||
}
|
||||
}
|
||||
|
||||
if (amount > max || amount < 1)
|
||||
if (amount > 10 || amount < 1)
|
||||
{
|
||||
msg("Invalid amount: " + args[1] + ". Must be 1-" + max + ".", ChatColor.RED);
|
||||
msg("Invalid amount: " + args[1] + ". Must be 1-10.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,143 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH, blockHostConsole = true)
|
||||
@CommandParameters(description = "Temporarily bans a player for five minutes.", usage = "/<command> [-q] <username> [reason]", aliases = "noob")
|
||||
public class Command_tban extends FreedomCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
if (args.length == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean quiet = args[0].equalsIgnoreCase("-q");
|
||||
if (quiet)
|
||||
{
|
||||
args = org.apache.commons.lang3.ArrayUtils.subarray(args, 1, args.length);
|
||||
|
||||
if (args.length < 1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
final String username;
|
||||
|
||||
final Player player = getPlayer(args[0]);
|
||||
final PlayerData entry;
|
||||
if (player == null)
|
||||
{
|
||||
entry = plugin.pl.getData(args[0]);
|
||||
|
||||
if (entry == null)
|
||||
{
|
||||
msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly.");
|
||||
return true;
|
||||
}
|
||||
|
||||
username = entry.getName();
|
||||
}
|
||||
else
|
||||
{
|
||||
entry = plugin.pl.getData(player);
|
||||
username = player.getName();
|
||||
}
|
||||
final List<String> ips = new ArrayList<>(entry.getIps());
|
||||
|
||||
String reason = null;
|
||||
if (args.length > 1)
|
||||
{
|
||||
reason = StringUtils.join(args, " ", 1, args.length);
|
||||
}
|
||||
|
||||
StringBuilder kick = new StringBuilder()
|
||||
.append(ChatColor.RED)
|
||||
.append("You have been temporarily banned for five minutes. Please read totalfreedom.me for more info.");
|
||||
|
||||
if (!quiet)
|
||||
{
|
||||
// Strike with lightning
|
||||
if (player != null)
|
||||
{
|
||||
final Location targetPos = player.getLocation();
|
||||
for (int x = -1; x <= 1; x++)
|
||||
{
|
||||
for (int z = -1; z <= 1; z++)
|
||||
{
|
||||
final Location strike_pos = new Location(targetPos.getWorld(), targetPos.getBlockX() + x, targetPos.getBlockY(), targetPos.getBlockZ() + z);
|
||||
Objects.requireNonNull(targetPos.getWorld()).strikeLightning(strike_pos);
|
||||
}
|
||||
}
|
||||
|
||||
// Kill player
|
||||
player.setHealth(0.0);
|
||||
|
||||
if (reason != null)
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Tempbanning " + player.getName() + " for 5 minutes - Reason: " + reason, true);
|
||||
kick.append("\n")
|
||||
.append(ChatColor.RED)
|
||||
.append("Reason: ")
|
||||
.append(ChatColor.GOLD)
|
||||
.append(reason);
|
||||
}
|
||||
else
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Tempbanning " + player.getName() + " for 5 minutes", true);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (player != null)
|
||||
{
|
||||
if (reason != null)
|
||||
{
|
||||
msg("Quietly temporarily banned " + player.getName() + " for 5 minutes.");
|
||||
kick.append("\n")
|
||||
.append(ChatColor.RED)
|
||||
.append("Reason: ")
|
||||
.append(ChatColor.GOLD)
|
||||
.append(reason);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Ban player
|
||||
Ban ban = Ban.forPlayerName(username, sender, FUtil.parseDateOffset("5m"), reason);
|
||||
for (String ip : ips)
|
||||
{
|
||||
ban.addIp(ip);
|
||||
}
|
||||
plugin.bm.addBan(ban);
|
||||
|
||||
// Kick player
|
||||
if (player != null)
|
||||
{
|
||||
player.kickPlayer(kick.toString());
|
||||
}
|
||||
|
||||
// Log ban
|
||||
plugin.pul.logPunishment(new Punishment(username, ips.get(0), sender.getName(), PunishmentType.TEMPBAN, reason));
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,10 +1,10 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import com.earth2me.essentials.User;
|
||||
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
import me.totalfreedom.totalfreedommod.punishments.Punishment;
|
||||
@ -21,7 +21,7 @@ import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Temporarily ban someone.", usage = "/<command> [-q] <username> [duration] [reason]", aliases = "tban,noob")
|
||||
@CommandParameters(description = "Temporarily ban someone.", usage = "/<command> [-q] <username> [duration] [reason]")
|
||||
public class Command_tempban extends FreedomCommand
|
||||
{
|
||||
|
||||
@ -47,72 +47,49 @@ public class Command_tempban extends FreedomCommand
|
||||
}
|
||||
|
||||
final String username;
|
||||
final String ip;
|
||||
final List<String> ips = new ArrayList<>();
|
||||
|
||||
final Player player = getPlayer(args[0]);
|
||||
PlayerData entry;
|
||||
final PlayerData entry;
|
||||
if (player == null)
|
||||
{
|
||||
// Gets the IP using Essentials data if available
|
||||
if (plugin.esb.isEnabled() && plugin.esb.getEssentialsUser(args[0]) != null)
|
||||
entry = plugin.pl.getData(args[0]);
|
||||
|
||||
if (entry == null)
|
||||
{
|
||||
User essUser = plugin.esb.getEssentialsUser(args[0]);
|
||||
//
|
||||
username = essUser.getName();
|
||||
ip = essUser.getLastLoginAddress();
|
||||
}
|
||||
// Last resort - Getting the first result from the username itself
|
||||
else
|
||||
{
|
||||
entry = plugin.pl.getData(args[0]);
|
||||
if (entry == null)
|
||||
{
|
||||
msg(PLAYER_NOT_FOUND);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
username = entry.getName();
|
||||
ip = entry.getIps().get(0);
|
||||
}
|
||||
msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly.");
|
||||
return true;
|
||||
}
|
||||
|
||||
username = entry.getName();
|
||||
ips.addAll(entry.getIps());
|
||||
}
|
||||
else
|
||||
{
|
||||
entry = plugin.pl.getData(player);
|
||||
username = player.getName();
|
||||
ip = FUtil.getIp(player);
|
||||
ips.add(FUtil.getIp(player));
|
||||
}
|
||||
|
||||
final StringBuilder message = new StringBuilder("Temporarily banned " + username);
|
||||
|
||||
// Default expiration date is 5 minutes
|
||||
Date expires = FUtil.parseDateOffset("5m");
|
||||
|
||||
// Parses what comes after as a duration
|
||||
if (args.length > 1)
|
||||
{
|
||||
try
|
||||
{
|
||||
expires = FUtil.parseDateOffset(args[1]);
|
||||
}
|
||||
catch (NumberFormatException error)
|
||||
{
|
||||
msg("Invalid duration: " + args[1], ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Date expires = FUtil.parseDateOffset("30m");
|
||||
message.append(" until ").append(date_format.format(expires));
|
||||
|
||||
// If a reason appears to exist, set it.
|
||||
String reason = null;
|
||||
if (args.length > 2)
|
||||
if (args.length >= 2)
|
||||
{
|
||||
reason = StringUtils.join(ArrayUtils.subarray(args, 2, args.length), " ") + " (" + sender.getName() + ")";
|
||||
Date parsed_offset = FUtil.parseDateOffset(args[1]);
|
||||
reason = StringUtils.join(ArrayUtils.subarray(args, parsed_offset == null ? 1 : 2, args.length), " ") + " (" + sender.getName() + ")";
|
||||
if (parsed_offset != null)
|
||||
{
|
||||
expires = parsed_offset;
|
||||
}
|
||||
message.append(", Reason: \"").append(reason).append("\"");
|
||||
}
|
||||
|
||||
Ban ban;
|
||||
|
||||
if (player != null)
|
||||
{
|
||||
ban = Ban.forPlayer(player, sender, expires, reason);
|
||||
@ -121,8 +98,11 @@ public class Command_tempban extends FreedomCommand
|
||||
{
|
||||
ban = Ban.forPlayerName(username, sender, expires, reason);
|
||||
}
|
||||
ban.addIp(ip);
|
||||
|
||||
for (String ip : ips)
|
||||
{
|
||||
ban.addIp(ip);
|
||||
}
|
||||
plugin.bm.addBan(ban);
|
||||
|
||||
if (!quiet)
|
||||
@ -139,8 +119,6 @@ public class Command_tempban extends FreedomCommand
|
||||
Objects.requireNonNull(targetPos.getWorld()).strikeLightningEffect(strike_pos);
|
||||
}
|
||||
}
|
||||
|
||||
player.kickPlayer(ban.bakeKickMessage());
|
||||
}
|
||||
|
||||
FUtil.adminAction(sender.getName(), message.toString(), true);
|
||||
@ -150,15 +128,19 @@ public class Command_tempban extends FreedomCommand
|
||||
msg("Quietly temporarily banned " + username + ".");
|
||||
}
|
||||
|
||||
for (Player p : Bukkit.getOnlinePlayers())
|
||||
if (player != null)
|
||||
{
|
||||
if (FUtil.getIp(p).equals(ip))
|
||||
player.kickPlayer(ban.bakeKickMessage());
|
||||
for (Player p : Bukkit.getOnlinePlayers())
|
||||
{
|
||||
p.kickPlayer(ChatColor.RED + "You've been kicked because someone on your IP has been banned.");
|
||||
if (FUtil.getIp(p).equals(FUtil.getIp(player)))
|
||||
{
|
||||
p.kickPlayer(ChatColor.RED + "You've been kicked because someone on your IP has been banned.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
plugin.pul.logPunishment(new Punishment(username, ip, sender.getName(), PunishmentType.TEMPBAN, reason));
|
||||
plugin.pul.logPunishment(new Punishment(username, ips.get(0), sender.getName(), PunishmentType.TEMPBAN, reason));
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,13 +1,11 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.shop.ShopItem;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.OP, source = SourceType.ONLY_IN_GAME)
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.ONLY_IN_GAME)
|
||||
@CommandParameters(description = "Trails rainbow wool behind you as you walk/fly.", usage = "/<command>")
|
||||
public class Command_trail extends FreedomCommand
|
||||
{
|
||||
@ -15,12 +13,6 @@ public class Command_trail extends FreedomCommand
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
if (!plugin.pl.getData(playerSender).hasItem(ShopItem.RAINBOW_TRAIL))
|
||||
{
|
||||
msg("You didn't purchase the ability to have a " + ShopItem.RAINBOW_TRAIL.getName() + "! Purchase it from the shop.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (plugin.tr.contains(playerSender))
|
||||
{
|
||||
plugin.tr.remove(playerSender);
|
||||
@ -29,7 +21,7 @@ public class Command_trail extends FreedomCommand
|
||||
else
|
||||
{
|
||||
plugin.tr.add(playerSender);
|
||||
msg("Trail enabled. Run this command again to disable it.");
|
||||
msg("Trail enabled. Use \"/trail off\" to disable.");
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -1,9 +1,12 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import com.earth2me.essentials.User;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -19,33 +22,20 @@ public class Command_unban extends FreedomCommand
|
||||
if (args.length > 0)
|
||||
{
|
||||
String username;
|
||||
String ip;
|
||||
final PlayerData entry = plugin.pl.getData(args[0]);
|
||||
|
||||
// Gets the IP using Essentials data if available
|
||||
if (plugin.esb.isEnabled() && plugin.esb.getEssentialsUser(args[0]) != null)
|
||||
if (entry == null)
|
||||
{
|
||||
User essUser = plugin.esb.getEssentialsUser(args[0]);
|
||||
//
|
||||
username = essUser.getName();
|
||||
ip = essUser.getLastLoginAddress();
|
||||
}
|
||||
// Secondary method - using Essentials if available
|
||||
else
|
||||
{
|
||||
final PlayerData entry = plugin.pl.getData(args[0]);
|
||||
if (entry == null)
|
||||
{
|
||||
msg(PLAYER_NOT_FOUND);
|
||||
return true;
|
||||
}
|
||||
username = entry.getName();
|
||||
ip = entry.getIps().get(0);
|
||||
msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly.");
|
||||
return true;
|
||||
}
|
||||
|
||||
username = entry.getName();
|
||||
final List<String> ips = new ArrayList<>(entry.getIps());
|
||||
|
||||
FUtil.adminAction(sender.getName(), "Unbanning " + username, true);
|
||||
msg(username + " has been unbanned along with the following IPs: " + StringUtils.join(ips, ", "));
|
||||
plugin.bm.removeBan(plugin.bm.getByUsername(username));
|
||||
plugin.bm.removeBan(plugin.bm.getByIp(ip));
|
||||
msg(username + " has been unbanned along with the IP: " + ip);
|
||||
|
||||
if (args.length >= 2)
|
||||
{
|
||||
@ -55,6 +45,20 @@ public class Command_unban extends FreedomCommand
|
||||
msg("Restored edits for: " + username);
|
||||
}
|
||||
}
|
||||
|
||||
for (String ip : ips)
|
||||
{
|
||||
Ban ban = plugin.bm.getByIp(ip);
|
||||
if (ban != null)
|
||||
{
|
||||
plugin.bm.removeBan(ban);
|
||||
}
|
||||
ban = plugin.bm.getByIp(FUtil.getFuzzyIp(ip));
|
||||
if (ban != null)
|
||||
{
|
||||
plugin.bm.removeBan(ban);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -17,7 +17,7 @@ public class Command_unlinkdiscord extends FreedomCommand
|
||||
{
|
||||
if (!plugin.dc.enabled)
|
||||
{
|
||||
msg("The Discord integration system is currently disabled.", ChatColor.RED);
|
||||
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -31,7 +31,7 @@ public class Command_unlinkdiscord extends FreedomCommand
|
||||
}
|
||||
|
||||
playerData.setDiscordID(null);
|
||||
msg("Unlinked " + args[0] + "'s Discord account.", ChatColor.GREEN);
|
||||
msg("Unlinked " + args[0] + "'s discord account.", ChatColor.GREEN);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -42,6 +42,7 @@ public class Command_unlinkdiscord extends FreedomCommand
|
||||
return true;
|
||||
}
|
||||
data.setDiscordID(null);
|
||||
data.setVerification(false);
|
||||
plugin.pl.save(data);
|
||||
msg("Your Minecraft account has been successfully unlinked from the Discord account.", ChatColor.GREEN);
|
||||
return true;
|
||||
|
@ -0,0 +1,101 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.discord.Discord;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.IMPOSTOR, source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Sends a verification code to the player, or the player can input the sent code. Admins can manually verify a player impostor.", usage = "/<command> <code | <playername>>")
|
||||
public class Command_verify extends FreedomCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
boolean verificationEnabled = ConfigEntry.DISCORD_VERIFICATION.getBoolean();
|
||||
if (!plugin.dc.enabled)
|
||||
{
|
||||
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!verificationEnabled)
|
||||
{
|
||||
msg("The Discord verification system is currently disabled.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (senderIsConsole)
|
||||
{
|
||||
msg("/manuallyverify <playername>", ChatColor.WHITE);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!plugin.pl.IsImpostor(playerSender))
|
||||
{
|
||||
msg("You are not an impostor, therefore you do not need to verify.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
PlayerData playerData = plugin.pl.getData(playerSender);
|
||||
String discordId = playerData.getDiscordID();
|
||||
|
||||
if (playerData.getDiscordID() == null)
|
||||
{
|
||||
msg("You do not have a Discord account linked to your Minecraft account, please verify the manual way.", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args.length == 0)
|
||||
{
|
||||
String code = plugin.dc.generateCode(10);
|
||||
plugin.dc.addVerificationCode(code, playerData);
|
||||
plugin.dc.getUser(discordId).openPrivateChannel().complete().sendMessage("A user with the IP `" + FUtil.getIp(playerSender) + "` has sent a verification request. Please run the following in-game command: `/verify " + code + "`").complete();
|
||||
msg("A verification code has been sent to your account, please copy the code and run /verify <code>", ChatColor.GREEN);
|
||||
return true;
|
||||
}
|
||||
|
||||
String code = args[0];
|
||||
String backupCode = null;
|
||||
|
||||
if (plugin.pl.IsImpostor(playerSender))
|
||||
{
|
||||
PlayerData mapPlayer = plugin.dc.getVerificationCodes().get(code);
|
||||
if (mapPlayer == null)
|
||||
{
|
||||
if (!playerData.getBackupCodes().contains(Discord.getMD5(code)))
|
||||
{
|
||||
msg("You have entered an invalid verification code", ChatColor.RED);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
backupCode = Discord.getMD5(code);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
plugin.dc.removeVerificationCode(code);
|
||||
}
|
||||
|
||||
final FPlayer fPlayer = plugin.pl.getPlayer(playerSender);
|
||||
if (fPlayer.getFreezeData().isFrozen())
|
||||
{
|
||||
fPlayer.getFreezeData().setFrozen(false);
|
||||
msg("You have been unfrozen.");
|
||||
}
|
||||
FUtil.bcastMsg(playerSender.getName() + " has verified!", ChatColor.GOLD);
|
||||
playerSender.setOp(true);
|
||||
plugin.pl.verify(playerSender, backupCode);
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,92 @@
|
||||
package me.totalfreedom.totalfreedommod.command;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
|
||||
@CommandParameters(description = "Verify an admin without giving them admin permissions.", usage = "/<command> <player>", aliases = "vns,verifynostaff,vna")
|
||||
public class Command_verifynoadmin extends FreedomCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
|
||||
{
|
||||
if (args.length < 1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Player player = getPlayer(args[0]);
|
||||
|
||||
if (player == null)
|
||||
{
|
||||
msg(PLAYER_NOT_FOUND);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (plugin.al.isAdminImpostor(player))
|
||||
{
|
||||
String ip = FUtil.getIp(player);
|
||||
if (!plugin.al.verifiedNoAdmin.containsKey(player.getName()))
|
||||
{
|
||||
List<String> ips = new ArrayList<>();
|
||||
ips.add(ip);
|
||||
plugin.al.verifiedNoAdmin.put(player.getName(), ips);
|
||||
}
|
||||
else
|
||||
{
|
||||
List<String> ips = plugin.al.verifiedNoAdmin.get(player.getName());
|
||||
if (!ips.contains(ip))
|
||||
{
|
||||
ips.add(ip);
|
||||
plugin.al.verifiedNoAdmin.remove(player.getName());
|
||||
plugin.al.verifiedNoAdmin.put(player.getName(), ips);
|
||||
}
|
||||
}
|
||||
plugin.rm.updateDisplay(player);
|
||||
FUtil.adminAction(sender.getName(), "Verified " + player.getName() + ", without admin permissions.", true);
|
||||
player.setOp(true);
|
||||
msg(player, YOU_ARE_OP);
|
||||
final FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||
if (fPlayer.getFreezeData().isFrozen())
|
||||
{
|
||||
fPlayer.getFreezeData().setFrozen(false);
|
||||
msg(player, "You have been unfrozen.");
|
||||
}
|
||||
msg("Verified " + player.getName() + " but didn't give them admin permissions", ChatColor.GREEN);
|
||||
}
|
||||
else
|
||||
{
|
||||
msg(player.getName() + " is not an admin imposter.", ChatColor.RED);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args)
|
||||
{
|
||||
if (args.length == 1)
|
||||
{
|
||||
List<String> adminImposters = new ArrayList<>();
|
||||
for (Player player : server.getOnlinePlayers())
|
||||
{
|
||||
if (plugin.al.isAdminImpostor(player))
|
||||
{
|
||||
adminImposters.add(player.getName());
|
||||
}
|
||||
}
|
||||
return adminImposters;
|
||||
}
|
||||
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
@ -5,6 +5,7 @@ import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.DepreciationAggregator;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.Command;
|
||||
@ -94,7 +95,7 @@ public class Command_whitelist extends FreedomCommand
|
||||
|
||||
if (player == null)
|
||||
{
|
||||
player = server.getOfflinePlayer(search_name);
|
||||
player = DepreciationAggregator.getOfflinePlayer(server, search_name);
|
||||
}
|
||||
|
||||
FUtil.adminAction(sender.getName(), "Adding " + player.getName() + " to the whitelist", false);
|
||||
@ -116,7 +117,7 @@ public class Command_whitelist extends FreedomCommand
|
||||
|
||||
if (player == null)
|
||||
{
|
||||
player = server.getOfflinePlayer(search_name);
|
||||
player = DepreciationAggregator.getOfflinePlayer(server, search_name);
|
||||
}
|
||||
|
||||
if (player.isWhitelisted())
|
||||
@ -157,7 +158,7 @@ public class Command_whitelist extends FreedomCommand
|
||||
if (args[0].equalsIgnoreCase("purge"))
|
||||
{
|
||||
FUtil.adminAction(sender.getName(), "Removing all players from the whitelist", false);
|
||||
msg("Removed " + purge() + " players from the whitelist.");
|
||||
msg("Removed " + plugin.si.purgeWhitelist() + " players from the whitelist.");
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -197,21 +198,10 @@ public class Command_whitelist extends FreedomCommand
|
||||
public List<String> getWhitelistedNames()
|
||||
{
|
||||
List<String> names = new ArrayList<>();
|
||||
for (OfflinePlayer player : server.getWhitelistedPlayers())
|
||||
for (Object name : plugin.si.getWhitelisted())
|
||||
{
|
||||
names.add(player.getName());
|
||||
names.add(String.valueOf(name));
|
||||
}
|
||||
return names;
|
||||
}
|
||||
|
||||
public int purge()
|
||||
{
|
||||
int removed = 0;
|
||||
for (OfflinePlayer player : server.getWhitelistedPlayers())
|
||||
{
|
||||
player.setWhitelisted(false);
|
||||
removed++;
|
||||
}
|
||||
return removed;
|
||||
}
|
||||
}
|
@ -13,15 +13,19 @@ import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Server;
|
||||
import org.bukkit.command.*;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandMap;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.ConsoleCommandSender;
|
||||
import org.bukkit.command.PluginCommand;
|
||||
import org.bukkit.command.TabCompleter;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.util.StringUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@ -36,6 +40,7 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
||||
public static final String NO_PERMISSION = ChatColor.RED + "You do not have permission to execute this command.";
|
||||
public static final Timer timer = new Timer();
|
||||
public static final Map<CommandSender, FreedomCommand> COOLDOWN_TIMERS = new HashMap<>();
|
||||
private static CommandMap commandMap;
|
||||
protected final TotalFreedomMod plugin = TotalFreedomMod.getPlugin();
|
||||
protected final Server server = plugin.getServer();
|
||||
private final String name;
|
||||
@ -43,8 +48,6 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
||||
private final String usage;
|
||||
private final String aliases;
|
||||
private final Rank level;
|
||||
|
||||
private final String permission;
|
||||
private final SourceType source;
|
||||
private final boolean blockHostConsole;
|
||||
private final int cooldown;
|
||||
@ -61,28 +64,39 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
||||
this.usage = params.usage();
|
||||
this.aliases = params.aliases();
|
||||
this.level = perms.level();
|
||||
this.permission = perms.permission().isEmpty() ? "totalfreedommod." + this.name.toLowerCase() : perms.permission();
|
||||
this.source = perms.source();
|
||||
this.blockHostConsole = perms.blockHostConsole();
|
||||
this.cooldown = perms.cooldown();
|
||||
}
|
||||
|
||||
public static CommandMap getCommandMap()
|
||||
{
|
||||
if (commandMap == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
final Field f = Bukkit.getServer().getPluginManager().getClass().getDeclaredField("commandMap");
|
||||
f.setAccessible(true);
|
||||
commandMap = (CommandMap)f.get(Bukkit.getServer().getPluginManager());
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return commandMap;
|
||||
}
|
||||
|
||||
public static FreedomCommand getFrom(Command command)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (command instanceof FCommand)
|
||||
{
|
||||
return ((FCommand) command).getExecutor();
|
||||
}
|
||||
return (FreedomCommand)(((PluginCommand)command).getExecutor());
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
FLog.severe(ex);
|
||||
return null;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String getCommandPrefix()
|
||||
@ -105,7 +119,7 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
||||
{
|
||||
cmd.setUsage(this.usage);
|
||||
}
|
||||
server.getCommandMap().register("totalfreedommod", cmd);
|
||||
getCommandMap().register("totalfreedommod", cmd);
|
||||
cmd.setExecutor(this);
|
||||
}
|
||||
|
||||
@ -165,65 +179,8 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
protected void checkRank(@Deprecated Rank rank, String permission)
|
||||
{
|
||||
//TODO: Not bothering with BukkitTelnet now.
|
||||
if (sender instanceof Player player)
|
||||
{
|
||||
if (!plugin.permissionHandler.hasPermission(player, permission))
|
||||
{
|
||||
noPerms();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!plugin.rm.getRank(sender).isAtLeast(rank))
|
||||
{
|
||||
noPerms();
|
||||
}
|
||||
}
|
||||
protected void checkPermissions(String permission)
|
||||
{
|
||||
//TODO: Not bothering with BukkitTelnet now.
|
||||
if (sender instanceof Player player)
|
||||
{
|
||||
if (!plugin.permissionHandler.hasPermission(player, permission))
|
||||
{
|
||||
noPerms();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean checkPermissionsSilent(String permission)
|
||||
{
|
||||
//TODO: Not bothering with BukkitTelnet now.
|
||||
// FLog.debug("Using checkPermissionsSilent");
|
||||
if (sender instanceof ConsoleCommandSender)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (sender instanceof Player player)
|
||||
{
|
||||
// FLog.debug("Checking player permission for " + player.getUniqueId() + " - " + permission);
|
||||
return plugin.permissionHandler.hasPermission(player, permission);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
protected void checkRank(Rank rank)
|
||||
{
|
||||
// FLog.debug("Using checkRank");
|
||||
//TODO: Not bothering with BukkitTelnet now.
|
||||
if (sender instanceof Player player)
|
||||
{
|
||||
// FLog.debug("Checking player permission for " + player.getUniqueId() + " - " + this.permission);
|
||||
if (!plugin.permissionHandler.hasPermission(player, this.permission))
|
||||
{
|
||||
noPerms();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!plugin.rm.getRank(sender).isAtLeast(rank))
|
||||
{
|
||||
noPerms();
|
||||
@ -359,7 +316,7 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
||||
return perms;
|
||||
}
|
||||
|
||||
public final class FCommand extends Command implements PluginIdentifiableCommand
|
||||
private final class FCommand extends Command
|
||||
{
|
||||
private FreedomCommand cmd = null;
|
||||
|
||||
@ -368,11 +325,6 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
||||
super(command);
|
||||
}
|
||||
|
||||
public final FreedomCommand getExecutor()
|
||||
{
|
||||
return cmd;
|
||||
}
|
||||
|
||||
public void setExecutor(FreedomCommand cmd)
|
||||
{
|
||||
this.cmd = cmd;
|
||||
@ -425,15 +377,7 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
||||
|
||||
public boolean func2()
|
||||
{
|
||||
/*if (!plugin.rm.getRank(sender).isAtLeast(perms.level()))
|
||||
{
|
||||
msg(NO_PERMISSION);
|
||||
return true;
|
||||
}*/
|
||||
|
||||
FLog.debug("Result of check perms: " + (!checkPermissionsSilent(cmd.permission)));
|
||||
|
||||
if (!checkPermissionsSilent(cmd.permission))
|
||||
if (!plugin.rm.getRank(sender).isAtLeast(perms.level()))
|
||||
{
|
||||
msg(NO_PERMISSION);
|
||||
return true;
|
||||
@ -483,11 +427,5 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter
|
||||
}
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull Plugin getPlugin()
|
||||
{
|
||||
return plugin;
|
||||
}
|
||||
}
|
||||
}
|
@ -45,8 +45,6 @@ public enum ConfigEntry
|
||||
MOB_LIMITER_DISABLE_GIANT(Boolean.class, "moblimiter.disable.giant"),
|
||||
MOB_LIMITER_DISABLE_SLIME(Boolean.class, "moblimiter.disable.slime"),
|
||||
//
|
||||
SPAWNMOB_MAX(Integer.class, "spawnmob.max"),
|
||||
//
|
||||
HTTPD_ENABLED(Boolean.class, "httpd.enabled"),
|
||||
HTTPD_HOST(String.class, "httpd.host"),
|
||||
HTTPD_PORT(Integer.class, "httpd.port"),
|
||||
@ -73,10 +71,7 @@ public enum ConfigEntry
|
||||
SERVER_WHITELIST_MOTD(String.class, "server.motds.whitelist"),
|
||||
SERVER_FULL_MOTD(String.class, "server.motds.full"),
|
||||
//
|
||||
|
||||
PERMISSIONS_GROUPS_ADMIN(String.class, "permissions.groups.admin"),
|
||||
PERMISSIONS_GROUPS_SENIOR(String.class, "permissions.groups.senior_admin"),
|
||||
PERMISSIONS_GROUPS_DEFAULT(String.class, "permissions.groups.default"),
|
||||
DISCORD_VERIFICATION(Boolean.class, "discord.verification"),
|
||||
DISCORD_TOKEN(String.class, "discord.token"),
|
||||
DISCORD_REPORT_CHANNEL_ID(String.class, "discord.report_channel_id"),
|
||||
DISCORD_CHAT_CHANNEL_ID(String.class, "discord.chat_channel_id"),
|
||||
@ -91,7 +86,6 @@ public enum ConfigEntry
|
||||
DISCORD_ASSISTANT_EXECUTIVE_ROLE_ID(String.class, "discord.assistant_executive_role_id"),
|
||||
DISCORD_EXECUTIVE_ROLE_ID(String.class, "discord.executive_role_id"),
|
||||
DISCORD_SERVER_OWNER_ROLE_ID(String.class, "discord.server_owner_role_id"),
|
||||
DISCORD_INVITE_LINK(String.class, "discord.invite_link"),
|
||||
//
|
||||
PTERO_URL(String.class, "ptero.url"),
|
||||
PTERO_DEFAULT_EMAIL_DOMAIN(String.class, "ptero.default_email_domain"),
|
||||
@ -116,7 +110,6 @@ public enum ConfigEntry
|
||||
SHOP_PRICES_STACKING_POTATO(Integer.class, "shop.prices.stacking_potato"),
|
||||
SHOP_PRICES_CLOWN_FISH(Integer.class, "shop.prices.clown_fish"),
|
||||
SHOP_PRICES_LOGIN_MESSAGES(Integer.class, "shop.prices.login_messages"),
|
||||
SHOP_PRICES_RAINBOW_TRAIL(Integer.class, "shop.prices.rainbow_trail"),
|
||||
//
|
||||
ADMINLIST_CLEAN_THESHOLD_HOURS(Integer.class, "adminlist.clean_threshold_hours"),
|
||||
ADMINLIST_CONSOLE_IS_ADMIN(Boolean.class, "adminlist.console_is_admin"),
|
||||
@ -172,8 +165,6 @@ public enum ConfigEntry
|
||||
ADMIN_INFO(List.class, "admininfo"),
|
||||
VOTING_INFO(List.class, "votinginfo"),
|
||||
MASTER_BUILDER_INFO(List.class, "masterbuilderinfo"),
|
||||
FIRST_JOIN_INFO(List.class, "first_join_info.text"),
|
||||
FIRST_JOIN_INFO_ENABLED(Boolean.class, "first_join_info.enabled"),
|
||||
AUTO_ENTITY_WIPE(Boolean.class, "auto_wipe"),
|
||||
TOGGLE_CHAT(Boolean.class, "toggle_chat"),
|
||||
DEVELOPER_MODE(Boolean.class, "developer_mode"),
|
||||
|
@ -1,6 +1,9 @@
|
||||
package me.totalfreedom.totalfreedommod.discord;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.time.Instant;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.ArrayList;
|
||||
@ -19,6 +22,7 @@ import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import net.dv8tion.jda.api.EmbedBuilder;
|
||||
import net.dv8tion.jda.api.JDA;
|
||||
import net.dv8tion.jda.api.JDABuilder;
|
||||
@ -37,6 +41,7 @@ import net.dv8tion.jda.api.requests.GatewayIntent;
|
||||
import net.dv8tion.jda.api.utils.ChunkingFilter;
|
||||
import net.dv8tion.jda.api.utils.MemberCachePolicy;
|
||||
import net.dv8tion.jda.internal.utils.concurrent.CountingThreadFactory;
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.lang.WordUtils;
|
||||
import org.bukkit.GameRule;
|
||||
@ -52,12 +57,18 @@ public class Discord extends FreedomService
|
||||
{
|
||||
|
||||
public static HashMap<String, PlayerData> LINK_CODES = new HashMap<>();
|
||||
public static HashMap<String, PlayerData> VERIFICATION_CODES = new HashMap<>();
|
||||
public static JDA bot = null;
|
||||
public ScheduledThreadPoolExecutor RATELIMIT_EXECUTOR;
|
||||
public List<CompletableFuture<Message>> sentMessages = new ArrayList<>();
|
||||
public Boolean enabled = false;
|
||||
private final Pattern DISCORD_MENTION_PATTERN = Pattern.compile("(<@!?([0-9]{16,20})>)");
|
||||
|
||||
public static String getMD5(String string)
|
||||
{
|
||||
return DigestUtils.md5Hex(string);
|
||||
}
|
||||
|
||||
public static String getCode(PlayerData playerData)
|
||||
{
|
||||
for (String code : LINK_CODES.keySet())
|
||||
@ -146,6 +157,12 @@ public class Discord extends FreedomService
|
||||
|
||||
public void startBot()
|
||||
{
|
||||
boolean verificationEnabled = ConfigEntry.DISCORD_VERIFICATION.getBoolean();
|
||||
if (!verificationEnabled)
|
||||
{
|
||||
FLog.info("Discord Verification has been manually disabled.");
|
||||
}
|
||||
|
||||
enabled = !Strings.isNullOrEmpty(ConfigEntry.DISCORD_TOKEN.getString());
|
||||
if (!enabled)
|
||||
{
|
||||
@ -182,15 +199,15 @@ public class Discord extends FreedomService
|
||||
.setMemberCachePolicy(MemberCachePolicy.ALL)
|
||||
.enableIntents(GatewayIntent.GUILD_MEMBERS)
|
||||
.build();
|
||||
FLog.info("Discord integration has successfully enabled!");
|
||||
FLog.info("Discord verification bot has successfully enabled!");
|
||||
}
|
||||
catch (LoginException e)
|
||||
{
|
||||
FLog.warning("An invalid token for Discord integration was provided, the bot will not enable.");
|
||||
FLog.warning("An invalid token for the discord verification bot, the bot will not enable.");
|
||||
}
|
||||
catch (IllegalArgumentException e)
|
||||
{
|
||||
FLog.warning("Discord integration failed to start.");
|
||||
FLog.warning("Discord verification bot failed to start.");
|
||||
}
|
||||
catch (NoClassDefFoundError e)
|
||||
{
|
||||
@ -244,6 +261,35 @@ public class Discord extends FreedomService
|
||||
return member.getUser();
|
||||
}
|
||||
|
||||
public boolean sendBackupCodes(PlayerData playerData)
|
||||
{
|
||||
List<String> codes = generateBackupCodes();
|
||||
List<String> encryptedCodes = generateEncryptedBackupCodes(codes);
|
||||
User user = getUser(playerData.getDiscordID());
|
||||
File file = generateBackupCodesFile(playerData.getName(), codes);
|
||||
if (file == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
PrivateChannel privateChannel = user.openPrivateChannel().complete();
|
||||
privateChannel.sendMessage("Do not share these codes with anyone as they can be used to impose as you.").addFile(file).complete();
|
||||
playerData.setBackupCodes(encryptedCodes);
|
||||
plugin.pl.save(playerData);
|
||||
//noinspection ResultOfMethodCallIgnored
|
||||
file.delete();
|
||||
return true;
|
||||
}
|
||||
|
||||
public List<String> generateBackupCodes()
|
||||
{
|
||||
List<String> codes = new ArrayList<>();
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
codes.add(FUtil.randomAlphanumericString(10));
|
||||
}
|
||||
return codes;
|
||||
}
|
||||
|
||||
public String generateCode(int size)
|
||||
{
|
||||
StringBuilder code = new StringBuilder();
|
||||
@ -255,6 +301,58 @@ public class Discord extends FreedomService
|
||||
return code.toString();
|
||||
}
|
||||
|
||||
public List<String> generateEncryptedBackupCodes(List<String> codes)
|
||||
{
|
||||
List<String> encryptedCodes = new ArrayList<>();
|
||||
for (String code : codes)
|
||||
{
|
||||
encryptedCodes.add(getMD5(code));
|
||||
}
|
||||
return encryptedCodes;
|
||||
}
|
||||
|
||||
public File generateBackupCodesFile(String name, List<String> codes)
|
||||
{
|
||||
StringBuilder text = new StringBuilder();
|
||||
text.append("Below are your backup codes for use on TotalFreedom in the event you lose access to your discord account.\n")
|
||||
.append("Simply pick a code, and run /verify <code> on the server. Each code is one use, so be sure to cross it off once you use it.\n")
|
||||
.append("To generate new codes, simply run /generatebackupcodes\n\n");
|
||||
|
||||
for (String code : codes)
|
||||
{
|
||||
text.append(code).append("\n");
|
||||
}
|
||||
|
||||
String fileUrl = plugin.getDataFolder().getAbsolutePath() + "/TF-Backup-Codes-" + name + ".txt";
|
||||
try
|
||||
{
|
||||
FileWriter fileWriter = new FileWriter(fileUrl);
|
||||
fileWriter.write(text.toString());
|
||||
fileWriter.close();
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
FLog.severe("Failed to generate backup codes file: " + e.toString());
|
||||
return null;
|
||||
}
|
||||
return new File(fileUrl);
|
||||
}
|
||||
|
||||
public void addVerificationCode(String code, PlayerData playerData)
|
||||
{
|
||||
VERIFICATION_CODES.put(code, playerData);
|
||||
}
|
||||
|
||||
public void removeVerificationCode(String code)
|
||||
{
|
||||
VERIFICATION_CODES.remove(code);
|
||||
}
|
||||
|
||||
public HashMap<String, PlayerData> getVerificationCodes()
|
||||
{
|
||||
return VERIFICATION_CODES;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerDeath(PlayerDeathEvent event)
|
||||
{
|
||||
@ -377,7 +475,7 @@ public class Discord extends FreedomService
|
||||
messageChatChannel("**Server has stopped**");
|
||||
}
|
||||
|
||||
FLog.info("Discord integration has successfully shutdown.");
|
||||
FLog.info("Discord verification bot has successfully shutdown.");
|
||||
}
|
||||
|
||||
public String deformat(String input)
|
||||
|
@ -10,12 +10,9 @@ import net.dv8tion.jda.api.entities.Member;
|
||||
import net.dv8tion.jda.api.entities.Message;
|
||||
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
||||
import net.dv8tion.jda.api.hooks.ListenerAdapter;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import net.md_5.bungee.api.chat.ClickEvent;
|
||||
import net.md_5.bungee.api.chat.ComponentBuilder;
|
||||
import net.md_5.bungee.api.chat.HoverEvent;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import net.md_5.bungee.api.chat.hover.content.Text;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -31,66 +28,39 @@ public class DiscordToMinecraftListener extends ListenerAdapter
|
||||
{
|
||||
Member member = event.getMember();
|
||||
String tag = getDisplay(member);
|
||||
StringBuilder message = new StringBuilder(ChatColor.DARK_GRAY + "[" + ChatColor.DARK_AQUA + "Discord" + ChatColor.DARK_GRAY + "]");
|
||||
Message msg = event.getMessage();
|
||||
|
||||
ComponentBuilder emsg = new ComponentBuilder();
|
||||
|
||||
// Prefix
|
||||
emsg.append(ChatColor.DARK_GRAY + "[");
|
||||
TextComponent inviteLink = new TextComponent("Discord");
|
||||
inviteLink.setColor(ChatColor.DARK_AQUA.asBungee());
|
||||
inviteLink.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
|
||||
new Text("Click here to get the invite link!")));
|
||||
inviteLink.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL,
|
||||
ConfigEntry.DISCORD_INVITE_LINK.getString()));
|
||||
emsg.append(inviteLink);
|
||||
emsg.append(ChatColor.DARK_GRAY + "] ", ComponentBuilder.FormatRetention.NONE);
|
||||
|
||||
// Tag (if they have one)
|
||||
if (tag != null)
|
||||
{
|
||||
emsg.append(tag);
|
||||
message.append(" ").append(tag);
|
||||
}
|
||||
message.append(" ").append(ChatColor.RED).append(ChatColor.stripColor(member.getEffectiveName())).append(ChatColor.DARK_GRAY).append(":").append(ChatColor.RESET);
|
||||
ComponentBuilder builder = new ComponentBuilder(message.toString());
|
||||
if (!msg.getContentDisplay().isEmpty())
|
||||
{
|
||||
builder.append(" ").append(ChatColor.stripColor(msg.getContentDisplay()));
|
||||
message.append(" ").append(ChatColor.stripColor(msg.getContentDisplay())); // for logging
|
||||
}
|
||||
|
||||
emsg.append(" ");
|
||||
|
||||
// User
|
||||
TextComponent user = new TextComponent(ChatColor.stripColor(member.getEffectiveName()));
|
||||
user.setColor(ChatColor.RED.asBungee());
|
||||
emsg.append(user);
|
||||
|
||||
// Message
|
||||
emsg.append(ChatColor.DARK_GRAY + ": " + ChatColor.RESET
|
||||
+ ChatColor.stripColor(msg.getContentDisplay()), ComponentBuilder.FormatRetention.NONE);
|
||||
|
||||
// Attachments
|
||||
if (!msg.getAttachments().isEmpty())
|
||||
{
|
||||
if (!msg.getContentDisplay().isEmpty())
|
||||
emsg.append(" ");
|
||||
|
||||
for (Message.Attachment attachment : msg.getAttachments())
|
||||
{
|
||||
TextComponent media = new TextComponent("[Media] ");
|
||||
media.setColor(ChatColor.YELLOW.asBungee());
|
||||
media.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, attachment.getUrl()));
|
||||
media.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(attachment.getUrl())));
|
||||
|
||||
emsg.append(media, ComponentBuilder.FormatRetention.NONE);
|
||||
attachment.getUrl();
|
||||
builder.append(" ");
|
||||
TextComponent text = new TextComponent(ChatColor.YELLOW + "[Media]");
|
||||
text.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, attachment.getUrl()));
|
||||
builder.append(text);
|
||||
message.append(" [Media]"); // for logging
|
||||
}
|
||||
}
|
||||
|
||||
BaseComponent[] components = emsg.create();
|
||||
|
||||
for (Player player : Bukkit.getOnlinePlayers())
|
||||
{
|
||||
if (TotalFreedomMod.getPlugin().pl.getData(player).doesDisplayDiscord())
|
||||
{
|
||||
player.spigot().sendMessage(components);
|
||||
player.spigot().sendMessage(builder.create());
|
||||
}
|
||||
}
|
||||
|
||||
FLog.info(TextComponent.toLegacyText(components), true);
|
||||
FLog.info(message.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -22,8 +22,9 @@ public class PrivateMessageListener extends ListenerAdapter
|
||||
PlayerData player = Discord.LINK_CODES.get(code);
|
||||
name = player.getName();
|
||||
player.setDiscordID(event.getMessage().getAuthor().getId());
|
||||
player.setVerification(true);
|
||||
|
||||
Admin admin = TotalFreedomMod.getPlugin().al.getEntryByUuid(player.getUuid());
|
||||
Admin admin = TotalFreedomMod.getPlugin().al.getEntryByName(name);
|
||||
if (admin != null)
|
||||
{
|
||||
Discord.syncRoles(admin, player.getDiscordID());
|
||||
@ -36,7 +37,8 @@ public class PrivateMessageListener extends ListenerAdapter
|
||||
{
|
||||
return;
|
||||
}
|
||||
event.getChannel().sendMessage("Link successful. Now this Discord account is linked with your Minecraft account **" + name + "**.").complete();
|
||||
event.getChannel().sendMessage("Link successful. Now this Discord account is linked with your Minecraft account **" + name + "**.\n"
|
||||
+ "Now when you are an impostor on the server, you may use `/verify` to verify.").complete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -61,8 +61,11 @@ public class FreezeData
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
FUtil.adminAction("TotalFreedom", "Unfreezing " + player.getName(), false);
|
||||
setFrozen(false);
|
||||
if (!Objects.requireNonNull(plugin()).al.isAdminImpostor(player) && Objects.requireNonNull(plugin()).pl.isPlayerImpostor(player))
|
||||
{
|
||||
FUtil.adminAction("TotalFreedom", "Unfreezing " + player.getName(), false);
|
||||
setFrozen(false);
|
||||
}
|
||||
}
|
||||
|
||||
}.runTaskLater(Objects.requireNonNull(plugin()), AUTO_PURGE_TICKS);
|
||||
|
@ -4,10 +4,7 @@ import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.SplittableRandom;
|
||||
import java.util.UUID;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.shop.ShopItem;
|
||||
import me.totalfreedom.totalfreedommod.util.Groups;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
@ -21,7 +18,7 @@ import org.bukkit.event.player.PlayerMoveEvent;
|
||||
public class Trailer extends FreedomService
|
||||
{
|
||||
private final SplittableRandom random = new SplittableRandom();
|
||||
private final Set<UUID> trailPlayers = new HashSet<>(); // player UUID
|
||||
private final Set<String> trailPlayers = new HashSet<>(); // player name
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
@ -36,17 +33,17 @@ public class Trailer extends FreedomService
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPlayerMove(PlayerMoveEvent event)
|
||||
{
|
||||
/* Doesn't continue any further if...
|
||||
* - The trail list is empty
|
||||
* - The player doesn't have their trail enabled in the first place
|
||||
* - The player doesn't have the trail item in the shop at all
|
||||
* - The player doesn't have permission to modify blocks in their current world
|
||||
*/
|
||||
if (trailPlayers.isEmpty()
|
||||
|| !trailPlayers.contains(event.getPlayer().getUniqueId())
|
||||
|| !plugin.pl.getData(event.getPlayer()).hasItem(ShopItem.RAINBOW_TRAIL)
|
||||
|| plugin.wr.doRestrict(event.getPlayer())
|
||||
|| !plugin.wgb.canEditCurrentWorld(event.getPlayer()))
|
||||
if (trailPlayers.isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!trailPlayers.contains(event.getPlayer().getName()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.getPlayer().getWorld().equals(plugin.wm.masterBuilderWorld.getWorld()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -72,7 +69,7 @@ public class Trailer extends FreedomService
|
||||
{
|
||||
final Location trail_pos;
|
||||
trail_pos = new Location(event.getPlayer().getWorld(), fromBlock.getX() + x, fromBlock.getY(), fromBlock.getZ() + z);
|
||||
if (trailPlayers.contains(event.getPlayer().getUniqueId()) && plugin.cpb.isEnabled())
|
||||
if (trailPlayers.contains(event.getPlayer().getName()) && plugin.cpb.isEnabled())
|
||||
{
|
||||
plugin.cpb.getCoreProtectAPI().logPlacement(event.getPlayer().getName(), trail_pos, material, data);
|
||||
}
|
||||
@ -82,16 +79,16 @@ public class Trailer extends FreedomService
|
||||
|
||||
public void remove(Player player)
|
||||
{
|
||||
trailPlayers.remove(player.getUniqueId());
|
||||
trailPlayers.remove(player.getName());
|
||||
}
|
||||
|
||||
public void add(Player player)
|
||||
{
|
||||
trailPlayers.add(player.getUniqueId());
|
||||
trailPlayers.add(player.getName());
|
||||
}
|
||||
|
||||
public boolean contains(Player player)
|
||||
{
|
||||
return trailPlayers.contains(player.getUniqueId());
|
||||
return trailPlayers.contains(player.getName());
|
||||
}
|
||||
}
|
||||
|
@ -11,15 +11,9 @@ public class HTMLGenerationTools
|
||||
return "<p>" + escapeHtml4(data) + "</p>\r\n";
|
||||
}
|
||||
|
||||
public static String heading(String data, String id, int level)
|
||||
{
|
||||
return "<h" + level + (id != null ? " id=\"" + id + "\"" : "") + ">" + escapeHtml4(data)
|
||||
+ "</h" + level + ">\r\n";
|
||||
}
|
||||
|
||||
public static String heading(String data, int level)
|
||||
{
|
||||
return heading(data, null, level);
|
||||
return "<h" + level + ">" + escapeHtml4(data) + "</h" + level + ">\r\n";
|
||||
}
|
||||
|
||||
public static <K, V> String list(Map<K, V> map)
|
||||
|
@ -1,67 +1,52 @@
|
||||
package me.totalfreedom.totalfreedommod.httpd.module;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||
import me.totalfreedom.totalfreedommod.command.FreedomCommand;
|
||||
import me.totalfreedom.totalfreedommod.httpd.NanoHTTPD;
|
||||
import me.totalfreedom.totalfreedommod.rank.Rank;
|
||||
import me.totalfreedom.totalfreedommod.rank.Displayable;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandMap;
|
||||
import org.bukkit.command.PluginIdentifiableCommand;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import org.bukkit.command.SimpleCommandMap;
|
||||
import static me.totalfreedom.totalfreedommod.httpd.HTMLGenerationTools.heading;
|
||||
import static me.totalfreedom.totalfreedommod.httpd.HTMLGenerationTools.paragraph;
|
||||
import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
|
||||
|
||||
public class Module_help extends HTTPDModule
|
||||
{
|
||||
|
||||
public Module_help(NanoHTTPD.HTTPSession session)
|
||||
{
|
||||
super(session);
|
||||
}
|
||||
|
||||
private static String buildDescription(@NotNull Command command)
|
||||
{
|
||||
return buildDescription(command.getName(), command.getDescription(), command.getUsage(), StringUtils.join(command.getAliases(), ", "));
|
||||
}
|
||||
|
||||
private static String buildDescription(@NotNull FreedomCommand command)
|
||||
{
|
||||
return buildDescription(command.getName(), command.getDescription(), command.getUsage(), command.getAliases());
|
||||
}
|
||||
|
||||
private static String buildDescription(@NotNull String name, @Nullable String description, @NotNull String usage, @NotNull String aliases)
|
||||
private static String buildDescription(Command command)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
sb.append(
|
||||
"<li><span class=\"commandName\">{$CMD_NAME}</span> - Usage: <span class=\"commandUsage\">{$CMD_USAGE}</span>"
|
||||
.replace("{$CMD_NAME}", escapeHtml4(name.trim()))
|
||||
.replace("{$CMD_USAGE}", escapeHtml4(usage.trim())));
|
||||
.replace("{$CMD_NAME}", escapeHtml4(command.getName().trim()))
|
||||
.replace("{$CMD_USAGE}", escapeHtml4(command.getUsage().trim())));
|
||||
|
||||
if (!aliases.isEmpty())
|
||||
if (!command.getAliases().isEmpty())
|
||||
{
|
||||
sb.append(
|
||||
" - Aliases: <span class=\"commandAliases\">{$CMD_ALIASES}</span>"
|
||||
.replace("{$CMD_ALIASES}", escapeHtml4(aliases.trim())));
|
||||
.replace("{$CMD_ALIASES}", escapeHtml4(StringUtils.join(command.getAliases(), ", "))));
|
||||
}
|
||||
|
||||
if (description != null)
|
||||
{
|
||||
sb.append(
|
||||
"<br><span class=\"commandDescription\">{$CMD_DESC}</span></li>\r\n"
|
||||
.replace("{$CMD_DESC}", escapeHtml4(description.trim())));
|
||||
}
|
||||
sb.append(
|
||||
"<br><span class=\"commandDescription\">{$CMD_DESC}</span></li>\r\n"
|
||||
.replace("{$CMD_DESC}", escapeHtml4(command.getDescription().trim())));
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
@ -69,7 +54,11 @@ public class Module_help extends HTTPDModule
|
||||
@Override
|
||||
public String getBody()
|
||||
{
|
||||
final CommandMap map = Bukkit.getCommandMap();
|
||||
final CommandMap map = FreedomCommand.getCommandMap();
|
||||
if (!(map instanceof SimpleCommandMap))
|
||||
{
|
||||
return paragraph("Error loading commands.");
|
||||
}
|
||||
|
||||
final StringBuilder responseBody = new StringBuilder()
|
||||
.append(heading("Command Help", 1))
|
||||
@ -77,7 +66,7 @@ public class Module_help extends HTTPDModule
|
||||
"This page is an automatically generated listing of all plugin commands that are currently live on the server. "
|
||||
+ "Please note that it does not include vanilla server commands."));
|
||||
|
||||
final Collection<Command> knownCommands = map.getKnownCommands().values();
|
||||
final Collection<Command> knownCommands = ((SimpleCommandMap)map).getCommands();
|
||||
final Map<String, List<Command>> commandsByPlugin = new HashMap<>();
|
||||
|
||||
for (Command command : knownCommands)
|
||||
@ -90,47 +79,34 @@ public class Module_help extends HTTPDModule
|
||||
|
||||
List<Command> pluginCommands = commandsByPlugin.computeIfAbsent(pluginName, k -> Lists.newArrayList());
|
||||
|
||||
if (!pluginCommands.contains(command))
|
||||
{
|
||||
pluginCommands.add(command);
|
||||
}
|
||||
pluginCommands.add(command);
|
||||
}
|
||||
|
||||
final CommandComparator comparator = new CommandComparator();
|
||||
|
||||
// For every plugin...
|
||||
for (Map.Entry<String, List<Command>> entry : commandsByPlugin.entrySet())
|
||||
{
|
||||
final String pluginName = entry.getKey();
|
||||
final List<Command> commands = entry.getValue();
|
||||
|
||||
// Sort them alphabetically
|
||||
commands.sort(comparator);
|
||||
commands.sort(new CommandComparator());
|
||||
|
||||
responseBody.append(heading(pluginName, pluginName, 2)).append("<ul>\r\n");
|
||||
responseBody.append(heading(pluginName, 2)).append("<ul>\r\n");
|
||||
|
||||
if (!plugin.getName().equals(pluginName))
|
||||
Displayable lastTfmCommandLevel = null;
|
||||
for (Command command : commands)
|
||||
{
|
||||
commands.forEach((command) -> responseBody.append(buildDescription(command)));
|
||||
}
|
||||
else
|
||||
{
|
||||
Map<Rank, List<FreedomCommand>> freedomCommands = new HashMap<>();
|
||||
if (!TotalFreedomMod.pluginName.equals(pluginName))
|
||||
{
|
||||
responseBody.append(buildDescription(command));
|
||||
continue;
|
||||
}
|
||||
|
||||
// Filters out non-TFM commands
|
||||
commands.stream().filter((cmd) -> cmd instanceof FreedomCommand.FCommand).forEach((tfmCmd) -> {
|
||||
Rank rank = FreedomCommand.getFrom(tfmCmd).getLevel();
|
||||
if (!freedomCommands.containsKey(rank))
|
||||
freedomCommands.put(rank, new ArrayList<>());
|
||||
freedomCommands.get(rank).add(FreedomCommand.getFrom(tfmCmd));
|
||||
});
|
||||
|
||||
// Finally dumps them to HTML
|
||||
Arrays.stream(Rank.values()).filter(freedomCommands::containsKey)
|
||||
.sorted(comparator::compare).forEach((rank -> {
|
||||
responseBody.append("</ul>\r\n").append(heading(rank.getName(), 3)).append("<ul>\r\n");
|
||||
freedomCommands.get(rank).stream().sorted(comparator::compare).forEach((command) -> responseBody.append(buildDescription(command)));
|
||||
}));
|
||||
Displayable tfmCommandLevel = Objects.requireNonNull(FreedomCommand.getFrom(command)).getPerms().level();
|
||||
if (lastTfmCommandLevel == null || lastTfmCommandLevel != tfmCommandLevel)
|
||||
{
|
||||
responseBody.append("</ul>\r\n").append(heading(tfmCommandLevel.getName(), 3)).append("<ul>\r\n");
|
||||
}
|
||||
lastTfmCommandLevel = tfmCommandLevel;
|
||||
responseBody.append(buildDescription(command));
|
||||
}
|
||||
|
||||
responseBody.append("</ul>\r\n");
|
||||
@ -142,7 +118,7 @@ public class Module_help extends HTTPDModule
|
||||
@Override
|
||||
public String getTitle()
|
||||
{
|
||||
return plugin.getName() + " :: Command Help";
|
||||
return "TotalFreedomMod :: Command Help";
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -153,23 +129,23 @@ public class Module_help extends HTTPDModule
|
||||
|
||||
public static class CommandComparator implements Comparator<Command>
|
||||
{
|
||||
|
||||
@Override
|
||||
public int compare(Command a, Command b)
|
||||
{
|
||||
return a.getName().compareTo(b.getName());
|
||||
}
|
||||
FreedomCommand ca = FreedomCommand.getFrom(a);
|
||||
FreedomCommand cb = FreedomCommand.getFrom(b);
|
||||
|
||||
public int compare(FreedomCommand a, FreedomCommand b)
|
||||
{
|
||||
return a.getName().compareTo(b.getName());
|
||||
}
|
||||
if (ca == null
|
||||
|| cb == null
|
||||
|| ca.getPerms() == null
|
||||
|| cb.getPerms() == null)
|
||||
{
|
||||
return a.getName().compareTo(b.getName());
|
||||
}
|
||||
|
||||
public int compare(Rank a, Rank b)
|
||||
{
|
||||
Integer levelA = a.getLevel();
|
||||
Integer levelB = b.getLevel();
|
||||
|
||||
return levelB.compareTo(levelA);
|
||||
return ca.getPerms().level().getName().compareTo(cb.getPerms().level().getName());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -4,16 +4,12 @@ import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.admin.AdminList;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.httpd.NanoHTTPD;
|
||||
import me.totalfreedom.totalfreedommod.permissions.handler.DefaultPermissionHandler;
|
||||
import me.totalfreedom.totalfreedommod.permissions.handler.IPermissionHandler;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONObject;
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
public class Module_list extends HTTPDModule
|
||||
@ -29,32 +25,7 @@ public class Module_list extends HTTPDModule
|
||||
{
|
||||
if (params.get("json") != null && params.get("json").equals("true"))
|
||||
{
|
||||
FLog.debug("Swapping to JSON View!");
|
||||
final JSONObject responseObject = new JSONObject();
|
||||
if (!(plugin.permissionHandler instanceof DefaultPermissionHandler))
|
||||
{
|
||||
FLog.debug("Displaying custom list on HTTPD!");
|
||||
IPermissionHandler handler = plugin.permissionHandler;
|
||||
final JSONObject players = new JSONObject();
|
||||
|
||||
Arrays.stream(handler.getGroups()).forEach(s ->
|
||||
{
|
||||
JSONArray array = new JSONArray();
|
||||
Bukkit.getOnlinePlayers().stream().filter(player -> !plugin.al.isVanished(player.getName())).filter(player -> handler.getPrimaryGroup(player).equalsIgnoreCase(s)).forEach(player ->
|
||||
{
|
||||
array.put(player.getName());
|
||||
});
|
||||
players.put(s.toLowerCase(), array);
|
||||
});
|
||||
|
||||
responseObject.put("players", players);
|
||||
responseObject.put("online", Bukkit.getOnlinePlayers().stream().filter(player -> !plugin.al.isVanished(player.getName())).count());
|
||||
responseObject.put("max", Bukkit.getMaxPlayers());
|
||||
|
||||
final NanoHTTPD.Response response = new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, NanoHTTPD.MIME_JSON, responseObject.toString(4));
|
||||
response.addHeader("Access-Control-Allow-Origin", "*");
|
||||
return response;
|
||||
}
|
||||
|
||||
final JSONArray owners = new JSONArray();
|
||||
final JSONArray executives = new JSONArray();
|
||||
@ -63,6 +34,7 @@ public class Module_list extends HTTPDModule
|
||||
final JSONArray admins = new JSONArray();
|
||||
final JSONArray masterbuilders = new JSONArray();
|
||||
final JSONArray operators = new JSONArray();
|
||||
final JSONArray imposters = new JSONArray();
|
||||
|
||||
for (Player player : Bukkit.getOnlinePlayers())
|
||||
{
|
||||
@ -71,29 +43,34 @@ public class Module_list extends HTTPDModule
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isImposter(player))
|
||||
{
|
||||
imposters.add(player.getName());
|
||||
}
|
||||
|
||||
if (plugin.pl.getData(player).isMasterBuilder())
|
||||
{
|
||||
masterbuilders.put(player.getName());
|
||||
masterbuilders.add(player.getName());
|
||||
}
|
||||
|
||||
if (FUtil.DEVELOPER_NAMES.contains(player.getName()))
|
||||
{
|
||||
developers.put(player.getName());
|
||||
developers.add(player.getName());
|
||||
}
|
||||
|
||||
if (ConfigEntry.SERVER_EXECUTIVES.getList().contains(player.getName()) && !FUtil.DEVELOPERS.contains(player.getName()))
|
||||
{
|
||||
executives.put(player.getName());
|
||||
executives.add(player.getName());
|
||||
}
|
||||
|
||||
if (ConfigEntry.SERVER_OWNERS.getList().contains(player.getName()))
|
||||
{
|
||||
owners.put(player.getName());
|
||||
owners.add(player.getName());
|
||||
}
|
||||
|
||||
if (!plugin.al.isAdmin(player) && hasSpecialTitle(player))
|
||||
{
|
||||
operators.put(player.getName());
|
||||
operators.add(player.getName());
|
||||
}
|
||||
|
||||
if (hasSpecialTitle(player) && plugin.al.isAdmin(player) && !plugin.al.isVanished(player.getName()))
|
||||
@ -103,12 +80,12 @@ public class Module_list extends HTTPDModule
|
||||
{
|
||||
case ADMIN:
|
||||
{
|
||||
admins.put(player.getName());
|
||||
admins.add(player.getName());
|
||||
break;
|
||||
}
|
||||
case SENIOR_ADMIN:
|
||||
{
|
||||
senioradmins.put(player.getName());
|
||||
senioradmins.add(player.getName());
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@ -128,14 +105,15 @@ public class Module_list extends HTTPDModule
|
||||
responseObject.put("admins", admins);
|
||||
responseObject.put("master_builders", masterbuilders);
|
||||
responseObject.put("operators", operators);
|
||||
responseObject.put("imposters", imposters);
|
||||
responseObject.put("online", FUtil.getFakePlayerCount());
|
||||
responseObject.put("max", server.getMaxPlayers());
|
||||
|
||||
|
||||
final NanoHTTPD.Response response = new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, NanoHTTPD.MIME_JSON, responseObject.toString(4));
|
||||
final NanoHTTPD.Response response = new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, NanoHTTPD.MIME_JSON, responseObject.toString());
|
||||
response.addHeader("Access-Control-Allow-Origin", "*");
|
||||
return response;
|
||||
} else
|
||||
}
|
||||
else
|
||||
{
|
||||
final StringBuilder body = new StringBuilder();
|
||||
|
||||
@ -163,6 +141,11 @@ public class Module_list extends HTTPDModule
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isImposter(Player player)
|
||||
{
|
||||
return plugin.al.isAdminImpostor(player) || plugin.pl.isPlayerImpostor(player);
|
||||
}
|
||||
|
||||
public boolean hasSpecialTitle(Player player)
|
||||
{
|
||||
return !FUtil.DEVELOPERS.contains(player.getUniqueId().toString()) && !ConfigEntry.SERVER_EXECUTIVES.getList().contains(player.getName()) && !ConfigEntry.SERVER_OWNERS.getList().contains(player.getName());
|
||||
@ -173,5 +156,4 @@ public class Module_list extends HTTPDModule
|
||||
{
|
||||
return "TotalFreedom - Online Players";
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ public class Module_players extends HTTPDModule
|
||||
if (!plugin.al.isVanished(player.getName()))
|
||||
{
|
||||
players.add(player.getName());
|
||||
if (plugin.al.isAdmin(player))
|
||||
if (plugin.al.isAdmin(player) && !plugin.al.isAdminImpostor(player))
|
||||
{
|
||||
onlineadmins.add(player.getName());
|
||||
}
|
||||
|
@ -1,61 +0,0 @@
|
||||
package me.totalfreedom.totalfreedommod.permissions.handler;
|
||||
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
|
||||
/**
|
||||
* @author Taah
|
||||
* @project TotalFreedomMod
|
||||
* @since 9:10 PM [23-05-2022]
|
||||
*/
|
||||
public class DefaultPermissionHandler implements IPermissionHandler
|
||||
{
|
||||
@Override
|
||||
public boolean hasPermission(@NotNull OfflinePlayer player, @Nullable String permission)
|
||||
{
|
||||
if (permission == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
throw new UnsupportedOperationException("Unable to use Bukkit's native permission system for permissions!");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPermission(@NotNull Player player, @Nullable String permission)
|
||||
{
|
||||
return permission == null || player.hasPermission(permission);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inGroup(@NotNull OfflinePlayer player, @Nullable String groupName)
|
||||
{
|
||||
throw new UnsupportedOperationException("Unable to use Bukkit's native permission system for groups!");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inGroup(@NotNull Player player, @Nullable String groupName)
|
||||
{
|
||||
throw new UnsupportedOperationException("Unable to use Bukkit's native permission system for groups!");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrimaryGroup(@NotNull Player player)
|
||||
{
|
||||
throw new UnsupportedOperationException("Unable to use Bukkit's native permission system for groups!");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrefix(@NotNull Player player)
|
||||
{
|
||||
throw new UnsupportedOperationException("Unable to use Bukkit's native permission system for groups!");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getGroups()
|
||||
{
|
||||
throw new UnsupportedOperationException("Unable to use Bukkit's native permission system for groups!");
|
||||
}
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
package me.totalfreedom.totalfreedommod.permissions.handler;
|
||||
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* @author Taah
|
||||
* @project TotalFreedomMod
|
||||
* @since 9:05 PM [23-05-2022]
|
||||
*/
|
||||
public interface IPermissionHandler
|
||||
{
|
||||
boolean hasPermission(@NotNull OfflinePlayer player, @Nullable String permission);
|
||||
boolean hasPermission(@NotNull Player player, @Nullable String permission);
|
||||
|
||||
boolean inGroup(@NotNull OfflinePlayer player, @Nullable String groupName);
|
||||
boolean inGroup(@NotNull Player player, @Nullable String groupName);
|
||||
|
||||
String getPrimaryGroup(@NotNull Player player);
|
||||
|
||||
String getPrefix(@NotNull Player player);
|
||||
|
||||
String[] getGroups();
|
||||
}
|
@ -1,150 +0,0 @@
|
||||
package me.totalfreedom.totalfreedommod.permissions.handler;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import net.milkbowl.vault.permission.Permission;
|
||||
import nl.chimpgamer.networkmanager.api.NetworkManagerPlugin;
|
||||
import nl.chimpgamer.networkmanager.api.NetworkManagerProvider;
|
||||
import nl.chimpgamer.networkmanager.api.models.permissions.Group;
|
||||
import nl.chimpgamer.networkmanager.api.models.permissions.PermissionPlayer;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Comparator;
|
||||
|
||||
|
||||
/**
|
||||
* @author Taah
|
||||
* @project TotalFreedomMod
|
||||
* @since 9:10 PM [23-05-2022]
|
||||
*/
|
||||
public class NMPermissionHandler implements IPermissionHandler
|
||||
{
|
||||
private NetworkManagerPlugin plugin;
|
||||
|
||||
public NMPermissionHandler(TotalFreedomMod plugin)
|
||||
{
|
||||
if (plugin.permissionHandler != null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (!Bukkit.getPluginManager().isPluginEnabled("NetworkManager"))
|
||||
{
|
||||
plugin.permissionHandler = new DefaultPermissionHandler();
|
||||
return;
|
||||
}
|
||||
this.plugin = NetworkManagerProvider.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPermission(@NotNull OfflinePlayer player, @Nullable String permission)
|
||||
{
|
||||
if (permission == null)
|
||||
{
|
||||
FLog.debug("Permission was null!");
|
||||
return true;
|
||||
}
|
||||
PermissionPlayer permissionPlayer = this.plugin.getPermissionManager().getPermissionPlayer(player.getUniqueId());
|
||||
if (permissionPlayer == null)
|
||||
{
|
||||
FLog.debug("Unable to find permissions player in NetworkManager. Returning false.");
|
||||
return false;
|
||||
}
|
||||
if (permissionPlayer.getAllPermissions() == null)
|
||||
{
|
||||
FLog.debug("Screw you NetworkManager for telling me all the permissions for player is null.");
|
||||
return false;
|
||||
}
|
||||
Boolean has = permissionPlayer.hasPermission(permission);
|
||||
if (has == null)
|
||||
{
|
||||
// FLog.debug("NetworkManager is idiotic and has a chance of returning null on a Boolean object. Returning false.");
|
||||
return false;
|
||||
}
|
||||
// FLog.debug("Player has perm? " + has);
|
||||
// FLog.debug("Player permissions for: " + permissionPlayer.getUuid() + "\n" + new GsonBuilder().setPrettyPrinting().create().toJson(permissionPlayer.getAllPermissions()));
|
||||
// permissionPlayer.getPermissions().forEach(permission1 -> FLog.debug(String.format("%s:%s", permission1.getPermissionString(), permission1.hasExpired())));
|
||||
return has;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPermission(@NotNull Player player, @Nullable String permission)
|
||||
{
|
||||
return hasPermission((OfflinePlayer) player, permission);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inGroup(@NotNull OfflinePlayer player, @Nullable String groupName)
|
||||
{
|
||||
if (groupName == null)
|
||||
{
|
||||
FLog.debug("NM Perms: Setting permission access to false, group is null");
|
||||
return false;
|
||||
}
|
||||
PermissionPlayer permissionPlayer = this.plugin.getPermissionManager().getPermissionPlayer(player.getUniqueId());
|
||||
if (permissionPlayer == null)
|
||||
{
|
||||
FLog.debug("NM Perms: Setting permission access to false, player not found in NM for '" + player.getUniqueId() + "'");
|
||||
return false;
|
||||
}
|
||||
if (permissionPlayer.getGroups().isEmpty())
|
||||
{
|
||||
FLog.debug("NM Perms: Setting permission access to false, player groups are empty for '" + player.getUniqueId() + "'");
|
||||
return false;
|
||||
}
|
||||
// FLog.debug("Group Name requested for: " + player.getUniqueId() + " - " + groupName);
|
||||
// FLog.debug("Player has? " + (permissionPlayer.getGroups().stream().anyMatch(group -> group.getName().equals(groupName))));
|
||||
// permissionPlayer.getGroups().forEach(group -> FLog.debug("Player group: " + group.getName()));
|
||||
return permissionPlayer.getGroups().stream().anyMatch(group -> group.getName().equals(groupName));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inGroup(@NotNull Player player, @Nullable String groupName)
|
||||
{
|
||||
return this.inGroup((OfflinePlayer) player, groupName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getGroups()
|
||||
{
|
||||
return this.plugin.getPermissionManager().getGroups().values().stream().map(Group::getName).toArray(String[]::new);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrimaryGroup(@NotNull Player player)
|
||||
{
|
||||
PermissionPlayer permissionPlayer = this.plugin.getPermissionManager().getPermissionPlayer(player.getUniqueId());
|
||||
if (permissionPlayer == null || permissionPlayer.getPrimaryGroup() == null)
|
||||
{
|
||||
FLog.warning("NM Perms: Couldn't find player's primary group due to them not be found our list");
|
||||
return ConfigEntry.PERMISSIONS_GROUPS_DEFAULT.getString();
|
||||
}
|
||||
// permissionPlayer.getGroups().forEach(group -> FLog.debug(String.format("Group for %s: %s", permissionPlayer.getUuid(), group.getName())));
|
||||
// FLog.debug(String.format("%s Primary Group: %s", permissionPlayer.getUuid(), permissionPlayer.getGroups().stream().sorted(Comparator.comparingInt(Group::getRank)).map(Group::getName).findFirst().orElse(ConfigEntry.PERMISSIONS_GROUPS_DEFAULT.getString())));
|
||||
return permissionPlayer.getGroups().stream().sorted((o1, o2) -> o1.getRank() - o2.getRank()).map(Group::getName).findFirst().orElse(ConfigEntry.PERMISSIONS_GROUPS_DEFAULT.getString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrefix(@NotNull Player player)
|
||||
{
|
||||
PermissionPlayer permissionPlayer = this.plugin.getPermissionManager().getPermissionPlayer(player.getUniqueId());
|
||||
if (permissionPlayer == null)
|
||||
{
|
||||
FLog.warning("NM Perms: Couldn't find player's primary group due to them not be found our list");
|
||||
return "[Error Loading Player]";
|
||||
}
|
||||
Group group = this.plugin.getPermissionManager().getGroup(getPrimaryGroup(player));
|
||||
if (group == null)
|
||||
{
|
||||
return "[Error Finding Group]";
|
||||
}
|
||||
return group.getPrefix(null);
|
||||
}
|
||||
}
|
@ -1,152 +0,0 @@
|
||||
package me.totalfreedom.totalfreedommod.permissions.handler;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import net.milkbowl.vault.chat.Chat;
|
||||
import net.milkbowl.vault.permission.Permission;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
|
||||
/**
|
||||
* @author Taah
|
||||
* @project TotalFreedomMod
|
||||
* @since 9:10 PM [23-05-2022]
|
||||
*/
|
||||
public class VaultPermissionHandler implements IPermissionHandler
|
||||
{
|
||||
private Permission permissions;
|
||||
private Chat chat;
|
||||
|
||||
public VaultPermissionHandler(TotalFreedomMod plugin)
|
||||
{
|
||||
if (plugin.permissionHandler != null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (!Bukkit.getPluginManager().isPluginEnabled("Vault"))
|
||||
{
|
||||
plugin.permissionHandler = new DefaultPermissionHandler();
|
||||
return;
|
||||
}
|
||||
|
||||
this.permissions = setupPerms(plugin);
|
||||
this.chat = setupChat(plugin);
|
||||
|
||||
plugin.permissionHandler = this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPermission(@NotNull OfflinePlayer player, @Nullable String permission)
|
||||
{
|
||||
if (this.permissions == null)
|
||||
{
|
||||
FLog.debug("Can't use Vault permissions system, there is no plugin using Vault permissions.");
|
||||
return true;
|
||||
}
|
||||
return permission == null || this.permissions.playerHas(null, player, permission);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPermission(@NotNull Player player, @Nullable String permission)
|
||||
{
|
||||
if (this.permissions == null)
|
||||
{
|
||||
FLog.debug("Can't use Vault permissions system, there is no plugin using Vault permissions.");
|
||||
return true;
|
||||
}
|
||||
return permission == null || this.permissions.playerHas(player, permission);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inGroup(@NotNull OfflinePlayer player, @Nullable String groupName)
|
||||
{
|
||||
if (this.permissions == null)
|
||||
{
|
||||
FLog.debug("Can't use Vault permissions system for groups, there is no plugin using Vault permissions.");
|
||||
return true;
|
||||
}
|
||||
if (groupName == null)
|
||||
{
|
||||
FLog.debug("Vault Perms: Group name is null, returning false for group check");
|
||||
return false;
|
||||
}
|
||||
return this.permissions.playerInGroup(null, player, groupName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inGroup(@NotNull Player player, @Nullable String groupName)
|
||||
{
|
||||
if (this.permissions == null)
|
||||
{
|
||||
FLog.debug("Can't use Vault permissions system for groups, there is no plugin using Vault permissions.");
|
||||
return false;
|
||||
}
|
||||
if (groupName == null)
|
||||
{
|
||||
FLog.debug("Vault Perms: Group name is null, returning false for group check");
|
||||
return false;
|
||||
}
|
||||
return this.permissions.playerInGroup(player, groupName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getGroups()
|
||||
{
|
||||
if (this.permissions == null)
|
||||
{
|
||||
FLog.debug("Can't use Vault permissions system for group listing, there is no plugin using Vault permissions.");
|
||||
return new String[0];
|
||||
}
|
||||
return this.permissions.getGroups();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrimaryGroup(@NotNull Player player)
|
||||
{
|
||||
return this.permissions.getPrimaryGroup(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrefix(@NotNull Player player)
|
||||
{
|
||||
if (this.chat == null)
|
||||
{
|
||||
return "[No Chat Plugin]";
|
||||
}
|
||||
return this.chat.getPlayerPrefix(player);
|
||||
}
|
||||
|
||||
public Permission getPermissions()
|
||||
{
|
||||
return permissions;
|
||||
}
|
||||
|
||||
private Permission setupPerms(TotalFreedomMod plugin)
|
||||
{
|
||||
RegisteredServiceProvider<Permission> rsp = Bukkit.getServicesManager().getRegistration(Permission.class);
|
||||
if (rsp == null)
|
||||
{
|
||||
FLog.warning("Switching back to Bukkit's default permissions from Vault's due to no permission system found.");
|
||||
plugin.permissionHandler = new DefaultPermissionHandler();
|
||||
return null;
|
||||
}
|
||||
return rsp.getProvider();
|
||||
}
|
||||
|
||||
private Chat setupChat(TotalFreedomMod plugin)
|
||||
{
|
||||
RegisteredServiceProvider<Chat> rsp = Bukkit.getServicesManager().getRegistration(Chat.class);
|
||||
if (rsp == null)
|
||||
{
|
||||
// FLog.warning("Switching back to Bukkit's default permissions from Vault's due to no permission system found.");
|
||||
// plugin.permissionHandler = new DefaultPermissionHandler();
|
||||
return null;
|
||||
}
|
||||
return rsp.getProvider();
|
||||
}
|
||||
}
|
@ -54,6 +54,9 @@ public class FPlayer
|
||||
private String lastMessage = "";
|
||||
private boolean inAdminchat = false;
|
||||
private boolean allCommandsBlocked = false;
|
||||
|
||||
|
||||
private boolean superadminIdVerified = false;
|
||||
private String lastCommand = "";
|
||||
private boolean cmdspyEnabled = false;
|
||||
private String tag = null;
|
||||
@ -645,6 +648,16 @@ public class FPlayer
|
||||
this.allCommandsBlocked = allCommandsBlocked;
|
||||
}
|
||||
|
||||
public boolean isSuperadminIdVerified()
|
||||
{
|
||||
return superadminIdVerified;
|
||||
}
|
||||
|
||||
public void setSuperadminIdVerified(boolean superadminIdVerified)
|
||||
{
|
||||
this.superadminIdVerified = superadminIdVerified;
|
||||
}
|
||||
|
||||
public boolean isCmdspyEnabled()
|
||||
{
|
||||
return cmdspyEnabled;
|
||||
|
@ -3,25 +3,30 @@ package me.totalfreedom.totalfreedommod.player;
|
||||
import com.google.common.collect.Lists;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.*;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import me.totalfreedom.totalfreedommod.TotalFreedomMod;
|
||||
import me.totalfreedom.totalfreedommod.shop.ShopItem;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PlayerData
|
||||
{
|
||||
private UUID uuid;
|
||||
private final List<String> ips = Lists.newArrayList();
|
||||
private final List<String> notes = Lists.newArrayList();
|
||||
private final List<String> backupCodes = Lists.newArrayList();
|
||||
private String name;
|
||||
private String tag = null;
|
||||
private String discordID = null;
|
||||
private Boolean masterBuilder = false;
|
||||
|
||||
private Boolean verification = false;
|
||||
|
||||
|
||||
private String rideMode = "ask";
|
||||
|
||||
@ -43,14 +48,17 @@ public class PlayerData
|
||||
{
|
||||
try
|
||||
{
|
||||
uuid = UUID.fromString(resultSet.getString("uuid"));
|
||||
name = resultSet.getString("username");
|
||||
ips.clear();
|
||||
ips.addAll(FUtil.stringToList(resultSet.getString("ips")));
|
||||
notes.clear();
|
||||
notes.addAll(FUtil.stringToList(resultSet.getString("notes")));
|
||||
tag = resultSet.getString("tag");
|
||||
discordID = resultSet.getString("discord_id");
|
||||
backupCodes.clear();
|
||||
backupCodes.addAll(FUtil.stringToList(resultSet.getString("backup_codes")));
|
||||
masterBuilder = resultSet.getBoolean("master_builder");
|
||||
verification = resultSet.getBoolean("verification");
|
||||
rideMode = resultSet.getString("ride_mode");
|
||||
coins = resultSet.getInt("coins");
|
||||
items.clear();
|
||||
@ -64,25 +72,40 @@ public class PlayerData
|
||||
{
|
||||
FLog.severe("Failed to load player: " + e.getMessage());
|
||||
}
|
||||
|
||||
// Force verification for Master Builders
|
||||
if (masterBuilder && !verification)
|
||||
{
|
||||
verification = true;
|
||||
TotalFreedomMod.getPlugin().pl.save(this);
|
||||
}
|
||||
else if (!masterBuilder && discordID == null && verification)
|
||||
{
|
||||
this.verification = false;
|
||||
TotalFreedomMod.getPlugin().pl.save(this);
|
||||
}
|
||||
}
|
||||
|
||||
public PlayerData(Player player)
|
||||
{
|
||||
this.uuid = player.getUniqueId();
|
||||
this.name = player.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "Player: " + getName() + "\n" +
|
||||
|
||||
return "Player: " + name + "\n" +
|
||||
"- IPs: " + StringUtils.join(ips, ", ") + "\n" +
|
||||
"- Discord ID: " + discordID + "\n" +
|
||||
"- Master Builder: " + masterBuilder + "\n" +
|
||||
"- Has Verification: " + verification + "\n" +
|
||||
"- Coins: " + coins + "\n" +
|
||||
"- Total Votes: " + totalVotes + "\n" +
|
||||
"- Display Discord: " + displayDiscord + "\n" +
|
||||
"- Tag: " + FUtil.colorize(tag) + ChatColor.GRAY + "\n" +
|
||||
"- Ride Mode: " + rideMode + "\n" +
|
||||
"- Backup Codes: " + backupCodes.size() + "/10" + "\n" +
|
||||
"- Login Message: " + loginMessage;
|
||||
}
|
||||
|
||||
@ -131,6 +154,22 @@ public class PlayerData
|
||||
notes.clear();
|
||||
}
|
||||
|
||||
public List<String> getBackupCodes()
|
||||
{
|
||||
return Collections.unmodifiableList(backupCodes);
|
||||
}
|
||||
|
||||
public void setBackupCodes(List<String> codes)
|
||||
{
|
||||
backupCodes.clear();
|
||||
backupCodes.addAll(codes);
|
||||
}
|
||||
|
||||
public void removeBackupCode(String code)
|
||||
{
|
||||
backupCodes.remove(code);
|
||||
}
|
||||
|
||||
public void addNote(String note)
|
||||
{
|
||||
notes.add(note);
|
||||
@ -174,6 +213,11 @@ public class PlayerData
|
||||
items.remove(item.getDataName());
|
||||
}
|
||||
|
||||
public boolean hasVerification()
|
||||
{
|
||||
return verification;
|
||||
}
|
||||
|
||||
public boolean isMasterBuilder()
|
||||
{
|
||||
return masterBuilder;
|
||||
@ -188,12 +232,14 @@ public class PlayerData
|
||||
{
|
||||
return new HashMap<String, Object>()
|
||||
{{
|
||||
put("uuid", uuid.toString());
|
||||
put("username", name);
|
||||
put("ips", FUtil.listToString(ips));
|
||||
put("notes", FUtil.listToString(notes));
|
||||
put("tag", tag);
|
||||
put("discord_id", discordID);
|
||||
put("backup_codes", FUtil.listToString(backupCodes));
|
||||
put("master_builder", masterBuilder);
|
||||
put("verification", verification);
|
||||
put("ride_mode", rideMode);
|
||||
put("coins", coins);
|
||||
put("items", FUtil.listToString(items));
|
||||
@ -209,14 +255,14 @@ public class PlayerData
|
||||
return displayDiscord;
|
||||
}
|
||||
|
||||
public UUID getUuid()
|
||||
{
|
||||
return uuid;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
{
|
||||
return Bukkit.getOfflinePlayer(uuid).getName();
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name)
|
||||
{
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getTag()
|
||||
@ -249,6 +295,16 @@ public class PlayerData
|
||||
this.masterBuilder = masterBuilder;
|
||||
}
|
||||
|
||||
public Boolean getVerification()
|
||||
{
|
||||
return verification;
|
||||
}
|
||||
|
||||
public void setVerification(Boolean verification)
|
||||
{
|
||||
this.verification = verification;
|
||||
}
|
||||
|
||||
public String getRideMode()
|
||||
{
|
||||
return rideMode;
|
||||
|
@ -3,8 +3,11 @@ package me.totalfreedom.totalfreedommod.player;
|
||||
import com.google.common.collect.Maps;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
@ -18,7 +21,7 @@ public class PlayerList extends FreedomService
|
||||
{
|
||||
|
||||
public final Map<String, FPlayer> playerMap = Maps.newHashMap(); // ip,dataMap
|
||||
public final Map<UUID, PlayerData> dataMap = Maps.newHashMap(); // uuid, data
|
||||
public final Map<String, PlayerData> dataMap = Maps.newHashMap(); // username, data
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
@ -54,7 +57,7 @@ public class PlayerList extends FreedomService
|
||||
while (resultSet.next())
|
||||
{
|
||||
PlayerData playerData = load(resultSet);
|
||||
dataMap.put(playerData.getUuid(), playerData);
|
||||
dataMap.put(playerData.getName(), playerData);
|
||||
}
|
||||
}
|
||||
catch (SQLException e)
|
||||
@ -100,7 +103,7 @@ public class PlayerList extends FreedomService
|
||||
|
||||
public boolean isTelnetMasterBuilder(PlayerData playerData)
|
||||
{
|
||||
Admin admin = plugin.al.getEntryByUuid(playerData.getUuid());
|
||||
Admin admin = plugin.al.getEntryByName(playerData.getName());
|
||||
return admin != null && admin.getRank().isAtLeast(Rank.ADMIN) && playerData.isMasterBuilder();
|
||||
}
|
||||
|
||||
@ -119,9 +122,9 @@ public class PlayerList extends FreedomService
|
||||
return tPlayer;
|
||||
}
|
||||
|
||||
public PlayerData loadByUuid(UUID uuid)
|
||||
public PlayerData loadByName(String name)
|
||||
{
|
||||
return load(plugin.sql.getPlayerByUuid(uuid));
|
||||
return load(plugin.sql.getPlayerByName(name));
|
||||
}
|
||||
|
||||
public PlayerData loadByIp(String ip)
|
||||
@ -138,6 +141,43 @@ public class PlayerList extends FreedomService
|
||||
return new PlayerData(resultSet);
|
||||
}
|
||||
|
||||
public Boolean isPlayerImpostor(Player player)
|
||||
{
|
||||
PlayerData playerData = getData(player);
|
||||
return plugin.dc.enabled
|
||||
&& !plugin.al.isAdmin(player)
|
||||
&& (playerData.hasVerification())
|
||||
&& !playerData.getIps().contains(FUtil.getIp(player));
|
||||
}
|
||||
|
||||
public boolean IsImpostor(Player player)
|
||||
{
|
||||
return isPlayerImpostor(player) || plugin.al.isAdminImpostor(player);
|
||||
}
|
||||
|
||||
public void verify(Player player, String backupCode)
|
||||
{
|
||||
PlayerData playerData = getData(player);
|
||||
if (backupCode != null)
|
||||
{
|
||||
playerData.removeBackupCode(backupCode);
|
||||
}
|
||||
|
||||
playerData.addIp(FUtil.getIp(player));
|
||||
save(playerData);
|
||||
|
||||
if (plugin.al.isAdminImpostor(player))
|
||||
{
|
||||
Admin admin = plugin.al.getEntryByName(player.getName());
|
||||
admin.setLastLogin(new Date());
|
||||
admin.addIp(FUtil.getIp(player));
|
||||
plugin.al.updateTables();
|
||||
plugin.al.save(admin);
|
||||
}
|
||||
|
||||
plugin.rm.updateDisplay(player);
|
||||
}
|
||||
|
||||
public void syncIps(Admin admin)
|
||||
{
|
||||
PlayerData playerData = getData(admin.getName());
|
||||
@ -146,11 +186,25 @@ public class PlayerList extends FreedomService
|
||||
plugin.pl.save(playerData);
|
||||
}
|
||||
|
||||
public void syncIps(PlayerData playerData)
|
||||
{
|
||||
Admin admin = plugin.al.getEntryByName(playerData.getName());
|
||||
|
||||
if (admin != null && admin.isActive())
|
||||
{
|
||||
admin.clearIPs();
|
||||
admin.addIps(playerData.getIps());
|
||||
plugin.al.updateTables();
|
||||
plugin.al.save(admin);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void save(PlayerData player)
|
||||
{
|
||||
try
|
||||
{
|
||||
ResultSet currentSave = plugin.sql.getPlayerByUuid(player.getUuid());
|
||||
ResultSet currentSave = plugin.sql.getPlayerByName(player.getName());
|
||||
for (Map.Entry<String, Object> entry : player.toSQLStorable().entrySet())
|
||||
{
|
||||
Object storedValue = plugin.sql.getValue(currentSave, entry.getKey(), entry.getValue());
|
||||
@ -169,56 +223,69 @@ public class PlayerList extends FreedomService
|
||||
public PlayerData getData(Player player)
|
||||
{
|
||||
// Check for existing data
|
||||
PlayerData playerData = dataMap.get(player.getUniqueId());
|
||||
PlayerData playerData = dataMap.get(player.getName());
|
||||
if (playerData != null)
|
||||
{
|
||||
return playerData;
|
||||
}
|
||||
|
||||
// Load data
|
||||
playerData = loadByUuid(player.getUniqueId());
|
||||
playerData = loadByName(player.getName());
|
||||
|
||||
// Oh you don't have any data? Well now you do
|
||||
if (playerData == null)
|
||||
{
|
||||
FLog.info("Creating new player data entry for " + player.getName());
|
||||
|
||||
playerData = new PlayerData(player);
|
||||
playerData.addIp(FUtil.getIp(player));
|
||||
playerData = loadByIp(FUtil.getIp(player));
|
||||
if (playerData != null)
|
||||
{
|
||||
plugin.sql.updatePlayerName(playerData.getName(), player.getName());
|
||||
playerData.setName(player.getName());
|
||||
dataMap.put(player.getName(), playerData);
|
||||
return playerData;
|
||||
}
|
||||
}
|
||||
|
||||
// Store it in memory.
|
||||
dataMap.put(player.getUniqueId(), playerData);
|
||||
|
||||
// Send it to the SQL database.
|
||||
plugin.sql.addPlayer(playerData);
|
||||
|
||||
// Returns it
|
||||
return playerData;
|
||||
}
|
||||
|
||||
public PlayerData getData(UUID uuid)
|
||||
{
|
||||
PlayerData data = dataMap.get(uuid);
|
||||
|
||||
if (data == null)
|
||||
else
|
||||
{
|
||||
data = loadByUuid(uuid);
|
||||
dataMap.put(player.getName(), playerData);
|
||||
return playerData;
|
||||
}
|
||||
|
||||
return data;
|
||||
// Create new data if nonexistent
|
||||
FLog.info("Creating new player verification entry for " + player.getName());
|
||||
|
||||
// Create new player
|
||||
playerData = new PlayerData(player);
|
||||
playerData.addIp(FUtil.getIp(player));
|
||||
|
||||
// Store player
|
||||
dataMap.put(player.getName(), playerData);
|
||||
|
||||
// Save player
|
||||
plugin.sql.addPlayer(playerData);
|
||||
return playerData;
|
||||
|
||||
}
|
||||
|
||||
public PlayerData getData(String username)
|
||||
{
|
||||
OfflinePlayer player = server.getPlayer(username);
|
||||
|
||||
if (player == null)
|
||||
// Check for existing data
|
||||
PlayerData playerData = dataMap.get(username);
|
||||
if (playerData != null)
|
||||
{
|
||||
player = server.getOfflinePlayer(username);
|
||||
return playerData;
|
||||
}
|
||||
|
||||
return getData(player.getUniqueId());
|
||||
playerData = loadByName(username);
|
||||
|
||||
if (playerData != null)
|
||||
{
|
||||
dataMap.put(username, playerData);
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return playerData;
|
||||
}
|
||||
|
||||
public PlayerData getDataByIp(String ip)
|
||||
@ -227,7 +294,7 @@ public class PlayerList extends FreedomService
|
||||
|
||||
if (player != null)
|
||||
{
|
||||
dataMap.put(player.getUuid(), player);
|
||||
dataMap.put(player.getName(), player);
|
||||
}
|
||||
|
||||
return player;
|
||||
@ -238,7 +305,7 @@ public class PlayerList extends FreedomService
|
||||
return playerMap;
|
||||
}
|
||||
|
||||
public Map<UUID, PlayerData> getDataMap()
|
||||
public Map<String, PlayerData> getDataMap()
|
||||
{
|
||||
return dataMap;
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import net.md_5.bungee.api.ChatColor;
|
||||
|
||||
public enum Rank implements Displayable
|
||||
{
|
||||
IMPOSTOR("an", "Impostor", Type.PLAYER, "Imp", ChatColor.YELLOW, null, false, false),
|
||||
NON_OP("a", "Non-Op", Type.PLAYER, "", ChatColor.WHITE, null, false, false),
|
||||
OP("an", "Operator", Type.PLAYER, "OP", ChatColor.GREEN, null, false, false),
|
||||
ADMIN("an", "Admin", Type.ADMIN, "Admin", ChatColor.DARK_GREEN, org.bukkit.ChatColor.DARK_GREEN, true, true),
|
||||
|
@ -4,7 +4,6 @@ import java.util.Objects;
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.permissions.handler.DefaultPermissionHandler;
|
||||
import me.totalfreedom.totalfreedommod.player.FPlayer;
|
||||
import me.totalfreedom.totalfreedommod.player.PlayerData;
|
||||
import me.totalfreedom.totalfreedommod.util.FUtil;
|
||||
@ -40,6 +39,12 @@ public class RankManager extends FreedomService
|
||||
|
||||
final Player player = (Player)sender;
|
||||
|
||||
// Display impostors
|
||||
if (plugin.al.isAdminImpostor(player))
|
||||
{
|
||||
return Rank.IMPOSTOR;
|
||||
}
|
||||
|
||||
// If the player's an owner, display that
|
||||
if (ConfigEntry.SERVER_OWNERS.getList().contains(player.getName()))
|
||||
{
|
||||
@ -62,6 +67,11 @@ public class RankManager extends FreedomService
|
||||
return Title.ASSTEXEC;
|
||||
}
|
||||
|
||||
if (plugin.al.isVerifiedAdmin(player))
|
||||
{
|
||||
return Title.VERIFIED_ADMIN;
|
||||
}
|
||||
|
||||
// Master builders show up if they are not an admin
|
||||
if (plugin.pl.getData(player).isMasterBuilder() && !plugin.al.isAdmin(player))
|
||||
{
|
||||
@ -127,6 +137,11 @@ public class RankManager extends FreedomService
|
||||
|
||||
public Rank getRank(Player player)
|
||||
{
|
||||
if (plugin.al.isAdminImpostor(player) || plugin.pl.isPlayerImpostor(player))
|
||||
{
|
||||
return Rank.IMPOSTOR;
|
||||
}
|
||||
|
||||
final Admin entry = plugin.al.getAdmin(player);
|
||||
if (entry != null)
|
||||
{
|
||||
@ -169,12 +184,7 @@ public class RankManager extends FreedomService
|
||||
fPlayer.setTag(null);
|
||||
player.setPlayerListName(null);
|
||||
}
|
||||
if (!(plugin.permissionHandler instanceof DefaultPermissionHandler))
|
||||
{
|
||||
fPlayer.setTag(getTag(player, plugin.permissionHandler.getPrefix(player)));
|
||||
} else {
|
||||
fPlayer.setTag(getTag(player, display.getColoredTag()));
|
||||
}
|
||||
fPlayer.setTag(getTag(player, display.getColoredTag()));
|
||||
updatePlayerTeam(player);
|
||||
plugin.pem.setPermissions(player);
|
||||
}
|
||||
@ -183,14 +193,52 @@ public class RankManager extends FreedomService
|
||||
public void onPlayerJoin(PlayerJoinEvent event)
|
||||
{
|
||||
final Player player = event.getPlayer();
|
||||
final FPlayer fPlayer = plugin.pl.getPlayer(player);
|
||||
PlayerData target = plugin.pl.getData(player);
|
||||
|
||||
// Unban admins
|
||||
boolean isAdmin = plugin.al.isAdmin(player);
|
||||
|
||||
// Updates last login time
|
||||
if (isAdmin)
|
||||
{
|
||||
plugin.al.updateLastLogin(player);
|
||||
// Verify strict IP match
|
||||
if (!plugin.al.isIdentityMatched(player))
|
||||
{
|
||||
FUtil.bcastMsg("Warning: " + player.getName() + " is an admin, but is using an account not registered to one of their ip-list.", ChatColor.RED);
|
||||
fPlayer.setSuperadminIdVerified(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
fPlayer.setSuperadminIdVerified(true);
|
||||
plugin.al.updateLastLogin(player);
|
||||
}
|
||||
}
|
||||
|
||||
if (plugin.al.isVerifiedAdmin(player))
|
||||
{
|
||||
FUtil.bcastMsg("Warning: " + player.getName() + " is an admin, but does not have any admin permissions.", ChatColor.RED);
|
||||
}
|
||||
|
||||
// Handle impostors
|
||||
boolean isImpostor = plugin.al.isAdminImpostor(player) || plugin.pl.isPlayerImpostor(player);
|
||||
if (isImpostor)
|
||||
{
|
||||
FUtil.bcastMsg(ChatColor.AQUA + player.getName() + " is " + Rank.IMPOSTOR.getColoredLoginMessage());
|
||||
if (plugin.al.isAdminImpostor(player))
|
||||
{
|
||||
FUtil.bcastMsg("Warning: " + player.getName() + " has been flagged as an admin impostor and has been frozen!", ChatColor.RED);
|
||||
}
|
||||
else if (plugin.pl.isPlayerImpostor(player))
|
||||
{
|
||||
FUtil.bcastMsg("Warning: " + player.getName() + " has been flagged as a player impostor and has been frozen!", ChatColor.RED);
|
||||
}
|
||||
String displayName = Rank.IMPOSTOR.getColor() + player.getName();
|
||||
player.setPlayerListName(StringUtils.substring(displayName, 0, 16));
|
||||
player.getInventory().clear();
|
||||
player.setOp(false);
|
||||
player.setGameMode(GameMode.SURVIVAL);
|
||||
plugin.pl.getPlayer(player).getFreezeData().setFrozen(true);
|
||||
player.sendMessage(ChatColor.RED + "You are marked as an impostor, please verify yourself!");
|
||||
return;
|
||||
}
|
||||
|
||||
// Broadcast login message
|
||||
@ -205,9 +253,12 @@ public class RankManager extends FreedomService
|
||||
// Set display
|
||||
updateDisplay(player);
|
||||
|
||||
if (target.getTag() != null)
|
||||
if (!plugin.pl.isPlayerImpostor(player) && target.hasVerification())
|
||||
{
|
||||
plugin.pl.getData(player).setTag(FUtil.colorize(target.getTag()));
|
||||
if (target.getTag() != null)
|
||||
{
|
||||
plugin.pl.getData(player).setTag(FUtil.colorize(target.getTag()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6,6 +6,7 @@ public enum Title implements Displayable
|
||||
{
|
||||
|
||||
MASTER_BUILDER("a", "Master Builder", ChatColor.DARK_AQUA, org.bukkit.ChatColor.DARK_AQUA, "MB", true, true),
|
||||
VERIFIED_ADMIN("a", "Verified Admin", ChatColor.LIGHT_PURPLE, org.bukkit.ChatColor.LIGHT_PURPLE, "VA", false, true),
|
||||
EXECUTIVE("an", "Executive", ChatColor.RED, org.bukkit.ChatColor.RED, "Exec", true, true),
|
||||
ASSTEXEC("an", "Assistant Executive", ChatColor.RED, org.bukkit.ChatColor.RED, "Asst Exec", true, true),
|
||||
DEVELOPER("a", "Developer", ChatColor.DARK_PURPLE, org.bukkit.ChatColor.DARK_PURPLE, "Dev", true, true),
|
||||
|
@ -10,29 +10,19 @@ public enum ShopItem
|
||||
LIGHTNING_ROD("Lightning Rod", Material.BLAZE_ROD, 12, ConfigEntry.SHOP_PRICES_LIGHTNING_ROD, ChatColor.LIGHT_PURPLE, "lightningRod", "/lightningrod"),
|
||||
FIRE_BALL("Fire Ball", Material.FIRE_CHARGE, 14, ConfigEntry.SHOP_PRICES_FIRE_BALL, ChatColor.RED, "fireBall", "/fireball"),
|
||||
RIDEABLE_PEARL("Rideable Ender Pearl", Material.ENDER_PEARL, 16, ConfigEntry.SHOP_PRICES_RIDEABLE_PEARL, ChatColor.DARK_PURPLE, "rideablePearl", "/rideablepearl"),
|
||||
STACKING_POTATO("Stacking Potato", Material.POTATO, 19, ConfigEntry.SHOP_PRICES_STACKING_POTATO, ChatColor.YELLOW, "stackingPotato", "/stackingpotato"),
|
||||
CLOWN_FISH("Clown Fish", Material.TROPICAL_FISH, 21, ConfigEntry.SHOP_PRICES_CLOWN_FISH, ChatColor.GOLD, "clownFish", "/clownfish"),
|
||||
LOGIN_MESSAGES("Login Messages", Material.NAME_TAG, 23, ConfigEntry.SHOP_PRICES_LOGIN_MESSAGES, ChatColor.DARK_GREEN, "loginMessages", "/loginmessage"),
|
||||
RAINBOW_TRAIL("Rainbow Trail", Material.RED_WOOL, 25, ConfigEntry.SHOP_PRICES_RAINBOW_TRAIL, ChatColor.DARK_RED, "rainbowTrail", "/trail");
|
||||
STACKING_POTATO("Stacking Potato", Material.POTATO, 20, ConfigEntry.SHOP_PRICES_STACKING_POTATO, ChatColor.YELLOW, "stackingPotato", "/stackingpotato"),
|
||||
CLOWN_FISH("Clown Fish", Material.TROPICAL_FISH, 22, ConfigEntry.SHOP_PRICES_CLOWN_FISH, ChatColor.GOLD, "clownFish", "/clownfish"),
|
||||
LOGIN_MESSAGES("Login Messages", Material.NAME_TAG, 24, ConfigEntry.SHOP_PRICES_LOGIN_MESSAGES, ChatColor.DARK_GREEN, "loginMessages", "/loginmessage");
|
||||
|
||||
/*
|
||||
Shop GUI Layout:
|
||||
|
||||
Dimensions: 9x4 = 36
|
||||
Key:
|
||||
g = Grappling Hook,
|
||||
l = Lightning Rod
|
||||
f = Fire Ball
|
||||
r = Rideable Ender Pearl
|
||||
s = Stacking Potato
|
||||
c = Clown Fish
|
||||
x = Login Messages
|
||||
t = Rainbow Trail
|
||||
$ = Coins
|
||||
Key: g = Grappling Hook, l = Lightning Rod, f = Fire Ball, r = Rideable Ender Pearl, s = Stacking Potato, c = Clown Fish, x = Login Messages $ = Coins}
|
||||
|
||||
---------
|
||||
-g-l-f-r-
|
||||
-s-c-x-t-
|
||||
--s-c-x--
|
||||
--------$
|
||||
*/
|
||||
|
||||
|
@ -7,8 +7,6 @@ import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.UUID;
|
||||
|
||||
import me.totalfreedom.totalfreedommod.FreedomService;
|
||||
import me.totalfreedom.totalfreedommod.admin.Admin;
|
||||
import me.totalfreedom.totalfreedommod.banning.Ban;
|
||||
@ -84,7 +82,7 @@ public class SQLite extends FreedomService
|
||||
{
|
||||
try
|
||||
{
|
||||
connection.createStatement().execute("CREATE TABLE `admins` (`uuid` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `rank` VARCHAR NOT NULL, `active` BOOLEAN NOT NULL, `last_login` LONG NOT NULL, `command_spy` BOOLEAN NOT NULL, `potion_spy` BOOLEAN NOT NULL, `ac_format` VARCHAR, `ptero_id` VARCHAR);");
|
||||
connection.createStatement().execute("CREATE TABLE `admins` (`username` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `rank` VARCHAR NOT NULL, `active` BOOLEAN NOT NULL, `last_login` LONG NOT NULL, `command_spy` BOOLEAN NOT NULL, `potion_spy` BOOLEAN NOT NULL, `ac_format` VARCHAR, `ptero_id` VARCHAR);");
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
@ -95,7 +93,7 @@ public class SQLite extends FreedomService
|
||||
{
|
||||
try
|
||||
{
|
||||
connection.createStatement().execute("CREATE TABLE `players` (`uuid` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `notes` VARCHAR, `tag` VARCHAR, `discord_id` VARCHAR, `master_builder` BOOLEAN NOT NULL, `ride_mode` VARCHAR NOT NULL, `coins` INT, `items` VARCHAR, `total_votes` INT NOT NULL, `display_discord` BOOLEAN NOT NULL, `login_message` VARCHAR, `inspect` BOOLEAN NOT NULL);");
|
||||
connection.createStatement().execute("CREATE TABLE `players` (`username` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `notes` VARCHAR, `tag` VARCHAR, `discord_id` VARCHAR, `backup_codes` VARCHAR, `master_builder` BOOLEAN NOT NULL,`verification` BOOLEAN NOT NULL, `ride_mode` VARCHAR NOT NULL, `coins` INT, `items` VARCHAR, `total_votes` INT NOT NULL, `display_discord` BOOLEAN NOT NULL, `login_message` VARCHAR, `inspect` BOOLEAN NOT NULL);");
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
@ -135,8 +133,8 @@ public class SQLite extends FreedomService
|
||||
{
|
||||
try
|
||||
{
|
||||
Object[] data = {key, admin.getUuid()};
|
||||
PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE admins SET {0}=? WHERE uuid=''{1}''", data));
|
||||
Object[] data = {key, admin.getName()};
|
||||
PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE admins SET {0}=? WHERE username=''{1}''", data));
|
||||
statement = setUnknownType(statement, 1, value);
|
||||
statement.executeUpdate();
|
||||
|
||||
@ -153,7 +151,7 @@ public class SQLite extends FreedomService
|
||||
try
|
||||
{
|
||||
Object[] data = {key, player.getName()};
|
||||
PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE players SET {0}=? WHERE uuid=''{1}''", data));
|
||||
PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE players SET {0}=? WHERE username=''{1}''", data));
|
||||
statement = setUnknownType(statement, 1, value);
|
||||
statement.executeUpdate();
|
||||
|
||||
@ -164,6 +162,36 @@ public class SQLite extends FreedomService
|
||||
}
|
||||
}
|
||||
|
||||
public void updateAdminName(String oldName, String newName)
|
||||
{
|
||||
try
|
||||
{
|
||||
PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE admins SET username=? WHERE username=''{0}''", oldName));
|
||||
statement = setUnknownType(statement, 1, newName);
|
||||
statement.executeUpdate();
|
||||
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
FLog.severe("Failed to update admin name: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void updatePlayerName(String oldName, String newName)
|
||||
{
|
||||
try
|
||||
{
|
||||
PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE players SET username=? WHERE username=''{0}''", oldName));
|
||||
statement = setUnknownType(statement, 1, newName);
|
||||
statement.executeUpdate();
|
||||
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
FLog.severe("Failed to update player name: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public PreparedStatement setUnknownType(PreparedStatement statement, int index, Object value) throws SQLException
|
||||
{
|
||||
if (value == null)
|
||||
@ -220,7 +248,7 @@ public class SQLite extends FreedomService
|
||||
try
|
||||
{
|
||||
PreparedStatement statement = connection.prepareStatement("INSERT INTO admins VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||
statement.setString(1, admin.getUuid().toString());
|
||||
statement.setString(1, admin.getName());
|
||||
statement.setString(2, FUtil.listToString(admin.getIps()));
|
||||
statement.setString(3, admin.getRank().toString());
|
||||
statement.setBoolean(4, admin.isActive());
|
||||
@ -242,20 +270,22 @@ public class SQLite extends FreedomService
|
||||
{
|
||||
try
|
||||
{
|
||||
PreparedStatement statement = connection.prepareStatement("INSERT INTO players VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||
statement.setString(1, player.getUuid().toString());
|
||||
PreparedStatement statement = connection.prepareStatement("INSERT INTO players VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||
statement.setString(1, player.getName());
|
||||
statement.setString(2, FUtil.listToString(player.getIps()));
|
||||
statement.setString(3, FUtil.listToString(player.getNotes()));
|
||||
statement.setString(4, player.getTag());
|
||||
statement.setString(5, player.getDiscordID());
|
||||
statement.setBoolean(6, player.isMasterBuilder());
|
||||
statement.setString(7, player.getRideMode());
|
||||
statement.setInt(8, player.getCoins());
|
||||
statement.setString(9, FUtil.listToString(player.getItems()));
|
||||
statement.setInt(10, player.getTotalVotes());
|
||||
statement.setBoolean(11, player.doesDisplayDiscord());
|
||||
statement.setString(12, player.getLoginMessage());
|
||||
statement.setBoolean(13, player.hasInspection());
|
||||
statement.setString(6, FUtil.listToString(player.getBackupCodes()));
|
||||
statement.setBoolean(7, player.isMasterBuilder());
|
||||
statement.setBoolean(8, player.hasVerification());
|
||||
statement.setString(9, player.getRideMode());
|
||||
statement.setInt(10, player.getCoins());
|
||||
statement.setString(11, FUtil.listToString(player.getItems()));
|
||||
statement.setInt(12, player.getTotalVotes());
|
||||
statement.setBoolean(13, player.doesDisplayDiscord());
|
||||
statement.setString(14, player.getLoginMessage());
|
||||
statement.setBoolean(15, player.hasInspection());
|
||||
statement.executeUpdate();
|
||||
}
|
||||
catch (SQLException e)
|
||||
@ -265,11 +295,11 @@ public class SQLite extends FreedomService
|
||||
}
|
||||
}
|
||||
|
||||
public ResultSet getAdminByUuid(UUID uuid)
|
||||
public ResultSet getAdminByName(String name)
|
||||
{
|
||||
try
|
||||
{
|
||||
ResultSet resultSet = connection.createStatement().executeQuery(MessageFormat.format("SELECT * FROM admins WHERE uuid=''{0}''", uuid.toString()));
|
||||
ResultSet resultSet = connection.createStatement().executeQuery(MessageFormat.format("SELECT * FROM admins WHERE username=''{0}''", name));
|
||||
if (resultSet.next())
|
||||
{
|
||||
return resultSet;
|
||||
@ -284,11 +314,11 @@ public class SQLite extends FreedomService
|
||||
return null;
|
||||
}
|
||||
|
||||
public ResultSet getPlayerByUuid(UUID uuid)
|
||||
public ResultSet getPlayerByName(String name)
|
||||
{
|
||||
try
|
||||
{
|
||||
ResultSet resultSet = connection.createStatement().executeQuery(MessageFormat.format("SELECT * FROM players WHERE uuid=''{0}''", uuid.toString()));
|
||||
ResultSet resultSet = connection.createStatement().executeQuery(MessageFormat.format("SELECT * FROM players WHERE username=''{0}''", name));
|
||||
if (resultSet.next())
|
||||
{
|
||||
return resultSet;
|
||||
@ -296,7 +326,7 @@ public class SQLite extends FreedomService
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
FLog.severe("Failed to get player by UUID:");
|
||||
FLog.severe("Failed to get player by name:");
|
||||
FLog.severe(e);
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,28 @@
|
||||
package me.totalfreedom.totalfreedommod.util;
|
||||
|
||||
import java.util.HashSet;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.Server;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public class DepreciationAggregator
|
||||
{
|
||||
public static Block getTargetBlock(LivingEntity entity, HashSet<Material> transparent, int maxDistance)
|
||||
{
|
||||
return entity.getTargetBlock(transparent, maxDistance);
|
||||
}
|
||||
|
||||
public static OfflinePlayer getOfflinePlayer(Server server, String name)
|
||||
{
|
||||
return server.getOfflinePlayer(name);
|
||||
}
|
||||
|
||||
public static String getName_EntityType(EntityType et)
|
||||
{
|
||||
return et.getName();
|
||||
}
|
||||
}
|
@ -36,6 +36,8 @@ import static org.bukkit.Bukkit.getServer;
|
||||
|
||||
public class FUtil
|
||||
{
|
||||
|
||||
public static final String SAVED_FLAGS_FILENAME = "savedflags.dat";
|
||||
/* See https://github.com/TotalFreedom/License - None of the listed names may be removed.
|
||||
Leaving this list here for anyone running TFM on a cracked server:
|
||||
public static final List<String> DEVELOPERS = Arrays.asList("Madgeek1450", "Prozza", "WickedGamingUK", "Wild1145", "aggelosQQ", "scripthead", "Telesphoreo", "CoolJWB");
|
||||
@ -52,12 +54,13 @@ public class FUtil
|
||||
"d018f2b8-ce60-4672-a45f-e580e0331299", // speednt
|
||||
"458de06f-36a5-4e1b-aaa6-ec1d1751c5b6", // SupItsDillon
|
||||
"c8e5af82-6aba-4dd7-83e8-474381380cc9", // Paldiu
|
||||
"38ea7c82-7bdc-4f48-b7fd-0e93fc26813d", // AwesomePinch
|
||||
"ba5aafba-9012-418f-9819-a7020d591068", // TFTWPhoenix
|
||||
"d6dd9740-40db-45f5-ab16-4ee16a633009", // Abhi
|
||||
"2e06e049-24c8-42e4-8bcf-d35372af31e6", // NotInSync
|
||||
"f97c0d7b-6413-4558-a409-88f09a8f9adb" // videogamesm12
|
||||
);
|
||||
public static final List<String> DEVELOPER_NAMES = Arrays.asList("Madgeek1450", "Prozza", "WickedGamingUK", "Wild1145", "aggelosQQ", "scripthead", "CoolJWB", "elmon_", "speednt", "SupItsDillon", "Paldiu", "TFTWPhoenix", "abhithedev", "NotInSync", "videogamesm12");
|
||||
public static final List<String> DEVELOPER_NAMES = Arrays.asList("Madgeek1450", "Prozza", "WickedGamingUK", "Wild1145", "aggelosQQ", "scripthead", "CoolJWB", "elmon_", "speednt", "SupItsDillon", "Paldiu", "AwesomePinch", "TFTWPhoenix", "abhithedev", "NotInSync", "videogamesm12");
|
||||
public static final Map<String, ChatColor> CHAT_COLOR_NAMES = new HashMap<>();
|
||||
public static final List<ChatColor> CHAT_COLOR_POOL = Arrays.asList(
|
||||
ChatColor.DARK_RED,
|
||||
@ -225,6 +228,33 @@ public class FUtil
|
||||
return names;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static UUID nameToUUID(String name)
|
||||
{
|
||||
try
|
||||
{
|
||||
JSONArray json = new JSONArray();
|
||||
json.add(name);
|
||||
List<String> headers = new ArrayList<>();
|
||||
headers.add("Accept:application/json");
|
||||
headers.add("Content-Type:application/json");
|
||||
Response response = sendRequest("https://api.mojang.com/profiles/minecraft", "POST", headers, json.toString());
|
||||
// Don't care how stupid this looks, couldn't find anything to parse a json string to something readable in java with something not horrendously huge, maybe im just retarded
|
||||
Pattern pattern = Pattern.compile("(?<=\"id\":\")[a-f0-9].{31}");
|
||||
Matcher matcher = pattern.matcher(response.getMessage());
|
||||
if (matcher.find())
|
||||
{
|
||||
String rawUUID = matcher.group(0).replaceFirst("([a-f0-9]{8})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]+)", "$1-$2-$3-$4-$5");
|
||||
return UUID.fromString(rawUUID);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
FLog.severe("Failed to convert name to UUID:\n" + e.toString());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Response sendRequest(String endpoint, String method, List<String> headers, String body) throws IOException
|
||||
{
|
||||
URL url = new URL(endpoint);
|
||||
@ -510,6 +540,30 @@ public class FUtil
|
||||
return ip;
|
||||
}
|
||||
|
||||
//getField: Borrowed from WorldEdit
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> T getField(Object from, String name)
|
||||
{
|
||||
Class<?> checkClass = from.getClass();
|
||||
do
|
||||
{
|
||||
try
|
||||
{
|
||||
Field field = checkClass.getDeclaredField(name);
|
||||
field.setAccessible(true);
|
||||
return (T) field.get(from);
|
||||
|
||||
}
|
||||
catch (NoSuchFieldException | IllegalAccessException ignored)
|
||||
{
|
||||
}
|
||||
}
|
||||
while (checkClass.getSuperclass() != Object.class
|
||||
&& ((checkClass = checkClass.getSuperclass()) != null));
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static ChatColor randomChatColor()
|
||||
{
|
||||
return CHAT_COLOR_POOL.get(RANDOM.nextInt(CHAT_COLOR_POOL.size()));
|
||||
@ -701,7 +755,7 @@ public class FUtil
|
||||
|
||||
public static String getIp(Player player)
|
||||
{
|
||||
return player.getAddress().getAddress().getHostAddress().trim();
|
||||
return Objects.requireNonNull(player.getAddress()).getAddress().getHostAddress().trim();
|
||||
}
|
||||
|
||||
public static String getIp(PlayerLoginEvent event)
|
||||
|
@ -8,11 +8,212 @@ import org.bukkit.entity.EntityType;
|
||||
|
||||
public class Groups
|
||||
{
|
||||
public static final List<Material> WOOL_COLORS = Arrays.stream(Material.values()).filter((m) -> m.name().endsWith("_WOOL")).toList();
|
||||
public static final List<Material> SHULKER_BOXES = Arrays.stream(Material.values()).filter((m) -> m.name().endsWith("SHULKER_BOX")).toList();
|
||||
public static final List<EntityType> MOB_TYPES = Arrays.stream(EntityType.values()).filter(EntityType::isAlive).filter(EntityType::isSpawnable).toList();
|
||||
public static final List<Material> SPAWN_EGGS = Arrays.stream(Material.values()).filter((mat) -> mat.name().endsWith("_SPAWN_EGG")).toList();
|
||||
public static final List<Material> BANNERS = Arrays.stream(Material.values()).filter((m) -> m.name().endsWith("_BANNER")).toList();
|
||||
public static final List<Material> WOOL_COLORS = Arrays.asList(
|
||||
Material.WHITE_WOOL,
|
||||
Material.RED_WOOL,
|
||||
Material.ORANGE_WOOL,
|
||||
Material.YELLOW_WOOL,
|
||||
Material.GREEN_WOOL,
|
||||
Material.LIME_WOOL,
|
||||
Material.LIGHT_BLUE_WOOL,
|
||||
Material.CYAN_WOOL,
|
||||
Material.BLUE_WOOL,
|
||||
Material.PURPLE_WOOL,
|
||||
Material.MAGENTA_WOOL,
|
||||
Material.PINK_WOOL,
|
||||
Material.BROWN_WOOL,
|
||||
Material.GRAY_WOOL,
|
||||
Material.LIGHT_GRAY_WOOL,
|
||||
Material.BLACK_WOOL);
|
||||
|
||||
public static final List<Material> SHULKER_BOXES = Arrays.asList(
|
||||
Material.SHULKER_BOX,
|
||||
Material.WHITE_SHULKER_BOX,
|
||||
Material.RED_SHULKER_BOX,
|
||||
Material.ORANGE_SHULKER_BOX,
|
||||
Material.YELLOW_SHULKER_BOX,
|
||||
Material.GREEN_SHULKER_BOX,
|
||||
Material.LIME_SHULKER_BOX,
|
||||
Material.LIGHT_BLUE_SHULKER_BOX,
|
||||
Material.CYAN_SHULKER_BOX,
|
||||
Material.BLUE_SHULKER_BOX,
|
||||
Material.PURPLE_SHULKER_BOX,
|
||||
Material.MAGENTA_SHULKER_BOX,
|
||||
Material.PINK_SHULKER_BOX,
|
||||
Material.BROWN_SHULKER_BOX,
|
||||
Material.GRAY_SHULKER_BOX,
|
||||
Material.LIGHT_GRAY_SHULKER_BOX,
|
||||
Material.BLACK_SHULKER_BOX);
|
||||
|
||||
public static final List<EntityType> MOB_TYPES = Arrays.asList(
|
||||
EntityType.BAT,
|
||||
EntityType.BEE,
|
||||
EntityType.BLAZE,
|
||||
EntityType.CAVE_SPIDER,
|
||||
EntityType.CHICKEN,
|
||||
EntityType.CAT,
|
||||
EntityType.COD,
|
||||
EntityType.COW,
|
||||
EntityType.CREEPER,
|
||||
EntityType.DOLPHIN,
|
||||
EntityType.DONKEY,
|
||||
EntityType.DROWNED,
|
||||
EntityType.ELDER_GUARDIAN,
|
||||
EntityType.ENDERMAN,
|
||||
EntityType.ENDERMITE,
|
||||
EntityType.EVOKER,
|
||||
EntityType.FOX,
|
||||
EntityType.GHAST,
|
||||
EntityType.GUARDIAN,
|
||||
EntityType.HOGLIN,
|
||||
EntityType.HORSE,
|
||||
EntityType.HUSK,
|
||||
EntityType.ILLUSIONER,
|
||||
EntityType.IRON_GOLEM,
|
||||
EntityType.LLAMA,
|
||||
EntityType.MAGMA_CUBE,
|
||||
EntityType.MUSHROOM_COW,
|
||||
EntityType.MULE,
|
||||
EntityType.OCELOT,
|
||||
EntityType.PANDA,
|
||||
EntityType.PARROT,
|
||||
EntityType.PHANTOM,
|
||||
EntityType.PIG,
|
||||
EntityType.PIGLIN,
|
||||
EntityType.PIGLIN_BRUTE,
|
||||
EntityType.PILLAGER,
|
||||
EntityType.POLAR_BEAR,
|
||||
EntityType.PUFFERFISH,
|
||||
EntityType.RABBIT,
|
||||
EntityType.RAVAGER,
|
||||
EntityType.SALMON,
|
||||
EntityType.SHEEP,
|
||||
EntityType.SHULKER,
|
||||
EntityType.SILVERFISH,
|
||||
EntityType.SKELETON,
|
||||
EntityType.SKELETON_HORSE,
|
||||
EntityType.SLIME,
|
||||
EntityType.SNOWMAN,
|
||||
EntityType.SPIDER,
|
||||
EntityType.SQUID,
|
||||
EntityType.STRAY,
|
||||
EntityType.STRIDER,
|
||||
EntityType.TRADER_LLAMA,
|
||||
EntityType.TROPICAL_FISH,
|
||||
EntityType.TURTLE,
|
||||
EntityType.VEX,
|
||||
EntityType.VILLAGER,
|
||||
EntityType.VINDICATOR,
|
||||
EntityType.WANDERING_TRADER,
|
||||
EntityType.WITCH,
|
||||
EntityType.WITHER_SKELETON,
|
||||
EntityType.WOLF,
|
||||
EntityType.ZOGLIN,
|
||||
EntityType.ZOMBIE,
|
||||
EntityType.ZOMBIE_HORSE,
|
||||
EntityType.ZOMBIFIED_PIGLIN,
|
||||
EntityType.ZOMBIE_VILLAGER);
|
||||
|
||||
public static final List<Material> SPAWN_EGGS = Arrays.asList(
|
||||
Material.BAT_SPAWN_EGG,
|
||||
Material.BEE_SPAWN_EGG,
|
||||
Material.BLAZE_SPAWN_EGG,
|
||||
Material.CAVE_SPIDER_SPAWN_EGG,
|
||||
Material.CHICKEN_SPAWN_EGG,
|
||||
Material.CAT_SPAWN_EGG,
|
||||
Material.COD_SPAWN_EGG,
|
||||
Material.COW_SPAWN_EGG,
|
||||
Material.CREEPER_SPAWN_EGG,
|
||||
Material.DOLPHIN_SPAWN_EGG,
|
||||
Material.DONKEY_SPAWN_EGG,
|
||||
Material.DROWNED_SPAWN_EGG,
|
||||
Material.ELDER_GUARDIAN_SPAWN_EGG,
|
||||
Material.ENDERMAN_SPAWN_EGG,
|
||||
Material.ENDERMITE_SPAWN_EGG,
|
||||
Material.EVOKER_SPAWN_EGG,
|
||||
Material.FOX_SPAWN_EGG,
|
||||
Material.GHAST_SPAWN_EGG,
|
||||
Material.GUARDIAN_SPAWN_EGG,
|
||||
Material.HOGLIN_SPAWN_EGG,
|
||||
Material.HORSE_SPAWN_EGG,
|
||||
Material.HUSK_SPAWN_EGG,
|
||||
Material.LLAMA_SPAWN_EGG,
|
||||
Material.MAGMA_CUBE_SPAWN_EGG,
|
||||
Material.MOOSHROOM_SPAWN_EGG,
|
||||
Material.MULE_SPAWN_EGG,
|
||||
Material.OCELOT_SPAWN_EGG,
|
||||
Material.PANDA_SPAWN_EGG,
|
||||
Material.PARROT_SPAWN_EGG,
|
||||
Material.PHANTOM_SPAWN_EGG,
|
||||
Material.PIG_SPAWN_EGG,
|
||||
Material.PIGLIN_SPAWN_EGG,
|
||||
Material.PIGLIN_BRUTE_SPAWN_EGG,
|
||||
Material.PILLAGER_SPAWN_EGG,
|
||||
Material.POLAR_BEAR_SPAWN_EGG,
|
||||
Material.PUFFERFISH_SPAWN_EGG,
|
||||
Material.RABBIT_SPAWN_EGG,
|
||||
Material.RAVAGER_SPAWN_EGG,
|
||||
Material.SALMON_SPAWN_EGG,
|
||||
Material.SHEEP_SPAWN_EGG,
|
||||
Material.SHULKER_SPAWN_EGG,
|
||||
Material.SILVERFISH_SPAWN_EGG,
|
||||
Material.SKELETON_SPAWN_EGG,
|
||||
Material.SKELETON_HORSE_SPAWN_EGG,
|
||||
Material.SLIME_SPAWN_EGG,
|
||||
Material.SPIDER_SPAWN_EGG,
|
||||
Material.SQUID_SPAWN_EGG,
|
||||
Material.STRAY_SPAWN_EGG,
|
||||
Material.STRIDER_SPAWN_EGG,
|
||||
Material.TRADER_LLAMA_SPAWN_EGG,
|
||||
Material.TROPICAL_FISH_SPAWN_EGG,
|
||||
Material.TURTLE_SPAWN_EGG,
|
||||
Material.VEX_SPAWN_EGG,
|
||||
Material.VILLAGER_SPAWN_EGG,
|
||||
Material.VINDICATOR_SPAWN_EGG,
|
||||
Material.WANDERING_TRADER_SPAWN_EGG,
|
||||
Material.WITCH_SPAWN_EGG,
|
||||
Material.WITHER_SKELETON_SPAWN_EGG,
|
||||
Material.WOLF_SPAWN_EGG,
|
||||
Material.ZOGLIN_SPAWN_EGG,
|
||||
Material.ZOMBIE_SPAWN_EGG,
|
||||
Material.ZOMBIE_HORSE_SPAWN_EGG,
|
||||
Material.ZOMBIFIED_PIGLIN_SPAWN_EGG,
|
||||
Material.ZOMBIE_VILLAGER_SPAWN_EGG);
|
||||
|
||||
public static final List<Material> BANNERS = Arrays.asList(
|
||||
Material.BLACK_BANNER,
|
||||
Material.BLACK_WALL_BANNER,
|
||||
Material.BLUE_BANNER,
|
||||
Material.BLUE_WALL_BANNER,
|
||||
Material.BROWN_BANNER,
|
||||
Material.BROWN_WALL_BANNER,
|
||||
Material.CYAN_BANNER,
|
||||
Material.CYAN_WALL_BANNER,
|
||||
Material.GRAY_BANNER,
|
||||
Material.GRAY_WALL_BANNER,
|
||||
Material.GREEN_BANNER,
|
||||
Material.GREEN_WALL_BANNER,
|
||||
Material.LIGHT_BLUE_BANNER,
|
||||
Material.LIGHT_BLUE_WALL_BANNER,
|
||||
Material.LIGHT_GRAY_BANNER,
|
||||
Material.LIGHT_GRAY_WALL_BANNER,
|
||||
Material.LIME_BANNER,
|
||||
Material.LIME_WALL_BANNER,
|
||||
Material.MAGENTA_BANNER,
|
||||
Material.MAGENTA_WALL_BANNER,
|
||||
Material.ORANGE_BANNER,
|
||||
Material.ORANGE_WALL_BANNER,
|
||||
Material.PINK_BANNER,
|
||||
Material.PINK_WALL_BANNER,
|
||||
Material.PURPLE_BANNER,
|
||||
Material.PURPLE_WALL_BANNER,
|
||||
Material.RED_BANNER,
|
||||
Material.RED_WALL_BANNER,
|
||||
Material.WHITE_BANNER,
|
||||
Material.WHITE_WALL_BANNER,
|
||||
Material.YELLOW_BANNER,
|
||||
Material.YELLOW_WALL_BANNER);
|
||||
|
||||
public static final List<Biome> EXPLOSIVE_BED_BIOMES = Arrays.asList(
|
||||
Biome.NETHER_WASTES,
|
||||
Biome.CRIMSON_FOREST,
|
||||
|
@ -1,6 +1,9 @@
|
||||
package me.totalfreedom.totalfreedommod.world;
|
||||
|
||||
import java.io.File;
|
||||
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
||||
import me.totalfreedom.totalfreedommod.util.FLog;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
@ -29,6 +32,8 @@ public class Flatlands extends CustomWorld
|
||||
return null;
|
||||
}
|
||||
|
||||
wipeFlatlandsIfFlagged();
|
||||
|
||||
final WorldCreator worldCreator = new WorldCreator(getName());
|
||||
worldCreator.generateStructures(false);
|
||||
worldCreator.type(WorldType.NORMAL);
|
||||
@ -58,4 +63,32 @@ public class Flatlands extends CustomWorld
|
||||
|
||||
return world;
|
||||
}
|
||||
|
||||
|
||||
public void wipeFlatlandsIfFlagged()
|
||||
{
|
||||
boolean doFlatlandsWipe = false;
|
||||
try
|
||||
{
|
||||
doFlatlandsWipe = plugin.sf.getSavedFlag("do_wipe_flatlands");
|
||||
}
|
||||
catch (Exception ignored)
|
||||
{
|
||||
}
|
||||
|
||||
if (doFlatlandsWipe)
|
||||
{
|
||||
if (Bukkit.getServer().getWorld("flatlands") == null)
|
||||
{
|
||||
FLog.info("Wiping flatlands.");
|
||||
plugin.sf.setSavedFlag("do_wipe_flatlands", false);
|
||||
FileUtils.deleteQuietly(new File("./flatlands"));
|
||||
}
|
||||
else
|
||||
{
|
||||
FLog.severe("Can't wipe flatlands, it is already loaded.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -32,6 +32,14 @@ public class WorldRestrictions extends FreedomService
|
||||
private final List<String> BLOCKED_ESSENTIALS_COMMANDS = Arrays.asList(
|
||||
"bigtree", "ebigtree", "largetree", "elargetree");
|
||||
|
||||
private final Map<Flag<?>, Object> flags = new HashMap<Flag<?>, Object>()
|
||||
{{
|
||||
put(Flags.PLACE_VEHICLE, StateFlag.State.DENY);
|
||||
put(Flags.DESTROY_VEHICLE, StateFlag.State.DENY);
|
||||
put(Flags.ENTITY_ITEM_FRAME_DESTROY, StateFlag.State.DENY);
|
||||
put(Flags.ENTITY_PAINTING_DESTROY, StateFlag.State.DENY);
|
||||
}};
|
||||
|
||||
@Override
|
||||
public void onStart()
|
||||
{
|
||||
@ -147,4 +155,20 @@ public class WorldRestrictions extends FreedomService
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void protectWorld(World world)
|
||||
{
|
||||
if (!plugin.wgb.isEnabled())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
RegionManager regionManager = plugin.wgb.getRegionManager(world);
|
||||
|
||||
GlobalProtectedRegion region = new GlobalProtectedRegion("__global__");
|
||||
|
||||
region.setFlags(flags);
|
||||
|
||||
regionManager.addRegion(region);
|
||||
}
|
||||
}
|
@ -54,15 +54,10 @@ server:
|
||||
# What to display at the bottom of the tab list
|
||||
tablist_footer: ''
|
||||
|
||||
# Permissions System
|
||||
permissions:
|
||||
groups:
|
||||
admin: "Administrator"
|
||||
senior_admin: "Senior-Administrator"
|
||||
default: "Guest"
|
||||
|
||||
# Discord
|
||||
discord:
|
||||
# Do you want to enable the Discord verification system? (Disabled by default)
|
||||
verification: false
|
||||
# If you do not have a token, make a bot account and get one at https://discordapp.com/developers/applications/me
|
||||
token: ''
|
||||
# The official discord server's ID for this server
|
||||
@ -89,8 +84,6 @@ discord:
|
||||
executive_role_id: ''
|
||||
# Owner role ID
|
||||
server_owner_role_id: ''
|
||||
# Invite link for your Discord server
|
||||
invite_link: 'https://discord.com/invite/PW4savJR9a'
|
||||
|
||||
# Pterodactyl
|
||||
ptero:
|
||||
@ -166,7 +159,6 @@ shop:
|
||||
stacking_potato: 300
|
||||
clown_fish: 1500
|
||||
login_messages: 5000
|
||||
rainbow_trail: 1500
|
||||
|
||||
# Admin list
|
||||
adminlist:
|
||||
@ -214,7 +206,7 @@ allow:
|
||||
fire_spread: false
|
||||
fluid_spread: false
|
||||
lava_place: true
|
||||
lava_damage: true
|
||||
lava_damage: false
|
||||
water_place: true
|
||||
tnt_minecarts: false
|
||||
explosions: false
|
||||
@ -514,10 +506,6 @@ moblimiter:
|
||||
slime: true
|
||||
giant: true
|
||||
|
||||
# Spawnmob
|
||||
spawnmob:
|
||||
max: 25
|
||||
|
||||
# Flatlands
|
||||
flatlands:
|
||||
generate: true
|
||||
@ -602,14 +590,6 @@ masterbuilderinfo:
|
||||
- ' &2- Template:'
|
||||
- '&9https://forum.totalfreedom.me/d/336-master-builder-application-process'
|
||||
|
||||
# What new players will see upon joining for the first time.
|
||||
first_join_info:
|
||||
enabled: true
|
||||
text:
|
||||
- "&6Welcome to TotalFreedom -- the original Free-OP server!"
|
||||
- "&eThe server's name doesn't mean we have no rules. Do &6/rules &efor a list of them."
|
||||
- "&aNeed help getting started? Do &2/help &aor a list of commands!"
|
||||
|
||||
# Famous players - cannot be banned by username
|
||||
famous_players:
|
||||
- honeydew
|
||||
|
Reference in New Issue
Block a user