init
This commit is contained in:
commit
49cff4d32d
42
.gitea/workflows/build.yml
Normal file
42
.gitea/workflows/build.yml
Normal file
@ -0,0 +1,42 @@
|
||||
name: Java CI-CD with Maven
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- '*'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: "Pull & Checkout"
|
||||
uses: https://ssl.lunadeer.cn:14446/actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: "Set up Maven"
|
||||
uses: https://ssl.lunadeer.cn:14446/actions/setup-maven@v4
|
||||
- name: "Set up JDK 17"
|
||||
uses: https://ssl.lunadeer.cn:14446/actions/setup-java@v3
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'zulu'
|
||||
cache: maven
|
||||
- name: "Build with Maven"
|
||||
run: mvn -B package --file pom.xml
|
||||
- name: "Copy jar to staging"
|
||||
run: mkdir staging && cp target/*.jar staging
|
||||
- name: "Build & test"
|
||||
run: |
|
||||
echo "done!"
|
||||
- name: "setup go for release script"
|
||||
run: |
|
||||
wget --no-check-certificate https://go.dev/dl/go1.21.6.linux-amd64.tar.gz
|
||||
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.21.6.linux-amd64.tar.gz
|
||||
ln -s /usr/local/go/bin/go /usr/bin/go
|
||||
go version
|
||||
- name: "Release"
|
||||
uses: https://ssl.lunadeer.cn:14446/actions/release-action@main
|
||||
with:
|
||||
files: |-
|
||||
staging/*.jar
|
||||
api_key: '${{secrets.RELEASE_TOKEN}}'
|
43
.github/workflows/main.yml
vendored
Normal file
43
.github/workflows/main.yml
vendored
Normal file
@ -0,0 +1,43 @@
|
||||
name: Java CI-CD with Maven
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- '*'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
# 配置权限
|
||||
permissions: write-all
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
# 下载代码
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up JDK 17
|
||||
# 安装 JDK
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'temurin'
|
||||
cache: maven
|
||||
# Maven 打包
|
||||
- name: Build with Maven
|
||||
run: mvn -B package --file pom.xml
|
||||
# 将打包好的 Jar 包 放到 staging 文件夹
|
||||
- run: mkdir staging && cp target/*.jar staging
|
||||
# 设置 jobs Maven pom 版本环境变量
|
||||
- name: Set Release version env variable
|
||||
run: |
|
||||
echo "RELEASE_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV
|
||||
- name: "Build & test"
|
||||
run: |
|
||||
echo "done!"
|
||||
# 上传文件并发布 Release
|
||||
- uses: "marvinpinto/action-automatic-releases@latest"
|
||||
with:
|
||||
repo_token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
automatic_release_tag: "${{ env.RELEASE_VERSION }}"
|
||||
prerelease: false
|
||||
title: "Release ${{ env.RELEASE_VERSION }}"
|
||||
files: |
|
||||
staging/*.jar
|
113
.gitignore
vendored
Normal file
113
.gitignore
vendored
Normal file
@ -0,0 +1,113 @@
|
||||
# User-specific stuff
|
||||
.idea/
|
||||
|
||||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
|
||||
# IntelliJ
|
||||
out/
|
||||
|
||||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
|
||||
*~
|
||||
|
||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||
.fuse_hidden*
|
||||
|
||||
# KDE directory preferences
|
||||
.directory
|
||||
|
||||
# Linux trash folder which might appear on any partition or disk
|
||||
.Trash-*
|
||||
|
||||
# .nfs files are created when an open file is removed but is still being accessed
|
||||
.nfs*
|
||||
|
||||
# General
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
# Windows thumbnail cache files
|
||||
Thumbs.db
|
||||
Thumbs.db:encryptable
|
||||
ehthumbs.db
|
||||
ehthumbs_vista.db
|
||||
|
||||
# Dump file
|
||||
*.stackdump
|
||||
|
||||
# Folder config file
|
||||
[Dd]esktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Windows Installer files
|
||||
*.cab
|
||||
*.msi
|
||||
*.msix
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
# Windows shortcuts
|
||||
*.lnk
|
||||
|
||||
target/
|
||||
|
||||
pom.xml.tag
|
||||
pom.xml.releaseBackup
|
||||
pom.xml.versionsBackup
|
||||
pom.xml.next
|
||||
|
||||
release.properties
|
||||
dependency-reduced-pom.xml
|
||||
buildNumber.properties
|
||||
.mvn/timing.properties
|
||||
.mvn/wrapper/maven-wrapper.jar
|
||||
.flattened-pom.xml
|
||||
|
||||
# Common working directory
|
||||
run/
|
80
pom.xml
Normal file
80
pom.xml
Normal file
@ -0,0 +1,80 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<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>cn.lunadeer</groupId>
|
||||
<artifactId>Dominion</artifactId>
|
||||
<version>1.0</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>Dominion</name>
|
||||
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.8.1</version>
|
||||
<configuration>
|
||||
<source>${java.version}</source>
|
||||
<target>${java.version}</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.2.4</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<filtering>true</filtering>
|
||||
</resource>
|
||||
</resources>
|
||||
</build>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>spigotmc-repo</id>
|
||||
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>sonatype</id>
|
||||
<url>https://oss.sonatype.org/content/groups/public/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>papermc</id>
|
||||
<url>https://repo.papermc.io/repository/maven-public/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>dev.folia</groupId>
|
||||
<artifactId>folia-api</artifactId>
|
||||
<version>1.20.1-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
<version>42.6.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
40
src/main/java/cn/lunadeer/dominion/Dominion.java
Normal file
40
src/main/java/cn/lunadeer/dominion/Dominion.java
Normal file
@ -0,0 +1,40 @@
|
||||
package cn.lunadeer.dominion;
|
||||
|
||||
import cn.lunadeer.dominion.utils.ConfigManager;
|
||||
import cn.lunadeer.dominion.utils.Database;
|
||||
import cn.lunadeer.dominion.utils.XLogger;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.sql.Connection;
|
||||
|
||||
public final class Dominion extends JavaPlugin {
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
// Plugin startup logic
|
||||
instance = this;
|
||||
config = new ConfigManager(this);
|
||||
dbConnection = Database.createConnection();
|
||||
|
||||
|
||||
XLogger.info("领地插件已启动");
|
||||
XLogger.info("版本:" + this.getPluginMeta().getVersion());
|
||||
// http://patorjk.com/software/taag/#p=display&f=Big&t=Dominion
|
||||
XLogger.info(" _____ _ _");
|
||||
XLogger.info(" | __ \\ (_) (_)");
|
||||
XLogger.info(" | | | | ___ _ __ ___ _ _ __ _ ___ _ __");
|
||||
XLogger.info(" | | | |/ _ \\| '_ ` _ \\| | '_ \\| |/ _ \\| '_ \\");
|
||||
XLogger.info(" | |__| | (_) | | | | | | | | | | | (_) | | | |");
|
||||
XLogger.info(" |_____/ \\___/|_| |_| |_|_|_| |_|_|\\___/|_| |_|");
|
||||
XLogger.info(" ");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
// Plugin shutdown logic
|
||||
}
|
||||
|
||||
public static Dominion instance;
|
||||
public static ConfigManager config;
|
||||
public static Connection dbConnection;
|
||||
}
|
132
src/main/java/cn/lunadeer/dominion/dtos/DPlayer.java
Normal file
132
src/main/java/cn/lunadeer/dominion/dtos/DPlayer.java
Normal file
@ -0,0 +1,132 @@
|
||||
package cn.lunadeer.dominion.dtos;
|
||||
|
||||
import cn.lunadeer.dominion.utils.Database;
|
||||
import cn.lunadeer.dominion.utils.Notification;
|
||||
import cn.lunadeer.dominion.utils.XLogger;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
public class DPlayer {
|
||||
|
||||
public static DPlayer get(Player player) {
|
||||
DPlayer re = select(player.getUniqueId());
|
||||
if (re == null) {
|
||||
re = insert(new DPlayer(player.getUniqueId(), player.getName(), System.currentTimeMillis()));
|
||||
}
|
||||
return re;
|
||||
}
|
||||
|
||||
public DPlayer join() {
|
||||
return update(this);
|
||||
}
|
||||
|
||||
public static List<DPlayer> search(String name) {
|
||||
return select(name);
|
||||
}
|
||||
|
||||
private static List<DPlayer> query(String sql) {
|
||||
List<DPlayer> players = new ArrayList<>();
|
||||
try (ResultSet rs = Database.query(sql)) {
|
||||
if (rs == null) return players;
|
||||
while (rs.next()) {
|
||||
Integer id = rs.getInt("id");
|
||||
UUID uuid = UUID.fromString(rs.getString("uuid"));
|
||||
String lastKnownName = rs.getString("last_known_name");
|
||||
Long lastJoinAt = rs.getTimestamp("last_join_at").getTime();
|
||||
DPlayer player = new DPlayer(id, uuid, lastKnownName, lastJoinAt);
|
||||
players.add(player);
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
XLogger.err("Database query failed: " + e.getMessage());
|
||||
XLogger.err("SQL: " + sql);
|
||||
}
|
||||
return players;
|
||||
}
|
||||
|
||||
private static DPlayer select(UUID uuid) {
|
||||
String sql = "SELECT * FROM player_name WHERE uuid = '" + uuid.toString() + "'";
|
||||
List<DPlayer> players = query(sql);
|
||||
if (players.size() == 0) return null;
|
||||
return players.get(0);
|
||||
}
|
||||
|
||||
private static List<DPlayer> select(String name) {
|
||||
// 模糊搜索
|
||||
String sql = "SELECT * FROM player_name WHERE last_known_name LIKE '%" + name + "%'";
|
||||
return query(sql);
|
||||
}
|
||||
|
||||
private static DPlayer insert(DPlayer player) {
|
||||
String sql = "INSERT INTO player_name (uuid, last_known_name, last_join_at) " +
|
||||
"VALUES" +
|
||||
" ('" + player.getUuid().toString() + "', '" + player.getLastKnownName() + "', CURRENT_TIMESTAMP) " +
|
||||
"RETURNING *";
|
||||
List<DPlayer> players = query(sql);
|
||||
if (players.size() == 0) return null;
|
||||
return players.get(0);
|
||||
}
|
||||
|
||||
private static DPlayer update(DPlayer player) {
|
||||
String sql = "UPDATE player_name SET " +
|
||||
"last_known_name = '" + player.getLastKnownName() + "', " +
|
||||
"last_join_at = CURRENT_TIMESTAMP " +
|
||||
"WHERE uuid = '" + player.getUuid().toString() + "' " +
|
||||
"RETURNING *";
|
||||
List<DPlayer> players = query(sql);
|
||||
if (players.size() == 0) return null;
|
||||
return players.get(0);
|
||||
}
|
||||
|
||||
private DPlayer(Integer id, UUID uuid, String lastKnownName, Long lastJoinAt) {
|
||||
this.id = id;
|
||||
this.uuid = uuid;
|
||||
this.lastKnownName = lastKnownName;
|
||||
this.lastJoinAt = lastJoinAt;
|
||||
}
|
||||
|
||||
private DPlayer(UUID uuid, String lastKnownName, Long lastJoinAt) {
|
||||
this(null, uuid, lastKnownName, lastJoinAt);
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public UUID getUuid() {
|
||||
return uuid;
|
||||
}
|
||||
|
||||
public String getLastKnownName() {
|
||||
return lastKnownName;
|
||||
}
|
||||
|
||||
public Long getLastJoinAt() {
|
||||
return lastJoinAt;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setUuid(UUID uuid) {
|
||||
this.uuid = uuid;
|
||||
}
|
||||
|
||||
public void setLastKnownName(String lastKnownName) {
|
||||
this.lastKnownName = lastKnownName;
|
||||
}
|
||||
|
||||
public void setLastJoinAt(Long lastJoinAt) {
|
||||
this.lastJoinAt = lastJoinAt;
|
||||
}
|
||||
|
||||
private Integer id;
|
||||
private UUID uuid;
|
||||
private String lastKnownName;
|
||||
private Long lastJoinAt;
|
||||
}
|
77
src/main/java/cn/lunadeer/dominion/utils/ConfigManager.java
Normal file
77
src/main/java/cn/lunadeer/dominion/utils/ConfigManager.java
Normal file
@ -0,0 +1,77 @@
|
||||
package cn.lunadeer.dominion.utils;
|
||||
|
||||
import cn.lunadeer.dominion.Dominion;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
|
||||
public class ConfigManager {
|
||||
public ConfigManager(Dominion plugin) {
|
||||
_plugin = plugin;
|
||||
_plugin.saveDefaultConfig();
|
||||
reload();
|
||||
_plugin.saveConfig();
|
||||
}
|
||||
|
||||
public void reload() {
|
||||
_plugin.reloadConfig();
|
||||
_file = _plugin.getConfig();
|
||||
_debug = _file.getBoolean("Debug", false);
|
||||
_db_host = _file.getString("Database.Host", "localhost");
|
||||
_db_port = _file.getString("Database.Port", "5432");
|
||||
_db_name = _file.getString("Database.Name", "miniplayertitle");
|
||||
_db_user = _file.getString("Database.User", "postgres");
|
||||
_db_pass = _file.getString("Database.Pass", "postgres");
|
||||
}
|
||||
|
||||
public Boolean isDebug() {
|
||||
return _debug;
|
||||
}
|
||||
|
||||
public void setDebug(Boolean debug) {
|
||||
_debug = debug;
|
||||
_file.set("Debug", debug);
|
||||
_plugin.saveConfig();
|
||||
}
|
||||
|
||||
public String getDBConnectionUrl() {
|
||||
return "jdbc:postgresql://" + _db_host + ":" + _db_port + "/" + _db_name;
|
||||
}
|
||||
|
||||
|
||||
public void setDbUser(String db_user) {
|
||||
_db_user = db_user;
|
||||
_file.set("Database.User", db_user);
|
||||
_plugin.saveConfig();
|
||||
}
|
||||
|
||||
public String getDbUser() {
|
||||
if (_db_user.contains("@")) {
|
||||
setDbUser("'" + _db_user + "'");
|
||||
}
|
||||
return _db_user;
|
||||
}
|
||||
|
||||
|
||||
public void setDbPass(String db_pass) {
|
||||
_db_pass = db_pass;
|
||||
_file.set("Database.Pass", db_pass);
|
||||
_plugin.saveConfig();
|
||||
}
|
||||
|
||||
public String getDbPass() {
|
||||
if (_db_pass.contains("@")) {
|
||||
setDbPass("'" + _db_pass + "'");
|
||||
}
|
||||
return _db_pass;
|
||||
}
|
||||
|
||||
|
||||
private final Dominion _plugin;
|
||||
private FileConfiguration _file;
|
||||
private Boolean _debug;
|
||||
|
||||
private String _db_host;
|
||||
private String _db_port;
|
||||
private String _db_user;
|
||||
private String _db_pass;
|
||||
private String _db_name;
|
||||
}
|
164
src/main/java/cn/lunadeer/dominion/utils/Database.java
Normal file
164
src/main/java/cn/lunadeer/dominion/utils/Database.java
Normal file
@ -0,0 +1,164 @@
|
||||
package cn.lunadeer.dominion.utils;
|
||||
|
||||
import cn.lunadeer.dominion.Dominion;
|
||||
|
||||
import java.sql.*;
|
||||
|
||||
public class Database {
|
||||
|
||||
public static Connection createConnection() {
|
||||
try {
|
||||
Class.forName("org.postgresql.Driver");
|
||||
return DriverManager.getConnection(Dominion.config.getDBConnectionUrl(), Dominion.config.getDbUser(), Dominion.config.getDbPass());
|
||||
} catch (ClassNotFoundException | SQLException e) {
|
||||
XLogger.err("Database connection failed: " + e.getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static ResultSet query(String sql) {
|
||||
Connection conn = Dominion.dbConnection;
|
||||
if (conn == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
Statement stmt = conn.createStatement();
|
||||
// if query with no result return null
|
||||
if (stmt.execute(sql)) {
|
||||
return stmt.getResultSet();
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
XLogger.err("Database query failed: " + e.getMessage());
|
||||
XLogger.err("SQL: " + sql);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static void migrate() {
|
||||
String sql = "";
|
||||
|
||||
// player name
|
||||
sql += "CREATE TABLE IF NOT EXISTS player_name (" +
|
||||
" id SERIAL PRIMARY KEY," +
|
||||
" uuid VARCHAR(36) NOT NULL," +
|
||||
" last_known_name TEXT NOT NULL," +
|
||||
" last_join_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP" +
|
||||
")";
|
||||
|
||||
// dominion table
|
||||
sql += "CREATE TABLE IF NOT EXISTS dominion (" +
|
||||
" id SERIAL PRIMARY KEY," +
|
||||
" owner VARCHAR(36) NOT NULL," +
|
||||
" name TEXT NOT NULL UNIQUE," +
|
||||
" world TEXT NOT NULL," +
|
||||
" x1 INT NOT NULL," +
|
||||
" y1 INT NOT NULL," +
|
||||
" z1 INT NOT NULL," +
|
||||
" x2 INT NOT NULL," +
|
||||
" y2 INT NOT NULL," +
|
||||
" z2 INT NOT NULL," +
|
||||
" parent_dom_id INT NOT NULL DEFAULT -1," +
|
||||
" join_message TEXT NOT NULL DEFAULT '欢迎', " +
|
||||
" leave_message TEXT NOT NULL DEFAULT '再见', " +
|
||||
|
||||
" anchor BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" animal_killing BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" anvil BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" anvil_break BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" beacon BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" bed BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" brew BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" button BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" cake BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" container BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" craft BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" creeper_explode BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" diode BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" door BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" dye BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" egg BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" enchant BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" ender_pearl BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" feed BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" fire_spread BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" flow_in_protection BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" glow BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" grow BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" honey BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" hook BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" ignite BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" mob_killing BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" move BOOLEAN NOT NULL DEFAULT TRUE," +
|
||||
" place BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" pressure BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" riding BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" shear BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" shoot BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" tnt_explode BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" trade BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" vehicle_destroy BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" wither_spawn BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" harvest BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
|
||||
" FOREIGN KEY (owner) REFERENCES player_name(uuid)," +
|
||||
" FOREIGN KEY (parent_dom_id) REFERENCES dominion(id)" +
|
||||
")";
|
||||
|
||||
// privilege template
|
||||
sql += "CREATE TABLE IF NOT EXISTS privilege_template (" +
|
||||
" id SERIAL PRIMARY KEY," +
|
||||
" name TEXT NOT NULL," +
|
||||
" creator VARCHAR(36) NOT NULL," +
|
||||
" is_group BOOLEAN NOT NULL DEFAULT TRUE," +
|
||||
|
||||
" anchor BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" animal_killing BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" anvil BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" anvil_break BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" beacon BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" bed BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" brew BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" button BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" cake BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" container BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" craft BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" diode BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" door BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" dye BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" egg BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" enchant BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" ender_pearl BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" feed BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" glow BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" honey BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" hook BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" ignite BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" mob_killing BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" move BOOLEAN NOT NULL DEFAULT TRUE," +
|
||||
" place BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" pressure BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" riding BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" shear BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" shoot BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" trade BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" vehicle_destroy BOOLEAN NOT NULL DEFAULT FALSE," +
|
||||
" harvest BOOLEAN NOT NULL DEFAULT FALSE" +
|
||||
")";
|
||||
|
||||
// player dominion privilege
|
||||
sql += "CREATE TABLE IF NOT EXISTS player_dom_privilege (" +
|
||||
" id SERIAL PRIMARY KEY," +
|
||||
" player_uuid VARCHAR(36) NOT NULL," +
|
||||
" dom_id INT NOT NULL," +
|
||||
" privilege_template_id INT NOT NULL," +
|
||||
" FOREIGN KEY (player_uuid) REFERENCES player_name(uuid)," +
|
||||
" FOREIGN KEY (dom_id) REFERENCES dominion(id)" +
|
||||
")";
|
||||
|
||||
|
||||
|
||||
query(sql);
|
||||
}
|
||||
}
|
63
src/main/java/cn/lunadeer/dominion/utils/Notification.java
Normal file
63
src/main/java/cn/lunadeer/dominion/utils/Notification.java
Normal file
@ -0,0 +1,63 @@
|
||||
package cn.lunadeer.dominion.utils;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.Style;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class Notification {
|
||||
private static final Style i_style = Style.style(TextColor.color(139, 255, 123));
|
||||
private static final Style w_style = Style.style(TextColor.color(255, 185, 69));
|
||||
private static final Style e_style = Style.style(TextColor.color(255, 96, 72));
|
||||
|
||||
private static final String prefix = "[MiniPlayerTitle] ";
|
||||
|
||||
public static void info(Player player, String msg) {
|
||||
player.sendMessage(Component.text(prefix + msg, i_style));
|
||||
}
|
||||
|
||||
public static void warn(Player player, String msg) {
|
||||
player.sendMessage(Component.text(prefix + msg, w_style));
|
||||
}
|
||||
|
||||
public static void error(Player player, String msg) {
|
||||
player.sendMessage(Component.text(prefix + msg, e_style));
|
||||
}
|
||||
|
||||
public static void info(CommandSender sender, String msg) {
|
||||
sender.sendMessage(Component.text(prefix + msg, i_style));
|
||||
}
|
||||
|
||||
public static void warn(CommandSender sender, String msg) {
|
||||
sender.sendMessage(Component.text(prefix + msg, w_style));
|
||||
}
|
||||
|
||||
public static void error(CommandSender sender, String msg) {
|
||||
sender.sendMessage(Component.text(prefix + msg, e_style));
|
||||
}
|
||||
|
||||
public static void info(Player player, Component msg) {
|
||||
player.sendMessage(Component.text(prefix, i_style).append(msg));
|
||||
}
|
||||
|
||||
public static void warn(Player player, Component msg) {
|
||||
player.sendMessage(Component.text(prefix, w_style).append(msg));
|
||||
}
|
||||
|
||||
public static void error(Player player, Component msg) {
|
||||
player.sendMessage(Component.text(prefix, e_style).append(msg));
|
||||
}
|
||||
|
||||
public static void info(CommandSender player, Component msg) {
|
||||
player.sendMessage(Component.text(prefix, i_style).append(msg));
|
||||
}
|
||||
|
||||
public static void warn(CommandSender player, Component msg) {
|
||||
player.sendMessage(Component.text(prefix, w_style).append(msg));
|
||||
}
|
||||
|
||||
public static void error(CommandSender player, Component msg) {
|
||||
player.sendMessage(Component.text(prefix, e_style).append(msg));
|
||||
}
|
||||
}
|
12
src/main/java/cn/lunadeer/dominion/utils/STUI/Button.java
Normal file
12
src/main/java/cn/lunadeer/dominion/utils/STUI/Button.java
Normal file
@ -0,0 +1,12 @@
|
||||
package cn.lunadeer.dominion.utils.STUI;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
|
||||
public class Button {
|
||||
|
||||
public static TextComponent create(String text, String command) {
|
||||
return Component.text("[" + text + "]", ViewStyles.action_color)
|
||||
.clickEvent(net.kyori.adventure.text.event.ClickEvent.clickEvent(net.kyori.adventure.text.event.ClickEvent.Action.RUN_COMMAND, command));
|
||||
}
|
||||
}
|
48
src/main/java/cn/lunadeer/dominion/utils/STUI/Line.java
Normal file
48
src/main/java/cn/lunadeer/dominion/utils/STUI/Line.java
Normal file
@ -0,0 +1,48 @@
|
||||
package cn.lunadeer.dominion.utils.STUI;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public class Line {
|
||||
private final List<Component> elements = new ArrayList<>();
|
||||
|
||||
private final TextComponent divider = Component.text(" - ", ViewStyles.sub_color);
|
||||
|
||||
public Line() {
|
||||
}
|
||||
|
||||
public TextComponent build() {
|
||||
TextComponent.Builder builder = Component.text();
|
||||
for (int i = 0; i < elements.size(); i++) {
|
||||
builder.append(elements.get(i));
|
||||
if (i != elements.size() - 1) {
|
||||
builder.append(divider);
|
||||
}
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
public static Line create() {
|
||||
return new Line();
|
||||
}
|
||||
|
||||
public Line append(TextComponent component) {
|
||||
elements.add(component);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Line append(Component component) {
|
||||
elements.add(component);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Line append(String component) {
|
||||
elements.add(Component.text(component));
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
71
src/main/java/cn/lunadeer/dominion/utils/STUI/ListView.java
Normal file
71
src/main/java/cn/lunadeer/dominion/utils/STUI/ListView.java
Normal file
@ -0,0 +1,71 @@
|
||||
package cn.lunadeer.dominion.utils.STUI;
|
||||
|
||||
import cn.lunadeer.dominion.utils.Notification;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ListView {
|
||||
|
||||
private final Integer page_size;
|
||||
private final List<Line> lines = new ArrayList<>();
|
||||
private String command = "";
|
||||
private final View view = View.create();
|
||||
|
||||
public ListView(int page_size, String command) {
|
||||
super();
|
||||
this.page_size = page_size;
|
||||
this.command = command;
|
||||
}
|
||||
|
||||
public static ListView create(int page_size, String command) {
|
||||
return new ListView(page_size, command);
|
||||
}
|
||||
|
||||
public ListView title(String title) {
|
||||
view.title(title);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ListView title(String title, String subtitle) {
|
||||
view.title(title);
|
||||
view.subtitle(subtitle);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ListView subtitle(String subtitle) {
|
||||
view.subtitle(subtitle);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ListView add(Line line) {
|
||||
lines.add(line);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ListView addLines(List<Line> lines) {
|
||||
this.lines.addAll(lines);
|
||||
return this;
|
||||
}
|
||||
|
||||
public void showOn(Player player, Integer page) {
|
||||
int offset = (page - 1) * page_size;
|
||||
if (lines.isEmpty()) {
|
||||
Notification.warn(player, "没有数据");
|
||||
return;
|
||||
}
|
||||
if (offset >= lines.size() || offset < 0) {
|
||||
Notification.error(player, "页数超出范围");
|
||||
return;
|
||||
}
|
||||
for (int i = offset; i < offset + page_size; i++) {
|
||||
if (i >= lines.size()) {
|
||||
break;
|
||||
}
|
||||
view.addLine(lines.get(i));
|
||||
}
|
||||
view.actionBar(Pagination.create(page, lines.size(), this.command));
|
||||
view.showOn(player);
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package cn.lunadeer.dominion.utils.STUI;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.lunadeer.dominion.utils.STUI.ViewStyles.*;
|
||||
|
||||
|
||||
public class Pagination {
|
||||
public static TextComponent create(int page, int item_size, String command) {
|
||||
// 第 x/y 页 [上一页] [下一页]
|
||||
int page_size = 4;
|
||||
int page_count = (int) Math.ceil((double) item_size / page_size);
|
||||
if (page_count == 0) {
|
||||
page_count = 1;
|
||||
}
|
||||
List<Component> componentList = new ArrayList<>();
|
||||
componentList.add(Component.text("第 ", main_color));
|
||||
componentList.add(Component.text(page, sub_color));
|
||||
componentList.add(Component.text("/", main_color));
|
||||
componentList.add(Component.text(page_count, sub_color));
|
||||
componentList.add(Component.text(" 页 ", main_color));
|
||||
if (page > 1) {
|
||||
componentList.add(Button.create("上一页", command + " " + (page - 1)));
|
||||
}
|
||||
if (page < page_count) {
|
||||
componentList.add(Button.create("下一页", command + " " + (page + 1)));
|
||||
}
|
||||
TextComponent.Builder builder = Component.text();
|
||||
for (Component component : componentList) {
|
||||
builder.append(component);
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
}
|
106
src/main/java/cn/lunadeer/dominion/utils/STUI/View.java
Normal file
106
src/main/java/cn/lunadeer/dominion/utils/STUI/View.java
Normal file
@ -0,0 +1,106 @@
|
||||
package cn.lunadeer.dominion.utils.STUI;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.lunadeer.dominion.utils.STUI.ViewStyles.*;
|
||||
|
||||
public class View {
|
||||
protected TextComponent title_decorate = Component.text("━", main_color);
|
||||
protected TextComponent space = Component.text(" ");
|
||||
protected TextComponent sub_title_decorate = Component.text("- ", main_color);
|
||||
protected TextComponent line_decorate = Component.text("⌗ ", main_color);
|
||||
protected TextComponent action_decorate = Component.text("▸ ", main_color);
|
||||
protected TextComponent title = Component.text(" ");
|
||||
protected TextComponent subtitle = Component.text("");
|
||||
protected List<TextComponent> content_lines = new ArrayList<>();
|
||||
protected TextComponent actionbar = Component.text(" ");
|
||||
protected TextComponent edge = Component.text("━━━━━━━━━━━━━━━━━━━━━━━━━━━━", main_color);
|
||||
protected TextComponent divide_line = Component.text("━━━━━━━━━━━━━━━━━━━━━━━━━━━━", main_color);
|
||||
|
||||
public void showOn(Player player) {
|
||||
player.sendMessage(edge);
|
||||
TextComponent.Builder builder = Component.text();
|
||||
int title_length = title.content().length();
|
||||
int title_width = title_length * 2 + 2;
|
||||
int decorate_count = divide_line.content().length() - title_width;
|
||||
for (int i = 0; i < decorate_count / 2; i++) {
|
||||
builder.append(title_decorate);
|
||||
}
|
||||
builder.append(space).append(title).append(space);
|
||||
for (int i = 0; i < decorate_count / 2; i++) {
|
||||
builder.append(title_decorate);
|
||||
}
|
||||
player.sendMessage(builder.build());
|
||||
if (subtitle.content().length() > 0) {
|
||||
player.sendMessage(divide_line);
|
||||
player.sendMessage(Component.text().append(sub_title_decorate).append(subtitle).build());
|
||||
}
|
||||
player.sendMessage(divide_line);
|
||||
for (TextComponent content_line : content_lines) {
|
||||
player.sendMessage(Component.text().append(line_decorate).append(content_line).build());
|
||||
}
|
||||
player.sendMessage(divide_line);
|
||||
player.sendMessage(Component.text().append(action_decorate).append(actionbar).build());
|
||||
player.sendMessage(edge);
|
||||
player.sendMessage(Component.text(" "));
|
||||
}
|
||||
|
||||
public static View create() {
|
||||
return new View();
|
||||
}
|
||||
|
||||
public View title(String title) {
|
||||
this.title = Component.text(title);
|
||||
return this;
|
||||
}
|
||||
|
||||
public View title(TextComponent title) {
|
||||
this.title = title;
|
||||
return this;
|
||||
}
|
||||
|
||||
public View subtitle(String subtitle) {
|
||||
this.subtitle = Component.text(subtitle);
|
||||
return this;
|
||||
}
|
||||
|
||||
public View subtitle(TextComponent subtitle) {
|
||||
this.subtitle = subtitle;
|
||||
return this;
|
||||
}
|
||||
|
||||
public View actionBar(TextComponent actionbar) {
|
||||
this.actionbar = actionbar;
|
||||
return this;
|
||||
}
|
||||
|
||||
public View actionBar(String actionbar) {
|
||||
this.actionbar = Component.text(actionbar);
|
||||
return this;
|
||||
}
|
||||
|
||||
public View actionBar(Line actionbar) {
|
||||
this.actionbar = actionbar.build();
|
||||
return this;
|
||||
}
|
||||
|
||||
public View addLine(TextComponent component) {
|
||||
this.content_lines.add(component);
|
||||
return this;
|
||||
}
|
||||
|
||||
public View addLine(String component) {
|
||||
this.content_lines.add(Component.text(component));
|
||||
return this;
|
||||
}
|
||||
|
||||
public View addLine(Line component) {
|
||||
this.content_lines.add(component.build());
|
||||
return this;
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package cn.lunadeer.dominion.utils.STUI;
|
||||
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
|
||||
public class ViewStyles {
|
||||
public static TextColor main_color = TextColor.color(0, 148, 213);
|
||||
public static TextColor sub_color = TextColor.color(122, 122, 122);
|
||||
public static TextColor action_color = TextColor.color(251, 255, 139);
|
||||
public static TextColor error_color = TextColor.color(255, 96, 72);
|
||||
public static TextColor success_color = TextColor.color(139, 255, 123);
|
||||
}
|
56
src/main/java/cn/lunadeer/dominion/utils/XLogger.java
Normal file
56
src/main/java/cn/lunadeer/dominion/utils/XLogger.java
Normal file
@ -0,0 +1,56 @@
|
||||
package cn.lunadeer.dominion.utils;
|
||||
|
||||
import cn.lunadeer.dominion.Dominion;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class XLogger {
|
||||
private static final Dominion _plugin = Dominion.instance;
|
||||
private static final Logger _logger = _plugin.getLogger();
|
||||
|
||||
private static final String prefix = "[MiniPlayerTitle] ";
|
||||
|
||||
public static void info(Player player, String message) {
|
||||
Notification.info(player, prefix + "I | " + message);
|
||||
if (Dominion.config.isDebug())
|
||||
debug("来自玩家[ " + player.getName() + " ] 的信息 | " + message);
|
||||
}
|
||||
|
||||
public static void info(String message) {
|
||||
_logger.info(" I | " + message);
|
||||
}
|
||||
|
||||
public static void warn(Player player, String message) {
|
||||
Notification.warn(player, prefix + "W | " + message);
|
||||
if (Dominion.config.isDebug())
|
||||
debug("来自玩家[ " + player.getName() + " ] 的警告 | " + message);
|
||||
}
|
||||
|
||||
public static void warn(String message) {
|
||||
_logger.info(" W | " + message);
|
||||
}
|
||||
|
||||
public static void err(Player player, String message) {
|
||||
Notification.error(player, prefix + "E | " + message);
|
||||
if (Dominion.config.isDebug())
|
||||
debug("来自玩家[ " + player.getName() + " ] 的报错 | " + message);
|
||||
}
|
||||
|
||||
public static void err(String message) {
|
||||
_logger.info(" E | " + message);
|
||||
}
|
||||
|
||||
public static void debug(Player player, String message) {
|
||||
if (!Dominion.config.isDebug()) return;
|
||||
if (player.isOp())
|
||||
Notification.info(player, prefix + "D | " + message);
|
||||
else
|
||||
debug("来自玩家[ " + player.getName() + " ] 的调试 | " + message);
|
||||
}
|
||||
|
||||
public static void debug(String message) {
|
||||
if (!Dominion.config.isDebug()) return;
|
||||
_logger.info(" D | " + message);
|
||||
}
|
||||
}
|
6
src/main/resources/plugin.yml
Normal file
6
src/main/resources/plugin.yml
Normal file
@ -0,0 +1,6 @@
|
||||
name: Dominion
|
||||
version: '${project.version}'
|
||||
main: cn.lunadeer.dominion.Dominion
|
||||
api-version: '1.20'
|
||||
load: STARTUP
|
||||
folia-supported: true
|
Reference in New Issue
Block a user