Skip to content

Instantly share code, notes, and snippets.

@Necroforger
Last active April 6, 2024 02:22
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Necroforger/8b0b70b1a69fa7828b8ad6387ebb3835 to your computer and use it in GitHub Desktop.
Save Necroforger/8b0b70b1a69fa7828b8ad6387ebb3835 to your computer and use it in GitHub Desktop.
Needs a fallthrough
//Embed ...
type Embed struct {
*discordgo.MessageEmbed
}
// Constants for message embed character limits
const (
EmbedLimitTitle = 256
EmbedLimitDescription = 2048
EmbedLimitFieldValue = 1024
EmbedLimitFieldName = 256
EmbedLimitField = 25
EmbedLimitFooter = 2048
EmbedLimit = 4000
)
//NewEmbed returns a new embed object
func NewEmbed() *Embed {
return &Embed{&discordgo.MessageEmbed{}}
}
//SetTitle ...
func (e *Embed) SetTitle(name string) *Embed {
e.Title = name
return e
}
//SetDescription [desc]
func (e *Embed) SetDescription(description string) *Embed {
if len(description) > 2048 {
description = description[:2048]
}
e.Description = description
return e
}
//AddField [name] [value]
func (e *Embed) AddField(name, value string) *Embed {
if len(value) > 1024 {
value = value[:1024]
}
if len(name) > 1024 {
name = name[:1024]
}
e.Fields = append(e.Fields, &discordgo.MessageEmbedField{
Name: name,
Value: value,
})
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
}
@kwiesmueller
Copy link

Is it possible this does not work anymore?
When trying to use the embed I get a type error.

@Necroforger
Copy link
Author

Necroforger commented Jan 30, 2018

You can do

session.ChannelMessageSend(id, embed.MessageEmbed)```

Another way to do it is put MessageEmbed at the bottom of the embed creation chain

embed := NewEmbed().SetTitle("title").SetDescription("Description").MessageEmbed

Then when you use it later it will be of type *discordgo.MessageEmbed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment