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:
parent
128ebcbf8c
commit
b8a54944d9
142
cmd/app/main.go
142
cmd/app/main.go
@ -113,8 +113,16 @@ func main() {
|
||||
}
|
||||
|
||||
func ProcessUpdate(bc BotController, update tgbotapi.Update) {
|
||||
|
||||
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 user User
|
||||
@ -127,14 +135,63 @@ func ProcessUpdate(bc BotController, update tgbotapi.Update) {
|
||||
|
||||
bc.db.Model(&user).Update("MsgCounter", user.MsgCounter+1)
|
||||
log.Printf("User[%d] messages: %d", user.ID, user.MsgCounter)
|
||||
|
||||
log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text)
|
||||
|
||||
possibleCommand := strings.Split(update.Message.Text, " ")[0]
|
||||
args := strings.Split(update.Message.Text, " ")[1:]
|
||||
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")
|
||||
kbd := tgbotapi.NewInlineKeyboardMarkup(
|
||||
tgbotapi.NewInlineKeyboardRow(
|
||||
@ -151,10 +208,10 @@ func ProcessUpdate(bc BotController, update tgbotapi.Update) {
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
img, err := bc.GetBotContentVerbose("preview_image")
|
||||
if err != nil || img == "" {
|
||||
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.ReplyMarkup = kbd
|
||||
bc.bot.Send(msg)
|
||||
@ -164,17 +221,16 @@ func ProcessUpdate(bc BotController, update tgbotapi.Update) {
|
||||
msg.ReplyMarkup = kbd
|
||||
bc.bot.Send(msg)
|
||||
}
|
||||
}
|
||||
|
||||
} else if possibleCommand == "/id" && user.IsAdmin() {
|
||||
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 {
|
||||
func handleSecretCommand(bc BotController, update tgbotapi.Update, user User) {
|
||||
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)
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "You are admin now!")
|
||||
bc.bot.Send(msg)
|
||||
}
|
||||
|
||||
} else if possibleCommand == "/panel" && user.IsAdmin() {
|
||||
func handlePanelCommand(bc BotController, update tgbotapi.Update, user User) {
|
||||
if !user.IsEffectiveAdmin() {
|
||||
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...")
|
||||
@ -194,49 +250,21 @@ func ProcessUpdate(bc BotController, update tgbotapi.Update) {
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Выберите пункт для изменения")
|
||||
msg.ReplyMarkup = kbd
|
||||
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)))
|
||||
log.Printf("Set role bitmask (%b) for user: %d", user.RoleBitmask, user.ID)
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Simulating user experience!")
|
||||
bc.bot.Send(msg)
|
||||
} else if user.IsEffectiveAdmin() && user.State != "leaveticket" {
|
||||
if user.State != "start" {
|
||||
if strings.HasPrefix(user.State, "imgset:") {
|
||||
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 {
|
||||
|
||||
func handleDefaultMessage(bc BotController, update tgbotapi.Update, user User) {
|
||||
if user.State == "leaveticket" {
|
||||
f := update.Message.From
|
||||
ticket := fmt.Sprintf("User: %s %s\nUsername: %s\nText:\n",
|
||||
f.FirstName, f.LastName,
|
||||
f.UserName)
|
||||
// Offset := len(ticket)
|
||||
// Length := len(update.Message.Text)
|
||||
ticket += update.Message.Text
|
||||
chatidstr, err := bc.GetBotContentVerbose("supportchatid")
|
||||
if err != nil {
|
||||
@ -266,10 +294,8 @@ func ProcessUpdate(bc BotController, update tgbotapi.Update) {
|
||||
bc.bot.Send(msg)
|
||||
}
|
||||
}
|
||||
} else if update.CallbackQuery != nil {
|
||||
var user User
|
||||
bc.db.First(&user, "id", update.CallbackQuery.From.ID)
|
||||
if update.CallbackQuery.Data == "leave_ticket_button" {
|
||||
|
||||
func handleLeaveTicketButton(bc BotController, update tgbotapi.Update, user User) {
|
||||
chatidstr, err := bc.GetBotContentVerbose("channelid")
|
||||
if err != nil {
|
||||
var admins []User
|
||||
@ -322,7 +348,9 @@ func ProcessUpdate(bc BotController, update tgbotapi.Update) {
|
||||
}
|
||||
bc.bot.Send(msg)
|
||||
}
|
||||
} else if user.IsEffectiveAdmin() {
|
||||
}
|
||||
|
||||
func handleAdminCallback(bc BotController, update tgbotapi.Update, user User) {
|
||||
if strings.HasPrefix(update.CallbackQuery.Data, "update:") {
|
||||
Label := strings.Split(update.CallbackQuery.Data, ":")[1]
|
||||
if Label == "preview_image" {
|
||||
@ -333,8 +361,8 @@ func ProcessUpdate(bc BotController, update tgbotapi.Update) {
|
||||
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() {
|
||||
bc.db.Model(&user).Update("RoleBitmask", user.RoleBitmask|0b10)
|
||||
msg := tgbotapi.NewMessage(user.ID, "You was in usermode, turned back to admin mode...")
|
||||
@ -355,24 +383,6 @@ func ProcessUpdate(bc BotController, update tgbotapi.Update) {
|
||||
msg.ReplyMarkup = kbd
|
||||
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 {
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user