Files
QQbot/main.py

90 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
QQ机器人主入口
"""
import sys
from pathlib import Path
# 添加项目根目录到Python路径
project_root = Path(__file__).parent
sys.path.insert(0, str(project_root))
def _sqlite_supports_trigram(sqlite_module) -> bool:
conn = None
try:
conn = sqlite_module.connect(":memory:")
conn.execute("create virtual table t using fts5(content, tokenize='trigram')")
return True
except Exception:
return False
finally:
if conn is not None:
conn.close()
def _ensure_sqlite_for_chroma():
"""
Ensure sqlite runtime supports FTS5 trigram tokenizer for Chroma.
On some cloud images, system sqlite lacks trigram support.
"""
try:
import sqlite3
except Exception:
return
if _sqlite_supports_trigram(sqlite3):
return
try:
import pysqlite3
except Exception as exc:
print(
"[WARN] sqlite3 does not support trigram tokenizer and pysqlite3 is unavailable: "
f"{exc}"
)
print("[WARN] Chroma may fail and fallback to JSON storage.")
return
if _sqlite_supports_trigram(pysqlite3):
sys.modules["sqlite3"] = pysqlite3
print("[INFO] sqlite3 switched to pysqlite3 for Chroma trigram support.")
else:
print("[WARN] pysqlite3 is installed but still lacks trigram tokenizer support.")
print("[WARN] Chroma may fail and fallback to JSON storage.")
_ensure_sqlite_for_chroma()
from src.core.bot import MyClient, build_intents
from src.core.config import Config
from src.utils.logger import setup_logger
def main():
"""主函数"""
# 设置日志
logger = setup_logger()
try:
# 验证配置
Config.validate()
logger.info("配置验证通过")
# 创建并启动机器人(最小权限,避免 4014 disallowed intents
logger.info("正在启动QQ机器人...")
intents = build_intents()
client = MyClient(intents=intents)
client.run(appid=Config.BOT_APPID, secret=Config.BOT_SECRET)
except ValueError as e:
logger.error(f"配置错误: {e}")
logger.error("请检查 .env 文件配置")
sys.exit(1)
except Exception as e:
logger.error(f"启动失败: {e}", exc_info=True)
sys.exit(1)
if __name__ == "__main__":
main()