From 795f396a19fe51284c6196ce43b51c81fc54f243 Mon Sep 17 00:00:00 2001 From: Dusty Pianalto Date: Wed, 3 Jun 2020 21:30:05 -0800 Subject: [PATCH] Add Guild Member Add and Remove handlers --- djpianalto.com/goff/events/member_events.go | 109 +++++++++++++++++++- djpianalto.com/goff/goff.go | 2 + djpianalto.com/goff/utils/date_strings.go | 27 +++++ 3 files changed, 136 insertions(+), 2 deletions(-) diff --git a/djpianalto.com/goff/events/member_events.go b/djpianalto.com/goff/events/member_events.go index 31a35be..ebb5554 100644 --- a/djpianalto.com/goff/events/member_events.go +++ b/djpianalto.com/goff/events/member_events.go @@ -1,7 +1,112 @@ package events -import "github.com/bwmarrin/discordgo" +import ( + "djpianalto.com/goff/djpianalto.com/goff/utils" + "fmt" + "github.com/bwmarrin/discordgo" + "log" + "strconv" + "time" +) -func OnMemberAdd(s *discordgo.Session, event *discordgo.GuildMemberAdd) { +func OnGuildMemberAddLogging(s *discordgo.Session, member *discordgo.GuildMemberAdd) { + defer func() { + if r := recover(); r != nil { + log.Println("Recovered from panic in OnGuildMemberAddLogging", r) + } + }() + var channelID string + row := utils.Database.QueryRow("SELECT logging_channel FROM guilds where id=$1", member.GuildID) + err := row.Scan(&channelID) + if err != nil || channelID == "" { + return + } + guild, err := s.Guild(member.GuildID) + if err != nil { + log.Println(err) + return + } + var title string + if member.User.Bot { + title = "Bot Joined" + } else { + title = "Member Joined" + } + + thumb := &discordgo.MessageEmbedThumbnail{ + URL: member.User.AvatarURL(""), + } + + int64ID, _ := strconv.ParseInt(member.User.ID, 10, 64) + snow := utils.ParseSnowflake(int64ID) + + field := &discordgo.MessageEmbedField{ + Name: "User was created:", + Value: utils.ParseDateString(snow.CreationTime), + Inline: false, + } + + joinTime, _ := member.JoinedAt.Parse() + + embed := &discordgo.MessageEmbed{ + Title: title, + Description: fmt.Sprintf("%v (%v) Has Joined the Server", member.User.Mention(), member.User.ID), + Color: 0x0cc56a, + Thumbnail: thumb, + Footer: &discordgo.MessageEmbedFooter{ + Text: fmt.Sprintf("Current Member Count: %v", guild.MemberCount), + IconURL: guild.IconURL(), + }, + Timestamp: joinTime.Format(time.RFC3339), + Fields: []*discordgo.MessageEmbedField{field}, + } + s.ChannelMessageSendEmbed(channelID, embed) +} + +func OnGuildMemberRemoveLogging(s *discordgo.Session, member *discordgo.GuildMemberRemove) { + defer func() { + if r := recover(); r != nil { + log.Println("Recovered from panic in OnGuildMemberAddLogging", r) + } + }() + timeNow := time.Now() + var channelID string + row := utils.Database.QueryRow("SELECT logging_channel FROM guilds where id=$1", member.GuildID) + err := row.Scan(&channelID) + if err != nil || channelID == "" { + return + } + guild, err := s.Guild(member.GuildID) + if err != nil { + log.Println(err) + return + } + + var title string + if member.User.Bot { + title = "Bot Left" + } else { + title = "Member Left" + } + + thumb := &discordgo.MessageEmbedThumbnail{ + URL: member.User.AvatarURL(""), + } + + joinTime, _ := member.JoinedAt.Parse() + duration := utils.ParseDurationString(timeNow.Sub(joinTime)) + + embed := &discordgo.MessageEmbed{ + Title: title, + Description: fmt.Sprintf("%v (%v) Has Left the Server\nThey were here for %v", member.User.Mention(), member.User.ID, duration), + Color: 0xff9431, + Thumbnail: thumb, + Footer: &discordgo.MessageEmbedFooter{ + Text: fmt.Sprintf("Current Member Count: %v", guild.MemberCount), + IconURL: guild.IconURL(), + }, + Timestamp: timeNow.Format(time.RFC3339), + } + s.ChannelMessageSendEmbed(channelID, embed) } diff --git a/djpianalto.com/goff/goff.go b/djpianalto.com/goff/goff.go index ebea87f..7ff4bfc 100644 --- a/djpianalto.com/goff/goff.go +++ b/djpianalto.com/goff/goff.go @@ -71,6 +71,8 @@ func main() { dg.AddHandler(handler.StatusManager.OnReady) dg.AddHandler(events.OnMessageUpdate) dg.AddHandler(events.OnMessageDelete) + dg.AddHandler(events.OnGuildMemberAddLogging) + dg.AddHandler(events.OnGuildMemberRemoveLogging) err = dg.Open() if err != nil { diff --git a/djpianalto.com/goff/utils/date_strings.go b/djpianalto.com/goff/utils/date_strings.go index bdd37bd..510288d 100644 --- a/djpianalto.com/goff/utils/date_strings.go +++ b/djpianalto.com/goff/utils/date_strings.go @@ -35,3 +35,30 @@ func ParseDateString(inTime time.Time) string { stamp := inTime.Format("2006-01-02 15:04:05") return fmt.Sprintf("%v\n%v", dateString, stamp) } + +func ParseDurationString(inDur time.Duration) string { + s := int64(inDur.Seconds()) + days := s / 86400 + s = s - (days * 86400) + hours := s / 3600 + s = s - (hours * 3600) + minutes := s / 60 + seconds := s - (minutes * 60) + durString := "" + if days != 0 { + durString += fmt.Sprintf("%v days ", days) + } + if hours != 0 { + durString += fmt.Sprintf("%v hours ", hours) + } + if minutes != 0 { + durString += fmt.Sprintf("%v minutes ", minutes) + } + if seconds != 0 { + durString += fmt.Sprintf("%v seconds ", seconds) + } + if durString == "" { + durString = "0 seconds" + } + return fmt.Sprintf("%v", durString) +}