♻️ Refactored Callback actions

♻️ Refactored Callback actions
This commit is contained in:
Maxim Lebedev 2019-11-19 16:32:28 +05:00
parent 43687c7e96
commit 781b82ad3c
No known key found for this signature in database
GPG Key ID: F8978F46FF0FFA4F
3 changed files with 124 additions and 133 deletions

View File

@ -8,150 +8,120 @@ import (
func (h *Handler) IsCallbackQuery(ctx *model.Context) (err error) {
switch ctx.CallbackQuery.Data {
case common.DataAddSticker:
err = h.CallbackAddSticker(ctx)
case common.DataAddSet:
err = h.CallbackAddSet(ctx)
case common.DataRemoveSticker:
err = h.CallbackRemoveSticker(ctx)
case common.DataRemoveSet:
err = h.CallbackRemoveSet(ctx)
case common.DataRemoveSticker, common.DataAddSticker:
ctx.Set("is_add", ctx.CallbackQuery.Data == common.DataAddSticker)
err = h.CallbackSticker(ctx)
case common.DataAddSet, common.DataRemoveSet:
ctx.Set("is_add", ctx.CallbackQuery.Data == common.DataAddSet)
err = h.CallbackSet(ctx)
}
return err
}
func (h *Handler) CallbackAddSticker(ctx *model.Context) (err error) {
func (h *Handler) CallbackSticker(ctx *model.Context) (err error) {
isAdd, _ := ctx.Get("is_add").(bool)
answer := tg.NewAnswerCallbackQuery(ctx.CallbackQuery.ID)
answer.Text = ctx.T().Sprintf("callback__text_add-single")
markup := tg.NewInlineKeyboardMarkup(tg.NewInlineKeyboardRow())
markup.InlineKeyboard[0] = make([]tg.InlineKeyboardButton, 2)
if err = h.store.AddSticker(ctx.User, ctx.Sticker); err != nil {
return ctx.Error(err)
}
if isAdd {
answer.Text = ctx.T().Sprintf("callback__text_add-single")
markup := tg.NewInlineKeyboardMarkup(tg.NewInlineKeyboardRow(tg.NewInlineKeyboardButton(
ctx.T().Sprintf("sticker__button_remove-single"), common.DataRemoveSticker,
)))
if len(ctx.CallbackQuery.Message.ReplyMarkup.InlineKeyboard[0]) == 2 {
markup.InlineKeyboard[0] = append(
markup.InlineKeyboard[0], ctx.CallbackQuery.Message.ReplyMarkup.InlineKeyboard[0][1],
)
}
if _, err = ctx.EditMessageReplyMarkup(&tg.EditMessageReplyMarkupParameters{
ChatID: ctx.CallbackQuery.Message.Chat.ID,
InlineMessageID: ctx.CallbackQuery.InlineMessageID,
MessageID: ctx.CallbackQuery.Message.ID,
ReplyMarkup: markup,
}); err != nil {
return ctx.Error(err)
}
_, err = ctx.AnswerCallbackQuery(answer)
return ctx.Error(err)
}
func (h *Handler) CallbackAddSet(ctx *model.Context) (err error) {
answer := tg.NewAnswerCallbackQuery(ctx.CallbackQuery.ID)
set, err := ctx.GetStickerSet(ctx.Sticker.SetName)
if err != nil {
return ctx.Error(err)
}
answer.Text = ctx.T().Sprintf("callback__text_add-set", set.Title)
for i := range set.Stickers {
if ctx.Sticker, err = h.stickersStore.GetOrCreate(&model.Sticker{
CreatedAt: ctx.CallbackQuery.Message.Date,
UpdatedAt: ctx.CallbackQuery.Message.Date,
Width: set.Stickers[i].Width,
Height: set.Stickers[i].Height,
Emoji: set.Stickers[i].Emoji,
ID: set.Stickers[i].FileID,
IsAnimated: set.Stickers[i].IsAnimated,
SetName: set.Name,
}); err != nil {
if err = h.store.AddSticker(ctx.User, ctx.Sticker); err != nil {
return ctx.Error(err)
}
_ = h.store.AddSticker(ctx.User, ctx.Sticker)
}
markup.InlineKeyboard[0][0] = tg.NewInlineKeyboardButton(
ctx.T().Sprintf("sticker__button_remove-single"), common.DataRemoveSticker,
)
} else {
answer.Text = ctx.T().Sprintf("callback__text_remove-single")
if err = h.store.AddStickersSet(ctx.User, set.Name); err != nil {
return ctx.Error(err)
}
if err = h.store.RemoveSticker(ctx.User, ctx.Sticker); err != nil {
return ctx.Error(err)
}
markup := tg.NewInlineKeyboardMarkup(tg.NewInlineKeyboardRow(
tg.NewInlineKeyboardButton(ctx.T().Sprintf("sticker__button_remove-single"), common.DataRemoveSticker),
tg.NewInlineKeyboardButton(ctx.T().Sprintf("sticker__button_remove-set"), common.DataRemoveSet),
))
if _, err = ctx.EditMessageReplyMarkup(&tg.EditMessageReplyMarkupParameters{
ChatID: ctx.CallbackQuery.Message.Chat.ID,
InlineMessageID: ctx.CallbackQuery.InlineMessageID,
MessageID: ctx.CallbackQuery.Message.ID,
ReplyMarkup: markup,
}); err != nil {
return ctx.Error(err)
}
_, err = ctx.AnswerCallbackQuery(answer)
return ctx.Error(err)
}
func (h *Handler) CallbackRemoveSticker(ctx *model.Context) (err error) {
answer := tg.NewAnswerCallbackQuery(ctx.CallbackQuery.ID)
answer.Text = ctx.T().Sprintf("callback__text_remove-single")
if err = h.store.RemoveSticker(ctx.User, ctx.Sticker); err != nil {
return ctx.Error(err)
}
markup := tg.NewInlineKeyboardMarkup(tg.NewInlineKeyboardRow(
tg.NewInlineKeyboardButton(ctx.T().Sprintf("sticker__button_add-single"), common.DataAddSticker),
))
if len(ctx.CallbackQuery.Message.ReplyMarkup.InlineKeyboard[0]) == 2 {
markup.InlineKeyboard[0] = append(
markup.InlineKeyboard[0], ctx.CallbackQuery.Message.ReplyMarkup.InlineKeyboard[0][1],
markup.InlineKeyboard[0][0] = tg.NewInlineKeyboardButton(
ctx.T().Sprintf("sticker__button_add-single"), common.DataAddSticker,
)
}
if _, err = ctx.EditMessageReplyMarkup(&tg.EditMessageReplyMarkupParameters{
ChatID: ctx.CallbackQuery.Message.Chat.ID,
InlineMessageID: ctx.CallbackQuery.InlineMessageID,
MessageID: ctx.CallbackQuery.Message.ID,
ReplyMarkup: markup,
}); err != nil {
return ctx.Error(err)
}
_, err = ctx.AnswerCallbackQuery(answer)
return ctx.Error(err)
}
func (h *Handler) CallbackRemoveSet(ctx *model.Context) (err error) {
answer := tg.NewAnswerCallbackQuery(ctx.CallbackQuery.ID)
answer.Text = ctx.T().Sprintf("callback__text_remove-set", ctx.Sticker.SetName)
if err = h.store.RemoveStickersSet(ctx.User, ctx.Sticker.SetName); err != nil {
return ctx.Error(err)
}
markup := tg.NewInlineKeyboardMarkup(tg.NewInlineKeyboardRow(
tg.NewInlineKeyboardButton(ctx.T().Sprintf("sticker__button_add-single"), common.DataAddSticker),
))
if len(ctx.CallbackQuery.Message.ReplyMarkup.InlineKeyboard[0]) == 2 {
markup.InlineKeyboard[0] = append(
markup.InlineKeyboard[0],
tg.NewInlineKeyboardButton(ctx.T().Sprintf("sticker__button_add-set"), common.DataAddSet),
)
markup.InlineKeyboard[0][1] = ctx.CallbackQuery.Message.ReplyMarkup.InlineKeyboard[0][1]
}
if _, err = ctx.EditMessageReplyMarkup(&tg.EditMessageReplyMarkupParameters{
ChatID: ctx.CallbackQuery.Message.Chat.ID,
InlineMessageID: ctx.CallbackQuery.InlineMessageID,
MessageID: ctx.CallbackQuery.Message.ID,
ReplyMarkup: markup,
}); err != nil {
return ctx.Error(err)
}
_, err = ctx.AnswerCallbackQuery(answer)
return ctx.Error(err)
}
func (h *Handler) CallbackSet(ctx *model.Context) (err error) {
isAdd, _ := ctx.Get("is_add").(bool)
answer := tg.NewAnswerCallbackQuery(ctx.CallbackQuery.ID)
markup := new(tg.InlineKeyboardMarkup)
if isAdd {
set, err := ctx.GetStickerSet(ctx.Sticker.SetName)
if err != nil {
return ctx.Error(err)
}
answer.Text = ctx.T().Sprintf("callback__text_add-set", set.Title)
for i := range set.Stickers {
if ctx.Sticker, err = h.stickersStore.GetOrCreate(&model.Sticker{
CreatedAt: ctx.CallbackQuery.Message.Date,
UpdatedAt: ctx.CallbackQuery.Message.Date,
Width: set.Stickers[i].Width,
Height: set.Stickers[i].Height,
Emoji: set.Stickers[i].Emoji,
ID: set.Stickers[i].FileID,
IsAnimated: set.Stickers[i].IsAnimated,
SetName: set.Name,
}); err != nil {
return ctx.Error(err)
}
_ = h.store.AddSticker(ctx.User, ctx.Sticker)
}
if err = h.store.AddStickersSet(ctx.User, set.Name); err != nil {
return ctx.Error(err)
}
markup.InlineKeyboard = append(markup.InlineKeyboard, tg.NewInlineKeyboardRow(
tg.NewInlineKeyboardButton(
ctx.T().Sprintf("sticker__button_remove-single"), common.DataRemoveSticker,
),
tg.NewInlineKeyboardButton(
ctx.T().Sprintf("sticker__button_remove-set"), common.DataRemoveSet,
),
))
} else {
answer.Text = ctx.T().Sprintf("callback__text_remove-set", ctx.Sticker.SetName)
if err = h.store.RemoveStickersSet(ctx.User, ctx.Sticker.SetName); err != nil {
return ctx.Error(err)
}
markup.InlineKeyboard = append(markup.InlineKeyboard, tg.NewInlineKeyboardRow(
tg.NewInlineKeyboardButton(
ctx.T().Sprintf("sticker__button_add-single"), common.DataAddSticker,
),
tg.NewInlineKeyboardButton(
ctx.T().Sprintf("sticker__button_add-set"), common.DataAddSet,
),
))
}
if _, err = ctx.EditMessageReplyMarkup(&tg.EditMessageReplyMarkupParameters{

View File

@ -84,7 +84,7 @@ func (h *Handler) IsSticker(ctx *model.Context) error {
tg.NewInlineKeyboardButton(ctx.T().Sprintf("sticker__button_add-single"), common.DataAddSticker),
))
if !strings.EqualFold(ctx.Sticker.SetName, common.SetNameUploaded) {
if ctx.Sticker.SetName != "" && !strings.EqualFold(ctx.Sticker.SetName, common.SetNameUploaded) {
markup.InlineKeyboard[0] = append(
markup.InlineKeyboard[0],
tg.NewInlineKeyboardButton(ctx.T().Sprintf("sticker__button_add-set"), common.DataAddSet),
@ -92,14 +92,14 @@ func (h *Handler) IsSticker(ctx *model.Context) error {
}
if us != nil {
markup = tg.NewInlineKeyboardMarkup(tg.NewInlineKeyboardRow(tg.NewInlineKeyboardButton(
markup.InlineKeyboard[0][0] = tg.NewInlineKeyboardButton(
ctx.T().Sprintf("sticker__button_remove-single"), common.DataRemoveSticker,
)))
)
if ctx.Sticker.SetName != "" {
markup.InlineKeyboard[0] = append(markup.InlineKeyboard[0], tg.NewInlineKeyboardButton(
if ctx.Sticker.SetName != "" && !strings.EqualFold(ctx.Sticker.SetName, common.SetNameUploaded) {
markup.InlineKeyboard[0][1] = tg.NewInlineKeyboardButton(
ctx.T().Sprintf("sticker__button_remove-set"), common.DataRemoveSet,
))
)
}
}

View File

@ -1,6 +1,7 @@
package model
import (
"context"
"fmt"
tg "gitlab.com/toby3d/telegram"
@ -55,8 +56,12 @@ type (
printer *message.Printer
Sticker *Sticker
User *User
context context.Context
}
contextKey string
Error struct {
Message string
frame xerrors.Frame
@ -178,3 +183,19 @@ func (ctx *Context) Error(err error) error {
return err
}
func (ctx *Context) Set(key string, val interface{}) {
if ctx.context == nil {
ctx.context = context.Background()
}
ctx.context = context.WithValue(ctx.context, contextKey(key), val)
}
func (ctx *Context) Get(key string) interface{} {
if ctx.context == nil {
ctx.context = context.Background()
}
return ctx.context.Value(contextKey(key))
}