This repository has been archived on 2022-10-02. You can view files and clone it, but cannot push or open issues or pull requests.
dcbot-old/discord/embed.go

280 lines
5.0 KiB
Go

package discord
import "github.com/bwmarrin/discordgo"
// Constants for message embed character limits
const (
EmbedColor = 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: EmbedColor,
}}
}
//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
}