正規表現???? 落とし穴???
正規表現とは、正規な表現です。
つまり、正規な表現ということです。
落とし穴については少し後で紹介します。
例えば、「猫」のメッセージに反応するBOTを作ってください。と言われたとします。
その場合、皆さんならどうするでしょうか。
一般的な例
まず、送られてくるメッセージに対して反応するため、on_message
でmessage
を取得して、message.content
が猫どうかを判定します。
判定にはif
を使えばいいですね。
@bot.event
async de on_message(message: nextcord.Message):
if message.content == "猫":
await message.reply("にゃーん")
こんな感じに。
しかし依頼主からこんなことを言われました。
猫て!
「ねこ」とか「ネコ」とか「ネコ」にも対応せいや!
するとどうでしょう。
@bot.event
async de on_message(message: nextcord.Message):
if message.content == "猫" or message.content == "ねこ" or message.content == "ネコ" or message.content == "ネコ":
await message.reply("にゃーん")
だいぶ見にくくなりました。
しかし、更に依頼主から言われます。
「ネこ」とかも猫だからそれも反応してくれや
いやまぁ注文が多いってのは仕方ないですが...
これで、さっきと同じように「message.content == "ねコ"
」みたいなのを無限に追加してもいいんですけど...
めんどくさいですよね!!!
というわけで「正規表現」の出番です。
正規表現をつかうと
正規表現を使うには、デフォルトモジュールのre
をインポートする必要があります。
とりあえず「猫」に反応させてみましょう。
import re
@bot.event
async def on_message(message: nextcord.Message):
if re.search("猫", message.content):
await message.reply("にゃーん")
re.search
は、第2引数の文字列を第1引数のパターンで判定します。
search
は「検索」で、どこか一部分でも判定に合えばマッチオブジェクトを返し、まったく合わなければNone
を返します。
if
は、None
またはFalse
でないようなオブジェクトとかであれば、基本的にTrue
判定となって、そのまんま中のコードを実行します。
つまり、メッセージ本文に「猫」という文字が含まれていれば、中のreply
が実行されるという訳です。
さぁこれで動かしてみましょう!!!
...
動きます?
動きませんよね。(ほかに設定をしていなければ)
これが、最近できた落とし穴Message Content Intent
です。
通常は、message.content
に、ちゃんとメッセージ本文が送信されますが、ちゃんと設定を行わないとmessage.content
が常に空文字になります。
ンジャハンテイデキンヤンケ!
というわけでちゃんと設定を説明するので!
Intent
の有効化
Intent
(インテント)とは、おおざっぱに言うと...なんでしょう...Discord側に、この機能使うよ~!みたいなのを説明するようなあれでしょうか...?
しかし、一部のintentはセキュリティー上の観点とかなんか色々から、設定を行わないと使用できません。
というわけで、まずはDiscord Developer Portalに行きましょう。
左からApplicationを選択して、自分のBOTを選択します。
左のメニューからBotを選択して、Botページに行きましょう。
すると、少し下にPrivileged Gateway Intents
という項目があると思います。
これが、intentの設定です。
書いてあることを訳すと、「Gateway Intentの中には、BOTが認証されている場合は承認を必要とするものがある。あなたのBOTが認証されていないなら、ここから有効化出来るよ」と書いてあります。
認証...?となった方もご安心ください。
BOTの認証については最終日に紹介したいなと思っております。
有効化しよう
オンオフスイッチが3つあります。
上から「Presense Intent」(Discord Presenseを取得する時とかに必要なインテント)「Server Members Intent」(サーバーのメンバー数を取得する時とかに必要なインテント)「Message Content Intent」(メッセージ本文を取得する時とかに必要なインテント)となります。
考えるのがめんどくさいので全部チェックを入れましょう!!♪
すべてチェックを入れたら、下の「Save Changes」を押しましょう。
そしたら次にコード修正を行います。
intents = nextcord.Intents.all()
intents.typing = False
bot = commands.Bot(intents=intents)
bot = commands.Bot
の部分を修正します。
nextcord.Intents
に色々なインテントの関数があります。
これのall
(すべてのインテントをつっこんだもりもりインテント)から、typing
を引いたものを使います。
typing
というのは、「○○が入力中...」のインテントです。
あまり詳しくはわかりませんが、typing
をTrue
にしてると重くなるらしいです。
修正できたかな?
とりあえずコードを確認してみましょう。
import re
import nextcord
from nextcord.ext import commands
intents = nextcord.Intents.all()
intents.typing = False
bot = commands.Bot(intents=intents)
@bot.event
async def on_ready():
print(bot.user.name)
@bot.event
async def on_message(message: nextcord.Message):
if re.search("猫", message.content):
await message.reply("にゃーん")
bot.run("TOKEN")
とりあえず、これで起動させてみましょう。
そして「猫」と送ってみましょう。
とりあえずこれで「猫」には反応しますね。
次回予告
文量が多くなってしまいそうなので、一旦ここで切らさせていただきます。
次回はこれの続きです!
というわけで、今日の記事はここまでです。
もしよろしければ記事へのいいねをして、次回記事をお楽しみに!