package handlers import ( "sync" config "git.zio.sh/astra/telegram-approval-join/config" api "github.com/OvyFlash/telegram-bot-api" ) const ( AdminJoinRequestMsg = "New join #request from %s [%d]\n\nJoin reason: %s" AdminApprovedMsg = "✅ Join #request approved for %s [%d]\n\nJoin reason: %s\nApproved by: %s\nApproved at: %s" AdminDeclinedMsg = "❌ Join #request declined for %s [%d]\n\nJoin reason: %s\nDeclined by: %s\nDeclined at: %s\nDeclined reason: %s" AdminFailedMsg = "⚠️ Join #request failed for %s [%d]\n\nJoin reason: %s\nFailure reason: %s" BotApprovalEnabled = "Join approval bot enabled, to get started, add the bot to the target group and make it an admin with invite permissions, then use /targetchat <chat_id> to add the group to the config.\n\nTo set the entry message that users will receive when they request to join, use /setentrymessage <entry_message> in the admin chat. You can use HTML formatting in the entry message." BotAddedToGroup = "Hello! I help out with join approvals.\n\nTo get started, make sure this bot is added to the admin group where it will send join approvals to be accepted or declined, then type /request when you have done that." BotRequestMsg = "You have requested this chat to be the admin chat, please wait for it to be activated." ) // Types shared by handler files type ExtendedChatJoinRequest struct { *api.ChatJoinRequest JoinReason string JoinRequestMessageID int } type Bot struct { API *api.BotAPI Config config.Config mu sync.RWMutex WaitingForApproval map[int64]*ExtendedChatJoinRequest } // GetPendingUser retrieves a pending user request (read-safe). func (bot *Bot) GetPendingUser(userID int64) *ExtendedChatJoinRequest { bot.mu.RLock() defer bot.mu.RUnlock() user := bot.WaitingForApproval[userID] if user == nil { return nil } return user } // SetPendingUser stores a pending user request (write-safe). func (bot *Bot) SetPendingUser(userID int64, user *ExtendedChatJoinRequest) { bot.mu.Lock() defer bot.mu.Unlock() if _, ok := bot.WaitingForApproval[userID]; !ok { bot.WaitingForApproval = make(map[int64]*ExtendedChatJoinRequest) } bot.WaitingForApproval[userID] = user } // DeletePendingUser removes a pending user request (write-safe). func (bot *Bot) DeletePendingUser(userID int64) { bot.mu.Lock() defer bot.mu.Unlock() delete(bot.WaitingForApproval, userID) }