Skip to content

Commit

Permalink
add state, many refactors
Browse files Browse the repository at this point in the history
  • Loading branch information
samarets committed Oct 3, 2022
1 parent 6616ec0 commit 882d22e
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 86 deletions.
165 changes: 87 additions & 78 deletions internal/bot/bot.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,16 @@ func (b *bot) InitUpdates() {
}
}

userState, err := b.db.getUserState(update.SentFrom().ID)
if err != nil {
log.Error().Err(err).Send()
continue
}

if update.Message.IsCommand() {
switch update.Message.Command() {
case startCommand:
b.StartCommand(update)
b.StartCommand(update, userState)
case connectCommand:
b.ConnectCommand(update)
case breakCommand:
Expand All @@ -85,108 +91,111 @@ func (b *bot) InitUpdates() {
continue
}

fromQueue, err := b.db.queueDB().get(update.Message.From.ID)
if err != nil {
log.Error().Err(err).Send()
continue
}

roomsID, err := b.db.roomsDB().get(update.Message.From.ID)
if err != nil {
log.Error().Err(err).Send()
continue
}

if fromQueue == nil && roomsID == nil {
err = b.db.queueDB().set(update.Message.From.ID, update.Message.From)
if userState == defaultState {
err = b.defaultStateFunc(update)
if err != nil {
log.Error().Err(err).Send()
continue
}

var bufferMessages []tgbotapi.Message
bufferMessages = append(bufferMessages, *update.Message)
err = b.db.bufferDB().set(update.Message.From.ID, bufferMessages)
continue
}
if userState == queueState {
err = b.queueStateFunc(update)
if err != nil {
log.Error().Err(err).Send()
continue
}

msg := tgbotapi.NewMessage(
update.Message.From.ID,
"🤖 Ваше повідомлення було отримано, якщо у вас є що додати - напишіть.\n\nСкоро до вас доєднається оператор технічної підтримки",
)
_, err = b.bot.Send(msg)
continue
}
if userState != roomState {
err = b.roomStateFunc(update)
if err != nil {
log.Error().Err(err).Send()
continue
}

continue
}

if fromQueue != nil && roomsID == nil {
bufferMessages, err := b.db.bufferDB().get(update.Message.From.ID)
if err != nil {
log.Error().Err(err).Send()
continue
}
}
}
}

bufferMessages = append(bufferMessages, *update.Message)
func (b *bot) defaultStateFunc(update tgbotapi.Update) error {
err := b.db.queueDB().set(update.Message.From.ID, update.Message.From)
if err != nil {
return err
}

err = b.db.bufferDB().set(update.Message.From.ID, bufferMessages)
if err != nil {
log.Error().Err(err).Send()
continue
}
var bufferMessages []tgbotapi.Message
bufferMessages = append(bufferMessages, *update.Message)
err = b.db.bufferDB().set(update.Message.From.ID, bufferMessages)
if err != nil {
return err
}

continue
}
msg := tgbotapi.NewMessage(
update.Message.From.ID,
"🤖 Ваше повідомлення було отримано, якщо у вас є що додати - напишіть.\n\nСкоро до вас доєднається оператор технічної підтримки",
)
_, err = b.bot.Send(msg)
if err != nil {
return err
}

if roomsID != nil {
whoomSend, err := b.db.roomsDB().get(update.Message.From.ID)
if err != nil {
log.Error().Err(err).Send()
continue
}
if whoomSend == nil {
log.Error().Err(fmt.Errorf("whoomSend is empty")).Send()
}
return nil
}

msg := tgbotapi.NewCopyMessage(*whoomSend, update.Message.From.ID, update.Message.MessageID)
if update.Message.ReplyToMessage != nil {
replyToID, err := b.db.messagesIDsDB().get(update.Message.ReplyToMessage.MessageID)
if err != nil && err != badger.ErrKeyNotFound {
log.Error().Err(err).Send()
continue
}

if replyToID != nil {
msg.ReplyToMessageID = *replyToID
}
}
func (b *bot) queueStateFunc(update tgbotapi.Update) error {
bufferMessages, err := b.db.bufferDB().get(update.Message.From.ID)
if err != nil {
return err
}

rMsg, err := b.bot.Send(msg)
if err != nil {
log.Error().Err(err).Send()
continue
}
bufferMessages = append(bufferMessages, *update.Message)

err = b.db.messagesIDsDB().set(update.Message.MessageID, rMsg.MessageID)
if err != nil {
log.Error().Err(err).Send()
continue
}
err = b.db.bufferDB().set(update.Message.From.ID, bufferMessages)
if err != nil {
return err
}

err = b.db.messagesIDsDB().set(rMsg.MessageID, update.Message.MessageID)
if err != nil {
log.Error().Err(err).Send()
continue
}
return nil
}

continue
}
func (b *bot) roomStateFunc(update tgbotapi.Update) error {
whoomSend, err := b.db.roomsDB().get(update.Message.From.ID)
if err != nil {
return err
}
if whoomSend == nil {
return fmt.Errorf("whoomSend is empty")
}

msg := tgbotapi.NewCopyMessage(*whoomSend, update.Message.From.ID, update.Message.MessageID)
if update.Message.ReplyToMessage != nil {
replyToID, err := b.db.messagesIDsDB().get(update.Message.ReplyToMessage.MessageID)
if err != nil && err != badger.ErrKeyNotFound {
return err
}

if replyToID != nil {
msg.ReplyToMessageID = *replyToID
}
}

rMsg, err := b.bot.Send(msg)
if err != nil {
return err
}

err = b.db.messagesIDsDB().set(update.Message.MessageID, rMsg.MessageID)
if err != nil {
return err
}

err = b.db.messagesIDsDB().set(rMsg.MessageID, update.Message.MessageID)
if err != nil {
return err
}

return nil
}
22 changes: 15 additions & 7 deletions internal/bot/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,28 @@ const (
event = "event"
)

