@@ -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
1523var 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
2234var 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
81139func 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) {
213265func 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
246298func 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) {
276329func 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
293346func 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) {
323375func 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