mirror of
https://github.com/diamondburned/arikawa.git
synced 2025-05-21 14:51:02 +00:00
Fixed the emoji argument
This commit is contained in:
parent
367f445ee9
commit
1642aded0a
10
bot/error.go
10
bot/error.go
|
@ -16,6 +16,10 @@ type ErrUnknownCommand struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (err *ErrUnknownCommand) Error() string {
|
func (err *ErrUnknownCommand) Error() string {
|
||||||
|
return UnknownCommandString(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var UnknownCommandString = func(err *ErrUnknownCommand) string {
|
||||||
var header = "Unknown command: " + err.Prefix
|
var header = "Unknown command: " + err.Prefix
|
||||||
if err.Parent != "" {
|
if err.Parent != "" {
|
||||||
header += err.Parent + " " + err.Command
|
header += err.Parent + " " + err.Command
|
||||||
|
@ -35,10 +39,14 @@ type ErrInvalidUsage struct {
|
||||||
|
|
||||||
// TODO: usage generator?
|
// TODO: usage generator?
|
||||||
// Here, as a reminder
|
// Here, as a reminder
|
||||||
ctx *CommandContext
|
Ctx *CommandContext
|
||||||
}
|
}
|
||||||
|
|
||||||
func (err *ErrInvalidUsage) Error() string {
|
func (err *ErrInvalidUsage) Error() string {
|
||||||
|
return InvalidUsageString(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var InvalidUsageString = func(err *ErrInvalidUsage) string {
|
||||||
if err.Index == 0 {
|
if err.Index == 0 {
|
||||||
return "Invalid usage, error: " + err.Err
|
return "Invalid usage, error: " + err.Err
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package arguments
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"unicode/utf16"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -54,17 +55,9 @@ func (e Emoji) URL() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Emoji) Parse(arg string) error {
|
func (e *Emoji) Parse(arg string) error {
|
||||||
// Check if Unicode
|
// Check if Unicode emoji
|
||||||
var unicode string
|
if stringIsEmojiOnly(arg) {
|
||||||
|
e.ID = arg
|
||||||
for _, r := range arg {
|
|
||||||
if r < '\U0001F600' && r > '\U0001F64F' {
|
|
||||||
unicode += string(r)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if unicode != "" {
|
|
||||||
e.ID = unicode
|
|
||||||
e.Custom = false
|
e.Custom = false
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -83,3 +76,35 @@ func (e *Emoji) Parse(arg string) error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func stringIsEmojiOnly(emoji string) bool {
|
||||||
|
runes := []rune(emoji)
|
||||||
|
// Slice of runes is 2, since some emojis have 2 runes.
|
||||||
|
if len(runes) > 2 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return emojiRune(runes[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
var surrogates = [...][2]rune{ // [0] from, [1] to
|
||||||
|
{utf16.DecodeRune(0xD83C, 0xD000), utf16.DecodeRune(0xD83C, 0xDFFF)},
|
||||||
|
{utf16.DecodeRune(0xD83E, 0xD000), utf16.DecodeRune(0xD83E, 0xDFFF)},
|
||||||
|
{utf16.DecodeRune(0xD83F, 0xD000), utf16.DecodeRune(0xD83F, 0xDFFF)},
|
||||||
|
}
|
||||||
|
|
||||||
|
func emojiRune(r rune) bool {
|
||||||
|
b := r == '\u00a9' || r == '\u00ae' ||
|
||||||
|
(r >= '\u2000' && r <= '\u3300')
|
||||||
|
if b {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, surrogate := range surrogates {
|
||||||
|
if surrogate[0] <= r && r <= surrogate[1] {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
28
bot/extras/arguments/emoji_test.go
Normal file
28
bot/extras/arguments/emoji_test.go
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
package arguments
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestEmojiRune(t *testing.T) {
|
||||||
|
var emojis = []string{
|
||||||
|
"🏑",
|
||||||
|
"❄️",
|
||||||
|
"🤲🏿",
|
||||||
|
}
|
||||||
|
|
||||||
|
var notEmojis = []string{
|
||||||
|
"🏃🏿🏃🏿", // dual emojis
|
||||||
|
"te", // not emoji
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, emoji := range emojis {
|
||||||
|
if !stringIsEmojiOnly(emoji) {
|
||||||
|
t.Fatal(i, "is an emoji, function returned false")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, not := range notEmojis {
|
||||||
|
if stringIsEmojiOnly(not) {
|
||||||
|
t.Fatal(i, "is not an emoji, function returned true")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue