Skip to content

Commit 2bb9bba

Browse files
authored
new preview function
- updated readme with new informations - all settings are now in the first lines from main.go
1 parent a494e98 commit 2bb9bba

2 files changed

Lines changed: 114 additions & 34 deletions

File tree

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ To run this bot, you will need:
1212
- Your own set of Discord credentials to use with the bot (see https://discordapp.com/developers/docs/intro)
1313

1414

15+
## Start
16+
17+
- Open main.go
18+
- Change the settings
19+
20+
1521
## Commands
1622
All commands start with `<<`. Enter parameters after a space (see below for examples).
1723

@@ -35,6 +41,14 @@ All commands start with `<<`. Enter parameters after a space (see below for exam
3541
Example:
3642
`<<NewColor ColorName`
3743

44+
## Auto Kick
45+
When `var AutoKick` is `true`:
46+
47+
All new members will be kicked after 30 minutes if they do not have at
48+
least one additional role (i. e. a role that is not just a color).
49+
This is a fix for discord’s autokick because the bot gives each user a
50+
role, meaning they won’t be kicked automatically.
51+
3852
## Help?
3953

4054
Add me on discord and message me with your problem:

main.go

Lines changed: 100 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,27 @@ import (
1010
"math/rand"
1111
"strings"
1212
"bytes"
13+
_ "image/png"
14+
"image"
15+
"github.com/lucasb-eyer/go-colorful"
16+
"image/draw"
17+
"log"
18+
"image/png"
19+
"strconv"
1320
)
1421

22+
// Settings
1523
var AdminIDs = map[string]string{
1624
"134750562062303232": "Infi",
25+
"YOUR_ID": "YOUR_NAME",
1726
}
1827

19-
var InviteLink = "https://discord.gg/V5vaWwr"
20-
var AutoKick = true
28+
var BotToken = "YOUR_BOT_TOKEN" // Your bot token
29+
var InviteLink = "https://discord.gg/V5vaWwr" // Your invite link
30+
var AutoKick = true // if true: member will get kicked after 30min (README.md for more info)
31+
var SpamChannel = "Channel_ID" // Channel for color image spam
2132

33+
// Stop
2234
var RoleList = map[string]int{
2335
"SpringGreen4": 0x008B45,
2436
"LightSlateBlue": 0x8470FF,
@@ -78,12 +90,60 @@ var HelpText = `Help for Color-Bot
7890
<<NewColor ColorName "Assign the specified color to the current user"
7991
<<PreviewColor ColorName "Assign the specified color to the bot"`
8092

93+
// Create Preview Image
94+
func CreateImageWithColor(ColorInt int, ColorName string) {
95+
DecimalColor := int64(ColorInt)
96+
size := image.Rect(0, 0, 200, 100)
97+
rgbaImage := image.NewRGBA(size)
98+
c, _ := colorful.Hex(fmt.Sprintf("#%s", strconv.FormatInt(DecimalColor, 16)))
99+
draw.Draw(rgbaImage, rgbaImage.Bounds(), &image.Uniform{c}, image.ZP, draw.Src)
100+
101+
f, err := os.Create(fmt.Sprintf("%s.png", ColorName))
102+
if err != nil {
103+
log.Fatal(err)
104+
}
105+
106+
if err := png.Encode(f, rgbaImage); err != nil {
107+
f.Close()
108+
log.Fatal(err)
109+
}
110+
111+
if err := f.Close(); err != nil {
112+
log.Fatal(err)
113+
}
114+
}
115+
116+
func CreateImageEmbed(session *discordgo.Session, ColorName string) discordgo.MessageEmbed {
117+
Embed := discordgo.MessageEmbed{Title: ColorName, Color: RoleList[ColorName]}
118+
FileReader, _ := os.Open(fmt.Sprintf("%s.png", ColorName))
119+
Msg, err := session.ChannelFileSend(SpamChannel, fmt.Sprintf("%s.png", ColorName), FileReader)
120+
if err != nil {
121+
log.Fatal(err)
122+
return Embed
123+
}
124+
Image := discordgo.MessageEmbedImage{URL: Msg.Attachments[0].URL, Height: 100, Width: 200}
125+
Embed.Image = &Image
126+
127+
return Embed
128+
}
129+
130+
func init() {
131+
if BotToken == "YOUR_BOT_TOKEN" {
132+
panic("Default BotToken, pls change the settings in main.go and rebuild.")
133+
} else if SpamChannel == "Channel_ID" {
134+
panic("Default SpamChannel, pls change the settings in main.go and rebuild.")
135+
}
136+
}
137+
138+
// Main
81139
func main() {
140+
rand.Seed(time.Now().UTC().UnixNano())
141+
82142
for key := range RoleList {
83143
RoleNames = append(RoleNames, key)
84144
}
85145

86-
discord, err := discordgo.New("Bot YOUR_TOKEN")
146+
discord, err := discordgo.New(fmt.Sprintf("Bot %s", BotToken))
87147
if err != nil {
88148
fmt.Println("Error creating Discord session: ", err)
89149
return
@@ -133,7 +193,7 @@ func OnMessage(session *discordgo.Session, msg *discordgo.MessageCreate) {
133193

134194
Channel, err := session.State.Channel(msg.ChannelID)
135195
if err != nil {
136-
fmt.Printf("Can't get the channel.")
196+
fmt.Printf("Can't get the channel.\n")
137197
fmt.Printf("Error:\n%s", err)
138198
return
139199
}
@@ -153,31 +213,24 @@ func OnMessage(session *discordgo.Session, msg *discordgo.MessageCreate) {
153213
UpdateMemberColor(session, Channel.GuildID, msg.Author.ID, SplitContent[1])
154214
} else {
155215
UpdateMemberColorRandom(session, Channel.GuildID, msg.Author.ID)
156-
SendMessageAndDeleteAfter(session, msg.ChannelID, "Color not found, pls use <<PrintColors.")
216+
SendMessageAndDeleteAfterTime(session, msg.ChannelID, "Color not found, pls use <<PrintColors.")
157217
}
158218
} else {
159219
UpdateMemberColorRandom(session, Channel.GuildID, msg.Author.ID)
160-
SendMessageAndDeleteAfter(session, msg.ChannelID, "Too many arguments, pls use <<Help.")
220+
SendMessageAndDeleteAfterTime(session, msg.ChannelID, "Too many arguments, pls use <<Help.")
161221
}
162222
session.ChannelMessageDelete(msg.ChannelID, msg.ID)
163223
} else if strings.HasPrefix(msg.Content, "<<PreviewColor") {
164-
err := RemoveColorFromMember(session, Channel.GuildID, session.State.User.ID)
165-
if err {
166-
return
167-
}
168-
169224
SplitContent := strings.Split(msg.Content, " ")
170225
if len(SplitContent) == 2 {
171226
if _, ok := RoleList[SplitContent[1]]; ok {
172-
PreviewRole(session, Channel.GuildID, SplitContent[1])
173-
SendMessageAndDeleteAfter(session, msg.ChannelID, "Color: "+SplitContent[1])
227+
Embed := PreviewRole(session, SplitContent[1])
228+
SendEmbedAndDeleteAfterTime(session, msg.ChannelID, Embed)
174229
} else {
175-
UpdateMemberColorRandom(session, Channel.GuildID, session.State.User.ID)
176-
SendMessageAndDeleteAfter(session, msg.ChannelID, "Color not found, pls use <<PrintColors.")
230+
SendMessageAndDeleteAfterTime(session, msg.ChannelID, "Color not found, pls use <<PrintColors.")
177231
}
178232
} else {
179-
UpdateMemberColorRandom(session, Channel.GuildID, session.State.User.ID)
180-
SendMessageAndDeleteAfter(session, msg.ChannelID, "Too many arguments, pls use <<Help.")
233+
SendMessageAndDeleteAfterTime(session, msg.ChannelID, "Too many arguments, pls use <<Help.")
181234
}
182235
session.ChannelMessageDelete(msg.ChannelID, msg.ID)
183236
} else if strings.HasPrefix(msg.Content, "<<PrintColors") {
@@ -187,13 +240,12 @@ func OnMessage(session *discordgo.Session, msg *discordgo.MessageCreate) {
187240
}
188241
buffer.WriteString("Use `<<PreviewColor ColorName` for a preview.")
189242

190-
SendMessageAndDeleteAfter(session, msg.ChannelID, buffer.String())
243+
SendMessageAndDeleteAfterTime(session, msg.ChannelID, buffer.String())
191244
session.ChannelMessageDelete(msg.ChannelID, msg.ID)
192245
} else if strings.HasPrefix(msg.Content, "<<Help") {
193-
SendMessageAndDeleteAfter(session, msg.ChannelID, HelpText)
246+
SendMessageAndDeleteAfterTime(session, msg.ChannelID, HelpText)
194247
session.ChannelMessageDelete(msg.ChannelID, msg.ID)
195248
}
196-
197249
}
198250

199251
if CheckAdmin(msg.Author.ID) {
@@ -213,7 +265,7 @@ func OnMessage(session *discordgo.Session, msg *discordgo.MessageCreate) {
213265
func OnMemberJoin(session *discordgo.Session, Member *discordgo.GuildMemberAdd) {
214266
UpdateMemberColorRandom(session, Member.GuildID, Member.User.ID)
215267
if AutoKick {
216-
go KickMember(session, Member.GuildID, Member.User.ID)
268+
go KickMemberAfterTime(session, Member.GuildID, Member.User.ID)
217269
}
218270
}
219271

@@ -246,6 +298,7 @@ func MemberChunkRequest(session *discordgo.Session, event *discordgo.GuildMember
246298
func loadRoles(session *discordgo.Session, GuildID string) {
247299
GuildRoles, err := session.GuildRoles(GuildID)
248300
if err != nil {
301+
fmt.Printf("Error: %s\n", err)
249302
panic("Can't find the server.")
250303
}
251304

@@ -276,7 +329,7 @@ func AddAllMembersColor(session *discordgo.Session, GuildID string) {
276329
func RemoveAllColors(session *discordgo.Session, GuildID string) {
277330
GuildRoles, err := session.GuildRoles(GuildID)
278331
if err != nil {
279-
panic("Can't find the server.")
332+
panic("Can't find the server.\n")
280333
}
281334

282335
for _, Role := range GuildRoles {
@@ -291,7 +344,6 @@ func UpdateMemberColor(s *discordgo.Session, GuildID, MemberID, RoleName string)
291344
}
292345

293346
func UpdateMemberColorRandom(s *discordgo.Session, GuildID, MemberID string) {
294-
rand.Seed(time.Now().UTC().UnixNano())
295347
key := rand.Intn(len(RoleList))
296348
s.GuildMemberRoleAdd(GuildID, MemberID, CreatedRoles[GuildID][RoleNames[key]].ID)
297349
}
@@ -323,7 +375,7 @@ func CreateAllRoles(session *discordgo.Session, GuildID string) {
323375
func RemoveColorFromMember(session *discordgo.Session, GuildID, MemberID string) (bool) {
324376
Member, err := session.GuildMember(GuildID, MemberID)
325377
if err != nil {
326-
fmt.Printf("Can't get the guild.")
378+
fmt.Printf("Can't get the guild.\n")
327379
fmt.Printf("Error:\n%s", err)
328380
return true
329381
}
@@ -336,16 +388,19 @@ func RemoveColorFromMember(session *discordgo.Session, GuildID, MemberID string)
336388
return false
337389
}
338390

339-
func PreviewRole(session *discordgo.Session, GuildID, RoleName string) {
340-
session.GuildMemberRoleAdd(GuildID, session.State.User.ID, CreatedRoles[GuildID][RoleName].ID)
391+
func PreviewRole(session *discordgo.Session, RoleName string) discordgo.MessageEmbed {
392+
CreateImageWithColor(RoleList[RoleName], RoleName)
393+
Embed := CreateImageEmbed(session, RoleName)
394+
395+
return Embed
341396
}
342397

343-
func KickMember(session *discordgo.Session, GuildID, MemberID string) {
398+
func KickMemberAfterTime(session *discordgo.Session, GuildID, MemberID string) {
344399
time.Sleep(30 * time.Minute)
345400

346401
Member, err := session.GuildMember(GuildID, MemberID)
347402
if err != nil {
348-
fmt.Printf("Member already leaved.")
403+
fmt.Printf("Member already leaved.\n")
349404
return
350405
}
351406

@@ -364,26 +419,37 @@ func KickMember(session *discordgo.Session, GuildID, MemberID string) {
364419

365420
PrivateChannel, err := session.UserChannelCreate(MemberID)
366421
if err != nil {
367-
fmt.Printf("Can't send the message.")
422+
fmt.Printf("Can't send the message.\n")
368423
fmt.Printf("Error:\n%s", err)
369424
return
370425
}
371426

372427
session.ChannelMessageSend(PrivateChannel.ID, "You got kicked from the server. Please read the welcome channel.\n"+InviteLink)
373428
}
374429

375-
func SendMessageAndDeleteAfter(session *discordgo.Session, ChannelID, Content string) {
430+
func DeleteMessageAfterTime(session *discordgo.Session, Message *discordgo.Message, Time time.Duration) {
431+
time.Sleep(Time * time.Minute)
432+
session.ChannelMessageDelete(Message.ChannelID, Message.ID)
433+
}
434+
435+
func SendMessageAndDeleteAfterTime(session *discordgo.Session, ChannelID, Content string) {
376436
Message, err := session.ChannelMessageSend(ChannelID, Content)
377437
if err != nil {
378-
fmt.Printf("Can't send the message.")
438+
fmt.Printf("Can't send the message.\n")
379439
fmt.Printf("Error:\n%s", err)
380440
return
381441
}
382442

383443
go DeleteMessageAfterTime(session, Message, 5)
384444
}
385445

386-
func DeleteMessageAfterTime(session *discordgo.Session, Message *discordgo.Message, Time time.Duration) {
387-
time.Sleep(Time * time.Minute)
388-
session.ChannelMessageDelete(Message.ChannelID, Message.ID)
446+
func SendEmbedAndDeleteAfterTime(session *discordgo.Session, ChannelID string, Embed discordgo.MessageEmbed) {
447+
Message, err := session.ChannelMessageSendEmbed(ChannelID, &Embed)
448+
if err != nil {
449+
fmt.Printf("Can't send embed.\n")
450+
fmt.Printf("Error:\n%s", err)
451+
return
452+
}
453+
454+
go DeleteMessageAfterTime(session, Message, 5)
389455
}

0 commit comments

Comments
 (0)