添加打劫保释功能

- 打劫失败后自动关押24小时
- 其他人可以使用"保释 @用户"命令花费30积分保释
- 在押期间无法进行打劫
- 保释后立即释放
- 所有记录都会保存在数据库中
This commit is contained in:
liuwei
2025-04-10 10:00:54 +08:00
parent 992fbdab18
commit 3b49e340e4
3 changed files with 170 additions and 10 deletions

View File

@@ -76,6 +76,23 @@ class PointsDBOperator(BaseDBOperator):
) ENGINE=InnoDB CHARACTER SET utf8mb4;
""")
# 创建关禁闭记录表
self.execute_update("""
CREATE TABLE IF NOT EXISTS t_prison_records (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
user_id VARCHAR(100) NOT NULL,
group_id VARCHAR(100) NOT NULL,
start_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
end_time TIMESTAMP NOT NULL,
reason VARCHAR(255),
status TINYINT DEFAULT 1 COMMENT '1:在押 0:已释放',
bailout_user_id VARCHAR(100),
bailout_time TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY `idx_user_group` (user_id, group_id, status)
) ENGINE=InnoDB CHARACTER SET utf8mb4;
""")
self.logger.info("积分系统数据库表检查/创建完成")
except Exception as e:
self.logger.error(f"创建积分系统数据库表失败: {e}")
@@ -227,7 +244,7 @@ class PointsDBOperator(BaseDBOperator):
self.execute_update("""
UPDATE t_sign_record
SET points = points + %s
WHERE wx_id = %s AND group_id = %s
WHERE wx_id = %s AND group__id = %s
""", (points, user_id, group_id))
elif source == PointSource.GAME:
self.execute_update("""
@@ -575,4 +592,73 @@ class PointsDBOperator(BaseDBOperator):
return stats
except Exception as e:
self.logger.error(f"获取群组积分统计信息失败: {e}")
return stats
return stats
def imprison_user(self, user_id: str, group_id: str, hours: int = 24, reason: str = None) -> bool:
"""关押用户
Args:
user_id: 用户ID
group_id: 群组ID
hours: 关押时长(小时)
reason: 关押原因
"""
try:
end_time = datetime.now() + timedelta(hours=hours)
self.execute_update("""
INSERT INTO t_prison_records (user_id, group_id, end_time, reason)
VALUES (%s, %s, %s, %s)
ON DUPLICATE KEY UPDATE
start_time=CURRENT_TIMESTAMP, end_time=%s, reason=%s, status=1
""", (user_id, group_id, end_time, reason, end_time, reason))
return True
except Exception as e:
self.logger.error(f"关押用户失败: {e}")
return False
def check_prison_status(self, user_id: str, group_id: str) -> Optional[Dict]:
"""检查用户是否在押
Returns:
None: 不在押
Dict: 在押信息
"""
try:
records = self.execute_query("""
SELECT * FROM t_prison_records
WHERE user_id = %s AND group_id = %s AND status = 1
AND end_time > CURRENT_TIMESTAMP
LIMIT 1
""", (user_id, group_id))
return records[0] if records else None
except Exception as e:
self.logger.error(f"检查用户在押状态失败: {e}")
return None
def bailout_user(self, prisoner_id: str, bailout_user_id: str, group_id: str) -> Tuple[bool, str]:
"""保释用户
Returns:
(bool, str): (是否成功, 错误信息)
"""
try:
# 检查是否在押
prison_record = self.check_prison_status(prisoner_id, group_id)
if not prison_record:
return False, "该用户未被关押"
# 扣除保释金
success, result = self.transfer_points(
bailout_user_id, "SYSTEM", group_id, 30, "保释金"
)
if not success:
return False, result.get("error", "保释失败")
# 释放用户
self.execute_update("""
UPDATE t_prison_records
SET status = 0, bailout_user_id = %s, bailout_time = CURRENT_TIMESTAMP
WHERE user_id = %s AND group_id = %s AND status = 1
""", (bailout_user_id, prisoner_id, group_id))
return True, "保释成功"
except Exception as e:
self.logger.error(f"保释用户失败: {e}")
return False, f"保释失败: {str(e)}"