Passed
Push — master ( 72abbe...938fc0 )
by Viktor
01:49
created

cmd.botStations   B

Complexity

Conditions 8

Size

Total Lines 25
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
eloc 21
nop 1
dl 0
loc 25
rs 7.3333
c 0
b 0
f 0
1
package cmd
2
3
import (
4
	"fmt"
5
	"github.com/bwmarrin/discordgo"
6
	"github.com/globalsign/mgo/bson"
7
	"strconv"
8
	"strings"
9
10
	"github.com/FlameInTheDark/dtbot/bot"
11
)
12
13
func showLogs(ctx *bot.Context, count int) {
14
	logs := ctx.DB.LogGet(count)
15
	var logString = []string{""}
16
	for _, log := range logs {
17
		logString = append(logString, fmt.Sprintf("[%v] %v: %v\n", log.Date, log.Module, log.Text))
18
	}
19
	ctx.ReplyEmbedPM("Logs", strings.Join(logString, ""))
20
}
21
22
// BotCommand special bot commands handler
23
func BotCommand(ctx bot.Context) {
24
	if ctx.IsServerAdmin() {
25
		if len(ctx.Args) == 0 {
26
			return
27
		}
28
		switch ctx.Args[0] {
29
		case "clear":
30
			ctx.MetricsCommand("bot", "clear")
31
			if len(ctx.Args) < 2 {
32
				ctx.BotMsg.Clear(&ctx, 0)
33
				return
34
			}
35
			from, err := strconv.Atoi(ctx.Args[1])
36
			if err != nil {
37
				return
38
			}
39
			ctx.BotMsg.Clear(&ctx, from)
40
		case "logs":
41
			ctx.MetricsCommand("bot", "logs")
42
			if ctx.IsAdmin() {
43
				if len(ctx.Args) < 2 {
44
					showLogs(&ctx, 10)
45
				} else {
46
					count, err := strconv.Atoi(ctx.Args[1])
47
					if err != nil {
48
						fmt.Println(err)
49
						return
50
					}
51
					showLogs(&ctx, count)
52
				}
53
			}
54
		case "conflist":
55
			ctx.MetricsCommand("bot", "conflist")
56
			ctx.ReplyEmbed("Config", ctx.Loc("conf_list"))
57
		case "setconf":
58
			botSetConf(&ctx)
59
		case "stations":
60
			botStations(&ctx)
61
		case "guild":
62
			botGuild(&ctx)
63
		case "stats":
64
			ctx.MetricsCommand("bot", "stats")
65
			if !ctx.IsAdmin() {
66
				return
67
			}
68
			var users int
69
			for _, g := range ctx.Discord.State.Guilds {
70
				users += len(g.Members)
71
			}
72
			ctx.ReplyEmbed("Stats", fmt.Sprintf(ctx.Loc("stats_command"), len(ctx.Discord.State.Guilds), users))
0 ignored issues
show
introduced by
can't check non-constant format in call to Sprintf
Loading history...
73
		}
74
	} else {
75
		ctx.ReplyEmbed("Bot", ctx.Loc("admin_require"))
76
	}
77
}
78
79
func guildsListID(guilds []*discordgo.Guild, current, pages int) string {
80
	var list string
81
	for _, g := range guilds {
82
		var gName string
83
		if len(g.Name) > 20 {
84
			gName = fmt.Sprintf("%v...", g.Name[:20])
85
		} else {
86
			gName = g.Name
87
		}
88
		list += fmt.Sprintf("[%v] - %v\n", g.ID, gName)
89
	}
90
	list += fmt.Sprintf("Page: %v | %v", current, pages)
91
	return list
92
}
93
94
func guildsListName(guilds []*discordgo.Guild, current, pages int) string {
95
	var list string
96
	for i, g := range guilds {
97
		var gName string
98
		if len(g.Name) > 20 {
99
			gName = fmt.Sprintf("%v...", g.Name[:20])
100
		} else {
101
			gName = g.Name
102
		}
103
		list += fmt.Sprintf("[%v] - %v | U: %v\n", i, gName, len(g.Members))
104
	}
105
	list += fmt.Sprintf("Page: %v | %v", current, pages)
106
	return list
107
}
108
109
func botSetConf(ctx *bot.Context) {
110
	ctx.MetricsCommand("bot", "setconf")
111
	if len(ctx.Args) > 2 {
112
		target := strings.Split(ctx.Args[1], ".")
113
		switch target[0] {
114
		case "general":
115
			switch target[1] {
116
			case "language":
117
				ctx.Guilds.Guilds[ctx.Guild.ID].Language = ctx.Args[2]
118
				_ = ctx.DB.Guilds().Update(bson.M{"id": ctx.Guild.ID}, bson.M{"$set": bson.M{"language": ctx.Args[2]}})
119
				ctx.ReplyEmbedPM("Config", fmt.Sprintf("Language set to: %v", ctx.Args[2]))
120
			case "timezone":
121
				tz, err := strconv.Atoi(ctx.Args[1])
122
				if err != nil {
123
					ctx.ReplyEmbedPM("Settings", "Not a number")
124
				}
125
				ctx.Guilds.Guilds[ctx.Guild.ID].Timezone = tz
126
				_ = ctx.DB.Guilds().Update(bson.M{"id": ctx.Guild.ID}, bson.M{"$set": bson.M{"timezone": tz}})
127
				ctx.ReplyEmbedPM("Config", fmt.Sprintf("Timezone set to: %v", ctx.Args[2]))
128
			case "nick":
129
				_ = ctx.Discord.GuildMemberNickname(ctx.Guild.ID, "@me", ctx.Args[2])
130
				ctx.ReplyEmbedPM("Config", fmt.Sprintf("Nickname changed to %v", ctx.Args[2]))
131
			}
132
		case "weather":
133
			switch target[1] {
134
			case "city":
135
				ctx.Guilds.Guilds[ctx.Guild.ID].WeatherCity = ctx.Args[2]
136
				_ = ctx.DB.Guilds().Update(bson.M{"id": ctx.Guild.ID}, bson.M{"$set": bson.M{"weathercity": ctx.Args[2]}})
137
				ctx.ReplyEmbedPM("Config", fmt.Sprintf("Weather city set to: %v", ctx.Args[2]))
138
			}
139
		case "news":
140
			switch target[1] {
141
			case "country":
142
				ctx.Guilds.Guilds[ctx.Guild.ID].NewsCounty = ctx.Args[2]
143
				_ = ctx.DB.Guilds().Update(bson.M{"id": ctx.Guild.ID}, bson.M{"$set": bson.M{"weathercountry": ctx.Args[2]}})
144
				ctx.ReplyEmbedPM("Config", fmt.Sprintf("News country set to: %v", ctx.Args[2]))
145
			}
146
		case "embed":
147
			switch target[1] {
148
			case "color":
149
				var color int64
150
				var err error
151
				if strings.HasPrefix(ctx.Args[2], "#") {
152
					color, err = strconv.ParseInt(ctx.Args[2][1:], 16, 32)
153
					if err != nil {
154
						ctx.Log("Config", ctx.Guild.ID, fmt.Sprintf("error setting parameter %v to value %v: %v", ctx.Args[1], target[2], err.Error()))
155
						return
156
					}
157
				} else {
158
					color, err = strconv.ParseInt(ctx.Args[2], 16, 32)
159
					if err != nil {
160
						ctx.Log("Config", ctx.Guild.ID, fmt.Sprintf("error setting parameter %v to value %v: %v", ctx.Args[1], ctx.Args[2], err.Error()))
161
						return
162
					}
163
				}
164
				ctx.Guilds.Guilds[ctx.Guild.ID].EmbedColor = int(color)
165
				_ = ctx.DB.Guilds().Update(bson.M{"id": ctx.Guild.ID}, bson.M{"$set": bson.M{"embedcolor": int(color)}})
166
				ctx.ReplyEmbedPM("Config", fmt.Sprintf("Embed color set to: %v", ctx.Args[2]))
167
			}
168
		}
169
	}
170
}
171
172
func botGuild(ctx *bot.Context) {
173
	ctx.MetricsCommand("bot", "guild")
174
	if len(ctx.Args) < 2 && !ctx.IsAdmin() {
175
		return
176
	}
177
	switch ctx.Args[1] {
178
	case "leave":
179
		if len(ctx.Args) < 3 {
180
			return
181
		}
182
		err := ctx.Discord.GuildLeave(ctx.Args[2])
183
		if err != nil {
184
			ctx.Log("Guild", ctx.Guild.ID, fmt.Sprintf("error leaving from guild [%v]: %v", ctx.Args[2], err.Error()))
185
			ctx.ReplyEmbedPM("Guild", fmt.Sprintf("Error leaving from guild [%v]: %v", ctx.Args[2], err.Error()))
186
			return
187
		}
188
		ctx.ReplyEmbedPM("Guild", fmt.Sprintf("Leave from guild: %v", ctx.Args[2]))
189
	case "list":
190
		var selected string
191
		var paged = false
192
		if len(ctx.Args) > 2 && ctx.Args[2] == "id" {
193
			if len(ctx.Args) > 3 {
194
				selected = ctx.Args[3]
195
				paged = true
196
			} else {
197
				selected = "1"
198
			}
199
		} else {
200
			if len(ctx.Args) > 2 {
201
				selected = ctx.Args[2]
202
				paged = true
203
			} else {
204
				selected = "1"
205
			}
206
		}
207
		// calculates count of pages
208
		guilds := ctx.Discord.State.Guilds
209
		pages := 1 + int(len(guilds)/20)
210
		// paginate
211
		var indexTo = 20
212
		if paged {
213
			page, err := strconv.Atoi(selected)
214
			if err == nil {
215
				indexTo = page * 20
216
				indexFrom := indexTo - 20
217
218
				if indexFrom < 0 {
219
					indexFrom = 0
220
				}
221
				if indexTo > len(guilds) {
222
					indexTo = len(guilds) - 1
223
				}
224
				if len(ctx.Args) > 2 && ctx.Args[2] == "id" {
225
					ctx.ReplyEmbed("Guilds", guildsListID(guilds[indexFrom:indexTo], page, pages)+fmt.Sprintf("\nFrom: %v\nTo: %v", indexFrom, indexTo))
226
				} else {
227
					ctx.ReplyEmbed("Guilds", guildsListName(guilds[indexFrom:indexTo], page, pages)+fmt.Sprintf("\nFrom: %v\nTo: %v", indexFrom, indexTo))
228
				}
229
230
			} else {
231
				ctx.ReplyEmbed("Guilds", fmt.Sprintf("Selected: %v\nError: %v", selected, err.Error()))
232
			}
233
234
		} else {
235
			if indexTo > len(guilds) {
236
				indexTo = len(guilds) - 1
237
			}
238
			if len(ctx.Args) > 2 && ctx.Args[2] == "id" {
239
				ctx.ReplyEmbed("Guilds", guildsListID(guilds[:indexTo], 1, 1)+fmt.Sprintf("\nTo: %v", indexTo))
240
			} else {
241
				ctx.ReplyEmbed("Guilds", guildsListName(guilds[:indexTo], 1, 1)+fmt.Sprintf("\nTo: %v", indexTo))
242
			}
243
		}
244
	}
245
}
246
247
func botStations(ctx *bot.Context) {
248
	ctx.MetricsCommand("bot", "stations")
249
	if !ctx.IsAdmin() {
250
		return
251
	}
252
	switch ctx.Args[1] {
253
	case "add":
254
		if len(ctx.Args) > 5 {
255
			name := strings.Join(ctx.Args[5:], " ")
256
			err := ctx.DB.AddRadioStation(name, ctx.Args[3], ctx.Args[4], ctx.Args[2])
257
			if err != nil {
258
				ctx.ReplyEmbed("Stations", "Adding error")
259
			}
260
			ctx.ReplyEmbed("Stations", ctx.Loc("stations_added"))
261
		} else {
262
			ctx.ReplyEmbed("Stations", "Arguments missed")
263
		}
264
	case "remove":
265
		if len(ctx.Args) > 2 {
266
			err := ctx.DB.RemoveRadioStation(ctx.Args[2])
267
			if err != nil {
268
				ctx.ReplyEmbed("Stations", ctx.Loc("stations_removed"))
269
			}
270
		} else {
271
			ctx.ReplyEmbed("Stations", "Arguments missed")
272
		}
273
	}
274
}
275