github.com/diamondburned/arikawa/v2@v2.1.0/bot/extras/arguments/emoji.go (about)

     1  package arguments
     2  
     3  import (
     4  	"errors"
     5  	"regexp"
     6  
     7  	"github.com/diamondburned/arikawa/v2/api/rate"
     8  	"github.com/diamondburned/arikawa/v2/discord"
     9  )
    10  
    11  var (
    12  	EmojiRegex = regexp.MustCompile(`<(a?):(.+?):(\d+)>`)
    13  
    14  	ErrInvalidEmoji = errors.New("invalid emoji")
    15  )
    16  
    17  type Emoji struct {
    18  	ID   discord.EmojiID
    19  	Name string
    20  
    21  	Custom   bool
    22  	Animated bool
    23  }
    24  
    25  func (e Emoji) APIString() string {
    26  	if !e.Custom {
    27  		return e.Name
    28  	}
    29  
    30  	return e.Name + ":" + e.ID.String()
    31  }
    32  
    33  func (e Emoji) String() string {
    34  	if !e.Custom {
    35  		return e.Name
    36  	}
    37  
    38  	if e.Animated {
    39  		return "<a:" + e.Name + ":" + e.ID.String() + ">"
    40  	} else {
    41  		return "<:" + e.Name + ":" + e.ID.String() + ">"
    42  	}
    43  }
    44  
    45  func (e Emoji) URL() string {
    46  	if !e.Custom {
    47  		return ""
    48  	}
    49  
    50  	base := "https://cdn.discordapp.com/emojis/" + e.ID.String()
    51  
    52  	if e.Animated {
    53  		return base + ".gif"
    54  	} else {
    55  		return base + ".png"
    56  	}
    57  }
    58  
    59  func (e *Emoji) Usage() string {
    60  	return "emoji"
    61  }
    62  
    63  func (e *Emoji) Parse(arg string) error {
    64  	// Check if Unicode emoji
    65  	if rate.StringIsEmojiOnly(arg) {
    66  		e.Name = arg
    67  		e.Custom = false
    68  
    69  		return nil
    70  	}
    71  
    72  	var matches = EmojiRegex.FindStringSubmatch(arg)
    73  
    74  	if len(matches) != 4 {
    75  		return ErrInvalidEmoji
    76  	}
    77  
    78  	id, err := discord.ParseSnowflake(matches[3])
    79  	if err != nil {
    80  		return err
    81  	}
    82  
    83  	e.Custom = true
    84  	e.Animated = matches[1] == "a"
    85  	e.Name = matches[2]
    86  	e.ID = discord.EmojiID(id)
    87  
    88  	return nil
    89  }