优化指令,自动回复状态,防止用户过度查询
This commit is contained in:
@@ -26,8 +26,10 @@ from db.xiuxian_db import XiuxianDB
|
|||||||
from db.points_db import PointsDBOperator, PointSource
|
from db.points_db import PointsDBOperator, PointSource
|
||||||
from datetime import timezone
|
from datetime import timezone
|
||||||
|
|
||||||
|
|
||||||
class XiuxianRedisDB:
|
class XiuxianRedisDB:
|
||||||
"""修仙插件的 Redis 访问封装:玩家缓存、限流键与排行榜。"""
|
"""修仙插件的 Redis 访问封装:玩家缓存、限流键与排行榜。"""
|
||||||
|
|
||||||
def __init__(self, db_manager: DBConnectionManager):
|
def __init__(self, db_manager: DBConnectionManager):
|
||||||
self.db_manager = db_manager
|
self.db_manager = db_manager
|
||||||
self.player_prefix = "xiuxian:cache:player:"
|
self.player_prefix = "xiuxian:cache:player:"
|
||||||
@@ -342,7 +344,8 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
else:
|
else:
|
||||||
mn, q = kv, "1"
|
mn, q = kv, "1"
|
||||||
mats[mn.strip()] = int(q.strip())
|
mats[mn.strip()] = int(q.strip())
|
||||||
self.recipes[name] = {"materials": mats, "stone": int(stone_part.strip()), "rate": float(rate_part.strip())}
|
self.recipes[name] = {"materials": mats, "stone": int(stone_part.strip()),
|
||||||
|
"rate": float(rate_part.strip())}
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.LOG.warning(f"解析配方失败: {r}, 错误: {e}")
|
self.LOG.warning(f"解析配方失败: {r}, 错误: {e}")
|
||||||
|
|
||||||
@@ -478,67 +481,97 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
return False, "不匹配的命令"
|
return False, "不匹配的命令"
|
||||||
|
|
||||||
if not self.redis_db:
|
if not self.redis_db:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "❌ 天道失序,仙府未初始化(Redis)", sender)
|
text = "❌ 天道失序,仙府未初始化(Redis)" + self._compose_status_text(sender, roomid)
|
||||||
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), text,
|
||||||
|
sender)
|
||||||
if self.revoke:
|
if self.revoke:
|
||||||
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
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, roomid or "", cmd):
|
if self.redis_db.check_rate_limited(sender, roomid or "", cmd):
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "⚠️ 道友莫急,天道有序,稍候再试", sender)
|
text = "⚠️ 道友莫急,天道有序,稍候再试" + self._compose_status_text(sender, roomid)
|
||||||
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), text,
|
||||||
|
sender)
|
||||||
if self.revoke:
|
if self.revoke:
|
||||||
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
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 == "注册修仙":
|
||||||
return await self._cmd_register(bot, sender, roomid, content)
|
ok, msg = await self._cmd_register(bot, sender, roomid, content)
|
||||||
|
return ok, msg
|
||||||
if cmd in ("修仙帮助", "帮助", "help", "修仙指令", "指令"):
|
if cmd in ("修仙帮助", "帮助", "help", "修仙指令", "指令"):
|
||||||
return await self._cmd_help(bot, sender, roomid)
|
ok, msg = await self._cmd_help(bot, sender, roomid)
|
||||||
|
return ok, msg
|
||||||
if cmd in ("积分购石", "积分换灵石"):
|
if cmd in ("积分购石", "积分换灵石"):
|
||||||
return await self._cmd_points_to_stone(bot, sender, roomid, content)
|
ok, msg = await self._cmd_points_to_stone(bot, sender, roomid, content)
|
||||||
|
return ok, msg
|
||||||
if cmd == "我的状态":
|
if cmd == "我的状态":
|
||||||
return await self._cmd_status(bot, sender, roomid)
|
ok, msg = await self._cmd_status(bot, sender, roomid)
|
||||||
|
return ok, msg
|
||||||
if cmd == "闭关":
|
if cmd == "闭关":
|
||||||
return await self._cmd_cultivate(bot, sender, roomid)
|
ok, msg = await self._cmd_cultivate(bot, sender, roomid)
|
||||||
|
return ok, msg
|
||||||
if cmd == "出关":
|
if cmd == "出关":
|
||||||
return await self._cmd_finish_cultivate(bot, sender, roomid)
|
ok, msg = await self._cmd_finish_cultivate(bot, sender, roomid)
|
||||||
|
return ok, msg
|
||||||
if cmd == "聚灵":
|
if cmd == "聚灵":
|
||||||
return await self._cmd_gather(bot, sender, roomid, content)
|
ok, msg = await self._cmd_gather(bot, sender, roomid, content)
|
||||||
|
return ok, msg
|
||||||
if cmd == "排行榜":
|
if cmd == "排行榜":
|
||||||
return await self._cmd_leaderboard(bot, sender, roomid)
|
ok, msg = await self._cmd_leaderboard(bot, sender, roomid)
|
||||||
|
return ok, msg
|
||||||
if cmd == "修仙签到":
|
if cmd == "修仙签到":
|
||||||
return await self._cmd_signin(bot, sender, roomid)
|
ok, msg = await self._cmd_signin(bot, sender, roomid)
|
||||||
|
return ok, msg
|
||||||
if cmd == "坊市":
|
if cmd == "坊市":
|
||||||
return await self._cmd_shop(bot, sender, roomid)
|
ok, msg = await self._cmd_shop(bot, sender, roomid)
|
||||||
|
return ok, msg
|
||||||
if cmd == "购买":
|
if cmd == "购买":
|
||||||
return await self._cmd_buy(bot, sender, roomid, content)
|
ok, msg = await self._cmd_buy(bot, sender, roomid, content)
|
||||||
|
return ok, msg
|
||||||
if cmd == "出售":
|
if cmd == "出售":
|
||||||
return await self._cmd_sell(bot, sender, roomid, content)
|
ok, msg = await self._cmd_sell(bot, sender, roomid, content)
|
||||||
|
return ok, msg
|
||||||
if cmd == "乾坤袋":
|
if cmd == "乾坤袋":
|
||||||
return await self._cmd_bag(bot, sender, roomid)
|
ok, msg = await self._cmd_bag(bot, sender, roomid)
|
||||||
|
return ok, msg
|
||||||
if cmd in ("使用", "服用"):
|
if cmd in ("使用", "服用"):
|
||||||
return await self._cmd_use(bot, sender, roomid, content)
|
ok, msg = await self._cmd_use(bot, sender, roomid, content)
|
||||||
|
return ok, msg
|
||||||
if cmd == "出门历练":
|
if cmd == "出门历练":
|
||||||
return await self._cmd_expedition(bot, sender, roomid)
|
ok, msg = await self._cmd_expedition(bot, sender, roomid)
|
||||||
|
return ok, msg
|
||||||
if cmd == "炼丹":
|
if cmd == "炼丹":
|
||||||
return await self._cmd_alchemy(bot, sender, roomid, content)
|
ok, msg = await self._cmd_alchemy(bot, sender, roomid, content)
|
||||||
|
return ok, msg
|
||||||
if cmd == "突破":
|
if cmd == "突破":
|
||||||
return await self._cmd_breakthrough(bot, sender, roomid)
|
ok, msg = await self._cmd_breakthrough(bot, sender, roomid)
|
||||||
|
return ok, msg
|
||||||
if cmd == "强行突破":
|
if cmd == "强行突破":
|
||||||
return await self._cmd_force_breakthrough(bot, sender, roomid)
|
ok, msg = await self._cmd_force_breakthrough(bot, sender, roomid)
|
||||||
|
return ok, msg
|
||||||
if cmd == "劫掠":
|
if cmd == "劫掠":
|
||||||
return await self._cmd_rob(bot, sender, roomid, content)
|
ok, msg = await self._cmd_rob(bot, sender, roomid, content)
|
||||||
|
return ok, msg
|
||||||
if cmd == "赠与":
|
if cmd == "赠与":
|
||||||
return await self._cmd_give_stone(bot, sender, roomid, content)
|
ok, msg = await self._cmd_give_stone(bot, sender, roomid, content)
|
||||||
|
return ok, msg
|
||||||
if cmd == "赠送":
|
if cmd == "赠送":
|
||||||
return await self._cmd_give_item(bot, sender, roomid, content)
|
ok, msg = await self._cmd_give_item(bot, sender, roomid, content)
|
||||||
|
return ok, msg
|
||||||
if cmd == "创建门派":
|
if cmd == "创建门派":
|
||||||
return await self._cmd_clan_create(bot, sender, roomid, content)
|
ok, msg = await self._cmd_clan_create(bot, sender, roomid, content)
|
||||||
|
return ok, msg
|
||||||
if cmd == "加入门派":
|
if cmd == "加入门派":
|
||||||
return await self._cmd_clan_join(bot, sender, roomid, content)
|
ok, msg = await self._cmd_clan_join(bot, sender, roomid, content)
|
||||||
|
return ok, msg
|
||||||
if cmd == "退出门派":
|
if cmd == "退出门派":
|
||||||
return await self._cmd_clan_exit(bot, sender, roomid)
|
ok, msg = await self._cmd_clan_exit(bot, sender, roomid)
|
||||||
|
return ok, msg
|
||||||
|
|
||||||
return False, "未知命令"
|
return False, "未知命令"
|
||||||
|
|
||||||
@@ -606,10 +639,13 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
self._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, roomid or "", "注册修仙")
|
self._rate_set(sender, roomid or "", "注册修仙")
|
||||||
# 初始化境界排行榜分值
|
# 初始化境界排行榜分值
|
||||||
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"])))
|
||||||
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)
|
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:
|
if self.revoke:
|
||||||
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
|
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]:
|
||||||
@@ -640,7 +676,8 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
# 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:
|
||||||
# client_msg_id, create_time, new_msg_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:
|
# if self.revoke:
|
||||||
@@ -682,9 +719,8 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
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)
|
self._save_player(player)
|
||||||
self._rate_set(sender, roomid or "", "积分购石")
|
self._rate_set(sender, roomid or "", "积分购石")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 积分化石,消耗{pts},得灵石{stones_gain}({rate}分=1石)", sender)
|
await self._send_text_with_status(bot, sender, roomid,
|
||||||
if self.revoke:
|
f"✅ 积分化石,消耗{pts},得灵石{stones_gain}({rate}分=1石)", 10)
|
||||||
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]:
|
||||||
@@ -709,12 +745,44 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
f"💎 灵石:{player.get('spirit_stone')}枚\n"
|
f"💎 灵石:{player.get('spirit_stone')}枚\n"
|
||||||
f"💚 状态:{status_cn}"
|
f"💚 状态:{status_cn}"
|
||||||
)
|
)
|
||||||
client_msg_id, create_time, new_msg_id = 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:
|
if self.revoke:
|
||||||
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 20)
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id,
|
||||||
|
20)
|
||||||
self._rate_set(sender, roomid or "", "我的状态")
|
self._rate_set(sender, roomid or "", "我的状态")
|
||||||
return True, "状态展示"
|
return True, "状态展示"
|
||||||
|
|
||||||
|
def _compose_status_text(self, sender: str, roomid: str) -> str:
|
||||||
|
player = self._get_player_with_cache(sender, roomid or "")
|
||||||
|
if not player:
|
||||||
|
return ""
|
||||||
|
player = self._check_status_update(player)
|
||||||
|
status_code = player.get("status")
|
||||||
|
status_cn = {
|
||||||
|
"Idle": "空闲",
|
||||||
|
"Cultivating": "闭关",
|
||||||
|
"Unstable_Qi": "气息不稳",
|
||||||
|
"Injured": "受伤保护",
|
||||||
|
"Expedition": "历练"
|
||||||
|
}.get(status_code, str(status_code))
|
||||||
|
return (
|
||||||
|
f"\n—— 当前状态 ——\n"
|
||||||
|
f"📇 道号:{player.get('dao_name')}【{player.get('spirit_root')}】\n"
|
||||||
|
f"✨ 境界:{player.get('realm')}(修为:{player.get('cultivation_points')}点)\n"
|
||||||
|
f"💎 灵石:{player.get('spirit_stone')}枚\n"
|
||||||
|
f"💚 状态:{status_cn}"
|
||||||
|
)
|
||||||
|
|
||||||
|
async def _send_text_with_status(self, bot: WechatAPIClient, sender: str, roomid: str, main_text: str,
|
||||||
|
revoke_seconds: int = 10):
|
||||||
|
status_text = self._compose_status_text(sender, roomid)
|
||||||
|
text = main_text + (status_text if status_text else "")
|
||||||
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, text, sender)
|
||||||
|
if self.revoke:
|
||||||
|
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id,
|
||||||
|
revoke_seconds)
|
||||||
|
|
||||||
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._get_player_with_cache(sender, roomid or "")
|
player = self._get_player_with_cache(sender, roomid or "")
|
||||||
if not player:
|
if not player:
|
||||||
@@ -737,17 +805,13 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
"Injured": "受伤保护",
|
"Injured": "受伤保护",
|
||||||
"Expedition": "历练"
|
"Expedition": "历练"
|
||||||
}.get(status, str(status))
|
}.get(status, str(status))
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), f"当前状态[{status_cn}]不宜闭关", sender)
|
await self._send_text_with_status(bot, sender, roomid, f"当前状态[{status_cn}]不宜闭关", 10)
|
||||||
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._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, roomid or "", "闭关")
|
self._rate_set(sender, roomid or "", "闭关")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "✅ 已入静闭关,期间天道护持,不可被劫", sender)
|
await self._send_text_with_status(bot, sender, roomid, "✅ 已入静闭关,期间天道护持,不可被劫", 10)
|
||||||
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]:
|
||||||
@@ -790,9 +854,9 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
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, roomid or "", "出关")
|
self._rate_set(sender, roomid or "", "出关")
|
||||||
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)
|
await self._send_text_with_status(bot, sender, roomid,
|
||||||
if self.revoke:
|
f"✅ 出关一朝,修为进益:{gain}({duration_hours:.1f}小时)\n现有修为:{player['cultivation_points']}\n状态:气息未平 {self.unstable_qi_minutes}分钟",
|
||||||
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 20)
|
10)
|
||||||
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]:
|
||||||
@@ -845,9 +909,7 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
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, roomid or "", "聚灵")
|
self._rate_set(sender, roomid or "", "聚灵")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), f"✅ 灵气入体,消耗灵石{qty},修为涨{gain}", sender)
|
await self._send_text_with_status(bot, sender, roomid, f"✅ 灵气入体,消耗灵石{qty},修为涨{gain}", 10)
|
||||||
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]:
|
||||||
@@ -861,9 +923,8 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
mark = "你" if uid == sender else ""
|
mark = "你" if uid == sender else ""
|
||||||
lines.append(f"{rank}. {nick} - 修为 {cp} {mark}")
|
lines.append(f"{rank}. {nick} - 修为 {cp} {mark}")
|
||||||
rank += 1
|
rank += 1
|
||||||
client_msg_id, create_time, new_msg_id = 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),
|
||||||
if self.revoke:
|
"\n".join(lines), sender)
|
||||||
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 20)
|
|
||||||
self._rate_set(sender, roomid or "", "排行榜")
|
self._rate_set(sender, roomid or "", "排行榜")
|
||||||
return True, "排行榜"
|
return True, "排行榜"
|
||||||
|
|
||||||
@@ -873,7 +934,8 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
def _save_player(self, player: Dict[str, Any]):
|
def _save_player(self, player: Dict[str, Any]):
|
||||||
if self.xdb:
|
if self.xdb:
|
||||||
fields = {}
|
fields = {}
|
||||||
for k in ("group_id","dao_name","realm","spirit_root","cultivation_points","spirit_stone","status","status_until","last_cultivate_time","clan_id"):
|
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:
|
if k in player:
|
||||||
fields[k] = player[k]
|
fields[k] = player[k]
|
||||||
try:
|
try:
|
||||||
@@ -993,18 +1055,14 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
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, roomid or "", "签到")
|
self._rate_set(sender, roomid or "", "签到")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 灵运昌盛,获灵石{reward}", sender)
|
await self._send_text_with_status(bot, sender, roomid, f"✅ 灵运昌盛,获灵石{reward}", 10)
|
||||||
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']}灵石")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "\n".join(lines), sender)
|
await self._send_text_with_status(bot, sender, roomid, "\n".join(lines), 10)
|
||||||
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, roomid or "", "坊市")
|
self._rate_set(sender, roomid or "", "坊市")
|
||||||
return True, "坊市"
|
return True, "坊市"
|
||||||
|
|
||||||
@@ -1049,15 +1107,14 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
player["inventory"] = inv
|
player["inventory"] = inv
|
||||||
if self.xdb:
|
if self.xdb:
|
||||||
try:
|
try:
|
||||||
self.xdb.update_player_fields(sender, player.get("group_id", ""), {"spirit_stone": player["spirit_stone"]})
|
self.xdb.update_player_fields(sender, player.get("group_id", ""),
|
||||||
self.xdb.add_item(sender, item_name, item.get("type","other"), qty)
|
{"spirit_stone": player["spirit_stone"]})
|
||||||
|
self.xdb.add_item(sender, item_name, item.get("type", "other"), qty)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
self._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, roomid or "", "购买")
|
self._rate_set(sender, roomid or "", "购买")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 已购得 {item_name} × {qty}", sender)
|
await self._send_text_with_status(bot, sender, roomid, f"✅ 已购得 {item_name} × {qty}", 10)
|
||||||
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_sell(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
async def _cmd_sell(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
||||||
@@ -1088,14 +1145,13 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
if self.xdb:
|
if self.xdb:
|
||||||
try:
|
try:
|
||||||
self.xdb.remove_item(sender, item_name, qty)
|
self.xdb.remove_item(sender, item_name, qty)
|
||||||
self.xdb.update_player_fields(sender, player.get("group_id", ""), {"spirit_stone": player["spirit_stone"]})
|
self.xdb.update_player_fields(sender, player.get("group_id", ""),
|
||||||
|
{"spirit_stone": player["spirit_stone"]})
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
self._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, roomid or "", "出售")
|
self._rate_set(sender, roomid or "", "出售")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 已出手 {item_name} × {qty},入账灵石{revenue}", sender)
|
await self._send_text_with_status(bot, sender, roomid, f"✅ 已出手 {item_name} × {qty},入账灵石{revenue}", 10)
|
||||||
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]:
|
||||||
@@ -1118,9 +1174,7 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
else:
|
else:
|
||||||
for it in items:
|
for it in items:
|
||||||
lines.append(f"{it['name']} × {it['quantity']}")
|
lines.append(f"{it['name']} × {it['quantity']}")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "\n".join(lines), sender)
|
await self._send_text_with_status(bot, sender, roomid, "\n".join(lines), 10)
|
||||||
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, roomid or "", "背包")
|
self._rate_set(sender, roomid or "", "背包")
|
||||||
return True, "背包"
|
return True, "背包"
|
||||||
|
|
||||||
@@ -1129,9 +1183,12 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
if not player:
|
if not player:
|
||||||
return False, "道友尚未踏入仙途,请先发送:注册修仙 道号"
|
return False, "道友尚未踏入仙途,请先发送:注册修仙 道号"
|
||||||
if self.redis_db.check_rate_limited(sender, "__global__", "出门历练"):
|
if self.redis_db.check_rate_limited(sender, "__global__", "出门历练"):
|
||||||
client_msg_id, create_time, new_msg_id = 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:
|
if self.revoke:
|
||||||
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
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)
|
||||||
@@ -1276,7 +1333,11 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
player["status_until"] = final_until
|
player["status_until"] = final_until
|
||||||
if self.xdb:
|
if self.xdb:
|
||||||
try:
|
try:
|
||||||
self.xdb.update_player_fields(sender, player.get("group_id", ""), {"spirit_stone": player["spirit_stone"], "cultivation_points": player.get("cultivation_points", 0), "status": player.get("status"), "status_until": player.get("status_until")})
|
self.xdb.update_player_fields(sender, player.get("group_id", ""),
|
||||||
|
{"spirit_stone": player["spirit_stone"],
|
||||||
|
"cultivation_points": player.get("cultivation_points", 0),
|
||||||
|
"status": player.get("status"),
|
||||||
|
"status_until": player.get("status_until")})
|
||||||
for k, v in mats_gain.items():
|
for k, v in mats_gain.items():
|
||||||
self.xdb.add_item(sender, k, "材料", v)
|
self.xdb.add_item(sender, k, "材料", v)
|
||||||
except Exception:
|
except Exception:
|
||||||
@@ -1289,9 +1350,7 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
msg = f"✅ 行走四方所得:灵石{total_stones_delta},修为{cult_gain},材料:{mats_text}\n遭遇:{'、'.join(happened)}"
|
msg = f"✅ 行走四方所得:灵石{total_stones_delta},修为{cult_gain},材料:{mats_text}\n遭遇:{'、'.join(happened)}"
|
||||||
else:
|
else:
|
||||||
msg = f"✅ 行走四方所得:灵石{total_stones_delta},材料:{mats_text}\n遭遇:{'、'.join(happened)}"
|
msg = f"✅ 行走四方所得:灵石{total_stones_delta},材料:{mats_text}\n遭遇:{'、'.join(happened)}"
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, msg, sender)
|
await self._send_text_with_status(bot, sender, roomid, msg, 10)
|
||||||
if self.revoke:
|
|
||||||
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 90)
|
|
||||||
return True, "历练成功"
|
return True, "历练成功"
|
||||||
|
|
||||||
async def _cmd_use(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
async def _cmd_use(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
|
||||||
@@ -1317,9 +1376,7 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
pass
|
pass
|
||||||
self._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, roomid or "", "使用")
|
self._rate_set(sender, roomid or "", "使用")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "✅ 符文已启,本次聚灵更为顺畅", sender)
|
await self._send_text_with_status(bot, sender, roomid, "✅ 符文已启,本次聚灵更为顺畅", 10)
|
||||||
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, "使用聚灵符"
|
||||||
if item_name == "回气丹":
|
if item_name == "回气丹":
|
||||||
status = player.get("status", "Idle")
|
status = player.get("status", "Idle")
|
||||||
@@ -1336,9 +1393,7 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
pass
|
pass
|
||||||
self._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, roomid or "", "使用")
|
self._rate_set(sender, roomid or "", "使用")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "✅ 服下回气丹,气息平稳,恢复空闲", sender)
|
await self._send_text_with_status(bot, sender, roomid, "✅ 服下回气丹,气息平稳,恢复空闲", 10)
|
||||||
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, "服用回气丹"
|
||||||
# 灵根提升丹药
|
# 灵根提升丹药
|
||||||
upgrade_map = {
|
upgrade_map = {
|
||||||
@@ -1372,19 +1427,17 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
player["spirit_root_mult"] = mult
|
player["spirit_root_mult"] = mult
|
||||||
self._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, roomid or "", "使用")
|
self._rate_set(sender, roomid or "", "使用")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 灵根蜕变,当前灵根:{target}", sender)
|
await self._send_text_with_status(bot, sender, roomid, f"✅ 灵根蜕变,当前灵根:{target}", 10)
|
||||||
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:
|
||||||
# 失败,受伤保护
|
# 失败,受伤保护
|
||||||
player["status"] = "Injured"
|
player["status"] = "Injured"
|
||||||
player["status_until"] = (datetime.now(timezone.utc) + timedelta(minutes=rule["injured_min"])) .isoformat()
|
player["status_until"] = (
|
||||||
|
datetime.now(timezone.utc) + timedelta(minutes=rule["injured_min"])).isoformat()
|
||||||
self._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, roomid or "", "使用")
|
self._rate_set(sender, roomid or "", "使用")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"❌ 灵根淬炼失利,灵气反噬,受伤{rule['injured_min']}分钟", sender)
|
await self._send_text_with_status(bot, sender, roomid,
|
||||||
if self.revoke:
|
f"❌ 灵根淬炼失利,灵气反噬,受伤{rule['injured_min']}分钟", 10)
|
||||||
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
|
|
||||||
return False, "灵根提升失败"
|
return False, "灵根提升失败"
|
||||||
return False, "不可使用的物品"
|
return False, "不可使用的物品"
|
||||||
|
|
||||||
@@ -1429,10 +1482,13 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
player["inventory"] = inv
|
player["inventory"] = inv
|
||||||
if fail > 0:
|
if fail > 0:
|
||||||
player["status"] = "Unstable_Qi"
|
player["status"] = "Unstable_Qi"
|
||||||
player["status_until"] = (datetime.now(timezone.utc) + timedelta(minutes=int(self.unstable_qi_minutes))).isoformat()
|
player["status_until"] = (
|
||||||
|
datetime.now(timezone.utc) + timedelta(minutes=int(self.unstable_qi_minutes))).isoformat()
|
||||||
if self.xdb:
|
if self.xdb:
|
||||||
try:
|
try:
|
||||||
self.xdb.update_player_fields(sender, player.get("group_id", ""), {"spirit_stone": player["spirit_stone"], "status": player.get("status"), "status_until": player.get("status_until")})
|
self.xdb.update_player_fields(sender, player.get("group_id", ""),
|
||||||
|
{"spirit_stone": player["spirit_stone"], "status": player.get("status"),
|
||||||
|
"status_until": player.get("status_until")})
|
||||||
if success > 0:
|
if success > 0:
|
||||||
self.xdb.add_item(sender, item_name, item_type, success)
|
self.xdb.add_item(sender, item_name, item_type, success)
|
||||||
for mk, nv in need.items():
|
for mk, nv in need.items():
|
||||||
@@ -1443,9 +1499,8 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
self._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, roomid or "", "炼丹")
|
self._rate_set(sender, roomid or "", "炼丹")
|
||||||
msg = f"✅ 丹炉开盖,成丹{success},走丹{fail}"
|
msg = f"✅ 丹炉开盖,成丹{success},走丹{fail}"
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, msg, sender)
|
await self._send_text_with_status(bot, sender, roomid, msg, 10)
|
||||||
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_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]:
|
||||||
@@ -1463,30 +1518,25 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
prefix, layer = self._parse_realm(cur_realm)
|
prefix, layer = self._parse_realm(cur_realm)
|
||||||
# 优化:检查是否真的达到10层
|
# 优化:检查是否真的达到10层
|
||||||
if layer is None or layer < 10:
|
if layer is None or layer < 10:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"当前境界:{cur_realm},唯有至{prefix}10层方可冲关", sender)
|
await self._send_text_with_status(bot, sender, roomid, f"当前境界:{cur_realm},唯有至{prefix}10层方可冲关",
|
||||||
if self.revoke:
|
10)
|
||||||
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
|
||||||
return False, "未到瓶颈"
|
return False, "未到瓶颈"
|
||||||
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:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "此境瓶颈暂未开示,无法突破", sender)
|
await self._send_text_with_status(bot, sender, roomid, "此境瓶颈暂未开示,无法突破", 10)
|
||||||
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:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "丹道途径未明,暂不可试", sender)
|
await self._send_text_with_status(bot, sender, roomid, "丹道途径未明,暂不可试", 10)
|
||||||
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_item_name = pill_conf.get("item")
|
pill_item_name = pill_conf.get("item")
|
||||||
if not pill_item_name:
|
if not pill_item_name:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "缺少突破丹药的指引", sender)
|
await self._send_text_with_status(bot, sender, roomid, "缺少突破丹药的指引", 10)
|
||||||
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, "丹药未配置"
|
||||||
|
|
||||||
# 优化:从数据库读取最新的背包数据,确保数据准确性
|
# 优化:从数据库读取最新的背包数据,确保数据准确性
|
||||||
@@ -1508,14 +1558,12 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
pill_item_count = inv.get(pill_item_name, 0)
|
pill_item_count = inv.get(pill_item_name, 0)
|
||||||
|
|
||||||
if points < pill_conf["cost"]:
|
if points < pill_conf["cost"]:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "底蕴未满,暂不可冲关", sender)
|
await self._send_text_with_status(bot, sender, roomid, "底蕴未满,暂不可冲关", 10)
|
||||||
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 pill_item_count <= 0:
|
if pill_item_count <= 0:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"丹药未备:{pill_item_name}", sender)
|
await self._send_text_with_status(bot, sender, roomid, f"丹药未备:{pill_item_name}", 10)
|
||||||
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, "缺少丹药"
|
||||||
# 更新内存中的inventory(用于缓存)
|
# 更新内存中的inventory(用于缓存)
|
||||||
inv = player.get("inventory") or {}
|
inv = player.get("inventory") or {}
|
||||||
@@ -1525,7 +1573,8 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
if self.xdb:
|
if self.xdb:
|
||||||
try:
|
try:
|
||||||
self.xdb.remove_item(sender, pill_item_name, 1)
|
self.xdb.remove_item(sender, pill_item_name, 1)
|
||||||
self.xdb.update_player_fields(sender, player.get("group_id", ""), {"cultivation_points": player["cultivation_points"]})
|
self.xdb.update_player_fields(sender, player.get("group_id", ""),
|
||||||
|
{"cultivation_points": player["cultivation_points"]})
|
||||||
self.redis_db.invalidate_player(sender, player.get("group_id", ""))
|
self.redis_db.invalidate_player(sender, player.get("group_id", ""))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning(f"突破时更新数据库失败: {e}, user_id={sender}")
|
logger.warning(f"突破时更新数据库失败: {e}, user_id={sender}")
|
||||||
@@ -1535,17 +1584,15 @@ 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, roomid or "", "突破")
|
self._rate_set(sender, roomid or "", "突破")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 雷霆破关,晋至{pill_conf['target']}", sender)
|
await self._send_text_with_status(bot, sender, roomid, f"✅ 雷霆破关,晋至{pill_conf['target']}", 10)
|
||||||
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, roomid or "", "突破")
|
self._rate_set(sender, roomid or "", "突破")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "❌ 闭关未成,功亏一篑", sender)
|
await self._send_text_with_status(bot, sender, roomid, "❌ 闭关未成,功亏一篑", 10)
|
||||||
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]:
|
||||||
@@ -1562,32 +1609,30 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
prefix, layer = self._parse_realm(cur_realm)
|
prefix, layer = self._parse_realm(cur_realm)
|
||||||
# 优化:检查是否真的达到10层
|
# 优化:检查是否真的达到10层
|
||||||
if layer is None or layer < 10:
|
if layer is None or layer < 10:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"当前境界:{cur_realm},至{prefix}10层方能冒险强行冲关", sender)
|
await self._send_text_with_status(bot, sender, roomid,
|
||||||
if self.revoke:
|
f"当前境界:{cur_realm},至{prefix}10层方能冒险强行冲关", 10)
|
||||||
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
|
||||||
return False, "未到瓶颈"
|
return False, "未到瓶颈"
|
||||||
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:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "此境瓶颈暂未开示,无法强行冲关", sender)
|
await self._send_text_with_status(bot, sender, roomid, "此境瓶颈暂未开示,无法强行冲关", 10)
|
||||||
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:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "强行之法未载,难以施为", sender)
|
await self._send_text_with_status(bot, sender, roomid, "强行之法未载,难以施为", 10)
|
||||||
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"]:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "底蕴不足,强行为之只会贻害", sender)
|
await self._send_text_with_status(bot, sender, roomid, "底蕴不足,强行为之只会贻害", 10)
|
||||||
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:
|
||||||
try:
|
try:
|
||||||
self.xdb.update_player_fields(sender, player.get("group_id", ""), {"cultivation_points": player["cultivation_points"]})
|
self.xdb.update_player_fields(sender, player.get("group_id", ""),
|
||||||
|
{"cultivation_points": player["cultivation_points"]})
|
||||||
self.redis_db.invalidate_player(sender, player.get("group_id", ""))
|
self.redis_db.invalidate_player(sender, player.get("group_id", ""))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning(f"强行突破时更新数据库失败: {e}, user_id={sender}")
|
logger.warning(f"强行突破时更新数据库失败: {e}, user_id={sender}")
|
||||||
@@ -1596,17 +1641,15 @@ 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, roomid or "", "强行突破")
|
self._rate_set(sender, roomid or "", "强行突破")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 硬撼瓶颈,勉强晋至{hard_conf['target']}", sender)
|
await self._send_text_with_status(bot, sender, roomid, f"✅ 硬撼瓶颈,勉强晋至{hard_conf['target']}", 10)
|
||||||
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, roomid or "", "强行突破")
|
self._rate_set(sender, roomid or "", "强行突破")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "❌ 强行冲关失败,灵气反噬!", sender)
|
await self._send_text_with_status(bot, sender, roomid, "❌ 强行冲关失败,灵气反噬!", 10)
|
||||||
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]:
|
||||||
@@ -1633,24 +1676,20 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
# 新手保护:不可劫掠炼气期
|
# 新手保护:不可劫掠炼气期
|
||||||
def_prefix, _ = self._parse_realm(defender.get("realm", "炼气1层"))
|
def_prefix, _ = self._parse_realm(defender.get("realm", "炼气1层"))
|
||||||
if def_prefix == "炼气":
|
if def_prefix == "炼气":
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "对方新入仙途,天道庇护,暂不可劫", sender)
|
await self._send_text_with_status(bot, sender, roomid, "对方新入仙途,天道庇护,暂不可劫", 10)
|
||||||
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"):
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "对方正受天道护持或闭关参悟,切莫打扰", sender)
|
await self._send_text_with_status(bot, sender, roomid, "对方正受天道护持或闭关参悟,切莫打扰", 10)
|
||||||
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):
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "只可在同一仙门之境内行劫", sender)
|
await self._send_text_with_status(bot, sender, roomid, "只可在同一仙门之境内行劫", 10)
|
||||||
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"):
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "同门手足,不可相互劫掠", sender)
|
await self._send_text_with_status(bot, sender, roomid, "同门手足,不可相互劫掠", 10)
|
||||||
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))
|
||||||
@@ -1666,79 +1705,79 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
defender["spirit_stone"] = d_stones - gain
|
defender["spirit_stone"] = d_stones - gain
|
||||||
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()
|
||||||
if self.xdb:
|
if self.xdb:
|
||||||
try:
|
try:
|
||||||
self.xdb.update_player_fields(defender.get("user_id"), defender.get("group_id", ""), {"spirit_stone": defender["spirit_stone"], "status": defender["status"], "status_until": defender["status_until"]})
|
self.xdb.update_player_fields(defender.get("user_id"), defender.get("group_id", ""),
|
||||||
self.xdb.update_player_fields(attacker.get("user_id"), attacker.get("group_id", ""), {"spirit_stone": attacker["spirit_stone"]})
|
{"spirit_stone": defender["spirit_stone"],
|
||||||
|
"status": defender["status"],
|
||||||
|
"status_until": defender["status_until"]})
|
||||||
|
self.xdb.update_player_fields(attacker.get("user_id"), attacker.get("group_id", ""),
|
||||||
|
{"spirit_stone": attacker["spirit_stone"]})
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
self._save_player(defender)
|
self._save_player(defender)
|
||||||
self._save_player(attacker)
|
self._save_player(attacker)
|
||||||
self._rate_set(sender, roomid or "", "劫掠")
|
self._rate_set(sender, roomid or "", "劫掠")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 劫掠得手,入账灵石{gain}", sender)
|
await self._send_text_with_status(bot, sender, roomid, f"✅ 劫掠得手,入账灵石{gain}", 10)
|
||||||
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:
|
||||||
g_client_msg_id, g_create_time, g_new_msg_id = 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:
|
if self.revoke:
|
||||||
self.revoke.add_message_to_revoke(roomid, g_client_msg_id, g_create_time, g_new_msg_id, 10)
|
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, roomid or "", "劫掠")
|
self._rate_set(sender, roomid or "", "劫掠")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "❌ 劫掠受挫,风声紧,暂且退去", sender)
|
await self._send_text_with_status(bot, sender, roomid, "❌ 劫掠受挫,风声紧,暂且退去", 10)
|
||||||
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:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "格式:赠与 目标 数量", sender)
|
await self._send_text_with_status(bot, sender, roomid, "格式:赠与 目标 数量", 10)
|
||||||
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:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "格式:赠与 目标 数量", sender)
|
await self._send_text_with_status(bot, sender, roomid, "格式:赠与 目标 数量", 10)
|
||||||
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, roomid or "")
|
giver = self._get_player_with_cache(sender, roomid or "")
|
||||||
receiver = self._get_player_with_cache(target, roomid or "")
|
receiver = self._get_player_with_cache(target, roomid or "")
|
||||||
if not giver or not receiver:
|
if not giver or not receiver:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "需双方皆踏入仙途", sender)
|
await self._send_text_with_status(bot, sender, roomid, "需双方皆踏入仙途", 10)
|
||||||
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"):
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "灵石只可同门相赠", sender)
|
await self._send_text_with_status(bot, sender, roomid, "灵石只可同门相赠", 10)
|
||||||
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:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "灵石不足或数量有误", sender)
|
await self._send_text_with_status(bot, sender, roomid, "灵石不足或数量有误", 10)
|
||||||
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:
|
if self.xdb:
|
||||||
try:
|
try:
|
||||||
self.xdb.update_player_fields(sender, giver.get("group_id", ""), {"spirit_stone": giver["spirit_stone"]})
|
self.xdb.update_player_fields(sender, giver.get("group_id", ""),
|
||||||
self.xdb.update_player_fields(target, receiver.get("group_id", ""), {"spirit_stone": receiver["spirit_stone"]})
|
{"spirit_stone": giver["spirit_stone"]})
|
||||||
|
self.xdb.update_player_fields(target, receiver.get("group_id", ""),
|
||||||
|
{"spirit_stone": receiver["spirit_stone"]})
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
# 使用_save_player确保同时保存到Redis和MariaDB
|
# 使用_save_player确保同时保存到Redis和MariaDB
|
||||||
self._save_player(giver)
|
self._save_player(giver)
|
||||||
self._save_player(receiver)
|
self._save_player(receiver)
|
||||||
self._rate_set(sender, roomid or "", "赠与")
|
self._rate_set(sender, roomid or "", "赠与")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 已向 {target} 相赠灵石 {qty}", sender)
|
await self._send_text_with_status(bot, sender, roomid, f"✅ 已向 {target} 相赠灵石 {qty}", 10)
|
||||||
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]:
|
||||||
@@ -1766,9 +1805,8 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
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:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "乾坤袋物品不足或数量有误", sender)
|
await self._send_text_with_status(bot, sender, roomid, "乾坤袋物品不足或数量有误", 10)
|
||||||
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
|
||||||
@@ -1778,26 +1816,20 @@ 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:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "物品转移不成", sender)
|
await self._send_text_with_status(bot, sender, roomid, "物品转移不成", 10)
|
||||||
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, giver.get("group_id", ""))
|
self.redis_db.invalidate_player(sender, giver.get("group_id", ""))
|
||||||
self.redis_db.invalidate_player(target, receiver.get("group_id", ""))
|
self.redis_db.invalidate_player(target, receiver.get("group_id", ""))
|
||||||
self._save_player(giver)
|
self._save_player(giver)
|
||||||
self._save_player(receiver)
|
self._save_player(receiver)
|
||||||
self._rate_set(sender, roomid or "", "赠送")
|
self._rate_set(sender, roomid or "", "赠送")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 已向 {target} 赠送 {item_name} × {qty}", sender)
|
await self._send_text_with_status(bot, sender, roomid, f"✅ 已向 {target} 赠送 {item_name} × {qty}", 10)
|
||||||
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:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "格式:创建门派 名称", sender)
|
await self._send_text_with_status(bot, sender, roomid, "格式:创建门派 名称", 10)
|
||||||
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, roomid or "")
|
player = self._get_player_with_cache(sender, roomid or "")
|
||||||
if not player:
|
if not player:
|
||||||
@@ -1808,17 +1840,13 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
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:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "唯元婴以上方可立宗开派", sender)
|
await self._send_text_with_status(bot, sender, roomid, "唯元婴以上方可立宗开派", 10)
|
||||||
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:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "此门已在或因故未成", sender)
|
await self._send_text_with_status(bot, sender, roomid, "此门已在或因故未成", 10)
|
||||||
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)
|
||||||
@@ -1830,31 +1858,27 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
pass
|
pass
|
||||||
self._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, roomid or "", "创建门派")
|
self._rate_set(sender, roomid or "", "创建门派")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 山门立成:{name}", sender)
|
await self._send_text_with_status(bot, sender, roomid, f"✅ 山门立成:{name}", 10)
|
||||||
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:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "格式:加入门派 名称", sender)
|
await self._send_text_with_status(bot, sender, roomid, "格式:加入门派 名称", 10)
|
||||||
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, roomid or "")
|
player = self._get_player_with_cache(sender, roomid or "")
|
||||||
if not player:
|
if not player:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "道友尚未踏入仙途,请先发送:注册修仙 道号", sender)
|
await self._send_text_with_status(bot, sender, roomid, "道友尚未踏入仙途,请先发送:注册修仙 道号", 10)
|
||||||
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:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "世间无此门派", sender)
|
await self._send_text_with_status(bot, sender, roomid, "世间无此门派", 10)
|
||||||
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:
|
||||||
@@ -1865,17 +1889,15 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
pass
|
pass
|
||||||
self._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, roomid or "", "加入门派")
|
self._rate_set(sender, roomid or "", "加入门派")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 已拜入:{name}", sender)
|
await self._send_text_with_status(bot, sender, roomid, f"✅ 已拜入:{name}", 10)
|
||||||
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, roomid or "")
|
player = self._get_player_with_cache(sender, roomid or "")
|
||||||
if not player:
|
if not player:
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "道友尚未踏入仙途,请先发送:注册修仙 道号", sender)
|
await self._send_text_with_status(bot, sender, roomid, "道友尚未踏入仙途,请先发送:注册修仙 道号", 10)
|
||||||
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:
|
||||||
@@ -1886,7 +1908,6 @@ class XiuxianPlugin(MessagePluginInterface):
|
|||||||
pass
|
pass
|
||||||
self._save_player(player)
|
self._save_player(player)
|
||||||
self._rate_set(sender, roomid or "", "退出门派")
|
self._rate_set(sender, roomid or "", "退出门派")
|
||||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "✅ 已离出山门", sender)
|
await self._send_text_with_status(bot, sender, roomid, "✅ 已离出山门", 10)
|
||||||
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