/
main.go
114 lines (91 loc) · 2.32 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
package main
import (
"database/sql"
"fmt"
"io/ioutil"
"log"
"os"
"strings"
"time"
"github.com/Kunigaikstis/scrape-skelbiult/pkg/listing"
"github.com/Kunigaikstis/scrape-skelbiult/pkg/message"
"github.com/joho/godotenv"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
_ "github.com/mattn/go-sqlite3"
)
func loadEnvFile() {
err := godotenv.Load()
panicOnError(err)
}
func setupDB() *sql.DB {
db := initDB()
err := migrateDB(db)
panicOnError(err)
return db
}
func main() {
loadEnvFile()
searchUrl := os.Getenv("SKELBIU_LT_SEARCH_RESULTS_URL")
telegramBotToken := os.Getenv("TELEGRAM_BOT_TOKEN")
db := setupDB()
listingRepo := listing.NewStorage(db)
listingService := listing.NewService(listingRepo)
chatRepo := message.NewStorage(db)
bot, err := tgbotapi.NewBotAPI(telegramBotToken)
panicOnError(err)
chatService := message.NewService(chatRepo, bot)
updatesChan, err := bot.GetUpdatesChan(tgbotapi.UpdateConfig{
Timeout: 60,
})
panicOnError(err)
for {
select {
case <-time.After(time.Minute * 10):
log.Print("checking for new ads....")
s := listing.NewScraper("skelbiu.lt", "aruodas.lt", "www.skelbiu.lt", "www.aruodas.lt")
adsToDispatch, err := listingService.GetNewListings(searchUrl, s)
panicOnError(err)
log.Printf("found %v new ads", len(adsToDispatch))
for _, ad := range adsToDispatch {
msg := fmt.Sprintf("%s %s\n%s, %s\n%s", ad.Price, ad.SqFootage, ad.Street, ad.Neighbourhood, ad.Url)
log.Printf("sending message: %s", msg)
err := chatService.SendMessageToAllChats(msg)
panicOnError(err)
}
case update := <-updatesChan:
err := chatService.AddChat(message.Chat{
Id: update.Message.Chat.ID,
Username: update.Message.Chat.UserName,
})
if err != nil && !strings.Contains(err.Error(), "UNIQUE") {
panicOnError(err)
}
}
}
}
func panicOnError(err error) {
if err != nil {
panic(err)
}
}
// Initializes the db instance
func initDB() *sql.DB {
db, err := sql.Open("sqlite3", "./listings.db")
panicOnError(err)
return db
}
// Applies migrations to the db
func migrateDB(db *sql.DB) error {
file, err := ioutil.ReadFile("./init.sql")
if err != nil {
return err
}
requests := strings.Split(string(file), ";")
for _, request := range requests {
_, err := db.Exec(request)
if err != nil {
return err
}
}
return nil
}