forked from wasabee-project/Wasabee-Server
-
Notifications
You must be signed in to change notification settings - Fork 0
/
model_telegram.go
139 lines (119 loc) · 3.1 KB
/
model_telegram.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package wasabee
import (
"database/sql"
"fmt"
"strconv"
)
var tgbotname string
var tgbotid int
var tgrunning bool
// TelegramID is a user ID from telegram
type TelegramID int
// TGSetBot is called from the Telegram bot startup to let other services know it is running
func TGSetBot(botname string, botid int) {
tgbotname = botname
tgbotid = botid
tgrunning = true
}
// TGGetBotName returns the bot's telegram username
// used by templates
func TGGetBotName() (string, error) {
if !tgrunning {
return "", nil
}
return tgbotname, nil
}
// TGGetBotID returns the bot's telegram ID number
// used by templates
func TGGetBotID() (int, error) {
if !tgrunning {
return 0, nil
}
return tgbotid, nil
}
// TGRunning is used by templates to determine if they should display telegram info
func TGRunning() (bool, error) {
return tgrunning, nil
}
// GidV returns a GoogleID and V verified status for a given Telegram ID #
func (tgid TelegramID) GidV() (GoogleID, bool, error) {
var gid GoogleID
var verified bool
row := db.QueryRow("SELECT gid, verified FROM telegram WHERE telegramID = ?", tgid)
err := row.Scan(&gid, &verified)
if err != nil && err == sql.ErrNoRows {
return "", false, nil
}
if err != nil {
Log.Notice(err)
return "", false, err
}
return gid, verified, nil
}
// Gid returns a verified GoogleID for a Telegram ID
func (tgid TelegramID) Gid() (GoogleID, error) {
gid, v, err := tgid.GidV()
if err != nil {
return "", err
}
if !v {
return "", fmt.Errorf("Unverified")
}
return gid, nil
}
// TelegramID returns a telegram ID number for a gid
func (gid GoogleID) TelegramID() (TelegramID, error) {
var tgid TelegramID
row := db.QueryRow("SELECT telegramID FROM telegram WHERE gid = ?", gid)
err := row.Scan(&tgid)
if err != nil && err == sql.ErrNoRows {
return 0, nil
}
if err != nil {
Log.Notice(err)
return 0, err
}
return tgid, nil
}
// InitAgent establishes a new telegram user in the database and begins the verification process
func (tgid TelegramID) InitAgent(name string, lockey LocKey) error {
authtoken := GenerateName()
gid, err := lockey.Gid()
if err != nil && err == sql.ErrNoRows {
err = fmt.Errorf("location Share Key (%s) is not recognized", lockey)
Log.Notice(err)
return err
}
if err != nil {
Log.Notice(err)
return err
}
_, err = db.Exec("INSERT INTO telegram (telegramID, telegramName, gid, verified, authtoken) VALUES (?, 'unused', ?, 0, ?)", tgid, gid, authtoken)
if err != nil {
Log.Notice(err)
return err
}
return nil
}
// VerifyAgent is the second stage of the verication process
func (tgid TelegramID) VerifyAgent(authtoken string) error {
res, err := db.Exec("UPDATE telegram SET authtoken = NULL, verified = 1 WHERE telegramID = ? AND authtoken = ?", tgid, authtoken)
if err != nil {
Log.Notice(err)
return err
}
i, err := res.RowsAffected()
if err != nil {
Log.Notice(err)
return err
}
if i < 1 {
err = fmt.Errorf("invalid AuthToken")
return err
} // trust the primary key prevents i > 1
return nil
}
// String returns a string format of a TelegramID
func (tgid TelegramID) String() string {
return strconv.Itoa(int(tgid))
}