1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

(小ネタ)discord.jsでメッセージから絵文字を取得する

Last updated at Posted at 2020-09-10

はじめに

備忘録も兼ねて、discord.jsにてメッセージからUnicode絵文字を判別し、取得する方法を紹介します。
DiscordにおいてUnicode絵文字とは、各サーバーで登録されるカスタム絵文字以外の、初めから全てのユーザーができる絵文字のことです。
image.png
Discordでは絵文字にTwemojiを使用しており、それゆえにTwemojiと互換性があります。
そのため今回はTwemojiの絵文字判定処理に使用されているtwemoji-parserを用いたUnicode絵文字判定処理の方法を紹介します。
twemoji-parserはtwemoji同様、Twitter社によって管理されているライブラリなので、安心感があります。

事前準備

適当にプロジェクトを用意していただき、twemoji-parserをインストールしておきます。

npm install twemoji-parser

本題

今回はサンプルとして、message イベントで受け取ったメッセージ内に含まれるUnicode絵文字を、リアクションとして返すだけのコードを紹介します。
コードとしてはシンプルなため、解説は省かせて頂きます。

const { Client } = require('discord.js');

// twemoji-parserから判定用の正規表現を取得(gオプション付き)
const twemojiRegex = require('twemoji-parser/dist/lib/regex').default;

const client = new Client();

client.on('message', message => {
  // メッセージから正規表現でUnicode絵文字を取得
  const mathEmojis = message.content.match(twemojiRegex);

  for (const emoji of mathEmojis) {
    // 取得したUnicode絵文字をリアクションで返す
    message.react(emoji)
      .catch(console.error);
  }
});

client.login('Your bot token')
  .catch(console.error);

こんな感じで動作します。
image.png

注意点

twemoji-parserの正規表現にはgオプションが付いています。
ですから、使用目的によってはそのまま利用できないため、自前で正規表現を再生成する必要があります。
例えば、単にgオプションを外したい場合、このようにします。

const twemojiRegex = require('twemoji-parser/dist/lib/regex').default;
const onceRegex = new RegExp(twemojiRegex, '');

あとがき

メッセージ内のUnicode絵文字を判別し取得する処理は、自前で書こうと思うとなかなかの至難の技です。
twemoij-parserを使用すればUnicode絵文字の複雑な組み合わせも、しっかり1文字と判定されるため、複雑なことを考えずに済みます。
また、これを応用すればスプレッド構文でも実現できなかった、実態に即したUnicodeのパースも行えそうです。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?