beanbot/bot/txn.go

71 lines
1.5 KiB
Go
Raw Normal View History

2023-09-26 16:38:35 +08:00
package bot
import (
"fmt"
"sync"
"time"
"git.s8k.top/SeraphJACK/beanbot/repo"
"git.s8k.top/SeraphJACK/beanbot/syntax"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
)
type transaction struct {
2023-09-26 20:22:22 +08:00
ctx *messageHandleContext
2023-09-26 21:42:14 +08:00
raw string
2023-09-26 20:22:22 +08:00
txn *syntax.Transaction
confirmMsg tgbotapi.Message
commitTime time.Time
2023-09-26 16:38:35 +08:00
}
var lock sync.Mutex
2023-09-26 19:58:00 +08:00
var aboutToCommitTxn = make(map[string]*transaction)
2023-09-26 16:38:35 +08:00
func aboutToCommit(id string, txn *transaction) {
lock.Lock()
defer lock.Unlock()
aboutToCommitTxn[id] = txn
}
func cancel(id string) {
lock.Lock()
defer lock.Unlock()
if v, ok := aboutToCommitTxn[id]; ok {
2023-09-26 16:38:35 +08:00
delete(aboutToCommitTxn, id)
// delete transaction confirmation message
2023-09-26 16:57:37 +08:00
go v.ctx.bot.Send(tgbotapi.NewDeleteMessage(v.ctx.chat.ID, v.confirmMsg.MessageID))
2023-09-26 16:38:35 +08:00
}
}
func commitAll() {
lock.Lock()
defer lock.Unlock()
for k, v := range aboutToCommitTxn {
// txn not due to commit, skip
if time.Now().Before(v.commitTime) {
continue
}
2023-09-26 21:42:14 +08:00
updateRecentCommand(v.raw)
2023-09-26 16:38:35 +08:00
err := repo.CommitTransaction(v.txn)
if err != nil {
go v.ctx.bot.Send(tgbotapi.NewMessage(v.ctx.chat.ID, fmt.Sprintf("Failed to commit txn: %v", err)))
}
delete(aboutToCommitTxn, k)
if err == nil {
// delete transaction message
go v.ctx.bot.Send(tgbotapi.NewDeleteMessage(v.ctx.chat.ID, v.ctx.msg.MessageID))
}
// delete transaction confirmation message
2023-09-26 16:57:37 +08:00
go v.ctx.bot.Send(tgbotapi.NewDeleteMessage(v.ctx.chat.ID, v.confirmMsg.MessageID))
2023-09-26 21:47:22 +08:00
go updateRecentKeyboard(v.ctx)
2023-09-26 16:38:35 +08:00
}
}