猜歌名,加上撤回策略。

This commit is contained in:
liuwei
2025-06-10 13:47:12 +08:00
parent 9c4ad81bd1
commit 4d9d0ca424
3 changed files with 89 additions and 17 deletions

View File

@@ -11,6 +11,7 @@ from typing import Dict, Any, List, Optional, Tuple
from base.plugin_common.message_plugin_interface import MessagePluginInterface
from base.plugin_common.plugin_interface import PluginStatus
from utils.decorator.plugin_decorators import plugin_stats_decorator
from utils.revoke.message_auto_revoke import MessageAutoRevoke
from utils.robot_cmd.robot_command import Feature, PermissionStatus, GroupBotManager
from utils.decorator.points_decorator import plugin_points_cost, points_reward_decorator
from wechat_ipad import WechatAPIClient
@@ -116,6 +117,7 @@ class GuessSongPlugin(MessagePluginInterface):
def __init__(self):
super().__init__()
self.revoke = None
self.feature = self.register_feature()
self.redis_db = None
@@ -202,6 +204,7 @@ class GuessSongPlugin(MessagePluginInterface):
roomid = message.get("roomid", "")
gbm: GroupBotManager = message.get("gbm")
bot: WechatAPIClient = message.get("bot")
self.revoke: MessageAutoRevoke = message.get("revoke")
# 使用roomid或sender作为游戏会话ID
session_id = roomid if roomid else sender
@@ -224,9 +227,10 @@ class GuessSongPlugin(MessagePluginInterface):
if content: # 有内容,视为答案
return await self._check_answer(message)
else: # 没有内容,提示已有游戏在进行中
await bot.send_text_message(session_id,
client_msg_id, create_time, new_msg_id = await bot.send_text_message(session_id,
f"⚠️ 当前已有猜歌游戏在进行中,请直接回复 [猜歌名 歌名] 进行猜测\n或回复 [猜歌名 下一首] 跳过当前歌曲",
sender)
self.revoke.add_message_to_revoke(session_id, client_msg_id, create_time, new_msg_id, 4)
return True, "已有游戏进行中"
# 否则开始新游戏(可以指定歌手或随机)
@@ -239,7 +243,8 @@ class GuessSongPlugin(MessagePluginInterface):
# 搜索歌曲
song_info = await self._get_random_song(singer_name)
if not song_info or not song_info.get("play_url"):
await bot.send_text_message(session_id, f"❌未找到{singer_name or '随机'}歌曲,请重试", sender)
client_msg_id, create_time, new_msg_id = await bot.send_text_message(session_id, f"❌未找到{singer_name or '随机'}歌曲,请重试", sender)
self.revoke.add_message_to_revoke(session_id, client_msg_id, create_time, new_msg_id, 4)
return False, "未找到歌曲"
# 保存游戏会话
@@ -258,9 +263,10 @@ class GuessSongPlugin(MessagePluginInterface):
self.redis_db.save_game_session(session_id, game_data)
# 发送游戏开始消息
await bot.send_text_message(session_id,
client_msg_id, create_time, new_msg_id = await bot.send_text_message(session_id,
f"🎵 猜歌名游戏开始!\n请听10秒钟歌曲片段然后回复[猜歌名 歌名]来猜测歌曲名称。\n回复[猜歌名 下一首]可跳过当前歌曲。\n歌手: {song_info.get('singer_name', '未知')}",
sender)
self.revoke.add_message_to_revoke(session_id, client_msg_id, create_time, new_msg_id, 30)
# 发送10秒音频片段
await self._send_song_clip(bot, song_info, session_id)
@@ -269,7 +275,8 @@ class GuessSongPlugin(MessagePluginInterface):
except Exception as e:
self.LOG.error(f"开始猜歌游戏出错: {e}")
await bot.send_text_message(session_id, f"❌开始猜歌游戏出错,请稍后重试", sender)
client_msg_id, create_time, new_msg_id = await bot.send_text_message(session_id, f"❌开始猜歌游戏出错,请稍后重试", sender)
self.revoke.add_message_to_revoke(session_id, client_msg_id, create_time, new_msg_id, 5)
return False, f"处理出错: {e}"
@points_reward_decorator(5, "game", "猜歌名游戏", FEATURE_KEY)
@@ -293,6 +300,8 @@ class GuessSongPlugin(MessagePluginInterface):
game_data = self.redis_db.get_game_session(session_id)
if not game_data:
client_msg_id, create_time, new_msg_id = await bot.send_text_message(session_id, "没有进行中的游戏", sender)
self.revoke.add_message_to_revoke(session_id, client_msg_id, create_time, new_msg_id, 5)
return False, "没有进行中的游戏"
correct_answer = game_data.get("song_name", "")
@@ -326,14 +335,17 @@ class GuessSongPlugin(MessagePluginInterface):
self.redis_db.save_game_session(session_id, game_data)
# 告知用户答案错误
await bot.send_text_message(session_id, f"❌ 答案错误,请继续猜测!")
client_msg_id, create_time, new_msg_id = await bot.send_text_message(session_id, f"❌ 答案错误,请继续猜测!", sender)
self.revoke.add_message_to_revoke(session_id, client_msg_id, create_time, new_msg_id, 4)
return False, "答案错误"
except Exception as e:
self.LOG.error(f"检查答案出错: {e}")
session_id = message.get("roomid", "") or message.get("sender", "")
sender = message.get("sender", "")
bot = message.get("bot")
await bot.send_text_message(session_id, f"❌检查答案出错,请稍后重试", sender)
client_msg_id, create_time, new_msg_id = await bot.send_text_message(session_id, f"❌检查答案出错,请稍后重试", sender)
self.revoke.add_message_to_revoke(session_id, client_msg_id, create_time, new_msg_id, 4)
return False, f"处理出错: {e}"
async def _get_random_song(self, singer_name: Optional[str]) -> Dict[str, Any]:
@@ -471,7 +483,8 @@ class GuessSongPlugin(MessagePluginInterface):
current_game = self.redis_db.get_game_session(session_id)
if not current_game or current_game.get("status") != "playing":
await bot.send_text_message(session_id, f"⚠️ 当前没有进行中的猜歌游戏", sender)
client_msg_id, create_time, new_msg_id = await bot.send_text_message(session_id, f"⚠️ 当前没有进行中的猜歌游戏", sender)
self.revoke.add_message_to_revoke(session_id, client_msg_id, create_time, new_msg_id, 4)
return False, "没有进行中的游戏"
# 显示当前歌曲答案
@@ -492,5 +505,6 @@ class GuessSongPlugin(MessagePluginInterface):
except Exception as e:
self.LOG.error(f"跳过当前歌曲出错: {e}")
await bot.send_text_message(session_id, f"❌跳过当前歌曲出错,请稍后重试", sender)
client_msg_id, create_time, new_msg_id = await bot.send_text_message(session_id, f"❌跳过当前歌曲出错,请稍后重试", sender)
self.revoke.add_message_to_revoke(session_id, client_msg_id, create_time, new_msg_id, 4)
return False, f"处理出错: {e}"