diff --git a/.github/workflows/buildx.yml b/.github/workflows/buildx.yml new file mode 100644 index 0000000..9e5cfea --- /dev/null +++ b/.github/workflows/buildx.yml @@ -0,0 +1,62 @@ +name: buildx + +on: + pull_request: + branches: master + + push: + branches: master + tags: + - '*' + +env: + IMAGE_NAME: shanedabes/ircbot + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v1 + + push: + needs: build + + runs-on: ubuntu-latest + if: github.event_name == 'push' + + steps: + - name: Checkout + uses: actions/checkout@v1 + + - name: Set up Docker Buildx + id: buildx + uses: crazy-max/ghaction-docker-buildx@v1 + with: + version: latest + + - name: Login to registry + run: echo "${{ secrets.DOCKER_HUB_PASSWORD }}" | docker login -u shanedabes --password-stdin + + - name: Build and push + run: | + IMAGE_ID=$IMAGE_NAME + + # Strip git ref prefix from version + VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,') + + # Strip "v" prefix from tag name + [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//') + + # Use Docker `latest` tag convention + [ "$VERSION" == "master" ] && VERSION=latest + + echo IMAGE_ID=$IMAGE_ID + echo VERSION=$VERSION + + docker buildx build \ + --push \ + --platform linux/amd64,linux/arm,linux/arm64/v8 \ + --tag ${IMAGE_ID}:${VERSION} \ + --file ./Dockerfile . diff --git a/.gitignore b/.gitignore index f41a41e..1bf2d21 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,5 @@ vendor/ # go build result ircbot + +env diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..275d71f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,3 @@ +## 1.0.0 + +- Initial release diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3802732 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM golang:alpine AS build-env +ADD . /src +RUN cd /src && go build -o gowon + +# final stage +FROM alpine +WORKDIR /app +COPY --from=build-env /src/gowon /app/ +ENTRYPOINT ./gowon diff --git a/docker-compose.yml b/docker-compose.yml index 096cc4c..a918815 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -23,3 +23,8 @@ services: IRC_TENOR_API: "${IRC_TENOR_API}" IRC_LASTFM_API: "${IRC_LASTFM_API}" IRC_TRAKT_API: "${IRC_TRAKT_API}" + IRC_TWITTER_CONSUMER_KEY: "${IRC_TWITTER_CONSUMER_KEY}" + IRC_TWITTER_CONSUMER_SECRET: "${IRC_TWITTER_CONSUMER_SECRET}" + IRC_TWITTER_ACCESS_TOKEN: "${IRC_TWITTER_ACCESS_TOKEN}" + IRC_TWITTER_ACCESS_SECRET: "${IRC_TWITTER_ACCESS_SECRET}" + IRC_REPLIES: "${IRC_REPLIES}" diff --git a/go.mod b/go.mod index 06d89aa..ff1b8c6 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,9 @@ module github.com/shanedabes/ircbot go 1.13 require ( + github.com/dghubble/go-twitter v0.0.0-20190719072343-39e5462e111f + github.com/dghubble/oauth1 v0.6.0 github.com/go-chat-bot/bot v0.0.0-20191201225543-272d0f24a45f github.com/go-chat-bot/plugins v0.0.0-20191201225443-abb8340baed8 + github.com/stretchr/testify v1.4.0 ) diff --git a/go.sum b/go.sum index a4c1d06..258b5ba 100644 --- a/go.sum +++ b/go.sum @@ -7,10 +7,19 @@ github.com/a-h/generate v0.0.0-20190312091541-e59c34d33fb3 h1:Ddgcglj3p+q6QqZ5n4 github.com/a-h/generate v0.0.0-20190312091541-e59c34d33fb3/go.mod h1:traiLYQ0YD7qUMCdjo6/jSaJRPHXniX4HVs+PhEhYpc= github.com/andygrunwald/go-jira v1.5.0/go.mod h1:yNYQrX3nGSrVdcVsM2mWz2pm7tTeDtYfRyVEkc3VUiY= github.com/beevik/guid v0.0.0-20170504223318-d0ea8faecee0/go.mod h1:XzXWuOd1wJ63MtICHh5+PnvCuxsB/d58T8TswEhI/9I= +github.com/cenkalti/backoff v2.1.1+incompatible h1:tKJnvO2kl0zmb/jA5UKAt4VoEVw1qxKWjE/Bpp46npY= +github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudfoundry/gosigar v1.1.0/go.mod h1:3qLfc2GlfmwOx2+ZDaRGH3Y9fwQ0sQeaAleo2GV5pH0= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/detached/gorocket v0.0.0-20170629192631-d44bbd3f26d2/go.mod h1:w5eKhlAkZwY6VBm2Sa1Evdte2+Fqhc+dnSk7/KTN5FM= +github.com/dghubble/go-twitter v0.0.0-20190719072343-39e5462e111f h1:M2wB039zeS1/LZtN/3A7tWyfctiOBL4ty5PURBmDdWU= +github.com/dghubble/go-twitter v0.0.0-20190719072343-39e5462e111f/go.mod h1:xfg4uS5LEzOj8PgZV7SQYRHbG7jPUnelEiaAVJxmhJE= +github.com/dghubble/oauth1 v0.6.0 h1:m1yC01Ohc/eF38jwZ8JUjL1a+XHHXtGQgK+MxQbmSx0= +github.com/dghubble/oauth1 v0.6.0/go.mod h1:8pFdfPkv/jr8mkChVbNVuJ0suiHe278BtWI4Tk1ujxk= +github.com/dghubble/sling v1.3.0 h1:pZHjCJq4zJvc6qVQ5wN1jo5oNZlNE0+8T/h0XeXBUKU= +github.com/dghubble/sling v1.3.0/go.mod h1:XXShWaBWKzNLhu2OxikSNFrlsvowtz4kyRuXUG7oQKY= github.com/fatih/structs v1.0.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/go-chat-bot/bot v0.0.0-20191201225543-272d0f24a45f h1:n5PvkOuo4amEMa6B53nQMdPmqfrcjJDnhThtIh+KSNo= @@ -31,6 +40,7 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -57,6 +67,7 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pyinx/gorocket v0.0.0-20170810024322-78ae1353729f/go.mod h1:nh/AiOs8vRCaqnSOHVzyta23ZLm5ck/st4brrxtQJEo= github.com/robfig/cron/v3 v3.0.0 h1:kQ6Cb7aHOHTSzNVNEhmp8EcWKLb4CbiMW9h9VyIhO4E= @@ -66,6 +77,8 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1 github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog= github.com/thoj/go-ircevent v0.0.0-20180816043103-14f3614f28c3 h1:389FrrKIAlxqQMTscCQ7VH3JAVuxb/pe53v2LBiA7z8= @@ -133,6 +146,7 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/telegram-bot-api.v3 v3.0.0/go.mod h1:WxP4rAHcQNrXhQLGIK9aVLkpygV4Qq8YS3yjjJ/0VLA= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/main.go b/main.go index 1e362d1..797b641 100644 --- a/main.go +++ b/main.go @@ -7,9 +7,14 @@ import ( _ "github.com/go-chat-bot/plugins/url" _ "github.com/shanedabes/ircbot/plugins/checkiday" + _ "github.com/shanedabes/ircbot/plugins/choose" + _ "github.com/shanedabes/ircbot/plugins/clock" + _ "github.com/shanedabes/ircbot/plugins/donger" _ "github.com/shanedabes/ircbot/plugins/lastfm" _ "github.com/shanedabes/ircbot/plugins/tenor" _ "github.com/shanedabes/ircbot/plugins/trakt" + _ "github.com/shanedabes/ircbot/plugins/twitter" + _ "github.com/shanedabes/ircbot/plugins/wikipedia" "strings" ) diff --git a/plugins/checkiday/checkiday.go b/plugins/checkiday/checkiday.go index a09be4f..3bfbdb7 100644 --- a/plugins/checkiday/checkiday.go +++ b/plugins/checkiday/checkiday.go @@ -3,37 +3,43 @@ package checkiday import ( "github.com/go-chat-bot/bot" "github.com/go-chat-bot/plugins/web" - "github.com/shanedabes/ircbot/plugins/formatting" "github.com/shanedabes/ircbot/plugins/irccolours" ) const ( - checkiday_api_url = "https://checkiday.com/api/3/?d" + checkidayAPIURL = "https://checkiday.com/api/3/?d" ) -type daysJson struct { - Holidays []struct { - Name string `json:"name"` - } `json:"holidays"` +type daysJSON struct { + Days []Day `json:"holidays"` } -func (dj daysJson) days() (out []string) { - for _, d := range dj.Holidays { +func (ds daysJSON) List() (out []string) { + for _, d := range ds.Days { out = append(out, d.Name) } return } +// Day represents a single day result from checkiday +type Day struct { + Name string `json:"name"` +} + +func (d Day) String() string { + return d.Name +} + func checkiday(command *bot.Cmd) (msg string, err error) { - data := &daysJson{} - err = web.GetJSON(checkiday_api_url, data) + data := &daysJSON{} + err = web.GetJSON(checkidayAPIURL, data) if err != nil { return "", err } - cl := irccolours.ColouriseList(data.days()) + cl := irccolours.ColouriseList(data.List()) dl := irccolours.FormattedTextToStringList(cl) return formatting.ListToLines(dl, 400), nil } diff --git a/plugins/checkiday/checkiday_test.go b/plugins/checkiday/checkiday_test.go new file mode 100644 index 0000000..cfce6f4 --- /dev/null +++ b/plugins/checkiday/checkiday_test.go @@ -0,0 +1,34 @@ +package checkiday + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +var ( + d1 = Day{ + Name: "test day", + } + + d2 = Day{ + Name: "test day 2", + } + + dj = daysJSON{ + Days: []Day{d1, d2}, + } +) + +func TestDay(t *testing.T) { + assert.Equal(t, d1.String(), "test day") +} + +func TestDays(t *testing.T) { + expected := []string{ + "test day", + "test day 2", + } + + assert.Equal(t, dj.List(), expected) +} diff --git a/plugins/choose/choose.go b/plugins/choose/choose.go new file mode 100644 index 0000000..ec1155d --- /dev/null +++ b/plugins/choose/choose.go @@ -0,0 +1,29 @@ +package choose + +import ( + "math/rand" + "strings" + "time" + + "github.com/go-chat-bot/bot" +) + +func choose(command *bot.Cmd) (msg string, err error) { + args := command.RawArgs + words := strings.Split(args, "/") + + rand.Seed(time.Now().Unix()) + index := rand.Intn(len(words)) + word := words[index] + + return word, nil +} + +func init() { + bot.RegisterCommand( + "choose", + "Choose one from options", + "red lolly/yellow lolly/green lolly", + choose, + ) +} diff --git a/plugins/clock/clock.go b/plugins/clock/clock.go new file mode 100644 index 0000000..6736a06 --- /dev/null +++ b/plugins/clock/clock.go @@ -0,0 +1,33 @@ +package clock + +import ( + "fmt" + "time" + + "github.com/go-chat-bot/bot" +) + +func clock(command *bot.Cmd) (msg string, err error) { + tz := command.RawArgs + + now := time.Now() + + loc, err := time.LoadLocation(tz) + + if err != nil { + return "", err + } + + t := now.In(loc).Format("Jan 1 15:04:05") + + return fmt.Sprintf("%s", t), nil +} + +func init() { + bot.RegisterCommand( + "time", + "Post current time", + "Europe/London", + clock, + ) +} diff --git a/plugins/donger/donger.go b/plugins/donger/donger.go new file mode 100644 index 0000000..4df1821 --- /dev/null +++ b/plugins/donger/donger.go @@ -0,0 +1,60 @@ +package donger + +import ( + "fmt" + "math/rand" + "strings" + "time" + + "github.com/go-chat-bot/bot" +) + +type dongers map[string][]string + +func (d dongers) randomCat(r *rand.Rand) string { + keys := make([]string, len(d)) + + i := 0 + for k := range d { + keys[i] = k + i++ + } + + return keys[r.Intn(len(keys))] +} + +func (d *dongers) random(r *rand.Rand) string { + cat := d.randomCat(r) + return d.randomFromCat(r, cat) +} + +func (d dongers) randomFromCat(r *rand.Rand, cat string) string { + if _, prs := d[cat]; prs == false { + return fmt.Sprintf("No %s category", cat) + } + + ri := r.Intn(len(d[cat])) + + return d[cat][ri] +} + +func dongerGet(command *bot.Cmd) (msg string, err error) { + args := command.RawArgs + r := rand.New(rand.NewSource(time.Now().UnixNano())) + + if len(args) > 0 { + cat := strings.Split(args, " ")[0] + return dongerCollection.randomFromCat(r, cat), nil + } + + return dongerCollection.random(r), nil +} + +func init() { + bot.RegisterCommand( + "donger", + "Post a random donger", + "angry", + dongerGet, + ) +} diff --git a/plugins/donger/donger_test.go b/plugins/donger/donger_test.go new file mode 100644 index 0000000..a2aa6bb --- /dev/null +++ b/plugins/donger/donger_test.go @@ -0,0 +1,51 @@ +package donger + +import ( + "math/rand" + "testing" + + "github.com/stretchr/testify/assert" +) + +var tdc = dongers{ + "c1": []string{ + "d1", + "d2", + }, + "c2": []string{ + "d3", + "d4", + }, +} + +type fakeRandSource struct{} + +func (f fakeRandSource) Int63() int64 { + return 1 +} + +func (f fakeRandSource) Seed(seed int64) {} + +func TestDongerRandomCat(t *testing.T) { + r := rand.New(fakeRandSource{}) + + assert.Equal(t, tdc.randomCat(r), "c1") +} + +func TestDongerRandom(t *testing.T) { + r := rand.New(fakeRandSource{}) + + assert.Equal(t, tdc.random(r), "d1") +} + +func TestDongerRandomFromCat(t *testing.T) { + r := rand.New(fakeRandSource{}) + + assert.Equal(t, tdc.randomFromCat(r, "c2"), "d3") +} + +func TestDongerRandomFromCatError(t *testing.T) { + r := rand.New(fakeRandSource{}) + + assert.Equal(t, tdc.randomFromCat(r, "c3"), "No c3 category") +} diff --git a/plugins/donger/donger_update.py b/plugins/donger/donger_update.py new file mode 100755 index 0000000..a58e505 --- /dev/null +++ b/plugins/donger/donger_update.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python + +import urllib.request +import json + +DONGER_URL_TMPL = ( + "http://dongerlist.com/wp-json/wp/v2/posts?per_page=100&page={page_no}" +) +PAGE_COUNT = 12 +DONGER_CAT_URL_TMPL = ( + "http://dongerlist.com/wp-json/wp/v2/categories?per_page=100&page={page_no}" +) +CAT_PAGE_COUNT = 2 + + +def get_page(tmpl, page_no): + url = tmpl.format(page_no=page_no) + r = urllib.request.urlopen(url).read() + + return r + + +def page_to_json(page): + j = json.loads(page) + + def e(donger, categories): + return { + "donger": donger, + "categories": categories + } + + return [e(i["title"]["rendered"], i["categories"]) for i in j] + + +def cat_page_to_json(page): + j = json.loads(page) + + return {i["id"]: i["name"].lower() for i in j} + + +def donger_name_categories(donger, categories): + categories_named = [categories[i] for i in donger["categories"]] + + donger["categories"] = categories_named + return donger + + +def main(): + print("package donger") + print() + print("var dongerCollection = dongers{") + + pages = [get_page(DONGER_URL_TMPL, i) for i in range(1, PAGE_COUNT+1)] + dongers = [i for s in pages for i in page_to_json(s)] + + cat_pages = [get_page(DONGER_CAT_URL_TMPL, i) for i in range(1, CAT_PAGE_COUNT+1)] + cats = {k: v for p in cat_pages for k, v in cat_page_to_json(p).items()} + + dongers2 = [donger_name_categories(d, cats) for d in dongers] + + donger_cats = {c: [d["donger"] for d in dongers2 if c in d["categories"]] for c in cats.values()} + + for k in donger_cats: + print(' "{}": []string{{'.format(k)) + for d in donger_cats[k]: + print(u' "{}",'.format(d)) + print(' },') + + print("}") + + +if __name__ == "__main__": + main() diff --git a/plugins/donger/list.go b/plugins/donger/list.go new file mode 100644 index 0000000..7ecc86e --- /dev/null +++ b/plugins/donger/list.go @@ -0,0 +1,2690 @@ +package donger + +var dongerCollection = dongers{ + "420": []string{ + "(ヾノ•᷅ ༬•᷄ )", + }, + "able": []string{}, + "accessories": []string{ + "♞▀▄▀▄♝▀▄", + "╾━╤デ╦︻", + "▄︻̷̿┻̿═━一", + "︻╦̵̵͇̿̿̿̿══╤─", + "❚█══█❚", + }, + "ameno": []string{ + "⊂(▀¯▀⊂)", + "(⊃・ᴥ・)つ", + "༼つ ◕_◕ ༽つ", + "(⊹つ•۝•⊹)つ", + "(つ☯ᗜ☯)つ", + "(っ-̶●̃益●̶̃)っ", + "(つ°ヮ°)つ", + "(つ◉益◉)つ", + "(> ^_^ )>", + "༼つಠ益ಠ༽つ ─=≡ΣO))", + "(⊃✖ 〰 ✖)⊃", + "(つಠ_ʖಠ)つ", + "༼ つ ˵ ╥ ͟ʖ ╥ ˵༽つ", + "༼つ◔益◔༽つ", + "(つ ¯͒ ʖ̯ ¯͒ )つ", + "༼ つ ಠ₍₍ළ₎₎ಠ༽つ", + "(つ▀¯▀)つ", + "(つ ͡° ͜ʖ ͡°)つ", + "(⊃ • ʖ̫ • )⊃", + "༽つ۞﹏۞༼つ", + "⁞ つ: •̀ ⌂ •́ : ⁞つ", + "( ੭눈 _ 눈 )੭", + "╏つ” ⊡ 〜 ⊡ ” ╏つ", + "ʕ ⊃・ ◡ ・ ʔ⊃", + "c(ˊᗜˋ*c)", + "༼⊃ •́ ヮ •̀ ༽⊃", + "(⊃。•́‿•̀。)⊃", + "༼つ . •́ _ʖ •̀ . ༽つ", + "༼つ ் ▽ ் ༽つ", + "╏つ ͜ಠ ‸ ͜ಠ ╏つ", + "⊂(´・◡・⊂ )∘˚˳°", + "༼ つ ̥◕͙_̙◕͖ ͓༽つ", + "༼ つ ◕o◕ ༽つ", + "༼ つ ͡ ͡° ͜ ʖ ͡ ͡° ༽つ", + "(っಠ‿ಠ)っ", + "༼ つ ◕_◕ ༽つ", + "ʕっ•ᴥ•ʔっ", + "༼ つ ▀̿_▀̿ ༽つ", + "༼ノ ◉ ͜ ◉ ༽つ", + "( つ★ل͜ ★)つ", + }, + "angry": []string{ + "ʕ ᓀ ᴥ ᓂ ʔ", + "¯_| ಠ ∧ ಠ |_/¯", + "⋌༼ •̀ ⌂ •́ ༽⋋", + "୧( ಠ Д ಠ )୨", + "┌( ◕ 益 ◕ )ᓄ", + "╚═| ~ ಠ ₒ ಠ ~ |═╝", + "╭∩╮༼☯۝☯༽╭∩╮", + "╰༼ ⋋ ‸ ⋌ ༽╯", + "╭∩╮(ಠ۝ಠ)╭∩╮", + "凸( •̀_•́ )凸", + "╰[✿•̀o•́✿]╯", + "╰༼ •̀۝•́ ༽╯", + "໒( •̀ ╭ ͟ʖ╮ •́ )७", + "乁ʕ •̀ ۝ •́ ʔㄏ", + "(っ-̶●̃益●̶̃)っ", + "ᕕ(˵•̀෴•́˵)ᕗ", + "ლ( ¤ 益 ¤ )┐", + "c╏ ಡ д ಡ ╏୨", + "୧( ͡ᵔ 益 ͡ᵔ )୨", + "༼ •̀ ₒ •́ ༽", + "(つ◉益◉)つ", + "ᕕ༼✿•̀︿•́༽ᕗ", + "୧༼ಠ益ಠ╭∩╮༽", + "─=≡Σ(((༼つಠ益ಠ༽つ", + "ლ(ಠ益ಠლ)", + "┻━┻ ヘ╰( •̀ε•́ ╰)", + "~~~~~~~[]=¤ԅ( ◔益◔ )ᕗ", + "/( .□.) ︵╰(゜益゜)╯︵ /(.□. /)", + "乁║ ˙ 益 ˙ ║ㄏ", + "凸( •̀ 3 •́ )凸", + "ᕦ໒( ⊡ 益 ⊡ )७ᕤ", + "[ : • 益 • : ]", + "╰[ ° 益 ° ]╯", + "( ▀ 益 ▀ )", + "(╬ ಠ益ಠ)", + "ᕦ໒( ᴼ 益 ᴼ )७ᕤ", + "⁞ つ: •̀ ⌂ •́ : ⁞-︻╦̵̵͇̿̿̿̿══╤─", + "໒( ˵ ° ۝ ° ˵ )७", + "║ * ರ Ĺ̯ ರ * ║", + "╰༼=ಠਊಠ=༽╯", + "༼ง=ಠ益ಠ=༽ง", + "୧ʕ•̀ᴥ•́ʔ୨", + "╚▒ᓀ▃ᓂ▒╝", + "ᕕ⁞ ್ ۝ ್ ⁞┘", + "▐ ᓀ (oo) ᓂ ▐", + "╰໒( = ◕ ◯ ◕ = )७╯", + "໒( : ͡☉ 〰 ͡☉ : )७", + "o͡͡͡╮⁞ ˵ ᓀ ︿ ᓂ ˵ ⁞╭o͡͡͡", + "⋋╏ ᓀ 〜 ᓂ ╏⋌", + "໒( ˵☉ ͟ʖ ☉˵ )७", + "ლ(ಠ益ಠ)ლ", + "୧༼ ͡◕ д ◕͡ ༽୨", + "(╯°□°)╯︵ ( . 0 .)", + "ლ( `Д’ ლ)", + "╰| ⁰ ෴ ⁰ |╯", + "୧⁞ ˵ ・ 益 ・ ˵ ⁞୨", + "༼ ˵ ❛ 益 ❛ ˵ ༽", + "༼ , ﹒︣ o ﹒︣ , ༽", + "[ ಠ □ ಠೃ ]", + "[ ಠ (oo) ಠ ]", + "༼ ಠ ▃ ಠೃ ༽", + "༼ ∗ •̀ (oo) •́ ∗ ༽", + "c༼ ” ͡° ▃ °͡ ” ༽ᕤ", + "໒( ˵ •̀ □ •́ ˵ )७", + "ʕ •̀ o •́ ʔ", + "へʕ ∗ ´ ۝ ´ ∗ ʔ┘", + "┌໒( : ͡° д °͡ : )७┐", + "┌∩┐(ಠ_ಠ)┌∩┐", + "(ヾノ•᷅ ༬•᷄ )", + "ฅ⁽͑ ˚̀ ˙̭ ˚́ ⁾̉ฅ", + "(۶ૈ ᵒ̌ Дᵒ̌)۶ૈ=͟͟͞͞ ⌨", + "ヽ(ಠ▃ಠ)ノ", + "ಠ⌣ಠ", + "┬─┬ノ(ಠ_ಠノ)", + "ヽ(`Д´)ノ", + "(╯°□°)╯︵( .o.)", + "(╯°Д°)╯︵/(.□ . )", + "┻━┻ ︵ヽ(`Д´)ノ︵ ┻━┻", + }, + "animal": []string{ + "ᕙ(˵ ಠ ਊ ಠ ˵)ᕗ", + "╰( ⁰ ਊ ⁰ )━☆゚.*・。゚", + "ʕ ᓀ ᴥ ᓂ ʔ", + "ᕙᓄ(☉ਊ☉)ᓄᕗ", + "ᕦ⁞ ✿ ᵒ̌ ᴥ ᵒ̌ ✿ ⁞ᕤ", + "٩ʕ◕౪◕ʔو", + "(V●ᴥ●V)", + "@( ◕ x ◕ )@", + "┌( •́ ਊ •̀ )┐", + "(╭ರᴥ•́)", + "ᕙʕಠᴥಠʔᕗ", + "ʕ ・ Д ・ ʔ", + "(つ•̀ᴥ•́)つ*:・゚✧", + "ʕ⊙ᴥ⊙ʔ", + "(⊃・ᴥ・)つ", + "(^ ◕ᴥ◕ ^)", + "(ᕗ ͠° ਊ ͠° )ᕗ", + "༼( ͡⊙ ਊ ͡⊙)༽", + "ᕦ( ヘ (oo) ヘ )ᕤ", + "乁ʕ •̀ ۝ •́ ʔㄏ", + "(∩◕(oo)◕∩ )", + "[ ᕤ ಠ (oo) ಠ ]ᕤ ︵┻━┻", + "ʕ – (oo) – ʔ", + "ᕦʕ ՞ ౪ ՞ ʔᕤ", + "乁໒( ͡◕ ᴥ ◕͡ )७ㄏ", + "ʕ ◕ ▃ ◕ ʔ", + "ʕ◉ᴥ◉ʔ", + "(◕ᴥ◕)", + "╰໒(◉ᴥ◉)७╯", + "ʕ ಡ ﹏ ಡ ʔ⊃―{}@{}@{}-", + "ლ[ಠ(oo)ಠ]ლ", + "ʕノ•ᴥ•ʔノ ︵ ┻━┻", + "ʕ◕‿◕ʔ /", + "╭∩╮ʕ ◉ ﹏ ◉ ʔ╭∩╮", + "ᕙ༼◕◞౪◟◕༽ᕗ", + "╰( ◕ ^ ◕ )╯", + "੧〳 ˵ ಠ ᴥ ಠ ˵ 〵ノ⌒.", + "ᕦʕ ° o ° ʔᕤ", + "໒( ͒ ౪ ͒ )७", + "ʕ ͡°̲ (oo) ͡°̲ ʔ", + "ᕙ(◕ਊ◕)ᕗ", + "ᕦʕ . ☯ ᴥ ☯ . ʔᕤ", + "୧╏ ~ ᴥ ~ ╏୨", + "╏ ◯ ᴥ ◯ ╏", + "⋋〳 ・ ਊ ・ 〵⋌", + "ᕙʕ ◖ ڡ ◗ ʔᕗ", + "┌ʕ º ʖ̯ º ʔ┐", + "ᕕ〳 ் (oo) ் 〵╯", + "| ~  ̄ (oo)  ̄ ~ |", + "ʕ ☉ (oo) ☉ ʔ", + "໒( ◔ ω ◔ )७", + "ʕ ᵒ̌ ‸ ᵒ̌ ʔ", + "ᕙ໒(˵ ̄ᴥ ̄˵)७ᕗ", + "⊂(ο・㉨・ο)⊃", + "乁[ᓀ˵▾˵ᓂ]ㄏ", + "╭(◕◕ ◉෴◉ ◕◕)╮", + "୧ʕ•̀ᴥ•́ʔ୨", + "໒( ⊚ (oo) ⊚ )७", + "ʕ ಡ ﹏ ಡ ʔ", + "▐ ᓀ (oo) ᓂ ▐", + "⋋( ◕ ∧ ◕ )⋌", + "། ~ ◕ (oo) ◕ ~ །", + "ʕ ⊃・ ◡ ・ ʔ⊃︵┻━┻", + "ᕙʕ ◐ ﹏ ◐ ʔᕗ", + "| ˵ ・ (oo) ・ ˵ |", + "ᕦ( ~ ◔ ᴥ ◔ ~ )੭━☆゚.*・。゚", + "໒( ◕ (oo) ◕ )७", + "ʕ ﹒︣ ᴥ ﹒︣ ʔ", + "໒( ~ ◔ ᴥ ◔ ~ )७", + "ʕ ˵ ๑ _ ๑ ˵ ʔ", + "૮( ᵒ̌皿ᵒ̌ )ა", + "(҂ ˘ _ ˘ )", + "ʕ ⊃・ ◡ ・ ʔ⊃", + "ᕦ[ ◔ (oo) ◔ ]ᕤ", + "༼ ・ ౪ ・ ༽", + "ʕ ﹒ ᴥ ﹒ ʔ", + "ʕ ∗ •́ ڡ •̀ ∗ ʔ", + "୧ʕ ⇀ ⌂ ↼ ʔ୨", + "[ ಠ □ ಠೃ ]", + "╰໒( ͡ຈ ᴥ ຈ͡ )७╯", + "[ ಠ (oo) ಠ ]", + "༼ ∗ •̀ (oo) •́ ∗ ༽", + "ʕ •̀ o •́ ʔ", + "へʕ ∗ ´ ۝ ´ ∗ ʔ┘", + "(❍ᴥ❍ʋ)", + "༼☉ɷ⊙༽", + "óÔÔò ʕ·͡ᴥ·ʔ óÔÔò", + "ᗧ͇̿ · · ᗣ͇̿ᗣ͇̿ᗣ͇̿ᗣ͇̿", + "╭∩╮ʕ•ᴥ•ʔ╭∩╮", + "┬┴┬┴┤・ω・)ノ├┬┴┬┴", + "くコ:彡", + "^ↀᴥↀ^", + "ヘ( ̄ω ̄ヘ)", + "(づ。◕‿‿◕。)づ", + "⁝⁞⁝⁞ʕु•̫͡•ʔु☂⁝⁞⁝⁝", + "ฅ⁽͑ ˚̀ ˙̭ ˚́ ⁾̉ฅ", + "⊹⋛⋋( ՞ਊ ՞)⋌⋚⊹", + "(.﹒︣︿﹒︣.)", + "(˵¯͒〰¯͒˵)", + "( ͡°ᴥ ͡° ʋ)", + "ヽ(´・ω・`)ノ", + "└(◉◞౪◟◉)┘", + "へ(¬ϖ¬)へ", + "(ノ ̿ ̿ᴥ ̿ ̿)ノ", + "(╯・ิ-・ิ)╯", + "(_/¯◜ ω ◝)_/¯", + "ʕ•̫͡•ʕ̫͡ʕ•͓͡•ʔ-̫͡-ʕ•̫͡•ʔ̫͡ʔ-̫͡-ʔ", + "ʕง•ᴥ•ʔง", + "ʕっ•ᴥ•ʔっ", + "( ◔ ౪◔)", + "(╯°□°)ຈ҉̛༽̨҉҉ノ̨", + "୧༼ ͡◉ᴥ ͡◉༽୨", + "ᕙ༼◕ ᴥ ◕༽ᕗ", + "୧༼◕ ᴥ ◕༽୨", + "༼ ༽ ლ(́◉◞౪◟◉‵ლ)", + "乁( ◔ ౪◔)ㄏ", + "(=^-ω-^=)", + "ლ(́◉◞౪◟◉‵ლ)", + }, + "anime": []string{ + "| (• ◡ •) |", + "(╬ ಠ益ಠ)", + "(҂ ˘ _ ˘ )", + }, + "brick": []string{ + "╏ ” ⊚ ͟ʖ ⊚ ” ╏", + "░ ∗ ◕ ں ◕ ∗ ░", + "╚═▐ ۞ ~ ۞ ▐═╝", + "┌། ≖ Ĺ̯ ≖ །┐", + "o͡͡͡╮། ❛ั ╭ ͟ʖ╮ ❛ั །╭o͡͡͡", + "╏ •́ – •̀ ╏", + "ᕦ╏ ¬ ʖ̯ ¬ ╏ᕤ", + "o͡͡͡╮╏ ◕ ◡ ◕ ╏╭o͡͡͡", + "୧╏ ՞ _ ՞ ╏୨", + "⋋╏ ۞ ڡ ۞ ╏⋌", + "╏ ° ▃ ° ╏", + "╏ ◯ ᴥ ◯ ╏", + "╏ . ^ Ĺ̯ ^ . ╏", + "┴┬┴┤・_・├┴┬┴", + "╏ : ◉ ∧ ◉ : ╏", + "└╏ ・ ᗜ ・ ╏┐", + "c:::::::::::::[]=¤ԅ╏ ˵ ⊚ ◡ ⊚ ˵ ╏┐", + "╏ ˵ ・ ͟ʖ ・ ˵ ╏", + "┌╏✖_✖╏┘", + "┌╏ •́ – •̀ ╏┐", + "╰╏ ・ ᗜ ・ ╏╯", + "⋋╏ ᓀ 〜 ᓂ ╏⋌", + "╏ ◔ _̀ ◔ ╏", + "ᕕ╏ ^ ◡ ^ ╏ᓄ", + "╏つ” ⊡ 〜 ⊡ ” ╏つ", + "ԅ╏ ˵ ⊚ ◡ ⊚ ˵ ╏┐", + "ᕕ╏ ͡ᵔ ‸ ͡ᵔ ╏凸", + "ᕕ╏ ͡ ▾ ͡ ╏┐", + "╏つ ͜ಠ ‸ ͜ಠ ╏つ", + "ᕙ╏ : ◑ ڡ ◑ : ╏ᕗ", + }, + "charge": []string{ + "ᕕ〳 ் (oo) ் 〵╯", + }, + "checked": []string{}, + "cited": []string{}, + "cloud": []string{}, + "confused": []string{ + "(O ʖ O)", + "(ºل͟º)", + "༼ ⨀ ̿Ĺ̯̿̿⨀ ̿༽ง", + }, + "cool": []string{ + "⊂(▀¯▀⊂)", + "┬┴┬┴┤ᕦ( ▀̿ Ĺ̯ ▀̿├┬┴┬", + "ᕕ(⌐■_■)ᕗ ♪♬", + "━╤デ╦︻(▀̿̿Ĺ̯̿̿▀̿ ̿)", + "┌༼▀̿ Ĺ̯▀̿༽┐", + "(つ▀¯▀)つ", + "( ▀ 益 ▀ )", + "¯_໒( ” ▀ ﹏ ▀ ” )७_/¯", + "༼⌐■ل͟■༽", + "┌(▀Ĺ̯▀)┐", + "(⌐■_■)–︻╦╤─", + "ヽ(⌐■_■)ノ♪♬", + "┌(▀Ĺ̯ ▀-͠ )┐", + "(⌐ ͡■ ͜ʖ ͡■)", + "( ͡° ͜ʖ ͡°)>⌐■-■", + "༼⌐■ل͜■༽", + "༼ ຈل͜ຈ༽ノ⌐■-■", + "ლ(▀̿̿Ĺ̯̿̿▀̿ლ)", + "ᕙ(▀̿̿Ĺ̯̿̿▀̿ ̿) ᕗ", + "༼ つ ▀̿_▀̿ ༽つ", + "ᕦ(▀̿ ̿ -▀̿ ̿ )つ├┬┴┬┴", + "ヽ༼ ຈل͜ຈ༼ ▀̿̿Ĺ̯̿̿▀̿ ̿༽Ɵ͆ل͜Ɵ͆ ༽ノ", + "┬━┬ノ(▀̿̿Ĺ̯̿̿▀̿ ̿ノ)", + "( •_•)>⌐■-■", + }, + "cracker": []string{ + "ᕙ╏✖۝✖╏⊃-(===>", + "ᕦ╏ ʘ̆ ‸ ʘ̆ ╏ᕤ", + "¯_╏ ՞ ︿ ՞ ╏_/¯", + "ᕙ⁞ = 〰 = ⁞ᕗ", + "o͡͡͡╮⁞ ^ ▃ ^ ⁞╭o͡͡͡", + "ヽ⁞ ~ ◉ – ◉ ~ ⁞و", + "╏ ˵ ✪ ﹏ ✪ ˵ ╏", + "ᕦ⁞ ∗ ❛ั ◯ ❛ั ∗ ⁞ᕤ", + "ᕕ⁞ ᵒ̌ 〜 ᵒ̌ ⁞ᕗ", + "⁞ つ: •̀ ⌂ •́ : ⁞-︻╦̵̵͇̿̿̿̿══╤─", + "⁞ つ: •̀ ⌂ •́ : ⁞つ", + "ᕙ⁞ : •̀ ⌂ •́ : ⁞ᕗ", + }, + "crazy": []string{ + "o͡͡͡╮༼ ʘ̆ ۝ ʘ̆ ༽╭o͡͡͡", + "ლ( ◕ 益 ◕ ) ლ", + "༽つ۞﹏۞༼つ ─=≡ΣO))", + "c໒( ◐ ﹏ ◐ )७੭", + "┌໒( : ͡° д °͡ : )७┐", + "(๑•॒̀ ູ॒•́๑)", + "凸(⊙▂⊙✖ )", + "└(◉◞౪◟◉)┘", + "ᕦ⊙෴⊙ᕤ", + "ᕙ( ͡◉ ͜ ʖ ͡◉)ᕗ", + "ᕦ༼✩ل͜✩༽ᕤ", + "(ง ͡ʘ ͜ʖ ͡ʘ)ง", + "(́ง◉◞౪◟◉‵)ง", + "ヽ(ಠ▃ಠ)ノ", + "ヽ༼◐ل͜◑༽ノ", + "༼ノ ◉ ͜ ◉ ༽つ", + "୧༼ ͡◉ᴥ ͡◉༽୨", + "(ʘ͡ ʖ͜ ʘ͡ ง)", + "ʘ ͜ʖ ʘ", + "༼ ༽ ლ(́◉◞౪◟◉‵ლ)", + "(◕ل͜◕)", + "(つ☢益☢)つ︵┻━┻", + "ヽ(`Д´)ノ", + "(ノಠ益ಠ)ノ彡┻━┻", + "ლ(́◉◞౪◟◉‵ლ)", + }, + "cry": []string{ + "( ͡↑ ͜ʖ ͡↑)", + "┻┻︵⁞=༎ຶ﹏༎ຶ=⁞︵┻┻", + "ლ(ಥ Д ಥ )ლ", + "└༼ ಥ ᗜ ಥ ༽┘", + "┌(˵༎ຶ ل͟ ༎ຶ˵)┐", + "ᕕ( ཀ ʖ̯ ཀ)ᕗ", + "c╏ ಡ д ಡ ╏୨", + "ᕕ〳 ཀ 益 ཀ 〵ง", + "( * ಥ ⌂ ಥ * )", + "〳 ‾́ ﹏ ‾́ 〵", + "ᕕ(ಥʖ̯ಥ)ᕗ", + "(ಥ_ʖಥ)", + "ʕ ಡ ﹏ ಡ ʔ⊃―{}@{}@{}-", + "༼ つ ˵ ╥ ͟ʖ ╥ ˵༽つ", + "ヽ༼ಢ_ಢ༽ノ☂", + "ԅ[ * ༎ຶ _ ༎ຶ * ]┐", + "༼ ╥ ل ╥ ༽", + "c〳 ݓ ﹏ ݓ 〵੭", + "୧| ͡ᵔ ﹏ ͡ᵔ |୨", + "ヽ༼ಢ_ಢ༽ノ", + "໒( ͡; 益 ͡; )७┌∩┐", + "c( ˵ ╥ ͟ʖ ╥ ˵ )੭", + "੧║ ☯ ⌂ ☯ ║┐", + "(⋟﹏⋞)", + "ᗜੂͦ﹏ᗜੂͦ", + "(ಥ﹏ಥ)", + ".·´¯`(>▂", + "(ू˃̣̣̣̣̣̣︿˂̣̣̣̣̣̣ ू)", + "( ཀ͝ ∧ ཀ͝ )", + "(;´༎ຶД༎ຶ`)", + "༼;´༎ຶ ۝ ༎ຶ༽", + "༼ ಥل͟ಥ ༽", + "༼つ☯﹏☯༽つ", + "༼☯﹏☯༽", + "ヽ(`Д´)ノ", + }, + "crying": []string{}, + "curious": []string{ + "໒( ◑ w ◑ )७", + "੧║ ” ◔ Ĺ̯ ◔ ” ║و", + }, + "cut": []string{ + "(✿ ◕‿◕) ᓄ✂╰U╯", + "( ͡° ͜ʖ ͡°)=ε✄", + }, + "cute": []string{ + "(✿ ◕‿◕) ᓄ✂╰U╯", + "ლ(~•̀︿•́~)つ︻̷┻̿═━一", + "ᕕ( ՞ ᗜ ՞ )ᕗ", + "(◕⌂◕⊃⊃)", + "໒( , ⊙ – ⊙ , )७", + "☆*:. o(≧▽≦)o .:*☆", + "ʕ ᓀ ᴥ ᓂ ʔ", + "(V●ᴥ●V)", + "୧[ * ಡ ▽ ಡ * ]୨", + "ᕙ[ ͒ ﹏ ͒ ]ᕗ", + "(⁰ ◕〜◕ ⁰)", + "(∩╹□╹∩)", + "╰[ ⁰﹏⁰ ]╯", + "s( ^ ‿ ^)-b", + "s( ^ ‸ ^)-p", + "@( ◕ x ◕ )@", + "ᕙ( ~ . ~ )ᕗ", + "┌( •́ ਊ •̀ )┐", + "〳 •́ ﹏ •̀ 〵", + "c( ⁰ 〰 ⁰ )੭", + "ლ ( ◕ ᗜ ◕ ) ლ", + "(つ•̀ᴥ•́)つ*:・゚✧", + "ʕ⊙ᴥ⊙ʔ", + "(⊙ᗜ⊙)", + "╰(◕ᗜ◕)╯", + "░ ∗ ◕ ں ◕ ∗ ░", + "(^ ◕ᴥ◕ ^)", + "(ノ◕ヮ◕)ノ*:・゚✧", + "ʕ༼◕ ౪ ◕✿༽ʔ", + "(⊹つ•۝•⊹)つ", + "(✿ ◕ᗜ◕)━♫.*・。゚", + "¯_(౦▾౦ ✿)¯_", + "╰(˵ヘωヘ✿)╯", + "⋌[∗✖ ω ✖∗]⋋", + "(つ☯ᗜ☯)つ", + "╏ •́ – •̀ ╏", + "~~~~~~~[]=¤ԅ(ˊᗜˋ* )੭", + "(◕ᴥ◕)", + "୧| ⁰ ᴥ ⁰ |୨", + "╰(⊡-⊡)و✎⮹", + "ᕙ(˵◕ω◕˵✿)つ", + "୧། ☉ ౪ ☉ །୨", + "༼∩•́ω•̀∩༽", + "(⊃。•́‿•̀。)⊃━☆゚.*・。゚", + "ᕦ[ •́ ﹏ •̀ ]⊃¤=[]::::::::>", + "໒( * ⊙ ヮ ⊙ * )७", + "⊂(ο・㉨・ο)⊃", + "⋋( ◕ ∧ ◕ )⋌", + "ԅ[ •́ ﹏├┬┴┬┴", + "ʕ ⊃・ ◡ ・ ʔ⊃︵┻━┻", + "໒( ~ ◔ ᴥ ◔ ~ )७", + "(҂ ˘ _ ˘ )", + "ʕ ⊃・ ◡ ・ ʔ⊃", + "c(ˊᗜˋ*c)", + "(⊃。•́‿•̀。)⊃", + "ԅ໒( ☯ ᗜ ☯ )७ᕗ", + "ᕕ╏ ͡ ▾ ͡ ╏┐", + "⋋| ՞ ‸ ՞ |⋌", + "╰། ❛ ڡ ❛ །╯", + "ヽ༼ ் ▽ ் ༽╯", + "༼ ・ ౪ ・ ༽", + "ʕ ﹒ ᴥ ﹒ ʔ", + "ԅ[ •́ ﹏ •̀ ]و", + "ʕ ∗ •́ ڡ •̀ ∗ ʔ", + "୧ʕ ⇀ ⌂ ↼ ʔ୨", + "[ ಠ (oo) ಠ ]", + "▓⚗_⚗▓", + "(❍ᴥ❍ʋ)", + "♪ヽ( ⌒o⌒)人(⌒-⌒ )v ♪", + "óÔÔò ʕ·͡ᴥ·ʔ óÔÔò", + "(づ  ̄ ³ ̄)づ", + "┬┴┬┴┤・ω・)ノ├┬┴┬┴", + "^ↀᴥↀ^", + "⊂(´・◡・⊂ )∘˚˳°", + "ଘ(੭*ˊᵕˋ)੭*", + "ೖ(⑅σ̑ᴗσ̑)ೖ", + "٩(。•́‿•̀。)۶", + "(づ。◕‿‿◕。)づ", + "⁝⁞⁝⁞ʕु•̫͡•ʔु☂⁝⁞⁝⁝", + "ฅ⁽͑ ˚̀ ˙̭ ˚́ ⁾̉ฅ", + "(.﹒︣︿﹒︣.)", + "੧(❛〜❛✿)੭", + "(✿☯‿☯✿)", + "ヽ໒(☯_☯✿)७ノ", + "ᕕ( ᐛ )ᕗ", + "༼☯﹏☯༽", + "༼ つ ◕o◕ ༽つ", + "ヽ(´・ω・`)ノ", + "└(◉◞౪◟◉)┘", + "( ๑‾̀◡‾́)σ»", + "(◞‸◟;)", + "(✿ヘᴥヘ)", + "(≖ᴗ≖✿)", + "(╯・ิ-・ิ)╯", + "(/◔ ◡ ◔)/", + "(°ヮ°)", + "ᕕ( ಠ‿ಠ)ᕗ", + "ヽ(╯▽╰)ノ", + "ᕙ(⇀‸↼‶)ᕗ", + "༼ つ ◕_◕ ༽つ", + "ʕง•ᴥ•ʔง", + "(ง’̀-‘́)ง", + "(́ง◉◞౪◟◉‵)ง", + "ʕっ•ᴥ•ʔっ", + "( ◔ ౪◔)", + "ヽ(”`▽´)ノ", + "ᕙ( ^ ₒ^ c)", + "(◕‿◕✿)", + "(•_̀• ง)", + "ᕦ(▀̿ ̿ -▀̿ ̿ )つ├┬┴┬┴", + "(=◕ل͜◕=)", + "(❛ε❛“)", + "ᕕ(  ´ Д `  )ᕗ", + "༼ ༽ ლ(́◉◞౪◟◉‵ლ)", + "乁( ◔ ౪◔)ㄏ", + "ヽ(`Д´)ノ", + "(=^-ω-^=)", + "ლ(́◉◞౪◟◉‵ლ)", + }, + "dance": []string{ + "¯_(౦▾౦ ✿)¯_", + "ᕕ(⌐■_■)ᕗ ♪♬", + "ᕕ( ⁰ ▽ ⁰ )ᕗ", + "(:ㄏ■ Д ■ :)ㄏ", + "┗(^0^)┓", + "♪~ ᕕ( ᐛ )ᕗ", + "ᕕ[ ・ ▾ ・ ]ᕗ", + "┌( ಠ‿ಠ)┘", + "└(՞▃՞ └)", + "ᕕ༼ , •́ ω •̀ , ༽┐", + "ᕕ〳 ◕ ◞౪◟ ◕ 〵╭o͡͡͡", + "ᕕ( . ି ں ି . )ノ", + "ᕕ〳 ் (oo) ் 〵╯", + "ᕕ[ ˵ ☯ ڡ ☯ ˵ ]┐", + "└╏ ・ ᗜ ・ ╏┐", + "₍₍ ᕕ༼.◕ヮ◕.༽ᕗ⁾⁾", + "₍₍ ᕕ( * ⊙ ヮ ⊙ * )ᕗ⁾⁾", + "┐(・。・┐) ♪", + "ᕕ( ◔3◔)ᕗ", + "੧༼ ◕ – ◕ ༽┐", + "ᕕ║ ° ڡ ° ║┐", + "♪ヽ( ⌒o⌒)人(⌒-⌒ )v ♪", + "₍₍ ᕕ(´◓⌓◔)ᕗ⁾⁾", + "ヽ(⌐■_■)ノ♪♬", + "└༼ຈلຈ༽┐", + "┌(° ͜ʖ͡°)┘", + "ᕕ(⌐□ل͜□)ᕗ", + "ᕕ( ͡° ͜ʖ ͡°)ᕗ", + "ᕕ༼✪ل͜✪༽ᕗ", + "┌( ಠ_ಠ)┘", + }, + "dead": []string{ + "ᕦ༼ ✖ ਊ ✖ ༽ᕤ", + "ᕙ╏✖۝✖╏⊃-(===>", + "╚═[ ˵✖‿✖˵ ]═╝", + "( ✖ _ ✖ )", + "⋌[∗✖ ω ✖∗]⋋", + "ԅ༼ * ✖ ۝ ✖ * ༽୨", + "¯_| ✖ 〜 ✖ |_/¯", + "(⊃✖ 〰 ✖)⊃", + "ʕ༼✖∧✖༽ʔ", + "▐ ” ⊗ ﹏ ⊗ ”▐", + "୧༼ ” ✖ ‸ ✖ ” ༽୨", + "୧| ✖ ﹏ ✖ |୨", + "└໒( ” x ͟ʖ x ” )७┘", + "┌╏✖_✖╏┘", + "໒( : ⊗ Ĺ̯ ⊗ : )७", + "c༽✖﹏✖༼ᓄ", + "(✖╭╮✖)", + "ヽ༼, ͡X ͜ʖ ͡X,༽ノ", + "ლ༼ཹ༽ლ", + "ヽ༼xل͜x༽ノ", + }, + "dog": []string{ + "(V●ᴥ●V)", + }, + "dong": []string{ + "(つ°ヮ°)つ └⋃┘", + }, + "donger": []string{ + "∩༼˵☯‿☯˵༽つ¤=[]:::::>", + "ᕙ༼=ݓ益ݓ=༽ᕗ", + "┌༼◉ل͟◉༽┐", + "o͡͡͡╮༼ • ʖ̯ • ༽╭o͡͡͡", + "┌༼ – _ – ༽┐", + "ᕦ༼ ✖ ਊ ✖ ༽ᕤ", + "ᕕ༼ ͠ຈ Ĺ̯ ͠ຈ ༽┌∩┐", + "⋌༼ •̀ ⌂ •́ ༽⋋", + "└༼ ಥ ᗜ ಥ ༽┘", + "o͡͡͡╮༼ ʘ̆ ۝ ʘ̆ ༽╭o͡͡͡", + "༼つ ◕_◕ ༽つ", + "╰༼ ⋋ ‸ ⋌ ༽╯", + "・。゚[̲̅$̲̅(̲̅ ͡° ͜ʖ ͡°̲̅)̲̅$̲̅]。゚.*", + "✿*∗˵╰༼✪ᗜ✪༽╯˵∗*✿", + "༼▃ Ĺ̯ ▃༽", + "ԅ༼ * ◕ ∧ ◕ * ༽ノ", + "╰༼ •̀۝•́ ༽╯", + "ᕙ༼ಠ͜ʖಠ༽ノ", + "ԅ༼ . º ʖ̯ º . ༽ง", + "ლ༼ ▀̿ Ĺ̯ ▀̿ ლ༽", + "༼ノ۞⌂۞༽ノ", + "੧༼ ◕ ∧ ◕ ༽┌∩┐", + "ლ༼ ❛ Ĺ̯ ❛ ༽ᕤ", + "ԅ༼ : ◕ ۝ ◕ : ༽╯", + "ԅ༼ * ✖ ۝ ✖ * ༽୨", + "┌༼ ˘ 益 ˘ ༽┐", + "╰༼ ❛ ʖ̫ ❛ ༽╯", + "༼ •̀ ₒ •́ ༽", + "(}༼⊙-◞౪◟-⊙༽{)", + "༼つಠ益ಠ༽つ ─=≡ΣO))", + "༼ ° ▽ ° ༽", + "(つ˵•́ω•̀˵)つ━☆゚.*・。゚҉̛༽̨҉҉ノ", + "ᕙ༼⊘͜ʟ⊘༽ᕗ", + "༼:ಡʖ̯ಡ:༽", + "ᕕ༼✿•̀︿•́༽ᕗ", + "୧༼ಠ益ಠ╭∩╮༽", + "┌༼▀̿ Ĺ̯▀̿༽┐", + "༼ つ ˵ ╥ ͟ʖ ╥ ˵༽つ", + "─=≡Σ(((༼つಠ益ಠ༽つ", + "༼つ◔益◔༽つ", + "༼つºل͟ºς༽", + "ʕ༼✖∧✖༽ʔ", + "ヽ༼ಢ_ಢ༽ノ☂", + "༼; ಠ ਊ ಠ༽", + "༼ つ ಠ₍₍ළ₎₎ಠ༽つ", + "ᕙ༼◕◞౪◟◕༽ᕗ", + "ᕦ༼ ˵ ◯ ਊ ◯ ˵ ༽ᕤ", + "¯_༼ ಥ ‿ ಥ ༽_/¯", + "└༼ •́ ͜ʖ •̀ ༽┘", + "୧༼ ヘ ᗜ ヘ ༽୨", + "༼ ◔ ͜ʖ ◔ ༽", + "╰༼ ∗ ಡ ▾ ಡ ∗ ༽╯", + "╰༼⇀︿⇀༽つ-]═──", + "乁༼☯‿☯✿༽ㄏ", + "ヽ༼ ʘ ∧ ʘ ༽ᓄ", + "༼ ╥ ل ╥ ༽", + "ლ༼ * ・ ⌂ ・ * ༽ᓄ", + "ᕦ༼ – _ – ༽ᕤ", + "༼∩•́ω•̀∩༽", + "༼ノ◕ヮ◕༽ノ︵┻━┻", + "┏༼ ◉ ╭╮ ◉༽┓", + "¯_༼ᴼل͜ᴼ༽_/¯", + "ᕕ༼ , •́ ω •̀ , ༽┐", + "༼ ∗ ^ ┏ل͜┓ ^ ∗ ༽", + "୧༼ ” ✖ ‸ ✖ ” ༽୨", + "┌༼ ” ۞ – ۞ ” ༽┐", + "༼∩ຈل͜ຈ༽つ━☆゚.*・。゚", + "༼ ಠ ͟ʖ ಠ ༽", + ". * ・ 。゚☆━੧༼ •́ ヮ •̀ ༽୨", + "༼∩ •́ ヮ •̀ ༽⊃━☆゚. * ・ 。゚", + "₍₍ ᕕ༼.◕ヮ◕.༽ᕗ⁾⁾", + "╰༼.◕ヮ◕.༽つ¤=[]————", + "———–[]=¤ԅ༼ ・ 〜 ・ ༽╯", + "┌༼ ⊘ _ ⊘ ༽┐", + "ԅ༼ ・ 〜 ・ ༽╯", + "༼ : ౦ ‸ ౦ : ༽", + "ヽ༼ಢ_ಢ༽ノ", + "ᕙ༼*◕_◕*༽ᕤ", + "ᕦ༼ ºººل͟ºº├┬┴┬┴", + "༼凸 ◉_◔༽凸", + "༼.◕ヮ◕.༽つ", + "ᕙ༼ ◉_◔༽ᕗ", + "╰༼=ಠਊಠ=༽╯", + "༼ง=ಠ益ಠ=༽ง", + "ヽ༼ ◉ ͜ ◉༽ノ", + "┏༼ •́ ╭╮ •̀ ༽┓", + "༼⌐■ل͟■༽", + "ヽ༼ຈل͜ຈ༽⊃─☆*:・゚", + "༼ ºل͟º༼ ºل͟º ༽ºل͟º ༽ºل͟º ༽", + "ᕕ༼ ՞ ͜ʖ ՞ ༽凸", + "੧༼ ◕ – ◕ ༽┐", + "ԅ༼ ʘ̆ Ĺ̯ ʘ̆ ༽┌∩┐", + "┌╏ º □ º ╏┐", + "╰༼ ・ิ ﹏ ・ิ ༽╯", + "┌༼ σ ‸ σ ༽┐", + "༼ = ⊙ ᗜ ⊙ = ༽", + "༼ ∗ ͝° _ʖ ͝° ∗ ༽", + "ლ༼ ◕ _̀ ◕ ༽ノ⌒.", + "༼⊃ •́ ヮ •̀ ༽⊃", + "୧༼ ͡◕ д ◕͡ ༽୨", + "༼つ . •́ _ʖ •̀ . ༽つ", + "༼つ ் ▽ ் ༽つ", + "༼ ͡◕ ◞౪◟ ◕͡ ༽", + "o͡͡͡╮༼ ಠДಠ ༽╭o͡͡͡━☆゚.*・。゚", + "༼ ~ ͡■ _ ■͡ ~ ༽", + "ヽ༼ ் ▽ ் ༽╯", + "o͡͡͡╮༼ ◔ _ ◔ ༽╭o͡͡͡", + "༼ ・ ౪ ・ ༽", + "ᕕ༼ ︣ ᗜ ︣ ༽୨", + "༼ ˵ ❛ 益 ❛ ˵ ༽", + "༼ , ﹒︣ o ﹒︣ , ༽", + "ԅ༼ ◔ ڡ ◔ ༽ง", + "ᕦ༼ ~ •́ ₒ •̀ ~ ༽ᕤ", + "ヽ༼ •́ ヮ •̀ ༽ᓄ", + "ᕦ༼ •́ ‸ •̀ ༽ᕤ", + "ᕕ༼ •́ Д •̀ ༽ᕗ", + "༼ ಠ ▃ ಠೃ ༽", + "o͡͡͡╮༼ . •́ _ʖ •̀ . ༽╭o͡͡͡", + "c༼ ” ͡° ▃ °͡ ” ༽ᕤ", + "༼☉ɷ⊙༽", + "༼ つ ̥◕͙_̙◕͖ ͓༽つ", + "┳━┳ ヽ༼ಠل͜ಠ༽ノ", + "༼⁰o⁰;༽", + "ヽヽ༼༼ຈຈل͜ل͜ຈຈ༽༽ノノ", + "ヽ༼, ͡X ͜ʖ ͡X,༽ノ", + "༼ຈل͜ຈ༽ノ·︻̷┻̿═━一", + "╭∩╮༼◕ل͜◕༽╭∩╮", + "ヽ༼ ͠ ͠° ͜ʖ ͠ ͠° ༽ノ", + "༼ ಥل͟ಥ ༽", + "ᕙ༼ ͝°益° ༽ᕗ", + "ᕕ༼ຈل͜ຈ༽ᕗ", + "ヽ༼ຈل͜ຈ༽ノ︵┻━┻", + "༼☯﹏☯༽", + "୧༼ಠ益ರೃ༽୨", + "ᕙ༼ຈل͜ຈ༽ᕗ", + "ヽ༼ ˙ ͜ʟ˙ ༽ノ", + "└༼ຈلຈ༽┐", + "凸༼ຈل͜ຈ༽凸", + "ヽ༼ -ل͟-༽ノ Zzzzzzz", + "ヽ༼ຈل͜ຈ༽ᓄ†", + "୧༼ʘ̆ںʘ̆༽୨", + "ヽ༽ຈل͜ຈ༼ノ", + "༼∩✿ل͜✿༽⊃━☆゚. * ・ 。゚", + "༼∩☉ل͜☉༽⊃━☆゚. * ・ 。゚", + "༼⌐■ل͜■༽", + "༼ ຈل͜ຈ༽ノ⌐■-■", + "༼ ຈل͜ຈ༽", + "༼,ຈ_ຈ,༽", + "ヽ༼ ; ل͜ ; ༽ノ", + "ヽ༼, ͡ຈ ͜ʖ ͡ຈ,༽ノ", + "༼ ºل͟º༼ ºل͟º༽", + "༼ つ ͡ ͡° ͜ ʖ ͡ ͡° ༽つ", + "ヽ༼ຈ┏ل͜┓ຈ༽ノ", + "༼୨༼ ºل͟º ༽୧༽", + "ᕦ༼✩ل͜✩༽ᕤ", + "ヽ༼✡ل͜✡༽ノ", + "✡✡ヽ༼ຈل͜ຈ༽ノ✡✡", + "༼〜ຈل͜ຈ༽〜", + "ヽ༼ ◉_◔ ༽ノ", + "┌∩┐༼ ºل͟º ༽┌∩┐", + "┬───┬ ノ༼ຈل͜ຈノ༽", + "ヽ༼◐ل͜◑༽ノ", + "༼ つ ▀̿_▀̿ ༽つ", + "༼ノ ◉ ͜ ◉ ༽つ", + "ヽ༼ • ͜ •༽ノ", + "୧༼◔益◔╭∩╮༽", + "ᕙ༼◕ ᴥ ◕༽ᕗ", + "୧༼◕ ᴥ ◕༽୨", + "༼ – ل͜ – ༽", + "༼ ⨀ ̿Ĺ̯̿̿⨀ ̿༽ง", + "ᕙ༼ ◔ل͜ ◕ ༽ᕤ", + "ヽ༼xل͜x༽ノ", + "༼ノಠل͟ಠ༽ノ ︵ ┻━┻", + "༼ノຈل͜ຈ༽ノ︵┻━┻", + "ᕕ༼✪ل͜✪༽ᕗ", + "ヽ༼ ʘ̚ل͜ʘ̚༼◕_◕༽◉_◔ ༽ノ", + "ヽ༼ ຈل͜ຈ༼ ▀̿̿Ĺ̯̿̿▀̿ ̿༽Ɵ͆ل͜Ɵ͆ ༽ノ", + "ヽ༼ ツ ༽ノ ︵┻━┻", + "༼ ᕤ ºل͟º ༽ᕤ ︵┻━┻", + "ζ༼ᴼل͜ᴼ༽ᶘѰ", + }, + "drop": []string{ + "੧( ◖ ω ◗ )ノ⌒.", + "ლ༼ ◕ _̀ ◕ ༽ノ⌒.", + }, + "dunno": []string{ + "¯_╏ ՞ ︿ ՞ ╏_/¯", + "乁| ・ 〰 ・ |ㄏ", + "¯_༽ ಥ Д ಥ ༼_/¯", + "乁໒( ͡◕ ᴥ ◕͡ )७ㄏ", + "¯_| ✖ 〜 ✖ |_/¯", + "¯_▐ ☯ ︿ ☯ ▐_/¯", + "乁( ⁰͡ Ĺ̯ ⁰͡ ) ㄏ", + "¯_(⊙_ʖ⊙)_/¯", + "乁〳 ❛ д ❛ 〵ㄏ", + "¯_༼ ಥ ‿ ಥ ༽_/¯", + "乁༼☯‿☯✿༽ㄏ", + "¯_༼ᴼل͜ᴼ༽_/¯", + "¯_( ͠° ͟ʖ °͠ )_/¯", + "乁| ・ิ ∧ ・ิ |ㄏ", + "¯_໒( ” ▀ ﹏ ▀ ” )७_/¯", + "乁[ᓀ˵▾˵ᓂ]ㄏ", + "¯_(ツ)_/¯", + "乁། * ❛ ͟ʖ ❛ * །ㄏ", + "乁⁞ ◑ ͜ر ◑ ⁞ㄏ", + }, + "excited": []string{ + "☆*:. o(≧▽≦)o .:*☆", + "୧[ * ಡ ▽ ಡ * ]୨", + "໒( ͡ᵔ ▾ ͡ᵔ )७", + "(⊙ᗜ⊙)", + "ლ(ʘ̆〰ʘ̆)ლ", + "✿*∗˵╰༼✪ᗜ✪༽╯˵∗*✿", + "ᕦ( ヘ (oo) ヘ )ᕤ", + "[ ⇀ ‿ ↼ ]", + "o͡͡͡╮໒( •̀ ‿ •́ )७╭o͡͡͡", + "(}༼⊙-◞౪◟-⊙༽{)", + "o͡͡͡╮⁞ ^ ▃ ^ ⁞╭o͡͡͡", + "٩(◕‿◕。)۶", + "୧(=ʘ͡ᗜʘ͡=)୨", + "o͡͡͡╮░ O ◡ O ░╭o͡͡͡", + "໒( ◔ ▽ ◔ )७", + "୧༼ ヘ ᗜ ヘ ༽୨", + "╚═╏ ⇀ ͜ر ↼ ╏═╝", + "o͡͡͡╮໒( * ☯ ◞౪◟ ☯ * )७╭o͡͡͡", + "୧〳 ” ʘ̆ ᗜ ʘ̆ ” 〵୨", + "ᕙ░ ʘ̆ ᗜ ʘ̆ ░ᕗ", + "ԅ༼ ◔ ڡ ◔ ༽ง", + "໒( ” •̀ ᗜ •́ ” )७", + "୧༼ʘ̆ںʘ̆༽୨", + "ヽ(”`▽´)ノ", + "ʘ ͜ʖ ʘ", + "༼ ༽ ლ(́◉◞౪◟◉‵ლ)", + "ლ(́◉◞౪◟◉‵ლ)", + }, + "fat": []string{ + "༼ ∗ ^ ┏ل͜┓ ^ ∗ ༽", + "༼ ಠ ͟ʖ ಠ ༽", + "ᕕ(  ´ Д `  )ᕗ", + }, + "fight": []string{ + "(ᕗ ͠° ਊ ͠° )ᕗ", + "ᕙノ•̀ʖ•́ノ୨", + "༼ง=ಠ益ಠ=༽ง", + "(ง⌐□ل͜□)ง", + "( ๑‾̀◡‾́)σ»", + "(งಠل͜ಠ)ง", + "(ᓄಠ_ಠ)ᓄ", + "ᕙ(° ͜ಠ ͜ʖ ͜ಠ°)ᓄ", + "(ง ͡ʘ ͜ʖ ͡ʘ)ง", + "ʕง•ᴥ•ʔง", + "(ง’̀-‘́)ง", + "(งಠ_ಠ)ง", + "(ง ° ͜ ʖ °)ง", + "(́ง◉◞౪◟◉‵)ง", + "ᕙ( ^ ₒ^ c)", + "(•_̀• ง)", + "༼ ⨀ ̿Ĺ̯̿̿⨀ ̿༽ง", + }, + "finger": []string{ + "ᕕ༼ ͠ຈ Ĺ̯ ͠ຈ ༽┌∩┐", + "╭∩╮༼☯۝☯༽╭∩╮", + "╭∩╮(ಠ۝ಠ)╭∩╮", + "凸( •̀_•́ )凸", + "┌∩┐(ಠ͜ʖಠ)┌∩┐", + "੧༼ ◕ ∧ ◕ ༽┌∩┐", + "┌∩┐╭˵ಥ o ಥ˵╮┌∩┐", + "┌∩┐(◕◡◉)┌∩┐", + "╭∩╮( ͡° ل͟ ͡° )╭∩╮", + "╭∩╮(⋋‿⋌)ᕗ", + "凸〳 ಥ ڡ ಥ 〵凸", + "୧༼ಠ益ಠ╭∩╮༽", + "༼✿◕ᗜ◕༽┌∩┐", + "╭∩╮໒(✪ਊ✪)७╭∩╮", + "╭∩╮ʕ ◉ ﹏ ◉ ʔ╭∩╮", + "t( -_- t )", + "ᕕ▒ ຈ ︿ ຈ ▒┌∩┐", + "凸( •̀ 3 •́ )凸", + "໒( . ͡° ͟ʖ ͡° . )७┌∩┐", + "༼凸 ◉_◔༽凸", + "╭∩╮(︶︿︶)╭∩╮", + "ᕕ༼ ՞ ͜ʖ ՞ ༽凸", + "໒( ͡; 益 ͡; )७┌∩┐", + "٩║ ✿ ᴼ ل ᴼ ✿ ║┌∩┐", + "ԅ༼ ʘ̆ Ĺ̯ ʘ̆ ༽┌∩┐", + "ᕕ໒( * ◕ ڡ ◕ * )७╭∩╮", + "໒( ಠ ڡ ಠ )७╭∩╮", + "ԅ[ ˵ ☯ ڡ ☯ ˵ ]凸", + "ᕕ╏ ۞ ∧ ۞ ╏╭∩╮", + "ᕕ╏ ͡ᵔ ‸ ͡ᵔ ╏凸", + "໒( ° ౪ ° )७┌∩┐", + "໒( •̀ ◡ •́ )७┌∩┐", + "╭∩╮ʕ•ᴥ•ʔ╭∩╮", + "┌∩┐(ಠ_ಠ)┌∩┐", + "凸(⊙▂⊙✖ )", + "╭∩╮༼◕ل͜◕༽╭∩╮", + "凸༼ຈل͜ຈ༽凸", + "┌∩┐༼ ºل͟º ༽┌∩┐", + "୧༼◔益◔╭∩╮༽", + "╭∩╮◕ل͜◕)╭∩╮", + }, + "fireball": []string{ + "༽つ۞﹏۞༼つ ─=≡ΣO))", + "༼つಠ益ಠ༽つ ─=≡ΣO))", + }, + "flex": []string{ + "ᕙ(˵ ಠ ਊ ಠ ˵)ᕗ", + "ᕙ༼=ݓ益ݓ=༽ᕗ", + "ᕙ[・۝・]ᕗ", + "ᕙ〳 ರ ︿ ರೃ 〵ᕗ", + "ᕙᓄ(☉ਊ☉)ᓄᕗ", + "ᕦ⁞ ✿ ᵒ̌ ᴥ ᵒ̌ ✿ ⁞ᕤ", + "ᕙʕ ಥ ▃ ಥ ʔᕗ", + "ᕦ( ̿ ﹏ ̿ )ᕤ", + "ᕦ༼ ✖ ਊ ✖ ༽ᕤ", + "ᕙ[ ͒ ﹏ ͒ ]ᕗ", + "ᕙ( ~ . ~ )ᕗ", + "ᕦ╏ ʘ̆ ‸ ʘ̆ ╏ᕤ", + "ᕦ| ๑ ʖ ๑ |ᕤ", + "ᕦ༼◣_◢༽つ", + "ᕙ(◉෴◉)ᕗ", + "ᕙʕಠᴥಠʔᕗ", + "ᕙ(˵ි۝ි˵)ᕗ", + "ᕙ⁞ = 〰 = ⁞ᕗ", + "ᕙ༼ಠ͜ʖಠ༽ノ", + "ᕦ( ᴼ ڡ ᴼ )ᕤ", + "ᕦ╏ ¬ ʖ̯ ¬ ╏ᕤ", + "ᕙ▐ ° ◯ ° ▐ᕗ", + "ᕦ( ⊙ ∧ ⊙ )ᕤ", + "ᕙ( ຈ ▃ ຈ )ᕗ", + "ᕦ| º ෴ º |ᕤ", + "ᕦ໒( ՞ ◡ ՞ )७ᕤ", + "୧╏ ՞ _ ՞ ╏୨", + "┌( ˵ ⊘ ‿ ⊘ ˵ )ᕤ", + "ᕙ(⇀∏↼)ᕗ", + "ᕙ༼⊘͜ʟ⊘༽ᕗ", + "~~~~~~~[]=¤ԅ( ◔益◔ )ᕗ", + "ᕙ༼◕◞౪◟◕༽ᕗ", + "ᕦ( ͡° ͜ʖ ͡°)ᕤ", + "ᕦʕ ° o ° ʔᕤ", + "ᕦ༼ ˵ ◯ ਊ ◯ ˵ ༽ᕤ", + "ᕦ໒( ᓀ ڡ ᓂ )७ᕤ", + "ᕙ| ᴼ ʖ̯ ᴼ |ᕗ", + "ᕙ(◕ਊ◕)ᕗ", + "ᕦʕ . ☯ ᴥ ☯ . ʔᕤ", + "ᕦ໒( ⊡ 益 ⊡ )७ᕤ", + "ᕦ〳 ◑ ‸ ◑ 〵ᕤ", + "ᕙ໒( ˵ ಠ ╭͜ʖ╮ ಠೃ ˵ )७ᕗ", + "ᕙ[ ˵ ͡’ ω ͡’ ˵ ]ᕗ", + "ᕦ༼ – _ – ༽ᕤ", + "ᕙʕ ◖ ڡ ◗ ʔᕗ", + "ᕦ⁞ ∗ ❛ั ◯ ❛ั ∗ ⁞ᕤ", + "ᕦ໒( ͡° ⌂ °͡ )७ᕤ", + "ᕦ║ ⌣ ∧ ⌣ ║ᕤ", + "ԅ| . ͡° ڡ ͡° . |ᕤ", + "ᕦ໒( ᴼ 益 ᴼ )७ᕤ", + "ᕙ( ͡° ͜ʖ ͡°)ᕗ", + "ᕦ⁞ * ヘ ﹏ ヘ * ⁞ᕤ", + "ᕙ༼*◕_◕*༽ᕤ", + "ᕙ໒(˵ ̄ᴥ ̄˵)७ᕗ", + "ᕙ༼ ◉_◔༽ᕗ", + "へ། ¯͒ ʖ̯ ¯͒ །ᕤ", + "ᕦ[ . ◕ ͜ ʖ ◕ . ]ᕤ", + "ᕙ░ ʘ̆ ᗜ ʘ̆ ░ᕗ", + "୧〳 ” • ڡ • ” 〵୨", + "ᕦ[ ˵ ຈ ︿ ຈ ˵ ]ᕤ", + "ᕙ໒( ∗ σ Ĺ̯ σ ∗ )७ᕗ", + "ᕦ༼ •́ – •̀ ༽ᕤ", + "ᕙʕ ◐ ﹏ ◐ ʔᕗ", + "ᕙ( ˵ ◕ д ◕ ˵ )ᕗ", + "ᕙ| ” ◉ ◡ ◉ ” |ᕗ", + "ᕙ⁞ : •̀ ⌂ •́ : ⁞ᕗ", + "ᕦ[ ◔ (oo) ◔ ]ᕤ", + "ᕙ( : ˘ ∧ ˘ : )ᕗ", + "ᕙ། – ڡ – །ᕗ", + "ᕙ╏ : ◑ ڡ ◑ : ╏ᕗ", + "ᕙ〳 ʘ – ʘ 〵ᕗ", + "ᕙ། ◕ – ◕ །ᕗ", + "ᕦ༼ ~ •́ ₒ •̀ ~ ༽ᕤ", + "ᕦ༼ •́ ‸ •̀ ༽ᕤ", + "ᕙ( * •̀ ᗜ •́ * )ᕗ", + "ᕙ༼ ͝°益° ༽ᕗ", + "ᕙ༼ຈل͜ຈ༽ᕗ", + "ᕦ⊙෴⊙ᕤ", + "ᕙ( ͡◉ ͜ ʖ ͡◉)ᕗ", + "ᕦ༼✩ل͜✩༽ᕤ", + "ᕙ(⇀‸↼‶)ᕗ", + "ᕙ(° ͜ಠ ͜ʖ ͜ಠ°)ᓄ", + "ᕙ(▀̿̿Ĺ̯̿̿▀̿ ̿) ᕗ", + "ᕙ༼◕ ᴥ ◕༽ᕗ", + "ᕦ(▀̿ ̿ -▀̿ ̿ )つ├┬┴┬┴", + "ᕙ༼ ◔ل͜ ◕ ༽ᕤ", + "ᕙ (° ~͜ʖ~ °) ᕗ", + }, + "flip": []string{ + "(ノ͡° ͜ʖ ͡°)ノ︵┻┻", + "┻┻︵⁞=༎ຶ﹏༎ຶ=⁞︵┻┻", + "┬─┬ノ( ◕◡◕ ノ)", + "[ ᕤ ಠ (oo) ಠ ]ᕤ ︵┻━┻", + "(ノಠдಠ)ノ︵┻━┻", + "_|___|_ ╰(º o º╰)", + "┻━┻ ヘ╰( •̀ε•́ ╰)", + "(╯°Д°)╯︵c(.□ . c)", + "/( .□.) ︵╰(゜益゜)╯︵ /(.□. /)", + "ʕノ•ᴥ•ʔノ ︵ ┻━┻", + "(┛ಠДಠ)┛彡┻━┻", + "༼ノ◕ヮ◕༽ノ︵┻━┻", + "(╯=▃=)╯︵┻━┻", + "└(՞▃՞ └)", + "(ノ°▽°)ノ︵┻━┻", + "(╯ಠ‿ಠ)╯︵┻━┻", + "ʕ ⊃・ ◡ ・ ʔ⊃︵┻━┻", + "(╯°□°)╯︵ ( . 0 .)", + "┏━┓ ︵ /(^.^/)", + "ヽ༼ຈل͜ຈ༽ノ︵┻━┻", + "(╯°□°)╯︵ ┻━┻", + "(╯°□°)╯︵ ส็็็็็็็ส", + "(╯ຈل͜ຈ) ╯︵ ┻━┻", + "┬───┬ ノ༼ຈل͜ຈノ༽", + "༼ノಠل͟ಠ༽ノ ︵ ┻━┻", + "༼ノຈل͜ຈ༽ノ︵┻━┻", + "(╯ ͝° ͜ʖ͡°)╯︵ ┻━┻", + "(つ☢益☢)つ︵┻━┻", + "┬─┬ノ(ಠ_ಠノ)", + "┬━┬ノ(▀̿̿Ĺ̯̿̿▀̿ ̿ノ)", + "ヽ༼ ツ ༽ノ ︵┻━┻", + "༼ ᕤ ºل͟º ༽ᕤ ︵┻━┻", + "(╯°□°)╯︵( .o.)", + "(╯°Д°)╯︵/(.□ . )", + "┻━┻ ︵ヽ(`Д´)ノ︵ ┻━┻", + "(ノಠ益ಠ)ノ彡┻━┻", + }, + "flower": []string{ + "ᕦ⁞ ✿ ᵒ̌ ᴥ ᵒ̌ ✿ ⁞ᕤ", + "ʕ༼◕ ౪ ◕✿༽ʔ", + "╰[✿•̀o•́✿]╯", + "╰(✿˙ᗜ˙)੭━☆゚.*・。゚", + "⁞ ✿ •̀ ヮ •́ ✿ ⁞", + "ᕙ(˵◕ω◕˵✿)つ", + "ᕕ༼✿•̀︿•́༽ᕗ", + "༼✿◕ᗜ◕༽┌∩┐", + "乁༼☯‿☯✿༽ㄏ", + "ლ║ ✿ ☉ ω ☉ ✿ ║ᓄ", + "੧| ✿ ◔ ں ◔ ✿ |ᓄ¤=[]:::::::::::–", + "੧| ✿ ◔ ں ◔ ✿ |ᓄ", + "٩║ ✿ ᴼ ل ᴼ ✿ ║┌∩┐", + "੧| ✿ ◔ ں ◔ ✿ |ᓄ", + "ᕦ( ✿ ⊙ ͜ʖ ⊙ ✿ )━☆゚.*・。゚", + "( ✿ •̀ ‸ •́ ✿ )", + "(✿☯‿☯✿)", + "ヽ໒(☯_☯✿)७ノ", + "(✿ヘᴥヘ)", + "༼∩✿ل͜✿༽⊃━☆゚. * ・ 。゚", + "(◕‿◕✿)", + }, + "fly": []string{ + "ଘ(੭*ˊᵕˋ)੭", + "─=≡Σ(((༼つಠ益ಠ༽つ", + "─=≡Σ((( つ ◕o◕ )つ", + "─=≡Σ((( つ◕ل͜◕)つѰ", + "───==≡≡ΣΣ((( つºل͜º)つ", + }, + "food": []string{ + "~~旦_(・o・;)", + }, + "funny": []string{}, + "give": []string{ + "੧║ ⊙ ౪ ⊙ ║ᓄ", + "ʕ ಡ ﹏ ಡ ʔ⊃―{}@{}@{}-", + "ᕕ( ・‿・)つ-●-●", + "໒(◕ヮ◕)〜⊹", + "ヽ༼ຈل͜ຈ༽ᓄ†", + }, + "glasses": []string{ + "⊂(▀¯▀⊂)", + "┬┴┬┴┤ᕦ( ▀̿ Ĺ̯ ▀̿├┬┴┬", + "ᕕ(⌐■_■)ᕗ ♪♬", + "━╤デ╦︻(▀̿̿Ĺ̯̿̿▀̿ ̿)", + "┌༼▀̿ Ĺ̯▀̿༽┐", + "ᕕ( ・‿・)つ-●-●", + "(つ▀¯▀)つ", + "( ▀ 益 ▀ )", + "¯_໒( ” ▀ ﹏ ▀ ” )७_/¯", + "༼⌐■ل͟■༽", + "┌(▀Ĺ̯▀)┐", + "(⌐■_■)–︻╦╤─", + "ೖ(⑅σ̑ᴗσ̑)ೖ", + "ヽ(⌐■_■)ノ♪♬", + "┌(▀Ĺ̯ ▀-͠ )┐", + "(ง⌐□ل͜□)ง", + "(⌐ ͡■ ͜ʖ ͡■)", + "( ͡° ͜ʖ ͡°)>⌐■-■", + "༼⌐■ل͜■༽", + "༼ ຈل͜ຈ༽ノ⌐■-■", + "ლ(▀̿̿Ĺ̯̿̿▀̿ლ)", + "ᕙ(▀̿̿Ĺ̯̿̿▀̿ ̿) ᕗ", + "༼ つ ▀̿_▀̿ ༽つ", + "ᕦ(▀̿ ̿ -▀̿ ̿ )つ├┬┴┬┴", + "ᕕ(⌐□ل͜□)ᕗ", + "ヽ༼ ຈل͜ຈ༼ ▀̿̿Ĺ̯̿̿▀̿ ̿༽Ɵ͆ل͜Ɵ͆ ༽ノ", + "┬━┬ノ(▀̿̿Ĺ̯̿̿▀̿ ̿ノ)", + "( •_•)>⌐■-■", + }, + "gun": []string{ + "ლ(~•̀︿•́~)つ︻̷┻̿═━一", + "━╤デ╦︻(▀̿̿Ĺ̯̿̿▀̿ ̿)", + "ᕕ[*•̀͜ʖ•́*]︻̷┻̿═━一", + "໒(:ರωರ:)〜︻̷┻̿═━", + "⁞ つ: •̀ ⌂ •́ : ⁞-︻╦̵̵͇̿̿̿̿══╤─", + "╾━╤デ╦︻ԅ། ・ิ _ʖ ・ิ །ง", + "[ノಠೃಠ]︻̷┻̿═━一", + "ᕕ╏ ͡ᵔ ‸ ͡ᵔ ╏و︻̷┻̿═━一", + "╾━╤デ╦︻", + "▄︻̷̿┻̿═━一", + "(⌐■_■)–︻╦╤─", + "︻╦̵̵͇̿̿̿̿══╤─", + "༼ຈل͜ຈ༽ノ·︻̷┻̿═━一", + "┌( ͝° ͜ʖ͡°)=ε/̵͇̿̿/’̿’̿ ̿", + "( ͝ಠ ʖ ಠ)=ε/̵͇̿̿/’̿’̿ ̿", + }, + "happy": []string{ + "(✿ ◕‿◕) ᓄ✂╰U╯", + "∩༼˵☯‿☯˵༽つ¤=[]:::::>", + "( ͡↑ ͜ʖ ͡↑)", + "ᕕ( ՞ ᗜ ՞ )ᕗ", + "☆*:. o(≧▽≦)o .:*☆", + "٩ʕ◕౪◕ʔو", + "║ ಡ ͜ ʖ ಡ ║", + "ԅ། ຈ ◞౪◟ຈ །و", + "୧[ * ಡ ▽ ಡ * ]୨", + "(つ°ヮ°)つ └⋃┘", + "s( ^ ‿ ^)-b", + "ヽ〳 ՞ ᗜ ՞ 〵ง", + "໒( ͡ᵔ ▾ ͡ᵔ )७", + "┌[ ◔ ͜ ʖ ◔ ]┐", + "໒( • ͜ʖ • )७", + "c( ⁰ 〰 ⁰ )੭", + "ლ ( ◕ ᗜ ◕ ) ლ", + "(⊙ᗜ⊙)", + "╰(◕ᗜ◕)╯", + "░ ∗ ◕ ں ◕ ∗ ░", + "✿*∗˵╰༼✪ᗜ✪༽╯˵∗*✿", + "ʕ༼◕ ౪ ◕✿༽ʔ", + "┬─┬ノ( ◕◡◕ ノ)", + "(✿ ◕ᗜ◕)━♫.*・。゚", + "╰(˵ヘωヘ✿)╯", + "(つ☯ᗜ☯)つ", + "〳 ◉ ͜ʖ ◉ 〵", + "╰( ◕ ᗜ ◕ )╯", + "༼( ͡⊙ ਊ ͡⊙)༽", + "o͡͡͡╮། ❛ั ╭ ͟ʖ╮ ❛ั །╭o͡͡͡", + "ᕙ༼ಠ͜ʖಠ༽ノ", + "ᕦ( ヘ (oo) ヘ )ᕤ", + "╰(✿˙ᗜ˙)੭━☆゚.*・。゚", + "ଘ(੭*ˊᵕˋ)੭", + "d–(^ ‿ ^ )z", + "(つ°ヮ°)つ", + "╰( . •́ ͜ʖ •̀ . )╯", + "~~~~~~~[]=¤ԅ(ˊᗜˋ* )੭", + "੧║ ⊙ ౪ ⊙ ║ᓄ", + "ᕦ( ᴼ ڡ ᴼ )ᕤ", + "⁞ ✿ •̀ ヮ •́ ✿ ⁞", + "o͡͡͡╮╏ ◕ ◡ ◕ ╏╭o͡͡͡", + "┌( ՞ ڡ ՞ )┐", + "┌[ ヘ ‸ ヘ ]┐", + "( ◑ ᗜ ◑ )", + "ᕦ໒( ՞ ◡ ՞ )७ᕤ", + "(> ^_^ )>", + "(}༼⊙-◞౪◟-⊙༽{)", + "୧[ ☯ ౪ ☯ ]୨", + "༼ ° ▽ ° ༽", + "┌( ˵ ⊘ ‿ ⊘ ˵ )ᕤ", + "୧( ⊚ ╭͜ʖ╮ ⊚ )୨", + "☜(゚ヮ゚☜)", + "ᕕ( ⁰ ▽ ⁰ )ᕗ", + "( ´ ∀ ` )", + "┗(^0^)┓", + "໒( ͡ᵔ ͜ʖ ͡ᵔ )७", + "〳 ^ ▽ ^ 〵", + "⋋╏ ۞ ڡ ۞ ╏⋌", + "♪~ ᕕ( ᐛ )ᕗ", + "ᕕ┌◕ᗜ◕┐ᕗ", + "╰[◔▽◔├┬┴┬┴", + "(つ◕౪◕)つ━☆゚.*・。゚", + "(^┌_̀┐^)", + "٩(◕‿◕。)۶", + "༼✿◕ᗜ◕༽┌∩┐", + "(^┌_̀┐^)", + "୧(=ʘ͡ᗜʘ͡=)୨", + "o͡͡͡╮( – ▾ – )╭o͡͡͡", + "໒(◕ヮ◕)〜⊹", + "ᕕ[ ・ ▾ ・ ]ᕗ", + "໒( ͒ ౪ ͒ )७", + "o͡͡͡╮░ O ◡ O ░╭o͡͡͡", + "໒( ° 〰 ° )७", + "¯_༼ ಥ ‿ ಥ ༽_/¯", + "໒( ◔ ▽ ◔ )७", + "└༼ •́ ͜ʖ •̀ ༽┘", + "୧། ☉ ౪ ☉ །୨", + "୧╏ ~ ᴥ ~ ╏୨", + "୧༼ ヘ ᗜ ヘ ༽୨", + "⋋〳  ̄ ᴥ  ̄ 〵⋌", + "╰| ° ◞౪◟ ° |╯", + "༼ ◔ ͜ʖ ◔ ༽", + "╰໒( ” ¤ ‿ ¤ ” )७╯", + "⋋( * ᴼ ں ᴼ * )⋌", + "╏ . ^ Ĺ̯ ^ . ╏", + "╰༼ ∗ ಡ ▾ ಡ ∗ ༽╯", + "(☞゚ヮ゚)☞", + "⋋〳 ・ ਊ ・ 〵⋌", + "〳 : ⊘ ڡ ⊘ : 〵", + "༼ノ◕ヮ◕༽ノ︵┻━┻", + "୧〳 ^ ౪ ^ 〵୨", + "ᕕ( . ି ں ି . )ノ", + "o͡͡͡╮໒( * ☯ ◞౪◟ ☯ * )७╭o͡͡͡", + ". * ・ 。゚☆━੧༼ •́ ヮ •̀ ༽୨", + "༼∩ •́ ヮ •̀ ༽⊃━☆゚. * ・ 。゚", + "୧〳 ” ʘ̆ ᗜ ʘ̆ ” 〵୨", + "ᕕ[ ˵ ☯ ڡ ☯ ˵ ]┐", + "└╏ ・ ᗜ ・ ╏┐", + "₍₍ ᕕ༼.◕ヮ◕.༽ᕗ⁾⁾", + "₍₍ ᕕ( * ⊙ ヮ ⊙ * )ᕗ⁾⁾", + "(⊃。•́‿•̀。)⊃━☆゚.*・。゚", + "~~~~~~~[]=¤ԅ໒( ☯ ᗜ ☯ )७ᕗ", + "╰༼.◕ヮ◕.༽つ¤=[]————", + "໒( ﹒ ͜ر ﹒ )७", + "⋋╏ ❛ ◡ ❛ ╏⋌", + "໒( * ⊙ ヮ ⊙ * )७", + "( : – ◞౪◟ – : )", + "ᕦ⁞ * ヘ ﹏ ヘ * ⁞ᕤ", + "(ノ°▽°)ノ︵┻━┻", + "৵( °͜ °৵)", + "੧| ✿ ◔ ں ◔ ✿ |ᓄ", + "༼.◕ヮ◕.༽つ", + "ᕕ( ◔3◔)ᕗ", + "ヽ༼ ◉ ͜ ◉༽ノ", + "(✿ ◕‿◕) ᓄ✂╰⋃╯", + "( ^◡^)っ (‿|‿)", + "ԅ[ ﹒︣ ͜ʟ ﹒︣ ]ノ", + "⋋║ ՞ ▽ ՞ ║⋌", + "└། . ⊙ ◞౪◟ ⊙ . །┘", + "╰╏ ・ ᗜ ・ ╏╯", + "ᕕ໒( * ◕ ڡ ◕ * )७╭∩╮", + "੧| ⊗ ▾ ⊗ |୨", + "໒( ☉ ͜ʖ ☉ )७", + "ԅ[ ˵ ☯ ڡ ☯ ˵ ]凸", + "╚═░ ◕ ▽ ◕ ░═╝", + "໒( ✿ ❛ ͜ʖ ❛ ✿ )७", + "໒( ◐ ‿ ◐ )७", + "ᕕ╏ ^ ◡ ^ ╏ᓄ", + "༼ = ⊙ ᗜ ⊙ = ༽", + "⋋╏ ヘ ⌂ ヘ ╏⋌", + "▐ ・ ‿ ・▐", + "ᕕ║ ° ڡ ° ║┐", + "[ ・ิ ▾ ・ิ ]", + "୧[ ˵ ͡ᵔ ͜ʟ ͡ᵔ ˵ ]୨", + "ᕕ| ◉ ͜ʟ ◉ |ง", + "╚═╏ . ˘ ڡ ˘ . ╏═╝", + "༼⊃ •́ ヮ •̀ ༽⊃", + "(⊃。•́‿•̀。)⊃", + "੧| ✿ ◔ ں ◔ ✿ |ᓄ", + "໒( = ಠ ◡ ಠ = )७", + "ᕙ། – ڡ – །ᕗ", + "ԅ໒( ☯ ᗜ ☯ )७ᕗ", + "ᕕ╏ ͡ ▾ ͡ ╏┐", + "ლ(- ◡ -ლ)", + "༼つ ் ▽ ் ༽つ", + "ᕙ╏ : ◑ ڡ ◑ : ╏ᕗ", + "ᕕ║ = ◔ ヮ ◔ = ║୨", + "┌| . ิ 〰 ิ . |┐", + "ԅ། ^ ͜ʟ ^ །و", + "༼ ͡◕ ◞౪◟ ◕͡ ༽", + "╰། ❛ ڡ ❛ །╯", + "[ ☯ ͜ʟ ☯ ]", + "ヽ༼ ் ▽ ் ༽╯", + "ᕕ༼ ︣ ᗜ ︣ ༽୨", + "ԅ༼ ◔ ڡ ◔ ༽ง", + "໒( ” •̀ ᗜ •́ ” )७", + "ʕ ∗ •́ ڡ •̀ ∗ ʔ", + "໒( ~ ͡◕ ◡ ◕͡ ~ )७", + "໒( ˵ ͡° ͜ʖ °͡ ˵ )७", + "ヽ༼ •́ ヮ •̀ ༽ᓄ", + "ᕙ( * •̀ ᗜ •́ * )ᕗ", + "(◔/‿◔)", + "⊂(´・◡・⊂ )∘˚˳°", + "◦°˚(*❛‿❛)/˚°◦", + "ଘ(੭*ˊᵕˋ)੭*", + "٩(。•́‿•̀。)۶", + "/人 ◕ ‿‿ ◕ 人\", + "(づ。◕‿‿◕。)づ", + "⊹⋛⋋( ՞ਊ ՞)⋌⋚⊹", + "(˵¯͒〰¯͒˵)", + "╰⋃╯ლ(´ڡ`ლ)", + "ヽ༼ ͠ ͠° ͜ʖ ͠ ͠° ༽ノ", + "(✿☯‿☯✿)", + "ᕕ༼ຈل͜ຈ༽ᕗ", + "ᕕ( ᐛ )ᕗ", + "ᕙ༼ຈل͜ຈ༽ᕗ", + "ヽ༼ ˙ ͜ʟ˙ ༽ノ", + "٩(ˊᗜˋ*)و", + "(ง⌐□ل͜□)ง", + "ヽ༽ຈل͜ຈ༼ノ", + "༼∩☉ل͜☉༽⊃━☆゚. * ・ 。゚", + "༼ ຈل͜ຈ༽", + "༼ つ ͡ ͡° ͜ ʖ ͡ ͡° ༽つ", + "ʕ•̫͡•ʕ̫͡ʕ•͓͡•ʔ-̫͡-ʕ•̫͡•ʔ̫͡ʔ-̫͡-ʔ", + "ヽ༼ຈ┏ل͜┓ຈ༽ノ", + "(°ヮ°)", + "ᕕ( ಠ‿ಠ)ᕗ", + "(っಠ‿ಠ)っ", + "( ͡; ͜ʖ ͡;)", + "( ͡☉ ͜ʖ ͡☉)", + "ヽ(╯▽╰)ノ", + "ヽ(╯ل͜╰)ノ", + "┌(° ͜ʖ͡°)┘", + "╰( ͡’◟◯ ͡’)╯", + "(╯ຈل͜ຈ) ╯︵ ┻━┻", + "┬───┬ ノ༼ຈل͜ຈノ༽", + "( ◔ ౪◔)", + "ヽ(”`▽´)ノ", + "(◕‿◕✿)", + "ヽ༼ • ͜ •༽ノ", + "(=◕ل͜◕=)", + "ᕙ (° ~͜ʖ~ °) ᕗ", + "─=≡Σ((( つ◕ل͜◕)つѰ", + "ʘ ͜ʖ ʘ", + "༼ノຈل͜ຈ༽ノ︵┻━┻", + "╭∩╮◕ل͜◕)╭∩╮", + "───==≡≡ΣΣ((( つºل͜º)つ", + "(º◡º)っ", + "ᕕ༼✪ل͜✪༽ᕗ", + "(◕ل͜◕)", + "(╯ ͝° ͜ʖ͡°)╯︵ ┻━┻", + }, + "heart": []string{ + "└໒( ♥ ◡ ♥ )७┘", + }, + "huh": []string{ + "〳 ◔ Ĺ̯ ◔ 〵", + "乁໒( ͒ ⌂ ͒ )७ㄏ", + "ʕ ᵒ̌ ‸ ᵒ̌ ʔ", + "(⊹◕ʖ̯◕)", + "໒( ” ͠° ʖ̫ °͠ ” )७", + "ʕ ͠° ʖ̫ °͠ ʔ", + }, + "hungry": []string{ + "╰⋃╯ლ(´ڡ`ლ)", + }, + "intrigued": []string{ + "ʕ ͡° ʖ̫ °͡ ʔ", + }, + "ip": []string{}, + "kiss": []string{ + "(• ε •)", + "(❛ε❛“)", + }, + "lenny": []string{ + "(ノ͡° ͜ʖ ͡°)ノ︵┻┻", + "( ͡° ͜ʖ ͡°)=ε✄", + "ᕦ( ͡° ͜ʖ ͡°)ᕤ", + "┴┬┴┤( ͡° ͜ʖ├┬┴┬", + "ᕙ( ͡° ͜ʖ ͡°)ᕗ", + "(つ ͡° ͜ʖ ͡°)つ", + "( ʘ̆ ╭͜ʖ╮ ʘ̆ )", + "( ◔ ʖ̯ ◔ )", + "(∩ ͡ ° ʖ ͡ °) ⊃-(===>", + "( ͡° ʖ̯ ͡°)", + "ヽ( ͝° ͜ʖ͡°)ノ", + "( ͡° ͜ʖ ͡°)>⌐■-■", + "( ͡° ͜ʖ ͡°)", + "ヽ(͡◕ ͜ʖ ͡◕)ノ", + "╚═( ͡° ͜ʖ ͡°)═╝", + "╰( ͡° ͜ʖ ͡° )つ──☆*:・゚", + "( ͡☉ ͜ʖ ͡☉)", + "(ง ° ͜ ʖ °)ง", + "ᕕ( ͡° ͜ʖ ͡°)ᕗ", + "─=≡Σᕕ( ͡° ͜ʖ ͡°)ᕗ", + }, + "lower": []string{ + "┌༼◉ل͟◉༽┐", + "┌༼ – _ – ༽┐", + "┌( •́ ਊ •̀ )┐", + "┌[ ◔ ͜ ʖ ◔ ]┐", + "┌། ☯ _ʖ ☯ །┐", + "┌། ≖ Ĺ̯ ≖ །┐", + "┌( ◐ o ◐ )┐", + "┌〳 ˵ •́ o •̀ ˵ 〵┐", + "┌[ ಠ ▃ ಠ ]┐", + "┌༼ ˘ 益 ˘ ༽┐", + "┌( ՞ ڡ ՞ )┐", + "┌▐ ☯ ۝ ☯ ▐┐", + "┌〳 ۞ ﹏ ۞ 〵┐", + "┌༼▀̿ Ĺ̯▀̿༽┐", + "╭(ʘ̆~◞౪◟~ʘ̆)╮", + "┌░ : ◔ ਊ ◔ : ░┐", + "┏༼ ◉ ╭╮ ◉༽┓", + "┌໒( : ⊘ ۝ ⊘ : )७┐", + "┌〳 ・ o ・ 〵┐", + "┌║ ・ิ 〜 ・ิ ║┐", + "┌༼ ” ۞ – ۞ ” ༽┐", + "┌ʕ º ʖ̯ º ʔ┐", + "┏། ﹒ _ ﹒ །┓", + "ノ║ ಠ ਊ ಠೃ ノ║", + "┌║ ຈ ε ຈ ║┐", + "┌༼ ⊘ _ ⊘ ༽┐", + "┏༼ •́ ╭╮ •̀ ༽┓", + "┌(▀Ĺ̯▀)┐", + "┌╏ •́ – •̀ ╏┐", + "┌[ O ʖ̯ O ]┐", + "┌╏ º □ º ╏┐", + "┌༼ σ ‸ σ ༽┐", + "┌(▀Ĺ̯ ▀-͠ )┐", + "ノ(;Ĺ̯̿̿ ;ノ)", + }, + "mad": []string{ + "¯_| ಠ ∧ ಠ |_/¯", + "⋌༼ •̀ ⌂ •́ ༽⋋", + "୧( ಠ Д ಠ )୨", + "┌( ◕ 益 ◕ )ᓄ", + "╚═| ~ ಠ ₒ ಠ ~ |═╝", + "╰༼ ⋋ ‸ ⋌ ༽╯", + "╭∩╮(ಠ۝ಠ)╭∩╮", + "╰༼ •̀۝•́ ༽╯", + "乁ʕ •̀ ۝ •́ ʔㄏ", + "(っ-̶●̃益●̶̃)っ", + "ᕕ(˵•̀෴•́˵)ᕗ", + "ლ( ¤ 益 ¤ )┐", + "୧( ͡ᵔ 益 ͡ᵔ )୨", + "༼ •̀ ₒ •́ ༽", + "(つ◉益◉)つ", + "ლ(ಠ益ಠლ)", + "/( .□.) ︵╰(゜益゜)╯︵ /(.□. /)", + "(┛ಠДಠ)┛彡┻━┻", + "໒( ∗ ⇀ 3 ↼ ∗ )७", + "乁║ ˙ 益 ˙ ║ㄏ", + "凸( •̀ 3 •́ )凸", + "ᕦ໒( ⊡ 益 ⊡ )७ᕤ", + "[ : • 益 • : ]", + "( ▀ 益 ▀ )", + "(╬ ಠ益ಠ)", + "ᕦ໒( ᴼ 益 ᴼ )७ᕤ", + "༼ ಠ ͟ʖ ಠ ༽", + "໒( ˵ ° ۝ ° ˵ )७", + "໒( ᓀ ‸ ᓂ )७", + "║ * ರ Ĺ̯ ರ * ║", + "[ノಠೃಠ]︻̷┻̿═━一", + "†ヽ[ಠĹ̯ಠ]ノ", + "╰༼=ಠਊಠ=༽╯", + "༼ง=ಠ益ಠ=༽ง", + "╚▒ᓀ▃ᓂ▒╝", + "໒( , ್ ∧ ್ , )७", + "ᕕ⁞ ್ ۝ ್ ⁞┘", + "໒( : ͡☉ 〰 ͡☉ : )७", + "o͡͡͡╮⁞ ˵ ᓀ ︿ ᓂ ˵ ⁞╭o͡͡͡", + "⋋╏ ᓀ 〜 ᓂ ╏⋌", + "[ ” ಠ ‸ ಠ ” ]", + "໒( ˵☉ ͟ʖ ☉˵ )७", + "ʕ ﹒︣ ᴥ ﹒︣ ʔ", + "૮( ᵒ̌皿ᵒ̌ )ა", + "(ఠ్ఠ ˓̭ ఠ్ఠ)", + "ლ(ಠ益ಠ)ლ", + "୧༼ ͡◕ д ◕͡ ༽୨", + "└| ಠ ‸ ಠ |┘", + "(╯°□°)╯︵ ( . 0 .)", + "ლ( `Д’ ლ)", + "╏つ ͜ಠ ‸ ͜ಠ ╏つ", + "╰| ⁰ ෴ ⁰ |╯", + "ヽ| ͡☉ ︿ ͡☉ |ノ⌒.", + "୧⁞ ˵ ・ 益 ・ ˵ ⁞୨", + "༼ ˵ ❛ 益 ❛ ˵ ༽", + "[ ಠ □ ಠೃ ]", + "( ✿ •̀ ‸ •́ ✿ )", + "[ ಠ (oo) ಠ ]", + "༼ ಠ ▃ ಠೃ ༽", + "༼ ∗ •̀ (oo) •́ ∗ ༽", + "c༼ ” ͡° ▃ °͡ ” ༽ᕤ", + "໒( ˵ •̀ □ •́ ˵ )७", + "へʕ ∗ ´ ۝ ´ ∗ ʔ┘", + "┌໒( : ͡° д °͡ : )७┐", + "੧(❛〜❛✿)੭", + "୧༼ಠ益ರೃ༽୨", + "┻━┻ ︵ヽ(`Д´)ノ︵ ┻━┻", + }, + "magic": []string{ + "ᕙ(░ಥ╭͜ʖ╮ಥ░)━☆゚.*・。゚", + "╰( ⁰ ਊ ⁰ )━☆゚.*・。゚", + "(ノ◕ヮ◕)ノ*:・゚✧", + "╰(✿˙ᗜ˙)੭━☆゚.*・。゚", + "(つ˵•́ω•̀˵)つ━☆゚.*・。゚҉̛༽̨҉҉ノ", + "(つ◕౪◕)つ━☆゚.*・。゚", + "╰〳˵ ✖ Д ✖ ˵〵⊃━☆゚.*・。゚", + "༼∩ຈل͜ຈ༽つ━☆゚.*・。゚", + ". * ・ 。゚☆━੧༼ •́ ヮ •̀ ༽୨", + "༼∩ •́ ヮ •̀ ༽⊃━☆゚. * ・ 。゚", + "(⊃。•́‿•̀。)⊃━☆゚.*・。゚", + "╰(•̀ 3 •́)━☆゚.*・。゚", + "ヽ༼ຈل͜ຈ༽⊃─☆*:・゚", + "ᕦ( ~ ◔ ᴥ ◔ ~ )੭━☆゚.*・。゚", + "ᕦ( ˵ ◕ д ◕ ˵ )੭━☆゚.*・。゚", + "o͡͡͡╮༼ ಠДಠ ༽╭o͡͡͡━☆゚.*・。゚", + "ᕦ( ✿ ⊙ ͜ʖ ⊙ ✿ )━☆゚.*・。゚", + "(∩`-´)⊃━☆゚.*・。゚", + "༼∩✿ل͜✿༽⊃━☆゚. * ・ 。゚", + "༼∩☉ل͜☉༽⊃━☆゚. * ・ 。゚", + "╰( ͡° ͜ʖ ͡° )つ──☆*:・゚", + }, + "man": []string{ + "( ͡↑ ͜ʖ ͡↑)", + "୧( ಠ Д ಠ )୨", + "໒( ͡ᵔ ▾ ͡ᵔ )७", + "໒( • ͜ʖ • )७", + "୧( ಠ┏ل͜┓ಠ )୨", + "( ͡°╭╮ʖ ͡°)", + "໒( ݓ Ĺ̯ ݓ )७", + "໒( ಥ Ĺ̯ ಥ )७", + "໒( •̀ ╭ ͟ʖ╮ •́ )७", + "໒( ❛ั Ĺ̯ ❛ั )७", + "໒( * ͒ ʖ̫ ͒ * )७", + "໒( ” ͒ Ĺ̯ ͒ ” )७", + "୧( ⊚ ╭͜ʖ╮ ⊚ )୨", + "໒( ͡ᵔ ͜ʖ ͡ᵔ )७", + "໒( ิ Ĺ̯ ิ )७", + "( ◕ ʖ̯ ◕ )", + "໒( . ͡° ͟ʖ ͡° . )७┌∩┐", + "໒( ⊡ _ ⊡ )७", + "¯_( ͠° ͟ʖ °͠ )_/¯", + "໒( ﹒ ͜ر ﹒ )७", + "└໒( ” x ͟ʖ x ” )७┘", + "໒( : ⊗ Ĺ̯ ⊗ : )७", + "໒( ☉ ͜ʖ ☉ )७", + "໒( ” ͠° ʖ̫ °͠ ” )७", + "໒( ˵☉ ͟ʖ ☉˵ )७", + "໒( ✿ ❛ ͜ʖ ❛ ✿ )७", + "c( ˵ ╥ ͟ʖ ╥ ˵ )੭", + "། ” ் ʖ̯ ் ” །", + "໒( ・ Ĺ̯ ・ )७", + "୧[ ˵ ͡ᵔ ͜ʟ ͡ᵔ ˵ ]୨", + "໒( , ⊙ Ĺ̯ ⊙ , )७", + "໒( = ಠ ◡ ಠ = )७", + }, + "meh": []string{ + "╏ ” ⊚ ͟ʖ ⊚ ” ╏", + "(⁰ ◕〜◕ ⁰)", + "┌། ☯ _ʖ ☯ །┐", + "(╭ರ_⊙)", + "(=ಠ ل͟ ಠ=)", + "( ຈ ﹏ ຈ )", + "ヽ║ ˘ _ ˘ ║ノ", + "། – _ – །", + "( ‘_>’)", + "┴┬┴┤・_・├┴┬┴", + "⋋〳 ᵕ _ʖ ᵕ 〵⋌", + "▐ ✪ _ ✪▐", + "໒( ⊡ _ ⊡ )७", + "╏ ˵ ・ ͟ʖ ・ ˵ ╏", + "༼ : ౦ ‸ ౦ : ༽", + "¯_(ツ)_/¯", + "( ˘ ▃ ˘ )", + "┌[ O ʖ̯ O ]┐", + "| . ☉ ~ ☉ . |", + "╰╏ ◉ 〜 ◉ ╏╯", + "╏ ◔ _̀ ◔ ╏", + "ᕦ⁞ ˵ ͡◕ ╭ ͟ʖ╮ ◕͡ ˵ ⁞ᕤ", + "┌| ◔ ▃ ◔ |┐", + "( ੭눈 _ 눈 )੭", + "乁། * ❛ ͟ʖ ❛ * །ㄏ", + "໒( ・ Ĺ̯ ・ )७", + "乁⁞ ◑ ͜ر ◑ ⁞ㄏ", + "༼ ~ ͡■ _ ■͡ ~ ༽", + "(ºل͟º)", + "┌∩┐༼ ºل͟º ༽┌∩┐", + "(งಠ_ಠ)ง", + "༼ノಠل͟ಠ༽ノ ︵ ┻━┻", + "乁( ◔ ౪◔)ㄏ", + }, + "mob": []string{ + "ヽ༼ ☯‿☯༼ ಠ益ಠ༽◕ل͜◕༽つ", + "༼ ºل͟º༼ ºل͟º ༽ºل͟º ༽ºل͟º ༽", + "༼ ºل͟º༼ ºل͟º( ͡° ͜ʖ ͡°)ºل͟º ༽ºل͟º ༽", + "(-(-(-_-)-)-)", + "༼ ºل͟º༼ ºل͟º༽", + "ʕ•̫͡•ʕ̫͡ʕ•͓͡•ʔ-̫͡-ʕ•̫͡•ʔ̫͡ʔ-̫͡-ʔ", + "༼୨༼ ºل͟º ༽୧༽", + "ヽ༼ ʘ̚ل͜ʘ̚༼◕_◕༽◉_◔ ༽ノ", + "ヽ༼ ຈل͜ຈ༼ ▀̿̿Ĺ̯̿̿▀̿ ̿༽Ɵ͆ل͜Ɵ͆ ༽ノ", + }, + "money": []string{ + "・。゚[̲̅$̲̅(̲̅ ͡° ͜ʖ ͡°̲̅)̲̅$̲̅]。゚.*", + }, + "monocle": []string{ + "ᕙ〳 ರ ︿ ರೃ 〵ᕗ", + "( ರ Ĺ̯ ರೃ )", + "(╭ರ_⊙)", + "(╭ರᴥ•́)", + "╰〳 ಠ 益 ಠೃ 〵╯", + "(╭ರ_•́)", + "ᕙ໒( ˵ ಠ ╭͜ʖ╮ ಠೃ ˵ )७ᕗ", + "༼ ಠ ▃ ಠೃ ༽", + "୧༼ಠ益ರೃ༽୨", + }, + "moustache": []string{ + "୧( ಠ┏ل͜┓ಠ )୨", + "(^┌_̀┐^)", + "(^┌_̀┐^)", + "ᕙ (° ~͜ʖ~ °) ᕗ", + }, + "music": []string{ + "(✿ ◕ᗜ◕)━♫.*・。゚", + "ᕕ(⌐■_■)ᕗ ♪♬", + "♪~ ᕕ( ᐛ )ᕗ", + "♪O", + "┐(・。・┐) ♪", + "♪ヽ( ⌒o⌒)人(⌒-⌒ )v ♪", + "ヽ(⌐■_■)ノ♪♬", + }, + "paper": []string{ + "ᕙノ•̀ʖ•́ノ୨", + }, + "point": []string{ + "ԅ( ͒ ۝ ͒ )ᕤ", + "ԅ། ຈ ◞౪◟ຈ །و", + "ヽ〳 ՞ ᗜ ՞ 〵ง", + "ԅ། – ‸ – །ᕗ", + "ᕦ༼◣_◢༽つ", + "ԅ(☉Д☉)╮", + "ԅ༼ * ◕ ∧ ◕ * ༽ノ", + "ԅ༼ . º ʖ̯ º . ༽ง", + "╰(”◕﹏◕”)つ", + "ԅ╏ ᴼ ︿ ᴼ ╏੭", + "ԅ༼ : ◕ ۝ ◕ : ༽╯", + "ԅ༼ * ✖ ۝ ✖ * ༽୨", + "ᕕ║ ⊘ ౪ ⊘ ║ㄏ", + "ԅ▒ ˘ ▾ ˘ ▒┘", + "੧║ : ︣ ヮ ︣ : ║ㄏ", + "☜(゚ヮ゚☜)", + "ԅ║ ⁰ ۝ ⁰ ║┐", + "ᕙ(˵◕ω◕˵✿)つ", + "ԅ[ * ༎ຶ _ ༎ຶ * ]┐", + "ヽ། ﹒ ~ ﹒ །╮", + "ԅ⁞ ◑ ₒ ◑ ⁞ᓄ", + "ヽ⁞ ~ ◉ – ◉ ~ ⁞و", + "(☞゚ヮ゚)☞", + "ヽ༼ ʘ ∧ ʘ ༽ᓄ", + "ლ║ ✿ ☉ ω ☉ ✿ ║ᓄ", + "ლ༼ * ・ ⌂ ・ * ༽ᓄ", + "ᕕ[ ᓀ ڡ ᓂ ]ㄏ", + "c〳 ° ▾ ° 〵つ", + "ԅ| . ͡° ڡ ͡° . |ᕤ", + "ԅ༼ ・ 〜 ・ ༽╯", + "੧| ✿ ◔ ں ◔ ✿ |ᓄ", + "༼.◕ヮ◕.༽つ", + "੧| ⊗ ▾ ⊗ |୨", + "ԅ། ・ิ _ʖ ・ิ །ง", + "ԅ║ ಠ ਊ ಠೃ ║୨", + "ԅ╏ ˵ ⊚ ◡ ⊚ ˵ ╏┐", + "ԅ໒( ☯ ᗜ ☯ )७ᕗ", + "ԅ། ^ ͜ʟ ^ །و", + "ԅ[ •́ ﹏ •̀ ]و", + "(º◡º)っ", + }, + "punch": []string{ + "O–(’̀-’̀Q )", + "ᕕ໒( • ʖ̫ • )७╮", + "ᕕ╏ ^ ◡ ^ ╏ᓄ", + }, + "pyramid": []string{ + "ᕙ〳 ರ ︿ ರೃ 〵ᕗ", + "ヽ〳 ՞ ᗜ ՞ 〵ง", + "〳 ◔ Ĺ̯ ◔ 〵", + "〳 •́ ﹏ •̀ 〵", + "〳 ◉ ͜ʖ ◉ 〵", + "┌〳 ˵ •́ o •̀ ˵ 〵┐", + "ᕕ〳 ཀ 益 ཀ 〵ง", + "〳 ‾́ ﹏ ‾́ 〵", + "╰〳 ՞ Ĺ̯ ՞ 〵ノ⌒.", + "〳 ^ ▽ ^ 〵", + "┌〳 ۞ ﹏ ۞ 〵┐", + "乁〳 ” ˘ ෴ ˘ ” 〵ㄏ", + "╰〳 ಠ 益 ಠೃ 〵╯", + "凸〳 ಥ ڡ ಥ 〵凸", + "╰〳˵ ✖ Д ✖ ˵〵⊃━☆゚.*・。゚", + "੧〳 ˵ ಠ ᴥ ಠ ˵ 〵ノ⌒.", + "乁〳 ❛ д ❛ 〵ㄏ", + "ᕦ〳 ◑ ‸ ◑ 〵ᕤ", + "⋋〳  ̄ ᴥ  ̄ 〵⋌", + "〳 ͡° Ĺ̯ ͡° 〵", + "╚═〳 ͡ᵔ ▃ ͡ᵔ 〵═╝", + "⋋〳 ᵕ _ʖ ᵕ 〵⋌", + "〳 : ⊘ ڡ ⊘ : 〵", + "c〳 ° ▾ ° 〵つ", + "c〳 ݓ ﹏ ݓ 〵੭", + "୧〳 ^ ౪ ^ 〵୨", + "ᕕ〳 ◕ ◞౪◟ ◕ 〵╭o͡͡͡", + "┌〳 ・ o ・ 〵┐", + "ᕕ〳 ் (oo) ் 〵╯", + "୧〳 ” ʘ̆ ᗜ ʘ̆ ” 〵୨", + "o͡͡͡╮〳 ~ ☉ ₒ ☉ ~ 〵╭o͡͡͡", + "〳 = ◑ ‸ ◑ = 〵", + "୧〳 ” • ڡ • ” 〵୨", + "ᕙ〳 ʘ – ʘ 〵ᕗ", + "〳 ☯ ﹏ ☯ 〵", + }, + "raise": []string{ + "╰། ◉ ◯ ◉ །╯", + "╚═། ◑ ▃ ◑ །═╝", + "╰[ ⁰﹏⁰ ]╯", + "└༼ ಥ ᗜ ಥ ༽┘", + "╚═| ~ ಠ ₒ ಠ ~ |═╝", + "╰໒( ි ▾ ි )७╯", + "╚═[ ˵✖‿✖˵ ]═╝", + "╰(◕ᗜ◕)╯", + "╚═▐ ۞ ~ ۞ ▐═╝", + "╰[✿•̀o•́✿]╯", + "╰(˵ヘωヘ✿)╯", + "╰༼ •̀۝•́ ༽╯", + "╰( ◕ ᗜ ◕ )╯", + "╚═░ ・ ﹏ ・ ░═╝", + "╰{ ˵◕_◕˵ }╯", + "༼ノ۞⌂۞༽ノ", + "╰( . •́ ͜ʖ •̀ . )╯", + "╰༼ ❛ ʖ̫ ❛ ༽╯", + "╰། ͒ ▃ ͒ །╯", + "╰| ՞ Ĺ̯ ՞ |╯", + "└▐ ◐ ◯ ◐ ▐┘", + "(:ㄏ■ Д ■ :)ㄏ", + "╰໒(◉ᴥ◉)७╯", + "└( ՞ ~ ՞ )┘", + "╰〳 ಠ 益 ಠೃ 〵╯", + "٩(◕‿◕。)۶", + "╰[✖Ĺ̯ಠ]╯", + "ʕ◕‿◕ʔ /", + "╰( ◕ ^ ◕ )╯", + "╚═[ ☉ ڡ ☉ ]═╝", + "└໒( ♥ ◡ ♥ )७┘", + "└༼ •́ ͜ʖ •̀ ༽┘", + "╚═╏ ⇀ ͜ر ↼ ╏═╝", + "╰| ° ◞౪◟ ° |╯", + "╰໒( ” ¤ ‿ ¤ ” )७╯", + "╰༼ ∗ ಡ ▾ ಡ ∗ ༽╯", + "└། – 〜 – །┘", + "╚═໒( ” ◖ 〰 ◗ ” )७═╝", + "╰[ ° 益 ° ]╯", + "╚═〳 ͡ᵔ ▃ ͡ᵔ 〵═╝", + "└། ๑ _ ๑ །┘", + "└( ͡° ︿ °͡ )┘", + "╰༼=ಠਊಠ=༽╯", + "ヽ༼ ◉ ͜ ◉༽ノ", + "╚═། ” ಡ Д ಡ ” །═╝", + "└། . ⊙ ◞౪◟ ⊙ . །┘", + "╰໒( = ◕ ◯ ◕ = )७╯", + "୧〳 ” • ڡ • ” 〵୨", + "o͡͡͡╮། * ◔ ʖ̫ ◔ * །╭o͡͡͡", + "╰༼ ・ิ ﹏ ・ิ ༽╯", + "╰╏ ◉ 〜 ◉ ╏╯", + "└⁞ ۞ Ĺ̯ ۞ ⁞┘", + "╚═། . ◯ o ◯ . །═╝", + "╚═░ ◕ ▽ ◕ ░═╝", + "ლ(ಠ_ಠლ)", + "╰། ﹒ _ ﹒ །╯", + "╚═╏ . ˘ ڡ ˘ . ╏═╝", + "└| ಠ ‸ ಠ |┘", + "ლ(- ◡ -ლ)", + "╰། ❛ ڡ ❛ །╯", + "o͡͡͡╮༼ ◔ _ ◔ ༽╭o͡͡͡", + "└[ ◕ 〜 ◕ ]┘", + "╚═[ ˵ •̀ ﹏ •́ ˵ ]═╝", + "╰໒( ͡ຈ ᴥ ຈ͡ )७╯", + "‎(/.__.)/", + "ヽ༼ ͠ ͠° ͜ʖ ͠ ͠° ༽ノ", + "╰(⇀‸↼)╯", + "╰(⇀⌂↼‶)╯", + "( ノ ゚ー゚)ノ", + "(ノಠ_ಠ)ノ", + "ヽ༼ ˙ ͜ʟ˙ ༽ノ", + "٩(ˊᗜˋ*)و", + "ლ༼ཹ༽ლ", + "ヽ( ͝° ͜ʖ͡°)ノ", + "ヽ(´・ω・`)ノ", + "└(◉◞౪◟◉)┘", + "(ノ ̿ ̿ᴥ ̿ ̿)ノ", + "(╯・ิ-・ิ)╯", + "(/◔ ◡ ◔)/", + "(_/¯◜ ω ◝)_/¯", + "ノಠ_ಠノ", + "ヽ༽ຈل͜ຈ༼ノ", + "ヽ༼ ; ل͜ ; ༽ノ", + "ヽ༼, ͡ຈ ͜ʖ ͡ຈ,༽ノ", + "ヽ(͡◕ ͜ʖ ͡◕)ノ", + "ヽ༼ຈ┏ل͜┓ຈ༽ノ", + "╚═( ͡° ͜ʖ ͡°)═╝", + "ヽ(‘ºل͟º)ノ", + "ヽ༼✡ل͜✡༽ノ", + "✡✡ヽ༼ຈل͜ຈ༽ノ✡✡", + "ლ(▀̿̿Ĺ̯̿̿▀̿ლ)", + "ヽ(╯▽╰)ノ", + "ヽ(╯ل͜╰)ノ", + "ヽ༼ ◉_◔ ༽ノ", + "╰( ͡’◟◯ ͡’)╯", + "ヽ(ಠ▃ಠ)ノ", + "ヽ༼ • ͜ •༽ノ", + }, + "robot": []string{ + "[-c°▥°]-c", + "[ ☯ ͜ʟ ☯ ]", + "└[ ◕ 〜 ◕ ]┘", + }, + "run": []string{ + "ᕕ( ՞ ᗜ ՞ )ᕗ", + "ᕕ( ཀ ʖ̯ ཀ)ᕗ", + "ᕕ(◉Д◉ )ᕗ", + "ᕕ{ ͒ ʖ̯ ͒ }ᕗ", + "ᕕ(˵•̀෴•́˵)ᕗ", + "ᕕ〳 ཀ 益 ཀ 〵ง", + "ᕕ( ⁰ ▽ ⁰ )ᕗ", + "┗(^0^)┓", + "ᕕ(ಥʖ̯ಥ)ᕗ", + "ᕕ┌◕ᗜ◕┐ᕗ", + "ᕕ༼✿•̀︿•́༽ᕗ", + "ᕕ[ ・ ▾ ・ ]ᕗ", + "ᕕ| ͡■ ﹏ ■͡ |و", + "┌( ಠ‿ಠ)┘", + "ᕕ⁞ ᵒ̌ 〜 ᵒ̌ ⁞ᕗ", + "└╏ ・ ᗜ ・ ╏┐", + "₍₍ ᕕ༼.◕ヮ◕.༽ᕗ⁾⁾", + "₍₍ ᕕ( * ⊙ ヮ ⊙ * )ᕗ⁾⁾", + "へ║ ☉ д ☉ ║ᕗ", + "ᕕ[ º Ĺ̯ º ]ᕤ", + "ᕕ( ◔3◔)ᕗ", + "ᕕ| ◉ ͜ʟ ◉ |ง", + "ᕕ║ = ◔ ヮ ◔ = ║୨", + "ᕕ╏ ͜ಠ ‸ ͜ಠ ╏ᓄ", + "ᕕ༼ •́ Д •̀ ༽ᕗ", + "₍₍ ᕕ(´◓⌓◔)ᕗ⁾⁾", + "ᕕ༼ຈل͜ຈ༽ᕗ", + "ᕕ( ᐛ )ᕗ", + "ᕕ( ಠ‿ಠ)ᕗ", + "ᕕ(  ´ Д `  )ᕗ", + "ᕕ(⌐□ل͜□)ᕗ", + "ᕕ( ͡° ͜ʖ ͡°)ᕗ", + "ᕕ༼✪ل͜✪༽ᕗ", + "─=≡Σᕕ( ͡° ͜ʖ ͡°)ᕗ", + "┌( ಠ_ಠ)┘", + }, + "ry": []string{}, + "sad": []string{ + "o͡͡͡╮༼ • ʖ̯ • ༽╭o͡͡͡", + "┻┻︵⁞=༎ຶ﹏༎ຶ=⁞︵┻┻", + "ლ(ಥ Д ಥ )ლ", + "┌(˵༎ຶ ل͟ ༎ຶ˵)┐", + "ᕕ( ཀ ʖ̯ ཀ)ᕗ", + "( ຈ ﹏ ຈ )", + "(-_-。)", + "໒( ݓ Ĺ̯ ݓ )७", + "໒( ಥ Ĺ̯ ಥ )७", + "໒( ❛ั Ĺ̯ ❛ั )७", + "໒( •́ ‸ •̀ )७", + "ᕕ〳 ཀ 益 ཀ 〵ง", + "| ” ☯ ︿ ☯ ” |", + "໒( ” ͒ Ĺ̯ ͒ ” )७", + "( * ಥ ⌂ ಥ * )", + "〳 ‾́ ﹏ ‾́ 〵", + "། ﹒︣ ‸ ﹒︣ །", + "ᕕ(ಥʖ̯ಥ)ᕗ", + "(///_-)", + "ԅ[ * ༎ຶ _ ༎ຶ * ]┐", + "( ◕ ʖ̯ ◕ )", + "༼ ╥ ل ╥ ༽", + "⋋〳 ᵕ _ʖ ᵕ 〵⋌", + "┏༼ ◉ ╭╮ ◉༽┓", + "╏ : ◉ ∧ ◉ : ╏", + "┌ʕ º ʖ̯ º ʔ┐", + "୧| ͡ᵔ ﹏ ͡ᵔ |୨", + "┏༼ •́ ╭╮ •̀ ༽┓", + "໒( ͡; 益 ͡; )७┌∩┐", + "ʕ ಡ ﹏ ಡ ʔ", + "໒( : ⊗ Ĺ̯ ⊗ : )७", + "ᕦ[ ˵ ຈ ︿ ຈ ˵ ]ᕤ", + "། ” ் ʖ̯ ் ” །", + "༼ ∗ ͝° _ʖ ͝° ∗ ༽", + "╭(๑¯д¯๑)╮", + "໒( ・ Ĺ̯ ・ )७", + "໒( , ⊙ Ĺ̯ ⊙ , )७", + "། ˵ ︣ ෴ ︣ ˵ །", + "(╯°□°)╯︵ ( . 0 .)", + "〳 ☯ ﹏ ☯ 〵", + "【=◈︿◈=】", + "╏ ⊙ Ĺ̯ ⊙ ╏", + "( ◔ ʖ̯ ◔ )", + "໒( ◉ ‸ ◉ )७", + "o͡͡͡╮༼ . •́ _ʖ •̀ . ༽╭o͡͡͡", + "ε(´סּ︵סּ`)з", + "(⋟﹏⋞)", + "ᗜੂͦ﹏ᗜੂͦ", + "ͼ(ݓ_ݓ)ͽ", + "(ಥ﹏ಥ)", + ".·´¯`(>▂", + "(ू˃̣̣̣̣̣̣︿˂̣̣̣̣̣̣ ू)", + "(.﹒︣︿﹒︣.)", + "( ཀ͝ ∧ ཀ͝ )", + "(;´༎ຶД༎ຶ`)", + "༼;´༎ຶ ۝ ༎ຶ༽", + "( ͡° ʖ̯ ͡°)", + "(◔ д◔)", + "( ͡°ᴥ ͡° ʋ)", + "(◞‸◟;)", + "ノ(;Ĺ̯̿̿ ;ノ)", + "(̿ಠ ̿Ĺ̯̿̿ಠ ̿)̄", + "ಠ⌣ಠ", + }, + "scared": []string{ + "ԅ( ͒ ۝ ͒ )ᕤ", + "o͡͡͡╮༼ • ʖ̯ • ༽╭o͡͡͡", + "(◕⌂◕⊃⊃)", + "(∩╹□╹∩)", + "╰[ ⁰﹏⁰ ]╯", + "〳 •́ ﹏ •̀ 〵", + "ԅ(☉Д☉)╮", + "╰(ಥдಥ)ノ", + "ʕ⊙ᴥ⊙ʔ", + "໒( ◑ w ◑ )७", + "ᕕ(◉Д◉ )ᕗ", + "໒( ∗ ⊘ ﹏ ⊘ ∗ )७", + "ԅ༼ . º ʖ̯ º . ༽ง", + "(∩◕(oo)◕∩ )", + "༼ノ۞⌂۞༽ノ", + "╰(”◕﹏◕”)つ", + "o͡͡͡╮[ ⊡ 〜 ⊡ ]╭o͡͡͡", + "| ◯ ‸ ◯ |", + "། ⊙ 益 ⊙ །", + "⋋▐ ” ⊙ ~ ⊙ ” ▐⋌", + "ɖී؀ීϸ", + "╰(⊹◕۝◕ )╯", + "ʕ ͡°̲ (oo) ͡°̲ ʔ", + "⋋⁞ ◔ ﹏ ◔ ⁞⋌", + "ヽ༼ ʘ ∧ ʘ ༽ᓄ", + "〳 ͡° Ĺ̯ ͡° 〵", + "乁໒( ͒ ⌂ ͒ )७ㄏ", + "༼∩•́ω•̀∩༽", + "ᕕ⁞ ᵒ̌ 〜 ᵒ̌ ⁞ᕗ", + "ᕦ[ •́ ﹏ •̀ ]⊃¤=[]::::::::>", + "(⊹◕ʖ̯◕)", + "o͡͡͡╮〳 ~ ☉ ₒ ☉ ~ 〵╭o͡͡͡", + "〳 = ◑ ‸ ◑ = 〵", + "ԅ[ •́ ﹏├┬┴┬┴", + "( ⊙ ʖ̯ ⊙ )", + "┌[ ◐ ‸ ◐ ]┐", + "ԅ[ •́ ﹏ •̀ ]و", + "ᕕ༼ •́ Д •̀ ༽ᕗ", + "₍₍ ᕕ(´◓⌓◔)ᕗ⁾⁾", + "(っ ºДº)っ ︵ ⌨", + "┃ ु ⠁⃘ ⠁⃘ू┃⁼³₌₃", + "(ʘᗩʘ’)", + "(ू˃̣̣̣̣̣̣︿˂̣̣̣̣̣̣ ू)", + "((╬ಠิ﹏ಠิ))", + "(◔ д◔)", + "(╯°□°)╯︵ ส็็็็็็็ส", + "(╯°□°)ຈ҉̛༽̨҉҉ノ̨", + "༼ ⨀ ̿Ĺ̯̿̿⨀ ̿༽ง", + }, + "scary": []string{ + "ლ( ◕ 益 ◕ ) ლ", + "(⊹つ•۝•⊹)つ", + "ᕕ| ~ ⁰ ෴ ⁰ ~ |┐", + "╭(◕◕ ◉෴◉ ◕◕)╮", + "(((༼•̫͡•༽)))", + "(๑•॒̀ ູ॒•́๑)", + "ᕦ⊙෴⊙ᕤ", + "(ノಠ益ಠ)ノ彡┻━┻", + }, + "scissors": []string{ + "( ͡° ͜ʖ ͡°)=ε✄", + }, + "shape": []string{ + "»-(¯`·.·´¯)->", + }, + "shocked": []string{ + "⋋| ◉ ͟ʖ ◉ |⋌", + "(∩╹□╹∩)", + "╏ ° ▃ ° ╏", + "▐ ⊙ ▃ ⊙ ▐", + "┌| ◔ ▃ ◔ |┐", + "(ʘ言ʘ╬)", + "੧║ ☯ ⌂ ☯ ║┐", + "(ʘᗩʘ’)", + }, + "shy": []string{ + "〳 = ◑ ‸ ◑ = 〵", + "(≖ᴗ≖✿)", + "༼ ⨀ ̿Ĺ̯̿̿⨀ ̿༽ง", + }, + "sing": []string{ + "୧(● ՞o ՞●)୨", + }, + "sleep": []string{ + "ヽ༼ -ل͟-༽ノ Zzzzzzz", + "༼ – ل͜ – ༽", + }, + "smug": []string{ + "໒( = ಠ ◡ ಠ = )७", + }, + "snobby": []string{ + "ᕙ( : ˘ ∧ ˘ : )ᕗ", + }, + "spider": []string{ + "╭(◕◕ ◉෴◉ ◕◕)╮", + "/╲/╭(▀̿̿Ĺ̯̿̿▀̿ ̿)╮/╱", + "/╲/╭( ͡° ͡° ͜ʖ ͡° ͡°)╮/╱", + }, + "stars": []string{ + "╭∩╮໒(✪ਊ✪)७╭∩╮", + "╏ ˵ ✪ ﹏ ✪ ˵ ╏", + "▐ ✪ _ ✪▐", + }, + "surprised": []string{ + "╰། ◉ ◯ ◉ །╯", + "ԅ⁞ ◑ ₒ ◑ ⁞ᓄ", + "(ʘ言ʘ╬)", + "(ʘᗩʘ’)", + "༼⁰o⁰;༽", + "༼ ⨀ ̿Ĺ̯̿̿⨀ ̿༽ง", + }, + "sword": []string{ + "∩༼˵☯‿☯˵༽つ¤=[]:::::>", + "ᕙ╏✖۝✖╏⊃-(===>", + "~~~~~~~[]=¤ԅ(ˊᗜˋ* )੭", + "(つ・・)つ¤=[]:::::::>", + "~~~~~~~[]=¤ԅ( ◔益◔ )ᕗ", + "╰༼⇀︿⇀༽つ-]═──", + "੧| ✿ ◔ ں ◔ ✿ |ᓄ¤=[]:::::::::::–", + "੧| ⊗ ▾ ⊗ |⊃¤=(————-", + "~~~~~~~[]=¤ԅ໒( ☯ ᗜ ☯ )७ᕗ", + "╰༼.◕ヮ◕.༽つ¤=[]————", + "c:::::::::::::[]=¤ԅ╏ ˵ ⊚ ◡ ⊚ ˵ ╏┐", + "———–[]=¤ԅ༼ ・ 〜 ・ ༽╯", + "ᕦ[ •́ ﹏ •̀ ]⊃¤=[]::::::::>", + "ᗜಠ o ಠ)¤=[]:::::>", + "(∩ ͡ ° ʖ ͡ °) ⊃-(===>", + }, + "table": []string{ + "(ノ͡° ͜ʖ ͡°)ノ︵┻┻", + "┻┻︵⁞=༎ຶ﹏༎ຶ=⁞︵┻┻", + "┬─┬ノ( ◕◡◕ ノ)", + "[ ᕤ ಠ (oo) ಠ ]ᕤ ︵┻━┻", + "(ノಠдಠ)ノ︵┻━┻", + "_|___|_ ╰(º o º╰)", + "┻━┻ ヘ╰( •̀ε•́ ╰)", + "ʕノ•ᴥ•ʔノ ︵ ┻━┻", + "(┛ಠДಠ)┛彡┻━┻", + "(╯=▃=)╯︵┻━┻", + "(ノ°▽°)ノ︵┻━┻", + "(╯ಠ‿ಠ)╯︵┻━┻", + "┏━┓ ︵ /(^.^/)", + "┳━┳ ヽ༼ಠل͜ಠ༽ノ", + "ヽ༼ຈل͜ຈ༽ノ︵┻━┻", + "(╯°□°)╯︵ ┻━┻", + "(╯ຈل͜ຈ) ╯︵ ┻━┻", + "┬───┬ ノ༼ຈل͜ຈノ༽", + "༼ノಠل͟ಠ༽ノ ︵ ┻━┻", + "(╯ ͝° ͜ʖ͡°)╯︵ ┻━┻", + "(つ☢益☢)つ︵┻━┻", + "┻━┻ ︵ヽ(`Д´)ノ︵ ┻━┻", + }, + "tantrum": []string{ + "o͡͡͡╮| ͠° ▃ °͠ |╭o͡͡͡", + }, + "text": []string{ + "█▬█ █ ▀█▀", + }, + "thinking": []string{}, + "throw": []string{ + "(つ•̀ᴥ•́)つ*:・゚✧", + "༼つಠ益ಠ༽つ ─=≡ΣO))", + "╰〳 ՞ Ĺ̯ ՞ 〵ノ⌒.", + "੧〳 ˵ ಠ ᴥ ಠ ˵ 〵ノ⌒.", + "੧( ◖ ω ◗ )ノ⌒.", + "└(՞▃՞ └)", + "ლ༼ ◕ _̀ ◕ ༽ノ⌒.", + "ヽ| ͡☉ ︿ ͡☉ |ノ⌒.", + "(っ ºДº)っ ︵ ⌨", + "┳━┳ ヽ༼ಠل͜ಠ༽ノ", + "(۶ૈ ᵒ̌ Дᵒ̌)۶ૈ=͟͟͞͞ ⌨", + }, + "tired": []string{ + "ᕦ░ . ‾́ ◯ ‾́ . ░ᕤ", + }, + "touch": []string{ + "੧| ✿ ◔ ں ◔ ✿ |ᓄ", + "( ^◡^)っ (‿|‿)", + }, + "tree": []string{ + "╰། ◉ ◯ ◉ །╯", + "║ ಡ ͜ ʖ ಡ ║", + "ԅ། ຈ ◞౪◟ຈ །و", + "⋋| ◉ ͟ʖ ◉ |⋌", + "ԅ། – ‸ – །ᕗ", + "¯_༽ ಥ Д ಥ ༼_/¯", + "o͡͡͡╮། ❛ั ╭ ͟ʖ╮ ❛ั །╭o͡͡͡", + "༽つ۞﹏۞༼つ ─=≡ΣO))", + "⋋║ . ⊗ o ⊗ . ║⋌", + "ヽ║ ˘ _ ˘ ║ノ", + "੧║ ⊙ ౪ ⊙ ║ᓄ", + "⋋། ⊙ _̀ ⊙ །⋌", + "╰། ͒ ▃ ͒ །╯", + "། □ ෴ □ །", + "། ⊙ 益 ⊙ །", + "╰| ՞ Ĺ̯ ՞ |╯", + "੧║ : ︣ ヮ ︣ : ║ㄏ", + "⋋▐ ” ⊙ ~ ⊙ ” ▐⋌", + "୧| ⁰ ᴥ ⁰ |୨", + "། ﹒︣ ‸ ﹒︣ །", + "ԅ║ ⁰ ۝ ⁰ ║┐", + "⋋╏ ۞ ڡ ۞ ╏⋌", + "║ ⌐ ౪ ⌐ ║", + "། – _ – །", + "ヽ། ﹒ ~ ﹒ །╮", + "⋋⁞ ◔ ﹏ ◔ ⁞⋌", + "ᕙ| ᴼ ʖ̯ ᴼ |ᕗ", + "୧། ☉ ౪ ☉ །୨", + "└། – 〜 – །┘", + "乁| ・ิ ∧ ・ิ |ㄏ", + "┌║ ・ิ 〜 ・ิ ║┐", + "ᕦ║ ⌣ ∧ ⌣ ║ᕤ", + "ԅ| . ͡° ڡ ͡° . |ᕤ", + "└། ๑ _ ๑ །┘", + "┏། ﹒ _ ﹒ །┓", + "୧| ✖ ﹏ ✖ |୨", + "⋋╏ ❛ ◡ ❛ ╏⋌", + "୧| ͡ᵔ ﹏ ͡ᵔ |୨", + "੧| ✿ ◔ ں ◔ ✿ |ᓄ", + "⋋║ ՞ ▽ ՞ ║⋌", + "⋋╏ , ͡° ╭ ͟ʖ╮ ͡° , ╏⋌", + "ԅ། ・ิ _ʖ ・ิ །ง", + "ԅ║ ಠ ਊ ಠೃ ║୨", + "ᕙ| ” ◉ ◡ ◉ ” |ᕗ", + "⋋╏ ヘ ⌂ ヘ ╏⋌", + "੧║ ” ◔ Ĺ̯ ◔ ” ║و", + "o͡͡͡╮| ͠° ▃ °͠ |╭o͡͡͡", + "╰། ﹒ _ ﹒ །╯", + "╚═╏ . ˘ ڡ ˘ . ╏═╝", + "੧║ ☯ ⌂ ☯ ║┐", + "੧| ✿ ◔ ں ◔ ✿ |ᓄ", + "ᕙ། – ڡ – །ᕗ", + "└| ಠ ‸ ಠ |┘", + "། ˵ ︣ ෴ ︣ ˵ །", + "╰| ⁰ ෴ ⁰ |╯", + "ᕙ། ◕ – ◕ །ᕗ", + "ᕕ║ = ◔ ヮ ◔ = ║୨", + "┌| . ิ 〰 ิ . |┐", + "ԅ། ^ ͜ʟ ^ །و", + }, + "ugly": []string{ + "( ͡°╭╮ʖ ͡°)", + "ᕕ( ཀ ʖ̯ ཀ)ᕗ", + "༼▃ Ĺ̯ ▃༽", + "╭(ʘ̆~◞౪◟~ʘ̆)╮", + "[ノಠೃಠ]︻̷┻̿═━一", + "╭(◕◕ ◉෴◉ ◕◕)╮", + "༽つ۞﹏۞༼つ", + "(ఠ్ఠ ˓̭ ఠ్ఠ)", + }, + "umbrella": []string{ + "ヽ༼ಢ_ಢ༽ノ☂", + }, + "uncategorized": []string{ + "( ´_ゝ`)", + "╰| ° ◞౪◟ ° |╯", + "ヽヽ༼༼ຈຈل͜ل͜ຈຈ༽༽ノノ", + "(O ʖ O)", + "ヽ༼, ͡X ͜ʖ ͡X,༽ノ", + "༼ຈل͜ຈ༽ノ·︻̷┻̿═━一", + "╭∩╮༼◕ل͜◕༽╭∩╮", + "(-(-(-_-)-)-)", + "ヽ༼ ͠ ͠° ͜ʖ ͠ ͠° ༽ノ", + "(∩`-´)⊃━☆゚.*・。゚", + "╰(⇀‸↼)╯", + "╰(⇀⌂↼‶)╯", + "༼ ಥل͟ಥ ༽", + "༼つ☯﹏☯༽つ", + "ᕙ༼ ͝°益° ༽ᕗ", + "(✿☯‿☯✿)", + "ヽ໒(☯_☯✿)७ノ", + "ᕕ༼ຈل͜ຈ༽ᕗ", + "( ノ ゚ー゚)ノ", + "ヽ༼ຈل͜ຈ༽ノ︵┻━┻", + "(ノಠ_ಠ)ノ", + "(╯°□°)╯︵ ┻━┻", + "ᕕ( ᐛ )ᕗ", + "༼☯﹏☯༽", + "୧༼ಠ益ರೃ༽୨", + "ᕙ༼ຈل͜ຈ༽ᕗ", + "༼ つ ◕o◕ ༽つ", + "( ͡° ʖ̯ ͡°)", + "┌(▀Ĺ̯ ▀-͠ )┐", + "ヽ༼ ˙ ͜ʟ˙ ༽ノ", + "(◔ д◔)", + "٩(ˊᗜˋ*)و", + "ლ༼ཹ༽ლ", + "( ͡°ᴥ ͡° ʋ)", + "(ง⌐□ل͜□)ง", + "ヽ( ͝° ͜ʖ͡°)ノ", + "└༼ຈلຈ༽┐", + "凸༼ຈل͜ຈ༽凸", + "ヽ(´・ω・`)ノ", + "└(◉◞౪◟◉)┘", + "( ๑‾̀◡‾́)σ»", + "ヽ༼ -ل͟-༽ノ Zzzzzzz", + "(◞‸◟;)", + "ᕦ⊙෴⊙ᕤ", + "(✿ヘᴥヘ)", + "へ(¬ϖ¬)へ", + "ヽ༼ຈل͜ຈ༽ᓄ†", + "(≖ᴗ≖✿)", + "(ノ ̿ ̿ᴥ ̿ ̿)ノ", + "(╯・ิ-・ิ)╯", + "(/◔ ◡ ◔)/", + "(_/¯◜ ω ◝)_/¯", + "ノಠ_ಠノ", + "୧༼ʘ̆ںʘ̆༽୨", + "ヽ༽ຈل͜ຈ༼ノ", + "༼∩✿ل͜✿༽⊃━☆゚. * ・ 。゚", + "༼∩☉ل͜☉༽⊃━☆゚. * ・ 。゚", + "ノ(;Ĺ̯̿̿ ;ノ)", + "(⌐ ͡■ ͜ʖ ͡■)", + "( ͡° ͜ʖ ͡°)>⌐■-■", + "( ͡° ͜ʖ ͡°)", + "༼⌐■ل͜■༽", + "༼ ຈل͜ຈ༽ノ⌐■-■", + "༼ ຈل͜ຈ༽", + "༼,ຈ_ຈ,༽", + "ヽ༼ ; ل͜ ; ༽ノ", + "ヽ༼, ͡ຈ ͜ʖ ͡ຈ,༽ノ", + "༼ ºل͟º༼ ºل͟º༽", + "ヽ(͡◕ ͜ʖ ͡◕)ノ", + "༼ つ ͡ ͡° ͜ ʖ ͡ ͡° ༽つ", + "ʕ•̫͡•ʕ̫͡ʕ•͓͡•ʔ-̫͡-ʕ•̫͡•ʔ̫͡ʔ-̫͡-ʔ", + "ヽ༼ຈ┏ل͜┓ຈ༽ノ", + "╚═( ͡° ͜ʖ ͡°)═╝", + "(°ヮ°)", + "ᕕ( ಠ‿ಠ)ᕗ", + "ᕙ( ͡◉ ͜ ʖ ͡◉)ᕗ", + "༼୨༼ ºل͟º ༽୧༽", + "ᕦ༼✩ل͜✩༽ᕤ", + "(งಠل͜ಠ)ง", + "(っಠ‿ಠ)っ", + "(̿ಠ ̿Ĺ̯̿̿ಠ ̿)̄", + "ヽ(‘ºل͟º)ノ", + "ヽ༼✡ل͜✡༽ノ", + "✡✡ヽ༼ຈل͜ຈ༽ノ✡✡", + "( ͡; ͜ʖ ͡;)", + "ლ(▀̿̿Ĺ̯̿̿▀̿ლ)", + "┌( ͝° ͜ʖ͡°)=ε/̵͇̿̿/’̿’̿ ̿", + "( ͝ಠ ʖ ಠ)=ε/̵͇̿̿/’̿’̿ ̿", + "╰( ͡° ͜ʖ ͡° )つ──☆*:・゚", + "( ͡☉ ͜ʖ ͡☉)", + "/╲/╭(▀̿̿Ĺ̯̿̿▀̿ ̿)╮/╱", + "(╯°□°)╯︵ ส็็็็็็็ส", + "(ᓄಠ_ಠ)ᓄ", + "ヽ(╯▽╰)ノ", + "ヽ(╯ل͜╰)ノ", + "ᕙ(⇀‸↼‶)ᕗ", + "(ºل͟º)", + "ᕙ(° ͜ಠ ͜ʖ ͜ಠ°)ᓄ", + "༼〜ຈل͜ຈ༽〜", + "┌(° ͜ʖ͡°)┘", + "༼ つ ◕_◕ ༽つ", + "ᕙ(▀̿̿Ĺ̯̿̿▀̿ ̿) ᕗ", + "ヽ༼ ◉_◔ ༽ノ", + "(ง ͡ʘ ͜ʖ ͡ʘ)ง", + "┌∩┐༼ ºل͟º ༽┌∩┐", + "╰( ͡’◟◯ ͡’)╯", + "(╯ຈل͜ຈ) ╯︵ ┻━┻", + "ʕง•ᴥ•ʔง", + "(ง’̀-‘́)ง", + "(งಠ_ಠ)ง", + "(ง ° ͜ ʖ °)ง", + "(́ง◉◞౪◟◉‵)ง", + "ʕっ•ᴥ•ʔっ", + "┬───┬ ノ༼ຈل͜ຈノ༽", + "ヽ(ಠ▃ಠ)ノ", + "ヽ༼◐ل͜◑༽ノ", + "( ◔ ౪◔)", + "(╯°□°)ຈ҉̛༽̨҉҉ノ̨", + "ヽ(”`▽´)ノ", + "ᕙ( ^ ₒ^ c)", + "(◕‿◕✿)", + "༼ つ ▀̿_▀̿ ༽つ", + "༼ノ ◉ ͜ ◉ ༽つ", + "( つ★ل͜ ★)つ", + "ヽ༼ • ͜ •༽ノ", + "୧༼◔益◔╭∩╮༽", + "୧༼ ͡◉ᴥ ͡◉༽୨", + "ᕙ༼◕ ᴥ ◕༽ᕗ", + "୧༼◕ ᴥ ◕༽୨", + "(•_̀• ง)", + "(ʘ͡ ʖ͜ ʘ͡ ง)", + "༼ – ل͜ – ༽", + "ᕦ(▀̿ ̿ -▀̿ ̿ )つ├┬┴┬┴", + "(=◕ل͜◕=)", + "༼ ⨀ ̿Ĺ̯̿̿⨀ ̿༽ง", + "ಠ⌣ಠ", + "(❛ε❛“)", + "ᕙ༼ ◔ل͜ ◕ ༽ᕤ", + "ᕙ (° ~͜ʖ~ °) ᕗ", + "/╲/╭( ͡° ͡° ͜ʖ ͡° ͡°)╮/╱", + "ᕕ(  ´ Д `  )ᕗ", + "ヽ༼xل͜x༽ノ", + "─=≡Σ((( つ◕ل͜◕)つѰ", + "ʘ ͜ʖ ʘ", + "༼ノಠل͟ಠ༽ノ ︵ ┻━┻", + "༼ノຈل͜ຈ༽ノ︵┻━┻", + "╭∩╮◕ل͜◕)╭∩╮", + "───==≡≡ΣΣ((( つºل͜º)つ", + "ᕕ(⌐□ل͜□)ᕗ", + "ᕕ( ͡° ͜ʖ ͡°)ᕗ", + "(º◡º)っ", + "ᕕ༼✪ل͜✪༽ᕗ", + "༼ ༽ ლ(́◉◞౪◟◉‵ლ)", + "乁( ◔ ౪◔)ㄏ", + "(◕ل͜◕)", + "ヽ༼ ʘ̚ل͜ʘ̚༼◕_◕༽◉_◔ ༽ノ", + "ヽ༼ ຈل͜ຈ༼ ▀̿̿Ĺ̯̿̿▀̿ ̿༽Ɵ͆ل͜Ɵ͆ ༽ノ", + "─=≡Σᕕ( ͡° ͜ʖ ͡°)ᕗ", + "(╯ ͝° ͜ʖ͡°)╯︵ ┻━┻", + "(つ☢益☢)つ︵┻━┻", + "┬─┬ノ(ಠ_ಠノ)", + "┬━┬ノ(▀̿̿Ĺ̯̿̿▀̿ ̿ノ)", + "ヽ༼ ツ ༽ノ ︵┻━┻", + "༼ ᕤ ºل͟º ༽ᕤ ︵┻━┻", + "ζ༼ᴼل͜ᴼ༽ᶘѰ", + "( •_•)>⌐■-■", + "ヽ(`Д´)ノ", + "(=^-ω-^=)", + "(╯°□°)╯︵( .o.)", + "┌( ಠ_ಠ)┘", + "(╯°Д°)╯︵/(.□ . )", + "┻━┻ ︵ヽ(`Д´)ノ︵ ┻━┻", + "(ノಠ益ಠ)ノ彡┻━┻", + "ლ(́◉◞౪◟◉‵ლ)", + "༼ つ ◕_◕ ༽つ ༼ ༽", + "(ʘ ل͟├┬┴┬┴", + "~(˘◡˘~)", + "༼ +ل͟+ ༽", + "( ͝° ͜ʖ͡°)つ* ლ(́◉◞౪◟◉‵ლ)", + "(✿_✿)", + "(۞_۞)", + "୧༼ ◯益◯ ༽୨", + "༼:◕:ل͜◕:༽", + "༼ ಠل͟ಠ༽ ̿ ̿ ̿ ̿’̿’̵з=༼ຈل͜ຈ༽ノ", + "ᕕ༼ ͡■ل͜ ͡■༽ᕗ", + "(∩ ͡° ͜ʖ ͡°)⊃━☆─=≡Σ((( つ◕ل͜◕)つ", + "ᕙ༼◕ل͜◕༽ᕗ", + "༼ᕗຈل͜ຈ༽ᕗ", + "ヽ(゚ー゚ヽ)", + "(◐ل͜ ◐)", + "༼ つ ◕3◕ ༽つ ♫♪♫", + "ヽ( ͡͡ ° ͜ ʖ ͡ °)⊃━☆゚. * ・ 。゚", + "ಠل͟ಠ", + "(╯_ʖ╰)", + "┌༼ຈل͜ຈ༽┐", + "◕_◕", + "( ͝°_ʖ͡°)", + "ヽʕ•ᴥ•ʔノ", + "ヽ༼ຈ╭͜ل͜╮ຈ༽ノ", + "୧( ͠° ͟ʖ ͡°)୨", + "ヽ(๑╹ڡ╹๑)ノ", + "༼◉ل͟◉༽", + "༼ つ ͠° ͟ ͟ʖ ͡° ༽つ", + "ヽ༼ – ل͜ – ༽ノ", + "[̲̅$̲̅ຈل͜ຈ$̲̅]", + "╰( ͡◕◯ ͡◕)╯", + "ヽ༼☯﹏☯༽ノ", + "ヽ༼ຈل͜ຈ༽ノ☆", + "( ͝° ͜ʖ͡°)", + "ヾ( ͝° ͜ʖ͡°)ノ♪", + "(。◕‿‿◕。)", + "( ͡ᵔ ͜ʖ ͡ᵔ )", + "( ͝° ͜ʖ͡°)つ ⌒ ͜", + "( ͡° ʖ°)", + "─=≡Σ((( つ◕ل͜◕)つ", + "(͡◔ ͜ʖ ͡◔)", + "(ಠ_ಠ)ᕗ", + "ノ༽ຈ͜لຈ༼ヽ", + "ヽ༼ ͒ ̶ ͒༽ノ", + "༼ つD◕ل͜◕ ༽つ>–>", + "༼ つ ◕_◕ ༽つ ~~~卐", + "( ‾ʖ̫‾)", + "╭( ͝ಠل͜ಠ)つ", + "╰(✿ ͡’◟◯ ͡’)╯", + "(つ 益 )つ", + "(‘ºل͟º)", + "ᕕ( ͡°╭ ͟ʖ╮͡° ) ᕤ", + "( ง ͡°╭ ͟ʖ╮͡° ) ง", + "ヽ( ͡°╭͜ʖ╮͡ರೃ )ノ", + "( ͡°╭ ͟ʖ╮͡├┬┴┬┴", + "( ^◡^)", + "ヽ༼ ツ ༽ノ ♫", + "┌༼▀̿̿Ĺ̯̿̿▀̿༽┘", + "ԅ(ˆ⌣ˆԅ)", + "(‘ºل͟º)ノ⌒", + "(ᵔᴥᵔ)", + "ಠ‿ಠ", + "( ◕ ◡ ◕ )", + "~(╯▽╰)~", + "~( ^◡^)~", + "┌( ͝° ͜ʖ͡°)ᕤ", + "༼ຈل͜ ͡°)ᕗ", + "╚༼ ຈل͜ຈ༽╝", + "ヽ༼✿σل͜ σ༽ノ", + "ლ(́✪◞౪◟✪‵ლ)", + "( •_•)ノ✝", + "(~° ͜ʖ͡°)~ ( . ( . )", + "ヽ(*・ω・)ノ", + "(∩ ͡° ͜ʖ ͡°)⊃━ 卐", + "╭∩╮( ° ͜ʖ͡°)╭∩╮", + "(⊙_⊙’)", + "( ~ ♥‿♥)~ð", + "༼(∩ ͡°╭͜ʖ╮͡ ͡°)༽⊃━☆゚. * ・ 。゚", + "༼ ºل͟º༼ ºل͟º༽ºل͟º ༽", + "(╥﹏╥)", + "┌༼ຈل͜ຈ༽┘", + "乁( •_• )ㄏ", + "( ^◡^)っ✂", + "◟(∗❛ัᴗ❛ั∗)◞", + "(ง •̀_•́)ง", + "( ◔ ౪◔)ㄏ", + "☚(゚ヮ゚☚)", + "¯_(ツ)_/¯", + "༼ つ ✿◕‿◕✿༽つ╰⋃╯", + "─=≡Σ((((ó ì_í)=ó", + "─=≡Σ((((͡◔ ͜ʖ ͡◔)", + "༼ ͠ຈ ͟ل͜ ͠ຈ༽ง", + "ヽ༼@ل͜ຈ༽ノ", + "ლ ༼ ಥل͟ಥ ༽", + "╮(╯▽╰)╭", + "( °U° )", + "o͡͡͡͡͡͡╮༼;´༎ຶ.̸̸̸̸̸̸̸̸̸̸̸̸̸̸̨̨̨̨̨̨̨.̸̸̨̨۝ ༎ຶ༽╭o͡͡͡͡͡͡", + "(•_•)", + "̿̿ ̿̿ ̿’̿’̵͇̿̿з=༼ ▀̿̿Ĺ̯̿̿▀̿ ̿ ༽", + "¯_( ͡° ͜ʖ ͡°)ง-]—- ᴇɴ ɢᴀʀᴅᴇ", + "ᕙ (° ~ ° ~)", + "༼ つ ◕ 3 ◕ ༽つ", + "༼☉╾☉༽", + "( ͡ _ ͡°)ノ⚲", + "( ^◡^)っ✂╰⋃╯", + "(▀̿̿Ĺ̯̿̿▀̿ ̿)⊃━☆゚. * ・ 。゚", + "༼ ͠ຈ ͟ل͜ ͠ຈ༽ง︵┻━┻", + "ヽ༼ຈل͜ರೃ༽ノ", + "(╯ ╥﹏╥)╯︵ ǝʞoɾ ǝɯɐs", + "(ง ◉◡◔)ง", + "(⌐■_■)┣▇▇▇═──", + "(⌐■_■)", + "(⌐■_■)┣▇▇▇═── ༼ ºل͟º༽", + "━╤デ╦︻(▀̿̿Ĺ̯̿̿▀̿ ̿)", + "└ʕ•ᴥ•ʔ┘", + "(ᕗ ⌐□ل͜□)ᕗ ├┬", + "(ง ͠ ᵒ̌ Дᵒ̌)¤=[]:::::>", + "(ง ͠° ͟ل͜ ͡°)¤=[]:::::>", + "̿’ ̿’̵͇̿̿з=(ಡل͟ಡ)=ε/̵͇̿̿/’̿’̿", + "̿’ ̿’̵͇̿̿з=(ಥДಥ)=ε/̵͇̿̿/’̿’̿", + "( ͡° ͜ʖ͡°)╭∩╮", + "(☯‿├┬┴┬┴", + "凸(͡°͜ʖ͡°)凸", + "ヽ༼ຈᴥຈ༽ノ", + "ᕙ(ಥ益ಥ‶)ノ", + "ʕ ͝°ل͟ ͝°ʔ", + "(▀̿̿Ĺ̯̿̿├┬┴┬┴", + "( ͝° ͜ʖ͡°)つY", + "ヽ( ͡°╭͜ʖ╮͡° )ノ", + "༼凸 ◉_◔༽凸", + "♫ ┌༼ຈل͜ຈ༽┘ ♪", + "༼ ಥل͟ಥ ༽ ┬┴┬┴┤", + "༼ ಠل͟ಠ༽", + "|༼ʘ ل͜ ʘ༽|", + "ヽ༼◕ل͜◕༽ノ", + "(° ͜ʖ°)", + "ヽ༼ ツ ༽ノ", + "(͡°͜ʖ͡°)", + "(☢益☢t)", + "╮(╯ل͜╰)╭", + "༼ つ◕(oo)◕༽つ", + "(ι´ Д`)ノ", + "ヽ༼◥▶ل͜◀◤༽ノ", + "[̲̅$̲̅(̲̅ ͡◥▶ ͜ʖ ͡◀◤)̲̅$̲̅]", + "ヽ༼ຈل͜ຈ༽ノ☂", + "(^◡^)っ", + "ヽ༼ ☭ل͜☭ ༽ノ", + "༼✪ل͜✪༽ᕤ", + "ヽ༼ʘ̚ل͜ʘ̚༽ノ", + "(∩ ͡° ͜ʖ ͡°)⊃━☆゚", + "୧༼ ͡◉ل͜ ͡◉༽୨", + "༼ ͡■ل͜ ͡■༽", + "ヽ༼ຈل͜ຈ༽ง", + "ɳ༼ຈل͜ຈ༽ɲ", + "(~˘▾˘)~", + "ʕ•ᴥ•ʔ", + "(☞゚ヮ゚)☞", + "୧༼ಠ益ಠ༽୨", + "(▀̿̿Ĺ̯̿̿▀̿ ̿)", + "└(°ᴥ°)┘", + "ヽ༼♥ل͜♥༽ノ", + "༼ ᓄºل͟º ༽ᓄ", + "(ง ͠° ͟ل͜ ͡°)ง", + "ᕦ༼ຈل͜ຈ༽ᕤ", + "༼ ºل͟º༽", + "(‘ºل͟º)ノ⌒.", + "[̲̅$̲̅(̲̅ ͡° ͜ʖ ͡°̲̅)̲̅$̲̅]", + "༼°ل͜°༽", + "ヽ༼ ಠل͟ಠ༽ノ", + "༼ ಥ ل͜ – ༽", + "( ͡°╭͜ʖ╮͡° )", + "ヽ༼ຈل͜├┬┴┬┴", + "ヽ༼ಥل͟ಥ༽¤=[]:::::>", + "(✿◕_◕✿)", + "ヽ༼ຈل͜ຈ༽ノ", + "(ง ͠° ل͜ °)ง", + "ლ༼ ▀̿̿Ĺ̯̿̿▀̿ ̿ლ༽", + "(◉◞౪◟◉)", + "(ノ◉◞౪◟◉‵)ノ⌒[̲̅$̲̅(̲̅ ͡° ͜ʖ ͡°̲̅)̲̅$̲̅]", + "(‘ºل͟º)ノ⌒.[̲̅$̲̅(̲̅ ͡° ͜ʖ ͡°̲̅)̲̅$̲̅]", + }, + "upset": []string{ + "¯_| ಠ ∧ ಠ |_/¯", + "ლ(ಥ Д ಥ )ლ", + "⋌༼ •̀ ⌂ •́ ༽⋋", + "s( ^ ‸ ^)-p", + "└༼ ಥ ᗜ ಥ ༽┘", + "୧( ಠ Д ಠ )୨", + "┌( ◕ 益 ◕ )ᓄ", + "¯_༽ ಥ Д ಥ ༼_/¯", + "(=ಠ ل͟ ಠ=)", + "( ຈ ﹏ ຈ )", + "(-_-。)", + "ᕕ{ ͒ ʖ̯ ͒ }ᕗ", + "໒( •̀ ╭ ͟ʖ╮ •́ )७", + "c╏ ಡ д ಡ ╏୨", + "┌[ ಠ ▃ ಠ ]┐", + "乁〳 ” ˘ ෴ ˘ ” 〵ㄏ", + "(ಥ_ʖಥ)", + "/( .□.) ︵╰(゜益゜)╯︵ /(.□. /)", + "(┛ಠДಠ)┛彡┻━┻", + "໒( ∗ ⇀ 3 ↼ ∗ )७", + "ԅ[ * ༎ຶ _ ༎ຶ * ]┐", + "ᕕ▒ ຈ ︿ ຈ ▒┌∩┐", + "୧໒( ˵ ° ~ ° ˵ )७୨", + "໒( ⇀ ‸ ↼ )७", + "[ : • 益 • : ]", + "╰[ ° 益 ° ]╯", + "┏༼ ◉ ╭╮ ◉༽┓", + "▐ ∗ ᵒ̌ 〜 ᵒ̌ ∗ ▐", + "c〳 ݓ ﹏ ݓ 〵੭", + "(╬ ಠ益ಠ)", + "༼ ಠ ͟ʖ ಠ ༽", + "⁞ つ: •̀ ⌂ •́ : ⁞-︻╦̵̵͇̿̿̿̿══╤─", + "໒( ᓀ ‸ ᓂ )७", + "୧| ͡ᵔ ﹏ ͡ᵔ |୨", + "║ * ರ Ĺ̯ ರ * ║", + "ヽ༼ಢ_ಢ༽ノ", + "†ヽ[ಠĹ̯ಠ]ノ", + "╰༼=ಠਊಠ=༽╯", + "༼ง=ಠ益ಠ=༽ง", + "୧ʕ•̀ᴥ•́ʔ୨", + "┏༼ •́ ╭╮ •̀ ༽┓", + "╚▒ᓀ▃ᓂ▒╝", + "໒( , ್ ∧ ್ , )७", + "໒( ͡; 益 ͡; )७┌∩┐", + "ᕕ⁞ ್ ۝ ್ ⁞┘", + "ʕ ಡ ﹏ ಡ ʔ", + "▐ ᓀ (oo) ᓂ ▐", + "╰໒( = ◕ ◯ ◕ = )७╯", + "o͡͡͡╮⁞ ˵ ᓀ ︿ ᓂ ˵ ⁞╭o͡͡͡", + "⋋╏ ᓀ 〜 ᓂ ╏⋌", + "[ ” ಠ ‸ ಠ ” ]", + "(ఠ్ఠ ˓̭ ఠ్ఠ)", + "╭(๑¯д¯๑)╮", + "໒( , ⊙ Ĺ̯ ⊙ , )७", + "୧༼ ͡◕ д ◕͡ ༽୨", + "└| ಠ ‸ ಠ |┘", + "། ˵ ︣ ෴ ︣ ˵ །", + "(╯°□°)╯︵ ( . 0 .)", + "ლ( `Д’ ლ)", + "╏つ ͜ಠ ‸ ͜ಠ ╏つ", + "o͡͡͡╮༼ ಠДಠ ༽╭o͡͡͡━☆゚.*・。゚", + "ヽ| ͡☉ ︿ ͡☉ |ノ⌒.", + "༼ , ﹒︣ o ﹒︣ , ༽", + "୧ʕ ⇀ ⌂ ↼ ʔ୨", + "[ ಠ □ ಠೃ ]", + "( ✿ •̀ ‸ •́ ✿ )", + "[ ಠ (oo) ಠ ]", + "༼ ∗ •̀ (oo) •́ ∗ ༽", + "c༼ ” ͡° ▃ °͡ ” ༽ᕤ", + "໒( ˵ •̀ □ •́ ˵ )७", + "ᗜੂͦ﹏ᗜੂͦ", + "(ಥ﹏ಥ)", + ".·´¯`(>▂", + "(.﹒︣︿﹒︣.)", + "੧(❛〜❛✿)੭", + "( ཀ͝ ∧ ཀ͝ )", + "(;´༎ຶД༎ຶ`)", + "༼;´༎ຶ ۝ ༎ຶ༽", + "╰(⇀‸↼)╯", + "╰(⇀⌂↼‶)╯", + "༼ ಥل͟ಥ ༽", + "༼つ☯﹏☯༽つ", + "༼☯﹏☯༽", + "( ͡° ʖ̯ ͡°)", + "(◔ д◔)", + "( ͡°ᴥ ͡° ʋ)", + "(◞‸◟;)", + "ノಠ_ಠノ", + "ノ(;Ĺ̯̿̿ ;ノ)", + "༼,ຈ_ຈ,༽", + "༼ ºل͟º༼ ºل͟º༽", + "(̿ಠ ̿Ĺ̯̿̿ಠ ̿)̄", + "(ᓄಠ_ಠ)ᓄ", + "༼ ⨀ ̿Ĺ̯̿̿⨀ ̿༽ง", + "ಠ⌣ಠ", + "༼ノಠل͟ಠ༽ノ ︵ ┻━┻", + "ヽ(`Д´)ノ", + "(╯°Д°)╯︵/(.□ . )", + "┻━┻ ︵ヽ(`Д´)ノ︵ ┻━┻", + "(ノಠ益ಠ)ノ彡┻━┻", + }, + "walk": []string{ + "ᕕ( ՞ ᗜ ՞ )ᕗ", + "ᕕ( ཀ ʖ̯ ཀ)ᕗ", + "ᕕ{ ͒ ʖ̯ ͒ }ᕗ", + "ᕕ(˵•̀෴•́˵)ᕗ", + "ᕕ( ⁰ ▽ ⁰ )ᕗ", + "┗(^0^)┓", + "ᕕ(ಥʖ̯ಥ)ᕗ", + "ᕕ┌◕ᗜ◕┐ᕗ", + "ᕕ༼✿•̀︿•́༽ᕗ", + "ᕕ░ ◕ – ◕ ░ᕤ", + "ᕕ[ ・ ▾ ・ ]ᕗ", + "ᕕ| ͡■ ﹏ ■͡ |و", + "┌( ಠ‿ಠ)┘", + "ᕕ⁞ ᵒ̌ 〜 ᵒ̌ ⁞ᕗ", + "└╏ ・ ᗜ ・ ╏┐", + "₍₍ ᕕ༼.◕ヮ◕.༽ᕗ⁾⁾", + "₍₍ ᕕ( * ⊙ ヮ ⊙ * )ᕗ⁾⁾", + "へ║ ☉ д ☉ ║ᕗ", + "ᕕ[ º Ĺ̯ º ]ᕤ", + "ᕕ( ◔3◔)ᕗ", + "ᕕ| ◉ ͜ʟ ◉ |ง", + "ᕕ║ = ◔ ヮ ◔ = ║୨", + }, + "wall": []string{ + "┬┴┬┴┤ᕦ( ▀̿ Ĺ̯ ▀̿├┬┴┬", + "╰[◔▽◔├┬┴┬┴", + "┴┬┴┤( ͡° ͜ʖ├┬┴┬", + "┴┬┴┤・_・├┴┬┴", + "ᕦ༼ ºººل͟ºº├┬┴┬┴", + "ԅ[ •́ ﹏├┬┴┬┴", + "┬┴┬┴┤・ω・)ノ├┬┴┬┴", + "┬┴┬┴┤(・_├┬┴┬┴", + "ᕦ(▀̿ ̿ -▀̿ ̿ )つ├┬┴┬┴", + }, + "whistle": []string{ + "(• ε •)", + }, + "why": []string{ + "¯_| ಠ ∧ ಠ |_/¯", + "ლ(ಥ Д ಥ )ლ", + "¯_༽ ಥ Д ಥ ༼_/¯", + "乁། ˵ ◕ – ◕ ˵ །ㄏ", + "乁ʕ •̀ ۝ •́ ʔㄏ", + "ლ༼ ▀̿ Ĺ̯ ▀̿ ლ༽", + "ლ( ¤ 益 ¤ )┐", + "ლ༼ ❛ Ĺ̯ ❛ ༽ᕤ", + "¯_| ✖ 〜 ✖ |_/¯", + "乁( ⁰͡ Ĺ̯ ⁰͡ ) ㄏ", + "乁〳 ” ˘ ෴ ˘ ” 〵ㄏ", + "¯_(⊙_ʖ⊙)_/¯", + "乁〳 ❛ д ❛ 〵ㄏ", + "乁║ ˙ 益 ˙ ║ㄏ", + "¯_༼ ಥ ‿ ಥ ༽_/¯", + "乁༼☯‿☯✿༽ㄏ", + "¯_( ͠° ͟ʖ °͠ )_/¯", + "乁| ・ิ ∧ ・ิ |ㄏ", + "¯_໒( ” ▀ ﹏ ▀ ” )७_/¯", + "ლ(ಠ益ಠ)ლ", + "੧║ ☯ ⌂ ☯ ║┐", + "ლ( `Д’ ლ)", + }, + "yawn": []string{ + "ᕦ░ . ‾́ ◯ ‾́ . ░ᕤ", + }, + "yell": []string{ + "║ ” ◕ ◯ ◕ ” ║", + "໒( ˵ ° ۝ ° ˵ )७", + }, +} diff --git a/plugins/formatting/formatting.go b/plugins/formatting/formatting.go index 49ac1fe..fb2f22c 100644 --- a/plugins/formatting/formatting.go +++ b/plugins/formatting/formatting.go @@ -4,6 +4,7 @@ import ( "fmt" ) +// ListToLines converts a list of strings to a newline separated string, without breaking entries across lines func ListToLines(list []string, lineLength int) (lines string) { line := "" for _, i := range list { diff --git a/plugins/formatting/formatting_test.go b/plugins/formatting/formatting_test.go index 15a79f5..6f4fa88 100644 --- a/plugins/formatting/formatting_test.go +++ b/plugins/formatting/formatting_test.go @@ -3,6 +3,8 @@ package formatting import ( "strings" "testing" + + "github.com/stretchr/testify/assert" ) func TestListToLines(t *testing.T) { @@ -22,7 +24,5 @@ func TestListToLines(t *testing.T) { "a longer test line", }, "\n") - if got != expected { - t.Errorf("got %q, want %q", got, expected) - } + assert.Equal(t, got, expected) } diff --git a/plugins/irccolours/irccolours.go b/plugins/irccolours/irccolours.go index c1acf85..32320e7 100644 --- a/plugins/irccolours/irccolours.go +++ b/plugins/irccolours/irccolours.go @@ -4,30 +4,51 @@ import ( "fmt" ) +// Colour is used to construct a coloured string for irc type Colour string const ( - White Colour = "00" - Black Colour = "01" - Blue Colour = "02" - Green Colour = "03" - Red Colour = "04" - Brown Colour = "05" + // White formatted irc text string + White Colour = "00" + // Black formatted irc text string + Black Colour = "01" + // Blue formatted irc text string + Blue Colour = "02" + // Green formatted irc text string + Green Colour = "03" + // Red formatted irc text string + Red Colour = "04" + // Brown formatted irc text string + Brown Colour = "05" + // Magenta formatted irc text string Magenta Colour = "06" - Orange Colour = "07" - Yellow Colour = "08" - LGreen Colour = "09" - Cyan Colour = "10" - LCyan Colour = "11" - LBlue Colour = "12" - Pink Colour = "13" - Grey Colour = "14" - Gray Colour = "14" - LGrey Colour = "15" - LGray Colour = "15" - None Colour = "99" + // Orange formatted irc text string + Orange Colour = "07" + // Yellow formatted irc text string + Yellow Colour = "08" + // LGreen (light green) formatted irc text string + LGreen Colour = "09" + // Cyan formatted irc text string + Cyan Colour = "10" + // LCyan (light cyan) formatted irc text string + LCyan Colour = "11" + // LBlue (light blue) formatted irc text string + LBlue Colour = "12" + // Pink formatted irc text string + Pink Colour = "13" + // Grey formatted irc text string + Grey Colour = "14" + // Gray formatted irc text string + Gray Colour = "14" + // LGrey (light grey) formatted irc text string + LGrey Colour = "15" + // LGray (light gray) formatted irc text string + LGray Colour = "15" + // None (default) formatted irc text string + None Colour = "99" ) +// FormattedText represents a coloured irc string type FormattedText struct { Text string Fg, Bg Colour @@ -45,6 +66,7 @@ func (f FormattedText) String() string { return fmt.Sprintf("\x03%s,%s%s\x0399,99", f.Fg, f.Bg, f.Text) } +// ColouriseList applies colours to all strings in a list, cycling through all available func ColouriseList(strs []string) (out []FormattedText) { for n, s := range strs { c := Colour(fmt.Sprintf("%02d", n%13+2)) @@ -53,6 +75,7 @@ func ColouriseList(strs []string) (out []FormattedText) { return out } +// FormattedTextToStringList formats a list to a newline separated string func FormattedTextToStringList(fs []FormattedText) (out []string) { for _, f := range fs { out = append(out, f.String()) diff --git a/plugins/irccolours/irccolours_test.go b/plugins/irccolours/irccolours_test.go index 6ffdf19..2b4714a 100644 --- a/plugins/irccolours/irccolours_test.go +++ b/plugins/irccolours/irccolours_test.go @@ -3,6 +3,8 @@ package irccolours import ( "fmt" "testing" + + "github.com/stretchr/testify/assert" ) func TestColour(t *testing.T) { @@ -30,11 +32,7 @@ func TestColour(t *testing.T) { for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - got := tc.f.String() - - if got != tc.expected { - t.Errorf("got %q, want %q", got, tc.expected) - } + assert.Equal(t, tc.f.String(), tc.expected) }) } } @@ -48,21 +46,15 @@ func TestColouriseList(t *testing.T) { got := ColouriseList(ss) t.Run("14 elements", func(t *testing.T) { - if len(got) != 14 { - t.Errorf("expected 14 elements") - } + assert.Equal(t, len(got), 14, "Expected 14 lines") }) t.Run("Colours looped", func(t *testing.T) { for i := 0; i < 13; i++ { - if g := got[i]; g.Fg != Colour(fmt.Sprintf("%02d", i+2)) { - t.Errorf("got %s, expected %02d", g.Fg, i+2) - } - } - - if got[13].Fg != Colour("02") { - t.Errorf("got %s, expected 02", got[13].Fg) + expected := Colour(fmt.Sprintf("%02d", i+2)) + assert.Equal(t, got[i].Fg, expected) } + assert.Equal(t, got[13].Fg, Colour("02")) }) } @@ -74,8 +66,6 @@ func TestFormattedTextToStringList(t *testing.T) { got := FormattedTextToStringList(fs) for n, f := range fs { - if f.String() != got[n] { - t.Errorf("got %s, expected %s", f.String(), got[n]) - } + assert.Equal(t, f.String(), got[n]) } } diff --git a/plugins/lastfm/lastfm.go b/plugins/lastfm/lastfm.go index de9081c..7f63e91 100644 --- a/plugins/lastfm/lastfm.go +++ b/plugins/lastfm/lastfm.go @@ -10,62 +10,100 @@ import ( ) const ( - lastfmRecentTracksApiURL = "https://ws.audioscrobbler.com/2.0" + + lastfmRecentTracksAPIURL = "https://ws.audioscrobbler.com/2.0" + "?method=user.getrecenttracks" + "&user=%s&api_key=%s&format=json&limit=1" ) -type lastfmJson struct { - Recenttracks struct { - Attr struct { - User string `json:"user"` - } `json:"@attr"` - Track []struct { - Album struct { - Text string `json:"#text"` - } `json:"album"` - Attr struct { - NowPlaying string `json:"nowplaying"` - } `json:"@attr"` - Artist struct { - Text string `json:"#text"` - } `json:"artist"` - Name string `json:"name"` - } `json:"track"` - } `json:"recenttracks"` -} - -func (l lastfmJson) String() string { - user := l.Recenttracks.Attr.User - track := l.Recenttracks.Track[0] - album := track.Album.Text - artist := track.Artist.Text - trackName := track.Name - - action := "last listened to" - if track.Attr.NowPlaying == "true" { - action = "is listening to" +var apiKey = os.Getenv("IRC_LASTFM_API") + +type lastfmJSON struct { + Recenttracks Recenttracks `json:"recenttracks"` +} + +func (j lastfmJSON) String() string { + return j.Recenttracks.String() +} + +// Recenttracks represents the metadata returned in the lastfm json +type Recenttracks struct { + User User `json:"@attr"` + Tracks []Track `json:"track"` +} + +func (r Recenttracks) String() string { + if len(r.Tracks) == 0 { + return "No tracks found for user" } - return fmt.Sprintf( - "♫ %s %s %s - %s (%s) ♫", - user, action, artist, trackName, album, - ) + track := r.Tracks[0] + + return fmt.Sprintf(" %s %s %s ", r.User, track.action(), track) +} + +// User represents the user information returned in the lastfm json +type User struct { + User string `json:"user"` +} + +func (u User) String() string { + return u.User +} + +// Artist represents the artist information returned in the lastfm json +type Artist struct { + Name string `json:"#text"` +} + +func (a Artist) String() string { + return a.Name +} + +// TrackAttr contains the track metadata, with now playing information +type TrackAttr struct { + Nowplaying string `json:"nowplaying"` +} + +// Album represents the album information returned in the lastfm json +type Album struct { + Name string `json:"#text"` +} + +func (a Album) String() string { + return a.Name +} + +// Track represents the track information returned in the lastfm json +type Track struct { + Artist Artist `json:"artist"` + Nowplaying *TrackAttr `json:"@attr,omitempty"` + Album Album `json:"album"` + Name string `json:"name"` +} + +func (t Track) String() string { + return fmt.Sprintf("%s - %s (%s)", t.Artist, t.Name, t.Album) +} + +func (t Track) action() string { + if t.Nowplaying == nil { + return "last listened to" + } + return "is listening to" } func lastfm(command *bot.Cmd) (msg string, err error) { - api_key := os.Getenv("IRC_LASTFM_API") msg = url.QueryEscape(command.RawArgs) - url := fmt.Sprintf(lastfmRecentTracksApiURL, msg, api_key) + url := fmt.Sprintf(lastfmRecentTracksAPIURL, msg, apiKey) - data := &lastfmJson{} - err = web.GetJSON(url, data) + j := &lastfmJSON{} + err = web.GetJSON(url, j) if err != nil { return "", err } - return data.String(), nil + return j.String(), nil } func init() { diff --git a/plugins/lastfm/lastfm_test.go b/plugins/lastfm/lastfm_test.go index 5e305e0..4a7b4d8 100644 --- a/plugins/lastfm/lastfm_test.go +++ b/plugins/lastfm/lastfm_test.go @@ -1,55 +1,118 @@ package lastfm import ( - "encoding/json" "fmt" "testing" + + "github.com/stretchr/testify/assert" ) -func TestLastfmJsonString(t *testing.T) { - jf := `{ - "recenttracks": { - "@attr": { - "user": "user" - }, - "track": [ - { - "artist": { - "#text": "artist" - }, - "@attr": { - "nowplaying": "%s" - }, - "album": { - "#text": "album" - }, - "name": "track" - } - ] - } - }` +var ( + u = User{ + User: "testuser", + } + + ar = Artist{ + Name: "testartist", + } + + al = Album{ + Name: "testalbum", + } + + tr = Track{ + Artist: ar, + Album: al, + Name: "testtrack", + } + + trp = Track{ + Artist: ar, + Album: al, + Name: "testtrack", + Nowplaying: &TrackAttr{ + Nowplaying: "blah", + }, + } + + rt = Recenttracks{ + User: u, + Tracks: []Track{tr}, + } + + rtn = Recenttracks{ + Tracks: []Track{}, + } +) + +func TestString(t *testing.T) { + cases := []struct { + name string + obj fmt.Stringer + expected string + }{ + { + name: "User", + obj: u, + expected: "testuser", + }, + { + name: "Artist", + obj: ar, + expected: "testartist", + }, + { + name: "Album", + obj: al, + expected: "testalbum", + }, + { + name: "Track", + obj: tr, + expected: "testartist - testtrack (testalbum)", + }, + { + name: "Valid result", + obj: rt, + expected: " testuser last listened to testartist - testtrack (testalbum) ", + }, + { + name: "Invalid results", + obj: rtn, + expected: "No tracks found for user", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + assert.Equal(t, tc.obj.String(), tc.expected) + }) + } +} +func TestAction(t *testing.T) { cases := []struct { - j string + name string + t Track expected string }{ { - fmt.Sprintf(jf, "true"), - "♫ user is listening to artist - track (album) ♫", + name: "Playing track", + t: trp, + expected: "is listening to", }, { - fmt.Sprintf(jf, ""), - "♫ user last listened to artist - track (album) ♫", + name: "Not playing track", + t: tr, + expected: "last listened to", }, } for _, tc := range cases { - data := &lastfmJson{} - _ = json.Unmarshal([]byte(tc.j), &data) + t.Run(tc.name, func(t *testing.T) { + got := tc.t.action() - got := data.String() - if got != tc.expected { - t.Errorf("got %q, want %q", got, tc.expected) - } + assert.Equal(t, got, tc.expected) + }) } } diff --git a/plugins/tenor/tenor.go b/plugins/tenor/tenor.go index 8c251d8..affc9fa 100644 --- a/plugins/tenor/tenor.go +++ b/plugins/tenor/tenor.go @@ -13,16 +13,18 @@ import ( ) const ( - tenor_api_url_base = "https://api.tenor.com/v1/search" + tenorAPIURLbase = "https://api.tenor.com/v1/search" ) -func search_url(term string, api_key string) (url string) { +var apiKey = os.Getenv("IRC_TENOR_API") + +func searchURL(term string, apiKey string) (url string) { temp := "%s?q=%s&key=%s&limit=10" - return fmt.Sprintf(temp, tenor_api_url_base, term, api_key) + return fmt.Sprintf(temp, tenorAPIURLbase, term, apiKey) } -type tenor_json struct { +type tenorJSON struct { Results []struct { Media []struct { Gif struct { @@ -34,11 +36,10 @@ type tenor_json struct { } func tenor(command *bot.Cmd) (msg string, err error) { - api_key := os.Getenv("IRC_TENOR_API") - data := &tenor_json{} + data := &tenorJSON{} msg = url.QueryEscape(command.RawArgs) - err = web.GetJSON(search_url(msg, api_key), data) + err = web.GetJSON(searchURL(msg, apiKey), data) if err != nil { return "", err diff --git a/plugins/tenor/tenor_test.go b/plugins/tenor/tenor_test.go index 70fca6a..06d9548 100644 --- a/plugins/tenor/tenor_test.go +++ b/plugins/tenor/tenor_test.go @@ -3,13 +3,13 @@ package tenor import ( "fmt" "testing" + + "github.com/stretchr/testify/assert" ) func Test_search_url(t *testing.T) { - got := search_url("a", "b") - want := fmt.Sprintf("%s?q=a&key=b&limit=10", tenor_api_url_base) + got := searchURL("a", "b") + want := fmt.Sprintf("%s?q=a&key=b&limit=10", tenorAPIURLbase) - if got != want { - t.Errorf("got %q, want %q", got, want) - } + assert.Equal(t, got, want) } diff --git a/plugins/trakt/trakt.go b/plugins/trakt/trakt.go index 112a69e..3efb14d 100644 --- a/plugins/trakt/trakt.go +++ b/plugins/trakt/trakt.go @@ -10,15 +10,18 @@ import ( ) const ( - trakt_api_url = "https://api.trakt.tv/users/%s/history" + traktAPIURL = "https://api.trakt.tv/users/%s/history" ) -type traktJson []Entry +var apiKey = os.Getenv("IRC_TRAKT_API") -func (tj traktJson) Latest() string { +type traktJSON []Entry + +func (tj traktJSON) Latest() string { return tj[0].String() } +// Entry represents a single entry, film or episode, in the trakt json type Entry struct { Type string `json:"type"` Episode Episode `json:"episode,omitempty"` @@ -38,6 +41,7 @@ func (e Entry) String() string { return "unknown" } +// Episode represents a single episode in the trakt json type Episode struct { Season int `json:"season"` Number int `json:"number"` @@ -48,6 +52,7 @@ func (e Episode) String() string { return fmt.Sprintf("%02dx%02d - %s", e.Season, e.Number, e.Title) } +// Show contains the parent show information for the returned episode type Show struct { Title string `json:"title"` } @@ -56,6 +61,7 @@ func (s Show) String() string { return s.Title } +// Movie represents a single movie in the trakt json type Movie struct { Title string `json:"title"` Year int `json:"year"` @@ -66,15 +72,14 @@ func (m Movie) String() string { } func trakt(command *bot.Cmd) (msg string, err error) { - api_key := os.Getenv("IRC_TRAKT_API") args := url.QueryEscape(command.RawArgs) - url := fmt.Sprintf(trakt_api_url, args) + url := fmt.Sprintf(traktAPIURL, args) - j := &traktJson{} + j := &traktJSON{} headers := map[string]string{ "Content-Type": "application/json", "trakt-api-version": "2", - "trakt-api-key": api_key, + "trakt-api-key": apiKey, } err = web.GetJSONWithHeaders(url, headers, j) diff --git a/plugins/trakt/trakt_test.go b/plugins/trakt/trakt_test.go index e140195..28b3be9 100644 --- a/plugins/trakt/trakt_test.go +++ b/plugins/trakt/trakt_test.go @@ -1,6 +1,11 @@ package trackt -import "testing" +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) var ( e = Episode{ @@ -29,70 +34,49 @@ var ( Movie: m, } - j = traktJson{ee, em} + j = traktJSON{ee, em} ) func TestJson(t *testing.T) { - got := j.Latest() - expected := ee.String() - - if got != expected { - t.Errorf("got %q, want %q", got, expected) - } + assert.Equal(t, j.Latest(), ee.String()) } -func TestEntry(t *testing.T) { +func TestString(t *testing.T) { cases := []struct { name string - e Entry + obj fmt.Stringer expected string }{ { - name: "episode entry", - e: ee, + name: "Episode entry", + obj: ee, expected: "test show 01x02 - test ep", }, { - name: "movie entry", - e: em, + name: "Movie entry", + obj: em, + expected: "test movie (2020)", + }, + { + name: "Episode", + obj: e, + expected: "01x02 - test ep", + }, + { + name: "Show", + obj: s, + expected: "test show", + }, + { + name: "Movie", + obj: m, expected: "test movie (2020)", }, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { - got := tc.e.String() - - if got != tc.expected { - t.Errorf("got %q, want %q", got, tc.expected) - } + assert.Equal(t, tc.obj.String(), tc.expected) }) } } - -func TestEpisode(t *testing.T) { - got := e.String() - expected := "01x02 - test ep" - - if got != expected { - t.Errorf("got %q, want %q", got, expected) - } -} - -func TestShow(t *testing.T) { - got := s.String() - expected := "test show" - - if got != expected { - t.Errorf("got %q, want %q", got, expected) - } -} - -func TestMovie(t *testing.T) { - got := m.String() - expected := "test movie (2020)" - - if got != expected { - t.Errorf("got %q, want %q", got, expected) - } -} diff --git a/plugins/twitter/twitter.go b/plugins/twitter/twitter.go new file mode 100644 index 0000000..25e499b --- /dev/null +++ b/plugins/twitter/twitter.go @@ -0,0 +1,53 @@ +package twitter + +import ( + "fmt" + "os" + "strings" + + "github.com/go-chat-bot/bot" + + "github.com/dghubble/go-twitter/twitter" + "github.com/dghubble/oauth1" +) + +var ( + consumerKey = os.Getenv("IRC_TWITTER_CONSUMER_KEY") + consumerSecret = os.Getenv("IRC_TWITTER_CONSUMER_SECRET") + accessToken = os.Getenv("IRC_TWITTER_ACCESS_TOKEN") + accessSecret = os.Getenv("IRC_TWITTER_ACCESS_SECRET") +) + +func twit(command *bot.Cmd) (msg string, err error) { + arg := strings.Split(command.RawArgs, " ")[0] + + config := oauth1.NewConfig(consumerKey, consumerSecret) + token := oauth1.NewToken(accessToken, accessSecret) + httpClient := config.Client(oauth1.NoContext, token) + client := twitter.NewClient(httpClient) + + user, _, err := client.Users.Show(&twitter.UserShowParams{ + ScreenName: arg, + }) + + if err != nil { + return "", err + } + + if user.StatusesCount == 0 { + return fmt.Sprintf("User %s has no tweets", arg), nil + } + + t := strings.Split(user.Status.Text, "\n")[0] + + return t, nil +} + +func init() { + bot.RegisterCommand( + "twitter", + "Post user's last tweet", + "sharktamer", + twit, + ) +} diff --git a/plugins/web/utils.go b/plugins/web/utils.go index 643d62c..57916b1 100644 --- a/plugins/web/utils.go +++ b/plugins/web/utils.go @@ -28,6 +28,7 @@ func getBodyWithHeaders(url string, headers map[string]string) ([]byte, error) { return ioutil.ReadAll(resp.Body) } +// GetJSONWithHeaders is a helper function to return a json object from a json rest api endpoint func GetJSONWithHeaders(url string, headers map[string]string, v interface{}) error { body, err := getBodyWithHeaders(url, headers) if err != nil { diff --git a/plugins/wikipedia/wikipedia.go b/plugins/wikipedia/wikipedia.go new file mode 100644 index 0000000..1eef431 --- /dev/null +++ b/plugins/wikipedia/wikipedia.go @@ -0,0 +1,123 @@ +package wikipedia + +import ( + "fmt" + "net/url" + + "github.com/go-chat-bot/bot" + "github.com/go-chat-bot/plugins/web" +) + +const ( + wikipediaAPISearchURL = "https://en.wikipedia.org/w/api.php?" + + "format=json&action=query&list=search&srlimit=1&" + + "srprop=timestamp&srwhat=text&srsearch=%s" + wikipediaAPIExtractURL = "https://en.wikipedia.org/w/api.php?" + + "format=json&action=query&prop=extracts&exintro&explaintext&" + + "exchars=400&redirects&titles=%s" +) + +type wikiSearchJSON struct { + Query SearchQuery `json:"query"` +} + +func (wsj wikiSearchJSON) String() string { + return wsj.Query.String() +} + +// SearchQuery represents the search results from the wikipedia api +type SearchQuery struct { + Search searchResults `json:"search"` +} + +func (sq SearchQuery) String() string { + return sq.Search.String() +} + +type searchResults []Search + +func (sr searchResults) String() string { + if len(sr) == 0 { + return "" + } + return sr[0].Title +} + +// Search represents a single search result from the wikipedia api +type Search struct { + Title string `json:"title"` +} + +func (s Search) String() string { + return s.Title +} + +type wikiExtractJSON struct { + Query ExtractQuery `json:"query"` +} + +func (wej wikiExtractJSON) String() string { + return wej.Query.String() +} + +// ExtractQuery represents the query object from the wikipedia api +type ExtractQuery struct { + Pages Pages `json:"pages"` +} + +func (q ExtractQuery) String() string { + return q.Pages.String() +} + +// Pages represents the page results from the wikipedia api +type Pages map[string]Page + +func (ps Pages) String() string { + for _, v := range ps { + return v.String() + } + return "No search results found." +} + +// Page represents a single page result from wikipedia api +type Page struct { + Extract string `json:"extract"` +} + +func (p Page) String() string { + return p.Extract +} + +func wiki(command *bot.Cmd) (msg string, err error) { + args := command.RawArgs + urlArgs := url.QueryEscape(args) + + searchURL := fmt.Sprintf(wikipediaAPISearchURL, urlArgs) + sj := &wikiSearchJSON{} + err = web.GetJSON(searchURL, sj) + + if err != nil { + return "", err + } + + urlTitle := url.QueryEscape(sj.String()) + + extractURL := fmt.Sprintf(wikipediaAPIExtractURL, urlTitle) + ej := &wikiExtractJSON{} + err = web.GetJSON(extractURL, ej) + + if err != nil { + return "", err + } + + return ej.String(), nil +} + +func init() { + bot.RegisterCommand( + "wiki", + "Search wikipedia", + "golang", + wiki, + ) +} diff --git a/plugins/wikipedia/wikipedia_test.go b/plugins/wikipedia/wikipedia_test.go new file mode 100644 index 0000000..5ab56e1 --- /dev/null +++ b/plugins/wikipedia/wikipedia_test.go @@ -0,0 +1,89 @@ +package wikipedia + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +var ( + wsj = wikiSearchJSON{Query: sq} + sr = searchResults{s} + srn = searchResults{} + sq = SearchQuery{sr} + s = Search{Title: "result"} + wej = wikiExtractJSON{Query: eq} + eq = ExtractQuery{Pages: ps} + ps = Pages{"1": p} + psn = Pages{} + p = Page{Extract: "extract"} +) + +func TestSearch(t *testing.T) { + cases := []struct { + name string + obj fmt.Stringer + }{ + { + name: "Search JSON", + obj: wsj, + }, + { + name: "Search results", + obj: sr, + }, + { + name: "Search queries", + obj: sq, + }, + { + name: "Search result", + obj: s, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + assert.Equal(t, tc.obj.String(), "result") + }) + } +} + +func TestExtract(t *testing.T) { + cases := []struct { + name string + obj fmt.Stringer + }{ + { + name: "Extract JSON", + obj: wej, + }, + { + name: "Extract query results", + obj: eq, + }, + { + name: "Pages", + obj: ps, + }, + { + name: "Page", + obj: p, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + assert.Equal(t, tc.obj.String(), "extract") + }) + } +} + +func TestSearchNoResult(t *testing.T) { + assert.Equal(t, srn.String(), "") +} + +func TestPagesNoResult(t *testing.T) { + assert.Equal(t, psn.String(), "No search results found.") +}