Skip to content

Commit e1080ab

Browse files
committed
Team管理Class整備
1 parent e8bee88 commit e1080ab

File tree

18 files changed

+596
-40
lines changed

18 files changed

+596
-40
lines changed

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package dev.felnull.pointed;
22

3-
import dev.felnull.pointed.commands.*;
4-
import dev.felnull.pointed.database.Db;
5-
import dev.felnull.pointed.database.TableInitializer;
6-
import dev.felnull.pointed.database.api.Names;
7-
import dev.felnull.pointed.database.api.PointServiceImpl;
8-
import dev.felnull.pointed.listener.ChatListener;
9-
import dev.felnull.pointed.util.ChatReader;
3+
import dev.felnull.pointed.core.commands.*;
4+
import dev.felnull.pointed.core.database.Db;
5+
import dev.felnull.pointed.core.database.TableInitializer;
6+
import dev.felnull.pointed.core.database.Names;
7+
import dev.felnull.pointed.core.database.api.PointServiceImpl;
8+
import dev.felnull.pointed.core.listener.ChatListener;
9+
import dev.felnull.pointed.core.util.ChatReader;
1010
import lombok.Getter;
1111
import org.bukkit.Bukkit;
1212
import org.bukkit.configuration.file.FileConfiguration;
@@ -25,6 +25,7 @@ public final class Pointed extends JavaPlugin {
2525
public ChatReader chatReader;
2626
public static List<BukkitTask> taskList = new ArrayList<>();
2727
ZoneId zoneId = ZoneId.of(getConfig().getString("timezone", "Asia/Tokyo"));
28+
public static PointServiceImpl pointService;
2829

2930
@Override
3031
public void onEnable() {
@@ -34,6 +35,7 @@ public void onEnable() {
3435
Names.init(prefix);
3536
Db.init(conf.getString("database.host"), conf.getInt("database.port"), conf.getString("database.database"), conf.getString("database.user"), conf.getString("database.pass"));
3637
this.chatReader = new ChatReader();
38+
pointService = new PointServiceImpl(Db.get(), zoneId);
3739
Bukkit.getLogger().info("Pointedが動作を開始しました");
3840
setupCommand();
3941
setupListener();
@@ -51,7 +53,7 @@ public void onDisable() {
5153
}
5254

5355
public void setupCommand(){
54-
getCommand("pt").setExecutor(new PtCommand(new PointServiceImpl(Db.get(), zoneId), this, zoneId) {
56+
getCommand("pt").setExecutor(new PtCommand(pointService, this, zoneId) {
5557
});
5658
}
5759
public void setupListener(){

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
package dev.felnull.pointed.commands;
1+
package dev.felnull.pointed.core.commands;
22

3-
import dev.felnull.pointed.data.RankRow;
4-
import dev.felnull.pointed.database.api.PointService;
5-
import dev.felnull.pointed.util.Util;
3+
import dev.felnull.pointed.core.database.data.RankRow;
4+
import dev.felnull.pointed.core.database.api.PointService;
5+
import dev.felnull.pointed.core.util.Util;
66
import org.bukkit.Bukkit;
77
import org.bukkit.OfflinePlayer;
88
import org.bukkit.command.Command;
@@ -11,7 +11,6 @@
1111
import org.bukkit.command.TabCompleter;
1212
import org.bukkit.plugin.Plugin;
1313

14-
import java.time.DayOfWeek;
1514
import java.time.LocalDate;
1615
import java.time.ZoneId;
1716
import java.util.List;

src/main/java/dev/felnull/pointed/database/Db.java renamed to src/main/java/dev/felnull/pointed/core/database/Db.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package dev.felnull.pointed.database;
1+
package dev.felnull.pointed.core.database;
22

33
import com.zaxxer.hikari.HikariConfig;
44
import com.zaxxer.hikari.HikariDataSource;

src/main/java/dev/felnull/pointed/database/api/Names.java renamed to src/main/java/dev/felnull/pointed/core/database/Names.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package dev.felnull.pointed.database.api;
1+
package dev.felnull.pointed.core.database;
22

33
public final class Names {
44
private static String PREFIX = "";

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

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
package dev.felnull.pointed.database;
2-
3-
import dev.felnull.pointed.database.api.Names;
1+
package dev.felnull.pointed.core.database;
42

53
import java.sql.*;
64
import java.util.Arrays;
@@ -63,6 +61,14 @@ public static void initTables() {
6361
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS " + Names.t("point_ledger") + " (" +
6462
" id BIGINT AUTO_INCREMENT PRIMARY KEY" +
6563
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
64+
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");
71+
6672
// ========== 2) 不足カラムを追加 ==========
6773

6874
// subjects
@@ -110,6 +116,12 @@ public static void initTables() {
110116
addColumnIfNotExists(conn, "point_ledger", "ref_id", "VARCHAR(64)");
111117
addColumnIfNotExists(conn, "point_ledger", "created_at", "TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP");
112118

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+
113125
// ========== 3) インデックス・制約 ==========
114126

115127
ensureUniqueIndex(conn, "subjects", "uniq_subject_key", new String[]{"type","subject_key"});
@@ -141,6 +153,14 @@ public static void initTables() {
141153
ensureForeignKey(conn, "point_ledger", "fk_pl_acc",
142154
"account_id", "accounts", "id", "CASCADE", "CASCADE");
143155

156+
// subjects(id) へのFK。subjects 削除時に team_meta も自動削除
157+
ensureForeignKey(conn, "team_meta", "fk_tm_subject",
158+
"subject_id", "subjects", "id", "CASCADE", "CASCADE");
159+
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+
144164
LOGGER.info("[Pointed] テーブル初期化完了!");
145165

146166
} catch (SQLException e) {

src/main/java/dev/felnull/pointed/database/api/PointService.java renamed to src/main/java/dev/felnull/pointed/core/database/api/PointService.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
package dev.felnull.pointed.database.api;
1+
package dev.felnull.pointed.core.database.api;
22

3-
import dev.felnull.pointed.data.RankRow;
4-
5-
import java.time.LocalDate;
6-
import java.util.List;
7-
import java.util.UUID;
3+
import dev.felnull.pointed.core.database.data.RankRow;
84

95
public interface PointService {
106

@@ -27,4 +23,10 @@ public interface PointService {
2723
java.util.List<RankRow> getDailyTop(String subjectType, String scope, java.time.LocalDate day, int limit);
2824
java.util.List<RankRow> getWeeklyTop(String subjectType, String scope, java.time.LocalDate startInclusive, java.time.LocalDate endInclusive, int limit);
2925
java.util.List<RankRow> getGlobalTop(String subjectType, String scope, int limit);
26+
27+
//指定 scope にある subject の口座とポイント履歴を削除(subjects は残す)
28+
boolean deleteSubjectInScope(String subjectType, String subjectKey, String scope);
29+
30+
//すべての scope で subject を完全削除(accounts/履歴を消し、subjects も削除
31+
boolean deleteSubjectEverywhere(String subjectType, String subjectKey);
3032
}

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

Lines changed: 93 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
package dev.felnull.pointed.database.api;
1+
package dev.felnull.pointed.core.database.api;
22

3-
import dev.felnull.pointed.data.RankRow;
3+
import dev.felnull.pointed.core.database.data.RankRow;
4+
import dev.felnull.pointed.core.database.Names;
45

56
import javax.sql.DataSource;
67
import java.sql.*;
78
import java.time.LocalDate;
89
import java.time.ZoneId;
910
import java.util.ArrayList;
1011
import java.util.List;
11-
import java.util.UUID;
1212

1313
public final class PointServiceImpl implements PointService {
1414
private final DataSource ds;
@@ -333,4 +333,94 @@ public List<RankRow> getGlobalTop(String subjectType, String scope, int limit) {
333333
} catch (SQLException e) { throw new RuntimeException(e); }
334334
return list;
335335
}
336+
337+
@Override
338+
public boolean deleteSubjectInScope(String subjectType, String subjectKey, String scope) {
339+
String qAccountId = "SELECT a.id FROM " + Names.t("accounts") + " a " +
340+
"JOIN " + Names.t("subjects") + " s ON s.id=a.subject_id " +
341+
"WHERE a.scope=? AND s.type=? AND s.subject_key=?";
342+
try (Connection con = ds.getConnection()) {
343+
con.setAutoCommit(false);
344+
try (PreparedStatement ps = con.prepareStatement(qAccountId)) {
345+
ps.setString(1, scope);
346+
ps.setString(2, subjectType);
347+
ps.setString(3, subjectKey);
348+
try (ResultSet rs = ps.executeQuery()) {
349+
if (!rs.next()) { con.commit(); return false; }
350+
long accountId = rs.getLong(1);
351+
352+
try (PreparedStatement d1 = con.prepareStatement(
353+
"DELETE FROM " + Names.t("account_daily") + " WHERE account_id=?");
354+
PreparedStatement d2 = con.prepareStatement(
355+
"DELETE FROM " + Names.t("account_balances") + " WHERE account_id=?");
356+
PreparedStatement d3 = con.prepareStatement(
357+
"DELETE FROM " + Names.t("accounts") + " WHERE id=?")) {
358+
d1.setLong(1, accountId); d1.executeUpdate();
359+
d2.setLong(1, accountId); d2.executeUpdate();
360+
d3.setLong(1, accountId); int del = d3.executeUpdate();
361+
con.commit();
362+
return del > 0;
363+
}
364+
}
365+
} catch (SQLException e) { con.rollback(); throw e; }
366+
finally { con.setAutoCommit(true); }
367+
} catch (SQLException e) {
368+
throw new RuntimeException(e);
369+
}
370+
}
371+
372+
@Override
373+
public boolean deleteSubjectEverywhere(String subjectType, String subjectKey) {
374+
try (Connection con = ds.getConnection()) {
375+
con.setAutoCommit(false);
376+
try {
377+
// 1) subject をロック取得
378+
Long subjectId = null;
379+
try (PreparedStatement ps = con.prepareStatement(
380+
"SELECT id FROM " + Names.t("subjects") + " WHERE type=? AND subject_key=? FOR UPDATE")) {
381+
ps.setString(1, subjectType);
382+
ps.setString(2, subjectKey);
383+
try (ResultSet rs = ps.executeQuery()) {
384+
if (rs.next()) subjectId = rs.getLong(1);
385+
}
386+
}
387+
if (subjectId == null) { con.commit(); return false; }
388+
389+
// 2) すべての account(履歴) を列挙し依存削除
390+
try (PreparedStatement ps = con.prepareStatement(
391+
"SELECT id FROM " + Names.t("accounts") + " WHERE subject_id=?")) {
392+
ps.setLong(1, subjectId);
393+
try (ResultSet rs = ps.executeQuery()) {
394+
while (rs.next()) {
395+
long accountId = rs.getLong(1);
396+
try (PreparedStatement d1 = con.prepareStatement(
397+
"DELETE FROM " + Names.t("account_daily") + " WHERE account_id=?");
398+
PreparedStatement d2 = con.prepareStatement(
399+
"DELETE FROM " + Names.t("account_balances") + " WHERE account_id=?")) {
400+
d1.setLong(1, accountId); d1.executeUpdate();
401+
d2.setLong(1, accountId); d2.executeUpdate();
402+
}
403+
}
404+
}
405+
}
406+
try (PreparedStatement ps = con.prepareStatement(
407+
"DELETE FROM " + Names.t("accounts") + " WHERE subject_id=?")) {
408+
ps.setLong(1, subjectId);
409+
ps.executeUpdate();
410+
}
411+
412+
// 3) subjects を削除(※ team_meta は FK CASCADE 前提)
413+
try (PreparedStatement ps = con.prepareStatement(
414+
"DELETE FROM " + Names.t("subjects") + " WHERE id=?")) {
415+
ps.setLong(1, subjectId);
416+
int del = ps.executeUpdate();
417+
con.commit();
418+
return del > 0;
419+
}
420+
} catch (SQLException e) { con.rollback(); throw e; }
421+
finally { con.setAutoCommit(true); }
422+
} catch (SQLException e) {
423+
throw new RuntimeException(e);
424+
}
425+
}
336426
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package dev.felnull.pointed.core.database.api;
2+
3+
public enum SubjectType {
4+
PLAYER,TEAM,SYSTEM;
5+
}

src/main/java/dev/felnull/pointed/data/RankRow.java renamed to src/main/java/dev/felnull/pointed/core/database/data/RankRow.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
package dev.felnull.pointed.data;
2-
3-
import java.util.UUID;
1+
package dev.felnull.pointed.core.database.data;
42

53
public final class RankRow {
64
public final String subjectType;

src/main/java/dev/felnull/pointed/gui/PointedGUIPage.java renamed to src/main/java/dev/felnull/pointed/core/gui/PointedGUIPage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package dev.felnull.pointed.gui;
1+
package dev.felnull.pointed.core.gui;
22

33
import dev.felnull.bettergui.core.GUIPage;
44
import dev.felnull.bettergui.core.InventoryGUI;

0 commit comments

Comments
 (0)