Skip to content

Commit

Permalink
upgrade flag system
Browse files Browse the repository at this point in the history
  • Loading branch information
koenigskraut committed Aug 9, 2023
1 parent cbd3eab commit 97c1187
Show file tree
Hide file tree
Showing 9 changed files with 116 additions and 85 deletions.
26 changes: 7 additions & 19 deletions cmd/bot/handle_message.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package main
import (
"context"
"errors"
"github.com/gotd/td/telegram/message/html"
"github.com/gotd/td/tg"
cmd "github.com/koenigskraut/piktagbot/commands"
db "github.com/koenigskraut/piktagbot/database"
Expand Down Expand Up @@ -35,26 +34,15 @@ func handlePre() func(context.Context, tg.Entities, *tg.UpdateNewMessage, *cmd.H
}
lockedUser.DBUser = user

// TODO get rid of strings, use enum-like constants, rework flag system
answer := c.Sender.Answer(entities, u)
// are we waiting for something from user?
switch user.Flag {
case "remove-tag":
text, markup := flags.Remove(m, user)
var err error
if markup == nil {
_, err = c.Sender.Answer(entities, u).Text(ctx, text)
} else {
_, err = c.Sender.Answer(entities, u).Markup(markup).Text(ctx, text)
}
return err
case "add-sticker":
text := flags.Add(m, user)
_, err := c.Sender.Answer(entities, u).Text(ctx, text)
return err
case "check-tag":
text := flags.Check(m, user)
_, err := c.Sender.Answer(entities, u).StyledText(ctx, html.String(nil, text))
return err
case flags.RemoveTag:
return flags.Remove(ctx, m, user, answer)
case flags.AddTag:
return flags.Add(ctx, m, user, answer)
case flags.CheckTag:
return flags.Check(ctx, m, user, answer)
default:
break
}
Expand Down
3 changes: 2 additions & 1 deletion commands/check.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"github.com/gotd/td/telegram/message/html"
"github.com/gotd/td/tg"
"github.com/koenigskraut/piktagbot/database"
"github.com/koenigskraut/piktagbot/flags"
"github.com/koenigskraut/piktagbot/util"
)

