[discord.py] グローバルチャットをつくる
この記事について
この記事ではdiscord.pyを使って、グローバルチャットを作成します。
PythonやBotの稼働環境などは既に構築済みのものとして話を進めます。
メッセージを他のサーバーに転送する
サーバーAのチャンネルAで送信したメッセージを他のサーバーに転送する必要があります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import discord
# Botのトークン
TOKEN = ""
# グローバルチャットのチャンネル名
CHANNEL_NAME = "global-chat"
# クライアント作成
client = discord.Client(intents=discord.Intents.all())
@client.event
async def on_message(msg: discord.Message):
# Botの場合はreturn
if msg.author.bot:
return
# メッセージを送信したユーザーがclient.userか
if msg.author.id == client.user.id:
return
# Botが属しているサーバーのすべてのチャンネルを取得
for channel in client.get_all_channels():
# チャンネル名がCHANNEL_NAMEの時は処理を続行
if channel.name == CHANNEL_NAME:
# チャンネルがメッセージを送信したところであればcontinue
if channel.id == msg.channel.id:
continue
# メッセージ送信
await channel.send(msg.content)
client.run(TOKEN)
|
これだけで、メッセージ転送の機能はできます。
注: msg.content
を使用すると、@everyoneなどのメンションは対策することはできません。
Embed(埋め込み)にしてみよう
転送の方法は上のコードでとりあえずはよしとします。
次に、Embedにしてみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
@client.event
async def on_message(msg: discord.Message):
# Botの場合はreturn
if msg.author.bot:
return
# メッセージを送信したユーザーがclient.userか
if msg.author.id == client.user.id:
return
# 埋め込みObject作成、descriptionにメッセージ内容
embed = discord.Embed(description=msg.content)
# 埋め込みに送信者のアイコン設定
embed.set_author(name=msg.author, icon_url=msg.author.avatar)
# メッセージに画像が添付されている場合は設定
if msg.attachments:
embed.set_image(url=msg.attachments[0].url)
for channel in client.get_all_channels():
if channel.name == CHANNEL_NAME:
if channel.id == msg.channel.id:
continue
# メッセージ送信
await channel.send(embed=embed)
|
こんな感じです↓↓↓
おわり
この記事内のコードでは動作しない場合や、思っているような動作にはならない場合があります。
Webhook版は気が向いたら記事を書いてみようと思います。
更新履歴
2023/06/05 13:30 - client内でのintentsを追記しました