Skip to content

Commit 2529aa4

Browse files
committed
Reward機能完成(仮
AnvilGUIが不安定なので運営以外に使わせられない
1 parent d628762 commit 2529aa4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+2198
-128
lines changed

src/main/java/dev/felnull/pointed/Pointed.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,17 @@
44
import dev.felnull.pointed.core.database.Db;
55
import dev.felnull.pointed.core.database.TableInitializer;
66
import dev.felnull.pointed.core.database.Names;
7+
import dev.felnull.pointed.core.database.api.PointService;
78
import dev.felnull.pointed.core.database.api.PointServiceImpl;
89
import dev.felnull.pointed.core.listener.ChatListener;
910
import dev.felnull.pointed.core.util.ChatReader;
1011
import dev.felnull.pointed.teams.database.TeamTableInitializer;
1112
import dev.felnull.pointed.teams.manager.TeamManager;
1213
import dev.felnull.pointed.teams.manager.TeamManagerImpl;
14+
import dev.felnull.pointed.teams.manager.reward.RankingService;
15+
import dev.felnull.pointed.teams.manager.reward.RewardAdminService;
16+
import dev.felnull.pointed.teams.manager.reward.impl.RankingServiceImpl;
17+
import dev.felnull.pointed.teams.manager.reward.impl.RewardAdminServiceImpl;
1318
import lombok.Getter;
1419
import org.bukkit.Bukkit;
1520
import org.bukkit.configuration.file.FileConfiguration;
@@ -28,9 +33,14 @@ public final class Pointed extends JavaPlugin {
2833
public ChatReader chatReader;
2934
public static List<BukkitTask> taskList = new ArrayList<>();
3035
ZoneId zoneId = ZoneId.of(getConfig().getString("timezone", "Asia/Tokyo"));
31-
public static PointServiceImpl pointService;
36+
@Getter
37+
public PointServiceImpl pointService;
3238
@Getter
3339
public TeamManager teamManager;
40+
@Getter
41+
public RankingService rankingService;
42+
@Getter
43+
public RewardAdminService rewardAdminService;
3444

3545
@Override
3646
public void onEnable() {
@@ -40,8 +50,11 @@ public void onEnable() {
4050
Names.init(prefix);
4151
Db.init(conf.getString("database.host"), conf.getInt("database.port"), conf.getString("database.database"), conf.getString("database.user"), conf.getString("database.pass"));
4252
this.chatReader = new ChatReader();
43-
pointService = new PointServiceImpl(Db.get(), zoneId);
44-
teamManager = new TeamManagerImpl();
53+
this.pointService = new PointServiceImpl(Db.get(), zoneId);
54+
this.teamManager = new TeamManagerImpl();
55+
this.rankingService = new RankingServiceImpl(Db.get());
56+
this.rewardAdminService = new RewardAdminServiceImpl(Db.get(), rankingService);
57+
4558
Bukkit.getLogger().info("Pointedが動作を開始しました");
4659
setupCommand();
4760
setupListener();
@@ -60,8 +73,8 @@ public void onDisable() {
6073
}
6174

6275
public void setupCommand(){
63-
getCommand("pt").setExecutor(new PtCommand(pointService, this, zoneId));
64-
getCommand("ptteam").setExecutor(new PtTeam(this));
76+
getCommand("pt").setExecutor(new PtCommand(pointService, zoneId));
77+
getCommand("ptteam").setExecutor(new PtTeam());
6578
}
6679
public void setupListener(){
6780
Bukkit.getPluginManager().registerEvents(new ChatListener(this), this);

src/main/java/dev/felnull/pointed/core/commands/PtCommand.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import org.bukkit.command.CommandExecutor;
1010
import org.bukkit.command.CommandSender;
1111
import org.bukkit.command.TabCompleter;
12-
import org.bukkit.plugin.Plugin;
12+
import org.jetbrains.annotations.NotNull;
1313

1414
import java.time.LocalDate;
1515
import java.time.ZoneId;
@@ -18,12 +18,10 @@
1818

1919
public class PtCommand implements CommandExecutor, TabCompleter {
2020
private final PointService svc;
21-
private final Plugin plugin;
2221
private final ZoneId zoneId;
2322

24-
public PtCommand(PointService svc, Plugin plugin, ZoneId zoneId) {
23+
public PtCommand(PointService svc, ZoneId zoneId) {
2524
this.svc = svc;
26-
this.plugin = plugin;
2725
this.zoneId = zoneId;
2826
}
2927

@@ -45,7 +43,7 @@ private static String resolveSubjectKey(String type, String keyOrName) {
4543
}
4644

4745
@Override
48-
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
46+
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) {
4947
if (args.length == 0) {
5048
sender.sendMessage(Util.f("&e/pt <getnow|gettotal|get|add|sub|set|rank>"));
5149
return true;
@@ -244,7 +242,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String
244242
}
245243

246244
@Override
247-
public List<String> onTabComplete(CommandSender sender, Command cmd, String label, String[] args) {
245+
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) {
248246
if (args.length == 1) {
249247
return List.of("getnow", "gettotal", "get", "add", "sub", "set", "rank");
250248
}
Lines changed: 49 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,34 @@
11
package dev.felnull.pointed.core.commands;
22

33
import dev.felnull.bettergui.core.InventoryGUI;
4-
import dev.felnull.pointed.core.database.api.PointService;
4+
import dev.felnull.pointed.Pointed;
55
import dev.felnull.pointed.core.database.data.RankRow;
66
import dev.felnull.pointed.core.util.Util;
7+
import dev.felnull.pointed.teams.gui.page.EditRewards;
78
import dev.felnull.pointed.teams.gui.page.TeamConfigGUI;
9+
import dev.felnull.pointed.teams.manager.reward.RewardAdminService;
810
import org.bukkit.Bukkit;
911
import org.bukkit.OfflinePlayer;
1012
import org.bukkit.command.Command;
1113
import org.bukkit.command.CommandExecutor;
1214
import org.bukkit.command.CommandSender;
1315
import org.bukkit.command.TabCompleter;
1416
import org.bukkit.entity.Player;
15-
import org.bukkit.plugin.Plugin;
17+
import org.jetbrains.annotations.NotNull;
1618

17-
import java.time.LocalDate;
18-
import java.time.ZoneId;
19+
import java.sql.SQLException;
1920
import java.util.List;
2021
import java.util.UUID;
2122

2223
public class PtTeam implements CommandExecutor, TabCompleter {
23-
private final Plugin plugin;
2424

25-
public PtTeam(Plugin plugin) {
26-
this.plugin = plugin;
25+
public PtTeam() {
2726
}
2827

29-
// type=PLAYER のときだけ <名前 or UUID> を UUID文字列に正規化して返す
30-
// それ以外の type は key をそのまま返す
31-
private static String resolveSubjectKey(String type, String keyOrName) {
32-
if (!"PLAYER".equalsIgnoreCase(type)) {
33-
return keyOrName; // 任意文字列キーをそのまま使用
34-
}
35-
// PLAYER の場合: UUIDっぽければそのまま、そうでなければ名前→UUID
36-
try {
37-
UUID uuid = UUID.fromString(keyOrName);
38-
return uuid.toString();
39-
} catch (IllegalArgumentException ignore) {
40-
OfflinePlayer op = Bukkit.getOfflinePlayer(keyOrName);
41-
UUID uuid = op.getUniqueId();
42-
return uuid.toString();
43-
}
44-
}
28+
4529

4630
@Override
47-
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
31+
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) {
4832
if (args.length == 0) {
4933
sender.sendMessage(Util.f("&e/ptteam <set> <scope> <teamID>"));
5034
return true;
@@ -58,46 +42,69 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String
5842
String sub = args[0].toLowerCase();
5943
switch (sub) {
6044
case "set" -> {
61-
if(args.length < 2){
45+
if (args.length < 2) {
6246
sender.sendMessage(Util.f("&e/ptteam <set> <teamID>"));
6347
return true;
6448
}
65-
if(!(sender instanceof Player)){
49+
if (!(sender instanceof Player)) {
6650
sender.sendMessage(Util.f("Playerのみが使用可能なコマンドです"));
6751
return true;
6852
}
6953
InventoryGUI gui = new InventoryGUI((Player) sender);
7054
gui.openPage(new TeamConfigGUI(gui, args[1]));
7155
}
56+
case "reward" -> {
57+
if (!(sender instanceof Player)) {
58+
sender.sendMessage(Util.f("Playerのみが使用可能なコマンドです"));
59+
return true;
60+
}
61+
InventoryGUI gui = new InventoryGUI((Player) sender);
62+
try {
63+
gui.openPage(new EditRewards(gui));
64+
} catch (SQLException e) {
65+
sender.sendMessage("guiを開けませんでした、、");
66+
throw new RuntimeException(e);
67+
}
68+
}
69+
case "forcegive" -> {
70+
if(args.length < 2){
71+
sender.sendMessage("引数が足りません");
72+
return true;
73+
}
74+
75+
OfflinePlayer targetPlayer = Bukkit.getOfflinePlayerIfCached(args[1]);
76+
if(targetPlayer == null){
77+
sender.sendMessage("指定されたプレイヤーは存在しません");
78+
return true;
79+
}
80+
81+
RewardAdminService adminService = Pointed.getInstance().getRewardAdminService();
82+
try {
83+
adminService.dispatchManual(targetPlayer.getUniqueId(), targetPlayer.getName(), Integer.parseInt(args[2]));
84+
} catch (NumberFormatException e) {
85+
sender.sendMessage("数字で入力してください!!!! : " + args[2]);
86+
} catch (SQLException e) {
87+
throw new RuntimeException(e);
88+
}
89+
}
7290
default -> sender.sendMessage(Util.f("/ptteam <set> <teamID>"));
7391
}
7492

7593
return true;
7694
}
7795

7896
@Override
79-
public List<String> onTabComplete(CommandSender sender, Command cmd, String label, String[] args) {
97+
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) {
8098
if (args.length == 1) {
81-
return List.of("set");
99+
return List.of("set", "reward", "forcegive");
82100
}
83101
// サブコマンド毎の type 補完
84-
if (args.length == 2 && List.of("getnow","gettotal","get","add","sub","set").contains(args[0].toLowerCase())) {
85-
return List.of("PLAYER","TEAM","SYSTEM");
102+
if (args.length == 2 && List.of("getnow", "gettotal", "get", "add", "sub", "set").contains(args[0].toLowerCase())) {
103+
return List.of("PLAYER", "TEAM", "SYSTEM");
86104
}
87105
if (args.length == 2 && args[0].equalsIgnoreCase("rank")) {
88106
return List.of("daily", "weekly", "global");
89107
}
90108
return List.of();
91109
}
92-
93-
// 共通メソッド
94-
private String formatRankLine(int rankNum, RankRow r) {
95-
String color = switch (rankNum) {
96-
case 1 -> "&6"; // 金
97-
case 2 -> "&7"; // 銀
98-
case 3 -> "&c"; // 赤
99-
default -> "&e"; // 黄
100-
};
101-
return Util.f(color + "#{0} &b{1} &f+{2}", rankNum, r.name, r.gained);
102-
}
103-
}
110+
}

src/main/java/dev/felnull/pointed/core/database/TableInitializer.java

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,6 @@ public static void initTables() {
6262
" id BIGINT AUTO_INCREMENT PRIMARY KEY" +
6363
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
6464

65-
// ====Team====
66-
// team_meta(骨格)
67-
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS " + Names.t("team_meta") + " (" +
68-
" subject_id BIGINT NOT NULL," +
69-
" PRIMARY KEY (subject_id)" +
70-
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
7165

7266
// ========== 2) 不足カラムを追加 ==========
7367

@@ -116,12 +110,6 @@ public static void initTables() {
116110
addColumnIfNotExists(conn, "point_ledger", "ref_id", "VARCHAR(64)");
117111
addColumnIfNotExists(conn, "point_ledger", "created_at", "TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP");
118112

119-
// ==== Team ====
120-
// team_meta
121-
addColumnIfNotExists(conn, "team_meta", "color_code", "VARCHAR(16) NOT NULL");
122-
addColumnIfNotExists(conn, "team_meta", "sort_order", "INT NOT NULL DEFAULT 0");
123-
addColumnIfNotExists(conn, "team_meta", "active", "TINYINT(1) NOT NULL DEFAULT 1");
124-
125113
// ========== 3) インデックス・制約 ==========
126114

127115
ensureUniqueIndex(conn, "subjects", "uniq_subject_key", new String[]{"type","subject_key"});
@@ -157,10 +145,6 @@ public static void initTables() {
157145
ensureForeignKey(conn, "team_meta", "fk_tm_subject",
158146
"subject_id", "subjects", "id", "CASCADE", "CASCADE");
159147

160-
// 並び順・有効/無効フィルタの補助INDEX
161-
ensureIndex(conn, "team_meta", "idx_tm_sort", new String[]{"sort_order"});
162-
ensureIndex(conn, "team_meta", "idx_tm_active", new String[]{"active"});
163-
164148
LOGGER.info("[Pointed] テーブル初期化完了!");
165149

166150
} catch (SQLException e) {
@@ -173,7 +157,7 @@ public static void initTables() {
173157
public static void addColumnIfNotExists(Connection conn, String baseTable, String columnName, String columnDefinition) {
174158
String phys = Names.phys(baseTable); // バッククォートなし実名
175159
try {
176-
boolean exists = false;
160+
boolean exists;
177161
DatabaseMetaData md = conn.getMetaData();
178162
try (ResultSet rs = md.getColumns(null, null, phys, columnName)) {
179163
exists = rs.next();
@@ -198,12 +182,12 @@ public static void addColumnIfNotExists(Connection conn, String baseTable, Strin
198182
public static void ensurePrimaryKey(Connection conn, String baseTable, String[] columns) {
199183
String phys = Names.phys(baseTable);
200184
try {
201-
Set<String> existing = new LinkedHashSet<String>();
185+
Set<String> existing = new LinkedHashSet<>();
202186
DatabaseMetaData md = conn.getMetaData();
203187
try (ResultSet rs = md.getPrimaryKeys(null, null, phys)) {
204188
while (rs.next()) existing.add(rs.getString("COLUMN_NAME").toLowerCase());
205189
}
206-
Set<String> target = new LinkedHashSet<String>();
190+
Set<String> target = new LinkedHashSet<>();
207191
for (String c : columns) target.add(c.toLowerCase());
208192
if (existing.equals(target)) return;
209193
if (!existing.isEmpty()) {
@@ -220,7 +204,7 @@ public static void ensurePrimaryKey(Connection conn, String baseTable, String[]
220204
}
221205
}
222206

223-
private static void ensureUniqueIndex(Connection conn, String baseTable, String indexName, String[] columns) {
207+
public static void ensureUniqueIndex(Connection conn, String baseTable, String indexName, String[] columns) {
224208
String phys = Names.phys(baseTable);
225209
try {
226210
if (indexExists(conn, phys, indexName)) return;

src/main/java/dev/felnull/pointed/core/database/api/PointServiceImpl.java

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,9 @@ public long getNowPoint(String subjectType, String subjectKey, String scope) {
123123
ps.setString(1, subjectType);
124124
ps.setString(2, subjectKey);
125125
ps.setString(3, scope);
126-
ResultSet rs = ps.executeQuery();
127-
try { return rs.next() ? rs.getLong(1) : 0L; }
128-
finally { rs.close(); }
126+
try (ResultSet rs = ps.executeQuery()) {
127+
return rs.next() ? rs.getLong(1) : 0L;
128+
}
129129
} catch (SQLException e) {
130130
throw new RuntimeException(e);
131131
}
@@ -142,9 +142,9 @@ public long getTotalPoint(String subjectType, String subjectKey, String scope) {
142142
ps.setString(1, subjectType);
143143
ps.setString(2, subjectKey);
144144
ps.setString(3, scope);
145-
ResultSet rs = ps.executeQuery();
146-
try { return rs.next() ? rs.getLong(1) : 0L; }
147-
finally { rs.close(); }
145+
try (ResultSet rs = ps.executeQuery()) {
146+
return rs.next() ? rs.getLong(1) : 0L;
147+
}
148148
} catch (SQLException e) {
149149
throw new RuntimeException(e);
150150
}
@@ -161,11 +161,10 @@ public long[] getNowAndTotal(String subjectType, String subjectKey, String scope
161161
ps.setString(1, subjectType);
162162
ps.setString(2, subjectKey);
163163
ps.setString(3, scope);
164-
ResultSet rs = ps.executeQuery();
165-
try {
166-
if (rs.next()) return new long[]{ rs.getLong(1), rs.getLong(2) };
167-
return new long[]{ 0L, 0L };
168-
} finally { rs.close(); }
164+
try (ResultSet rs = ps.executeQuery()) {
165+
if (rs.next()) return new long[]{rs.getLong(1), rs.getLong(2)};
166+
return new long[]{0L, 0L};
167+
}
169168
} catch (SQLException e) {
170169
throw new RuntimeException(e);
171170
}
@@ -273,7 +272,7 @@ public long[] set(String subjectType, String subjectKey, String scope, long newN
273272

274273
@Override
275274
public List<RankRow> getDailyTop(String subjectType, String scope, LocalDate day, int limit) {
276-
List<RankRow> list = new ArrayList<RankRow>();
275+
List<RankRow> list = new ArrayList<>();
277276
try (Connection con = ds.getConnection();
278277
PreparedStatement ps = con.prepareStatement(
279278
"SELECT s.type, s.subject_key, s.name, d.gained, ab.now_point, ab.total_point " +
@@ -301,7 +300,7 @@ public List<RankRow> getDailyTop(String subjectType, String scope, LocalDate day
301300

302301
@Override
303302
public List<RankRow> getWeeklyTop(String subjectType, String scope, LocalDate startInclusive, LocalDate endInclusive, int limit) {
304-
List<RankRow> list = new ArrayList<RankRow>();
303+
List<RankRow> list = new ArrayList<>();
305304
try (Connection con = ds.getConnection();
306305
PreparedStatement ps = con.prepareStatement(
307306
"SELECT s.type, s.subject_key, s.name, SUM(d.gained) AS week_gained, ab.now_point, ab.total_point " +
@@ -331,7 +330,7 @@ public List<RankRow> getWeeklyTop(String subjectType, String scope, LocalDate st
331330

332331
@Override
333332
public List<RankRow> getGlobalTop(String subjectType, String scope, int limit) {
334-
List<RankRow> list = new ArrayList<RankRow>();
333+
List<RankRow> list = new ArrayList<>();
335334
try (Connection con = ds.getConnection();
336335
PreparedStatement ps = con.prepareStatement(
337336
"SELECT s.type, s.subject_key, s.name, ab.total_point, ab.now_point, ab.total_point " +
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package dev.felnull.pointed.core.database.api;
22

33
public enum SubjectType {
4-
PLAYER,TEAM,SYSTEM;
4+
PLAYER,TEAM,SYSTEM
55
}

0 commit comments

Comments
 (0)