package starboard import ( "fmt" "strings" "sync" "time" "github.com/bwmarrin/discordgo" "PermissionGacha/db" "PermissionGacha/modules/config" "PermissionGacha/modules/log" ) const starEmoji = "⭐" var starboardMutex sync.Mutex func ReactListener(s *discordgo.Session, m *discordgo.MessageReactionAdd) { if m.ChannelID == config.StarChannel { return } if m.Emoji.Name != starEmoji { return } messageTimestamp, err := discordgo.SnowflakeTimestamp(m.MessageID) if err != nil { log.Error(s, "listenToStarboardReact", "snowflakeTimestamp", m.MessageID, err) return } if time.Now().Sub(messageTimestamp) > 24*time.Hour { return } starboardMutex.Lock() defer starboardMutex.Unlock() starredBefore, err := db.HasStarredBefore(m.MessageID) if err != nil { log.Error(s, err) return } if starredBefore { return } reacter, err := s.MessageReactions(m.ChannelID, m.MessageID, starEmoji, 5) if err != nil { log.Error(s, "listenToStarboardReact", "messageReactions", m.ChannelID, m.MessageID, err) return } if len(reacter) < 3 { return } msg, err := s.ChannelMessage(m.ChannelID, m.MessageID) if err != nil { log.Error(s, "listenToStarboardReact", "channelMessage", m.ChannelID, m.MessageID, err) return } color := s.State.UserColor(msg.Author.ID, m.ChannelID) if color == 0 { //White as fallback color = 0xFFFFFF } content := msg.Content if len(content) > 1000 { content = content[:1000] } //Up to 10 line splittedContent := strings.SplitN(content, "\n", 11) content = strings.Join(splittedContent[:10], "\n") if len(splittedContent) > 10 || len(content) > 1000 { content += "..." } content += fmt.Sprintf( "\n\n[Original Message](https://discordapp.com/channels/%s/%s/%s)", m.GuildID, m.ChannelID, m.MessageID, ) embed := discordgo.MessageEmbed{ Title: "Starred Message", Description: content, Color: color, Timestamp: messageTimestamp.Format(time.RFC3339), Author: &discordgo.MessageEmbedAuthor{ Name: msg.Author.Username + "#" + msg.Author.Discriminator, IconURL: "https://cdn.discordapp.com/avatars/" + msg.Author.ID + "/" + msg.Author.Avatar + ".png", }, } if len(msg.Attachments) > 0 && msg.Attachments[0] != nil && msg.Attachments[0].Width > 0 { img := msg.Attachments[0] embed.Thumbnail = &discordgo.MessageEmbedThumbnail{ URL: img.URL, ProxyURL: img.ProxyURL, Width: img.Width, Height: img.Height, } } msg, err = s.ChannelMessageSendEmbed(config.StarChannel, &embed) if err != nil { log.Error(s, "listenToStarboardReact", "channelMessageSendEmbed", err) return } err = s.MessageReactionAdd(msg.ChannelID, msg.ID, starEmoji) if err != nil { log.Error(s, "listenToStarboardReact", "messageReactionAdd", err) return } err = db.SetStarred(m.MessageID) if err != nil { log.Error(s, err) return } } func AddReact(s *discordgo.Session, channelID, messageID string) error { return s.MessageReactionAdd(channelID, messageID, starEmoji) }