Skip to content

Commit d5db77c

Browse files
committed
サマリーを利用してアイテムの入出力を部分一致でファイル出力する機能を追加+バックアップ削除ポリシー適用
1 parent 87be3fd commit d5db77c

File tree

2 files changed

+108
-3
lines changed

2 files changed

+108
-3
lines changed

src/main/java/dev/felnull/commands/BetterStorageCommand.java

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,17 @@
1313
import org.bukkit.command.CommandExecutor;
1414
import org.bukkit.command.CommandSender;
1515
import org.bukkit.command.TabCompleter;
16+
import org.bukkit.configuration.file.YamlConfiguration;
1617
import org.bukkit.scheduler.BukkitRunnable;
1718
import org.jetbrains.annotations.NotNull;
1819
import org.jetbrains.annotations.Nullable;
1920

21+
import java.io.File;
22+
import java.io.IOException;
23+
import java.sql.Connection;
24+
import java.sql.PreparedStatement;
25+
import java.sql.ResultSet;
26+
import java.sql.SQLException;
2027
import java.time.LocalDateTime;
2128
import java.time.format.DateTimeFormatter;
2229
import java.time.format.DateTimeParseException;
@@ -232,6 +239,86 @@ public void run() {
232239
}.runTaskAsynchronously(BetterStorage.BSPlugin);
233240
return true;
234241
}
242+
case "exportlog": {
243+
if (args.length < 3) {
244+
sender.sendMessage("引数が不足しています。/bstorage exportlog <playerName> <display_name_plain>");
245+
return true;
246+
}
247+
248+
String playerName = args[1];
249+
String displayNamePlain = args[2];
250+
251+
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(playerName);
252+
if (offlinePlayer == null || offlinePlayer.getUniqueId() == null) {
253+
sender.sendMessage("プレイヤーが見つかりませんでした。");
254+
return true;
255+
}
256+
257+
UUID playerUUID = offlinePlayer.getUniqueId();
258+
259+
sender.sendMessage("操作履歴を出力中...");
260+
261+
new BukkitRunnable() {
262+
@Override
263+
public void run() {
264+
List<Map<String, Object>> records = new ArrayList<>();
265+
String query =
266+
"SELECT date, group_uuid, plugin_name, page_id, material, display_name, operation_type, total_amount " +
267+
"FROM inventory_item_summary " +
268+
"WHERE player_uuid = ? AND display_name_plain = ? " +
269+
"ORDER BY date ASC";
270+
271+
try (Connection conn = db.getConnection();
272+
PreparedStatement ps = conn.prepareStatement(query)) {
273+
274+
ps.setString(1, playerUUID.toString());
275+
ps.setString(2, displayNamePlain);
276+
277+
try (ResultSet rs = ps.executeQuery()) {
278+
while (rs.next()) {
279+
Map<String, Object> entry = new LinkedHashMap<>();
280+
entry.put("date", rs.getDate("date").toString());
281+
entry.put("group_uuid", rs.getString("group_uuid"));
282+
entry.put("plugin_name", rs.getString("plugin_name"));
283+
entry.put("page_id", rs.getString("page_id"));
284+
entry.put("material", rs.getString("material"));
285+
entry.put("display_name", rs.getString("display_name"));
286+
entry.put("operation_type", rs.getString("operation_type"));
287+
entry.put("total_amount", rs.getInt("total_amount"));
288+
records.add(entry);
289+
}
290+
}
291+
} catch (SQLException e) {
292+
Bukkit.getScheduler().runTask(BetterStorage.BSPlugin,
293+
() -> sender.sendMessage("データベースエラー: " + e.getMessage()));
294+
return;
295+
}
296+
297+
if (records.isEmpty()) {
298+
Bukkit.getScheduler().runTask(BetterStorage.BSPlugin,
299+
() -> sender.sendMessage("該当するログが見つかりませんでした。"));
300+
return;
301+
}
302+
303+
// ファイル出力
304+
File exportFile = new File(BetterStorage.BSPlugin.getDataFolder(), "logs/" + playerName + "_" + displayNamePlain + ".yml");
305+
exportFile.getParentFile().mkdirs();
306+
YamlConfiguration config = new YamlConfiguration();
307+
config.set("records", records);
308+
309+
try {
310+
config.save(exportFile);
311+
Bukkit.getScheduler().runTask(BetterStorage.BSPlugin,
312+
() -> sender.sendMessage("操作ログを " + exportFile.getName() + " に保存しました。"));
313+
} catch (IOException e) {
314+
Bukkit.getScheduler().runTask(BetterStorage.BSPlugin,
315+
() -> sender.sendMessage("ファイル保存に失敗しました: " + e.getMessage()));
316+
}
317+
}
318+
}.runTaskAsynchronously(BetterStorage.BSPlugin);
319+
320+
return true;
321+
}
235322
default:
236323
sender.sendMessage("使用可能なコマンド:");
237324
sender.sendMessage("/bstorage rollback <groupName/playerName> <yyyy-MM-dd HH:mm:ss> - 指定した時点に巻き戻す");
@@ -266,7 +353,7 @@ public void run() {
266353
List<String> suggestions = new ArrayList<>();
267354

268355
if (args.length == 1) {
269-
suggestions.addAll(Arrays.asList("rollback", "list", "diff", "difflist", "help", "backup"));
356+
suggestions.addAll(Arrays.asList("rollback", "list", "diff", "difflist", "help", "backup", "exportlog"));
270357
} else if (args.length == 2 && Arrays.asList("rollback", "list", "diff", "difflist", "backup").contains(args[0].toLowerCase())) {
271358
// グループ名とプレイヤー名だけを対象にする
272359
suggestions.addAll(GroupManager.getAllGroupNames());

src/main/java/dev/felnull/task/LogCleanerTask.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,15 @@ public void run() {
2828

2929
private void cleanOldLogs() {
3030
try (Connection conn = db.getConnection()) {
31-
int deleted1 = 0, deleted2 = 0, deleted3 = 0;
31+
int deleted1 = 0, deleted2 = 0, deleted3 = 0, deleted4 = 0;
3232

33+
// 操作ログ: 半年保持
3334
try (PreparedStatement ps = conn.prepareStatement(
3435
"DELETE FROM inventory_item_log WHERE timestamp < NOW() - INTERVAL 6 MONTH")) {
3536
deleted1 = ps.executeUpdate();
3637
}
3738

39+
// 差分ログ: 30日保持
3840
try (PreparedStatement ps = conn.prepareStatement(
3941
"DELETE FROM diff_log_inventory_items WHERE timestamp < NOW() - INTERVAL 30 DAY")) {
4042
deleted2 = ps.executeUpdate();
@@ -45,7 +47,23 @@ private void cleanOldLogs() {
4547
deleted3 = ps.executeUpdate();
4648
}
4749

48-
Bukkit.getLogger().info("[BetterStorage] 古いログ削除: " + deleted1 + "件 (rollback), " + deleted2 + "件 (diff_items), " + deleted3 + "件 (diff_tags)");
50+
// サマリーログ: 1年保持
51+
try (PreparedStatement ps = conn.prepareStatement(
52+
"DELETE FROM inventory_item_summary WHERE date < CURDATE() - INTERVAL 1 YEAR")) {
53+
deleted4 = ps.executeUpdate();
54+
}
55+
int deleted5 = 0;
56+
try (PreparedStatement ps = conn.prepareStatement(
57+
"DELETE FROM rollback_log WHERE timestamp < NOW() - INTERVAL 1 YEAR")) {
58+
deleted5 = ps.executeUpdate();
59+
}
60+
61+
Bukkit.getLogger().info("[BetterStorage] 古いログ削除: " +
62+
deleted1 + "件 (item_log), " +
63+
deleted2 + "件 (diff_items), " +
64+
deleted3 + "件 (diff_tags), " +
65+
deleted4 + "件 (summary), " +
66+
deleted5 + "件 (rollback)");
4967
} catch (SQLException e) {
5068
Bukkit.getLogger().warning("[BetterStorage] ログクリーンアップに失敗: " + e.getMessage());
5169
}

0 commit comments

Comments
 (0)