/
subscription.go
107 lines (96 loc) · 3.47 KB
/
subscription.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
package bot
import (
"strconv"
"github.com/TechMinerApps/portier/models"
"github.com/tidwall/buntdb"
"gorm.io/gorm"
"gopkg.in/tucnak/telebot.v2"
)
func (b *bot) cmdSub(m *telebot.Message) {
b.app.Logger().Infof("Recieved /sub commmand from user: \"%s\"", m.Sender.Username)
var source models.Source
source.URL, _ = GetURLAndMentionFromMessage(m)
source.Title, _ = b.app.Poller().FetchTitle(source.URL)
source.UpdateInterval = 300 // hardcoded for now
var user models.User
if err := b.app.DB().Model(&user).Association("Sources").Error; err != nil {
b.app.Logger().Errorf("Error starting association mode: %s", err.Error())
b.Bot().Send(m.Chat, "Database error")
return
}
if err := b.app.DB().Model(&user).Where("telegram_id = ?", m.Chat.ID).First(&user).Error; err != nil {
if err != gorm.ErrRecordNotFound {
b.app.Logger().Errorf("Database error: %s", err.Error())
b.Bot().Send(m.Chat, "Database error")
return
}
b.app.Logger().Errorf("Chat ID not registered")
b.Bot().Send(m.Chat, "Chat ID not registered, please run /start first")
return
}
b.app.DB().Model(&source).Where("url = ?", source.URL).First(&source)
b.app.DB().Model(&user).Association("Sources").Append(&source)
b.app.Poller().AddSource(&source)
b.app.Logger().Infof("Add feed \"%s\" to user \"%s\" success", source.Title, m.Sender.Username)
b.Bot().Send(m.Chat, "Add Feed \""+source.Title+"\" Success")
}
func (b *bot) cmdUnSub(m *telebot.Message) {
b.app.Logger().Infof("Recieved /unsub commmand from user: \"%s\"", m.Sender.Username)
var user models.User
b.app.DB().Model(&user).First(&user).Where("telegram_id = ?", m.Chat.ID)
if m.IsReply() {
err := b.memdb.View(func(tx *buntdb.Tx) error {
val, ok := tx.Get(strconv.Itoa(m.ReplyTo.ID))
sourceID, err := strconv.Atoi(val)
if err != nil {
b.app.Logger().Panicf("Unexpected string to interger convertion error: %s", err.Error())
}
var source models.Source
source.ID = uint(sourceID)
b.app.DB().Model(source).Association("Users")
b.app.DB().Model(source).Association("Users").Delete(user)
return ok
})
if err != nil {
b.app.Logger().Errorf("Memory DB error: %s", err.Error())
b.Bot().Send(m.Chat, "Database error")
}
} else {
sourceID, err := strconv.Atoi(m.Payload)
if err != nil {
b.app.Logger().Infof("/unsub command received illegal input: %s", m.Payload)
b.Bot().Send(m.Chat, "source ID illegal")
return
}
var source models.Source
source.ID = uint(sourceID)
b.app.DB().Model(source).Association("Users")
if err = b.app.DB().Model(source).Association("Users").Delete(user); err != nil {
b.app.Logger().Errorf("Database error: %s", err.Error())
b.Bot().Send(m.Chat, "Database error")
return
}
}
b.Bot().Send(m.Chat, "Subscription deleted if exist.")
}
func (b *bot) cmdList(m *telebot.Message) {
b.app.Logger().Infof("Recieved /list commmand from user: \"%s\"", m.Sender.Username)
var user models.User
if err := b.app.DB().Model(user).First(&user).Where("telegram_id = ?", m.Chat.ID).Error; err != nil {
b.app.Logger().Errorf("Database error: %s", err.Error())
b.Bot().Send(m.Chat, "Database error")
return
}
var sources []models.Source
b.app.DB().Model(user).Association("Sources")
b.app.DB().Model(user).Association("Sources").Find(&sources)
var message string
if len(sources) == 0 {
b.bot.Send(m.Chat, "No subscription")
return
}
for _, s := range sources {
message = message + "[" + strconv.Itoa(int(s.ID)) + "]: " + s.Title + "\n"
}
b.bot.Send(m.Chat, message)
}