Initial commit working?
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
target/
|
||||
.vscode/settings.json
|
BIN
lib/PlaceholderAPI-2.11.7-DEV-207.jar
Normal file
BIN
lib/PlaceholderAPI-2.11.7-DEV-207.jar
Normal file
Binary file not shown.
53
pom.xml
Normal file
53
pom.xml
Normal file
@ -0,0 +1,53 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.sophiaatkinson</groupId>
|
||||
<artifactId>PronounsPlugin</artifactId>
|
||||
<version>1.0</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>PronounsPlugin</name>
|
||||
|
||||
<properties>
|
||||
<java.version>21</java.version>
|
||||
<maven.compiler.source>${java.version}</maven.compiler.source>
|
||||
<maven.compiler.target>${java.version}</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>spigot-repo</id>
|
||||
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>central</id>
|
||||
<url>https://repo.maven.apache.org/maven2</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot-api</artifactId>
|
||||
<version>1.16.5-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>me.clip</groupId>
|
||||
<artifactId>placeholderapi</artifactId>
|
||||
<version>2.11.7</version>
|
||||
<scope>system</scope>
|
||||
<!-- Make sure this path is correct -->
|
||||
<systemPath>${project.basedir}/lib/PlaceholderAPI-2.11.7-DEV-207.jar</systemPath>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jetbrains</groupId>
|
||||
<artifactId>annotations</artifactId>
|
||||
<version>24.0.1</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
131
src/main/java/com/sophiaatkinson/pronouns/PronounsCommand.java
Normal file
131
src/main/java/com/sophiaatkinson/pronouns/PronounsCommand.java
Normal file
@ -0,0 +1,131 @@
|
||||
package com.sophiaatkinson.pronouns;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabCompleter;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PronounsCommand implements CommandExecutor, TabCompleter {
|
||||
|
||||
private final PronounsPlugin plugin;
|
||||
|
||||
public PronounsCommand(PronounsPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (!(sender instanceof Player player)) {
|
||||
sender.sendMessage(ChatColor.RED + "Only players can use this command.");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args.length == 0) {
|
||||
player.sendMessage(ChatColor.YELLOW + "Usage: /pronouns help");
|
||||
return true;
|
||||
}
|
||||
|
||||
String subcommand = args[0].toLowerCase();
|
||||
|
||||
switch (subcommand) {
|
||||
case "set" -> {
|
||||
if (args.length < 2) {
|
||||
player.sendMessage(ChatColor.RED + "Please provide your pronouns. Example: /pronouns set she/her");
|
||||
return true;
|
||||
}
|
||||
String pronouns = String.join(" ", Arrays.copyOfRange(args, 1, args.length));
|
||||
|
||||
for (String blocked : plugin.getConfig().getStringList("blocked-pronouns")) {
|
||||
if (pronouns.contains(blocked)) {
|
||||
player.sendMessage(ChatColor.RED + "Your pronouns contain inappropriate language and cannot be set.");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
plugin.setPronouns(player.getUniqueId(), pronouns);
|
||||
player.sendMessage(ChatColor.GREEN + "Your pronouns have been set to: " + ChatColor.AQUA + pronouns);
|
||||
}
|
||||
|
||||
case "view" -> {
|
||||
if (args.length == 1) {
|
||||
String pronouns = plugin.getPronouns(player.getUniqueId());
|
||||
if (pronouns != null) {
|
||||
player.sendMessage(ChatColor.GREEN + "Your pronouns are: " + ChatColor.AQUA + pronouns);
|
||||
} else {
|
||||
player.sendMessage(ChatColor.YELLOW + "You haven't set your pronouns yet.");
|
||||
}
|
||||
} else {
|
||||
Player target = Bukkit.getPlayerExact(args[1]);
|
||||
if (target != null) {
|
||||
String pronouns = plugin.getPronouns(target.getUniqueId());
|
||||
if (pronouns != null) {
|
||||
player.sendMessage(ChatColor.GREEN + target.getName() + "'s pronouns are: " + ChatColor.AQUA + pronouns);
|
||||
} else {
|
||||
player.sendMessage(ChatColor.YELLOW + target.getName() + " hasn't set pronouns.");
|
||||
}
|
||||
} else {
|
||||
player.sendMessage(ChatColor.RED + "Player not found.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
case "reset" -> {
|
||||
plugin.setPronouns(player.getUniqueId(), null); // Reset the player's pronouns
|
||||
player.sendMessage(ChatColor.GREEN + "Your pronouns have been reset.");
|
||||
}
|
||||
|
||||
case "help" -> {
|
||||
player.sendMessage(ChatColor.AQUA + "=== Pronouns Plugin Help ===");
|
||||
player.sendMessage(ChatColor.YELLOW + "/pronouns set <pronouns> " + ChatColor.WHITE + "- Set your pronouns");
|
||||
player.sendMessage(ChatColor.YELLOW + "/pronouns view [player] " + ChatColor.WHITE + "- View your or another player's pronouns");
|
||||
player.sendMessage(ChatColor.YELLOW + "/pronouns reset " + ChatColor.WHITE + "- Reset your pronouns");
|
||||
player.sendMessage(ChatColor.YELLOW + "/pronouns version " + ChatColor.WHITE + "- Show plugin and server version info");
|
||||
player.sendMessage(ChatColor.YELLOW + "/pronouns debug " + ChatColor.WHITE + "- Generate a debug file");
|
||||
}
|
||||
|
||||
case "version" -> {
|
||||
player.sendMessage(ChatColor.AQUA + "=== Version Info ===");
|
||||
player.sendMessage(ChatColor.YELLOW + "PronounsPlugin: " + ChatColor.WHITE + plugin.getDescription().getVersion());
|
||||
player.sendMessage(ChatColor.YELLOW + "Server Version: " + ChatColor.WHITE + Bukkit.getVersion());
|
||||
}
|
||||
|
||||
case "debug" -> {
|
||||
plugin.generateDebugFile();
|
||||
player.sendMessage(ChatColor.GREEN + "Debug file written to plugin folder as debug.txt");
|
||||
}
|
||||
|
||||
default -> player.sendMessage(ChatColor.RED + "Unknown subcommand. Use /pronouns help for options.");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||
if (args.length == 1) {
|
||||
return Arrays.asList("set", "view", "reset", "help", "version", "debug");
|
||||
}
|
||||
|
||||
if (args.length == 2 && args[0].equalsIgnoreCase("view")) {
|
||||
List<String> names = new ArrayList<>();
|
||||
for (Player p : Bukkit.getOnlinePlayers()) {
|
||||
names.add(p.getName());
|
||||
}
|
||||
return names;
|
||||
}
|
||||
|
||||
if (args.length == 2 && args[0].equalsIgnoreCase("set")) {
|
||||
return Arrays.asList("she/her", "he/him", "they/them", "xe/xem", "it/its");
|
||||
}
|
||||
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package com.sophiaatkinson.pronouns;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
|
||||
|
||||
public class PronounsPlaceholder extends PlaceholderExpansion {
|
||||
|
||||
private final PronounsPlugin plugin;
|
||||
|
||||
public PronounsPlaceholder(PronounsPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getIdentifier() {
|
||||
return "pronounsplugin";
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getAuthor() {
|
||||
return "Sophia";
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getVersion() {
|
||||
return "1.0";
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable String onPlaceholderRequest(Player player, @NotNull String identifier) {
|
||||
if (identifier.equalsIgnoreCase("pronouns")) {
|
||||
String pronouns = plugin.getPronouns(player.getUniqueId());
|
||||
return pronouns != null ? pronouns : "not set";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
133
src/main/java/com/sophiaatkinson/pronouns/PronounsPlugin.java
Normal file
133
src/main/java/com/sophiaatkinson/pronouns/PronounsPlugin.java
Normal file
@ -0,0 +1,133 @@
|
||||
package com.sophiaatkinson.pronouns;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.sql.Connection;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
public class PronounsPlugin extends JavaPlugin {
|
||||
private Connection connection;
|
||||
private List<String> blockedPronouns;
|
||||
private List<String> pronounSuggestions;
|
||||
private final List<String> errorLog = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
getLogger().info("PronounsPlugin enabled!");
|
||||
|
||||
// Load blocked pronouns and pronoun suggestions from config
|
||||
saveDefaultConfig();
|
||||
blockedPronouns = getConfig().getStringList("blocked-pronouns");
|
||||
pronounSuggestions = getConfig().getStringList("pronoun-suggestions");
|
||||
|
||||
// Load database
|
||||
initDatabase();
|
||||
|
||||
// Register commands and placeholders
|
||||
PronounsCommand command = new PronounsCommand(this);
|
||||
getCommand("pronouns").setExecutor(command);
|
||||
getCommand("pronouns").setTabCompleter(command);
|
||||
|
||||
new PronounsPlaceholder(this).register();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
try {
|
||||
if (connection != null) connection.close();
|
||||
} catch (SQLException e) {
|
||||
errorLog.add("Database close error: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void initDatabase() {
|
||||
try {
|
||||
File dbFile = new File(getDataFolder(), "pronouns.db");
|
||||
if (!getDataFolder().exists()) getDataFolder().mkdirs();
|
||||
|
||||
String url = "jdbc:sqlite:" + dbFile.getAbsolutePath();
|
||||
connection = DriverManager.getConnection(url);
|
||||
|
||||
Statement stmt = connection.createStatement();
|
||||
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS pronouns (uuid TEXT PRIMARY KEY, pronouns TEXT);");
|
||||
} catch (SQLException e) {
|
||||
errorLog.add("Database initialization error: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void setPronouns(UUID uuid, String pronouns) {
|
||||
for (String blocked : blockedPronouns) {
|
||||
if (pronouns.contains(blocked)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
try (PreparedStatement ps = connection.prepareStatement("REPLACE INTO pronouns (uuid, pronouns) VALUES (?, ?)")) {
|
||||
ps.setString(1, uuid.toString());
|
||||
ps.setString(2, pronouns);
|
||||
ps.executeUpdate();
|
||||
} catch (SQLException e) {
|
||||
errorLog.add("Database update error: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public String getPronouns(UUID uuid) {
|
||||
try (PreparedStatement ps = connection.prepareStatement("SELECT pronouns FROM pronouns WHERE uuid = ?")) {
|
||||
ps.setString(1, uuid.toString());
|
||||
ResultSet rs = ps.executeQuery();
|
||||
if (rs.next()) {
|
||||
return rs.getString("pronouns");
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
errorLog.add("Database fetch error: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void generateDebugFile() {
|
||||
File debugFile = new File(getDataFolder(), "debug.txt");
|
||||
try {
|
||||
if (!getDataFolder().exists()) getDataFolder().mkdirs();
|
||||
if (!debugFile.exists()) debugFile.createNewFile();
|
||||
|
||||
FileWriter writer = new FileWriter(debugFile);
|
||||
writer.write("=== PronounsPlugin Debug Report ===\n");
|
||||
writer.write("Plugin Enabled: " + isEnabled() + "\n");
|
||||
writer.write("Database Connected: " + (connection != null) + "\n");
|
||||
writer.write("Blocked Pronouns: " + blockedPronouns + "\n");
|
||||
writer.write("Pronoun Suggestions: " + pronounSuggestions + "\n");
|
||||
writer.write("Error Log:\n");
|
||||
|
||||
if (errorLog.isEmpty()) {
|
||||
writer.write(" No errors logged.\n");
|
||||
} else {
|
||||
for (String error : errorLog) {
|
||||
writer.write(" - " + error + "\n");
|
||||
}
|
||||
}
|
||||
|
||||
writer.write("Generated at: " + new java.util.Date() + "\n");
|
||||
writer.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public List<String> getPronounSuggestions() {
|
||||
return pronounSuggestions;
|
||||
}
|
||||
}
|
39
src/main/resources/config.yml
Normal file
39
src/main/resources/config.yml
Normal file
@ -0,0 +1,39 @@
|
||||
# PronounsPlugin Configuration
|
||||
|
||||
blocked-pronouns:
|
||||
- "faggot"
|
||||
- "bitch"
|
||||
- "slut"
|
||||
- "cunt"
|
||||
- "dickhead"
|
||||
- "bastard"
|
||||
- "asshole"
|
||||
- "idiot"
|
||||
- "retard"
|
||||
- "freak"
|
||||
- "whore"
|
||||
- "nigger"
|
||||
- "chink"
|
||||
- "spic"
|
||||
|
||||
pronoun-suggestions:
|
||||
- "she/her"
|
||||
- "he/him"
|
||||
- "they/them"
|
||||
- "xe/xem"
|
||||
- "it/its"
|
||||
|
||||
debug: true
|
||||
|
||||
generate-debug-file: true
|
||||
|
||||
database:
|
||||
use-sqlite: true
|
||||
|
||||
admin-permissions:
|
||||
- "pronouns.admin"
|
||||
- "pronouns.override"
|
||||
|
||||
player-permissions:
|
||||
- "pronouns.set"
|
||||
- "pronouns.view"
|
28
src/main/resources/plugin.yml
Normal file
28
src/main/resources/plugin.yml
Normal file
@ -0,0 +1,28 @@
|
||||
name: PronounsPlugin
|
||||
version: 1.0
|
||||
main: com.sophiaatkinson.pronouns.PronounsPlugin
|
||||
api-version: 1.16
|
||||
commands:
|
||||
pronouns:
|
||||
description: Manage pronouns for players
|
||||
usage: /<command> <set/view> <pronouns/player>
|
||||
permissions:
|
||||
pronouns.set:
|
||||
description: Allows a player to set their pronouns
|
||||
default: true
|
||||
pronouns.view:
|
||||
description: Allows a player to view their own or others' pronouns
|
||||
default: true
|
||||
pronouns.debug:
|
||||
description: Allows players to use the debug command
|
||||
default: op
|
||||
pronouns.admin:
|
||||
description: Allows admin to view all pronouns
|
||||
default: op
|
||||
aliases:
|
||||
- mypronouns
|
||||
- setpronouns
|
||||
depend:
|
||||
- PlaceholderAPI
|
||||
softdepend:
|
||||
- InteractiveChat
|
Reference in New Issue
Block a user