This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
PermissionGacha/modules/starboard/starboard.go

115 lines
2.7 KiB
Go

package starboard
2019-11-20 08:14:36 +07:00
import (
"fmt"
"strings"
2019-11-20 09:25:18 +07:00
"sync"
2019-11-20 08:14:36 +07:00
"time"
"github.com/bwmarrin/discordgo"
"PermissionGacha/db"
"PermissionGacha/modules/config"
"PermissionGacha/modules/log"
2019-11-20 08:14:36 +07:00
)
const starEmoji = "⭐"
2019-11-20 09:25:18 +07:00
var starboardMutex sync.Mutex
func ReactListener(s *discordgo.Session, m *discordgo.MessageReactionAdd) {
if m.ChannelID == config.StarChannel {
return
}
2019-11-20 08:14:36 +07:00
if m.Emoji.Name != starEmoji {
return
}
messageTimestamp, err := discordgo.SnowflakeTimestamp(m.MessageID)
if err != nil {
log.Error(s, "listenToStarboardReact", "snowflakeTimestamp", m.MessageID, err)
2019-11-20 08:14:36 +07:00
return
}
if time.Now().Sub(messageTimestamp) > 24*time.Hour {
return
}
2019-11-20 09:25:18 +07:00
starboardMutex.Lock()
defer starboardMutex.Unlock()
starredBefore, err := db.HasStarredBefore(m.MessageID)
if err != nil {
log.Error(s, err)
return
}
if starredBefore {
2019-11-20 09:25:18 +07:00
return
}
2019-11-20 08:14:36 +07:00
reacter, err := s.MessageReactions(m.ChannelID, m.MessageID, starEmoji, 5)
if err != nil {
log.Error(s, "listenToStarboardReact", "messageReactions", m.ChannelID, m.MessageID, err)
2019-11-20 08:14:36 +07:00
return
}
2019-11-20 08:25:13 +07:00
if len(reacter) < 3 {
2019-11-20 08:14:36 +07:00
return
}
msg, err := s.ChannelMessage(m.ChannelID, m.MessageID)
if err != nil {
log.Error(s, "listenToStarboardReact", "channelMessage", m.ChannelID, m.MessageID, err)
2019-11-20 08:14:36 +07:00
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,
)
msg, err = s.ChannelMessageSendEmbed(
config.StarChannel,
2019-11-20 08:14:36 +07:00
&discordgo.MessageEmbed{
Title: "Starred Message",
Description: content,
Color: color,
Timestamp: messageTimestamp.Format(time.RFC3339),
2019-11-20 08:14:36 +07:00
Author: &discordgo.MessageEmbedAuthor{
Name: msg.Author.Username + "#" + msg.Author.Discriminator,
IconURL: "https://cdn.discordapp.com/avatars/" + msg.Author.ID + "/" + msg.Author.Avatar + ".png",
},
},
)
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
2019-11-20 08:14:36 +07:00
}
err = db.SetStarred(msg.ID)
2019-11-20 09:25:18 +07:00
if err != nil {
log.Error(s, err)
return
2019-11-20 09:25:18 +07:00
}
}
func AddReact(s *discordgo.Session, channelID, messageID string) error {
return s.MessageReactionAdd(channelID, messageID, starEmoji)
}