优化入库动作。
This commit is contained in:
@@ -175,6 +175,7 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
self.redis_db: Optional[XiuxianRedisDB] = None
|
self.redis_db: Optional[XiuxianRedisDB] = None
|
||||||
self.xdb: Optional[XiuxianDB] = None
|
self.xdb: Optional[XiuxianDB] = None
|
||||||
self.points_db: Optional[PointsDBOperator] = None
|
self.points_db: Optional[PointsDBOperator] = None
|
||||||
|
self.revoke = None
|
||||||
|
|
||||||
def initialize(self, context: Dict[str, Any]) -> bool:
|
def initialize(self, context: Dict[str, Any]) -> bool:
|
||||||
"""初始化插件:加载配置,接入 DB 与 Redis,并注册功能权限。"""
|
"""初始化插件:加载配置,接入 DB 与 Redis,并注册功能权限。"""
|
||||||
@@ -331,6 +332,7 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
roomid = message.get("roomid", "")
|
roomid = message.get("roomid", "")
|
||||||
gbm: GroupBotManager = message.get("gbm")
|
gbm: GroupBotManager = message.get("gbm")
|
||||||
bot: WechatAPIClient = message.get("bot")
|
bot: WechatAPIClient = message.get("bot")
|
||||||
|
self.revoke = message.get("revoke")
|
||||||
|
|
||||||
if roomid and gbm.get_group_permission(roomid, self.feature) == PermissionStatus.DISABLED:
|
if roomid and gbm.get_group_permission(roomid, self.feature) == PermissionStatus.DISABLED:
|
||||||
return False, "没有权限"
|
return False, "没有权限"
|
||||||
@@ -345,11 +347,15 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
return False, "不匹配的命令"
|
return False, "不匹配的命令"
|
||||||
|
|
||||||
if not self.redis_db:
|
if not self.redis_db:
|
||||||
await bot.send_text_message((roomid if roomid else sender), "❌系统未初始化Redis", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "❌系统未初始化Redis", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "Redis未初始化"
|
return False, "Redis未初始化"
|
||||||
|
|
||||||
if self.redis_db.check_rate_limited(sender, cmd):
|
if self.redis_db.check_rate_limited(sender, cmd):
|
||||||
await bot.send_text_message((roomid if roomid else sender), "⚠️ 操作过于频繁,请稍候再试", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "⚠️ 操作过于频繁,请稍候再试", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "限流"
|
return False, "限流"
|
||||||
|
|
||||||
if cmd == "注册修仙":
|
if cmd == "注册修仙":
|
||||||
@@ -422,11 +428,15 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
async def _cmd_register(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
async def _cmd_register(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
||||||
dao_name = content.strip()
|
dao_name = content.strip()
|
||||||
if not dao_name:
|
if not dao_name:
|
||||||
await bot.send_text_message((roomid if roomid else sender), f"❌命令格式错误!\n{self.command_format}", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), f"❌命令格式错误!\n{self.command_format}", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "命令格式错误"
|
return False, "命令格式错误"
|
||||||
player = self.redis_db.get_player(sender)
|
player = self.redis_db.get_player(sender)
|
||||||
if player:
|
if player:
|
||||||
await bot.send_text_message((roomid if roomid else sender), "⚠️ 已注册,无需重复注册", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "⚠️ 已注册,无需重复注册", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
self._rate_set(sender, "注册修仙")
|
self._rate_set(sender, "注册修仙")
|
||||||
return True, "已注册"
|
return True, "已注册"
|
||||||
root_name, mult = random.choice(self.spirit_roots) if self.spirit_roots else ("凡灵根", 1.0)
|
root_name, mult = random.choice(self.spirit_roots) if self.spirit_roots else ("凡灵根", 1.0)
|
||||||
@@ -443,11 +453,23 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
"status_until": None,
|
"status_until": None,
|
||||||
"last_cultivate_time": None,
|
"last_cultivate_time": None,
|
||||||
}
|
}
|
||||||
|
if self.xdb:
|
||||||
|
try:
|
||||||
|
self.xdb.create_player(player)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
if self.xdb:
|
||||||
|
try:
|
||||||
|
self.xdb.update_player_fields(player.get("user_id"), {"status": player.get("status"), "status_until": player.get("status_until")})
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
self.redis_db.save_player(player)
|
self.redis_db.save_player(player)
|
||||||
self._rate_set(sender, "注册修仙")
|
self._rate_set(sender, "注册修仙")
|
||||||
# 初始化境界排行榜分值
|
# 初始化境界排行榜分值
|
||||||
self.redis_db.leaderboard_realm_add(sender, float(self._realm_score(player["realm"])) )
|
self.redis_db.leaderboard_realm_add(sender, float(self._realm_score(player["realm"])) )
|
||||||
await bot.send_text_message((roomid if roomid else sender), f"✅ 注册成功,道号:{dao_name}\n灵根:{root_name}", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), f"✅ 注册成功,道号:{dao_name}\n灵根:{root_name}", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
|
||||||
return True, "注册成功"
|
return True, "注册成功"
|
||||||
|
|
||||||
async def _cmd_help(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
async def _cmd_help(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
||||||
@@ -467,47 +489,70 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
lines.append("加入门派 名称")
|
lines.append("加入门派 名称")
|
||||||
lines.append("积分购石 积分数")
|
lines.append("积分购石 积分数")
|
||||||
msg = "\n".join(lines)
|
msg = "\n".join(lines)
|
||||||
await bot.send_text_message((roomid if roomid else sender), msg, sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), msg, sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 30)
|
||||||
self._rate_set(sender, "帮助")
|
self._rate_set(sender, "帮助")
|
||||||
return True, "帮助"
|
return True, "帮助"
|
||||||
|
|
||||||
async def _cmd_points_to_stone(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
async def _cmd_points_to_stone(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
||||||
if not self.points_db:
|
if not self.points_db:
|
||||||
await bot.send_text_message(roomid or sender, "系统未初始化积分模块", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "系统未初始化积分模块", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "积分未初始化"
|
return False, "积分未初始化"
|
||||||
player = self._get_player(sender)
|
player = self._get_player(sender)
|
||||||
if not player:
|
if not player:
|
||||||
await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未注册"
|
return False, "未注册"
|
||||||
try:
|
try:
|
||||||
pts = int(content.strip())
|
pts = int(content.strip())
|
||||||
except Exception:
|
except Exception:
|
||||||
await bot.send_text_message(roomid or sender, "命令格式:积分购石 积分数", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "命令格式:积分购石 积分数", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "命令格式错误"
|
return False, "命令格式错误"
|
||||||
if pts <= 0:
|
if pts <= 0:
|
||||||
await bot.send_text_message(roomid or sender, "积分数需为正整数", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "积分数需为正整数", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "非法数量"
|
return False, "非法数量"
|
||||||
group_id = roomid or ""
|
group_id = roomid or ""
|
||||||
ok, res = self.points_db.deduct_points(sender, group_id, pts, PointSource.PLUGIN, "修仙购买灵石")
|
ok, res = self.points_db.deduct_points(sender, group_id, pts, PointSource.PLUGIN, "修仙购买灵石")
|
||||||
if not ok:
|
if not ok:
|
||||||
cur = res.get("current_points", 0)
|
cur = res.get("current_points", 0)
|
||||||
await bot.send_text_message(roomid or sender, f"积分不足,当前积分:{cur}", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"积分不足,当前积分:{cur}", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "积分不足"
|
return False, "积分不足"
|
||||||
rate = int(self.point_to_stone_rate)
|
rate = int(self.point_to_stone_rate)
|
||||||
if pts < rate:
|
if pts < rate:
|
||||||
await bot.send_text_message(roomid or sender, f"积分不足以兑换1灵石,至少需要{rate}积分", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"积分不足以兑换1灵石,至少需要{rate}积分", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "积分不足"
|
return False, "积分不足"
|
||||||
stones_gain = pts // rate
|
stones_gain = pts // rate
|
||||||
player["spirit_stone"] = int(player.get("spirit_stone", 0)) + stones_gain
|
player["spirit_stone"] = int(player.get("spirit_stone", 0)) + stones_gain
|
||||||
self._save_player(player)
|
if self.xdb:
|
||||||
|
try:
|
||||||
|
self.xdb.update_player_fields(sender, {"spirit_stone": player["spirit_stone"]})
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
self.redis_db.save_player(player)
|
||||||
self._rate_set(sender, "积分购石")
|
self._rate_set(sender, "积分购石")
|
||||||
await bot.send_text_message(roomid or sender, f"✅ 兑换成功,消耗积分{pts},获得灵石{stones_gain}({rate}积分=1灵石)", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 兑换成功,消耗积分{pts},获得灵石{stones_gain}({rate}积分=1灵石)", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
|
||||||
return True, "积分购石"
|
return True, "积分购石"
|
||||||
|
|
||||||
async def _cmd_status(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
async def _cmd_status(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
||||||
player = self.redis_db.get_player(sender)
|
player = self.redis_db.get_player(sender)
|
||||||
if not player:
|
if not player:
|
||||||
await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未注册"
|
return False, "未注册"
|
||||||
player = self._check_status_update(player)
|
player = self._check_status_update(player)
|
||||||
msg = (
|
msg = (
|
||||||
@@ -519,38 +564,52 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
f"灵石:{player.get('spirit_stone')}\n"
|
f"灵石:{player.get('spirit_stone')}\n"
|
||||||
f"状态:{player.get('status')}\n"
|
f"状态:{player.get('status')}\n"
|
||||||
)
|
)
|
||||||
await bot.send_text_message((roomid if roomid else sender), msg, sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), msg, sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 20)
|
||||||
self._rate_set(sender, "我的状态")
|
self._rate_set(sender, "我的状态")
|
||||||
return True, "状态展示"
|
return True, "状态展示"
|
||||||
|
|
||||||
async def _cmd_cultivate(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
async def _cmd_cultivate(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
||||||
player = self.redis_db.get_player(sender)
|
player = self.redis_db.get_player(sender)
|
||||||
if not player:
|
if not player:
|
||||||
await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未注册"
|
return False, "未注册"
|
||||||
player = self._check_status_update(player)
|
player = self._check_status_update(player)
|
||||||
status = player.get("status", "Idle")
|
status = player.get("status", "Idle")
|
||||||
if status == "Cultivating":
|
if status == "Cultivating":
|
||||||
await bot.send_text_message((roomid if roomid else sender), "⚠️ 已在闭关中", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "⚠️ 已在闭关中", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "重复闭关"
|
return False, "重复闭关"
|
||||||
if status not in ("Idle", "Injured"):
|
if status not in ("Idle", "Injured"):
|
||||||
await bot.send_text_message((roomid if roomid else sender), f"当前状态[{status}]不可闭关", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), f"当前状态[{status}]不可闭关", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "状态不可闭关"
|
return False, "状态不可闭关"
|
||||||
player["status"] = "Cultivating"
|
player["status"] = "Cultivating"
|
||||||
player["last_cultivate_time"] = datetime.now(timezone.utc).isoformat()
|
player["last_cultivate_time"] = datetime.now(timezone.utc).isoformat()
|
||||||
self.redis_db.save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, "闭关")
|
self._rate_set(sender, "闭关")
|
||||||
await bot.send_text_message((roomid if roomid else sender), "✅ 已进入闭关,期间安全不可被劫掠", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "✅ 已进入闭关,期间安全不可被劫掠", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
|
||||||
return True, "闭关成功"
|
return True, "闭关成功"
|
||||||
|
|
||||||
async def _cmd_finish_cultivate(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
async def _cmd_finish_cultivate(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
||||||
player = self.redis_db.get_player(sender)
|
player = self.redis_db.get_player(sender)
|
||||||
if not player:
|
if not player:
|
||||||
await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未注册"
|
return False, "未注册"
|
||||||
player = self._check_status_update(player)
|
player = self._check_status_update(player)
|
||||||
if player.get("status") != "Cultivating":
|
if player.get("status") != "Cultivating":
|
||||||
await bot.send_text_message((roomid if roomid else sender), "⚠️ 非闭关状态,无需出关", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "⚠️ 非闭关状态,无需出关", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "非闭关"
|
return False, "非闭关"
|
||||||
start_iso = player.get("last_cultivate_time")
|
start_iso = player.get("last_cultivate_time")
|
||||||
|
|
||||||
@@ -569,36 +628,46 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
player["status"] = "Unstable_Qi"
|
player["status"] = "Unstable_Qi"
|
||||||
player["status_until"] = (now + timedelta(minutes=int(self.unstable_qi_minutes))).isoformat()
|
player["status_until"] = (now + timedelta(minutes=int(self.unstable_qi_minutes))).isoformat()
|
||||||
player["last_cultivate_time"] = None
|
player["last_cultivate_time"] = None
|
||||||
self.redis_db.save_player(player)
|
self._save_player(player)
|
||||||
# 自动层级提升(不跨瓶颈)
|
# 自动层级提升(不跨瓶颈)
|
||||||
self._auto_layer_up(sender, player)
|
self._auto_layer_up(sender, player)
|
||||||
self.redis_db.leaderboard_add(sender, float(player["cultivation_points"]))
|
self.redis_db.leaderboard_add(sender, float(player["cultivation_points"]))
|
||||||
self._rate_set(sender, "出关")
|
self._rate_set(sender, "出关")
|
||||||
await bot.send_text_message((roomid if roomid else sender), f"✅ 出关成功,获得修为:{gain}({duration_hours:.1f}小时)\n当前修为:{player['cultivation_points']}\n状态:气息不稳 {self.unstable_qi_minutes}分钟", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), f"✅ 出关成功,获得修为:{gain}({duration_hours:.1f}小时)\n当前修为:{player['cultivation_points']}\n状态:气息不稳 {self.unstable_qi_minutes}分钟", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 20)
|
||||||
return True, "出关结算"
|
return True, "出关结算"
|
||||||
|
|
||||||
async def _cmd_gather(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
async def _cmd_gather(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
||||||
player = self.redis_db.get_player(sender)
|
player = self.redis_db.get_player(sender)
|
||||||
if not player:
|
if not player:
|
||||||
await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未注册"
|
return False, "未注册"
|
||||||
try:
|
try:
|
||||||
qty = int(content.strip())
|
qty = int(content.strip())
|
||||||
except Exception:
|
except Exception:
|
||||||
await bot.send_text_message((roomid if roomid else sender), f"❌命令格式错误!\n{self.command_format}", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), f"❌命令格式错误!\n{self.command_format}", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "命令格式错误"
|
return False, "命令格式错误"
|
||||||
stones = int(player.get("spirit_stone", 0))
|
stones = int(player.get("spirit_stone", 0))
|
||||||
if qty <= 0 or stones < qty:
|
if qty <= 0 or stones < qty:
|
||||||
await bot.send_text_message((roomid if roomid else sender), "⚠️ 灵石不足或数量不合法", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "⚠️ 灵石不足或数量不合法", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "灵石不足"
|
return False, "灵石不足"
|
||||||
player["spirit_stone"] = stones - qty
|
player["spirit_stone"] = stones - qty
|
||||||
player["cultivation_points"] = int(player.get("cultivation_points", 0)) + qty * 10
|
player["cultivation_points"] = int(player.get("cultivation_points", 0)) + qty * 10
|
||||||
self.redis_db.save_player(player)
|
self._save_player(player)
|
||||||
# 自动层级提升(不跨瓶颈)
|
# 自动层级提升(不跨瓶颈)
|
||||||
self._auto_layer_up(sender, player)
|
self._auto_layer_up(sender, player)
|
||||||
self.redis_db.leaderboard_add(sender, float(player["cultivation_points"]))
|
self.redis_db.leaderboard_add(sender, float(player["cultivation_points"]))
|
||||||
self._rate_set(sender, "聚灵")
|
self._rate_set(sender, "聚灵")
|
||||||
await bot.send_text_message((roomid if roomid else sender), f"✅ 聚灵成功,消耗灵石{qty},获得修为{qty * 10}", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), f"✅ 聚灵成功,消耗灵石{qty},获得修为{qty * 10}", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
|
||||||
return True, "聚灵成功"
|
return True, "聚灵成功"
|
||||||
|
|
||||||
async def _cmd_leaderboard(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
async def _cmd_leaderboard(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
||||||
@@ -609,7 +678,9 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
mark = "你" if uid == sender else ""
|
mark = "你" if uid == sender else ""
|
||||||
lines.append(f"{rank}. {uid} - {int(score)} {mark}")
|
lines.append(f"{rank}. {uid} - {int(score)} {mark}")
|
||||||
rank += 1
|
rank += 1
|
||||||
await bot.send_text_message((roomid if roomid else sender), "\n".join(lines), sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "\n".join(lines), sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 20)
|
||||||
self._rate_set(sender, "排行榜")
|
self._rate_set(sender, "排行榜")
|
||||||
return True, "排行榜"
|
return True, "排行榜"
|
||||||
|
|
||||||
@@ -617,6 +688,15 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
return self.redis_db.get_player(user_id)
|
return self.redis_db.get_player(user_id)
|
||||||
|
|
||||||
def _save_player(self, player: Dict[str, Any]):
|
def _save_player(self, player: Dict[str, Any]):
|
||||||
|
if self.xdb:
|
||||||
|
fields = {}
|
||||||
|
for k in ("group_id","dao_name","realm","spirit_root","cultivation_points","spirit_stone","status","status_until","last_cultivate_time","clan_id"):
|
||||||
|
if k in player:
|
||||||
|
fields[k] = player[k]
|
||||||
|
try:
|
||||||
|
self.xdb.update_player_fields(player.get("user_id"), fields)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
self.redis_db.save_player(player)
|
self.redis_db.save_player(player)
|
||||||
|
|
||||||
def _get_player_with_cache(self, user_id: str) -> Optional[Dict[str, Any]]:
|
def _get_player_with_cache(self, user_id: str) -> Optional[Dict[str, Any]]:
|
||||||
@@ -680,79 +760,117 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
async def _cmd_signin(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
async def _cmd_signin(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
||||||
player = self._get_player(sender)
|
player = self._get_player(sender)
|
||||||
if not player:
|
if not player:
|
||||||
await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未注册"
|
return False, "未注册"
|
||||||
if self.redis_db.check_rate_limited(sender, "签到"):
|
if self.redis_db.check_rate_limited(sender, "签到"):
|
||||||
await bot.send_text_message(roomid or sender, "今日已签到,请明日再来", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "今日已签到,请明日再来", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "已签到"
|
return False, "已签到"
|
||||||
reward = 50
|
reward = 50
|
||||||
player["spirit_stone"] = int(player.get("spirit_stone", 0)) + reward
|
player["spirit_stone"] = int(player.get("spirit_stone", 0)) + reward
|
||||||
self._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, "签到")
|
self._rate_set(sender, "签到")
|
||||||
await bot.send_text_message(roomid or sender, f"✅ 签到成功,获得灵石{reward}", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 签到成功,获得灵石{reward}", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
|
||||||
return True, "签到成功"
|
return True, "签到成功"
|
||||||
|
|
||||||
async def _cmd_shop(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
async def _cmd_shop(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
||||||
lines = ["🛒 坊市商品"]
|
lines = ["🛒 坊市商品"]
|
||||||
for item in self.shop_items:
|
for item in self.shop_items:
|
||||||
lines.append(f"{item['name']} [{item['type']}] - {item['price']}灵石")
|
lines.append(f"{item['name']} [{item['type']}] - {item['price']}灵石")
|
||||||
await bot.send_text_message(roomid or sender, "\n".join(lines), sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "\n".join(lines), sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 20)
|
||||||
self._rate_set(sender, "坊市")
|
self._rate_set(sender, "坊市")
|
||||||
return True, "坊市"
|
return True, "坊市"
|
||||||
|
|
||||||
async def _cmd_buy(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
async def _cmd_buy(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
||||||
parts = content.split()
|
parts = content.split()
|
||||||
if len(parts) < 2:
|
if len(parts) < 2:
|
||||||
await bot.send_text_message(roomid or sender, f"❌命令格式错误!\n购买 物品 数量", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"❌命令格式错误!\n购买 物品 数量", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "命令格式错误"
|
return False, "命令格式错误"
|
||||||
item_name = parts[0]
|
item_name = parts[0]
|
||||||
try:
|
try:
|
||||||
qty = int(parts[1])
|
qty = int(parts[1])
|
||||||
except Exception:
|
except Exception:
|
||||||
await bot.send_text_message(roomid or sender, f"❌命令格式错误!\n购买 物品 数量", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"❌命令格式错误!\n购买 物品 数量", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "命令格式错误"
|
return False, "命令格式错误"
|
||||||
player = self._get_player(sender)
|
player = self._get_player(sender)
|
||||||
if not player:
|
if not player:
|
||||||
await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未注册"
|
return False, "未注册"
|
||||||
item = next((i for i in self.shop_items if i["name"] == item_name), None)
|
item = next((i for i in self.shop_items if i["name"] == item_name), None)
|
||||||
if not item:
|
if not item:
|
||||||
await bot.send_text_message(roomid or sender, "商品不存在", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "商品不存在", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "商品不存在"
|
return False, "商品不存在"
|
||||||
total = item["price"] * qty
|
total = item["price"] * qty
|
||||||
stones = int(player.get("spirit_stone", 0))
|
stones = int(player.get("spirit_stone", 0))
|
||||||
if qty <= 0 or stones < total:
|
if qty <= 0 or stones < total:
|
||||||
await bot.send_text_message(roomid or sender, "灵石不足", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "灵石不足", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "灵石不足"
|
return False, "灵石不足"
|
||||||
player["spirit_stone"] = stones - total
|
player["spirit_stone"] = stones - total
|
||||||
inv = player.get("inventory") or {}
|
inv = player.get("inventory") or {}
|
||||||
inv[item_name] = int(inv.get(item_name, 0)) + qty
|
inv[item_name] = int(inv.get(item_name, 0)) + qty
|
||||||
player["inventory"] = inv
|
player["inventory"] = inv
|
||||||
self._save_player(player)
|
if self.xdb:
|
||||||
|
try:
|
||||||
|
self.xdb.update_player_fields(sender, {"spirit_stone": player["spirit_stone"]})
|
||||||
|
self.xdb.add_item(sender, item_name, item.get("type","other"), qty)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
self.redis_db.save_player(player)
|
||||||
self._rate_set(sender, "购买")
|
self._rate_set(sender, "购买")
|
||||||
await bot.send_text_message(roomid or sender, f"✅ 购买成功,{item_name} × {qty}", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 购买成功,{item_name} × {qty}", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
|
||||||
return True, "购买成功"
|
return True, "购买成功"
|
||||||
|
|
||||||
async def _cmd_bag(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
async def _cmd_bag(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
||||||
player = self._get_player(sender)
|
player = self._get_player(sender)
|
||||||
if not player:
|
if not player:
|
||||||
await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未注册"
|
return False, "未注册"
|
||||||
inv = player.get("inventory") or {}
|
inv = player.get("inventory") or {}
|
||||||
|
items = []
|
||||||
|
if self.xdb:
|
||||||
|
try:
|
||||||
|
items = self.xdb.get_inventory(sender)
|
||||||
|
except Exception:
|
||||||
|
items = []
|
||||||
lines = ["🎒 背包"]
|
lines = ["🎒 背包"]
|
||||||
if not inv:
|
if not items:
|
||||||
lines.append("空")
|
lines.append("空")
|
||||||
else:
|
else:
|
||||||
for k, v in inv.items():
|
for it in items:
|
||||||
lines.append(f"{k} × {v}")
|
lines.append(f"{it['name']} × {it['quantity']}")
|
||||||
await bot.send_text_message(roomid or sender, "\n".join(lines), sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "\n".join(lines), sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 20)
|
||||||
self._rate_set(sender, "背包")
|
self._rate_set(sender, "背包")
|
||||||
return True, "背包"
|
return True, "背包"
|
||||||
|
|
||||||
async def _cmd_breakthrough(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
async def _cmd_breakthrough(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
||||||
player = self._get_player(sender)
|
player = self._get_player(sender)
|
||||||
if not player:
|
if not player:
|
||||||
await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未注册"
|
return False, "未注册"
|
||||||
points = int(player.get("cultivation_points", 0))
|
points = int(player.get("cultivation_points", 0))
|
||||||
inv = player.get("inventory") or {}
|
inv = player.get("inventory") or {}
|
||||||
@@ -762,17 +880,25 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
stage_key = f"{prefix}10层"
|
stage_key = f"{prefix}10层"
|
||||||
stage_conf = self.break_config.get(stage_key)
|
stage_conf = self.break_config.get(stage_key)
|
||||||
if not stage_conf:
|
if not stage_conf:
|
||||||
await bot.send_text_message(roomid or sender, "当前境界未到瓶颈或未配置突破路径", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "当前境界未到瓶颈或未配置突破路径", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未到瓶颈"
|
return False, "未到瓶颈"
|
||||||
pill_conf = stage_conf.get("pill")
|
pill_conf = stage_conf.get("pill")
|
||||||
if not pill_conf:
|
if not pill_conf:
|
||||||
await bot.send_text_message(roomid or sender, "丹药路径未配置", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "丹药路径未配置", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未配置"
|
return False, "未配置"
|
||||||
if points < pill_conf["cost"]:
|
if points < pill_conf["cost"]:
|
||||||
await bot.send_text_message(roomid or sender, "修为不足,无法突破", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "修为不足,无法突破", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "修为不足"
|
return False, "修为不足"
|
||||||
if inv.get(self.bt_pill_item, 0) <= 0:
|
if inv.get(self.bt_pill_item, 0) <= 0:
|
||||||
await bot.send_text_message(roomid or sender, f"缺少丹药:{self.bt_pill_item}", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"缺少丹药:{self.bt_pill_item}", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "缺少丹药"
|
return False, "缺少丹药"
|
||||||
inv[self.bt_pill_item] = inv.get(self.bt_pill_item, 0) - 1
|
inv[self.bt_pill_item] = inv.get(self.bt_pill_item, 0) - 1
|
||||||
player["inventory"] = inv
|
player["inventory"] = inv
|
||||||
@@ -790,18 +916,24 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
self._set_realm(sender, player, pill_conf["target"])
|
self._set_realm(sender, player, pill_conf["target"])
|
||||||
self.redis_db.leaderboard_add(sender, float(player["cultivation_points"]))
|
self.redis_db.leaderboard_add(sender, float(player["cultivation_points"]))
|
||||||
self._rate_set(sender, "突破")
|
self._rate_set(sender, "突破")
|
||||||
await bot.send_text_message(roomid or sender, f"✅ 突破成功,晋升至{pill_conf['target']}", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 突破成功,晋升至{pill_conf['target']}", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
|
||||||
return True, "突破成功"
|
return True, "突破成功"
|
||||||
else:
|
else:
|
||||||
self._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, "突破")
|
self._rate_set(sender, "突破")
|
||||||
await bot.send_text_message(roomid or sender, "❌ 突破失败", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "❌ 突破失败", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "突破失败"
|
return False, "突破失败"
|
||||||
|
|
||||||
async def _cmd_force_breakthrough(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
async def _cmd_force_breakthrough(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
||||||
player = self._get_player(sender)
|
player = self._get_player(sender)
|
||||||
if not player:
|
if not player:
|
||||||
await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未注册"
|
return False, "未注册"
|
||||||
points = int(player.get("cultivation_points", 0))
|
points = int(player.get("cultivation_points", 0))
|
||||||
# 读取当前瓶颈配置
|
# 读取当前瓶颈配置
|
||||||
@@ -810,14 +942,20 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
stage_key = f"{prefix}10层"
|
stage_key = f"{prefix}10层"
|
||||||
stage_conf = self.break_config.get(stage_key)
|
stage_conf = self.break_config.get(stage_key)
|
||||||
if not stage_conf:
|
if not stage_conf:
|
||||||
await bot.send_text_message(roomid or sender, "当前境界未到瓶颈或未配置突破路径", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "当前境界未到瓶颈或未配置突破路径", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未到瓶颈"
|
return False, "未到瓶颈"
|
||||||
hard_conf = stage_conf.get("hard")
|
hard_conf = stage_conf.get("hard")
|
||||||
if not hard_conf:
|
if not hard_conf:
|
||||||
await bot.send_text_message(roomid or sender, "强行路径未配置", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "强行路径未配置", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未配置"
|
return False, "未配置"
|
||||||
if points < hard_conf["cost"]:
|
if points < hard_conf["cost"]:
|
||||||
await bot.send_text_message(roomid or sender, "修为不足,无法强行突破", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "修为不足,无法强行突破", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "修为不足"
|
return False, "修为不足"
|
||||||
player["cultivation_points"] = points - hard_conf["cost"]
|
player["cultivation_points"] = points - hard_conf["cost"]
|
||||||
if self.xdb:
|
if self.xdb:
|
||||||
@@ -831,42 +969,60 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
self._set_realm(sender, player, hard_conf["target"])
|
self._set_realm(sender, player, hard_conf["target"])
|
||||||
self.redis_db.leaderboard_add(sender, float(player["cultivation_points"]))
|
self.redis_db.leaderboard_add(sender, float(player["cultivation_points"]))
|
||||||
self._rate_set(sender, "强行突破")
|
self._rate_set(sender, "强行突破")
|
||||||
await bot.send_text_message(roomid or sender, f"✅ 强行突破成功,晋升至{hard_conf['target']}", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 强行突破成功,晋升至{hard_conf['target']}", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
|
||||||
return True, "强行突破成功"
|
return True, "强行突破成功"
|
||||||
else:
|
else:
|
||||||
self._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, "强行突破")
|
self._rate_set(sender, "强行突破")
|
||||||
await bot.send_text_message(roomid or sender, "❌ 强行突破失败,灵气反噬!", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "❌ 强行突破失败,灵气反噬!", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "强行突破失败"
|
return False, "强行突破失败"
|
||||||
|
|
||||||
async def _cmd_rob(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
async def _cmd_rob(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
||||||
target = content.strip().lstrip("@")
|
target = content.strip().lstrip("@")
|
||||||
if not target:
|
if not target:
|
||||||
await bot.send_text_message(roomid or sender, "命令格式:劫掠 目标wxid", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "命令格式:劫掠 目标wxid", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "命令格式错误"
|
return False, "命令格式错误"
|
||||||
if target == sender:
|
if target == sender:
|
||||||
await bot.send_text_message(roomid or sender, "不可劫掠自己", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "不可劫掠自己", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "非法目标"
|
return False, "非法目标"
|
||||||
attacker = self._get_player(sender)
|
attacker = self._get_player(sender)
|
||||||
defender = self._get_player(target)
|
defender = self._get_player(target)
|
||||||
if not attacker or not defender:
|
if not attacker or not defender:
|
||||||
await bot.send_text_message(roomid or sender, "双方需已注册", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "双方需已注册", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未注册"
|
return False, "未注册"
|
||||||
attacker = self._check_status_update(attacker)
|
attacker = self._check_status_update(attacker)
|
||||||
defender = self._check_status_update(defender)
|
defender = self._check_status_update(defender)
|
||||||
# 新手保护:不可劫掠炼气期
|
# 新手保护:不可劫掠炼气期
|
||||||
def_prefix, _ = self._parse_realm(defender.get("realm", "炼气1层"))
|
def_prefix, _ = self._parse_realm(defender.get("realm", "炼气1层"))
|
||||||
if def_prefix == "炼气":
|
if def_prefix == "炼气":
|
||||||
await bot.send_text_message(roomid or sender, "目标处于新手保护期(炼气),不可劫掠", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "目标处于新手保护期(炼气),不可劫掠", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "新手保护"
|
return False, "新手保护"
|
||||||
if defender.get("status") in ("Cultivating", "Injured"):
|
if defender.get("status") in ("Cultivating", "Injured"):
|
||||||
await bot.send_text_message(roomid or sender, "目标处于保护或闭关中", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "目标处于保护或闭关中", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "目标保护"
|
return False, "目标保护"
|
||||||
if roomid and (attacker.get("group_id") != roomid or defender.get("group_id") != roomid):
|
if roomid and (attacker.get("group_id") != roomid or defender.get("group_id") != roomid):
|
||||||
await bot.send_text_message(roomid or sender, "仅限同群内劫掠", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "仅限同群内劫掠", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "跨群"
|
return False, "跨群"
|
||||||
if attacker.get("clan_id") and defender.get("clan_id") and attacker.get("clan_id") == defender.get("clan_id"):
|
if attacker.get("clan_id") and defender.get("clan_id") and attacker.get("clan_id") == defender.get("clan_id"):
|
||||||
await bot.send_text_message(roomid or sender, "不可劫掠同门", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "不可劫掠同门", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "同门"
|
return False, "同门"
|
||||||
a_pts = int(attacker.get("cultivation_points", 0))
|
a_pts = int(attacker.get("cultivation_points", 0))
|
||||||
d_pts = int(defender.get("cultivation_points", 0))
|
d_pts = int(defender.get("cultivation_points", 0))
|
||||||
@@ -883,69 +1039,107 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
attacker["spirit_stone"] = int(attacker.get("spirit_stone", 0)) + gain
|
attacker["spirit_stone"] = int(attacker.get("spirit_stone", 0)) + gain
|
||||||
defender["status"] = "Injured"
|
defender["status"] = "Injured"
|
||||||
defender["status_until"] = (datetime.now(timezone.utc) + timedelta(minutes=int(self.injured_minutes))).isoformat()
|
defender["status_until"] = (datetime.now(timezone.utc) + timedelta(minutes=int(self.injured_minutes))).isoformat()
|
||||||
self._save_player(defender)
|
if self.xdb:
|
||||||
self._save_player(attacker)
|
try:
|
||||||
|
self.xdb.update_player_fields(defender.get("user_id"), {"spirit_stone": defender["spirit_stone"], "status": defender["status"], "status_until": defender["status_until"]})
|
||||||
|
self.xdb.update_player_fields(attacker.get("user_id"), {"spirit_stone": attacker["spirit_stone"]})
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
self.redis_db.save_player(defender)
|
||||||
|
self.redis_db.save_player(attacker)
|
||||||
self._rate_set(sender, "劫掠")
|
self._rate_set(sender, "劫掠")
|
||||||
await bot.send_text_message(roomid or sender, f"✅ 劫掠成功,获得灵石{gain}", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 劫掠成功,获得灵石{gain}", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
|
||||||
if roomid:
|
if roomid:
|
||||||
await bot.send_text_message(roomid, f"{sender} 劫掠 {target} 成功,目标进入受伤保护", [target])
|
g_client_msg_id, g_create_time, g_new_msg_id = await bot.send_text_message(roomid, f"{sender} 劫掠 {target} 成功,目标进入受伤保护", [target])
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke(roomid, g_client_msg_id, g_create_time, g_new_msg_id, 10)
|
||||||
return True, "劫掠成功"
|
return True, "劫掠成功"
|
||||||
else:
|
else:
|
||||||
self._rate_set(sender, "劫掠")
|
self._rate_set(sender, "劫掠")
|
||||||
await bot.send_text_message(roomid or sender, "❌ 劫掠失败", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "❌ 劫掠失败", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "劫掠失败"
|
return False, "劫掠失败"
|
||||||
|
|
||||||
async def _cmd_give_stone(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
async def _cmd_give_stone(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
||||||
parts = content.strip().split()
|
parts = content.strip().split()
|
||||||
if len(parts) < 2:
|
if len(parts) < 2:
|
||||||
await bot.send_text_message(roomid or sender, "命令格式:赠与 目标wxid 数量", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "命令格式:赠与 目标wxid 数量", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "命令格式错误"
|
return False, "命令格式错误"
|
||||||
target = parts[0].lstrip("@")
|
target = parts[0].lstrip("@")
|
||||||
try:
|
try:
|
||||||
qty = int(parts[1])
|
qty = int(parts[1])
|
||||||
except Exception:
|
except Exception:
|
||||||
await bot.send_text_message(roomid or sender, "命令格式:赠与 目标wxid 数量", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "命令格式:赠与 目标wxid 数量", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "命令格式错误"
|
return False, "命令格式错误"
|
||||||
giver = self._get_player_with_cache(sender)
|
giver = self._get_player_with_cache(sender)
|
||||||
receiver = self._get_player_with_cache(target)
|
receiver = self._get_player_with_cache(target)
|
||||||
if not giver or not receiver:
|
if not giver or not receiver:
|
||||||
await bot.send_text_message(roomid or sender, "双方需已注册", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "双方需已注册", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未注册"
|
return False, "未注册"
|
||||||
if not giver.get("clan_id") or giver.get("clan_id") != receiver.get("clan_id"):
|
if not giver.get("clan_id") or giver.get("clan_id") != receiver.get("clan_id"):
|
||||||
await bot.send_text_message(roomid or sender, "仅同门可赠与灵石", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "仅同门可赠与灵石", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "不同门"
|
return False, "不同门"
|
||||||
stones = int(giver.get("spirit_stone", 0))
|
stones = int(giver.get("spirit_stone", 0))
|
||||||
if qty <= 0 or stones < qty:
|
if qty <= 0 or stones < qty:
|
||||||
await bot.send_text_message(roomid or sender, "灵石不足或数量不合法", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "灵石不足或数量不合法", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "灵石不足"
|
return False, "灵石不足"
|
||||||
giver["spirit_stone"] = stones - qty
|
giver["spirit_stone"] = stones - qty
|
||||||
receiver["spirit_stone"] = int(receiver.get("spirit_stone", 0)) + qty
|
receiver["spirit_stone"] = int(receiver.get("spirit_stone", 0)) + qty
|
||||||
|
if self.xdb:
|
||||||
|
try:
|
||||||
|
self.xdb.update_player_fields(sender, {"spirit_stone": giver["spirit_stone"]})
|
||||||
|
self.xdb.update_player_fields(target, {"spirit_stone": receiver["spirit_stone"]})
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
self._save_player(giver)
|
self._save_player(giver)
|
||||||
self._save_player(receiver)
|
self._save_player(receiver)
|
||||||
self._rate_set(sender, "赠与")
|
self._rate_set(sender, "赠与")
|
||||||
await bot.send_text_message(roomid or sender, f"✅ 已向 {target} 赠与灵石 {qty}", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 已向 {target} 赠与灵石 {qty}", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
|
||||||
return True, "赠与成功"
|
return True, "赠与成功"
|
||||||
|
|
||||||
async def _cmd_give_item(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
async def _cmd_give_item(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
||||||
parts = content.strip().split()
|
parts = content.strip().split()
|
||||||
if len(parts) < 3:
|
if len(parts) < 3:
|
||||||
await bot.send_text_message(roomid or sender, "命令格式:赠送 目标wxid 物品 数量", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "命令格式:赠送 目标wxid 物品 数量", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "命令格式错误"
|
return False, "命令格式错误"
|
||||||
target = parts[0].lstrip("@")
|
target = parts[0].lstrip("@")
|
||||||
item_name = parts[1]
|
item_name = parts[1]
|
||||||
try:
|
try:
|
||||||
qty = int(parts[2])
|
qty = int(parts[2])
|
||||||
except Exception:
|
except Exception:
|
||||||
await bot.send_text_message(roomid or sender, "命令格式:赠送 目标wxid 物品 数量", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "命令格式:赠送 目标wxid 物品 数量", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "命令格式错误"
|
return False, "命令格式错误"
|
||||||
giver = self._get_player(sender)
|
giver = self._get_player(sender)
|
||||||
receiver = self._get_player(target)
|
receiver = self._get_player(target)
|
||||||
if not giver or not receiver:
|
if not giver or not receiver:
|
||||||
await bot.send_text_message(roomid or sender, "双方需已注册", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "双方需已注册", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未注册"
|
return False, "未注册"
|
||||||
inv_g = giver.get("inventory") or {}
|
inv_g = giver.get("inventory") or {}
|
||||||
if inv_g.get(item_name, 0) < qty or qty <= 0:
|
if inv_g.get(item_name, 0) < qty or qty <= 0:
|
||||||
await bot.send_text_message(roomid or sender, "物品不足或数量不合法", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "物品不足或数量不合法", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "物品不足"
|
return False, "物品不足"
|
||||||
inv_r = receiver.get("inventory") or {}
|
inv_r = receiver.get("inventory") or {}
|
||||||
inv_g[item_name] = inv_g.get(item_name, 0) - qty
|
inv_g[item_name] = inv_g.get(item_name, 0) - qty
|
||||||
@@ -955,35 +1149,47 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
if self.xdb:
|
if self.xdb:
|
||||||
ok = self.xdb.transfer_item(sender, target, item_name, qty)
|
ok = self.xdb.transfer_item(sender, target, item_name, qty)
|
||||||
if not ok:
|
if not ok:
|
||||||
await bot.send_text_message(roomid or sender, "物品转移失败", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "物品转移失败", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "转移失败"
|
return False, "转移失败"
|
||||||
self.redis_db.invalidate_player(sender)
|
self.redis_db.invalidate_player(sender)
|
||||||
self.redis_db.invalidate_player(target)
|
self.redis_db.invalidate_player(target)
|
||||||
self._save_player(giver)
|
self._save_player(giver)
|
||||||
self._save_player(receiver)
|
self._save_player(receiver)
|
||||||
self._rate_set(sender, "赠送")
|
self._rate_set(sender, "赠送")
|
||||||
await bot.send_text_message(roomid or sender, f"✅ 已向 {target} 赠送 {item_name} × {qty}", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 已向 {target} 赠送 {item_name} × {qty}", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
|
||||||
return True, "赠送成功"
|
return True, "赠送成功"
|
||||||
|
|
||||||
async def _cmd_clan_create(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
async def _cmd_clan_create(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
||||||
name = content.strip()
|
name = content.strip()
|
||||||
if not name:
|
if not name:
|
||||||
await bot.send_text_message(roomid or sender, "命令格式:创建门派 名称", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "命令格式:创建门派 名称", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "命令格式错误"
|
return False, "命令格式错误"
|
||||||
player = self._get_player_with_cache(sender)
|
player = self._get_player_with_cache(sender)
|
||||||
if not player:
|
if not player:
|
||||||
await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未注册"
|
return False, "未注册"
|
||||||
prefix, _ = self._parse_realm(player.get("realm", "炼气1层"))
|
prefix, _ = self._parse_realm(player.get("realm", "炼气1层"))
|
||||||
allowed = {"元婴", "化神", "合体", "大乘", "渡劫", "真仙"}
|
allowed = {"元婴", "化神", "合体", "大乘", "渡劫", "真仙"}
|
||||||
if prefix not in allowed:
|
if prefix not in allowed:
|
||||||
await bot.send_text_message(roomid or sender, "创建门派需达到元婴期及以上", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "创建门派需达到元婴期及以上", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "境界不足"
|
return False, "境界不足"
|
||||||
clan_id = None
|
clan_id = None
|
||||||
if self.xdb:
|
if self.xdb:
|
||||||
clan_id = self.xdb.create_clan(name, roomid or "", sender)
|
clan_id = self.xdb.create_clan(name, roomid or "", sender)
|
||||||
if clan_id is None:
|
if clan_id is None:
|
||||||
await bot.send_text_message(roomid or sender, "门派已存在或创建失败", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "门派已存在或创建失败", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "门派失败"
|
return False, "门派失败"
|
||||||
if player and clan_id is not None:
|
if player and clan_id is not None:
|
||||||
player["clan_id"] = int(clan_id)
|
player["clan_id"] = int(clan_id)
|
||||||
@@ -992,23 +1198,31 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
self.redis_db.invalidate_player(sender)
|
self.redis_db.invalidate_player(sender)
|
||||||
self._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, "创建门派")
|
self._rate_set(sender, "创建门派")
|
||||||
await bot.send_text_message(roomid or sender, f"✅ 门派已创建:{name}", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 门派已创建:{name}", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
|
||||||
return True, "创建门派"
|
return True, "创建门派"
|
||||||
|
|
||||||
async def _cmd_clan_join(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
async def _cmd_clan_join(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
||||||
name = content.strip()
|
name = content.strip()
|
||||||
if not name:
|
if not name:
|
||||||
await bot.send_text_message(roomid or sender, "命令格式:加入门派 名称", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "命令格式:加入门派 名称", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "命令格式错误"
|
return False, "命令格式错误"
|
||||||
player = self._get_player_with_cache(sender)
|
player = self._get_player_with_cache(sender)
|
||||||
if not player:
|
if not player:
|
||||||
await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未注册"
|
return False, "未注册"
|
||||||
cid = None
|
cid = None
|
||||||
if self.xdb:
|
if self.xdb:
|
||||||
cid = self.xdb.get_clan_id(roomid or "", name)
|
cid = self.xdb.get_clan_id(roomid or "", name)
|
||||||
if not cid:
|
if not cid:
|
||||||
await bot.send_text_message(roomid or sender, "门派不存在", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "门派不存在", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "门派不存在"
|
return False, "门派不存在"
|
||||||
player["clan_id"] = int(cid) if isinstance(cid, str) else cid
|
player["clan_id"] = int(cid) if isinstance(cid, str) else cid
|
||||||
if self.xdb:
|
if self.xdb:
|
||||||
@@ -1016,13 +1230,17 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
self.redis_db.invalidate_player(sender)
|
self.redis_db.invalidate_player(sender)
|
||||||
self._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, "加入门派")
|
self._rate_set(sender, "加入门派")
|
||||||
await bot.send_text_message(roomid or sender, f"✅ 已加入门派:{name}", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 已加入门派:{name}", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
|
||||||
return True, "加入门派"
|
return True, "加入门派"
|
||||||
|
|
||||||
async def _cmd_clan_exit(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
async def _cmd_clan_exit(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
|
||||||
player = self._get_player_with_cache(sender)
|
player = self._get_player_with_cache(sender)
|
||||||
if not player:
|
if not player:
|
||||||
await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "未注册,请先发送:注册修仙 道号", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||||
return False, "未注册"
|
return False, "未注册"
|
||||||
player["clan_id"] = None
|
player["clan_id"] = None
|
||||||
if self.xdb:
|
if self.xdb:
|
||||||
@@ -1030,5 +1248,7 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
self.redis_db.invalidate_player(sender)
|
self.redis_db.invalidate_player(sender)
|
||||||
self._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, "退出门派")
|
self._rate_set(sender, "退出门派")
|
||||||
await bot.send_text_message(roomid or sender, "✅ 已退出门派", sender)
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "✅ 已退出门派", sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
|
||||||
return True, "退出门派"
|
return True, "退出门派"
|
||||||
Reference in New Issue
Block a user