Expand Down Expand Up @@ -41,7 +42,7 @@ func Check(ctx context.Context, e tg.Entities, upd *tg.UpdateNewMessage, c *Help

// case 2: message is not a reply
// set a waiting-for-a-sticker flag
if err := user.SetFlag("check-tag", ""); err != nil {
if err := user.SetFlag(flags.CheckTag, ""); err != nil {
_, msgErr := answer.Text(ctx, "Что-то пошло не так, попробуйте ещё раз!")
return errors.Join(err, msgErr)
}
Expand Down
3 changes: 2 additions & 1 deletion commands/remove.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"errors"
"github.com/gotd/td/tg"
"github.com/koenigskraut/piktagbot/callback"
"github.com/koenigskraut/piktagbot/flags"
"github.com/koenigskraut/piktagbot/util"
)

Expand Down Expand Up @@ -42,7 +43,7 @@ func Remove(ctx context.Context, e tg.Entities, upd *tg.UpdateNewMessage, c *Hel

// case 2: message is not a reply
// set a waiting-for-a-sticker flag
if err := user.SetFlag("remove-tag", ""); err != nil {
if err := user.SetFlag(flags.RemoveTag, ""); err != nil {
_, msgErr := answer.Text(ctx, "Что-то пошло не так, попробуйте ещё раз!")
return errors.Join(err, msgErr)
}
Expand Down
3 changes: 2 additions & 1 deletion commands/tag.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"errors"
"github.com/gotd/td/tg"
db "github.com/koenigskraut/piktagbot/database"
"github.com/koenigskraut/piktagbot/flags"
"github.com/koenigskraut/piktagbot/util"
"strings"
)
Expand Down Expand Up @@ -52,7 +53,7 @@ func Tag(ctx context.Context, e tg.Entities, upd *tg.UpdateNewMessage, c *Helper

// case 2: message is not a reply
// remember the tag and set a waiting-for-a-sticker flag
if err := user.SetFlag("add-sticker", text); err != nil {
if err := user.SetFlag(flags.AddTag, text); err != nil {
_, msgErr := answer.Text(ctx, "Что-то пошло не так, попробуйте ещё раз!")
return errors.Join(err, msgErr)
}
Expand Down
4 changes: 2 additions & 2 deletions database/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ type User struct {
ID uint `gorm:"primaryKey"`
UserID int64
GlobalTag bool
Flag string
Flag int8
FlagData string
New bool
TagOrder []byte
Expand All @@ -51,7 +51,7 @@ func (u *User) SwitchGlobal() (err error) {
return DB.Model(u).Update("global_tag", !u.GlobalTag).Error
}

func (u *User) SetFlag(flag, flagData string) (err error) {
func (u *User) SetFlag(flag int8, flagData string) (err error) {
err = DB.Model(u).Updates(&User{Flag: flag, FlagData: flagData}).Error
return
}
Expand Down
53 changes: 31 additions & 22 deletions flags/add.go
Original file line number Diff line number Diff line change
@@ -1,35 +1,44 @@
package flags

import (
"fmt"
"context"
"errors"
"github.com/gotd/td/telegram/message"
"github.com/gotd/td/tg"
"github.com/koenigskraut/piktagbot/database"
"github.com/koenigskraut/piktagbot/util"
"strings"
)

func Add(m *tg.Message, u *database.User) string {
func Add(ctx context.Context, m *tg.Message, u *database.User, answer *message.RequestBuilder) error {
if strings.HasPrefix(m.Message, "/cancel") {
database.DB.Model(&u).Select("Flag", "FlagData").Updates(database.User{Flag: "", FlagData: ""})
return "Действие отменено"
} else {
if sticker, ok := util.StickerFromMedia(m.Media); ok {
// if there is a sticker, check if there is such a tag attached to it,
// if not — add one
sTag := database.StickerTag{
User: u.UserID,
StickerID: sticker.ID,
Tag: u.FlagData,
}
answer, _ := sTag.CheckAndAdd()
if !strings.HasPrefix(answer, "Что") {
database.DB.Model(u).Select("Flag", "FlagData").Updates(database.User{Flag: "", FlagData: ""})
}
return answer
} else {
return fmt.Sprintf("В сообщении нет стикера! Отправьте мне стикер для "+
"тега \"%s\" или отмените действие командой /cancel",
u.FlagData)
u.Flag, u.FlagData = NoFlag, ""
if err := u.Save(); err != nil {
return err
}
_, err := answer.Text(ctx, "Действие отменено")
return err
}
sticker, ok := util.StickerFromMedia(m.Media)
if !ok {
_, err := answer.Text(ctx, "В сообщении нет стикера! Отправьте мне стикер для удаления тегов или "+
"отмените действие командой /cancel")
return err
}
// if there is a sticker, check if there is such a tag attached to it,
// if not — add one
sTag := database.StickerTag{
User: u.UserID,
StickerID: sticker.ID,
Tag: u.FlagData,
}
text, errDB := sTag.CheckAndAdd()
if errDB == nil {
u.Flag, u.FlagData = NoFlag, ""
if err := u.Save(); err != nil {
return err
}
}
_, errMsg := answer.Text(ctx, text)
return errors.Join(errDB, errMsg)
}
8 changes: 8 additions & 0 deletions flags/base.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package flags

const (
NoFlag = iota
RemoveTag
AddTag
CheckTag
)
50 changes: 32 additions & 18 deletions flags/check.go
Original file line number Diff line number Diff line change
@@ -1,31 +1,45 @@
package flags

import (
"context"
"errors"
"github.com/gotd/td/telegram/message"
"github.com/gotd/td/telegram/message/html"
"github.com/gotd/td/tg"
"github.com/koenigskraut/piktagbot/database"
"github.com/koenigskraut/piktagbot/util"
"log"
"strings"
)

func Check(m *tg.Message, u *database.User) string {
func Check(ctx context.Context, m *tg.Message, u *database.User, answer *message.RequestBuilder) error {
if strings.HasPrefix(m.Message, "/cancel") {
database.DB.Model(&u).Select("Flag", "FlagData").Updates(database.User{Flag: "", FlagData: ""})
return "Действие отменено"
} else {
if sticker, ok := util.StickerFromMedia(m.Media); ok {
tags, err := (&database.StickerTag{User: u.UserID, StickerID: sticker.ID}).GetAllForUser()
if err != nil {
log.Println(err)
return "Что-то пошло не так, попробуйте ещё раз!"
}
if len(tags) == 0 {
return "У этого стикера нет ни одного тега!"
}
return util.CheckStickerResponse(tags)
} else {
return "В сообщении нет стикера! Отправьте мне стикер для " +
"просмотра тегов или отмените действие командой /cancel"
u.Flag, u.FlagData = NoFlag, ""
if err := u.Save(); err != nil {
return err
}
_, err := answer.Text(ctx, "Действие отменено")
return err
}
sticker, ok := util.StickerFromMedia(m.Media)
if !ok {
_, err := answer.Text(ctx, "В сообщении нет стикера! Отправьте мне стикер для "+
"просмотра тегов или отмените действие командой /cancel")
return err
}
tags, err := (&database.StickerTag{User: u.UserID, StickerID: sticker.ID}).GetAllForUser()
if err != nil {
_, errMsg := answer.Text(ctx, "Что-то пошло не так, попробуйте ещё раз!")
return errors.Join(err, errMsg)
}
if len(tags) == 0 {
_, err := answer.Text(ctx, "У этого стикера нет ни одного тега!")
return err
}
u.Flag, u.FlagData = NoFlag, ""
if err := u.Save(); err != nil {
_, errMsg := answer.Text(ctx, "Что-то пошло не так, попробуйте ещё раз!")
return errors.Join(err, errMsg)
}
_, err = answer.StyledText(ctx, html.String(nil, util.CheckStickerResponse(tags)))
return err
}
51 changes: 30 additions & 21 deletions flags/remove.go
Original file line number Diff line number Diff line change
@@ -1,36 +1,45 @@
package flags

import (
"context"
"errors"
"github.com/gotd/td/telegram/message"
"github.com/gotd/td/tg"
"github.com/koenigskraut/piktagbot/callback"
"github.com/koenigskraut/piktagbot/database"
"github.com/koenigskraut/piktagbot/util"
"log"
"strings"
)

func Remove(m *tg.Message, u *database.User) (string, tg.ReplyMarkupClass) {
func Remove(ctx context.Context, m *tg.Message, u *database.User, answer *message.RequestBuilder) error {
if strings.HasPrefix(m.Message, "/cancel") {
database.DB.Model(&u).Select("Flag", "FlagData").Updates(database.User{Flag: "", FlagData: ""})
return "Действие отменено", nil
} else {
if sticker, ok := util.StickerFromMedia(m.Media); ok {
// if there is a sticker, let's build a keyboard for it with
// tags to delete
markup, err := callback.BuildMarkup(sticker.ID, u.UserID, 0)
if err != nil {
if errors.Is(err, callback.MarkupError) {
return "У этого стикера нет ни одного тега!", nil
}
log.Println(err)
return "Неизвестная ошибка", nil
}
database.DB.Model(u).Select("Flag", "FlagData").Updates(database.User{Flag: "", FlagData: ""})
return "Выберите тег для удаления:", markup
} else {
return "В сообщении нет стикера! Отправьте мне стикер для " +
"удаления тегов или отмените действие командой /cancel", nil
u.Flag, u.FlagData = NoFlag, ""
if err := u.Save(); err != nil {
return err
}
_, err := answer.Text(ctx, "Действие отменено")
return err
}
sticker, ok := util.StickerFromMedia(m.Media)
if !ok {
_, err := answer.Text(ctx, "В сообщении нет стикера! Отправьте мне стикер для удаления тегов или "+
"отмените действие командой /cancel")
return err
}
// if there is a sticker, let's build a keyboard for it with tags to delete
markup, errMarkup := callback.BuildMarkup(sticker.ID, u.UserID, 0)
if errMarkup != nil {
msg := "Неизвестная ошибка"
if errors.Is(errMarkup, callback.MarkupError) {
msg = "У этого стикера нет ни одного тега!"
}
_, errMsg := answer.Text(ctx, msg)
return errors.Join(errMarkup, errMsg)
}
u.Flag, u.FlagData = NoFlag, ""
if err := u.Save(); err != nil {
return err
}
_, err := answer.Markup(markup).Text(ctx, "Выберите тег для удаления:")
return err
}

0 comments on commit 97c1187

Please sign in to comment.