修复用户组永久时长+中文数字时间解析
This commit is contained in:
@@ -437,6 +437,62 @@ public class ConfigManager {
|
||||
cnNum.put("六", 6); cnNum.put("陆", 6); cnNum.put("七", 7); cnNum.put("漆", 7); cnNum.put("八", 8); cnNum.put("捌", 8);
|
||||
cnNum.put("九", 9); cnNum.put("玖", 9);
|
||||
|
||||
// 中文数字转阿拉伯数字:逐字扫描法
|
||||
// 支持:一百二十、三千五百、十二万三千四百五十六
|
||||
// 单位:十(10)、百(100)、千(1000)、万(10000)
|
||||
boolean hasChineseDigit = false;
|
||||
for (char c : s.toCharArray()) {
|
||||
if (cnNum.containsKey(String.valueOf(c))) {
|
||||
hasChineseDigit = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (hasChineseDigit) {
|
||||
int total = 0;
|
||||
int current = 0;
|
||||
boolean hasUnit = false;
|
||||
for (int i = 0; i < s.length(); i++) {
|
||||
String ch = String.valueOf(s.charAt(i));
|
||||
Integer digit = cnNum.get(ch);
|
||||
if (digit != null) {
|
||||
current = digit;
|
||||
hasUnit = false;
|
||||
} else if (ch.equals("十")) {
|
||||
if (current == 0) current = 1; // 十二 → 12
|
||||
total += current * 10;
|
||||
current = 0;
|
||||
hasUnit = true;
|
||||
} else if (ch.equals("百")) {
|
||||
if (current == 0) current = 1;
|
||||
total += current * 100;
|
||||
current = 0;
|
||||
hasUnit = true;
|
||||
} else if (ch.equals("千")) {
|
||||
if (current == 0) current = 1;
|
||||
total += current * 1000;
|
||||
current = 0;
|
||||
hasUnit = true;
|
||||
} else if (ch.equals("万")) {
|
||||
if (current == 0) current = 1;
|
||||
total += current * 10000;
|
||||
current = 0;
|
||||
hasUnit = true;
|
||||
} else if (ch.equals("秒") || ch.equals("分") || ch.equals("钟")) {
|
||||
// 单位字符,跳过
|
||||
continue;
|
||||
}
|
||||
}
|
||||
total += current; // 加上最后剩余的数字
|
||||
// 如果有单位(秒/分钟),根据单位决定返回秒还是分钟
|
||||
if (s.contains("秒")) {
|
||||
return total;
|
||||
} else if (s.contains("分") || s.contains("钟")) {
|
||||
return total * 60;
|
||||
} else {
|
||||
return total; // 默认当作秒
|
||||
}
|
||||
}
|
||||
|
||||
// 罗马数字映射(简单支持)
|
||||
java.util.Map<Character, Integer> romanNum = new java.util.HashMap<>();
|
||||
romanNum.put('I', 1); romanNum.put('V', 5); romanNum.put('X', 10); romanNum.put('L', 50); romanNum.put('C', 100);
|
||||
|
||||
@@ -333,7 +333,8 @@ public class UserGroupManager {
|
||||
|
||||
if (cfg.joinPrice <= 0) return "该用户组不开放付费加入";
|
||||
|
||||
if (cfg.durationMinutes <= 0) return "该用户组配置异常(有效时长未设置)";
|
||||
// durationMinutes <= 0 表示永久(expiry_time=0)
|
||||
// 不再报错,允许购买永久用户组
|
||||
|
||||
// 检查是否已在组内(有效期内)
|
||||
if (isPlayerInGroup(player, groupName)) {
|
||||
@@ -365,7 +366,12 @@ public class UserGroupManager {
|
||||
|
||||
// 计算到期时间
|
||||
long now = System.currentTimeMillis();
|
||||
long expiryTime = now + (long) cfg.durationMinutes * 60 * 1000;
|
||||
long expiryTime;
|
||||
if (cfg.durationMinutes <= 0) {
|
||||
expiryTime = 0; // 永久
|
||||
} else {
|
||||
expiryTime = now + (long) cfg.durationMinutes * 60 * 1000;
|
||||
}
|
||||
|
||||
// 加入组
|
||||
String err = addPlayerWithExpiry(player, groupName, "paid_join", expiryTime);
|
||||
@@ -432,8 +438,13 @@ public class UserGroupManager {
|
||||
if (!deducted) return "扣费失败,请稍后重试";
|
||||
|
||||
// 延长到期时间:从当前到期时间往后延(如果已过期则从当前时间开始)
|
||||
long baseTime = (currentExpiry > now) ? currentExpiry : now;
|
||||
long newExpiry = baseTime + (long) cfg.durationMinutes * 60 * 1000;
|
||||
long newExpiry;
|
||||
if (cfg.durationMinutes <= 0) {
|
||||
newExpiry = 0; // 永久
|
||||
} else {
|
||||
long baseTime = (currentExpiry > now) ? currentExpiry : now;
|
||||
newExpiry = baseTime + (long) cfg.durationMinutes * 60 * 1000;
|
||||
}
|
||||
|
||||
try {
|
||||
PreparedStatement ps = db.prepareStatement(
|
||||
|
||||
Reference in New Issue
Block a user