112 lines
3.2 KiB
Python
112 lines
3.2 KiB
Python
"""私聊相关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)}"
|
|
)
|
|
|