bot.*DBWorker.Log   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 2
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nop 3
dl 0
loc 2
rs 10
c 0
b 0
f 0
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
exported type TwitchDBConfig should have comment or be unexported
Loading history...
52
	Type   string
53
	Token  string
54
	Expire time.Time
55
}
56
57
type BlackListElement struct {
0 ignored issues
show
introduced by
exported type BlackListElement should have comment or be unexported
Loading history...
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
introduced by
no formatting directive in Printf call
Loading history...
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
introduced by
exported method LogGet returns unexported type []bot.dbLog, which can be annoying to use
Loading history...
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
introduced by
exported method DBWorker.GetTwitchToken should have comment or be unexported
Loading history...
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
introduced by
exported method DBWorker.UpdateTwitchToken should have comment or be unexported
Loading history...
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
introduced by
comment on exported method DBWorker.GetBlacklist should be of the form "GetBlacklist ..."
Loading history...
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