docs: simplify deployment docs and restrict telegram group commands

This commit is contained in:
ShukeBta
2026-06-13 14:24:50 +08:00
parent a177dc61dd
commit ce1b234b17
9 changed files with 877 additions and 1851 deletions
+69 -18
View File
@@ -16,31 +16,32 @@ type telegramCommandDefinition struct {
Aliases []string
AdminOnly bool
AdminOnlyText string
GroupAllowed bool
Handle telegramCommandHandler
}
func (s *TelegramBotService) telegramCommandDefinitions(ctx context.Context, channel *model.NotifyChannel, msg *TelegramMessage) []telegramCommandDefinition {
adminOnly := "此命令仅管理员可用。"
return []telegramCommandDefinition{
{Aliases: []string{"/start"}, Handle: func(args []string) (telegramCommandReply, error) {
{Aliases: []string{"/start"}, GroupAllowed: true, Handle: func(args []string) (telegramCommandReply, error) {
if len(args) == 0 {
return s.mainMenu(ctx, channel, msg), nil
}
return s.cmdStart(ctx, msg, args), nil
}},
{Aliases: []string{"/menu"}, Handle: func(args []string) (telegramCommandReply, error) { return s.mainMenu(ctx, channel, msg), nil }},
{Aliases: []string{"/cancel"}, Handle: func(args []string) (telegramCommandReply, error) {
{Aliases: []string{"/menu"}, GroupAllowed: true, Handle: func(args []string) (telegramCommandReply, error) { return s.mainMenu(ctx, channel, msg), nil }},
{Aliases: []string{"/cancel"}, GroupAllowed: true, Handle: func(args []string) (telegramCommandReply, error) {
s.takePending(int64(msg.From.ID))
return telegramCommandReply{Text: "已取消当前操作。"}, nil
}},
{Aliases: []string{"/help"}, Handle: func(args []string) (telegramCommandReply, error) {
{Aliases: []string{"/help"}, GroupAllowed: true, Handle: func(args []string) (telegramCommandReply, error) {
return telegramCommandReply{Text: s.cmdHelp(ctx, msg)}, nil
}},
{Aliases: []string{"/hideadult", "/hide_adult", "/adult"}, Handle: func(args []string) (telegramCommandReply, error) { return s.cmdHideAdult(ctx, msg, args), nil }},
{Aliases: []string{"/account", "/me"}, Handle: func(args []string) (telegramCommandReply, error) { return s.replyAccount(ctx, msg), nil }},
{Aliases: []string{"/signin", "/checkin"}, Handle: func(args []string) (telegramCommandReply, error) { return s.replySignIn(ctx, msg), nil }},
{Aliases: []string{"/devices"}, Handle: func(args []string) (telegramCommandReply, error) { return s.replyDevices(ctx, msg), nil }},
{Aliases: []string{"/kick"}, Handle: func(args []string) (telegramCommandReply, error) { return s.cmdKick(ctx, msg, args), nil }},
{Aliases: []string{"/hideadult", "/hide_adult", "/adult"}, GroupAllowed: true, Handle: func(args []string) (telegramCommandReply, error) { return s.cmdHideAdult(ctx, msg, args), nil }},
{Aliases: []string{"/account", "/me"}, GroupAllowed: true, Handle: func(args []string) (telegramCommandReply, error) { return s.replyAccount(ctx, msg), nil }},
{Aliases: []string{"/signin", "/checkin"}, GroupAllowed: true, Handle: func(args []string) (telegramCommandReply, error) { return s.replySignIn(ctx, msg), nil }},
{Aliases: []string{"/devices"}, GroupAllowed: true, Handle: func(args []string) (telegramCommandReply, error) { return s.replyDevices(ctx, msg), nil }},
{Aliases: []string{"/kick"}, GroupAllowed: true, Handle: func(args []string) (telegramCommandReply, error) { return s.cmdKick(ctx, msg, args), nil }},
{Aliases: []string{"/setname", "/rename"}, Handle: func(args []string) (telegramCommandReply, error) { return s.cmdSetName(ctx, msg, args), nil }},
{Aliases: []string{"/setpass", "/passwd", "/password"}, Handle: func(args []string) (telegramCommandReply, error) { return s.cmdSetPass(ctx, msg, args), nil }},
{Aliases: []string{"/redeem"}, Handle: func(args []string) (telegramCommandReply, error) { return s.cmdRedeem(ctx, channel, msg, args), nil }},
@@ -102,6 +103,12 @@ func (s *TelegramBotService) executeCommand(ctx context.Context, channel *model.
if !ok {
return telegramCommandReply{Text: fmt.Sprintf("未知命令: %s\n\n输入 /help 查看可用命令列表。", cmd)}, nil
}
if telegramIsGroupChat(msg.Chat.Type) && !def.GroupAllowed {
if def.AdminOnly && s.telegramUserIsAdmin(ctx, channel, msg.From.ID) {
return telegramCommandReply{Text: telegramGroupPrivateAdminHint()}, nil
}
return telegramCommandReply{}, nil
}
if def.AdminOnly && !s.telegramUserIsAdmin(ctx, channel, msg.From.ID) {
return telegramCommandReply{Text: def.AdminOnlyText}, nil
}
@@ -133,6 +140,10 @@ type telegramBotCommand struct {
}
func telegramBotCommandMenu() []telegramBotCommand {
return telegramPrivateBotCommandMenu()
}
func telegramPrivateBotCommandMenu() []telegramBotCommand {
return []telegramBotCommand{
{Command: "start", Description: "绑定账号或打开主菜单"},
{Command: "menu", Description: "打开功能菜单"},
@@ -144,22 +155,62 @@ func telegramBotCommandMenu() []telegramBotCommand {
{Command: "hideadult", Description: "隐藏/显示成人媒体库"},
{Command: "redeem", Description: "兑换注册码或续期码"},
{Command: "register", Description: "注册新账号"},
{Command: "status", Description: "系统运行状态(管理员)"},
{Command: "search", Description: "搜索媒体库(管理员)"},
{Command: "downloads", Description: "下载列表(管理员)"},
{Command: "stats", Description: "媒体库统计(管理员)"},
{Command: "users", Description: "用户管理(管理员)"},
{Command: "cleanup", Description: "删号规则巡检(管理员)"},
{Command: "cleanup_rule", Description: "保号规则管理(管理员)"},
}
}
func telegramGroupBotCommandMenu() []telegramBotCommand {
return []telegramBotCommand{
{Command: "start", Description: "打开群组自助菜单"},
{Command: "menu", Description: "打开群组自助菜单"},
{Command: "help", Description: "查看群组可用命令"},
{Command: "account", Description: "查看账号状态"},
{Command: "signin", Description: "签到"},
{Command: "devices", Description: "查看登录设备"},
{Command: "kick", Description: "踢下线设备"},
{Command: "hideadult", Description: "隐藏/显示成人媒体库"},
}
}
func telegramAdminBotCommandMenu() []telegramBotCommand {
commands := append([]telegramBotCommand{}, telegramPrivateBotCommandMenu()...)
commands = append(commands,
telegramBotCommand{Command: "status", Description: "系统运行状态(管理员)"},
telegramBotCommand{Command: "search", Description: "搜索媒体库(管理员)"},
telegramBotCommand{Command: "downloads", Description: "下载列表(管理员)"},
telegramBotCommand{Command: "stats", Description: "媒体库统计(管理员)"},
telegramBotCommand{Command: "users", Description: "用户管理(管理员)"},
telegramBotCommand{Command: "cleanup", Description: "删号规则巡检(管理员)"},
telegramBotCommand{Command: "cleanup_rule", Description: "保号规则管理(管理员)"},
)
return commands
}
func registerTelegramBotCommands(ctx context.Context, cfg map[string]string) error {
if strings.TrimSpace(cfg["bot_token"]) == "" {
return nil
}
payload := map[string]interface{}{
"commands": telegramBotCommandMenu(),
normalizeTelegramConfig(cfg)
if err := telegramSetBotCommands(ctx, cfg, telegramPrivateBotCommandMenu(), nil); err != nil {
return err
}
if err := telegramSetBotCommands(ctx, cfg, telegramPrivateBotCommandMenu(), map[string]interface{}{"type": "all_private_chats"}); err != nil {
return err
}
if err := telegramSetBotCommands(ctx, cfg, telegramGroupBotCommandMenu(), map[string]interface{}{"type": "all_group_chats"}); err != nil {
return err
}
adminCommands := telegramAdminBotCommandMenu()
for _, adminID := range telegramConfiguredUserIDs(cfg["admin_user_ids"]) {
_ = telegramSetBotCommands(ctx, cfg, adminCommands, map[string]interface{}{"type": "chat", "chat_id": adminID})
}
return nil
}
func telegramSetBotCommands(ctx context.Context, cfg map[string]string, commands []telegramBotCommand, scope map[string]interface{}) error {
payload := map[string]interface{}{"commands": commands}
if scope != nil {
payload["scope"] = scope
}
return telegramPostJSON(ctx, cfg, "setMyCommands", payload, 15*time.Second)
}