60 lines
2.6 KiB
Go
60 lines
2.6 KiB
Go
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 [<code>%d</code>]\n\n<b>Join reason</b>: %s"
|
|
AdminApprovedMsg = "✅ Join #request approved for %s [<code>%d</code>]\n\n<b>Join reason</b>: %s\n<b>Approved by</b>: %s\n<b>Approved at</b>: %s"
|
|
AdminDeclinedMsg = "❌ Join #request declined for %s [<code>%d</code>]\n\n<b>Join reason</b>: %s\n<b>Declined by</b>: %s\n<b>Declined at</b>: %s\n<b>Declined reason</b>: %s"
|
|
AdminFailedMsg = "⚠️ Join #request failed for %s [<code>%d</code>]\n\n<b>Join reason</b>: %s\n<b>Failure reason</b>: %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 <code>/targetchat <chat_id></code> to add the group to the config.\n\nTo set the entry message that users will receive when they request to join, use <code>/setentrymessage <entry_message></code> 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)
|
|
}
|