-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
117 lines (97 loc) · 2.49 KB
/
main.go
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
package main
import (
"bufio"
"bus-notifier/refdata"
"log"
"os"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
"github.com/joho/godotenv"
"github.com/robfig/cron/v3"
)
const jobDBFile string = "job.db"
const userStateDBFile string = "user_state.db"
var outgoingMessages chan tgbotapi.Chattable
var outgoingCallbackResponses chan tgbotapi.CallbackConfig
var incomingMessages tgbotapi.UpdatesChannel
var bot *tgbotapi.BotAPI
var cronner *cron.Cron
var refreshCronEntryID cron.EntryID
var busServiceLookUp map[string]bool
var refDataDB refdata.DB
var storedJobDB JobDB
var userStateDB UserStateDB
func initTelegramAPI() {
botToken := os.Getenv("TELEGRAM_API_TOKEN")
newBot, err := tgbotapi.NewBotAPI(botToken)
if err != nil {
log.Fatalln(err)
}
bot = newBot
bot.Debug = true
log.Printf("Authorized on account %s", bot.Self.UserName)
u := tgbotapi.NewUpdate(0)
u.Timeout = 60
incomingMessages, err = bot.GetUpdatesChan(u)
if err != nil {
log.Fatalln(err)
}
}
func initRefData() {
busServiceLookUp = make(map[string]bool)
file, err := os.Open("refdata/bus_services.txt")
if err != nil {
log.Fatalln(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
busServiceLookUp[scanner.Text()] = true
}
if err := scanner.Err(); err != nil {
log.Fatalln(err)
}
refDataDB = refdata.NewRefDataDB("refdata/refdata.db")
}
func initOutgoingChannels() {
outgoingMessages = make(chan tgbotapi.Chattable)
outgoingCallbackResponses = make(chan tgbotapi.CallbackConfig)
}
func main() {
err := godotenv.Load()
if err != nil {
log.Fatalln(err)
}
initTelegramAPI()
initRefData()
initOutgoingChannels()
storedJobDB = NewJobDB(jobDBFile)
userStateDB = NewUserStateDB(userStateDBFile)
// bootstrapJobsForTesting()
go func() {
for outgoingMessage := range outgoingMessages {
bot.Send(outgoingMessage)
}
}()
go func() {
for outgoingCallbackResponse := range outgoingCallbackResponses {
bot.AnswerCallbackQuery(outgoingCallbackResponse)
}
}()
go handleStoredJobs()
handleIncomingMessages()
}
func handleIncomingMessages() {
for update := range incomingMessages {
if update.Message == nil && update.CallbackQuery == nil {
continue
}
registrationReply := handleRegistration(update)
if registrationReply.replyMessage != nil {
outgoingMessages <- registrationReply.replyMessage
}
zero := tgbotapi.CallbackConfig{}
if registrationReply.callbackResponse != zero {
outgoingCallbackResponses <- registrationReply.callbackResponse
}
}
}