Remove: 删除误传的radiopack.zip
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -25,7 +25,6 @@ public class ConfigManager {
|
||||
public long smtpVerifyExpire = 0;
|
||||
public long smtpLastSendTime = 0;
|
||||
public String smtpConfiguringPlayer = "";
|
||||
public String updatePlatform = "gh";
|
||||
|
||||
|
||||
public ConfigManager(File dataFolder) {
|
||||
|
||||
@@ -213,18 +213,6 @@ public class DatabaseManager {
|
||||
+ ")");
|
||||
safeAdd(st, "menu_snowball",
|
||||
"INTEGER DEFAULT 1");
|
||||
// ===== 独立任务进度表 =====
|
||||
st.executeUpdate(
|
||||
"CREATE TABLE IF NOT EXISTS "
|
||||
+ "quest_progress ("
|
||||
+ "player_name TEXT NOT NULL, "
|
||||
+ "condition_key TEXT NOT NULL, "
|
||||
+ "progress_value INTEGER DEFAULT 0, "
|
||||
+ "completed INTEGER DEFAULT 0, "
|
||||
+ "PRIMARY KEY (player_name, "
|
||||
+ "condition_key)"
|
||||
+ ")");
|
||||
|
||||
st.close();
|
||||
logger.info("[Sdf1_login] 数据库初始化完成");
|
||||
} catch (Exception e) {
|
||||
@@ -873,8 +861,9 @@ public class DatabaseManager {
|
||||
return list;
|
||||
}
|
||||
|
||||
/*
|
||||
获取指定ID的备份数据
|
||||
|
||||
/**
|
||||
* 获取指定ID的备份数据
|
||||
*/
|
||||
public String[] getInventoryBackupById(
|
||||
int backupId) {
|
||||
|
||||
@@ -5,6 +5,7 @@ import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.*;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import java.io.File;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@@ -41,7 +42,7 @@ public class GUIManager {
|
||||
g.setItem(14, mkItem(Material.EMERALD,
|
||||
"§d§l积分商城"));
|
||||
g.setItem(16, mkItem(Material.CHEST,
|
||||
"§e§l任务中心"));
|
||||
"§e§l新人礼包"));
|
||||
g.setItem(18, mkItem(Material.BOOK,
|
||||
"§6工单系统",
|
||||
"§7提交bug、求助、举报"));
|
||||
@@ -370,7 +371,6 @@ public class GUIManager {
|
||||
"§7双击管理"));
|
||||
slot++;
|
||||
}
|
||||
|
||||
g.setItem(53, mkItem(Material.ARROW, "§7返回"));
|
||||
p.openInventory(g);
|
||||
}
|
||||
@@ -379,279 +379,90 @@ public class GUIManager {
|
||||
Inventory g = Bukkit.createInventory(
|
||||
null, 27, T_TASK_CENTER);
|
||||
fillBg(g);
|
||||
|
||||
QuestTracker qt =
|
||||
plugin.getQuestTracker();
|
||||
String player = p.getName();
|
||||
|
||||
// 新人任务进度
|
||||
List<QuestTracker.QuestFile> newQuests =
|
||||
qt.getQuests("新人任务");
|
||||
int newTotal = newQuests.size();
|
||||
int newDone =
|
||||
qt.getCompletedStageCount(
|
||||
player, newQuests);
|
||||
QuestTracker.QuestFile newCurrent =
|
||||
qt.getCurrentStage(
|
||||
player, newQuests);
|
||||
|
||||
String newInfo = newDone + "/" + newTotal;
|
||||
List<String> newLore = new ArrayList<>();
|
||||
newLore.add("§7进度: §e" + newInfo);
|
||||
if (newCurrent != null) {
|
||||
newLore.add("§7当前: §f"
|
||||
+ newCurrent.displayName);
|
||||
if (newCurrent.hasConditions()) {
|
||||
List<String> unmet =
|
||||
qt.getUnmetConditions(
|
||||
player,
|
||||
newCurrent.conditions);
|
||||
if (!unmet.isEmpty()) {
|
||||
for (String c : unmet) {
|
||||
newLore.add("§7 "
|
||||
+ qt.getProgress(
|
||||
player, c));
|
||||
}
|
||||
} else {
|
||||
newLore.add("§a✓ 条件已满足");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
newLore.add("§a§l全部完成!");
|
||||
}
|
||||
|
||||
g.setItem(10, mkItem(Material.BOOK,
|
||||
"§e§l新人任务 §7["
|
||||
+ newInfo + "]",
|
||||
newLore.toArray(new String[0])));
|
||||
|
||||
// 主线任务
|
||||
List<QuestTracker.QuestFile> mainQuests =
|
||||
qt.getQuests("主线任务");
|
||||
"§e§l新人任务",
|
||||
"§7完成新手阶段获取奖励"));
|
||||
g.setItem(12, mkItem(Material.COMPASS,
|
||||
"§b§l主线任务 §7["
|
||||
+ qt.getCompletedStageCount(
|
||||
player, mainQuests)
|
||||
+ "/" + mainQuests.size()
|
||||
+ "]",
|
||||
"§b§l主线任务",
|
||||
"§7查看主线任务列表"));
|
||||
|
||||
// 支线任务
|
||||
List<QuestTracker.QuestFile> sideQuests =
|
||||
qt.getQuests("支线任务");
|
||||
g.setItem(14, mkItem(Material.PAPER,
|
||||
"§a§l支线任务 §7["
|
||||
+ qt.getCompletedStageCount(
|
||||
player, sideQuests)
|
||||
+ "/" + sideQuests.size()
|
||||
+ "]",
|
||||
"§a§l支线任务",
|
||||
"§7查看支线任务列表"));
|
||||
|
||||
g.setItem(16, mkItem(Material.EMERALD,
|
||||
"§d§l每日签到",
|
||||
"§7签到获取积分"));
|
||||
|
||||
// 打卡上报按钮(slot 21)
|
||||
g.setItem(21, mkItem(
|
||||
Material.EMERALD,
|
||||
"§a§l打卡上报",
|
||||
"§7验证当前阶段任务完成情况",
|
||||
"§7满足条件将自动标记完成"));
|
||||
|
||||
// 返回按钮(slot 26)
|
||||
g.setItem(26, mkItem(
|
||||
Material.ARROW, "§7返回"));
|
||||
g.setItem(22, mkItem(Material.ARROW, "§7返回"));
|
||||
p.openInventory(g);
|
||||
}
|
||||
|
||||
|
||||
public void openGiftStages(Player p) {
|
||||
Inventory g = Bukkit.createInventory(
|
||||
null, 54, T_GIFT_STAGES);
|
||||
null, 27, T_GIFT_STAGES);
|
||||
fillBg(g);
|
||||
|
||||
QuestTracker qt =
|
||||
plugin.getQuestTracker();
|
||||
List<QuestTracker.QuestFile> quests =
|
||||
qt.getQuests("新人任务");
|
||||
int total = quests.size();
|
||||
int completed =
|
||||
qt.getCompletedStageCount(
|
||||
p.getName(), quests);
|
||||
QuestTracker.QuestFile current =
|
||||
qt.getCurrentStage(
|
||||
p.getName(), quests);
|
||||
|
||||
g.setItem(4, mkItem(Material.BOOK,
|
||||
"§e§l新人任务进度",
|
||||
"§7已完成: §e" + completed
|
||||
+ "/" + total,
|
||||
current != null
|
||||
? "§7当前: §f"
|
||||
+ current.displayName
|
||||
: "§a§l全部完成!"));
|
||||
|
||||
for (int i = 0;
|
||||
i < quests.size() && i < 44; i++) {
|
||||
QuestTracker.QuestFile qf =
|
||||
quests.get(i);
|
||||
boolean done =
|
||||
qt.isStageCompleted(
|
||||
p.getName(), qf);
|
||||
boolean isCurrent =
|
||||
(current != null
|
||||
&& current == qf);
|
||||
|
||||
Material mat;
|
||||
List<String> lore = new ArrayList<>();
|
||||
|
||||
if (done) {
|
||||
mat = Material.LIME_WOOL;
|
||||
} else if (isCurrent) {
|
||||
mat = Material.YELLOW_WOOL;
|
||||
} else {
|
||||
mat = Material.RED_WOOL;
|
||||
}
|
||||
|
||||
if (!qf.details.isEmpty()) {
|
||||
lore.add("§7---- 任务详情 ----");
|
||||
for (String d : qf.details) {
|
||||
lore.add("§f" + d);
|
||||
}
|
||||
}
|
||||
|
||||
if (qf.hasConditions()
|
||||
&& (done || isCurrent)) {
|
||||
lore.add("");
|
||||
for (String c : qf.conditions) {
|
||||
if (qt.isOptional(c))
|
||||
continue;
|
||||
if (qt.isConditionMet(
|
||||
p.getName(), c)) {
|
||||
lore.add("§7 §a✓ "
|
||||
+ qt.getProgress(
|
||||
p.getName(), c));
|
||||
} else {
|
||||
lore.add("§7 §c✗ "
|
||||
+ qt.getProgress(
|
||||
p.getName(), c));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!qf.rewards.isEmpty()) {
|
||||
lore.add("");
|
||||
lore.add("§7---- 奖励 ----");
|
||||
for (String r : qf.rewards) {
|
||||
lore.add("§a" + r);
|
||||
}
|
||||
}
|
||||
|
||||
if (done
|
||||
&& !qf.rewards.isEmpty()
|
||||
&& !qt.hasClaimed(
|
||||
p.getName(), qf)) {
|
||||
lore.add("");
|
||||
lore.add("§e§l点击领取奖励");
|
||||
}
|
||||
if (done && qt.hasClaimed(
|
||||
p.getName(), qf)) {
|
||||
lore.add("");
|
||||
lore.add("§7已领取奖励");
|
||||
}
|
||||
|
||||
int max = plugin.getGift().getMaxStage();
|
||||
for (int i = 0; i < max && i < 9; i++) {
|
||||
int stage = i + 1;
|
||||
boolean claimed = plugin.getDb()
|
||||
.getField(p.getName(),
|
||||
"gift_claimed") != null
|
||||
&& ((String) plugin.getDb()
|
||||
.getField(p.getName(),
|
||||
"gift_claimed"))
|
||||
.contains("[" + stage + "]");
|
||||
boolean can = plugin.getGift()
|
||||
.canClaim(p, stage);
|
||||
Material mat = claimed ? Material.LIME_WOOL
|
||||
: (can ? Material.YELLOW_WOOL
|
||||
: Material.RED_WOOL);
|
||||
String status = claimed ? "§a已领取"
|
||||
: (can ? "§e可领取" : "§c未达标");
|
||||
g.setItem(10 + i, mkItem(mat,
|
||||
"§e" + qf.displayName,
|
||||
lore.toArray(new String[0])));
|
||||
"§e第" + stage + "阶段",
|
||||
"§7" + status));
|
||||
}
|
||||
// 返回按钮
|
||||
g.setItem(53, mkItem(
|
||||
Material.ARROW, "§7返回"));
|
||||
g.setItem(26, mkItem(Material.ARROW, "§7返回"));
|
||||
p.openInventory(g);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public void openTaskList(Player p,
|
||||
String folderName) {
|
||||
QuestTracker qt =
|
||||
plugin.getQuestTracker();
|
||||
List<QuestTracker.QuestFile> tasks =
|
||||
qt.getQuests(folderName);
|
||||
|
||||
int size = Math.min(54,
|
||||
Math.max(54,
|
||||
((tasks.size() / 9) + 1) * 9));
|
||||
Inventory g = Bukkit.createInventory(
|
||||
null, size,
|
||||
public void openTaskList(Player p, String folderName) {
|
||||
File folder = new File(
|
||||
plugin.getDataFolder(), folderName);
|
||||
List<Map<String, Object>> tasks =
|
||||
plugin.getGift()
|
||||
.loadTasksFromFolder(folder);
|
||||
int size = Math.max(54,
|
||||
((tasks.size() / 9) + 1) * 9);
|
||||
if (size > 54) size = 54;
|
||||
Inventory g = Bukkit.createInventory(null, size,
|
||||
"§d§l" + folderName);
|
||||
fillBg(g);
|
||||
|
||||
for (int i = 0;
|
||||
i < tasks.size()
|
||||
&& i < 45; i++) {
|
||||
QuestTracker.QuestFile qf =
|
||||
tasks.get(i);
|
||||
boolean done =
|
||||
qt.isStageCompleted(
|
||||
p.getName(), qf);
|
||||
Material mat = done
|
||||
? Material.LIME_WOOL
|
||||
: Material.BOOK;
|
||||
|
||||
for (int i = 0; i < tasks.size()
|
||||
&& i < 45; i++) {
|
||||
Map<String, Object> task = tasks.get(i);
|
||||
String name = (String) task.get("name");
|
||||
List<String> conds =
|
||||
(List<String>) task.get("conditions");
|
||||
List<String> rewards =
|
||||
(List<String>) task.get("rewards");
|
||||
List<String> lore = new ArrayList<>();
|
||||
|
||||
// 解锁条件
|
||||
if (qf.hasConditions()) {
|
||||
lore.add("§7──── 解锁条件 ────");
|
||||
for (String c : qf.conditions) {
|
||||
if (qt.isOptional(c))
|
||||
continue;
|
||||
if (qt.isConditionMet(
|
||||
p.getName(), c)) {
|
||||
lore.add("§a ✓ "
|
||||
+ qt.getProgress(
|
||||
p.getName(), c));
|
||||
} else {
|
||||
lore.add("§c ✗ "
|
||||
+ qt.getProgress(
|
||||
p.getName(), c));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 任务详情
|
||||
if (!qf.details.isEmpty()) {
|
||||
lore.add("");
|
||||
lore.add("§7──── 任务详情 ────");
|
||||
for (String d : qf.details) {
|
||||
lore.add("§f" + d);
|
||||
}
|
||||
}
|
||||
|
||||
// 任务奖励
|
||||
if (!qf.rewards.isEmpty()) {
|
||||
lore.add("");
|
||||
lore.add("§7──── 任务奖励 ────");
|
||||
for (String r : qf.rewards) {
|
||||
lore.add("§a" + r);
|
||||
}
|
||||
}
|
||||
|
||||
g.setItem(i, mkItem(mat,
|
||||
(done ? "§a✓ " : "§e")
|
||||
+ qf.displayName,
|
||||
lore.add("§7───── 条件 ─────");
|
||||
if (conds != null)
|
||||
for (String c : conds)
|
||||
lore.add("§e" + c);
|
||||
lore.add("");
|
||||
lore.add("§7───── 奖励 ─────");
|
||||
if (rewards != null)
|
||||
for (String r2 : rewards)
|
||||
lore.add("§a" + r2);
|
||||
g.setItem(i, mkItem(Material.BOOK,
|
||||
"§e" + name,
|
||||
lore.toArray(new String[0])));
|
||||
}
|
||||
|
||||
if (tasks.isEmpty()) {
|
||||
g.setItem(22, mkItem(
|
||||
Material.BARRIER,
|
||||
g.setItem(22, mkItem(Material.BARRIER,
|
||||
"§7暂无任务"));
|
||||
}
|
||||
g.setItem(size - 1, mkItem(
|
||||
Material.ARROW, "§7返回"));
|
||||
g.setItem(size - 1,
|
||||
mkItem(Material.ARROW, "§7返回"));
|
||||
p.openInventory(g);
|
||||
}
|
||||
|
||||
@@ -683,81 +494,11 @@ public class GUIManager {
|
||||
Material.SNOWBALL,
|
||||
"§e§l雪球菜单",
|
||||
"§7点击为该玩家发放菜单雪球"));
|
||||
g.setItem(16, mkItem(
|
||||
Material.ENDER_EYE,
|
||||
"§b§l打卡记录",
|
||||
"§7查看该玩家的群系打卡记录"));
|
||||
|
||||
g.setItem(22, mkItem(Material.ARROW, "§7返回"));
|
||||
p.openInventory(g);
|
||||
}
|
||||
|
||||
public void openCheckInRecords(
|
||||
Player p, String target) {
|
||||
Inventory g = Bukkit.createInventory(
|
||||
null, 54,
|
||||
"§b§l打卡记录: " + target);
|
||||
fillBg(g);
|
||||
|
||||
QuestTracker qt =
|
||||
plugin.getQuestTracker();
|
||||
List<String> records =
|
||||
qt.getPlayerRecords(target);
|
||||
|
||||
java.text.SimpleDateFormat sdf =
|
||||
new java.text.SimpleDateFormat(
|
||||
"yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
int slot = 0;
|
||||
for (int i = records.size() - 1;
|
||||
i >= 0 && slot < 45; i--) {
|
||||
String r = records.get(i);
|
||||
String[] parts = r.split("\\|");
|
||||
if (parts.length < 7) continue;
|
||||
|
||||
String world = parts[1];
|
||||
String biome = parts[2];
|
||||
String category = parts[3];
|
||||
String x = parts[4];
|
||||
String y = parts[5];
|
||||
String z = parts[6];
|
||||
String timeStr = "";
|
||||
if (parts.length >= 8) {
|
||||
try {
|
||||
long ts = Long.parseLong(
|
||||
parts[7]);
|
||||
timeStr = sdf.format(
|
||||
new java.util.Date(
|
||||
ts));
|
||||
} catch (Exception e) {
|
||||
timeStr = parts[7];
|
||||
}
|
||||
}
|
||||
|
||||
g.setItem(slot, mkItem(
|
||||
Material.PAPER,
|
||||
"§e" + category + " - "
|
||||
+ biome,
|
||||
"§7时间: " + timeStr,
|
||||
"§7世界: " + world,
|
||||
"§7坐标: " + x
|
||||
+ ", " + y
|
||||
+ ", " + z));
|
||||
slot++;
|
||||
}
|
||||
|
||||
if (slot == 0) {
|
||||
g.setItem(22, mkItem(
|
||||
Material.BARRIER,
|
||||
"§7暂无打卡记录"));
|
||||
}
|
||||
|
||||
g.setItem(53, mkItem(
|
||||
Material.ARROW, "§7返回"));
|
||||
p.openInventory(g);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 打开账号请求面板
|
||||
* 玩家通过 /oa 命令触发
|
||||
|
||||
@@ -1,89 +1,96 @@
|
||||
package Sdf1_login;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
|
||||
public class InviteManager {
|
||||
|
||||
private final Main plugin;
|
||||
|
||||
public InviteManager(Main plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
public String generateCode(Player p) {
|
||||
String code = PasswordUtils.generateInviteCode();
|
||||
plugin.getDb().setField(
|
||||
p.getName(), "invite_code", code);
|
||||
return code;
|
||||
}
|
||||
|
||||
public void onInviteeCheckIn(String inviteeName) {
|
||||
String invitedBy = (String) plugin.getDb()
|
||||
.getField(inviteeName, "invited_by");
|
||||
if (invitedBy == null || invitedBy.isEmpty())
|
||||
return;
|
||||
|
||||
String month = new SimpleDateFormat("yyyy-MM")
|
||||
.format(new Date());
|
||||
String lastMonth = (String) plugin.getDb()
|
||||
.getField(invitedBy, "invite_month");
|
||||
|
||||
if (!month.equals(lastMonth)) {
|
||||
plugin.getDb().setField(
|
||||
invitedBy, "invite_month", month);
|
||||
plugin.getDb().setField(
|
||||
invitedBy, "monthly_invite_count", 0);
|
||||
}
|
||||
|
||||
int count = ((Number) plugin.getDb()
|
||||
.getField(invitedBy,
|
||||
"monthly_invite_count"))
|
||||
.intValue();
|
||||
plugin.getDb().setField(
|
||||
invitedBy, "monthly_invite_count",
|
||||
count + 1);
|
||||
|
||||
double rate = plugin.getCommission()
|
||||
.getCommissionRate(invitedBy);
|
||||
int bonus = (int) (1 * rate);
|
||||
if (bonus > 0) {
|
||||
plugin.getDb().addPoints(invitedBy, bonus);
|
||||
Player inviterPlayer = Bukkit
|
||||
.getPlayerExact(invitedBy);
|
||||
if (inviterPlayer != null
|
||||
&& inviterPlayer.isOnline()) {
|
||||
inviterPlayer.sendMessage(
|
||||
plugin.getConfig2()
|
||||
.msg("invite_referral_bonus")
|
||||
.replace("{points}",
|
||||
String.valueOf(bonus)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public List<Map<String, Object>> getAllInviteData() {
|
||||
List<Map<String, Object>> result =
|
||||
new ArrayList<>();
|
||||
for (Map<String, Object> user
|
||||
: plugin.getDb().getAllUsers()) {
|
||||
String code = (String) user.getOrDefault(
|
||||
"invite_code", "");
|
||||
if (!code.isEmpty()) {
|
||||
Map<String, Object> row =
|
||||
new LinkedHashMap<>();
|
||||
row.put("player",
|
||||
user.get("player_name"));
|
||||
row.put("code", code);
|
||||
row.put("monthly",
|
||||
user.getOrDefault(
|
||||
"monthly_invite_count", 0));
|
||||
result.add(row);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
package Sdf1_login;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
|
||||
public class InviteManager {
|
||||
|
||||
private final Main plugin;
|
||||
|
||||
public InviteManager(Main plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
public String generateCode(Player p) {
|
||||
String code = PasswordUtils.generateInviteCode();
|
||||
plugin.getDb().setField(
|
||||
p.getName(), "invite_code", code);
|
||||
return code;
|
||||
}
|
||||
|
||||
public void onInviteeCheckIn(String inviteeName) {
|
||||
String invitedBy = (String) plugin.getDb()
|
||||
.getField(inviteeName, "invited_by");
|
||||
if (invitedBy == null || invitedBy.isEmpty())
|
||||
return;
|
||||
|
||||
String month = new SimpleDateFormat("yyyy-MM")
|
||||
.format(new Date());
|
||||
String lastMonth = (String) plugin.getDb()
|
||||
.getField(invitedBy, "invite_month");
|
||||
|
||||
if (!month.equals(lastMonth)) {
|
||||
plugin.getDb().setField(
|
||||
invitedBy, "invite_month", month);
|
||||
plugin.getDb().setField(
|
||||
invitedBy, "monthly_invite_count", 0);
|
||||
}
|
||||
|
||||
int count = ((Number) plugin.getDb()
|
||||
.getField(invitedBy,
|
||||
"monthly_invite_count"))
|
||||
.intValue();
|
||||
plugin.getDb().setField(
|
||||
invitedBy, "monthly_invite_count",
|
||||
count + 1);
|
||||
|
||||
double rate = 0.10;
|
||||
if (count + 1 > 15) {
|
||||
rate = 0.60;
|
||||
} else if (count + 1 > 10) {
|
||||
rate = 0.35;
|
||||
} else if (count + 1 > 5) {
|
||||
rate = 0.15;
|
||||
}
|
||||
|
||||
int bonus = (int) (1 * rate);
|
||||
if (bonus > 0) {
|
||||
plugin.getDb().addPoints(invitedBy, bonus);
|
||||
Player inviterPlayer = Bukkit
|
||||
.getPlayerExact(invitedBy);
|
||||
if (inviterPlayer != null
|
||||
&& inviterPlayer.isOnline()) {
|
||||
inviterPlayer.sendMessage(
|
||||
plugin.getConfig2()
|
||||
.msg("invite_referral_bonus")
|
||||
.replace("{points}",
|
||||
String.valueOf(bonus)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public List<Map<String, Object>> getAllInviteData() {
|
||||
List<Map<String, Object>> result =
|
||||
new ArrayList<>();
|
||||
for (Map<String, Object> user
|
||||
: plugin.getDb().getAllUsers()) {
|
||||
String code = (String) user.getOrDefault(
|
||||
"invite_code", "");
|
||||
if (!code.isEmpty()) {
|
||||
Map<String, Object> row =
|
||||
new LinkedHashMap<>();
|
||||
row.put("player",
|
||||
user.get("player_name"));
|
||||
row.put("code", code);
|
||||
row.put("monthly",
|
||||
user.getOrDefault(
|
||||
"monthly_invite_count", 0));
|
||||
result.add(row);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,302 +1,302 @@
|
||||
package Sdf1_login;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class LoginManager {
|
||||
|
||||
private final Main plugin;
|
||||
|
||||
public LoginManager(Main plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
public boolean handleRegister(Player p,
|
||||
String[] args) {
|
||||
String name = p.getName();
|
||||
|
||||
// 已注册玩家不能再注册
|
||||
if (plugin.getDb().userExists(name)) {
|
||||
p.sendMessage(plugin.getConfig2()
|
||||
.msg("already_registered"));
|
||||
return true;
|
||||
}
|
||||
|
||||
// IP注册限制检查
|
||||
String ip = plugin.getPlayerIP(p);
|
||||
if (ip != null && plugin.getConfig2()
|
||||
.maxAccountsPerIP > 0) {
|
||||
if (!plugin.getIPGroup()
|
||||
.canRegister(ip)) {
|
||||
int count = plugin.getIPGroup()
|
||||
.getAccountCount(ip);
|
||||
int max = plugin.getConfig2()
|
||||
.maxAccountsPerIP;
|
||||
p.sendMessage("§c该IP注册已达上限("
|
||||
+ count + "/" + max + ")");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (args.length < 1) {
|
||||
p.sendMessage("§c用法: /reg <密码>");
|
||||
p.sendMessage("§7密码要求: 6位以上,"
|
||||
+ "包含大小写字母和数字");
|
||||
return true;
|
||||
}
|
||||
|
||||
String pwd = args[0];
|
||||
if (pwd.length() < 6) {
|
||||
p.sendMessage("§c密码长度不足6位");
|
||||
return true;
|
||||
}
|
||||
if (!pwd.matches(".*[a-z].*")
|
||||
|| !pwd.matches(".*[A-Z].*")
|
||||
|| !pwd.matches(".*[0-9].*")) {
|
||||
p.sendMessage("§c密码必须包含大写字母、"
|
||||
+ "小写字母和数字");
|
||||
return true;
|
||||
}
|
||||
|
||||
String salt =
|
||||
PasswordUtils.generateSalt();
|
||||
String hash =
|
||||
PasswordUtils.hash(pwd, salt);
|
||||
plugin.getDb().createUser(
|
||||
name, hash, salt);
|
||||
plugin.getLoggedIn().add(name);
|
||||
plugin.getDb().setLoggedIn(name, true);
|
||||
plugin.getDb().setField(name,
|
||||
"last_login_time",
|
||||
System.currentTimeMillis());
|
||||
plugin.getDb().setField(name,
|
||||
"last_online_check",
|
||||
System.currentTimeMillis());
|
||||
plugin.getDb().recordIP(name, ip);
|
||||
plugin.getDb().setField(name,
|
||||
"register_time",
|
||||
System.currentTimeMillis());
|
||||
plugin.restoreInventory(p);
|
||||
plugin.recordIPLogin(p);
|
||||
plugin.giveMenuSnowball(p);
|
||||
|
||||
p.sendMessage(plugin.getConfig2()
|
||||
.msg("reg_success"));
|
||||
playRegisterSound(p);
|
||||
|
||||
try {
|
||||
org.bukkit.plugin.Plugin cy =
|
||||
Bukkit.getPluginManager()
|
||||
.getPlugin("CY_beibao");
|
||||
if (cy != null && cy.isEnabled()) {
|
||||
cy.getClass().getMethod(
|
||||
"onSdf1Activation",
|
||||
String.class,
|
||||
int.class, int.class)
|
||||
.invoke(cy, name, 9, 0);
|
||||
}
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void playRegisterSound(Player p) {
|
||||
p.playSound(p.getLocation(),
|
||||
Sound.BLOCK_NOTE_BLOCK_CHIME,
|
||||
1.0f, 0.79f);
|
||||
p.playSound(p.getLocation(),
|
||||
Sound.BLOCK_NOTE_BLOCK_BASS,
|
||||
1.0f, 0.79f);
|
||||
p.playSound(p.getLocation(),
|
||||
Sound.BLOCK_NOTE_BLOCK_PLING,
|
||||
1.0f, 0.79f);
|
||||
}
|
||||
|
||||
|
||||
public boolean handleLogin(Player p,
|
||||
String[] args) {
|
||||
String name = p.getName();
|
||||
try {
|
||||
if (plugin.getLoggedIn().contains(name)) {
|
||||
p.sendMessage(plugin.getConfig2()
|
||||
.msg("already_logged_in"));
|
||||
return true;
|
||||
}
|
||||
if (!plugin.getDb().userExists(name)) {
|
||||
p.sendMessage(plugin.getConfig2()
|
||||
.msg("not_registered"));
|
||||
return true;
|
||||
}
|
||||
if (args.length < 1) {
|
||||
p.sendMessage("§c用法: /login <密码>");
|
||||
return true;
|
||||
}
|
||||
String pwd = args[0];
|
||||
String salt = (String) plugin.getDb()
|
||||
.getField(name, "password_salt");
|
||||
if (salt == null) {
|
||||
p.sendMessage(
|
||||
"§c数据异常,请联系管理员");
|
||||
plugin.getLogger().severe(
|
||||
"[Sdf1_login] 玩家 " + name
|
||||
+ " 盐值为null");
|
||||
return true;
|
||||
}
|
||||
String hash =
|
||||
PasswordUtils.hash(pwd, salt);
|
||||
|
||||
boolean matchMain =
|
||||
plugin.getDb().checkPassword(
|
||||
name, hash);
|
||||
if (matchMain) {
|
||||
plugin.getLoggedIn().add(name);
|
||||
plugin.getDb().setLoggedIn(
|
||||
name, true);
|
||||
plugin.getDb().setField(name,
|
||||
"last_login_time",
|
||||
System.currentTimeMillis());
|
||||
plugin.getDb().setField(name,
|
||||
"last_online_check",
|
||||
System.currentTimeMillis());
|
||||
// 只在有有效备份时恢复
|
||||
plugin.restoreInventory(p);
|
||||
plugin.recordIPLogin(p);
|
||||
plugin.giveMenuSnowball(p);
|
||||
p.sendMessage(plugin.getConfig2()
|
||||
.msg("login_success"));
|
||||
activateCY(p, name);
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean matchTemp =
|
||||
plugin.getDb()
|
||||
.checkPasswordOrTemp(
|
||||
name, hash);
|
||||
if (matchTemp) {
|
||||
plugin.getLoggedIn().add(name);
|
||||
plugin.getDb().setLoggedIn(
|
||||
name, true);
|
||||
plugin.getDb().setField(name,
|
||||
"last_login_time",
|
||||
System.currentTimeMillis());
|
||||
plugin.getDb().setField(name,
|
||||
"last_online_check",
|
||||
System.currentTimeMillis());
|
||||
plugin.restoreInventory(p);
|
||||
plugin.recordIPLogin(p);
|
||||
plugin.giveMenuSnowball(p);
|
||||
plugin.getNeedsPasswordChange()
|
||||
.add(name);
|
||||
p.sendMessage(plugin.getConfig2()
|
||||
.msg("login_success"));
|
||||
p.sendMessage(
|
||||
"§c§l[警告] §f您使用的是临时密码,请尽快修改密码!");
|
||||
p.sendMessage(
|
||||
"§7用法: /sdf1_login pw");
|
||||
activateCY(p, name);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
p.sendMessage(plugin.getConfig2()
|
||||
.msg("login_failed"));
|
||||
} catch (Exception e) {
|
||||
plugin.getLogger().severe(
|
||||
"[Sdf1_login] handleLogin异常: "
|
||||
+ e.getMessage());
|
||||
e.printStackTrace();
|
||||
p.sendMessage(
|
||||
"§c登录过程出错,请联系管理员");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public void handleReset(Player p) {
|
||||
String name = p.getName();
|
||||
String emailAddr = (String)
|
||||
plugin.getDb().getField(
|
||||
name, "email");
|
||||
if (emailAddr == null
|
||||
|| emailAddr.isEmpty()) {
|
||||
p.sendMessage(
|
||||
"§c未设置邮箱,无法重置密码");
|
||||
return;
|
||||
}
|
||||
String tempPwd = PasswordUtils
|
||||
.generateTempPassword();
|
||||
String salt = (String)
|
||||
plugin.getDb().getField(
|
||||
name, "password_salt");
|
||||
String hash = PasswordUtils.hash(
|
||||
tempPwd, salt);
|
||||
plugin.getDb().setField(name,
|
||||
"temp_password", hash);
|
||||
plugin.getDb().setField(name,
|
||||
"temp_pw_expire",
|
||||
System.currentTimeMillis()
|
||||
+ 300000L);
|
||||
|
||||
plugin.getDb().setField(name,
|
||||
"temp_pw_used", 0);
|
||||
p.sendMessage("§e正在发送临时密码...");
|
||||
final String to = emailAddr;
|
||||
final String fName = name;
|
||||
final String pwd = tempPwd;
|
||||
final Main self = plugin;
|
||||
Bukkit.getScheduler()
|
||||
.runTaskAsynchronously(self,
|
||||
() -> {
|
||||
final boolean[] sent = {false};
|
||||
Thread t = new Thread(() -> {
|
||||
sent[0] = self.getEmail()
|
||||
.sendTempPassword(
|
||||
to, fName, pwd);
|
||||
}, "Sdf1_login-reset");
|
||||
t.setDaemon(true);
|
||||
t.start();
|
||||
try {
|
||||
t.join(15000);
|
||||
} catch (
|
||||
InterruptedException ignored) {
|
||||
}
|
||||
if (t.isAlive()) {
|
||||
t.interrupt();
|
||||
Bukkit.getScheduler().runTask(
|
||||
self, () ->
|
||||
p.sendMessage(
|
||||
"§c邮件发送超时"));
|
||||
return;
|
||||
}
|
||||
Bukkit.getScheduler().runTask(
|
||||
self, () -> {
|
||||
if (sent[0]) {
|
||||
p.sendMessage(
|
||||
"§a临时密码已发送到 "
|
||||
+ to);
|
||||
} else {
|
||||
p.sendMessage(
|
||||
"§c邮件发送失败");
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private void activateCY(Player p,
|
||||
String name) {
|
||||
try {
|
||||
org.bukkit.plugin.Plugin cy =
|
||||
Bukkit.getPluginManager()
|
||||
.getPlugin("CY_beibao");
|
||||
if (cy != null && cy.isEnabled()) {
|
||||
cy.getClass().getMethod(
|
||||
"onSdf1Activation",
|
||||
String.class,
|
||||
int.class, int.class)
|
||||
.invoke(cy, name, 0, 0);
|
||||
}
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
package Sdf1_login;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class LoginManager {
|
||||
|
||||
private final Main plugin;
|
||||
|
||||
public LoginManager(Main plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
public boolean handleRegister(Player p,
|
||||
String[] args) {
|
||||
String name = p.getName();
|
||||
|
||||
// 已注册玩家不能再注册
|
||||
if (plugin.getDb().userExists(name)) {
|
||||
p.sendMessage(plugin.getConfig2()
|
||||
.msg("already_registered"));
|
||||
return true;
|
||||
}
|
||||
|
||||
// IP注册限制检查
|
||||
String ip = plugin.getPlayerIP(p);
|
||||
if (ip != null && plugin.getConfig2()
|
||||
.maxAccountsPerIP > 0) {
|
||||
if (!plugin.getIPGroup()
|
||||
.canRegister(ip)) {
|
||||
int count = plugin.getIPGroup()
|
||||
.getAccountCount(ip);
|
||||
int max = plugin.getConfig2()
|
||||
.maxAccountsPerIP;
|
||||
p.sendMessage("§c该IP注册已达上限("
|
||||
+ count + "/" + max + ")");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (args.length < 1) {
|
||||
p.sendMessage("§c用法: /reg <密码>");
|
||||
p.sendMessage("§7密码要求: 6位以上,"
|
||||
+ "包含大小写字母和数字");
|
||||
return true;
|
||||
}
|
||||
|
||||
String pwd = args[0];
|
||||
if (pwd.length() < 6) {
|
||||
p.sendMessage("§c密码长度不足6位");
|
||||
return true;
|
||||
}
|
||||
if (!pwd.matches(".*[a-z].*")
|
||||
|| !pwd.matches(".*[A-Z].*")
|
||||
|| !pwd.matches(".*[0-9].*")) {
|
||||
p.sendMessage("§c密码必须包含大写字母、"
|
||||
+ "小写字母和数字");
|
||||
return true;
|
||||
}
|
||||
|
||||
String salt =
|
||||
PasswordUtils.generateSalt();
|
||||
String hash =
|
||||
PasswordUtils.hash(pwd, salt);
|
||||
plugin.getDb().createUser(
|
||||
name, hash, salt);
|
||||
plugin.getLoggedIn().add(name);
|
||||
plugin.getDb().setLoggedIn(name, true);
|
||||
plugin.getDb().setField(name,
|
||||
"last_login_time",
|
||||
System.currentTimeMillis());
|
||||
plugin.getDb().setField(name,
|
||||
"last_online_check",
|
||||
System.currentTimeMillis());
|
||||
plugin.getDb().recordIP(name, ip);
|
||||
plugin.getDb().setField(name,
|
||||
"register_time",
|
||||
System.currentTimeMillis());
|
||||
plugin.restoreInventory(p);
|
||||
plugin.recordIPLogin(p);
|
||||
plugin.giveMenuSnowball(p);
|
||||
|
||||
p.sendMessage(plugin.getConfig2()
|
||||
.msg("reg_success"));
|
||||
playRegisterSound(p);
|
||||
|
||||
try {
|
||||
org.bukkit.plugin.Plugin cy =
|
||||
Bukkit.getPluginManager()
|
||||
.getPlugin("CY_beibao");
|
||||
if (cy != null && cy.isEnabled()) {
|
||||
cy.getClass().getMethod(
|
||||
"onSdf1Activation",
|
||||
String.class,
|
||||
int.class, int.class)
|
||||
.invoke(cy, name, 9, 0);
|
||||
}
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void playRegisterSound(Player p) {
|
||||
p.playSound(p.getLocation(),
|
||||
Sound.BLOCK_NOTE_BLOCK_CHIME,
|
||||
1.0f, 0.79f);
|
||||
p.playSound(p.getLocation(),
|
||||
Sound.BLOCK_NOTE_BLOCK_BASS,
|
||||
1.0f, 0.79f);
|
||||
p.playSound(p.getLocation(),
|
||||
Sound.BLOCK_NOTE_BLOCK_PLING,
|
||||
1.0f, 0.79f);
|
||||
}
|
||||
|
||||
|
||||
public boolean handleLogin(Player p,
|
||||
String[] args) {
|
||||
String name = p.getName();
|
||||
try {
|
||||
if (plugin.getLoggedIn().contains(name)) {
|
||||
p.sendMessage(plugin.getConfig2()
|
||||
.msg("already_logged_in"));
|
||||
return true;
|
||||
}
|
||||
if (!plugin.getDb().userExists(name)) {
|
||||
p.sendMessage(plugin.getConfig2()
|
||||
.msg("not_registered"));
|
||||
return true;
|
||||
}
|
||||
if (args.length < 1) {
|
||||
p.sendMessage("§c用法: /login <密码>");
|
||||
return true;
|
||||
}
|
||||
String pwd = args[0];
|
||||
String salt = (String) plugin.getDb()
|
||||
.getField(name, "password_salt");
|
||||
if (salt == null) {
|
||||
p.sendMessage(
|
||||
"§c数据异常,请联系管理员");
|
||||
plugin.getLogger().severe(
|
||||
"[Sdf1_login] 玩家 " + name
|
||||
+ " 盐值为null");
|
||||
return true;
|
||||
}
|
||||
String hash =
|
||||
PasswordUtils.hash(pwd, salt);
|
||||
|
||||
boolean matchMain =
|
||||
plugin.getDb().checkPassword(
|
||||
name, hash);
|
||||
if (matchMain) {
|
||||
plugin.getLoggedIn().add(name);
|
||||
plugin.getDb().setLoggedIn(
|
||||
name, true);
|
||||
plugin.getDb().setField(name,
|
||||
"last_login_time",
|
||||
System.currentTimeMillis());
|
||||
plugin.getDb().setField(name,
|
||||
"last_online_check",
|
||||
System.currentTimeMillis());
|
||||
// 只在有有效备份时恢复
|
||||
plugin.restoreInventory(p);
|
||||
plugin.recordIPLogin(p);
|
||||
plugin.giveMenuSnowball(p);
|
||||
p.sendMessage(plugin.getConfig2()
|
||||
.msg("login_success"));
|
||||
activateCY(p, name);
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean matchTemp =
|
||||
plugin.getDb()
|
||||
.checkPasswordOrTemp(
|
||||
name, hash);
|
||||
if (matchTemp) {
|
||||
plugin.getLoggedIn().add(name);
|
||||
plugin.getDb().setLoggedIn(
|
||||
name, true);
|
||||
plugin.getDb().setField(name,
|
||||
"last_login_time",
|
||||
System.currentTimeMillis());
|
||||
plugin.getDb().setField(name,
|
||||
"last_online_check",
|
||||
System.currentTimeMillis());
|
||||
plugin.restoreInventory(p);
|
||||
plugin.recordIPLogin(p);
|
||||
plugin.giveMenuSnowball(p);
|
||||
plugin.getNeedsPasswordChange()
|
||||
.add(name);
|
||||
p.sendMessage(plugin.getConfig2()
|
||||
.msg("login_success"));
|
||||
p.sendMessage(
|
||||
"§c§l[警告] §f您使用的是临时密码,请尽快修改密码!");
|
||||
p.sendMessage(
|
||||
"§7用法: /sdf1_login pw");
|
||||
activateCY(p, name);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
p.sendMessage(plugin.getConfig2()
|
||||
.msg("login_failed"));
|
||||
} catch (Exception e) {
|
||||
plugin.getLogger().severe(
|
||||
"[Sdf1_login] handleLogin异常: "
|
||||
+ e.getMessage());
|
||||
e.printStackTrace();
|
||||
p.sendMessage(
|
||||
"§c登录过程出错,请联系管理员");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public void handleReset(Player p) {
|
||||
String name = p.getName();
|
||||
String emailAddr = (String)
|
||||
plugin.getDb().getField(
|
||||
name, "email");
|
||||
if (emailAddr == null
|
||||
|| emailAddr.isEmpty()) {
|
||||
p.sendMessage(
|
||||
"§c未设置邮箱,无法重置密码");
|
||||
return;
|
||||
}
|
||||
String tempPwd = PasswordUtils
|
||||
.generateTempPassword();
|
||||
String salt = (String)
|
||||
plugin.getDb().getField(
|
||||
name, "password_salt");
|
||||
String hash = PasswordUtils.hash(
|
||||
tempPwd, salt);
|
||||
plugin.getDb().setField(name,
|
||||
"temp_password", hash);
|
||||
plugin.getDb().setField(name,
|
||||
"temp_pw_expire",
|
||||
System.currentTimeMillis()
|
||||
+ 300000L);
|
||||
|
||||
plugin.getDb().setField(name,
|
||||
"temp_pw_used", 0);
|
||||
p.sendMessage("§e正在发送临时密码...");
|
||||
final String to = emailAddr;
|
||||
final String fName = name;
|
||||
final String pwd = tempPwd;
|
||||
final Main self = plugin;
|
||||
Bukkit.getScheduler()
|
||||
.runTaskAsynchronously(self,
|
||||
() -> {
|
||||
final boolean[] sent = {false};
|
||||
Thread t = new Thread(() -> {
|
||||
sent[0] = self.getEmail()
|
||||
.sendTempPassword(
|
||||
to, fName, pwd);
|
||||
}, "Sdf1_login-reset");
|
||||
t.setDaemon(true);
|
||||
t.start();
|
||||
try {
|
||||
t.join(15000);
|
||||
} catch (
|
||||
InterruptedException ignored) {
|
||||
}
|
||||
if (t.isAlive()) {
|
||||
t.interrupt();
|
||||
Bukkit.getScheduler().runTask(
|
||||
self, () ->
|
||||
p.sendMessage(
|
||||
"§c邮件发送超时"));
|
||||
return;
|
||||
}
|
||||
Bukkit.getScheduler().runTask(
|
||||
self, () -> {
|
||||
if (sent[0]) {
|
||||
p.sendMessage(
|
||||
"§a临时密码已发送到 "
|
||||
+ to);
|
||||
} else {
|
||||
p.sendMessage(
|
||||
"§c邮件发送失败");
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private void activateCY(Player p,
|
||||
String name) {
|
||||
try {
|
||||
org.bukkit.plugin.Plugin cy =
|
||||
Bukkit.getPluginManager()
|
||||
.getPlugin("CY_beibao");
|
||||
if (cy != null && cy.isEnabled()) {
|
||||
cy.getClass().getMethod(
|
||||
"onSdf1Activation",
|
||||
String.class,
|
||||
int.class, int.class)
|
||||
.invoke(cy, name, 0, 0);
|
||||
}
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+112
-667
File diff suppressed because it is too large
Load Diff
@@ -1641,4 +1641,4 @@ public class TicketManager {
|
||||
}
|
||||
return it;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,5 +86,4 @@ commands:
|
||||
usage: /垃圾清理
|
||||
menu:
|
||||
description: 雪球菜单开关控制
|
||||
usage: /menu <开/关>
|
||||
commands:
|
||||
usage: /menu <开/关>
|
||||
Reference in New Issue
Block a user