-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathmain.go
More file actions
148 lines (127 loc) · 3.74 KB
/
main.go
File metadata and controls
148 lines (127 loc) · 3.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package main
import (
"fmt"
"log"
"net/http"
"os"
"time"
"github.com/PaulSonOfLars/gotgbot/v2"
"github.com/PaulSonOfLars/gotgbot/v2/ext"
"telkomsel-bot/bot"
"telkomsel-bot/cli"
"telkomsel-bot/config"
"telkomsel-bot/mcp"
"telkomsel-bot/model"
"telkomsel-bot/otp"
"telkomsel-bot/util"
)
func main() {
log.SetFlags(log.LstdFlags | log.Lshortfile)
if len(os.Args) < 2 {
printHelp()
os.Exit(0)
}
mode := os.Args[1]
switch mode {
case "--bot":
runBot()
case "--cli":
cli.Run()
case "--mcp":
mcp.Run()
case "--version", "-v":
fmt.Printf("telbot %s\n", util.GetVersion())
case "--help", "-h":
printHelp()
default:
fmt.Printf("❌ Unknown flag: %s\n\n", mode)
printHelp()
os.Exit(1)
}
}
func printHelp() {
fmt.Println("╔══════════════════════════════════╗")
fmt.Printf("║ Telbot %-17s║\n", util.GetVersion())
fmt.Println("╚══════════════════════════════════╝")
fmt.Println()
fmt.Println("Usage:")
fmt.Println(" telbot <mode> [options]")
fmt.Println()
fmt.Println("Modes:")
fmt.Println(" --bot Run as Telegram bot")
fmt.Println(" --cli Run in interactive CLI mode")
fmt.Println(" --mcp Run as MCP server")
fmt.Println(" --help, -h Show this help")
fmt.Println()
fmt.Println("Options (bot mode):")
fmt.Println(" --verbose Enable debug logging")
fmt.Println()
fmt.Println("Environment variables:")
fmt.Println(" TELKOMSEL_BOT_TOKEN Telegram bot token (required for --bot)")
fmt.Println(" TELEGRAM_ADMIN_ID Telegram admin user ID (required for --bot)")
fmt.Println(" OTP_WEBHOOK_PORT Port for OTP webhook receiver (optional, e.g., 8080)")
fmt.Println(" OTP_WEBHOOK_SECRET Secret token to verify webhook payloads (optional)")
}
func runBot() {
verbose := false
for _, arg := range os.Args[2:] {
if arg == "--verbose" {
verbose = true
}
}
config.Verbose = verbose
log.Println("🚀 Starting Telbot (gotgbot)...")
if config.Verbose {
log.Println("🐛 Verbose mode enabled")
}
cfg := config.Load()
b, err := gotgbot.NewBot(cfg.BotToken, &gotgbot.BotOpts{
BotClient: &gotgbot.BaseBotClient{
Client: http.Client{},
DefaultRequestOpts: &gotgbot.RequestOpts{
Timeout: gotgbot.DefaultTimeout,
APIURL: gotgbot.DefaultAPIURL,
},
},
})
if err != nil {
log.Fatalf("❌ Failed to create bot: %v", err)
}
log.Printf("✅ Bot authenticated as @%s", b.User.Username)
dispatcher := ext.NewDispatcher(&ext.DispatcherOpts{
Error: func(b *gotgbot.Bot, ctx *ext.Context, err error) ext.DispatcherAction {
log.Printf("❌ Dispatcher error: %v", err)
return ext.DispatcherActionNoop
},
MaxRoutines: ext.DefaultMaxRoutines,
})
updater := ext.NewUpdater(dispatcher, nil)
sessions := model.NewSessionManager(config.GetSessionPath())
var otpListener *otp.Listener
if cfg.OTPWebhookPort > 0 {
otpListener = otp.NewListener(cfg.OTPWebhookPort, cfg.OTPWebhookSecret)
if err := otpListener.Start(); err != nil {
log.Printf("Failed to start OTP webhook listener: %v", err)
} else {
log.Printf("OTP webhook listener started on :%d", cfg.OTPWebhookPort)
}
}
handler := bot.NewHandler(b, sessions, cfg.AdminID, otpListener)
handler.Register(dispatcher)
handler.ValidateSessions()
log.Println("📡 Bot is now polling for messages...")
err = updater.StartPolling(b, &ext.PollingOpts{
DropPendingUpdates: true,
GetUpdatesOpts: &gotgbot.GetUpdatesOpts{
Timeout: 9,
RequestOpts: &gotgbot.RequestOpts{
Timeout: time.Second * 10,
},
},
})
if err != nil {
log.Fatalf("❌ Failed to start polling: %v", err)
}
updater.Idle()
log.Println("👋 Shutting down bot...")
}