修复滚动备份日志追踪+告示牌编辑权限控制

This commit is contained in:
2026-07-13 16:51:35 +08:00
parent a3c8cec664
commit abdd3ad7c7
3 changed files with 59 additions and 48 deletions
@@ -19,6 +19,7 @@ import org.bukkit.event.block.BlockBurnEvent;
import org.bukkit.event.block.BlockIgniteEvent; import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockSpreadEvent; import org.bukkit.event.block.BlockSpreadEvent;
import org.bukkit.event.block.BlockGrowEvent; import org.bukkit.event.block.BlockGrowEvent;
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Animals; import org.bukkit.entity.Animals;
import org.bukkit.event.player.PlayerInteractAtEntityEvent; import org.bukkit.event.player.PlayerInteractAtEntityEvent;
@@ -4986,6 +4987,25 @@ public class AreaProtection implements Listener {
} }
} }
@EventHandler
public void onSignChange(SignChangeEvent e) {
Player p = e.getPlayer();
if (p.hasPermission("sdf1.admin")) return; // 管理员跳过
AreaConfig ac = getArea(
p.getWorld().getName(),
e.getBlock().getX(),
e.getBlock().getY(),
e.getBlock().getZ());
if (ac == null) return;
if (p.getName().equalsIgnoreCase(ac.owner)) return; // 领地主免检
if (isAreaAdmin(p)) return; // 插件管理员免检
if (getEffectiveDeny(p, ac, "denyBlockPlace")) {
e.setCancelled(true);
p.sendMessage("§c§l[区域防护] §f禁止编辑告示牌");
}
}
@EventHandler @EventHandler
public void onDamage(EntityDamageEvent e) { public void onDamage(EntityDamageEvent e) {
+21 -31
View File
@@ -2327,17 +2327,11 @@ public class DatabaseManager {
String extra, int level, String extra, int level,
double experience) { double experience) {
try { try {
PreparedStatement ps = try (PreparedStatement ps = db.prepareStatement(
db.prepareStatement( "INSERT INTO inv_backup_auto "
"INSERT INTO inv_backup_auto" + "(player_name, contents_b64, armor_b64, "
+ " (player_name, " + "extra_b64, level, experience, save_time) "
+ "contents_b64, " + "VALUES (?,?,?,?,?,?,?)")) {
+ "armor_b64, "
+ "extra_b64, "
+ "level, "
+ "experience, "
+ "save_time) "
+ "VALUES (?,?,?,?,?,?,?)");
ps.setString(1, name); ps.setString(1, name);
ps.setString(2, contents); ps.setString(2, contents);
ps.setString(3, armor); ps.setString(3, armor);
@@ -2346,23 +2340,19 @@ public class DatabaseManager {
ps.setDouble(6, experience); ps.setDouble(6, experience);
ps.setLong(7, System.currentTimeMillis()); ps.setLong(7, System.currentTimeMillis());
ps.executeUpdate(); ps.executeUpdate();
ps.close(); }
// 仅保留最近 3 份,删除该玩家更早的备份(先查后删,避免 LIMIT 子查询被优化) // 保留最近 3 份 —— 先查最新 3 个 ID,再删其余
try { List<Integer> keep = new ArrayList<>();
PreparedStatement sel = try (PreparedStatement sel = db.prepareStatement(
db.prepareStatement(
"SELECT id FROM inv_backup_auto " "SELECT id FROM inv_backup_auto "
+ "WHERE player_name=? " + "WHERE player_name=? "
+ "ORDER BY save_time DESC LIMIT 3"); + "ORDER BY save_time DESC LIMIT 3")) {
sel.setString(1, name); sel.setString(1, name);
ResultSet rs = sel.executeQuery(); try (ResultSet rs = sel.executeQuery()) {
List<Integer> keep = new ArrayList<>(); while (rs.next()) keep.add(rs.getInt("id"));
while (rs.next()) { }
keep.add(rs.getInt("id"));
} }
rs.close();
sel.close();
if (keep.size() == 3) { if (keep.size() == 3) {
StringBuilder in = new StringBuilder(); StringBuilder in = new StringBuilder();
@@ -2370,19 +2360,19 @@ public class DatabaseManager {
if (i > 0) in.append(","); if (i > 0) in.append(",");
in.append(keep.get(i)); in.append(keep.get(i));
} }
PreparedStatement del = db.prepareStatement( try (PreparedStatement del = db.prepareStatement(
"DELETE FROM inv_backup_auto " "DELETE FROM inv_backup_auto "
+ "WHERE player_name=? AND id NOT IN (" + "WHERE player_name=? AND id NOT IN ("
+ in.toString() + ")"); + in + ")")) {
del.setString(1, name); del.setString(1, name);
del.executeUpdate(); int removed = del.executeUpdate();
del.close(); if (removed > 0) {
logger.info("[自动备份] " + name + " 滚动清理 " + removed + " 份旧备份");
}
}
} }
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); logger.warning("[自动备份] 保存/清理失败 (" + name + "): " + e.getMessage());
}
} catch (SQLException e) {
e.printStackTrace();
} }
} }
@@ -75,5 +75,6 @@ public class InventoryAutoBackup {
plugin.getDb().saveAutoBackup( plugin.getDb().saveAutoBackup(
name, contentsB64, armorB64, extraB64, name, contentsB64, armorB64, extraB64,
level, experience); level, experience);
plugin.getLogger().info("[自动备份] " + name + " 背包已备份");
} }
} }