feat(discord): 添加代理支持配置
在 Discord 适配器中添加代理支持,包括配置模型、配置文件及实际代理实现。当配置了代理时,通过环境变量设置 HTTP/HTTPS 代理进行连接,以支持在需要代理的环境中使用 Discord 服务。
This commit is contained in:
@@ -22,6 +22,7 @@ except ImportError:
|
|||||||
from core.utils.logger import ModuleLogger
|
from core.utils.logger import ModuleLogger
|
||||||
from .router import DiscordToOneBotConverter
|
from .router import DiscordToOneBotConverter
|
||||||
from core.managers.redis_manager import redis_manager
|
from core.managers.redis_manager import redis_manager
|
||||||
|
from core.config_loader import global_config
|
||||||
|
|
||||||
class DiscordAdapter(discord.Client if DISCORD_AVAILABLE else object):
|
class DiscordAdapter(discord.Client if DISCORD_AVAILABLE else object):
|
||||||
"""
|
"""
|
||||||
@@ -36,6 +37,13 @@ class DiscordAdapter(discord.Client if DISCORD_AVAILABLE else object):
|
|||||||
intents = discord.Intents.default()
|
intents = discord.Intents.default()
|
||||||
intents.message_content = True
|
intents.message_content = True
|
||||||
|
|
||||||
|
# 检查是否配置了代理
|
||||||
|
self.proxy = None
|
||||||
|
self.proxy_type = "http"
|
||||||
|
if global_config.discord.proxy:
|
||||||
|
self.proxy = global_config.discord.proxy
|
||||||
|
self.proxy_type = global_config.discord.proxy_type or "http"
|
||||||
|
|
||||||
super().__init__(intents=intents)
|
super().__init__(intents=intents)
|
||||||
self.token = token
|
self.token = token
|
||||||
self.logger = ModuleLogger("DiscordAdapter")
|
self.logger = ModuleLogger("DiscordAdapter")
|
||||||
@@ -131,6 +139,35 @@ class DiscordAdapter(discord.Client if DISCORD_AVAILABLE else object):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
self.logger.info("正在连接 Discord...")
|
self.logger.info("正在连接 Discord...")
|
||||||
|
|
||||||
|
# 如果配置了代理,使用自定义的 ClientSession
|
||||||
|
if self.proxy:
|
||||||
|
import aiohttp
|
||||||
|
proxy_url = self.proxy
|
||||||
|
self.logger.info(f"[DiscordAdapter] 使用代理: {proxy_url} (类型: {self.proxy_type})")
|
||||||
|
|
||||||
|
connector = aiohttp.TCPConnector()
|
||||||
|
session = aiohttp.ClientSession(connector=connector)
|
||||||
|
|
||||||
|
# discord.py 2.0+ 使用 discord.Client 的 connector 参数
|
||||||
|
# 但 discord.Client 不直接支持自定义 connector
|
||||||
|
# 需要使用 discord.AutoShardedClient 或修改内部实现
|
||||||
|
# 这里我们使用 discord.Client 的 __init__ 传递 connector
|
||||||
|
# 但 discord.Client 的 __init__ 不支持 connector 参数
|
||||||
|
# 所以我们需要使用 discord.Client 的 _create_http_client 方法
|
||||||
|
|
||||||
|
# 简单方案:使用环境变量设置代理
|
||||||
|
import os
|
||||||
|
os.environ["HTTP_PROXY"] = proxy_url
|
||||||
|
os.environ["HTTPS_PROXY"] = proxy_url
|
||||||
|
|
||||||
|
self.logger.info("[DiscordAdapter] 代理已设置,正在连接 Discord...")
|
||||||
|
await self.start(self.token)
|
||||||
|
|
||||||
|
# 清理环境变量
|
||||||
|
os.environ.pop("HTTP_PROXY", None)
|
||||||
|
os.environ.pop("HTTPS_PROXY", None)
|
||||||
|
else:
|
||||||
await self.start(self.token)
|
await self.start(self.token)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.logger.error(f"Discord 连接失败: {e}")
|
self.logger.error(f"Discord 连接失败: {e}")
|
||||||
|
|||||||
@@ -103,6 +103,8 @@ base_url = "http://101.36.126.55:3003" # 外部访问的 URL
|
|||||||
[discord]
|
[discord]
|
||||||
enabled = true
|
enabled = true
|
||||||
token = "MTQ4MjQzODA1NzExNzYxODI4Nw.G9R6uR.ddxHn3pmUf7SyrrOBg_-_lc7Y62lsCitPxpdGM"
|
token = "MTQ4MjQzODA1NzExNzYxODI4Nw.G9R6uR.ddxHn3pmUf7SyrrOBg_-_lc7Y62lsCitPxpdGM"
|
||||||
|
proxy = "http://127.0.0.1:7890"
|
||||||
|
proxy_type = "http"
|
||||||
|
|
||||||
# 跨平台消息互通配置
|
# 跨平台消息互通配置
|
||||||
[cross_platform]
|
[cross_platform]
|
||||||
|
|||||||
@@ -113,6 +113,8 @@ class DiscordModel(BaseModel):
|
|||||||
"""
|
"""
|
||||||
enabled: bool = False
|
enabled: bool = False
|
||||||
token: str = ""
|
token: str = ""
|
||||||
|
proxy: Optional[str] = None
|
||||||
|
proxy_type: str = "http"
|
||||||
|
|
||||||
|
|
||||||
class LoggingModel(BaseModel):
|
class LoggingModel(BaseModel):
|
||||||
|
|||||||
Reference in New Issue
Block a user