Passed
Push — master ( afa16b...318446 )
by Viktor
02:46
created

bot.*DBWorker.GetTwitchToken   A

Complexity

Conditions 2

Size

Total Lines 7
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 6
nop 0
dl 0
loc 7
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
		return &token
151
	}
152
	return &token
153
}
154
155
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...
156
	err := db.DBSession.DB(db.DBName).C("config").Update(bson.M{"type": "twitch"}, bson.M{"&set": bson.M{"token": token, "expire": expire}})
157
	if err != nil {
158
		log.Println("[Mongo] Update twitch token error: ", err)
159
	}
160
}
161
162
// GetTwitchStreams returns twitch streams from mongodb
163
func (db *DBWorker) GetTwitchStreams(guildID string) map[string]*TwitchStream {
164
	streams := []TwitchStream{}
165
	err := db.DBSession.DB(db.DBName).C("streams").Find(bson.M{"guild": guildID}).All(&streams)
166
	if err != nil {
167
		log.Printf("[Mongo] streams, streams DB: %s, Guild: %s, Error: %v\n", db.DBName, guildID, err)
168
	}
169
	var newMap = make(map[string]*TwitchStream)
170
	for i, s := range streams {
171
		newMap[s.Login] = &streams[i]
172
	}
173
	return newMap
174
}
175
176
// UpdateStream updates stream in mongodb
177
func (db *DBWorker) UpdateStream(stream *TwitchStream) {
178
	err := db.DBSession.DB(db.DBName).C("streams").
179
		Update(
180
			bson.M{"guild": stream.Guild, "login": stream.Login},
181
			bson.M{"$set": bson.M{"isonline": stream.IsOnline}})
182
	if err != nil {
183
		log.Println("[Mongo] ", err)
184
	}
185
}
186
187
// AddStream adds stream in mongodb
188
func (db *DBWorker) AddStream(stream *TwitchStream) {
189
	_ = db.DBSession.DB(db.DBName).C("streams").Insert(stream)
190
}
191
192
// RemoveStream removes stream from mongodb
193
func (db *DBWorker) RemoveStream(stream *TwitchStream) {
194
	_ = db.DBSession.DB(db.DBName).C("streams").Remove(bson.M{"login": stream.Login, "guild": stream.Guild})
195
}
196
197
// GetRadioStations gets stations from database and returns slice of them
198
func (db *DBWorker) GetRadioStations(category string) []RadioStation {
199
	stations := []RadioStation{}
200
	var request = bson.M{}
201
	if category != "" {
202
		request = bson.M{"category": category}
203
	}
204
	err := db.DBSession.DB(db.DBName).C("stations").Find(request).All(&stations)
205
	if err != nil {
206
		log.Printf("[Mongo] stations, DB: %s, Error: %v\n", db.DBName, err)
207
208
	}
209
	return stations
210
}
211
212
// GetRadioStationByKey returns one station by key
213
func (db *DBWorker) GetRadioStationByKey(key string) (*RadioStation, error) {
214
	station := RadioStation{}
215
	err := db.DBSession.DB(db.DBName).C("stations").Find(bson.M{"key": key}).One(&station)
216
	if err != nil {
217
		log.Printf("[Mongo] stations, DB: %s, Key: %s, Error: %v\n", db.DBName, key, err)
218
		return nil, fmt.Errorf("station not found")
219
	}
220
	return &station, nil
221
}
222
223
// RemoveRadioStation removes radio station by key
224
func (db *DBWorker) RemoveRadioStation(key string) error {
225
	err := db.DBSession.DB(db.DBName).C("stations").Remove(bson.M{"key": key})
226
	return err
227
}
228
229
// AddRadioStation adds new radio station
230
func (db *DBWorker) AddRadioStation(name, url, key, category string) error {
231
	station := RadioStation{Name: name, URL: url, Key: key, Category: category}
232
	err := db.DBSession.DB(db.DBName).C("stations").Insert(&station)
233
	return err
234
}
235
236
// GetAlbionPlayers gets players from database
237
func (db *DBWorker) GetAlbionPlayers() []AlbionPlayerUpdater {
238
	var players []AlbionPlayerUpdater
239
	_ = db.DBSession.DB(db.DBName).C("albion").Find(nil).All(&players)
240
	fmt.Println(len(players))
241
	return players
242
}
243
244
// AddAlbionPlayer adds new player in database
245
func (db *DBWorker) AddAlbionPlayer(player *AlbionPlayerUpdater) {
246
	err := db.DBSession.DB(db.DBName).C("albion").Insert(player)
247
	if err != nil {
248
		log.Printf("[Mongo] Error adding Albion player: ", err.Error())
0 ignored issues
show
introduced by
no formatting directive in Printf call
Loading history...
249
	}
250
}
251
252
// RemoveAlbionPlayer removes player from database
253
func (db *DBWorker) RemoveAlbionPlayer(id string) {
254
	err := db.DBSession.DB(db.DBName).C("albion").Remove(bson.M{"userid": id})
255
	if err != nil {
256
		log.Printf("[Mongo] Error removing Albion player: ", err.Error())
0 ignored issues
show
introduced by
no formatting directive in Printf call
Loading history...
257
	}
258
}
259
260
// UpdateAlbionPlayerLast updates last kill of albion player
261
func (db *DBWorker) UpdateAlbionPlayerLast(userID string, lastKill int64) {
262
	err := db.DBSession.DB(db.DBName).C("albion").
263
		Update(
264
			bson.M{"userid": userID},
265
			bson.M{"$set": bson.M{"lastkill": lastKill}})
266
	if err != nil {
267
		log.Printf("[Mongo] ", err)
0 ignored issues
show
introduced by
no formatting directive in Printf call
Loading history...
268
	}
269
}
270
271
// 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...
272
func (db *DBWorker) GetBlacklist() *BlackListStruct {
273
	var (
274
		blacklist BlackListStruct
275
		Guilds    []BlackListElement
276
		Users     []BlackListElement
277
	)
278
	_ = db.DBSession.DB(db.DBName).C("blusers").Find(nil).All(&Users)
279
	_ = db.DBSession.DB(db.DBName).C("blguilds").Find(nil).All(&Guilds)
280
281
	for _, g := range Guilds {
282
		blacklist.Guilds = append(blacklist.Guilds, g.ID)
283
	}
284
	for _, u := range Users {
285
		blacklist.Users = append(blacklist.Users, u.ID)
286
	}
287
288
	return &blacklist
289
}
290
291
// AddBlacklistGuild adds guild in database blacklist
292
func (db *DBWorker) AddBlacklistGuild(id string) {
293
	err := db.DBSession.DB(db.DBName).C("blguilds").Insert(BlackListElement{ID: id})
294
	if err != nil {
295
		log.Printf("[Mongo] Error adding guild in blacklist: ", err.Error())
0 ignored issues
show
introduced by
no formatting directive in Printf call
Loading history...
296
	}
297
}
298
299
// AddBlacklistUser adds user in database blacklist
300
func (db *DBWorker) AddBlacklistUser(id string) {
301
	err := db.DBSession.DB(db.DBName).C("blusers").Insert(BlackListElement{ID: id})
302
	if err != nil {
303
		log.Printf("[Mongo] Error adding user in blacklist: ", err.Error())
0 ignored issues
show
introduced by
no formatting directive in Printf call
Loading history...
304
	}
305
}
306
307
// RemoveBlacklistGuild removes guild from database blacklist
308
func (db *DBWorker) RemoveBlacklistGuild(id string) {
309
	err := db.DBSession.DB(db.DBName).C("blguilds").Remove(bson.M{"id": id})
310
	if err != nil {
311
		log.Printf("[Mongo] Error removing guild from blacklist: ", err.Error())
0 ignored issues
show
introduced by
no formatting directive in Printf call
Loading history...
312
	}
313
}
314
315
// RemoveBlacklistUser removes user from database blacklist
316
func (db *DBWorker) RemoveBlacklistUser(id string) {
317
	err := db.DBSession.DB(db.DBName).C("blusers").Remove(bson.M{"id": id})
318
	if err != nil {
319
		log.Printf("[Mongo] Error removing user from blacklist: ", err.Error())
0 ignored issues
show
introduced by
no formatting directive in Printf call
Loading history...
320
	}
321
}
322