Add PostgreSQL, user/squad management, remove private domains from docs
This commit is contained in:
+51
-15
@@ -8,6 +8,7 @@ import (
|
||||
"time"
|
||||
|
||||
"telegramvpn/internal/config"
|
||||
"telegramvpn/internal/db"
|
||||
"telegramvpn/internal/remnawave"
|
||||
|
||||
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
|
||||
@@ -16,18 +17,20 @@ import (
|
||||
const docsURL = "https://docs.rw/"
|
||||
|
||||
type Handler struct {
|
||||
cfg *config.Config
|
||||
api *tgbotapi.BotAPI
|
||||
panel *remnawave.Client
|
||||
admin int64
|
||||
cfg *config.Config
|
||||
api *tgbotapi.BotAPI
|
||||
panel *remnawave.Client
|
||||
database *db.DB
|
||||
admin int64
|
||||
}
|
||||
|
||||
func NewHandler(cfg *config.Config, api *tgbotapi.BotAPI) *Handler {
|
||||
func NewHandler(cfg *config.Config, api *tgbotapi.BotAPI, database *db.DB) *Handler {
|
||||
return &Handler{
|
||||
cfg: cfg,
|
||||
api: api,
|
||||
panel: remnawave.NewClient(cfg.RemnawavePanelURL, cfg.RemnawaveAPIToken, cfg.CaddyAuthAPIToken),
|
||||
admin: cfg.TelegramAdminID,
|
||||
cfg: cfg,
|
||||
api: api,
|
||||
panel: remnawave.NewClient(cfg.RemnawavePanelURL, cfg.RemnawaveAPIToken, cfg.CaddyAuthAPIToken),
|
||||
database: database,
|
||||
admin: cfg.TelegramAdminID,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,12 +64,15 @@ func (h *Handler) HandleUpdate(update tgbotapi.Update) {
|
||||
|
||||
switch {
|
||||
case text == "/start":
|
||||
h.sendStart(chatID, userID, update.Message.From.FirstName)
|
||||
h.sendStart(chatID, userID, update.Message.From.FirstName, update.Message.From.UserName)
|
||||
case strings.HasPrefix(text, "/admin"):
|
||||
h.handleAdminCommand(chatID, userID, text)
|
||||
case strings.HasPrefix(text, "/"):
|
||||
h.sendText(chatID, "Неизвестная команда. Для начала — /start")
|
||||
default:
|
||||
if h.isAdmin(userID) && h.handleWizardMessage(chatID, userID, text) {
|
||||
return
|
||||
}
|
||||
if h.isAdmin(userID) {
|
||||
switch text {
|
||||
case "📋 Конфиг панели":
|
||||
@@ -75,6 +81,12 @@ func (h *Handler) HandleUpdate(update tgbotapi.Update) {
|
||||
case "🔌 Проверить панель":
|
||||
h.sendPanelCheck(chatID)
|
||||
return
|
||||
case "👤 Создать пользователя":
|
||||
h.startUserWizard(chatID, userID)
|
||||
return
|
||||
case "📡 Сквады":
|
||||
h.sendSquadsList(chatID)
|
||||
return
|
||||
case "◀️ Выйти из админки":
|
||||
h.sendText(chatID, "Админ-меню закрыто. /admin — снова открыть.")
|
||||
return
|
||||
@@ -101,6 +113,8 @@ func (h *Handler) handleAdminCommand(chatID, userID int64, text string) {
|
||||
h.sendPanelCheck(chatID)
|
||||
case "config", "конфиг":
|
||||
h.sendPanelConfig(chatID)
|
||||
case "user", "пользователь", "squads", "сквады", "assign", "сквад", "cancel", "отмена", "help":
|
||||
h.handleAdminUsersSubcommand(chatID, userID, args[2:])
|
||||
default:
|
||||
h.sendAdminHelp(chatID)
|
||||
}
|
||||
@@ -117,7 +131,15 @@ func (h *Handler) handleCallback(cq *tgbotapi.CallbackQuery) {
|
||||
return
|
||||
}
|
||||
|
||||
if h.handleWizardCallback(cq) {
|
||||
return
|
||||
}
|
||||
|
||||
switch cq.Data {
|
||||
case "admin:user":
|
||||
h.startUserWizard(cq.Message.Chat.ID, cq.From.ID)
|
||||
case "admin:squads":
|
||||
h.sendSquadsList(cq.Message.Chat.ID)
|
||||
case "admin:config":
|
||||
h.sendPanelConfig(cq.Message.Chat.ID)
|
||||
case "admin:check":
|
||||
@@ -133,14 +155,17 @@ func (h *Handler) isAdmin(userID int64) bool {
|
||||
return userID == h.admin
|
||||
}
|
||||
|
||||
func (h *Handler) sendStart(chatID, userID int64, firstName string) {
|
||||
func (h *Handler) sendStart(chatID, userID int64, firstName, tgUsername string) {
|
||||
ctx := context.Background()
|
||||
_ = h.database.UpsertTelegramUser(ctx, userID, tgUsername, firstName)
|
||||
|
||||
name := firstName
|
||||
if name == "" {
|
||||
name = "друг"
|
||||
}
|
||||
text := fmt.Sprintf("Привет, %s!\n\nЯ VPN-бот на базе панели Remnawave.", name)
|
||||
if h.isAdmin(userID) {
|
||||
text += "\n\n/admin — админ-меню\n/admin check — проверка API и подписки"
|
||||
text += "\n\n/admin — админ-меню\n/admin user — создать пользователя\n/admin squads — сквады"
|
||||
}
|
||||
msg := tgbotapi.NewMessage(chatID, text)
|
||||
if h.isAdmin(userID) {
|
||||
@@ -155,7 +180,10 @@ func (h *Handler) sendAdminMenu(chatID int64) {
|
||||
"Команды:\n"+
|
||||
"• /admin — это меню\n"+
|
||||
"• /admin check — проверка панели, API и подписки\n"+
|
||||
"• /admin config — конфиг панели\n\n"+
|
||||
"• /admin config — конфиг панели\n"+
|
||||
"• /admin user — создать пользователя\n"+
|
||||
"• /admin squads — список сквадов\n"+
|
||||
"• /admin assign <логин> — назначить сквады\n\n"+
|
||||
"Или кнопки ниже.",
|
||||
escapeMarkdown(h.cfg.RemnawaveName),
|
||||
)
|
||||
@@ -166,7 +194,7 @@ func (h *Handler) sendAdminMenu(chatID int64) {
|
||||
}
|
||||
|
||||
func (h *Handler) sendAdminHelp(chatID int64) {
|
||||
h.sendText(chatID, "Неизвестный аргумент.\n\n/admin — меню\n/admin check — проверка\n/admin config — конфиг")
|
||||
h.sendText(chatID, "Команды:\n/admin — меню\n/admin check\n/admin config\n/admin user\n/admin squads\n/admin assign <логин>")
|
||||
}
|
||||
|
||||
func (h *Handler) sendPanelConfig(chatID int64) {
|
||||
@@ -219,7 +247,11 @@ func (h *Handler) sendPanelCheck(chatID int64) {
|
||||
func adminInlineKeyboard() tgbotapi.InlineKeyboardMarkup {
|
||||
return tgbotapi.NewInlineKeyboardMarkup(
|
||||
tgbotapi.NewInlineKeyboardRow(
|
||||
tgbotapi.NewInlineKeyboardButtonData("🔌 Проверить (API+подписка)", "admin:check"),
|
||||
tgbotapi.NewInlineKeyboardButtonData("👤 Создать пользователя", "admin:user"),
|
||||
tgbotapi.NewInlineKeyboardButtonData("📡 Сквады", "admin:squads"),
|
||||
),
|
||||
tgbotapi.NewInlineKeyboardRow(
|
||||
tgbotapi.NewInlineKeyboardButtonData("🔌 Проверить", "admin:check"),
|
||||
tgbotapi.NewInlineKeyboardButtonData("📋 Конфиг", "admin:config"),
|
||||
),
|
||||
tgbotapi.NewInlineKeyboardRow(
|
||||
@@ -231,6 +263,10 @@ func adminInlineKeyboard() tgbotapi.InlineKeyboardMarkup {
|
||||
func adminReplyKeyboard() tgbotapi.ReplyKeyboardMarkup {
|
||||
return tgbotapi.ReplyKeyboardMarkup{
|
||||
Keyboard: [][]tgbotapi.KeyboardButton{
|
||||
{
|
||||
tgbotapi.NewKeyboardButton("👤 Создать пользователя"),
|
||||
tgbotapi.NewKeyboardButton("📡 Сквады"),
|
||||
},
|
||||
{
|
||||
tgbotapi.NewKeyboardButton("🔌 Проверить панель"),
|
||||
tgbotapi.NewKeyboardButton("📋 Конфиг панели"),
|
||||
|
||||
Reference in New Issue
Block a user