280 lines
5.0 KiB
Go
280 lines
5.0 KiB
Go
package discord
|
|
|
|
import "github.com/bwmarrin/discordgo"
|
|
|
|
// Constants for message embed character limits
|
|
const (
|
|
discordEmbedColor = 0x00ff00
|
|
EmbedLimitTitle = 256
|
|
EmbedLimitDescription = 2048
|
|
EmbedLimitFieldValue = 1024
|
|
EmbedLimitFieldName = 256
|
|
EmbedLimitField = 25
|
|
EmbedLimitFooter = 2048
|
|
EmbedLimit = 4000
|
|
)
|
|
|
|
type Embed struct {
|
|
*discordgo.MessageEmbed
|
|
}
|
|
|
|
//NewEmbed returns a new embed object
|
|
func NewEmbed() *Embed {
|
|
return &Embed{&discordgo.MessageEmbed{
|
|
Color: discordEmbedColor,
|
|
}}
|
|
}
|
|
|
|
//SetTitle ...
|
|
func (e *Embed) SetTitle(name string) *Embed {
|
|
e.Title = name
|
|
return e
|
|
}
|
|
|
|
func (e *Embed) SetTimestamp(timestamp string) *Embed {
|
|
e.Timestamp = timestamp
|
|
return e
|
|
}
|
|
|
|
//SetDescription [desc]
|
|
func (e *Embed) SetDescription(description string) *Embed {
|
|
if len(description) > EmbedLimitDescription {
|
|
description = description[:EmbedLimitDescription]
|
|
}
|
|
e.Description = description
|
|
return e
|
|
}
|
|
|
|
//AddField [name] [value]
|
|
func (e *Embed) AddField(name, value string) *Embed {
|
|
if len(value) > EmbedLimitFieldValue {
|
|
value = value[:EmbedLimitFieldValue]
|
|
}
|
|
|
|
if len(name) > EmbedLimitFieldName {
|
|
name = name[:EmbedLimitFieldName]
|
|
}
|
|
|
|
e.Fields = append(e.Fields, &discordgo.MessageEmbedField{
|
|
Name: name,
|
|
Value: value,
|
|
})
|
|
|
|
return e
|
|
|
|
}
|
|
|
|
func (e *Embed) SetFields(fields []*discordgo.MessageEmbedField) *Embed {
|
|
e.Fields = fields
|
|
return e
|
|
|
|
}
|
|
|
|
//SetFooter [Text] [iconURL]
|
|
func (e *Embed) SetFooter(args ...string) *Embed {
|
|
iconURL := ""
|
|
text := ""
|
|
proxyURL := ""
|
|
|
|
switch {
|
|
case len(args) > 2:
|
|
proxyURL = args[2]
|
|
fallthrough
|
|
case len(args) > 1:
|
|
iconURL = args[1]
|
|
fallthrough
|
|
case len(args) > 0:
|
|
text = args[0]
|
|
case len(args) == 0:
|
|
return e
|
|
}
|
|
|
|
e.Footer = &discordgo.MessageEmbedFooter{
|
|
IconURL: iconURL,
|
|
Text: text,
|
|
ProxyIconURL: proxyURL,
|
|
}
|
|
|
|
return e
|
|
}
|
|
|
|
//SetImage ...
|
|
func (e *Embed) SetImage(args ...string) *Embed {
|
|
var URL string
|
|
var proxyURL string
|
|
|
|
if len(args) == 0 {
|
|
return e
|
|
}
|
|
if len(args) > 0 {
|
|
URL = args[0]
|
|
}
|
|
if len(args) > 1 {
|
|
proxyURL = args[1]
|
|
}
|
|
e.Image = &discordgo.MessageEmbedImage{
|
|
URL: URL,
|
|
ProxyURL: proxyURL,
|
|
}
|
|
return e
|
|
}
|
|
|
|
//SetThumbnail ...
|
|
func (e *Embed) SetThumbnail(args ...string) *Embed {
|
|
var URL string
|
|
var proxyURL string
|
|
|
|
if len(args) == 0 {
|
|
return e
|
|
}
|
|
if len(args) > 0 {
|
|
URL = args[0]
|
|
}
|
|
if len(args) > 1 {
|
|
proxyURL = args[1]
|
|
}
|
|
e.Thumbnail = &discordgo.MessageEmbedThumbnail{
|
|
URL: URL,
|
|
ProxyURL: proxyURL,
|
|
}
|
|
return e
|
|
}
|
|
|
|
//SetAuthor ...
|
|
func (e *Embed) SetAuthor(args ...string) *Embed {
|
|
var (
|
|
name string
|
|
iconURL string
|
|
URL string
|
|
proxyURL string
|
|
)
|
|
|
|
if len(args) == 0 {
|
|
return e
|
|
}
|
|
if len(args) > 0 {
|
|
name = args[0]
|
|
}
|
|
if len(args) > 1 {
|
|
iconURL = args[1]
|
|
}
|
|
if len(args) > 2 {
|
|
URL = args[2]
|
|
}
|
|
if len(args) > 3 {
|
|
proxyURL = args[3]
|
|
}
|
|
|
|
e.Author = &discordgo.MessageEmbedAuthor{
|
|
Name: name,
|
|
IconURL: iconURL,
|
|
URL: URL,
|
|
ProxyIconURL: proxyURL,
|
|
}
|
|
|
|
return e
|
|
}
|
|
|
|
//SetURL ...
|
|
func (e *Embed) SetURL(URL string) *Embed {
|
|
e.URL = URL
|
|
return e
|
|
}
|
|
|
|
//SetColor ...
|
|
func (e *Embed) SetColor(clr int) *Embed {
|
|
e.Color = clr
|
|
return e
|
|
}
|
|
|
|
// InlineAllFields sets all fields in the embed to be inline
|
|
func (e *Embed) InlineAllFields() *Embed {
|
|
for _, v := range e.Fields {
|
|
v.Inline = true
|
|
}
|
|
return e
|
|
}
|
|
|
|
// Truncate truncates any embed value over the character limit.
|
|
func (e *Embed) Truncate() *Embed {
|
|
e.TruncateDescription()
|
|
e.TruncateFields()
|
|
e.TruncateFooter()
|
|
e.TruncateTitle()
|
|
return e
|
|
}
|
|
|
|
// TruncateFields truncates fields that are too long
|
|
func (e *Embed) TruncateFields() *Embed {
|
|
if len(e.Fields) > 25 {
|
|
e.Fields = e.Fields[:EmbedLimitField]
|
|
}
|
|
|
|
for _, v := range e.Fields {
|
|
|
|
if len(v.Name) > EmbedLimitFieldName {
|
|
v.Name = v.Name[:EmbedLimitFieldName]
|
|
}
|
|
|
|
if len(v.Value) > EmbedLimitFieldValue {
|
|
v.Value = v.Value[:EmbedLimitFieldValue]
|
|
}
|
|
|
|
}
|
|
return e
|
|
}
|
|
|
|
// TruncateDescription ...
|
|
func (e *Embed) TruncateDescription() *Embed {
|
|
if len(e.Description) > EmbedLimitDescription {
|
|
e.Description = e.Description[:EmbedLimitDescription]
|
|
}
|
|
return e
|
|
}
|
|
|
|
// TruncateTitle ...
|
|
func (e *Embed) TruncateTitle() *Embed {
|
|
if len(e.Title) > EmbedLimitTitle {
|
|
e.Title = e.Title[:EmbedLimitTitle]
|
|
}
|
|
return e
|
|
}
|
|
|
|
// TruncateFooter ...
|
|
func (e *Embed) TruncateFooter() *Embed {
|
|
if e.Footer != nil && len(e.Footer.Text) > EmbedLimitFooter {
|
|
e.Footer.Text = e.Footer.Text[:EmbedLimitFooter]
|
|
}
|
|
return e
|
|
}
|
|
|
|
type EmbedMessage struct {
|
|
Chunks []string
|
|
Index int
|
|
}
|
|
|
|
func (msg *EmbedMessage) Append(m string) {
|
|
if len(msg.Chunks) < msg.Index+1 {
|
|
msg.Chunks = append(msg.Chunks, "")
|
|
}
|
|
|
|
if len(m)+len(msg.Chunks[msg.Index]) > EmbedLimitFieldValue {
|
|
msg.Chunks = append(msg.Chunks, m)
|
|
msg.Index++
|
|
return
|
|
}
|
|
|
|
msg.Chunks[msg.Index] += m
|
|
}
|
|
|
|
func (msg *EmbedMessage) ToMessageEmbedFields() []*discordgo.MessageEmbedField {
|
|
fields := []*discordgo.MessageEmbedField{}
|
|
for _, chunk := range msg.Chunks {
|
|
fields = append(fields, &discordgo.MessageEmbedField{
|
|
Name: "-",
|
|
Value: chunk,
|
|
})
|
|
}
|
|
return fields
|
|
}
|