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
148
cmd/app/main.go
148
cmd/app/main.go
@ -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 {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user