1 | package bot |
||
2 | |||
3 | import ( |
||
4 | "fmt" |
||
5 | "github.com/bwmarrin/discordgo" |
||
6 | "github.com/globalsign/mgo" |
||
7 | "github.com/globalsign/mgo/bson" |
||
8 | "log" |
||
9 | "os" |
||
10 | "time" |
||
11 | ) |
||
12 | |||
13 | // DBWorker MongoDB instance |
||
14 | type DBWorker struct { |
||
15 | DBSession *mgo.Session |
||
16 | DBName string |
||
17 | } |
||
18 | |||
19 | type dbLog struct { |
||
20 | Date time.Time |
||
21 | Text string |
||
22 | Module string |
||
23 | Guild string |
||
24 | } |
||
25 | |||
26 | // GuildData contains data about guild settings |
||
27 | type GuildData struct { |
||
28 | ID string |
||
29 | WeatherCity string |
||
30 | NewsCounty string |
||
31 | Language string |
||
32 | Timezone int |
||
33 | EmbedColor int |
||
34 | VoiceVolume float32 |
||
35 | Greeting string |
||
36 | } |
||
37 | |||
38 | // GuildsMap contains guilds settings |
||
39 | type GuildsMap struct { |
||
40 | Guilds map[string]*GuildData |
||
41 | } |
||
42 | |||
43 | // RadioStation contains info about radio station |
||
44 | type RadioStation struct { |
||
45 | Name string |
||
46 | URL string |
||
47 | Key string |
||
48 | Category string |
||
49 | } |
||
50 | |||
51 | type TwitchDBConfig struct { |
||
0 ignored issues
–
show
introduced
by
![]() |
|||
52 | Type string |
||
53 | Token string |
||
54 | Expire time.Time |
||
55 | } |
||
56 | |||
57 | type BlackListElement struct { |
||
0 ignored issues
–
show
|
|||
58 | ID string |
||
59 | } |
||
60 | |||
61 | // NewDBSession creates new MongoDB instance |
||
62 | func NewDBSession(dbname string) *DBWorker { |
||
63 | session, err := mgo.Dial(os.Getenv("MONGO_CONN")) |
||
64 | if err != nil { |
||
65 | log.Printf("[Mongo] Mongo connection error: %v", err) |
||
66 | } |
||
67 | count, err := session.DB("dtbot").C("logs").Count() |
||
68 | if err != nil { |
||
69 | log.Printf("[Mongo] DB_ERR: ", err) |
||
0 ignored issues
–
show
|
|||
70 | } |
||
71 | log.Printf("[Mongo] connected\nLogs in base: %v\n", count) |
||
72 | return &DBWorker{DBSession: session, DBName: dbname} |
||
73 | } |
||
74 | |||
75 | // InitGuilds initialize guilds in database |
||
76 | func (db *DBWorker) InitGuilds(sess *discordgo.Session, conf *Config) *GuildsMap { |
||
77 | var data = &GuildsMap{Guilds: make(map[string]*GuildData)} |
||
78 | var loaded, initialized = 0, 0 |
||
79 | for _, guild := range sess.State.Guilds { |
||
80 | count, err := db.DBSession.DB(db.DBName).C("guilds").Find(bson.M{"id": guild.ID}).Count() |
||
81 | if err != nil { |
||
82 | log.Printf("[Mongo] guilds, DB: %s, Guild: %s, Error: %v\n", db.DBName, guild.ID, err) |
||
83 | } |
||
84 | if count == 0 { |
||
85 | newData := &GuildData{ |
||
86 | ID: guild.ID, |
||
87 | WeatherCity: conf.Weather.City, |
||
88 | NewsCounty: conf.News.Country, |
||
89 | Language: conf.General.Language, |
||
90 | Timezone: conf.General.Timezone, |
||
91 | EmbedColor: conf.General.EmbedColor, |
||
92 | VoiceVolume: conf.Voice.Volume, |
||
93 | Greeting: "", |
||
94 | } |
||
95 | _ = db.DBSession.DB(db.DBName).C("guilds").Insert(newData) |
||
96 | data.Guilds[guild.ID] = newData |
||
97 | initialized++ |
||
98 | } else { |
||
99 | var newData = &GuildData{} |
||
100 | _ = db.DBSession.DB(db.DBName).C("guilds").Find(bson.M{"id": guild.ID}).One(newData) |
||
101 | if err != nil { |
||
102 | log.Printf("[Mongo] guilds, DB: %s, Guild: %s, Error: %v\n", db.DBName, guild.ID, err) |
||
103 | continue |
||
104 | } |
||
105 | data.Guilds[guild.ID] = newData |
||
106 | loaded++ |
||
107 | } |
||
108 | } |
||
109 | log.Printf("[Mongo] Guilds loaded [%v], initialized [%v]\n", loaded, initialized) |
||
110 | return data |
||
111 | } |
||
112 | |||
113 | // InitNewGuild creates new guild in database |
||
114 | func (db *DBWorker) InitNewGuild(guildID string, conf *Config, data *GuildsMap) { |
||
115 | newData := &GuildData{ |
||
116 | ID: guildID, |
||
117 | WeatherCity: conf.Weather.City, |
||
118 | NewsCounty: conf.News.Country, |
||
119 | Language: conf.General.Language, |
||
120 | Timezone: conf.General.Timezone, |
||
121 | EmbedColor: conf.General.EmbedColor, |
||
122 | VoiceVolume: conf.Voice.Volume, |
||
123 | Greeting: "", |
||
124 | } |
||
125 | _ = db.DBSession.DB(db.DBName).C("guilds").Insert(newData) |
||
126 | data.Guilds[guildID] = newData |
||
127 | } |
||
128 | |||
129 | // Log saves log in database |
||
130 | func (db *DBWorker) Log(module, guildID, text string) { |
||
131 | _ = db.DBSession.DB(db.DBName).C("logs").Insert(dbLog{Date: time.Now(), Text: text, Module: module, Guild: guildID}) |
||
132 | } |
||
133 | |||
134 | // LogGet returns last N log rows |
||
135 | func (db *DBWorker) LogGet(count int) []dbLog { |
||
0 ignored issues
–
show
|
|||
136 | var log = make([]dbLog, count) |
||
137 | _ = db.DBSession.DB(db.DBName).C("logs").Find(nil).Sort("-$natural").Limit(count).All(&log) |
||
138 | return log |
||
139 | } |
||
140 | |||
141 | // Guilds returns guilds collection from mongodb |
||
142 | func (db *DBWorker) Guilds() *mgo.Collection { |
||
143 | return db.DBSession.DB(db.DBName).C("guilds") |
||
144 | } |
||
145 | |||
146 | func (db *DBWorker) GetTwitchToken() *TwitchDBConfig { |
||
0 ignored issues
–
show
|
|||
147 | var token TwitchDBConfig |
||
148 | err := db.DBSession.DB(db.DBName).C("config").Find(bson.M{"type": "twitch"}).One(&token) |
||
149 | if err != nil { |
||
150 | log.Println("[Mongo] Get twitch token error: ", err) |
||
151 | return &token |
||
152 | } |
||
153 | return &token |
||
154 | } |
||
155 | |||
156 | func (db *DBWorker) UpdateTwitchToken(token string, expire time.Time) { |
||
0 ignored issues
–
show
|
|||
157 | err := db.DBSession.DB(db.DBName).C("config").Update(bson.M{"type": "twitch"}, bson.M{"$set": bson.M{"token": token, "expire": expire}}) |
||
158 | if err != nil { |
||
159 | log.Println("[Mongo] Update twitch token error: ", err) |
||
160 | err = db.DBSession.DB(db.DBName).C("config").Insert(TwitchDBConfig{ |
||
161 | Type: "twitch", |
||
162 | Token: token, |
||
163 | Expire: expire, |
||
164 | }) |
||
165 | if err != nil { |
||
166 | log.Println("[Mongo] Update twitch token error: ", err) |
||
167 | } |
||
168 | } |
||
169 | } |
||
170 | |||
171 | // GetTwitchStreams returns twitch streams from mongodb |
||
172 | func (db *DBWorker) GetTwitchStreams(guildID string) map[string]*TwitchStream { |
||
173 | streams := []TwitchStream{} |
||
174 | err := db.DBSession.DB(db.DBName).C("streams").Find(bson.M{"guild": guildID}).All(&streams) |
||
175 | if err != nil { |
||
176 | log.Printf("[Mongo] streams, streams DB: %s, Guild: %s, Error: %v\n", db.DBName, guildID, err) |
||
177 | } |
||
178 | var newMap = make(map[string]*TwitchStream) |
||
179 | for i, s := range streams { |
||
180 | newMap[s.Login] = &streams[i] |
||
181 | } |
||
182 | return newMap |
||
183 | } |
||
184 | |||
185 | // UpdateStream updates stream in mongodb |
||
186 | func (db *DBWorker) UpdateStream(stream *TwitchStream) { |
||
187 | err := db.DBSession.DB(db.DBName).C("streams"). |
||
188 | Update( |
||
189 | bson.M{"guild": stream.Guild, "login": stream.Login}, |
||
190 | bson.M{"$set": bson.M{"isonline": stream.IsOnline}}) |
||
191 | if err != nil { |
||
192 | log.Println("[Mongo] ", err) |
||
193 | } |
||
194 | } |
||
195 | |||
196 | // AddStream adds stream in mongodb |
||
197 | func (db *DBWorker) AddStream(stream *TwitchStream) { |
||
198 | _ = db.DBSession.DB(db.DBName).C("streams").Insert(stream) |
||
199 | } |
||
200 | |||
201 | // RemoveStream removes stream from mongodb |
||
202 | func (db *DBWorker) RemoveStream(stream *TwitchStream) { |
||
203 | _ = db.DBSession.DB(db.DBName).C("streams").Remove(bson.M{"login": stream.Login, "guild": stream.Guild}) |
||
204 | } |
||
205 | |||
206 | // GetRadioStations gets stations from database and returns slice of them |
||
207 | func (db *DBWorker) GetRadioStations(category string) []RadioStation { |
||
208 | stations := []RadioStation{} |
||
209 | var request = bson.M{} |
||
210 | if category != "" { |
||
211 | request = bson.M{"category": category} |
||
212 | } |
||
213 | err := db.DBSession.DB(db.DBName).C("stations").Find(request).All(&stations) |
||
214 | if err != nil { |
||
215 | log.Printf("[Mongo] stations, DB: %s, Error: %v\n", db.DBName, err) |
||
216 | |||
217 | } |
||
218 | return stations |
||
219 | } |
||
220 | |||
221 | // GetRadioStationByKey returns one station by key |
||
222 | func (db *DBWorker) GetRadioStationByKey(key string) (*RadioStation, error) { |
||
223 | station := RadioStation{} |
||
224 | err := db.DBSession.DB(db.DBName).C("stations").Find(bson.M{"key": key}).One(&station) |
||
225 | if err != nil { |
||
226 | log.Printf("[Mongo] stations, DB: %s, Key: %s, Error: %v\n", db.DBName, key, err) |
||
227 | return nil, fmt.Errorf("station not found") |
||
228 | } |
||
229 | return &station, nil |
||
230 | } |
||
231 | |||
232 | // RemoveRadioStation removes radio station by key |
||
233 | func (db *DBWorker) RemoveRadioStation(key string) error { |
||
234 | err := db.DBSession.DB(db.DBName).C("stations").Remove(bson.M{"key": key}) |
||
235 | return err |
||
236 | } |
||
237 | |||
238 | // AddRadioStation adds new radio station |
||
239 | func (db *DBWorker) AddRadioStation(name, url, key, category string) error { |
||
240 | station := RadioStation{Name: name, URL: url, Key: key, Category: category} |
||
241 | err := db.DBSession.DB(db.DBName).C("stations").Insert(&station) |
||
242 | return err |
||
243 | } |
||
244 | |||
245 | // GetAlbionPlayers gets players from database |
||
246 | func (db *DBWorker) GetAlbionPlayers() []AlbionPlayerUpdater { |
||
247 | var players []AlbionPlayerUpdater |
||
248 | _ = db.DBSession.DB(db.DBName).C("albion").Find(nil).All(&players) |
||
249 | fmt.Println(len(players)) |
||
250 | return players |
||
251 | } |
||
252 | |||
253 | // AddAlbionPlayer adds new player in database |
||
254 | func (db *DBWorker) AddAlbionPlayer(player *AlbionPlayerUpdater) { |
||
255 | err := db.DBSession.DB(db.DBName).C("albion").Insert(player) |
||
256 | if err != nil { |
||
257 | log.Println("[Mongo] Error adding Albion player: ", err.Error()) |
||
258 | } |
||
259 | } |
||
260 | |||
261 | // RemoveAlbionPlayer removes player from database |
||
262 | func (db *DBWorker) RemoveAlbionPlayer(id string) { |
||
263 | err := db.DBSession.DB(db.DBName).C("albion").Remove(bson.M{"userid": id}) |
||
264 | if err != nil { |
||
265 | log.Println("[Mongo] Error removing Albion player: ", err.Error()) |
||
266 | } |
||
267 | } |
||
268 | |||
269 | // UpdateAlbionPlayerLast updates last kill of albion player |
||
270 | func (db *DBWorker) UpdateAlbionPlayerLast(userID string, lastKill int64) { |
||
271 | err := db.DBSession.DB(db.DBName).C("albion"). |
||
272 | Update( |
||
273 | bson.M{"userid": userID}, |
||
274 | bson.M{"$set": bson.M{"lastkill": lastKill}}) |
||
275 | if err != nil { |
||
276 | log.Println("[Mongo] ", err) |
||
277 | } |
||
278 | } |
||
279 | |||
280 | // GetBlackList gets blacklist from database |
||
0 ignored issues
–
show
|
|||
281 | func (db *DBWorker) GetBlacklist() *BlackListStruct { |
||
282 | var ( |
||
283 | blacklist BlackListStruct |
||
284 | Guilds []BlackListElement |
||
285 | Users []BlackListElement |
||
286 | ) |
||
287 | _ = db.DBSession.DB(db.DBName).C("blusers").Find(nil).All(&Users) |
||
288 | _ = db.DBSession.DB(db.DBName).C("blguilds").Find(nil).All(&Guilds) |
||
289 | |||
290 | for _, g := range Guilds { |
||
291 | blacklist.Guilds = append(blacklist.Guilds, g.ID) |
||
292 | } |
||
293 | for _, u := range Users { |
||
294 | blacklist.Users = append(blacklist.Users, u.ID) |
||
295 | } |
||
296 | |||
297 | return &blacklist |
||
298 | } |
||
299 | |||
300 | // AddBlacklistGuild adds guild in database blacklist |
||
301 | func (db *DBWorker) AddBlacklistGuild(id string) { |
||
302 | err := db.DBSession.DB(db.DBName).C("blguilds").Insert(BlackListElement{ID: id}) |
||
303 | if err != nil { |
||
304 | log.Println("[Mongo] Error adding guild in blacklist: ", err.Error()) |
||
305 | } |
||
306 | } |
||
307 | |||
308 | // AddBlacklistUser adds user in database blacklist |
||
309 | func (db *DBWorker) AddBlacklistUser(id string) { |
||
310 | err := db.DBSession.DB(db.DBName).C("blusers").Insert(BlackListElement{ID: id}) |
||
311 | if err != nil { |
||
312 | log.Println("[Mongo] Error adding user in blacklist: ", err.Error()) |
||
313 | } |
||
314 | } |
||
315 | |||
316 | // RemoveBlacklistGuild removes guild from database blacklist |
||
317 | func (db *DBWorker) RemoveBlacklistGuild(id string) { |
||
318 | err := db.DBSession.DB(db.DBName).C("blguilds").Remove(bson.M{"id": id}) |
||
319 | if err != nil { |
||
320 | log.Println("[Mongo] Error removing guild from blacklist: ", err.Error()) |
||
321 | } |
||
322 | } |
||
323 | |||
324 | // RemoveBlacklistUser removes user from database blacklist |
||
325 | func (db *DBWorker) RemoveBlacklistUser(id string) { |
||
326 | err := db.DBSession.DB(db.DBName).C("blusers").Remove(bson.M{"id": id}) |
||
327 | if err != nil { |
||
328 | log.Println("[Mongo] Error removing user from blacklist: ", err.Error()) |
||
329 | } |
||
330 | } |
||
331 | |||
332 | // GetNewsCountry returns news country string |
||
333 | func (db *DBWorker) GetNewsCountry(guild string) string { |
||
334 | var dbGuild GuildData |
||
335 | err := db.DBSession.DB(db.DBName).C("guilds").Find(bson.M{"id": guild}).One(&dbGuild) |
||
336 | if err != nil { |
||
337 | log.Println("[Mongo] Error getting news country: ", err) |
||
338 | } |
||
339 | return dbGuild.NewsCounty |
||
340 | } |
||
341 |