From 9bbc35889e237d29c08a052351dbabf49d78984b Mon Sep 17 00:00:00 2001 From: miyabi0333 <57523862+Arisa9006@users.noreply.github.com> Date: Tue, 2 Sep 2025 02:59:29 +0900 Subject: [PATCH 1/2] =?UTF-8?q?1.15.2=E7=84=A1=E8=A6=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 2 + src/main/java/dev/felnull/DataIO/DataIO.java | 2 +- .../dev/felnull/DataIO/TableInitializer.java | 35 ++++++- .../java/dev/felnull/api/EcpImporter.java | 91 +++++++++++++++++-- src/main/resources/plugin.yml | 2 + 5 files changed, 120 insertions(+), 12 deletions(-) diff --git a/readme.md b/readme.md index 11409fa..ef0f48d 100644 --- a/readme.md +++ b/readme.md @@ -53,3 +53,5 @@ BetterStorageは外部プラグインから `GroupData`, `InventoryData` など MIT License(予定) +注意EnderChestPlusのimportはEnderChestPlus側の不具合で、セーブして一定時間が経過するまでデータが保存されないため使えなくした後にImportすることをお勧めします!! + diff --git a/src/main/java/dev/felnull/DataIO/DataIO.java b/src/main/java/dev/felnull/DataIO/DataIO.java index 594b1bd..d8d1c29 100644 --- a/src/main/java/dev/felnull/DataIO/DataIO.java +++ b/src/main/java/dev/felnull/DataIO/DataIO.java @@ -607,7 +607,7 @@ public static InventoryData getLatestInventoryData(UUID groupUUID, String pageId if (invData != null) { // データが見つかればそのまま返す - Bukkit.getLogger().info("Loaded latest inventory data for pageId: " + pageId); + //Bukkit.getLogger().info("Loaded latest inventory data for pageId: " + pageId); return invData; } else { // pageIdが見つからない場合 diff --git a/src/main/java/dev/felnull/DataIO/TableInitializer.java b/src/main/java/dev/felnull/DataIO/TableInitializer.java index 5b9cce3..a90370a 100644 --- a/src/main/java/dev/felnull/DataIO/TableInitializer.java +++ b/src/main/java/dev/felnull/DataIO/TableInitializer.java @@ -23,10 +23,11 @@ public static void initTables() { "group_name VARCHAR(255) UNIQUE NOT NULL, " + // 論理名(内部参照に使う) "display_name VARCHAR(255), " + // 表示名(ユーザー向け) "is_private BOOLEAN NOT NULL, " + // 非公開グループかどうか - "owner_plugin VARCHAR(255)" + // このグループを扱うプラグイン名 + "owner_plugin VARCHAR(255), " + // このグループを扱うプラグイン名 ");" ); + // グループに所属するメンバー情報 stmt.executeUpdate( "CREATE TABLE IF NOT EXISTS group_member_table (" + @@ -182,6 +183,17 @@ public static void initTables() { ");" ); + //グループデータの削除履歴 + stmt.executeUpdate( + "CREATE TABLE IF NOT EXISTS deleted_group_history (" + + "group_uuid VARCHAR(255) NOT NULL, " + // 削除対象のグループUUID + "group_name VARCHAR(255), " + // グループの名前(表示用) + "deletion_timestamp DATETIME NOT NULL, " + // 削除された時刻 + "executed_by VARCHAR(64), " + // 実行者(UUID or 名前) + "PRIMARY KEY (group_uuid, deletion_timestamp)" + // 主キー制約 + ");" + ); + LOGGER.info("[BetterStorage] 全テーブルの初期化が完了しました。"); } catch (SQLException e) { @@ -271,5 +283,26 @@ private static String getTableNameFromIndex(String indexName) { } } + /** + * 指定したテーブルに指定カラムが存在しない場合、自動で追加するにゃ。 + * + * @param conn DB接続 + * @param tableName 対象テーブル名(例: "group_table") + * @param columnName 追加したいカラム名(例: "ecp_imported") + * @param columnDefinition カラムの定義(例: "BOOLEAN NOT NULL DEFAULT FALSE") + */ + private static void addColumnIfNotExists(Connection conn, String tableName, String columnName, String columnDefinition) { + try (ResultSet rs = conn.getMetaData().getColumns(null, null, tableName, columnName)) { + if (!rs.next()) { + try (Statement stmt = conn.createStatement()) { + stmt.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + columnName + " " + columnDefinition); + LOGGER.info("[BetterStorage] " + tableName + " にカラム '" + columnName + "' を追加したにゃ!"); + } + } + } catch (SQLException e) { + LOGGER.warning("[BetterStorage] " + tableName + " のカラム '" + columnName + "' チェック中にエラーが起きたにゃ: " + e.getMessage()); + } + } + } \ No newline at end of file diff --git a/src/main/java/dev/felnull/api/EcpImporter.java b/src/main/java/dev/felnull/api/EcpImporter.java index eba210f..a913a8f 100644 --- a/src/main/java/dev/felnull/api/EcpImporter.java +++ b/src/main/java/dev/felnull/api/EcpImporter.java @@ -1,56 +1,127 @@ package dev.felnull.api; +import dev.felnull.BetterStorage; import dev.felnull.Data.GroupPermENUM; import dev.felnull.Data.InventoryData; import dev.felnull.Data.StorageData; +import jp.azisaba.lgw.ecplus.EnderChestPlus; +import jp.azisaba.lgw.ecplus.InventoryLoader; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.*; - public class EcpImporter { public static StorageData importFromUUID(UUID playerUUID, UUID groupUUID) { + try (Connection conn = BetterStorage.BSPlugin.getDatabaseManager().getConnection(); + PreparedStatement ps = conn.prepareStatement( + "SELECT ecp_imported FROM group_table WHERE group_uuid = ?")) { + ps.setString(1, groupUUID.toString()); + try (ResultSet rs = ps.executeQuery()) { + if (rs.next() && rs.getBoolean("ecp_imported")) { + Bukkit.getLogger().warning("[BetterStorage] このグループはすでにECPからインポートされていますにゃ!"); + return null; + } + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + // EnderChestPlusのファイルパス File file = new File(Bukkit.getPluginManager().getPlugin("BetterStorage") .getDataFolder().getParent(), "EnderChestPlus/Inventories/" + playerUUID + ".yml"); if (!file.exists()) return null; - YamlConfiguration config = YamlConfiguration.loadConfiguration(file); + YamlConfiguration config; + try { + config = YamlConfiguration.loadConfiguration(file); + } catch (Exception ex) { + Bukkit.getLogger().warning("[BetterStorage] ECPインポート時にファイルの読み込みに失敗したにゃ: " + ex.getMessage()); + return null; + } + + Plugin plugin = Bukkit.getPluginManager().getPlugin("EnderChestPlus"); + + if (plugin != null && plugin.isEnabled() && plugin instanceof EnderChestPlus) { + EnderChestPlus ecp = (EnderChestPlus) plugin; + InventoryLoader loader = ecp.getLoader(); + + if (loader != null) { + loader.saveAllInventoryData(false); // false = 非同期ではない + Bukkit.getLogger().info("[BetterStorage] EnderChestPlus のセーブを実行したにゃ"); + } else { + Bukkit.getLogger().warning("[BetterStorage] EnderChestPlus の loader が null だったにゃ"); + } + } + // バンク権限(ストレージ全体にアクセスするための最低限の権限) Set bankPerms = new HashSet<>(); bankPerms.add(GroupPermENUM.MEMBER.getPermName()); + + // ページID → InventoryData Map inventoryMap = new HashMap<>(); for (String pageId : config.getKeys(false)) { ConfigurationSection pageSection = config.getConfigurationSection(pageId); + if (pageSection == null) continue; Map itemMap = new HashMap<>(); for (String slotKey : pageSection.getKeys(false)) { - int slot = Integer.parseInt(slotKey); - ItemStack item = pageSection.getItemStack(slotKey); - if (item != null && item.getType() != Material.AIR) { - itemMap.put(slot, item); + try { + int slot = Integer.parseInt(slotKey); + if (slot < 0 || slot >= 57) continue; // スロット番号チェック追加 + ItemStack item = pageSection.getItemStack(slotKey); + if (item != null && item.getType() != Material.AIR) { + itemMap.put(slot, item); + } + } catch (NumberFormatException ex) { + continue; // 無効なスロットキーはスキップ } } + // ページ権限 Set pagePerms = new HashSet<>(); pagePerms.add(GroupPermENUM.MEMBER.getPermName()); - InventoryData inv = new InventoryData("ECPページ #" + pageId, 57, pagePerms, itemMap); - inv.addUserTag("ecp-imported"); + int displayPageId; + try { + displayPageId = Integer.parseInt(pageId); + } catch (NumberFormatException ex) { + displayPageId = 0; // fallback + } + + // InventoryDataを作成 + InventoryData inv = new InventoryData("ECPページ #" + (displayPageId + 1), 57, pagePerms, itemMap); - inventoryMap.put(pageId, inv); + inventoryMap.put(pageId, inv); // 内部IDはそのまま(ズレ防止) } + // ストレージデータ構築 StorageData storageData = new StorageData(bankPerms, inventoryMap, 0.0); storageData.groupUUID = groupUUID; + try (Connection conn = BetterStorage.BSPlugin.getDatabaseManager().getConnection(); + PreparedStatement ps = conn.prepareStatement( + "UPDATE group_table SET ecp_imported = TRUE WHERE group_uuid = ?")) { + ps.setString(1, groupUUID.toString()); + ps.executeUpdate(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + return storageData; } -} \ No newline at end of file + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 89c8971..f4685a6 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -4,6 +4,8 @@ main: dev.felnull.BetterStorage api-version: '1.16' depend: - BetterGUI +softdepend: + - EnderChestPlus commands: bstorage: description: BetterStorageの管理用コマンド From 120045d5e6d14c2c29875489fea9fcb964cc3e29 Mon Sep 17 00:00:00 2001 From: miyabi0333 <57523862+Arisa9006@users.noreply.github.com> Date: Tue, 2 Sep 2025 03:05:36 +0900 Subject: [PATCH 2/2] Update pom.xml --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index 24bcd13..1e056e3 100644 --- a/pom.xml +++ b/pom.xml @@ -76,6 +76,12 @@ 1.16.5-R0.1-SNAPSHOT provided + + net.azisaba + EnderChestPlus + 1.3.1 + provided + dev.felnull BetterGUI