/
edit.go
110 lines (95 loc) · 2.86 KB
/
edit.go
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package handlers
import (
"context"
"fmt"
"github.com/g4s8/openbots/pkg/state"
"github.com/g4s8/openbots/pkg/types"
telegram "github.com/go-telegram-bot-api/telegram-bot-api/v5"
"github.com/pkg/errors"
"github.com/rs/zerolog"
)
var _ types.Handler = (*MessageEdit)(nil)
type editMessageMode int
const (
editMessageCaptionMode editMessageMode = 0
editMessageTextMode editMessageMode = 1
editMessageTextKeyboardMode editMessageMode = 2
)
var ErrNoCallbackMessage = errors.New("callback data doesn't have message id")
type MessageEdit struct {
caption string
template Template
keyboard InlineKeyboard
sp types.StateProvider
secrets types.Secrets
logger zerolog.Logger
}
func NewMessageEdit(caption string, template Template, keyboard InlineKeyboard,
sp types.StateProvider, secrets types.Secrets, logger zerolog.Logger,
) *MessageEdit {
return &MessageEdit{
caption: caption,
template: template,
keyboard: keyboard,
sp: sp,
secrets: secrets,
logger: logger.With().Str("handler", "message_edit").Logger(),
}
}
func (h *MessageEdit) mode(text string) editMessageMode {
if h.caption != "" {
return editMessageCaptionMode
}
var res editMessageMode
if text != "" {
res |= editMessageTextMode
}
if len(h.keyboard) > 0 {
res |= editMessageTextKeyboardMode
}
return res
}
func (h *MessageEdit) Handle(ctx context.Context, upd *telegram.Update, api *telegram.BotAPI) error {
if upd.CallbackQuery == nil || upd.CallbackQuery.Message == nil {
return ErrNoCallbackMessage
}
msgID := upd.CallbackQuery.Message.MessageID
chatID := ChatID(upd)
state := state.NewUserState()
defer state.Close()
if err := h.sp.Load(ctx, chatID, state); err != nil {
return errors.Wrap(err, "load user state")
}
secretMap, err := h.secrets.Get(ctx)
if err != nil {
return errors.Wrap(err, "get secrets")
}
templateCtx := newTemplateContext(upd, state, secretMap, nil)
text, err := h.template.Format(templateCtx)
if err != nil {
return errors.Wrap(err, "format template")
}
h.logger.Debug().
Int("message_id", msgID).
Int64("chat_id", int64(chatID)).
Str("text", text).
Str("origin_text", text).
Msg("Edit message")
var msg telegram.Chattable
switch mode := h.mode(text); mode {
case editMessageCaptionMode:
msg = telegram.NewEditMessageCaption(int64(chatID), msgID, h.caption)
case editMessageTextMode:
msg = telegram.NewEditMessageText(int64(chatID), msgID, text)
case editMessageTextKeyboardMode:
msg = telegram.NewEditMessageReplyMarkup(int64(chatID), msgID, h.keyboard.telegramMarkup())
case editMessageTextKeyboardMode | editMessageTextMode:
msg = telegram.NewEditMessageTextAndMarkup(int64(chatID), msgID, text, h.keyboard.telegramMarkup())
default:
return fmt.Errorf("unsupported edit message mode: %d", mode)
}
if _, err := api.Send(msg); err != nil {
return errors.Wrap(err, "send message")
}
return nil
}