1.新增私聊接口2.新增.talk指令
This commit is contained in:
@@ -202,6 +202,10 @@ async def handle_command(game_type: str, command: str,
|
||||
return "用法:.say 你想让我说的话\n别名:.说 / .复述"
|
||||
return args
|
||||
|
||||
# 私聊功能
|
||||
if game_type == 'talk':
|
||||
return await handle_talk_command(command, chat_id, user_id)
|
||||
|
||||
# AI对话系统
|
||||
if game_type == 'ai_chat':
|
||||
from games.ai_chat import AIChatGame
|
||||
@@ -227,7 +231,7 @@ async def handle_register_command(command: str, chat_id: int, user_id: int) -> s
|
||||
"""处理注册命令
|
||||
|
||||
Args:
|
||||
command: 完整指令 ".register name"
|
||||
command: 完整指令 ".register name" 或 ".register url <url>"
|
||||
chat_id: 会话ID
|
||||
user_id: 用户ID
|
||||
|
||||
@@ -241,21 +245,112 @@ async def handle_register_command(command: str, chat_id: int, user_id: int) -> s
|
||||
|
||||
# 验证参数
|
||||
if not args:
|
||||
return "❌ 请提供要注册的名称!\n\n正确格式:`.register <名称>`\n\n示例:\n`.register 张三`\n`.register 小明`"
|
||||
return "❌ 请提供要注册的内容!\n\n正确格式:\n`.register <名称>` - 注册用户名\n`.register url <URL>` - 注册webhook URL\n\n示例:\n`.register 张三`\n`.register url https://example.com/webhook?key=xxx`"
|
||||
|
||||
if len(args) > 20:
|
||||
return "❌ 名称过长!最多支持20个字符。"
|
||||
|
||||
# 更新用户名称
|
||||
db = get_db()
|
||||
success = db.update_user_name(user_id, args)
|
||||
|
||||
if success:
|
||||
return f"✅ 注册成功!\n\n**您的名称**:{args}\n\n之后您可以使用这个名称参与各种游戏和功能。"
|
||||
# 检查是否为url子命令
|
||||
parts = args.split(maxsplit=1)
|
||||
if parts and parts[0].lower() == 'url':
|
||||
# 处理URL注册
|
||||
if len(parts) < 2:
|
||||
return "❌ 请提供webhook URL!\n\n正确格式:`.register url <URL>`\n\n示例:\n`.register url https://example.com/webhook?key=xxx`"
|
||||
|
||||
webhook_url = parts[1].strip()
|
||||
|
||||
# URL验证
|
||||
if not webhook_url.startswith(('http://', 'https://')):
|
||||
return "❌ URL格式无效!必须以 http:// 或 https:// 开头。"
|
||||
|
||||
# 设置URL
|
||||
db = get_db()
|
||||
success = db.set_user_webhook_url(user_id, webhook_url)
|
||||
|
||||
if success:
|
||||
return f"✅ Webhook URL注册成功!\n\n**您的个人URL**:{webhook_url}\n\n私聊消息将发送到此URL。"
|
||||
else:
|
||||
return "❌ 注册失败!请稍后重试。"
|
||||
else:
|
||||
return "❌ 注册失败!请稍后重试。"
|
||||
# 原有的名称注册逻辑
|
||||
if len(args) > 20:
|
||||
return "❌ 名称过长!最多支持20个字符。"
|
||||
|
||||
# 更新用户名称
|
||||
db = get_db()
|
||||
success = db.update_user_name(user_id, args)
|
||||
|
||||
if success:
|
||||
return f"✅ 注册成功!\n\n**您的名称**:{args}\n\n之后您可以使用这个名称参与各种游戏和功能。"
|
||||
else:
|
||||
return "❌ 注册失败!请稍后重试。"
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"处理注册指令错误: {e}", exc_info=True)
|
||||
return f"❌ 处理指令出错: {str(e)}"
|
||||
|
||||
|
||||
async def handle_talk_command(command: str, chat_id: int, user_id: int) -> str:
|
||||
"""处理私聊命令
|
||||
|
||||
Args:
|
||||
command: 完整指令 ".talk <username> <content>"
|
||||
chat_id: 会话ID
|
||||
user_id: 发送者用户ID
|
||||
|
||||
Returns:
|
||||
处理结果消息
|
||||
"""
|
||||
try:
|
||||
# 提取参数
|
||||
_, args = CommandParser.extract_command_args(command)
|
||||
args = args.strip()
|
||||
|
||||
# 验证参数
|
||||
if not args:
|
||||
return "❌ 请提供用户名和消息内容!\n\n正确格式:`.talk <用户名> <消息内容>`\n\n示例:\n`.talk 张三 你好,想和你聊聊`\n`.talk 李四 这是一条私聊消息`"
|
||||
|
||||
# 解析username和content(第一个单词是username,剩余部分是content)
|
||||
parts = args.split(maxsplit=1)
|
||||
if len(parts) < 2:
|
||||
return "❌ 请提供用户名和消息内容!\n\n正确格式:`.talk <用户名> <消息内容>`\n\n示例:\n`.talk 张三 你好,想和你聊聊`"
|
||||
|
||||
target_username = parts[0].strip()
|
||||
content = parts[1].strip()
|
||||
|
||||
if not target_username:
|
||||
return "❌ 用户名不能为空!\n\n正确格式:`.talk <用户名> <消息内容>`"
|
||||
if not content:
|
||||
return "❌ 消息内容不能为空!\n\n正确格式:`.talk <用户名> <消息内容>`"
|
||||
|
||||
# 通过用户名查找目标用户
|
||||
db = get_db()
|
||||
target_user = db.get_user_by_name(target_username)
|
||||
|
||||
if not target_user:
|
||||
return f"❌ 找不到用户名为「{target_username}」的用户!\n\n提示:目标用户需要使用 `.register <名称>` 注册用户名。"
|
||||
|
||||
target_user_id = target_user['user_id']
|
||||
|
||||
# 检查目标用户是否有注册名称(应该有,因为是通过名称找到的)
|
||||
if not target_user.get('username'):
|
||||
return f"❌ 用户「{target_username}」尚未注册用户名!"
|
||||
|
||||
# 检查目标用户是否有个人webhook URL
|
||||
if not db.has_webhook_url(target_user_id):
|
||||
return f"❌ 用户「{target_username}」尚未注册个人webhook URL!\n\n提示:目标用户需要使用 `.register url <URL>` 注册个人URL后才能接收私聊消息。"
|
||||
|
||||
# 发送私聊消息
|
||||
from utils.message import send_private_message
|
||||
success = await send_private_message(
|
||||
user_id=target_user_id,
|
||||
content=content,
|
||||
msg_type='text'
|
||||
)
|
||||
|
||||
if success:
|
||||
return f"✅ 私聊消息已发送给「{target_username}」!"
|
||||
else:
|
||||
return f"❌ 发送私聊消息失败,请稍后重试。"
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"处理私聊指令错误: {e}", exc_info=True)
|
||||
return f"❌ 处理指令出错: {str(e)}"
|
||||
|
||||
|
||||
111
routers/private.py
Normal file
111
routers/private.py
Normal file
@@ -0,0 +1,111 @@
|
||||
"""私聊相关API路由"""
|
||||
import logging
|
||||
from typing import List, Dict
|
||||
from fastapi import APIRouter, HTTPException
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from core.database import get_db
|
||||
from core.models import PrivateMessageRequest, CheckBatchRequest, CheckBatchResponse
|
||||
from utils.message import send_private_message
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.post("/private/send")
|
||||
async def send_private(request: PrivateMessageRequest):
|
||||
"""发送私聊消息
|
||||
|
||||
请求体:
|
||||
{
|
||||
"user_id": 123456,
|
||||
"content": "消息内容",
|
||||
"msg_type": "text" // 可选,默认为"text"
|
||||
}
|
||||
"""
|
||||
try:
|
||||
# 验证msg_type
|
||||
if request.msg_type not in ['text', 'markdown']:
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail="msg_type必须是'text'或'markdown'"
|
||||
)
|
||||
|
||||
# 调用send_private_message
|
||||
success = await send_private_message(
|
||||
user_id=request.user_id,
|
||||
content=request.content,
|
||||
msg_type=request.msg_type
|
||||
)
|
||||
|
||||
if not success:
|
||||
# 检查用户是否有个人URL
|
||||
db = get_db()
|
||||
has_url = db.has_webhook_url(request.user_id)
|
||||
if not has_url:
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail=f"用户 {request.user_id} 没有注册个人webhook URL"
|
||||
)
|
||||
else:
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail="消息发送失败,请稍后重试"
|
||||
)
|
||||
|
||||
return JSONResponse({
|
||||
"success": True,
|
||||
"message": "消息发送成功"
|
||||
})
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"发送私聊消息API错误: {e}", exc_info=True)
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail=f"服务器内部错误: {str(e)}"
|
||||
)
|
||||
|
||||
|
||||
@router.get("/private/check/{user_id}")
|
||||
async def check_user_webhook(user_id: int):
|
||||
"""检查用户是否有个人webhook URL"""
|
||||
try:
|
||||
db = get_db()
|
||||
has_webhook_url = db.has_webhook_url(user_id)
|
||||
|
||||
return JSONResponse({
|
||||
"user_id": user_id,
|
||||
"has_webhook_url": has_webhook_url
|
||||
})
|
||||
except Exception as e:
|
||||
logger.error(f"检查用户webhook URL错误: {e}", exc_info=True)
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail=f"服务器内部错误: {str(e)}"
|
||||
)
|
||||
|
||||
|
||||
@router.post("/private/check-batch")
|
||||
async def check_users_webhook_batch(request: CheckBatchRequest):
|
||||
"""批量检查用户是否有个人webhook URL
|
||||
|
||||
请求体:
|
||||
{
|
||||
"user_ids": [123456, 789012, ...]
|
||||
}
|
||||
"""
|
||||
try:
|
||||
db = get_db()
|
||||
results = db.check_users_webhook_urls(request.user_ids)
|
||||
|
||||
return CheckBatchResponse(results=results)
|
||||
except Exception as e:
|
||||
logger.error(f"批量检查用户webhook URL错误: {e}", exc_info=True)
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail=f"服务器内部错误: {str(e)}"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user