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 }