添加打劫保释功能
- 打劫失败后自动关押24小时 - 其他人可以使用"保释 @用户"命令花费30积分保释 - 在押期间无法进行打劫 - 保释后立即释放 - 所有记录都会保存在数据库中
This commit is contained in:
@@ -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)}"
|
||||
Reference in New Issue
Block a user