Refactor message processing in main.go by separating logic into dedicated handler functions for messages, callback queries, and channel posts. This improves code organization and readability. Additionally, enhance user state management and command handling for better user experience.

This commit is contained in:
Akulij 2025-03-24 11:45:22 +08:00
parent 128ebcbf8c
commit b8a54944d9

View File

@ -113,8 +113,16 @@ func main() {
} }
func ProcessUpdate(bc BotController, update tgbotapi.Update) { func ProcessUpdate(bc BotController, update tgbotapi.Update) {
if update.Message != nil { if update.Message != nil {
handleMessage(bc, update)
} else if update.CallbackQuery != nil {
handleCallbackQuery(bc, update)
} else if update.ChannelPost != nil {
handleChannelPost(bc, update)
}
}
func handleMessage(bc BotController, update tgbotapi.Update) {
var UserID = update.Message.From.ID var UserID = update.Message.From.ID
var user User var user User
@ -127,14 +135,63 @@ func ProcessUpdate(bc BotController, update tgbotapi.Update) {
bc.db.Model(&user).Update("MsgCounter", user.MsgCounter+1) bc.db.Model(&user).Update("MsgCounter", user.MsgCounter+1)
log.Printf("User[%d] messages: %d", user.ID, user.MsgCounter) log.Printf("User[%d] messages: %d", user.ID, user.MsgCounter)
log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text) log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text)
possibleCommand := strings.Split(update.Message.Text, " ")[0] possibleCommand := strings.Split(update.Message.Text, " ")[0]
args := strings.Split(update.Message.Text, " ")[1:] args := strings.Split(update.Message.Text, " ")[1:]
log.Printf("Args: %s", args) log.Printf("Args: %s", args)
if possibleCommand == "/start" { switch {
case possibleCommand == "/start":
handleStartCommand(bc, update, user)
case possibleCommand == "/id" && user.IsAdmin():
bc.bot.Send(tgbotapi.NewMessage(update.Message.Chat.ID, strconv.FormatInt(update.Message.Chat.ID, 10)))
case possibleCommand == "/secret" && len(args) > 0 && args[0] == bc.cfg.AdminPass:
handleSecretCommand(bc, update, user)
case possibleCommand == "/panel" && user.IsAdmin():
handlePanelCommand(bc, update, user)
case possibleCommand == "/usermode" && user.IsEffectiveAdmin():
handleUserModeCommand(bc, update, user)
default:
handleDefaultMessage(bc, update, user)
}
}
func handleCallbackQuery(bc BotController, update tgbotapi.Update) {
var user User
bc.db.First(&user, "id", update.CallbackQuery.From.ID)
if update.CallbackQuery.Data == "leave_ticket_button" {
handleLeaveTicketButton(bc, update, user)
} else if user.IsEffectiveAdmin() {
handleAdminCallback(bc, update, user)
}
if user.IsAdmin() && update.CallbackQuery.Data == "panel" {
handlePanelCallback(bc, update, user)
}
canswer := tgbotapi.NewCallback(update.CallbackQuery.ID, "")
bc.bot.Send(canswer)
}
func handleChannelPost(bc BotController, update tgbotapi.Update) {
post := update.ChannelPost
if post.Text == "setchannelid" {
bc.SetBotContent("channelid", strconv.FormatInt(post.SenderChat.ID, 10))
var admins []User
bc.db.Where("role_bitmask & 1 = ?", 1).Find(&admins)
for _, admin := range admins {
bc.bot.Send(tgbotapi.NewMessage(admin.ID, "ChannelID is set to "+strconv.FormatInt(post.SenderChat.ID, 10)))
delcmd := tgbotapi.NewDeleteMessage(post.SenderChat.ID, post.MessageID)
bc.bot.Send(delcmd)
}
}
}
// Helper functions for specific commands
func handleStartCommand(bc BotController, update tgbotapi.Update, user User) {
bc.db.Model(&user).Update("state", "start") bc.db.Model(&user).Update("state", "start")
kbd := tgbotapi.NewInlineKeyboardMarkup( kbd := tgbotapi.NewInlineKeyboardMarkup(
tgbotapi.NewInlineKeyboardRow( tgbotapi.NewInlineKeyboardRow(
@ -151,10 +208,10 @@ func ProcessUpdate(bc BotController, update tgbotapi.Update) {
), ),
) )
} }
img, err := bc.GetBotContentVerbose("preview_image") img, err := bc.GetBotContentVerbose("preview_image")
if err != nil || img == "" { if err != nil || img == "" {
msg := tgbotapi.NewMessage(update.Message.Chat.ID, bc.GetBotContent("start")) msg := tgbotapi.NewMessage(update.Message.Chat.ID, bc.GetBotContent("start"))
// msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Hello, [user](tg://user?id=958170391)")
msg.ParseMode = "markdown" msg.ParseMode = "markdown"
msg.ReplyMarkup = kbd msg.ReplyMarkup = kbd
bc.bot.Send(msg) bc.bot.Send(msg)
@ -164,17 +221,16 @@ func ProcessUpdate(bc BotController, update tgbotapi.Update) {
msg.ReplyMarkup = kbd msg.ReplyMarkup = kbd
bc.bot.Send(msg) bc.bot.Send(msg)
} }
}
} else if possibleCommand == "/id" && user.IsAdmin() { func handleSecretCommand(bc BotController, update tgbotapi.Update, user User) {
log.Printf("THERe")
bc.bot.Send(tgbotapi.NewMessage(update.Message.Chat.ID, strconv.FormatInt(update.Message.Chat.ID, 10)))
} else if possibleCommand == "/secret" && len(args) > 0 && args[0] == bc.cfg.AdminPass {
bc.db.Model(&user).Update("state", "start") bc.db.Model(&user).Update("state", "start")
bc.db.Model(&user).Update("RoleBitmask", user.RoleBitmask|0b11) // set real admin ID (0b1) and effective admin toggle (0b10) bc.db.Model(&user).Update("RoleBitmask", user.RoleBitmask|0b11) // set real admin ID (0b1) and effective admin toggle (0b10)
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "You are admin now!") msg := tgbotapi.NewMessage(update.Message.Chat.ID, "You are admin now!")
bc.bot.Send(msg) bc.bot.Send(msg)
}
} else if possibleCommand == "/panel" && user.IsAdmin() { func handlePanelCommand(bc BotController, update tgbotapi.Update, user User) {
if !user.IsEffectiveAdmin() { if !user.IsEffectiveAdmin() {
bc.db.Model(&user).Update("RoleBitmask", user.RoleBitmask|0b10) bc.db.Model(&user).Update("RoleBitmask", user.RoleBitmask|0b10)
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "You was in usermode, turned back to admin mode...") msg := tgbotapi.NewMessage(update.Message.Chat.ID, "You was in usermode, turned back to admin mode...")
@ -194,49 +250,21 @@ func ProcessUpdate(bc BotController, update tgbotapi.Update) {
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Выберите пункт для изменения") msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Выберите пункт для изменения")
msg.ReplyMarkup = kbd msg.ReplyMarkup = kbd
bc.bot.Send(msg) bc.bot.Send(msg)
}
} else if possibleCommand == "/usermode" && user.IsEffectiveAdmin() { func handleUserModeCommand(bc BotController, update tgbotapi.Update, user User) {
bc.db.Model(&user).Update("RoleBitmask", user.RoleBitmask&(^uint(0b10))) bc.db.Model(&user).Update("RoleBitmask", user.RoleBitmask&(^uint(0b10)))
log.Printf("Set role bitmask (%b) for user: %d", user.RoleBitmask, user.ID) log.Printf("Set role bitmask (%b) for user: %d", user.RoleBitmask, user.ID)
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Simulating user experience!") msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Simulating user experience!")
bc.bot.Send(msg) bc.bot.Send(msg)
} else if user.IsEffectiveAdmin() && user.State != "leaveticket" { }
if user.State != "start" {
if strings.HasPrefix(user.State, "imgset:") { func handleDefaultMessage(bc BotController, update tgbotapi.Update, user User) {
Literal := strings.Split(user.State, ":")[1]
if update.Message.Text == "unset" {
var l BotContent
bc.db.First(&l, "Literal", Literal)
bc.SetBotContent(Literal, "")
}
maxsize := 0
fileid := ""
for _, p := range update.Message.Photo {
if p.FileSize > maxsize {
fileid = p.FileID
maxsize = p.FileSize
}
}
bc.SetBotContent(Literal, fileid)
bc.db.Model(&user).Update("state", "start")
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Succesfully set new image!")
bc.bot.Send(msg)
} else if strings.HasPrefix(user.State, "stringset:") {
Literal := strings.Split(user.State, ":")[1]
bc.SetBotContent(Literal, update.Message.Text)
bc.db.Model(&user).Update("state", "start")
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Succesfully set new text!")
bc.bot.Send(msg)
}
}
} else {
if user.State == "leaveticket" { if user.State == "leaveticket" {
f := update.Message.From f := update.Message.From
ticket := fmt.Sprintf("User: %s %s\nUsername: %s\nText:\n", ticket := fmt.Sprintf("User: %s %s\nUsername: %s\nText:\n",
f.FirstName, f.LastName, f.FirstName, f.LastName,
f.UserName) f.UserName)
// Offset := len(ticket)
// Length := len(update.Message.Text)
ticket += update.Message.Text ticket += update.Message.Text
chatidstr, err := bc.GetBotContentVerbose("supportchatid") chatidstr, err := bc.GetBotContentVerbose("supportchatid")
if err != nil { if err != nil {
@ -265,11 +293,9 @@ func ProcessUpdate(bc BotController, update tgbotapi.Update) {
msg := tgbotapi.NewMessage(update.Message.Chat.ID, bc.GetBotContent("sended_notify")) msg := tgbotapi.NewMessage(update.Message.Chat.ID, bc.GetBotContent("sended_notify"))
bc.bot.Send(msg) bc.bot.Send(msg)
} }
} }
} else if update.CallbackQuery != nil {
var user User func handleLeaveTicketButton(bc BotController, update tgbotapi.Update, user User) {
bc.db.First(&user, "id", update.CallbackQuery.From.ID)
if update.CallbackQuery.Data == "leave_ticket_button" {
chatidstr, err := bc.GetBotContentVerbose("channelid") chatidstr, err := bc.GetBotContentVerbose("channelid")
if err != nil { if err != nil {
var admins []User var admins []User
@ -322,7 +348,9 @@ func ProcessUpdate(bc BotController, update tgbotapi.Update) {
} }
bc.bot.Send(msg) bc.bot.Send(msg)
} }
} else if user.IsEffectiveAdmin() { }
func handleAdminCallback(bc BotController, update tgbotapi.Update, user User) {
if strings.HasPrefix(update.CallbackQuery.Data, "update:") { if strings.HasPrefix(update.CallbackQuery.Data, "update:") {
Label := strings.Split(update.CallbackQuery.Data, ":")[1] Label := strings.Split(update.CallbackQuery.Data, ":")[1]
if Label == "preview_image" { if Label == "preview_image" {
@ -332,9 +360,9 @@ func ProcessUpdate(bc BotController, update tgbotapi.Update) {
} }
bc.bot.Send(tgbotapi.NewMessage(user.ID, "Send me asset (text or picture (NOT as file))")) bc.bot.Send(tgbotapi.NewMessage(user.ID, "Send me asset (text or picture (NOT as file))"))
} }
} }
if user.IsAdmin() {
if update.CallbackQuery.Data == "panel" { func handlePanelCallback(bc BotController, update tgbotapi.Update, user User) {
if !user.IsEffectiveAdmin() { if !user.IsEffectiveAdmin() {
bc.db.Model(&user).Update("RoleBitmask", user.RoleBitmask|0b10) bc.db.Model(&user).Update("RoleBitmask", user.RoleBitmask|0b10)
msg := tgbotapi.NewMessage(user.ID, "You was in usermode, turned back to admin mode...") msg := tgbotapi.NewMessage(user.ID, "You was in usermode, turned back to admin mode...")
@ -354,24 +382,6 @@ func ProcessUpdate(bc BotController, update tgbotapi.Update) {
msg := tgbotapi.NewMessage(user.ID, "Выберите пункт для изменения") msg := tgbotapi.NewMessage(user.ID, "Выберите пункт для изменения")
msg.ReplyMarkup = kbd msg.ReplyMarkup = kbd
bc.bot.Send(msg) bc.bot.Send(msg)
}
}
canswer := tgbotapi.NewCallback(update.CallbackQuery.ID, "")
bc.bot.Send(canswer)
} else if update.ChannelPost != nil { // TODO
post := update.ChannelPost
if post.Text == "setchannelid" {
bc.SetBotContent("channelid", strconv.FormatInt(post.SenderChat.ID, 10))
var admins []User
bc.db.Where("role_bitmask & 1 = ?", 1).Find(&admins)
for _, admin := range admins {
bc.bot.Send(tgbotapi.NewMessage(admin.ID, "ChannelID is set to "+strconv.FormatInt(post.SenderChat.ID, 10)))
delcmd := tgbotapi.NewDeleteMessage(post.SenderChat.ID, post.MessageID)
bc.bot.Send(delcmd)
}
}
}
} }
func DownloadFile(filepath string, url string) error { func DownloadFile(filepath string, url string) error {