Files
Memoh/TELEGRAM_BOT_COMPLETE.md
T
2026-01-11 19:15:18 +08:00

7.7 KiB
Raw Blame History

Telegram Bot 完成总结

🎉 完成的功能

1. Core 层重构

位置: packages/cli/src/core/

  • 存储抽象层 (storage.ts): 定义 TokenStorage 接口
  • 文件存储 (storage/file.ts): CLI 使用的文件存储
  • 上下文管理 (context.ts): 支持多用户场景
  • 客户端 (client.ts): 同步/异步 API 支持
  • 认证 (auth.ts): 同步/异步登录、登出
  • AI 对话 (agent.ts): 同步/异步流式对话

2. Telegram Bot 实现

位置: packages/platform-telegram/

  • Redis 存储 (src/storage.ts): 多用户 token 管理
  • 认证处理 (src/auth.ts): 登录、登出、鉴权中间件
  • Bot 实现 (src/index.ts): 完整的 Telegram bot
  • 独立启动 (src/bot.ts): 可独立运行

3. 多用户支持

Telegram User A (ID: 123456) → Token A → MemoHome User A
Telegram User B (ID: 789012) → Token B → MemoHome User B
  • 每个 TG 用户独立登录
  • 独立的 session 管理
  • Token 自动过期(30天)
  • 用户信息缓存

📁 项目结构

packages/
├── cli/                          # CLI 和 Core 层
│   └── src/
│       ├── core/                 # 核心功能(可复用)
│       │   ├── storage.ts        # 存储接口
│       │   ├── storage/
│       │   │   ├── file.ts       # 文件存储
│       │   │   └── index.ts
│       │   ├── context.ts        # 上下文管理
│       │   ├── client.ts         # API 客户端
│       │   ├── auth.ts           # 认证逻辑
│       │   ├── agent.ts          # AI 对话
│       │   └── index.ts          # 统一导出
│       └── cli/                  # CLI UI 层
│           └── commands/
│
└── platform-telegram/            # Telegram Bot
    ├── src/
    │   ├── storage.ts            # Redis 存储
    │   ├── auth.ts               # TG 认证处理
    │   ├── index.ts              # Bot 主逻辑
    │   └── bot.ts                # 启动入口
    ├── .env.example              # 环境变量示例
    ├── README.md                 # 完整文档
    ├── SETUP.md                  # 设置指南
    └── QUICKSTART.md             # 快速开始

🚀 快速开始

1. 配置环境

cd packages/platform-telegram
cp .env.example .env

编辑 .env:

BOT_TOKEN=你的_bot_token
REDIS_URL=redis://localhost:6379
API_BASE_URL=http://localhost:7002

2. 启动服务

# Terminal 1: Redis
redis-server

# Terminal 2: MemoHome API
cd packages/api
pnpm start

# Terminal 3: Telegram Bot
cd packages/platform-telegram
pnpm start

3. 测试 Bot

在 Telegram 中:

/start
/login admin password
/chat 你好

🎯 核心特性

存储抽象

// 接口定义
interface TokenStorage {
  getToken(userId?: string): Promise<string | null> | string | null
  setToken(token: string, userId?: string): Promise<void> | void
  clearToken(userId?: string): Promise<void> | void
  // ...
}

// CLI 使用文件存储
const fileStorage = new FileTokenStorage()

// Telegram 使用 Redis 存储
const redisStorage = new TelegramRedisStorage()

多用户上下文

// 为不同用户创建独立上下文
const userAContext = createContext({
  storage: redisStorage,
  userId: 'telegram_123456'  // User A
})

const userBContext = createContext({
  storage: redisStorage,
  userId: 'telegram_789012'  // User B
})

// 使用各自的上下文
await loginAsync({ username: 'userA', password: 'passA' }, userAContext)
await loginAsync({ username: 'userB', password: 'passB' }, userBContext)

鉴权中间件

// 自动检查用户是否登录
bot.command('chat', requireAuth(storage), async (ctx) => {
  // 只有登录用户才能执行
})

流式对话

await chatStreamAsync({
  message: '讲个故事',
  language: 'Chinese'
}, async (event) => {
  if (event.type === 'text-delta') {
    // 实时更新 Telegram 消息
  }
}, userContext)

📊 Redis 存储结构

memohome:tg:token:123456 → "token_abc..."  (30天过期)
memohome:tg:user:123456 → {
  "username": "userA",
  "role": "admin",
  "userId": "user-id-xxx"
}

memohome:tg:token:789012 → "token_def..."
memohome:tg:user:789012 → {
  "username": "userB",
  "role": "user",
  "userId": "user-id-yyy"
}

🔧 Bot 命令

命令 描述 需要登录
/start 欢迎消息
/help 帮助信息
/login <username> <password> 登录
/logout 登出
/whoami 查看当前用户
/chat <message> AI 对话
直接发送消息 AI 对话

🎨 使用示例

CLI 使用(不受影响)

memohome auth login -u admin -p password
memohome agent chat "Hello"

Telegram Bot 使用

User A: /login adminA passwordA
Bot: ✅ Login successful! Username: adminA

User A: 今天天气怎么样?
Bot: 🤖 今天天气...

User B: /login userB passwordB
Bot: ✅ Login successful! Username: userB

User B: 讲个笑话
Bot: 🤖 好的,听好了...

编程使用

import { createContext, loginAsync, chatStreamAsync } from '@memohome/cli'
import { TelegramRedisStorage } from '@memohome/platform-telegram'

const storage = new TelegramRedisStorage()
const context = createContext({
  storage,
  userId: 'telegram_123456'
})

// 登录
await loginAsync({
  username: 'user',
  password: 'pass'
}, context)

// 对话
await chatStreamAsync({
  message: 'Hello'
}, async (event) => {
  console.log(event)
}, context)

📚 文档

亮点

  1. 完全分离: CLI UI 和业务逻辑完全解耦
  2. 可复用: Core 层可被任何平台使用
  3. 多存储: 支持文件、Redis 等多种存储
  4. 多用户: Telegram bot 支持多用户独立 session
  5. 类型安全: 完整的 TypeScript 类型
  6. 文档完善: README、SETUP、示例齐全
  7. 易扩展: 轻松添加新平台(Discord、Web 等)

🔮 未来扩展

基于这个架构,可以轻松添加:

  • 🎮 Discord Bot
  • 🌐 Web 应用
  • 📱 移动应用
  • 💬 微信 Bot
  • 🤖 其他平台...

只需实现对应的 TokenStorage 和平台逻辑即可!

测试清单

  • CLI 登录/登出功能正常
  • CLI 对话功能正常
  • Telegram bot 启动成功
  • Telegram 多用户登录
  • Telegram 独立 session
  • Telegram 流式对话
  • Redis 存储正常
  • Token 过期管理
  • 鉴权中间件工作
  • 错误处理完善
  • 类型检查通过
  • 文档完整

🎊 总结

重构完成!现在你拥有:

  1. 清晰的架构: Core 层可复用,CLI 和 Platform 独立
  2. 多用户支持: Telegram bot 支持多个用户同时使用
  3. 灵活的存储: 文件存储(CLI)和 Redis 存储(Telegram
  4. 完善的文档: 从快速开始到详细设置一应俱全
  5. 易于扩展: 添加新平台只需实现存储接口

现在可以:

  • 继续使用 CLI(体验不变)
  • 启动 Telegram bot 服务多个用户
  • 在其他项目中复用 Core 功能
  • 轻松添加新的平台支持

祝使用愉快!🚀