Skip to content

Commit c2c190d

Browse files
committed
feat:togglereward command
1 parent f1d44f3 commit c2c190d

File tree

6 files changed

+79
-42
lines changed

6 files changed

+79
-42
lines changed

Readme.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
**LICENSE:** [GPL-3.0](LICENSE)<br>
66

77
## 概要
8-
シンプルだけど使いやすいを目指す複数ポイント対応のポイント管理プラグイン。
9-
直感的なGUI操作と、詳細なログ記録、SE(効果音)による演出を兼ね備えています。
8+
シンプルだけど使いやすいを目指す複数ポイント対応のポイント管理プラグイン。
109

1110
## コマンド
1211
`/spp <subcommand>` 管理者用のコマンド
@@ -32,6 +31,8 @@
3231
指定したポイントのランキング(上位10名)を**全体チャット**に表示します。盛り上げたい時に!
3332
* `toggleranking <point>`
3433
指定したポイントのランキング表示・報酬ショップを有効/無効にします。
34+
* `togglereward <point>`
35+
指定したポイントの報酬ショップを有効/無効にします。
3536
* `reload`
3637
configや報酬、ポイントデータのキャッシュをリロードします。
3738
* `help`
@@ -61,7 +62,7 @@ commands:
6162
```
6263

6364
### ログ記録
64-
`logs.csv` に記録します。
65+
`yyyy/mm/dd.log` に記録します。
6566

6667
***
6768
teamに関するコマンドがありますが未実装です!

src/main/java/net/azisaba/simplepoint/GUIManager.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.bukkit.Bukkit;
44
import org.bukkit.Material;
55
import org.bukkit.Sound;
6+
import org.bukkit.command.CommandSender;
67
import org.bukkit.configuration.file.FileConfiguration;
78
import org.bukkit.entity.Player;
89
import org.bukkit.event.EventHandler;
@@ -19,7 +20,6 @@
1920
public class GUIManager implements Listener {
2021
private final SimplePointPlugin plugin;
2122
private final Map<UUID, SettingSession> sessions = new HashMap<>();
22-
// ✨ 現在どのプレイヤーがどのポイントIDのGUIを開いているかを追跡
2323
private final Map<UUID, String> activeGuiId = new HashMap<>();
2424

2525
public GUIManager(SimplePointPlugin plugin) {
@@ -36,7 +36,6 @@ public void openRewardGUI(Player player, String pointName, boolean isAdmin) {
3636
String title = displayName + (isAdmin ? "§r:編集" : "§r:受け取り");
3737
Inventory gui = Bukkit.createInventory(null, 54, title);
3838

39-
// ✨ 追跡用マップに保存(タイトル文字列に頼らずにIDを特定するため)
4039
activeGuiId.put(player.getUniqueId(), pointName);
4140

4241
FileConfiguration config = plugin.getRewardManager().getRewardConfig(pointName);
@@ -99,8 +98,6 @@ public void onInventoryClick(InventoryClickEvent event) {
9998
if (!(event.getWhoClicked() instanceof Player)) return;
10099
Player player = (Player) event.getWhoClicked();
101100
String title = event.getView().getTitle();
102-
103-
// ✨ メモリから開いているポイントIDを取得
104101
String pId = activeGuiId.get(player.getUniqueId());
105102

106103
if (title.contains(":受け取り")) {
@@ -110,7 +107,6 @@ public void onInventoryClick(InventoryClickEvent event) {
110107
else if (title.contains(":編集")) {
111108
if (event.getRawSlot() < 0 || event.getRawSlot() >= 54) return;
112109
event.setCancelled(true);
113-
114110
if (pId == null) return;
115111

116112
ItemStack cursor = event.getCursor();
@@ -130,7 +126,6 @@ else if (title.startsWith("報酬設定:")) {
130126
}
131127
}
132128

133-
// ✨ インベントリを閉じたら追跡を解除
134129
@EventHandler
135130
public void onInventoryClose(InventoryCloseEvent event) {
136131
activeGuiId.remove(event.getPlayer().getUniqueId());
@@ -204,7 +199,6 @@ else if (slot == 13) {
204199
plugin.getRewardManager().saveReward(s.pointName, s.slot, s.item, s.price, s.stock, s.isPersonal);
205200
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1.0f, 1.0f);
206201
player.closeInventory();
207-
// activeGuiId は InventoryCloseEvent で自動削除される
208202
return;
209203
}
210204
openSettingGUI(player);
@@ -241,14 +235,23 @@ private void handlePurchase(Player player, String pointName, int slot) {
241235
int balance = plugin.getPointManager().getPoint(pointName, player.getUniqueId());
242236

243237
if (balance >= price) {
238+
// ✨ ログ用にアイテム名を取得
239+
ItemStack rewardItem = config.getItemStack(slot + ".item");
240+
String itemName = (rewardItem != null && rewardItem.hasItemMeta() && rewardItem.getItemMeta().hasDisplayName())
241+
? rewardItem.getItemMeta().getDisplayName()
242+
: (rewardItem != null ? rewardItem.getType().toString() : "Unknown Item");
243+
244244
if (isPersonal) {
245245
addPersonalBoughtCount(player, pointName, slot);
246246
} else if (stock > 0) {
247247
plugin.getRewardManager().updateStock(pointName, slot, stock - 1);
248248
}
249249

250250
plugin.getPointManager().addPoint(pointName, player.getUniqueId(), -price);
251-
player.getInventory().addItem(config.getItemStack(slot + ".item").clone());
251+
if (rewardItem != null) player.getInventory().addItem(rewardItem.clone());
252+
253+
// ✨ 購入ログの記録
254+
plugin.getLogManager().logRewardPurchase(player.getName(), pointName, itemName, price);
252255

253256
player.sendMessage("§a購入完了!");
254257
player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1.0f, 1.2f);

src/main/java/net/azisaba/simplepoint/LogManager.java

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,52 +4,57 @@
44
import java.io.FileWriter;
55
import java.io.IOException;
66
import java.io.PrintWriter;
7+
import java.text.SimpleDateFormat;
8+
import java.util.Date;
79

810
public class LogManager {
911
private final SimplePointPlugin plugin;
10-
private final File logFile;
12+
private final File logFolder;
1113

1214
public LogManager(SimplePointPlugin plugin) {
1315
this.plugin = plugin;
14-
this.logFile = new File(plugin.getDataFolder(), "logs.csv");
15-
16-
// ファイルが新規作成された場合、ヘッダーを書き込む
17-
if (!logFile.exists()) {
18-
try {
19-
logFile.createNewFile();
20-
write("timestamp_ms,type,player,target_point,amount_or_slot,info");
21-
} catch (IOException e) {
22-
e.printStackTrace();
23-
}
16+
// 1. データフォルダの中に「logs」フォルダを作成
17+
this.logFolder = new File(plugin.getDataFolder(), "logs");
18+
if (!logFolder.exists()) {
19+
logFolder.mkdirs();
2420
}
2521
}
2622

2723
/**
28-
* 購入ログを記録
24+
* ポイント変更のログを日付別のファイルに記録する
2925
*/
30-
public void logPurchase(String playerName, String pointName, int price, int slot) {
31-
// 形式: タイムスタンプ,種別,プレイヤー,ポイント名,スロット,価格
32-
String message = String.format("%d,PURCHASE,%s,%s,%d,%d",
33-
System.currentTimeMillis(), playerName, pointName, slot, price);
34-
write(message);
35-
}
26+
public void logPointChange(String playerName, String pointId, int amount, String type) {
27+
// 2. 今日の日付でファイル名を作成 (例: 2023-10-27.log)
28+
String fileName = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".log";
29+
File logFile = new File(logFolder, fileName);
3630

37-
/**
38-
* ポイント変動ログを記録
39-
*/
40-
public void logPointChange(String playerName, String pointName, int amount, String type) {
41-
// 形式: タイムスタンプ,種別,プレイヤー,ポイント名,変動量,備考
42-
String message = String.format("%d,POINT_%s,%s,%s,%d,",
43-
System.currentTimeMillis(), type.toUpperCase(), playerName, pointName, amount);
44-
write(message);
31+
// 3. ログの時刻と内容を構築
32+
String timeStamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
33+
// [時刻] プレイヤー名, ポイントID, 増減量, 操作タイプ
34+
String logMessage = String.format("[%s] %s, %s, %d, %s", timeStamp, playerName, pointId, amount, type);
35+
36+
// 4. ファイルに書き込み (trueで追記モード)
37+
try (FileWriter fw = new FileWriter(logFile, true);
38+
PrintWriter pw = new PrintWriter(fw)) {
39+
pw.println(logMessage);
40+
} catch (IOException e) {
41+
plugin.getLogger().severe("ログの書き込みに失敗しました: " + e.getMessage());
42+
}
4543
}
44+
public void logRewardPurchase(String playerName, String pointId, String rewardName, int price) {
45+
String fileName = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ".log";
46+
File logFile = new File(logFolder, fileName);
47+
48+
String timeStamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
49+
// [時刻] [PURCHASE] プレイヤー名, ポイントID, 報酬名, 消費ポイント
50+
String logMessage = String.format("[%s] [PURCHASE] %s, %s, %s, %d pt",
51+
timeStamp, playerName, pointId, rewardName, price);
4652

47-
private void write(String message) {
4853
try (FileWriter fw = new FileWriter(logFile, true);
4954
PrintWriter pw = new PrintWriter(fw)) {
50-
pw.println(message);
55+
pw.println(logMessage);
5156
} catch (IOException e) {
52-
plugin.getLogger().warning("Could not write to CSV log file: " + e.getMessage());
57+
plugin.getLogger().severe("購入ログの書き込みに失敗しました: " + e.getMessage());
5358
}
5459
}
5560
}

src/main/java/net/azisaba/simplepoint/SPPCommand.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,29 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
154154
sender.sendMessage("§a[SimplePoint] 設定と報酬データをリロードしました。");
155155
break;
156156

157+
case "togglereward":
158+
if (args.length < 2) {
159+
sender.sendMessage("§c使用法: /spp togglereward <ID>");
160+
return true;
161+
}
162+
String targetId = args[1];
163+
FileConfiguration rCfg = plugin.getPointManager().getPointConfig(targetId);
164+
if (rCfg == null) {
165+
sender.sendMessage("§cそのIDは存在しません。");
166+
return true;
167+
}
168+
169+
// 現在の状態を反転 (デフォルトは true)
170+
boolean currentRewardState = rCfg.getBoolean("_settings.reward_enabled", true);
171+
boolean nextRewardState = !currentRewardState;
172+
173+
rCfg.set("_settings.reward_enabled", nextRewardState);
174+
plugin.getPointManager().savePointConfig(targetId);
175+
176+
String rDisp = plugin.getPointManager().getDisplayName(targetId);
177+
sender.sendMessage("§a" + rDisp + " §fの報酬画面を " + (nextRewardState ? "§2有効" : "§4無効") + " §fにしました。");
178+
break;
179+
157180
default:
158181
sendHelp(sender);
159182
break;
@@ -217,6 +240,7 @@ private void sendHelp(CommandSender sender) {
217240
sender.sendMessage(" §e§l▶ §fシステム設定");
218241
sender.sendMessage(" §f/spp §fsetreq §7<ID> <Slot> <pt> - 解放条件設定");
219242
sender.sendMessage(" §f/spp §ftoggleranking §7<ID> - ランキング有効化切替");
243+
sender.sendMessage(" §f/spp §ftoggleranking §7<ID> - 報酬受け取り有効化切替");
220244
sender.sendMessage(" §f/spp §fcreateteam §7<チーム名> - チームデータ作成");
221245
sender.sendMessage(" §f/spp §freload §7- コンフィグリロード");
222246
sender.sendMessage("");

src/main/java/net/azisaba/simplepoint/SPPTabCompleter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@ public List<String> onTabComplete(CommandSender sender, Command command, String
2424

2525
// 1. サブコマンドの補完: /spp <ここ>
2626
if (args.length == 1) {
27-
List<String> subCommands = Arrays.asList("create", "add", "remove", "set", "score", "rewardgui", "setreq", "ranking", "toggleranking", "reload", "help");
27+
List<String> subCommands = Arrays.asList("togglereward","create", "add", "remove", "set", "score", "rewardgui", "setreq", "ranking", "toggleranking", "reload", "help");
2828
StringUtil.copyPartialMatches(args[0], subCommands, completions);
2929
}
3030

3131
// 2. 第2引数の補完: /spp <sub> <ここ>
3232
else if (args.length == 2) {
3333
// IDが必要なコマンド群
34-
List<String> needsIdAsSecond = Arrays.asList("add", "remove", "set", "score", "rewardgui", "setreq", "ranking", "toggleranking");
34+
List<String> needsIdAsSecond = Arrays.asList("add", "remove", "set", "score", "rewardgui", "setreq", "ranking", "togglereward","toggleranking");
3535

3636
if (needsIdAsSecond.contains(sub)) {
3737
List<String> pointIds = plugin.getPointManager().getPointNames();

src/main/java/net/azisaba/simplepoint/SPTCommand.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ else if (sub.equals("reward")) {
8181
p.sendMessage("§c現在、" + displayName + " §cの報酬ショップは利用できません。");
8282
return true;
8383
}
84+
if (!cfg.getBoolean("_settings.reward_enabled", true)) {
85+
p.sendMessage("§c現在、" + displayName + " §cの報酬ショップは閉鎖されています。");
86+
return true;
87+
}
8488
// 内部IDを使ってGUIを開く
8589
plugin.getGuiManager().openRewardGUI(p, pointId, false);
8690
return true;

0 commit comments

Comments
 (0)