diff --git a/cmd/app/main.go b/cmd/app/main.go index f80c3b0..00bf1cf 100644 --- a/cmd/app/main.go +++ b/cmd/app/main.go @@ -113,267 +113,277 @@ func main() { } func ProcessUpdate(bc BotController, update tgbotapi.Update) { - if update.Message != nil { - var UserID = update.Message.From.ID - - var user User - bc.db.First(&user, "id", UserID) - if user == (User{}) { - log.Printf("New user: [%d]", UserID) - user = User{ID: UserID, State: "start"} - bc.db.Create(&user) - } - - 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" { - bc.db.Model(&user).Update("state", "start") - kbd := tgbotapi.NewInlineKeyboardMarkup( - tgbotapi.NewInlineKeyboardRow( - tgbotapi.NewInlineKeyboardButtonData(bc.GetBotContent("leave_ticket_button"), "leave_ticket_button"), - ), - ) - if user.IsAdmin() { - kbd = tgbotapi.NewInlineKeyboardMarkup( - tgbotapi.NewInlineKeyboardRow( - tgbotapi.NewInlineKeyboardButtonData(bc.GetBotContent("leave_ticket_button"), "leave_ticket_button"), - ), - tgbotapi.NewInlineKeyboardRow( - tgbotapi.NewInlineKeyboardButtonData("Panel", "panel"), - ), - ) - } - 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) - } else { - msg := tgbotapi.NewPhoto(update.Message.Chat.ID, tgbotapi.FileID(img)) - msg.Caption = bc.GetBotContent("start") - 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 { - 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() { - 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...") - bc.bot.Send(msg) - } - kbd := tgbotapi.NewInlineKeyboardMarkup( - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Стартовая картинка", "update:preview_image")), - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Приветственный текст", "update:start")), - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Кнопка для заявки", "update:leave_ticket_button")), - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("ID чата", "update:supportchatid")), - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("ID канала", "update:channelid")), - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Уведомление об отправке тикета", "update:sended_notify")), - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Просьба оставить тикет", "update:leaveticket_message")), - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Просьба подписаться на канал", "update:subscribe_message")), - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Ссылка на канал", "update:channel_link")), - ) - msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Выберите пункт для изменения") - msg.ReplyMarkup = kbd - bc.bot.Send(msg) - - } else if possibleCommand == "/usermode" && user.IsEffectiveAdmin() { - 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 { - 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 { - var admins []User - bc.db.Where("role_bitmask & 1 = ?", 1).Find(&admins) - for _, admin := range admins { - msg := tgbotapi.NewMessage(admin.ID, "Support ChatID is not set!!!") - msg.Entities = []tgbotapi.MessageEntity{tgbotapi.MessageEntity{ - Type: "code", - Offset: 1, - Length: 2, - }} - bc.bot.Send(msg) - } - } - chatid, _ := strconv.ParseInt(chatidstr, 10, 64) - _, err = bc.bot.Send(tgbotapi.NewMessage(chatid, ticket)) - - if err != nil { - msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Something went wrong, try again...") - bc.bot.Send(msg) - return - } - - bc.db.Model(&user).Update("state", "start") - msg := tgbotapi.NewMessage(update.Message.Chat.ID, bc.GetBotContent("sended_notify")) - bc.bot.Send(msg) - } - } + handleMessage(bc, update) } else if update.CallbackQuery != nil { - var user User - bc.db.First(&user, "id", update.CallbackQuery.From.ID) - if update.CallbackQuery.Data == "leave_ticket_button" { - chatidstr, err := bc.GetBotContentVerbose("channelid") - if err != nil { - 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 not set!!!")) - } - } - chatid, _ := strconv.ParseInt(chatidstr, 10, 64) + handleCallbackQuery(bc, update) + } else if update.ChannelPost != nil { + handleChannelPost(bc, update) + } +} - member, err := bc.bot.GetChatMember(tgbotapi.GetChatMemberConfig{ - ChatConfigWithUser: tgbotapi.ChatConfigWithUser{ - UserID: update.CallbackQuery.From.ID, - SuperGroupUsername: chatidstr, - ChatID: chatid, - }, - }) - if err != nil { - if strings.Contains(err.Error(), "chat not found") { - bc.bot.Send(tgbotapi.NewMessage(user.ID, "No channel ID is set!!!")) - } - } - log.Printf("M: %s, E: %s", member, err) - s := member.Status - if s == "member" || s == "creator" || s == "admin" { - bc.db.Model(&user).Update("state", "leaveticket") - bc.bot.Send(tgbotapi.NewMessage(user.ID, bc.GetBotContent("leaveticket_message"))) - } else { - link, err := bc.GetBotContentVerbose("channel_link") - msg := tgbotapi.NewMessage(user.ID, bc.GetBotContent("subscribe_message")) - if err == nil { - kbd := tgbotapi.NewInlineKeyboardMarkup( - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonURL("Канал", link)), - ) - msg.ReplyMarkup = kbd - } - if err != nil { - log.Printf("NO LINK!!!") - var admins []User - bc.db.Where("role_bitmask & 1 = ?", 1).Find(&admins) - for _, admin := range admins { - msg := tgbotapi.NewMessage(admin.ID, "Channel link is not set!!!") - msg.Entities = []tgbotapi.MessageEntity{tgbotapi.MessageEntity{ - Type: "code", - Offset: 1, - Length: 2, - }} - bc.bot.Send(msg) - } - } - bc.bot.Send(msg) - } - } else if user.IsEffectiveAdmin() { - if strings.HasPrefix(update.CallbackQuery.Data, "update:") { - Label := strings.Split(update.CallbackQuery.Data, ":")[1] - if Label == "preview_image" { - bc.db.Model(&user).Update("state", "imgset:"+Label) - } else { - bc.db.Model(&user).Update("state", "stringset:"+Label) - } - bc.bot.Send(tgbotapi.NewMessage(user.ID, "Send me asset (text or picture (NOT as file))")) - } - } - if user.IsAdmin() { - if update.CallbackQuery.Data == "panel" { - 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...") - bc.bot.Send(msg) - } - kbd := tgbotapi.NewInlineKeyboardMarkup( - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Стартовая картинка", "update:preview_image")), - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Приветственный текст", "update:start")), - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Кнопка для заявки", "update:leave_ticket_button")), - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("ID чата", "update:supportchatid")), - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("ID канала", "update:channelid")), - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Уведомление об отправке тикета", "update:sended_notify")), - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Просьба оставить тикет", "update:leaveticket_message")), - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Просьба подписаться на канал", "update:subscribe_message")), - tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Ссылка на канал", "update:channel_link")), - ) - msg := tgbotapi.NewMessage(user.ID, "Выберите пункт для изменения") - 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)) +func handleMessage(bc BotController, update tgbotapi.Update) { + var UserID = update.Message.From.ID + var user User + bc.db.First(&user, "id", UserID) + if user == (User{}) { + log.Printf("New user: [%d]", UserID) + user = User{ID: UserID, State: "start"} + bc.db.Create(&user) + } + + 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) + + 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( + tgbotapi.NewInlineKeyboardButtonData(bc.GetBotContent("leave_ticket_button"), "leave_ticket_button"), + ), + ) + if user.IsAdmin() { + kbd = tgbotapi.NewInlineKeyboardMarkup( + tgbotapi.NewInlineKeyboardRow( + tgbotapi.NewInlineKeyboardButtonData(bc.GetBotContent("leave_ticket_button"), "leave_ticket_button"), + ), + tgbotapi.NewInlineKeyboardRow( + tgbotapi.NewInlineKeyboardButtonData("Panel", "panel"), + ), + ) + } + + img, err := bc.GetBotContentVerbose("preview_image") + if err != nil || img == "" { + msg := tgbotapi.NewMessage(update.Message.Chat.ID, bc.GetBotContent("start")) + msg.ParseMode = "markdown" + msg.ReplyMarkup = kbd + bc.bot.Send(msg) + } else { + msg := tgbotapi.NewPhoto(update.Message.Chat.ID, tgbotapi.FileID(img)) + msg.Caption = bc.GetBotContent("start") + msg.ReplyMarkup = kbd + bc.bot.Send(msg) + } +} + +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) +} + +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...") + bc.bot.Send(msg) + } + kbd := tgbotapi.NewInlineKeyboardMarkup( + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Стартовая картинка", "update:preview_image")), + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Приветственный текст", "update:start")), + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Кнопка для заявки", "update:leave_ticket_button")), + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("ID чата", "update:supportchatid")), + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("ID канала", "update:channelid")), + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Уведомление об отправке тикета", "update:sended_notify")), + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Просьба оставить тикет", "update:leaveticket_message")), + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Просьба подписаться на канал", "update:subscribe_message")), + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Ссылка на канал", "update:channel_link")), + ) + msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Выберите пункт для изменения") + msg.ReplyMarkup = kbd + bc.bot.Send(msg) +} + +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) +} + +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) + ticket += update.Message.Text + chatidstr, err := bc.GetBotContentVerbose("supportchatid") + if err != nil { 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) + msg := tgbotapi.NewMessage(admin.ID, "Support ChatID is not set!!!") + msg.Entities = []tgbotapi.MessageEntity{tgbotapi.MessageEntity{ + Type: "code", + Offset: 1, + Length: 2, + }} + bc.bot.Send(msg) } } + chatid, _ := strconv.ParseInt(chatidstr, 10, 64) + _, err = bc.bot.Send(tgbotapi.NewMessage(chatid, ticket)) + + if err != nil { + msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Something went wrong, try again...") + bc.bot.Send(msg) + return + } + + bc.db.Model(&user).Update("state", "start") + msg := tgbotapi.NewMessage(update.Message.Chat.ID, bc.GetBotContent("sended_notify")) + bc.bot.Send(msg) } } +func handleLeaveTicketButton(bc BotController, update tgbotapi.Update, user User) { + chatidstr, err := bc.GetBotContentVerbose("channelid") + if err != nil { + 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 not set!!!")) + } + } + chatid, _ := strconv.ParseInt(chatidstr, 10, 64) + + member, err := bc.bot.GetChatMember(tgbotapi.GetChatMemberConfig{ + ChatConfigWithUser: tgbotapi.ChatConfigWithUser{ + UserID: update.CallbackQuery.From.ID, + SuperGroupUsername: chatidstr, + ChatID: chatid, + }, + }) + if err != nil { + if strings.Contains(err.Error(), "chat not found") { + bc.bot.Send(tgbotapi.NewMessage(user.ID, "No channel ID is set!!!")) + } + } + log.Printf("M: %s, E: %s", member, err) + s := member.Status + if s == "member" || s == "creator" || s == "admin" { + bc.db.Model(&user).Update("state", "leaveticket") + bc.bot.Send(tgbotapi.NewMessage(user.ID, bc.GetBotContent("leaveticket_message"))) + } else { + link, err := bc.GetBotContentVerbose("channel_link") + msg := tgbotapi.NewMessage(user.ID, bc.GetBotContent("subscribe_message")) + if err == nil { + kbd := tgbotapi.NewInlineKeyboardMarkup( + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonURL("Канал", link)), + ) + msg.ReplyMarkup = kbd + } + if err != nil { + log.Printf("NO LINK!!!") + var admins []User + bc.db.Where("role_bitmask & 1 = ?", 1).Find(&admins) + for _, admin := range admins { + msg := tgbotapi.NewMessage(admin.ID, "Channel link is not set!!!") + msg.Entities = []tgbotapi.MessageEntity{tgbotapi.MessageEntity{ + Type: "code", + Offset: 1, + Length: 2, + }} + bc.bot.Send(msg) + } + } + bc.bot.Send(msg) + } +} + +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" { + bc.db.Model(&user).Update("state", "imgset:"+Label) + } else { + bc.db.Model(&user).Update("state", "stringset:"+Label) + } + bc.bot.Send(tgbotapi.NewMessage(user.ID, "Send me asset (text or picture (NOT as file))")) + } +} + +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...") + bc.bot.Send(msg) + } + kbd := tgbotapi.NewInlineKeyboardMarkup( + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Стартовая картинка", "update:preview_image")), + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Приветственный текст", "update:start")), + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Кнопка для заявки", "update:leave_ticket_button")), + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("ID чата", "update:supportchatid")), + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("ID канала", "update:channelid")), + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Уведомление об отправке тикета", "update:sended_notify")), + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Просьба оставить тикет", "update:leaveticket_message")), + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Просьба подписаться на канал", "update:subscribe_message")), + tgbotapi.NewInlineKeyboardRow(tgbotapi.NewInlineKeyboardButtonData("Ссылка на канал", "update:channel_link")), + ) + msg := tgbotapi.NewMessage(user.ID, "Выберите пункт для изменения") + msg.ReplyMarkup = kbd + bc.bot.Send(msg) +} + func DownloadFile(filepath string, url string) error { // Get the data