From 03c5ec07c17430a5dddf84736e3007f289b3b1a1 Mon Sep 17 00:00:00 2001 From: Astra Date: Mon, 16 Feb 2026 17:40:56 +0000 Subject: [PATCH] COde updates --- config/config.go | 15 ++++++ handlers/admin.go | 104 ++++++++++++++++++++++++++++++++++++++++++ handlers/callbacks.go | 2 +- main.go | 7 ++- 4 files changed, 125 insertions(+), 3 deletions(-) create mode 100644 handlers/admin.go diff --git a/config/config.go b/config/config.go index 83d04c2..256eb98 100644 --- a/config/config.go +++ b/config/config.go @@ -14,6 +14,7 @@ type Config struct { TargetChatId *int64 `yaml:"target_chat_id"` EntryMessage string `yaml:"entry_message"` ApprovalMessage string `yaml:"approval_message"` + SendApprovalMessage bool `yaml:"send_approval_message"` DeleteRequestAfterDecision bool `yaml:"delete_request_after_decision"` } @@ -44,6 +45,7 @@ func (c *Config) CreateConfig() error { TargetChatId: Int64Ptr(0), EntryMessage: "You have requested to join the group, please write a brief message explaining why you want to join.", ApprovalMessage: "", + SendApprovalMessage: false, DeleteRequestAfterDecision: false, } @@ -52,6 +54,19 @@ func (c *Config) CreateConfig() error { return err } +// SaveConfig writes the current Config back to config.yaml, overwriting the file. +func (c *Config) SaveConfig() error { + f, err := os.OpenFile("config.yaml", os.O_WRONLY|os.O_TRUNC, 0644) + if err != nil { + return err + } + defer f.Close() + + encoder := yaml.NewEncoder(f) + err = encoder.Encode(c) + return err +} + // StringPtr returns a pointer to the given string. func StringPtr(s string) *string { return &s } diff --git a/handlers/admin.go b/handlers/admin.go new file mode 100644 index 0000000..e0a6bea --- /dev/null +++ b/handlers/admin.go @@ -0,0 +1,104 @@ +package handlers + +import ( + "fmt" + "log" + "strings" + + utils "git.zio.sh/astra/telegram-approval-join/pkg/utils" + api "github.com/OvyFlash/telegram-bot-api" +) + +func (bot *Bot) HandleAdminCommands(update *api.Update) { + switch update.Message.Command() { + case "setentrymessage": + if update.Message.CommandArguments() == "" { + utils.SendMessage(bot.API, update.Message.Chat.ID, update.Message.MessageThreadID, + "Usage: /setentrymessage ") + return + } + + _, e := utils.SendMessage(bot.API, bot.API.Self.ID, 0, update.Message.CommandArguments()) + if e != nil { + if strings.HasPrefix(e.Error(), "Bad Request:") { + utils.SendMessage(bot.API, update.Message.Chat.ID, update.Message.MessageThreadID, + fmt.Sprintf("Unable to set entry message: %s", e)) + return + } + } + + bot.Config.EntryMessage = update.Message.CommandArguments() + if err := bot.Config.SaveConfig(); err != nil { + log.Printf("Failed to save config: %v", err) + } + utils.SendMessage(bot.API, update.Message.Chat.ID, update.Message.MessageThreadID, + "Entry message updated.") + + case "setadmintopic": + if update.Message.CommandArguments() == "" { + utils.SendMessage(bot.API, update.Message.Chat.ID, update.Message.MessageThreadID, + "Usage: /setadmintopic <topic_id/0>") + return + } + + topicID, errMsg := utils.ParseIntArg(update.Message.CommandArguments()) + if errMsg != "" { + utils.SendMessage(bot.API, update.Message.Chat.ID, update.Message.MessageThreadID, + "Invalid topic ID") + return + } + + bot.Config.AdminChatTopicId = &topicID + if err := bot.Config.SaveConfig(); err != nil { + log.Printf("Failed to save config: %v", err) + } + utils.SendMessage(bot.API, update.Message.Chat.ID, topicID, + fmt.Sprintf("Topic ID for admin chat %d set to %d\n", + update.Message.Chat.ID, topicID)) + + case "togglesendapproval": + if bot.Config.ApprovalMessage != "" { + switch bot.Config.SendApprovalMessage { + case true: + bot.Config.SendApprovalMessage = false + case false: + bot.Config.SendApprovalMessage = true + } + if err := bot.Config.SaveConfig(); err != nil { + log.Printf("Failed to save config: %v", err) + } + utils.SendMessage(bot.API, update.Message.Chat.ID, update.Message.MessageThreadID, + fmt.Sprintf("Send approval message: %v", bot.Config.SendApprovalMessage)) + } else { + utils.SendMessage(bot.API, update.Message.Chat.ID, update.Message.MessageThreadID, + "Please set an approval message with /setapprovalmessage") + } + + case "setapprovalmessage": + if update.Message.CommandArguments() == "" { + utils.SendMessage(bot.API, update.Message.Chat.ID, update.Message.MessageThreadID, + "Usage: /setapprovalmessage <message>") + return + } + + bot.Config.ApprovalMessage = update.Message.CommandArguments() + if err := bot.Config.SaveConfig(); err != nil { + log.Printf("Failed to save config: %v", err) + } + utils.SendMessage(bot.API, update.Message.Chat.ID, update.Message.MessageThreadID, + "Approval message set.") + + case "info": + targetChatID := "not set" + if *bot.Config.TargetChatId != 0 { + targetChatID = fmt.Sprintf("%d", *bot.Config.TargetChatId) + } + infoMsg := fmt.Sprintf("%s\n%s\n%s\n%s\n%s", + fmt.Sprintf("Admin Chat ID: %d", update.Message.Chat.ID), + fmt.Sprintf("Admin Topic ID: %d", *bot.Config.AdminChatTopicId), + fmt.Sprintf("Target Chat ID: %s", targetChatID), + fmt.Sprintf("Entry Message: %s", utils.EscapeHTML(bot.Config.EntryMessage)), + fmt.Sprintf("Approval Message: %s", bot.Config.ApprovalMessage)) + utils.SendMessage(bot.API, update.Message.Chat.ID, update.Message.MessageThreadID, infoMsg) + } +} diff --git a/handlers/callbacks.go b/handlers/callbacks.go index 85553c4..3327b50 100644 --- a/handlers/callbacks.go +++ b/handlers/callbacks.go @@ -91,7 +91,7 @@ func (bot *Bot) handleApproveRequest(query *api.CallbackQuery, user *ExtendedCha userString, user.From.ID, user.JoinReason, adminUserString, time.Now().Format("2006-01-02 15:04:05"))) - if bot.Config.ApprovalMessage != "" { + if bot.Config.SendApprovalMessage { utils.SendMessage(bot.API, user.From.ID, 0, bot.Config.ApprovalMessage) } diff --git a/main.go b/main.go index e39ff3f..5246861 100644 --- a/main.go +++ b/main.go @@ -56,8 +56,11 @@ func main() { } } - if update.Message.Chat.ID == *b.Config.AdminChatId && update.Message.ReplyToMessage != nil { - b.HandleDeclineReason(&update) + if update.Message.Chat.ID == *b.Config.AdminChatId { + if update.Message.ReplyToMessage != nil { + b.HandleDeclineReason(&update) + } + b.HandleAdminCommands(&update) } } }