func (b *bot) StartCommand(update tgbotapi.Update) {
func (b *bot) StartCommand(update tgbotapi.Update, userState state) {
if !update.FromChat().IsPrivate() {
return
}

helloMessage := b.tl.GetMessage(
b.db.languageDB().get(update.SentFrom().ID), "hello", map[string]interface{}{
"Name": update.SentFrom().FirstName,
},
)
var message string
switch userState {
case queueState:
message = b.tl.GetMessage(b.db.languageDB().get(update.SentFrom().ID), "queue_start")
case roomState:
message = b.tl.GetMessage(b.db.languageDB().get(update.SentFrom().ID), "room_start")
default:
message = b.tl.GetMessage(
b.db.languageDB().get(update.SentFrom().ID), "hello", map[string]interface{}{
"Name": update.SentFrom().FirstName,
},
)
}

msg := tgbotapi.NewMessage(
update.Message.Chat.ID,
helloMessage,
message,
)

_, err := b.bot.Send(msg)
Expand Down
21 changes: 21 additions & 0 deletions internal/bot/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,27 @@ func newBotDB(db *db.DB) *botDB {
}
}

func (db *botDB) getUserState(userID int64) (state, error) {
fromQueue, err := db.queueDB().get(userID)
if err != nil {
return unknownState, err
}
if fromQueue != nil {
return queueState, nil
}

fromRoom, err := db.roomsDB().get(userID)
if err != nil {
log.Error().Err(err).Send()
return unknownState, err
}
if fromRoom != nil {
return roomState, nil
}

return defaultState, nil
}

type queueDB struct {
*botDB
}
Expand Down
10 changes: 10 additions & 0 deletions internal/bot/types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package bot

type state string

const (
defaultState state = "default-state"
unknownState state = "unknown-state"
queueState state = "queue-state"
roomState state = "room-state"
)
2 changes: 2 additions & 0 deletions locales/en-US/user.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
{
"hello": "Hello, {{ .Name }}, write your question we will help",
"queue_start": "You are in the support queue, your question has been transferred, please wait for a support operator to join you",
"room_start": "The operator has already joined you, write your questions in this chat",
"operator_connected": "An operator has joined you"
}
4 changes: 3 additions & 1 deletion locales/uk-UA/user.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
{
"hello": "Привіт, {{ .Name }}, напиши своє питання — ми допоможемо",
"operator_connected": "До вас доєднався оператор"
"queue_start": "Ви перебуваєте в черзі підтримки, ваше запитання переслано, будь ласка, зачекайте, поки до вас приєднається оператор підтримки",
"room_start": "Оператор вже приєднався до вас, напишіть ваше запитання у цей чат",
"operator_connected": "До вас приє оператор"
}

0 comments on commit 882d22e

Please sign in to comment.