mirror of
https://github.com/CarmJos/UserPrefix.git
synced 2026-06-05 00:35:02 +08:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 774e9b764e | |||
| a31da83531 | |||
| 61857d6305 | |||
| dd96188b22 | |||
| eb4ecaada9 | |||
| acc9ea7e7c | |||
| 83b3c45d57 | |||
| 3ec39b9ca3 | |||
| 821b42cc03 | |||
| 81e0c0960f | |||
| 99c577c361 | |||
| 5df6e1fe34 | |||
| 7c887822ba | |||
| 6b601950a3 |
@@ -9,7 +9,7 @@
|
||||
# the `language` matrix defined below to confirm you have the correct set of
|
||||
# supported CodeQL languages.
|
||||
#
|
||||
name: "CodeQL"
|
||||
name: "CodeQL Analysis"
|
||||
|
||||
on:
|
||||
push:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
|
||||
|
||||
name: Deploy
|
||||
name: Deploy & Upload
|
||||
|
||||
on:
|
||||
# 支持手动触发构建
|
||||
@@ -26,8 +26,65 @@ jobs:
|
||||
server-id: github
|
||||
server-username: MAVEN_USERNAME
|
||||
server-password: MAVEN_TOKEN
|
||||
- name: "Deploy"
|
||||
|
||||
- name: "Maven Deploy"
|
||||
run: mvn -B deploy --file pom.xml -DskipTests
|
||||
env:
|
||||
MAVEN_USERNAME: ${{ github.repository_owner }}
|
||||
MAVEN_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
||||
MAVEN_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
||||
|
||||
- name: "Release Asset Upload"
|
||||
id: upload-release-asset
|
||||
uses: shogo82148/actions-upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: asset/*.jar
|
||||
asset_content_type: application/java-archive
|
||||
|
||||
- name: "Javadoc Deploy Staging"
|
||||
run: |
|
||||
rm -rf docs
|
||||
mkdir -vp docs
|
||||
cp -vrf target/apidocs/* docs/
|
||||
cp -vrf .documentation/JAVADOC-README.md docs/README.md
|
||||
|
||||
- name: "Generate the Javadoc sitemap"
|
||||
id: sitemap
|
||||
uses: cicirello/generate-sitemap@v1
|
||||
with:
|
||||
base-url-path: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}
|
||||
path-to-root: docs
|
||||
|
||||
- name: "Output Javadoc stats"
|
||||
run: |
|
||||
echo "sitemap-path = ${{ steps.sitemap.outputs.sitemap-path }}"
|
||||
echo "url-count = ${{ steps.sitemap.outputs.url-count }}"
|
||||
echo "excluded-count = ${{ steps.sitemap.outputs.excluded-count }}"
|
||||
|
||||
- name: "Configure Git"
|
||||
env:
|
||||
DEPLOY_PRI: ${{secrets.DEPLOY_PRI}}
|
||||
run: |
|
||||
sudo timedatectl set-timezone "Asia/Shanghai"
|
||||
mkdir -p ~/.ssh/
|
||||
echo "$DEPLOY_PRI" > ~/.ssh/id_rsa
|
||||
chmod 600 ~/.ssh/id_rsa
|
||||
ssh-keyscan github.com >> ~/.ssh/known_hosts
|
||||
git config --global user.name 'CarmJos'
|
||||
git config --global user.email 'carm@carm.cc'
|
||||
|
||||
- name: "Commit Javadocs"
|
||||
run: |
|
||||
cd docs
|
||||
git init
|
||||
git remote add origin git@github.com:${{ github.repository }}.git
|
||||
git checkout -b gh-pages
|
||||
git add -A
|
||||
git commit -m "API Document generated."
|
||||
|
||||
- name: "Push javadocs"
|
||||
run: |
|
||||
cd docs
|
||||
git push origin HEAD:gh-pages --force
|
||||
@@ -1,73 +0,0 @@
|
||||
# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
|
||||
|
||||
name: Javadoc
|
||||
|
||||
on:
|
||||
# 支持手动触发构建
|
||||
workflow_dispatch:
|
||||
release:
|
||||
# 创建release的时候触发
|
||||
types: [ published ]
|
||||
|
||||
jobs:
|
||||
api-website:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout the repo
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Set up the Java JDK
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: '11'
|
||||
distribution: 'adopt'
|
||||
|
||||
- name: Generate docs
|
||||
run: mvn package -DskipTests
|
||||
|
||||
- name: Copy to Location
|
||||
run: |
|
||||
rm -rf docs
|
||||
mkdir -vp docs
|
||||
cp -vrf target/apidocs/* docs/
|
||||
cp -vrf .documentation/JAVADOC-README.md docs/README.md
|
||||
|
||||
- name: Generate the sitemap
|
||||
id: sitemap
|
||||
uses: cicirello/generate-sitemap@v1
|
||||
with:
|
||||
base-url-path: https://carmjos.github.io/userprefix
|
||||
path-to-root: docs
|
||||
|
||||
- name: Output stats
|
||||
run: |
|
||||
echo "sitemap-path = ${{ steps.sitemap.outputs.sitemap-path }}"
|
||||
echo "url-count = ${{ steps.sitemap.outputs.url-count }}"
|
||||
echo "excluded-count = ${{ steps.sitemap.outputs.excluded-count }}"
|
||||
|
||||
- name: Configure Git
|
||||
env:
|
||||
DEPLOY_PRI: ${{secrets.DEPLOY_PRI}}
|
||||
run: |
|
||||
sudo timedatectl set-timezone "Asia/Shanghai"
|
||||
mkdir -p ~/.ssh/
|
||||
echo "$DEPLOY_PRI" > ~/.ssh/id_rsa
|
||||
chmod 600 ~/.ssh/id_rsa
|
||||
ssh-keyscan github.com >> ~/.ssh/known_hosts
|
||||
git config --global user.name 'CarmJos'
|
||||
git config --global user.email 'carm@carm.cc'
|
||||
|
||||
- name: Commit documentation changes
|
||||
run: |
|
||||
cd docs
|
||||
git init
|
||||
git remote add origin git@github.com:CarmJos/UserPrefix.git
|
||||
git checkout -b gh-pages
|
||||
git add -A
|
||||
git commit -m "API Document generated."
|
||||
- name: Push javadocs
|
||||
run: |
|
||||
cd docs
|
||||
git push origin HEAD:gh-pages --force
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
|
||||
|
||||
name: Build
|
||||
name: Build & Tests
|
||||
|
||||
on:
|
||||
# 支持手动触发构建
|
||||
@@ -29,10 +29,15 @@ jobs:
|
||||
env:
|
||||
MAVEN_USERNAME: ${{ github.repository_owner }}
|
||||
MAVEN_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
||||
- name: "Target Stage"
|
||||
run: mkdir staging && cp target/*.jar staging
|
||||
|
||||
- name: "Target Staging"
|
||||
run: |
|
||||
mkdir artifacts
|
||||
cp -vrf target/ artifacts/target/
|
||||
cp -vrf asset/*.jar artifacts
|
||||
|
||||
- name: "Upload artifact"
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: Artifact
|
||||
path: staging
|
||||
path: artifacts
|
||||
@@ -2,3 +2,4 @@
|
||||
/target/
|
||||
./*.iml
|
||||
*.iml
|
||||
asset/
|
||||
@@ -1,5 +1,7 @@
|
||||

|
||||
|
||||
README LANGUAGES [ [中文](README.md) | [**English**](README-en.md) ]
|
||||
|
||||
# UserPrefix Plugin
|
||||
|
||||
[](https://www.codefactor.io/repository/github/carmjos/userprefix)
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||

|
||||
|
||||
README LANGUAGES [ [**中文**](README.md) | [English](README-en.md) ]
|
||||
|
||||
# 用户前缀系统插件
|
||||
|
||||
[](https://www.codefactor.io/repository/github/carmjos/userprefix)
|
||||
@@ -13,8 +15,6 @@
|
||||
|
||||
本插件基于Spigot实现,**理论上支持全版本**。
|
||||
|
||||
The **English version** of the introduction is [here](README-en.md).
|
||||
|
||||
> 本插件已在 [MCBBS](https://www.mcbbs.net/forum.php?mod=viewthread&tid=1261503) 与 [SpigotMC](https://www.spigotmc.org/resources/userprefix-hex-color-support-all-version.96277/) 上发布。
|
||||
|
||||
## 示例
|
||||
|
||||
@@ -10,10 +10,10 @@
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
|
||||
</properties>
|
||||
|
||||
|
||||
<groupId>cc.carm.plugin</groupId>
|
||||
<artifactId>userprefix</artifactId>
|
||||
<version>2.3.1</version>
|
||||
<version>2.4.2</version>
|
||||
|
||||
<name>UserPrefix</name>
|
||||
<description>轻便、高效、实时的用户前缀系统。</description>
|
||||
@@ -80,6 +80,11 @@
|
||||
<url>https://repo1.maven.org/maven2/</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>sonatype-repo</id>
|
||||
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>github</id>
|
||||
<name>GitHub Packages</name>
|
||||
@@ -123,7 +128,14 @@
|
||||
<dependency>
|
||||
<groupId>org.bstats</groupId>
|
||||
<artifactId>bstats-bukkit</artifactId>
|
||||
<version>2.2.1</version>
|
||||
<version>3.0.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cc.carm.lib</groupId>
|
||||
<artifactId>githubreleases4j</artifactId>
|
||||
<version>1.3.1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
@@ -200,18 +212,25 @@
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<createDependencyReducedPom>false</createDependencyReducedPom>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<finalName>${project.name}-${project.version}</finalName>
|
||||
<outputDirectory>${project.basedir}/asset/</outputDirectory>
|
||||
<createDependencyReducedPom>false</createDependencyReducedPom>
|
||||
<relocations>
|
||||
<relocation>
|
||||
<pattern>org.bstats</pattern>
|
||||
<!-- Replace this with your package! -->
|
||||
<shadedPattern>cc.carm.plugin.userprefix.bstats</shadedPattern>
|
||||
</relocation>
|
||||
<relocation>
|
||||
<pattern>cc.carm.lib.githubreleases4j</pattern>
|
||||
<shadedPattern>cc.carm.plugin.userprefix.lib.github</shadedPattern>
|
||||
</relocation>
|
||||
<relocation>
|
||||
<pattern>org.json</pattern>
|
||||
<shadedPattern>cc.carm.plugin.userprefix.lib.json</shadedPattern>
|
||||
</relocation>
|
||||
</relocations>
|
||||
<filters>
|
||||
<filter>
|
||||
@@ -242,4 +261,4 @@
|
||||
</build>
|
||||
|
||||
|
||||
</project>
|
||||
</project>
|
||||
|
||||
@@ -3,6 +3,7 @@ package cc.carm.plugin.userprefix;
|
||||
import cc.carm.plugin.userprefix.command.UserPrefixAdminCommand;
|
||||
import cc.carm.plugin.userprefix.command.UserPrefixCommand;
|
||||
import cc.carm.plugin.userprefix.configuration.PluginConfig;
|
||||
import cc.carm.plugin.userprefix.hooker.UpdateChecker;
|
||||
import cc.carm.plugin.userprefix.hooker.UserPrefixExpansion;
|
||||
import cc.carm.plugin.userprefix.listener.ChatListener;
|
||||
import cc.carm.plugin.userprefix.listener.UserListener;
|
||||
@@ -13,6 +14,7 @@ import cc.carm.plugin.userprefix.manager.ServiceManager;
|
||||
import cc.carm.plugin.userprefix.manager.UserManager;
|
||||
import cc.carm.plugin.userprefix.util.ColorParser;
|
||||
import cc.carm.plugin.userprefix.util.MessageUtil;
|
||||
import cc.carm.plugin.userprefix.wrapper.ItemStackWrapper;
|
||||
import net.luckperms.api.event.user.UserDataRecalculateEvent;
|
||||
import org.bstats.bukkit.Metrics;
|
||||
import org.bstats.charts.SimplePie;
|
||||
@@ -21,6 +23,7 @@ import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.PluginCommand;
|
||||
import org.bukkit.command.TabCompleter;
|
||||
import org.bukkit.configuration.serialization.ConfigurationSerialization;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
@@ -29,132 +32,142 @@ import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class Main extends JavaPlugin {
|
||||
|
||||
private static Main instance;
|
||||
private static Main instance;
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
instance = this;
|
||||
showPluginName();
|
||||
log(getName() + " " + getDescription().getVersion() + " &7开始加载...");
|
||||
long startTime = System.currentTimeMillis();
|
||||
@Override
|
||||
public void onEnable() {
|
||||
instance = this;
|
||||
showPluginName();
|
||||
log(getName() + " " + getDescription().getVersion() + " &7开始加载...");
|
||||
long startTime = System.currentTimeMillis();
|
||||
|
||||
log("加载配置文件...");
|
||||
ConfigManager.initConfig();
|
||||
PrefixManager.init();
|
||||
log("注入序列化处理工具...");
|
||||
ConfigurationSerialization.registerClass(ItemStackWrapper.class);
|
||||
|
||||
log("注册指令...");
|
||||
registerCommand("UserPrefix", new UserPrefixCommand());
|
||||
registerCommand("UserPrefixAdmin", new UserPrefixAdminCommand());
|
||||
log("加载配置文件...");
|
||||
ConfigManager.initConfig();
|
||||
PrefixManager.init();
|
||||
|
||||
log("注册监听器...");
|
||||
regListener(new UserListener());
|
||||
regListener(new ChatListener());
|
||||
ServiceManager.getService().getEventBus().subscribe(this, UserDataRecalculateEvent.class, UserNodeUpdateProcessor::process);
|
||||
log("注册指令...");
|
||||
registerCommand("UserPrefix", new UserPrefixCommand());
|
||||
registerCommand("UserPrefixAdmin", new UserPrefixAdminCommand());
|
||||
|
||||
if (MessageUtil.hasPlaceholderAPI()) {
|
||||
log("注册变量...");
|
||||
new UserPrefixExpansion(getInstance()).register();
|
||||
} else {
|
||||
log("未安装 PlaceholderAPI 不进行变量注册...");
|
||||
log("若您想使用变量进行前缀的显示,请安装PlaceholderAPI!");
|
||||
}
|
||||
log("注册监听器...");
|
||||
regListener(new UserListener());
|
||||
regListener(new ChatListener());
|
||||
ServiceManager.getService().getEventBus().subscribe(this, UserDataRecalculateEvent.class, UserNodeUpdateProcessor::process);
|
||||
|
||||
if (PluginConfig.METRICS.get()) {
|
||||
log("启用统计数据...");
|
||||
Metrics metrics = new Metrics(this, 13776);
|
||||
metrics.addCustomChart(new SingleLineChart("active_prefixes", () -> PrefixManager.getPrefixes().size()));
|
||||
metrics.addCustomChart(new SimplePie("custom_storage", () -> PluginConfig.CustomStorage.ENABLE.get() ? "ENABLE" : "DISABLE"));
|
||||
metrics.addCustomChart(new SimplePie("lp_version", () -> ServiceManager.getService().getPluginMetadata().getVersion()));
|
||||
metrics.addCustomChart(new SimplePie("papi_version", () -> {
|
||||
Plugin plugin = Bukkit.getPluginManager().getPlugin("PlaceholderAPI");
|
||||
if (plugin == null) return "Not installed";
|
||||
else return plugin.getDescription().getVersion();
|
||||
}));
|
||||
}
|
||||
if (MessageUtil.hasPlaceholderAPI()) {
|
||||
log("注册变量...");
|
||||
new UserPrefixExpansion(getInstance()).register();
|
||||
} else {
|
||||
log("未安装 PlaceholderAPI 不进行变量注册...");
|
||||
log("若您想使用变量进行前缀的显示,请安装PlaceholderAPI!");
|
||||
}
|
||||
|
||||
log("加载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。");
|
||||
if (PluginConfig.METRICS.get()) {
|
||||
log("启用统计数据...");
|
||||
Metrics metrics = new Metrics(this, 13776);
|
||||
metrics.addCustomChart(new SingleLineChart("active_prefixes", () -> PrefixManager.getPrefixes().size()));
|
||||
metrics.addCustomChart(new SimplePie("custom_storage", () -> PluginConfig.CustomStorage.ENABLE.get() ? "ENABLE" : "DISABLE"));
|
||||
metrics.addCustomChart(new SimplePie("lp_version", () -> ServiceManager.getService().getPluginMetadata().getVersion()));
|
||||
metrics.addCustomChart(new SimplePie("papi_version", () -> {
|
||||
Plugin plugin = Bukkit.getPluginManager().getPlugin("PlaceholderAPI");
|
||||
if (plugin == null) return "Not installed";
|
||||
else return plugin.getDescription().getVersion();
|
||||
}));
|
||||
}
|
||||
|
||||
showAD();
|
||||
if (PluginConfig.CHECK_UPDATE.get()) {
|
||||
log("开始检查更新...");
|
||||
UpdateChecker.checkUpdate(getDescription().getVersion());
|
||||
} else {
|
||||
log("已禁用检查更新,跳过。");
|
||||
}
|
||||
|
||||
if (Bukkit.getOnlinePlayers().size() > 0) {
|
||||
Bukkit.getOnlinePlayers().forEach(UserManager::initPlayer); // 适配热重载
|
||||
}
|
||||
log("加载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。");
|
||||
|
||||
showAD();
|
||||
|
||||
if (Bukkit.getOnlinePlayers().size() > 0) {
|
||||
Bukkit.getOnlinePlayers().forEach(UserManager::initPlayer); // 适配热重载
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
showPluginName();
|
||||
log(getName() + " " + getDescription().getVersion() + " 开始卸载...");
|
||||
long startTime = System.currentTimeMillis();
|
||||
@Override
|
||||
public void onDisable() {
|
||||
showPluginName();
|
||||
log(getName() + " " + getDescription().getVersion() + " 开始卸载...");
|
||||
long startTime = System.currentTimeMillis();
|
||||
|
||||
log("卸载监听器...");
|
||||
Bukkit.getServicesManager().unregisterAll(this);
|
||||
log("卸载监听器...");
|
||||
Bukkit.getServicesManager().unregisterAll(this);
|
||||
|
||||
log("卸载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。");
|
||||
log("卸载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。");
|
||||
|
||||
showAD();
|
||||
showAD();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册监听器
|
||||
*
|
||||
* @param listener 监听器
|
||||
*/
|
||||
public static void regListener(Listener listener) {
|
||||
Bukkit.getPluginManager().registerEvents(listener, getInstance());
|
||||
}
|
||||
/**
|
||||
* 注册监听器
|
||||
*
|
||||
* @param listener 监听器
|
||||
*/
|
||||
public static void regListener(Listener listener) {
|
||||
Bukkit.getPluginManager().registerEvents(listener, getInstance());
|
||||
}
|
||||
|
||||
public static void log(String message) {
|
||||
Bukkit.getConsoleSender().sendMessage(ColorParser.parse("[" + getInstance().getName() + "] " + message));
|
||||
}
|
||||
public static void log(String message) {
|
||||
Bukkit.getConsoleSender().sendMessage(ColorParser.parse("[" + getInstance().getName() + "] " + message));
|
||||
}
|
||||
|
||||
public static void debug(String message) {
|
||||
if (PluginConfig.DEBUG.get()) {
|
||||
log("[DEBUG] " + message);
|
||||
}
|
||||
}
|
||||
public static void debug(String message) {
|
||||
if (PluginConfig.DEBUG.get()) {
|
||||
log("[DEBUG] " + message);
|
||||
}
|
||||
}
|
||||
|
||||
public static void error(String message) {
|
||||
log("&c[ERROR] &r" + message);
|
||||
}
|
||||
public static void error(String message) {
|
||||
log("&c[ERROR] &r" + message);
|
||||
}
|
||||
|
||||
|
||||
public static JavaPlugin getInstance() {
|
||||
return instance;
|
||||
}
|
||||
public static JavaPlugin getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
public static void registerCommand(String commandName,
|
||||
@NotNull CommandExecutor executor) {
|
||||
registerCommand(commandName, executor, null);
|
||||
}
|
||||
public static void registerCommand(String commandName,
|
||||
@NotNull CommandExecutor executor) {
|
||||
registerCommand(commandName, executor, null);
|
||||
}
|
||||
|
||||
public static void registerCommand(String commandName,
|
||||
@NotNull CommandExecutor executor,
|
||||
@Nullable TabCompleter tabCompleter) {
|
||||
PluginCommand command = Bukkit.getPluginCommand(commandName);
|
||||
if (command == null) return;
|
||||
command.setExecutor(executor);
|
||||
if (tabCompleter != null) command.setTabCompleter(tabCompleter);
|
||||
}
|
||||
public static void registerCommand(String commandName,
|
||||
@NotNull CommandExecutor executor,
|
||||
@Nullable TabCompleter tabCompleter) {
|
||||
PluginCommand command = Bukkit.getPluginCommand(commandName);
|
||||
if (command == null) return;
|
||||
command.setExecutor(executor);
|
||||
if (tabCompleter != null) command.setTabCompleter(tabCompleter);
|
||||
}
|
||||
|
||||
private void showPluginName() {
|
||||
log("&b _ _ &f _____ __ _ ");
|
||||
log("&b| | | | &f| __ \\ / _|(_) ");
|
||||
log("&b| | | | ___ ___ _ __ &f| |__) |_ __ ___ | |_ _ __ __");
|
||||
log("&b| | | |/ __| / _ \\| '__|&f| ___/| '__|/ _ \\| _|| |\\ \\/ /");
|
||||
log("&b| |__| |\\__ \\| __/| | &f| | | | | __/| | | | > < ");
|
||||
log("&b \\____/ |___/ \\___||_| &f|_| |_| \\___||_| |_|/_/\\_\\");
|
||||
log("&8 ");
|
||||
log("&8> &f" + getDescription().getWebsite());
|
||||
}
|
||||
private void showPluginName() {
|
||||
log("&b _ _ &f _____ __ _ ");
|
||||
log("&b| | | | &f| __ \\ / _|(_) ");
|
||||
log("&b| | | | ___ ___ _ __ &f| |__) |_ __ ___ | |_ _ __ __");
|
||||
log("&b| | | |/ __| / _ \\| '__|&f| ___/| '__|/ _ \\| _|| |\\ \\/ /");
|
||||
log("&b| |__| |\\__ \\| __/| | &f| | | | | __/| | | | > < ");
|
||||
log("&b \\____/ |___/ \\___||_| &f|_| |_| \\___||_| |_|/_/\\_\\");
|
||||
log("&8 ");
|
||||
log("&8> &f" + getDescription().getWebsite());
|
||||
}
|
||||
|
||||
private void showAD() {
|
||||
log("&7感谢您使用 &3&lUserPrefix " + getDescription().getVersion() + "&7!");
|
||||
log("&7本插件由 &b&lYourCraft &7提供长期支持与维护。");
|
||||
}
|
||||
private void showAD() {
|
||||
log("&7感谢您使用 &3&lUserPrefix " + getDescription().getVersion() + "&7!");
|
||||
log("&7本插件由 &b&lYourCraft &7提供长期支持与维护。");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -9,77 +9,79 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class PluginConfig {
|
||||
|
||||
public static ConfigValue<Boolean> DEBUG = new ConfigValue<>("debug", Boolean.class, false);
|
||||
public static ConfigValue<Boolean> DEBUG = new ConfigValue<>("debug", Boolean.class, false);
|
||||
|
||||
public static ConfigValue<Boolean> METRICS = new ConfigValue<>("metrics", Boolean.class, true);
|
||||
public static ConfigValue<Boolean> METRICS = new ConfigValue<>("metrics", Boolean.class, true);
|
||||
|
||||
public static class CustomStorage {
|
||||
public static final ConfigValue<Boolean> CHECK_UPDATE = new ConfigValue<>("check-update", Boolean.class, true);
|
||||
|
||||
public static ConfigValue<Boolean> ENABLE = new ConfigValue<>("custom-storage.enable", Boolean.class, false);
|
||||
public static class CustomStorage {
|
||||
|
||||
public static ConfigValue<String> PATH = new ConfigValue<>("custom-storage.path", String.class, "prefixes/");
|
||||
public static ConfigValue<Boolean> ENABLE = new ConfigValue<>("custom-storage.enable", Boolean.class, false);
|
||||
|
||||
}
|
||||
public static ConfigValue<String> PATH = new ConfigValue<>("custom-storage.path", String.class, "prefixes/");
|
||||
|
||||
public static class Functions {
|
||||
}
|
||||
|
||||
public static ConfigValue<Boolean> NAME_PREFIX = new ConfigValue<>("functions.OnNamePrefix", Boolean.class, true);
|
||||
public static ConfigValue<Boolean> AUTO_USE = new ConfigValue<>("functions.autoUsePrefix", Boolean.class, true);
|
||||
public static class Functions {
|
||||
|
||||
public static class Chat {
|
||||
public static ConfigValue<Boolean> NAME_PREFIX = new ConfigValue<>("functions.OnNamePrefix", Boolean.class, true);
|
||||
public static ConfigValue<Boolean> AUTO_USE = new ConfigValue<>("functions.autoUsePrefix", Boolean.class, true);
|
||||
|
||||
public static ConfigValue<Boolean> ENABLE = new ConfigValue<>("functions.chat.enable", Boolean.class, false);
|
||||
public static ConfigValue<String> FORMAT = new ConfigValue<>("functions.chat.format", String.class, "<%1$s> %2$s");
|
||||
public static class Chat {
|
||||
|
||||
}
|
||||
public static ConfigValue<Boolean> ENABLE = new ConfigValue<>("functions.chat.enable", Boolean.class, false);
|
||||
public static ConfigValue<String> FORMAT = new ConfigValue<>("functions.chat.format", String.class, "<%1$s> %2$s");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static class GUI {
|
||||
}
|
||||
|
||||
public static ConfigValue<String> TITLE = new ConfigValue<>("GUI.title", String.class, "&f&l我的前缀 &8| 列表");
|
||||
public static class GUI {
|
||||
|
||||
public static class Items {
|
||||
public static ConfigValue<String> TITLE = new ConfigValue<>("GUI.title", String.class, "&f&l我的前缀 &8| 列表");
|
||||
|
||||
public static ConfigValue<ItemStack> NEXT_PAGE = new ConfigValue<>("GUI.items.next-page", ItemStack.class,
|
||||
new ItemStackFactory(Material.ARROW)
|
||||
.setDisplayName("下一页")
|
||||
.addLore("&7&o右键可前往最后一页哦")
|
||||
.toItemStack()
|
||||
);
|
||||
public static ConfigValue<ItemStack> PREVIOUS_PAGE = new ConfigValue<>("GUI.items.previous-page", ItemStack.class,
|
||||
new ItemStackFactory(Material.ARROW)
|
||||
.setDisplayName("上一页")
|
||||
.addLore("&7&o右键可前往第一页哦")
|
||||
.toItemStack()
|
||||
);
|
||||
public static class Items {
|
||||
|
||||
}
|
||||
public static ConfigValue<ItemStack> NEXT_PAGE = new ConfigValue<>("GUI.items.next-page", ItemStack.class,
|
||||
new ItemStackFactory(Material.ARROW)
|
||||
.setDisplayName("下一页")
|
||||
.addLore("&7&o右键可前往最后一页哦")
|
||||
.toItemStack()
|
||||
);
|
||||
public static ConfigValue<ItemStack> PREVIOUS_PAGE = new ConfigValue<>("GUI.items.previous-page", ItemStack.class,
|
||||
new ItemStackFactory(Material.ARROW)
|
||||
.setDisplayName("上一页")
|
||||
.addLore("&7&o右键可前往第一页哦")
|
||||
.toItemStack()
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static class Messages {
|
||||
}
|
||||
|
||||
public static ConfigMessageList SELECTED = new ConfigMessageList("selected");
|
||||
public static ConfigMessageList EXPIRED = new ConfigMessageList("expired");
|
||||
public static ConfigMessageList REMOVED = new ConfigMessageList("removed");
|
||||
public static class Messages {
|
||||
|
||||
public static ConfigMessageList RELOAD = new ConfigMessageList("reload");
|
||||
public static ConfigMessageList HELP = new ConfigMessageList("help");
|
||||
public static ConfigMessageList SELECTED = new ConfigMessageList("selected");
|
||||
public static ConfigMessageList EXPIRED = new ConfigMessageList("expired");
|
||||
public static ConfigMessageList REMOVED = new ConfigMessageList("removed");
|
||||
|
||||
public static ConfigMessageList LIST_TITLE = new ConfigMessageList("list-title");
|
||||
public static ConfigMessageList LIST_VALUE = new ConfigMessageList("list-value");
|
||||
public static ConfigMessageList RELOAD = new ConfigMessageList("reload");
|
||||
public static ConfigMessageList HELP = new ConfigMessageList("help");
|
||||
|
||||
}
|
||||
public static ConfigMessageList LIST_TITLE = new ConfigMessageList("list-title");
|
||||
public static ConfigMessageList LIST_VALUE = new ConfigMessageList("list-value");
|
||||
|
||||
public static class Sounds {
|
||||
}
|
||||
|
||||
public static ConfigSound GUI_OPEN = new ConfigSound("Sounds.openGUI");
|
||||
public static ConfigSound GUI_CLICK = new ConfigSound("Sounds.guiClick");
|
||||
public static ConfigSound PREFIX_CHANGE = new ConfigSound("Sounds.prefixChange");
|
||||
public static ConfigSound PREFIX_EXPIRED = new ConfigSound("Sounds.prefixExpired");
|
||||
public static class Sounds {
|
||||
|
||||
}
|
||||
public static ConfigSound GUI_OPEN = new ConfigSound("Sounds.openGUI");
|
||||
public static ConfigSound GUI_CLICK = new ConfigSound("Sounds.guiClick");
|
||||
public static ConfigSound PREFIX_CHANGE = new ConfigSound("Sounds.prefixChange");
|
||||
public static ConfigSound PREFIX_EXPIRED = new ConfigSound("Sounds.prefixExpired");
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package cc.carm.plugin.userprefix.configuration.file;
|
||||
|
||||
|
||||
import cc.carm.plugin.userprefix.util.ConfigurationUtil;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.io.File;
|
||||
@@ -35,7 +35,7 @@ public class FileConfig {
|
||||
}
|
||||
plugin.saveResource(fileName, true);
|
||||
}
|
||||
this.config = YamlConfiguration.loadConfiguration(this.file);
|
||||
this.config = ConfigurationUtil.bang(this.file);
|
||||
}
|
||||
|
||||
public File getFile() {
|
||||
@@ -56,7 +56,7 @@ public class FileConfig {
|
||||
|
||||
public void reload() {
|
||||
if (getFile().exists()) {
|
||||
this.config = YamlConfiguration.loadConfiguration(getFile());
|
||||
this.config = ConfigurationUtil.bang(getFile());
|
||||
} else {
|
||||
initFile();
|
||||
}
|
||||
|
||||
@@ -1,12 +1,17 @@
|
||||
package cc.carm.plugin.userprefix.event;
|
||||
|
||||
import cc.carm.plugin.userprefix.Main;
|
||||
import cc.carm.plugin.userprefix.model.ConfiguredPrefix;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class UserPrefixChangeEvent extends UserPrefixEvent implements Cancellable {
|
||||
|
||||
public static HandlerList handler = new HandlerList();
|
||||
@@ -52,4 +57,19 @@ public class UserPrefixChangeEvent extends UserPrefixEvent implements Cancellabl
|
||||
public HandlerList getHandlers() {
|
||||
return handler;
|
||||
}
|
||||
|
||||
public static void call(@NotNull Player who,
|
||||
@Nullable ConfiguredPrefix before,
|
||||
@NotNull ConfiguredPrefix after,
|
||||
@Nullable Consumer<@Nullable ConfiguredPrefix> finish) {
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
UserPrefixChangeEvent event = new UserPrefixChangeEvent(who, before, after);
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
if (finish != null) finish.accept(event.isCancelled() ? null : event.getAfter());
|
||||
}
|
||||
}.runTask(Main.getInstance());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
package cc.carm.plugin.userprefix.event;
|
||||
|
||||
import cc.carm.plugin.userprefix.Main;
|
||||
import cc.carm.plugin.userprefix.model.ConfiguredPrefix;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class UserPrefixExpireEvent extends UserPrefixEvent {
|
||||
@@ -27,4 +30,14 @@ public class UserPrefixExpireEvent extends UserPrefixEvent {
|
||||
public HandlerList getHandlers() {
|
||||
return handler;
|
||||
}
|
||||
|
||||
public static void call(@NotNull Player player, @NotNull ConfiguredPrefix currentPrefix) {
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Bukkit.getPluginManager().callEvent(new UserPrefixExpireEvent(player, currentPrefix));
|
||||
}
|
||||
}.runTask(Main.getInstance());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
package cc.carm.plugin.userprefix.hooker;
|
||||
|
||||
import cc.carm.lib.githubreleases4j.GithubReleases4J;
|
||||
import cc.carm.plugin.userprefix.Main;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
public class UpdateChecker {
|
||||
|
||||
public static void checkUpdate(String currentVersion) {
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
String downloadURL = GithubReleases4J.getReleasesURL("CarmJos", "UserPrefix");
|
||||
Integer behindVersions = GithubReleases4J.getVersionBehind(
|
||||
"CarmJos", "UserPrefix", currentVersion
|
||||
);
|
||||
|
||||
if (behindVersions == null) {
|
||||
Main.error("检查更新失败,请您定期查看插件是否更新,避免安全问题。");
|
||||
Main.error("下载地址 " + downloadURL);
|
||||
} else if (behindVersions == 0) {
|
||||
Main.log("检查完成,当前已是最新版本。");
|
||||
} else if (behindVersions > 0) {
|
||||
Main.log("发现新版本! 目前已落后 " + behindVersions + " 个版本。");
|
||||
Main.log("最新版下载地址 " + downloadURL);
|
||||
} else {
|
||||
Main.error("检查更新失败! 当前版本未知,请您使用原生版本以避免安全问题。");
|
||||
Main.error("最新版下载地址 " + downloadURL);
|
||||
}
|
||||
}
|
||||
}.runTaskAsynchronously(Main.getInstance());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -121,7 +121,7 @@ public class UserManager {
|
||||
|
||||
if (currentPrefix != null) {
|
||||
//当前前缀不为空,则代表属于前缀过期的情况
|
||||
Bukkit.getPluginManager().callEvent(new UserPrefixExpireEvent(player, currentPrefix));
|
||||
UserPrefixExpireEvent.call(player, currentPrefix);
|
||||
|
||||
// 发送消息
|
||||
PluginConfig.Messages.EXPIRED.sendWithPlaceholders(player,
|
||||
@@ -139,17 +139,16 @@ public class UserManager {
|
||||
);
|
||||
}
|
||||
|
||||
UserPrefixChangeEvent event = new UserPrefixChangeEvent(player, currentPrefix, newPrefix);
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
|
||||
if (!event.isCancelled()) {
|
||||
// 更新前缀
|
||||
UserManager.setPrefix(player, event.getAfter(), updateView);
|
||||
}
|
||||
|
||||
UserPrefixChangeEvent.call(player, currentPrefix, newPrefix, (after) -> {
|
||||
if (after != null) {
|
||||
UserManager.setPrefix(player, after, updateView);
|
||||
}
|
||||
checkingPlayers.remove(player.getUniqueId());
|
||||
});
|
||||
|
||||
} else {
|
||||
checkingPlayers.remove(player.getUniqueId());
|
||||
}
|
||||
|
||||
checkingPlayers.remove(player.getUniqueId());
|
||||
}
|
||||
|
||||
public static void unloadNameTag(UUID uuid) {
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
package cc.carm.plugin.userprefix.model;
|
||||
|
||||
import cc.carm.plugin.userprefix.util.ColorParser;
|
||||
import cc.carm.plugin.userprefix.util.ConfigurationUtil;
|
||||
import cc.carm.plugin.userprefix.util.ItemStackFactory;
|
||||
import cc.carm.plugin.userprefix.util.MessageUtil;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
@@ -38,7 +38,11 @@ public class ConfiguredPrefix {
|
||||
|
||||
public ConfiguredPrefix(@NotNull File dataFile) {
|
||||
this.dataFile = dataFile;
|
||||
this.configuration = YamlConfiguration.loadConfiguration(dataFile);
|
||||
try {
|
||||
this.configuration = ConfigurationUtil.bang(dataFile);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (getConfiguration() != null) {
|
||||
this.identifier = getConfiguration().getString("identifier", "ERROR");
|
||||
this.name = getConfiguration().getString("name", "ERROR");
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
package cc.carm.plugin.userprefix.util;
|
||||
|
||||
import cc.carm.plugin.userprefix.wrapper.ItemStackWrapper;
|
||||
import com.google.common.io.Files;
|
||||
import org.bukkit.configuration.InvalidConfigurationException;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.StringJoiner;
|
||||
|
||||
public class ConfigurationUtil {
|
||||
public static FileConfiguration bang(File file) {
|
||||
YamlConfiguration conf = new YamlConfiguration();
|
||||
StringJoiner builder = new StringJoiner("\n");
|
||||
try {
|
||||
//noinspection UnstableApiUsage
|
||||
Files.readLines(file, StandardCharsets.UTF_8).forEach(builder::add);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return conf;
|
||||
}
|
||||
String tmpConf = builder.toString().replace("==: "+ ItemStack.class.getName(), "==: "+ ItemStackWrapper.class.getName());
|
||||
try {
|
||||
conf.loadFromString(tmpConf);
|
||||
} catch (InvalidConfigurationException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return conf;
|
||||
}
|
||||
|
||||
public static String dong(FileConfiguration conf) {
|
||||
return conf.saveToString().replace("==: "+ ItemStackWrapper.class.getName(),"==: "+ ItemStack.class.getName());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package cc.carm.plugin.userprefix.wrapper;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.configuration.serialization.ConfigurationSerializable;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class ItemStackWrapper implements ConfigurationSerializable {
|
||||
private static boolean unsafeAvailable;
|
||||
|
||||
static {
|
||||
try {
|
||||
Class.forName("org.bukkit.UnsafeValues");
|
||||
unsafeAvailable = true;
|
||||
} catch (ClassNotFoundException e) {
|
||||
unsafeAvailable = false;
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Map<String, Object> serialize() {
|
||||
throw new UnsupportedOperationException("Use ConfigurationUtil#dong to save configuration");
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static ItemStack deserialize(@NotNull Map<String, Object> args) {
|
||||
// static define will cause problem, lazy load it
|
||||
if (unsafeAvailable) {
|
||||
if (!args.containsKey("v")) {
|
||||
Material material = Material.matchMaterial(args.get("type").toString());
|
||||
if (material == null) {
|
||||
throw new IllegalArgumentException("物品 "+args.get("type")+" 不存在");
|
||||
}
|
||||
args.put("v", Bukkit.getServer().getUnsafe().getDataVersion());
|
||||
}
|
||||
}
|
||||
return ItemStack.deserialize(args);
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,11 @@ debug: false
|
||||
# 当然,您也可以选择在这里关闭,或在plugins/bStats下的配置文件中关闭。
|
||||
metrics: true
|
||||
|
||||
# 检查更新设定
|
||||
# 该选项用于插件判断是否要检查更新,若您不希望插件检查更新并提示您,可以选择关闭。
|
||||
# 检查更新为异步操作,绝不会影响性能与使用体验。
|
||||
check-update: true
|
||||
|
||||
custom-storage:
|
||||
# 自定义存储位置
|
||||
# 默认存储位置为 “插件文件夹”/prefixes
|
||||
|
||||
@@ -4,6 +4,9 @@ debug: false #DEBUG OUT PUT
|
||||
|
||||
metrics: true #Metrics stats (to help developer know the stats)
|
||||
|
||||
# Auto check the updates.
|
||||
check-update: true
|
||||
|
||||
custom-storage:
|
||||
# Custom storage location
|
||||
# default location is "./prefixes"
|
||||
|
||||
@@ -7,6 +7,7 @@ authors:
|
||||
- SakuraGame
|
||||
website: ${project.url}
|
||||
description: ${project.description}
|
||||
api-version: 1.13
|
||||
|
||||
depend:
|
||||
- LuckPerms
|
||||
@@ -22,4 +23,4 @@ commands:
|
||||
- upa
|
||||
- prefixAdmin
|
||||
permission: "UserPrefix.admin"
|
||||
description: "用户前缀系统管理指令,可以查看前缀列表与重载配置文件。"
|
||||
description: "用户前缀系统管理指令,可以查看前缀列表与重载配置文件。"
|
||||
|
||||
Reference in New Issue
Block a user