File size: 2,574 Bytes
8ede856
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import os
import uuid

from astrbot.core import astrbot_config, logger
from astrbot.core.config.default import WEBHOOK_SUPPORTED_PLATFORMS


def _get_callback_api_base() -> str:
    try:
        return astrbot_config.get("callback_api_base", "").rstrip("/")
    except Exception as e:
        logger.error(f"获取 callback_api_base 失败: {e!s}")
        return ""


def _get_dashboard_port() -> int:
    try:
        return astrbot_config.get("dashboard", {}).get("port", 7860)
    except Exception as e:
        logger.error(f"获取 dashboard 端口失败: {e!s}")
        return 7860


def _is_dashboard_ssl_enabled() -> bool:
    env_ssl = os.environ.get("DASHBOARD_SSL_ENABLE") or os.environ.get(
        "ASTRBOT_DASHBOARD_SSL_ENABLE"
    )
    if env_ssl is not None:
        return env_ssl.strip().lower() in {"1", "true", "yes", "on"}

    try:
        return bool(astrbot_config.get("dashboard", {}).get("ssl", {}).get("enable"))
    except Exception as e:
        logger.error(f"获取 dashboard SSL 配置失败: {e!s}")
        return False


def log_webhook_info(platform_name: str, webhook_uuid: str) -> None:
    """打印美观的 webhook 信息日志

    Args:
        platform_name: 平台名称
        webhook_uuid: webhook 的 UUID
    """

    callback_base = _get_callback_api_base()

    if not callback_base:
        callback_base = "http(s)://<your-astrbot-domain>"

    if not callback_base.startswith("http"):
        callback_base = f"http(s)://{callback_base}"

    callback_base = callback_base.rstrip("/")
    webhook_url = f"{callback_base}/api/platform/webhook/{webhook_uuid}"
    scheme = "https" if _is_dashboard_ssl_enabled() else "http"

    display_log = (
        "\n====================\n"
        f"🔗 机器人平台 {platform_name} 已启用统一 Webhook 模式\n"
        f"📍 Webhook 回调地址: \n"
        f"   ➜  {scheme}://<your-ip>:{_get_dashboard_port()}/api/platform/webhook/{webhook_uuid}\n"
        f"   ➜  {webhook_url}\n"
        "====================\n"
    )
    logger.info(display_log)


def ensure_platform_webhook_config(platform_cfg: dict) -> bool:
    """为支持统一 webhook 的平台自动生成 webhook_uuid

    Args:
        platform_cfg (dict): 平台配置字典

    Returns:
        bool: 如果生成了 webhook_uuid 则返回 True,否则返回 False
    """
    pt = platform_cfg.get("type", "")
    if pt in WEBHOOK_SUPPORTED_PLATFORMS and not platform_cfg.get("webhook_uuid"):
        platform_cfg["webhook_uuid"] = uuid.uuid4().hex[:16]
        return True
    return False