finish some basic function
This commit is contained in:
parent
b8f6e8af41
commit
d608243025
5
pom.xml
5
pom.xml
@ -71,5 +71,10 @@
|
|||||||
<version>1.20.1-R0.1-SNAPSHOT</version>
|
<version>1.20.1-R0.1-SNAPSHOT</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.postgresql</groupId>
|
||||||
|
<artifactId>postgresql</artifactId>
|
||||||
|
<version>42.6.0</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
53
src/main/java/cn/lunadeer/newbtitle/Color.java
Normal file
53
src/main/java/cn/lunadeer/newbtitle/Color.java
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package cn.lunadeer.newbtitle;
|
||||||
|
|
||||||
|
import cn.lunadeer.newbtitle.utils.XLogger;
|
||||||
|
import net.kyori.adventure.text.format.Style;
|
||||||
|
import net.kyori.adventure.text.format.TextColor;
|
||||||
|
|
||||||
|
public class Color {
|
||||||
|
public Integer r;
|
||||||
|
public Integer g;
|
||||||
|
public Integer b;
|
||||||
|
public String hex;
|
||||||
|
|
||||||
|
public Color(Integer r, Integer g, Integer b) {
|
||||||
|
this.r = r;
|
||||||
|
this.g = g;
|
||||||
|
this.b = b;
|
||||||
|
this.hex = String.format("#%02x%02x%02x", r, g, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color(String r, String g, String b) {
|
||||||
|
try {
|
||||||
|
this.r = Integer.valueOf(r);
|
||||||
|
this.g = Integer.valueOf(g);
|
||||||
|
this.b = Integer.valueOf(b);
|
||||||
|
this.hex = String.format("#%02x%02x%02x", this.r, this.g, this.b);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
this.r = 0;
|
||||||
|
this.g = 0;
|
||||||
|
this.b = 0;
|
||||||
|
this.hex = "#000000";
|
||||||
|
XLogger.err("Invalid color: " + r + ", " + g + ", " + b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color(String hex) {
|
||||||
|
try {
|
||||||
|
this.hex = hex;
|
||||||
|
this.r = Integer.valueOf(hex.substring(1, 3), 16);
|
||||||
|
this.g = Integer.valueOf(hex.substring(3, 5), 16);
|
||||||
|
this.b = Integer.valueOf(hex.substring(5, 7), 16);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
this.r = 0;
|
||||||
|
this.g = 0;
|
||||||
|
this.b = 0;
|
||||||
|
this.hex = "#000000";
|
||||||
|
XLogger.err("Invalid color: " + hex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Style getStyle() {
|
||||||
|
return Style.style(TextColor.color(r, g, b));
|
||||||
|
}
|
||||||
|
}
|
46
src/main/java/cn/lunadeer/newbtitle/Commands.java
Normal file
46
src/main/java/cn/lunadeer/newbtitle/Commands.java
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
package cn.lunadeer.newbtitle;
|
||||||
|
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.command.TabExecutor;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Commands implements TabExecutor {
|
||||||
|
/**
|
||||||
|
* Executes the given command, returning its success.
|
||||||
|
* <br>
|
||||||
|
* If false is returned, then the "usage" plugin.yml entry for this command
|
||||||
|
* (if defined) will be sent to the player.
|
||||||
|
*
|
||||||
|
* @param sender Source of the command
|
||||||
|
* @param command Command which was executed
|
||||||
|
* @param label Alias of the command which was used
|
||||||
|
* @param args Passed command arguments
|
||||||
|
* @return true if a valid command, otherwise false
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Requests a list of possible completions for a command argument.
|
||||||
|
*
|
||||||
|
* @param sender Source of the command. For players tab-completing a
|
||||||
|
* command inside a command block, this will be the player, not
|
||||||
|
* the command block.
|
||||||
|
* @param command Command which was executed
|
||||||
|
* @param label Alias of the command which was used
|
||||||
|
* @param args The arguments passed to the command, including final
|
||||||
|
* partial argument to be completed
|
||||||
|
* @return A List of possible completions for the final argument, or null
|
||||||
|
* to default to the command executor
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
4
src/main/java/cn/lunadeer/newbtitle/Events.java
Normal file
4
src/main/java/cn/lunadeer/newbtitle/Events.java
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
package cn.lunadeer.newbtitle;
|
||||||
|
|
||||||
|
public class Events {
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
package cn.lunadeer.newbtitle;
|
package cn.lunadeer.newbtitle;
|
||||||
|
|
||||||
import cn.lunadeer.newbtitle.utils.ConfigManager;
|
import cn.lunadeer.newbtitle.utils.ConfigManager;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
public final class NewbTitle extends JavaPlugin {
|
public final class NewbTitle extends JavaPlugin {
|
||||||
@ -11,6 +12,7 @@ public final class NewbTitle extends JavaPlugin {
|
|||||||
instance = this;
|
instance = this;
|
||||||
config = new ConfigManager(instance);
|
config = new ConfigManager(instance);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
28
src/main/java/cn/lunadeer/newbtitle/PlayerTitle.java
Normal file
28
src/main/java/cn/lunadeer/newbtitle/PlayerTitle.java
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package cn.lunadeer.newbtitle;
|
||||||
|
|
||||||
|
public class PlayerTitle extends Title {
|
||||||
|
private Long _expire_at = -1L;
|
||||||
|
|
||||||
|
public PlayerTitle(Integer id, Long expire_at) {
|
||||||
|
super(id);
|
||||||
|
this._expire_at = expire_at;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getExpireAt() {
|
||||||
|
if (this._expire_at == -1L) {
|
||||||
|
return "永久";
|
||||||
|
} else if (this._expire_at < System.currentTimeMillis()) {
|
||||||
|
return "已过期";
|
||||||
|
} else {
|
||||||
|
return new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.util.Date(this._expire_at));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean isExpired() {
|
||||||
|
if (this._expire_at == -1L) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return this._expire_at < System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
107
src/main/java/cn/lunadeer/newbtitle/SaleTitle.java
Normal file
107
src/main/java/cn/lunadeer/newbtitle/SaleTitle.java
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
package cn.lunadeer.newbtitle;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.lunadeer.newbtitle.utils.Database;
|
||||||
|
import cn.lunadeer.newbtitle.utils.XLogger;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
|
||||||
|
public class SaleTitle extends Title {
|
||||||
|
private final Integer _id;
|
||||||
|
private final Integer _title_id;
|
||||||
|
private Integer _price;
|
||||||
|
private Integer _days;
|
||||||
|
private Integer _amount;
|
||||||
|
private Long _sale_end_at;
|
||||||
|
|
||||||
|
public SaleTitle(Integer id, Integer title_id, Integer price, Integer days, Integer amount, Long sale_end_at) {
|
||||||
|
super(title_id);
|
||||||
|
this._id = id;
|
||||||
|
this._title_id = title_id;
|
||||||
|
this._price = price;
|
||||||
|
this._days = days;
|
||||||
|
this._amount = amount;
|
||||||
|
this._sale_end_at = sale_end_at;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SaleTitle create(Integer title_id) {
|
||||||
|
String sql = "";
|
||||||
|
sql += "INSERT INTO nt_title_shop (title_id, price, days, amount, sale_end_at) ";
|
||||||
|
sql += "VALUES (" + title_id + ", 0, 0, -1, CURRENT_TIMESTAMP) ";
|
||||||
|
sql += "RETURNING id;";
|
||||||
|
ResultSet rs = Database.query(sql);
|
||||||
|
try {
|
||||||
|
if (rs != null && rs.next()) {
|
||||||
|
Integer id = rs.getInt("id");
|
||||||
|
return new SaleTitle(id, title_id, 0, 0, -1, System.currentTimeMillis());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
XLogger.err("SaleTitle create failed: " + e.getMessage());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getPrice() {
|
||||||
|
return this._price;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPrice(Integer price) {
|
||||||
|
this._price = price;
|
||||||
|
this.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getDays() {
|
||||||
|
return this._days;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDays(Integer days) {
|
||||||
|
this._days = days;
|
||||||
|
this.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getAmount() {
|
||||||
|
return this._amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAmount(Integer amount) {
|
||||||
|
this._amount = amount;
|
||||||
|
this.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSaleEndAt() {
|
||||||
|
if (this._sale_end_at == -1L) {
|
||||||
|
return "常驻";
|
||||||
|
} else if (this._sale_end_at < System.currentTimeMillis()) {
|
||||||
|
return "已停售";
|
||||||
|
} else {
|
||||||
|
return new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.util.Date(this._sale_end_at));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSaleEndAt(Long sale_end_at) {
|
||||||
|
this._sale_end_at = sale_end_at;
|
||||||
|
this.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean isSaleExpired() {
|
||||||
|
if (this._sale_end_at == -1L) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return this._sale_end_at < System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void save() {
|
||||||
|
String sql = "";
|
||||||
|
sql += "UPDATE nt_title_shop ";
|
||||||
|
sql += "SET title_id = " + this._title_id + ", ";
|
||||||
|
sql += "price = " + this._price + ", ";
|
||||||
|
sql += "days = " + this._days + ", ";
|
||||||
|
sql += "amount = " + this._amount + ", ";
|
||||||
|
sql += "sale_end_at = " + this._sale_end_at + ", ";
|
||||||
|
sql += "updated_at = CURRENT_TIMESTAMP ";
|
||||||
|
sql += "WHERE id = " + this._id + ";";
|
||||||
|
|
||||||
|
Database.query(sql);
|
||||||
|
}
|
||||||
|
}
|
4
src/main/java/cn/lunadeer/newbtitle/Shop.java
Normal file
4
src/main/java/cn/lunadeer/newbtitle/Shop.java
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
package cn.lunadeer.newbtitle;
|
||||||
|
|
||||||
|
public class Shop {
|
||||||
|
}
|
129
src/main/java/cn/lunadeer/newbtitle/Title.java
Normal file
129
src/main/java/cn/lunadeer/newbtitle/Title.java
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
package cn.lunadeer.newbtitle;
|
||||||
|
|
||||||
|
import cn.lunadeer.newbtitle.utils.Database;
|
||||||
|
import cn.lunadeer.newbtitle.utils.XLogger;
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.ComponentLike;
|
||||||
|
import net.kyori.adventure.text.JoinConfiguration;
|
||||||
|
import net.kyori.adventure.text.TextComponent;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
|
||||||
|
public class Title {
|
||||||
|
protected Integer _id = null;
|
||||||
|
protected String _title;
|
||||||
|
protected String _description;
|
||||||
|
protected Boolean _enabled;
|
||||||
|
protected String _created_at;
|
||||||
|
protected String _updated_at;
|
||||||
|
JoinConfiguration join = JoinConfiguration.separator(Component.text(" "));
|
||||||
|
|
||||||
|
public Title(String title, String description) {
|
||||||
|
this._title = title;
|
||||||
|
this._description = description;
|
||||||
|
this._enabled = true;
|
||||||
|
this.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Title(Integer id) {
|
||||||
|
this._id = id;
|
||||||
|
String sql = "";
|
||||||
|
sql += "SELECT id, title, description, enabled, ";
|
||||||
|
sql += "DATE_FORMAT(created_at, '%Y-%m-%d %H:%i:%s') AS created_at, ";
|
||||||
|
sql += "DATE_FORMAT(updated_at, '%Y-%m-%d %H:%i:%s') AS updated_at ";
|
||||||
|
sql += "FROM nt_title ";
|
||||||
|
sql += "WHERE id = " + id + ";";
|
||||||
|
ResultSet rs = Database.query(sql);
|
||||||
|
try {
|
||||||
|
if (rs != null && rs.next()) {
|
||||||
|
this._title = rs.getString("title");
|
||||||
|
this._description = rs.getString("description");
|
||||||
|
this._enabled = rs.getBoolean("enabled");
|
||||||
|
this._created_at = rs.getString("created_at");
|
||||||
|
this._updated_at = rs.getString("updated_at");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
XLogger.err("Title load failed: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void delete(Integer id) {
|
||||||
|
String sql = "";
|
||||||
|
sql += "DELETE FROM nt_title WHERE id = " + id + ";";
|
||||||
|
Database.query(sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void save() {
|
||||||
|
String sql = "";
|
||||||
|
if (this._id == null) {
|
||||||
|
sql += "INSERT INTO nt_title (title, description, enabled) VALUES (";
|
||||||
|
sql += "'" + this._title + "', ";
|
||||||
|
sql += "'" + this._description + "', ";
|
||||||
|
sql += this._enabled + " ";
|
||||||
|
sql += ");";
|
||||||
|
} else {
|
||||||
|
sql += "UPDATE nt_title SET ";
|
||||||
|
sql += "title = '" + this._title + "', ";
|
||||||
|
sql += "description = '" + this._description + "', ";
|
||||||
|
sql += "enabled = " + this._enabled + " ";
|
||||||
|
sql += "updated_at = CURRENT_TIMESTAMP ";
|
||||||
|
sql += "WHERE id = " + this._id + ";";
|
||||||
|
}
|
||||||
|
Database.query(sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return this._id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Component getTitle() {
|
||||||
|
String[] parts = this._title.split("&#");
|
||||||
|
TextComponent[] components = new TextComponent[parts.length];
|
||||||
|
if (parts[0].length() > 0) {
|
||||||
|
components[0] = Component.text(parts[0]);
|
||||||
|
}
|
||||||
|
for (int i = 1; i < parts.length; i++) {
|
||||||
|
String part = parts[i];
|
||||||
|
String color_str = part.substring(0, 6);
|
||||||
|
String text = part.substring(6);
|
||||||
|
Color color = new Color(color_str);
|
||||||
|
components[i] = Component.text(text, color.getStyle());
|
||||||
|
}
|
||||||
|
TextComponent prefix = Component.text(NewbTitle.config.getPrefix());
|
||||||
|
TextComponent suffix = Component.text(NewbTitle.config.getSuffix());
|
||||||
|
components[0] = prefix.append(components[0]);
|
||||||
|
components[parts.length - 1] = components[parts.length - 1].append(suffix);
|
||||||
|
return Component.join(join, components);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this._title = title;
|
||||||
|
this.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return this._description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescription(String description) {
|
||||||
|
this._description = description;
|
||||||
|
this.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean getEnabled() {
|
||||||
|
return this._enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnabled(Boolean enabled) {
|
||||||
|
this._enabled = enabled;
|
||||||
|
this.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCreatedAt() {
|
||||||
|
return this._created_at;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUpdatedAt() {
|
||||||
|
return this._updated_at;
|
||||||
|
}
|
||||||
|
}
|
158
src/main/java/cn/lunadeer/newbtitle/XPlayer.java
Normal file
158
src/main/java/cn/lunadeer/newbtitle/XPlayer.java
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
package cn.lunadeer.newbtitle;
|
||||||
|
|
||||||
|
import cn.lunadeer.newbtitle.utils.Database;
|
||||||
|
import cn.lunadeer.newbtitle.utils.Notification;
|
||||||
|
import cn.lunadeer.newbtitle.utils.XLogger;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class XPlayer {
|
||||||
|
private final Player _player;
|
||||||
|
private Integer _coin;
|
||||||
|
private final Map<Integer, PlayerTitle> _titles;
|
||||||
|
private Integer _current_title_id = -1;
|
||||||
|
|
||||||
|
public XPlayer(Player player) {
|
||||||
|
_player = player;
|
||||||
|
_titles = getTitles(player.getUniqueId());
|
||||||
|
_current_title_id = getCurrentTitleId(player.getUniqueId());
|
||||||
|
_coin = getCoin(player.getUniqueId());
|
||||||
|
applyCurrentTitle();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateUsingTitle(Integer title_id) {
|
||||||
|
_current_title_id = title_id;
|
||||||
|
applyCurrentTitle();
|
||||||
|
String sql = "";
|
||||||
|
sql += "UPDATE nt_player_using_title ";
|
||||||
|
sql += "SET title_id = " + title_id + ", ";
|
||||||
|
sql += "updated_at = CURRENT_TIMESTAMP ";
|
||||||
|
sql += "WHERE uuid = '" + _player.getUniqueId().toString() + "';";
|
||||||
|
Database.query(sql);
|
||||||
|
_current_title_id = title_id;
|
||||||
|
Notification.info(_player, "成功使用称号: " + _titles.get(title_id).getTitle());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void applyCurrentTitle() {
|
||||||
|
if (_current_title_id == -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!_titles.containsKey(_current_title_id)) {
|
||||||
|
Notification.error(_player, "你没有这个称号");
|
||||||
|
_current_title_id = -1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PlayerTitle title = _titles.get(_current_title_id);
|
||||||
|
if (title.isExpired()) {
|
||||||
|
Notification.error(_player, "此称号已经过期");
|
||||||
|
_current_title_id = -1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_player.sendPlayerListHeader(title.getTitle());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set_coin(Integer coin) {
|
||||||
|
_coin = coin;
|
||||||
|
String sql = "";
|
||||||
|
sql += "UPDATE nt_player_coin ";
|
||||||
|
sql += "SET coin = " + coin + ", ";
|
||||||
|
sql += "updated_at = CURRENT_TIMESTAMP ";
|
||||||
|
sql += "WHERE uuid = '" + _player.getUniqueId().toString() + "';";
|
||||||
|
Database.query(sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add_coin(Integer coin) {
|
||||||
|
set_coin(_coin + coin);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<Integer, PlayerTitle> getTitles(UUID uuid) {
|
||||||
|
String sql = "";
|
||||||
|
sql += "SELECT ";
|
||||||
|
sql += "title_id, expire_at ";
|
||||||
|
sql += "FROM nt_player_title ";
|
||||||
|
sql += "WHERE player_uuid = '" + uuid.toString() + "';";
|
||||||
|
ResultSet rs = Database.query(sql);
|
||||||
|
Map<Integer, PlayerTitle> titles = new HashMap<>();
|
||||||
|
try {
|
||||||
|
while (rs != null && rs.next()) {
|
||||||
|
Integer title_id = rs.getInt("title_id");
|
||||||
|
Long expire_at = rs.getLong("expire_at");
|
||||||
|
PlayerTitle title = new PlayerTitle(title_id, expire_at);
|
||||||
|
titles.put(title_id, title);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
XLogger.err("XPlayer getTitles failed: " + e.getMessage());
|
||||||
|
}
|
||||||
|
return titles;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Integer getCurrentTitleId(UUID uuid) {
|
||||||
|
String sql = "";
|
||||||
|
sql += "SELECT title_id ";
|
||||||
|
sql += "FROM nt_player_using_title ";
|
||||||
|
sql += "WHERE uuid = '" + uuid.toString() + "';";
|
||||||
|
ResultSet rs = Database.query(sql);
|
||||||
|
Integer current_title_id = null;
|
||||||
|
try {
|
||||||
|
if (rs != null && rs.next()) {
|
||||||
|
current_title_id = rs.getInt("title_id");
|
||||||
|
} else {
|
||||||
|
current_title_id = -1;
|
||||||
|
sql = "";
|
||||||
|
sql += "INSERT INTO nt_player_using_title (uuid, title_id) VALUES (";
|
||||||
|
sql += "'" + uuid + "', ";
|
||||||
|
sql += current_title_id + ");";
|
||||||
|
Database.query(sql);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
XLogger.err("XPlayer getCurrentTitleId failed: " + e.getMessage());
|
||||||
|
}
|
||||||
|
return current_title_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Integer getCoin(UUID uuid) {
|
||||||
|
String sql = "";
|
||||||
|
sql += "SELECT coin ";
|
||||||
|
sql += "FROM nt_player_coin ";
|
||||||
|
sql += "WHERE uuid = '" + uuid.toString() + "';";
|
||||||
|
ResultSet rs = Database.query(sql);
|
||||||
|
Integer coin = null;
|
||||||
|
try {
|
||||||
|
if (rs != null && rs.next()) {
|
||||||
|
coin = rs.getInt("coin");
|
||||||
|
} else {
|
||||||
|
coin = 0;
|
||||||
|
sql = "";
|
||||||
|
sql += "INSERT INTO nt_player_coin (uuid, coin) VALUES (";
|
||||||
|
sql += "'" + uuid + "', ";
|
||||||
|
sql += coin + ");";
|
||||||
|
Database.query(sql);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
XLogger.err("XPlayer getCoin failed: " + e.getMessage());
|
||||||
|
}
|
||||||
|
return coin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void buyTitle(SaleTitle title) {
|
||||||
|
if (title.isSaleExpired()) {
|
||||||
|
Notification.error(_player, "此称号已停止销售");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (title.getAmount() != -1 && title.getAmount() <= 0) {
|
||||||
|
Notification.error(_player, "此称号已售罄");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (title.getPrice() > _coin) {
|
||||||
|
Notification.error(_player, "你的余额不足");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// todo 校验是否已有此称号 以及是否已过期
|
||||||
|
// todo 如果已则续费 如果未则购买
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -14,6 +14,13 @@ public class ConfigManager {
|
|||||||
_plugin.reloadConfig();
|
_plugin.reloadConfig();
|
||||||
_file = _plugin.getConfig();
|
_file = _plugin.getConfig();
|
||||||
_debug = _file.getBoolean("Debug", false);
|
_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", "newbtitle");
|
||||||
|
_db_user = _file.getString("Database.User", "postgres");
|
||||||
|
_db_pass = _file.getString("Database.Pass", "postgres");
|
||||||
|
_prefix = _file.getString("Prefix", "[");
|
||||||
|
_suffix = _file.getString("Suffix", "]");
|
||||||
}
|
}
|
||||||
|
|
||||||
public Boolean isDebug() {
|
public Boolean isDebug() {
|
||||||
@ -26,9 +33,76 @@ public class ConfigManager {
|
|||||||
_plugin.saveConfig();
|
_plugin.saveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getDBConnectionUrl(){
|
||||||
|
return "jdbc:postgresql://" + _db_host + ":" + _db_port + "/" + _db_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDbHost(String db_host) {
|
||||||
|
_db_host = db_host;
|
||||||
|
_file.set("Database.Host", db_host);
|
||||||
|
_plugin.saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private NewbTitle _plugin;
|
public void setDbPort(String db_port) {
|
||||||
|
_db_port = db_port;
|
||||||
|
_file.set("Database.Port", db_port);
|
||||||
|
_plugin.saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setDbName(String db_name) {
|
||||||
|
_db_name = db_name;
|
||||||
|
_file.set("Database.Name", db_name);
|
||||||
|
_plugin.saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPrefix() {
|
||||||
|
return _prefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSuffix() {
|
||||||
|
return _suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private final NewbTitle _plugin;
|
||||||
private FileConfiguration _file;
|
private FileConfiguration _file;
|
||||||
private Boolean _debug;
|
private Boolean _debug;
|
||||||
|
|
||||||
|
private String _db_host;
|
||||||
|
private String _db_port;
|
||||||
|
private String _db_user;
|
||||||
|
private String _db_pass;
|
||||||
|
private String _db_name;
|
||||||
|
private String _prefix;
|
||||||
|
private String _suffix;
|
||||||
}
|
}
|
||||||
|
90
src/main/java/cn/lunadeer/newbtitle/utils/Database.java
Normal file
90
src/main/java/cn/lunadeer/newbtitle/utils/Database.java
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
package cn.lunadeer.newbtitle.utils;
|
||||||
|
|
||||||
|
import cn.lunadeer.newbtitle.NewbTitle;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public class Database {
|
||||||
|
|
||||||
|
private static Connection getConnection() {
|
||||||
|
try {
|
||||||
|
Class.forName("org.postgresql.Driver");
|
||||||
|
return DriverManager.getConnection(NewbTitle.config.getDBConnectionUrl(), NewbTitle.config.getDbUser(), NewbTitle.config.getDbPass());
|
||||||
|
} catch (ClassNotFoundException | SQLException e) {
|
||||||
|
XLogger.err("Database connection failed: " + e.getMessage());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ResultSet query(String sql) {
|
||||||
|
try {
|
||||||
|
Connection connection = getConnection();
|
||||||
|
Statement statement = Objects.requireNonNull(connection).createStatement();
|
||||||
|
ResultSet res = statement.executeQuery(sql);
|
||||||
|
statement.close();
|
||||||
|
connection.close();
|
||||||
|
return res;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
XLogger.err("Database query failed: " + e.getMessage());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void migrate() {
|
||||||
|
String sql = "";
|
||||||
|
|
||||||
|
// title table
|
||||||
|
sql += "CREATE TABLE IF NOT EXISTS 'nt_title' (" +
|
||||||
|
" id SERIAL PRIMARY KEY," +
|
||||||
|
" title TEXT NOT NULL," +
|
||||||
|
" description TEXT NOT NULL," +
|
||||||
|
" enabled BOOLEAN NOT NULL DEFAULT TRUE," +
|
||||||
|
" created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP," +
|
||||||
|
" updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP" +
|
||||||
|
");";
|
||||||
|
|
||||||
|
// title shop table
|
||||||
|
sql += "CREATE TABLE IF NOT EXISTS 'nt_title_shop' (" +
|
||||||
|
" id SERIAL PRIMARY KEY," +
|
||||||
|
" title_id INTEGER NOT NULL," +
|
||||||
|
" price INTEGER NOT NULL DEFAULT 0," +
|
||||||
|
" days INTEGER NOT NULL DEFAULT 0," +
|
||||||
|
" amount INTEGER NOT NULL DEFAULT -1," +
|
||||||
|
" sale_end_at TIMESTAMP," +
|
||||||
|
" created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP," +
|
||||||
|
" updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP," +
|
||||||
|
" FOREIGN KEY (title_id) REFERENCES nt_title(id) ON DELETE CASCADE" +
|
||||||
|
");";
|
||||||
|
|
||||||
|
// player coin table
|
||||||
|
sql += "CREATE TABLE IF NOT EXISTS 'nt_player_coin' (" +
|
||||||
|
" uuid UUID PRIMARY KEY," +
|
||||||
|
" coin INTEGER NOT NULL DEFAULT 0," +
|
||||||
|
" created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP," +
|
||||||
|
" updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP" +
|
||||||
|
");";
|
||||||
|
|
||||||
|
// player title table
|
||||||
|
sql += "CREATE TABLE IF NOT EXISTS 'nt_player_title' (" +
|
||||||
|
" id SERIAL PRIMARY KEY," +
|
||||||
|
" player_uuid UUID NOT NULL," +
|
||||||
|
" title_id INTEGER NOT NULL," +
|
||||||
|
" expire_at TIMESTAMP," +
|
||||||
|
" created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP," +
|
||||||
|
" updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP," +
|
||||||
|
" FOREIGN KEY (title_id) REFERENCES nt_title(id) ON DELETE CASCADE" +
|
||||||
|
");";
|
||||||
|
|
||||||
|
// player using title table
|
||||||
|
sql += "CREATE TABLE IF NOT EXISTS 'nt_player_using_title' (" +
|
||||||
|
" uuid UUID PRIMARY KEY," +
|
||||||
|
" title_id INTEGER NOT NULL," +
|
||||||
|
" created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP," +
|
||||||
|
" updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP," +
|
||||||
|
" FOREIGN KEY (title_id) REFERENCES nt_title(id) ON DELETE CASCADE" +
|
||||||
|
");";
|
||||||
|
|
||||||
|
query(sql);
|
||||||
|
}
|
||||||
|
}
|
@ -11,15 +11,14 @@ public class Notification {
|
|||||||
private static final Style e_style = Style.style(TextColor.color(255, 96, 72));
|
private static final Style e_style = Style.style(TextColor.color(255, 96, 72));
|
||||||
|
|
||||||
public static void info(Player player, String msg) {
|
public static void info(Player player, String msg) {
|
||||||
player.sendMessage(Component.text("[LWE] " + msg, i_style));
|
player.sendMessage(Component.text("[NewbTitle] " + msg, i_style));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void warn(Player player, String msg) {
|
public static void warn(Player player, String msg) {
|
||||||
player.sendMessage(Component.text("[LWE] " + msg, w_style));
|
player.sendMessage(Component.text("[NewbTitle] " + msg, w_style));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void error(Player player, String msg) {
|
public static void error(Player player, String msg) {
|
||||||
player.sendMessage(Component.text("[LWE] " + msg, e_style));
|
player.sendMessage(Component.text("[NewbTitle] " + msg, e_style));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
11
src/main/resources/config.yml
Normal file
11
src/main/resources/config.yml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
Database:
|
||||||
|
Host: localhost
|
||||||
|
Port: 5432
|
||||||
|
Name: newbtitle
|
||||||
|
User: postgres
|
||||||
|
Pass: postgres
|
||||||
|
|
||||||
|
Prefix: "["
|
||||||
|
Suffix: "]"
|
||||||
|
|
||||||
|
Debug: false
|
@ -2,3 +2,11 @@ name: NewbTitle
|
|||||||
version: '${project.version}'
|
version: '${project.version}'
|
||||||
main: cn.lunadeer.newbtitle.NewbTitle
|
main: cn.lunadeer.newbtitle.NewbTitle
|
||||||
api-version: '1.20'
|
api-version: '1.20'
|
||||||
|
description: 称号插件。
|
||||||
|
website: https://lunadeer.cn
|
||||||
|
folia-supported: true
|
||||||
|
commands:
|
||||||
|
NewbTitle:
|
||||||
|
description: 称号插件命令
|
||||||
|
usage: /nt <cmd>
|
||||||
|
aliases: [nt]
|
||||||
|
Loading…
Reference in New Issue
Block a user