[discord.py] グローバルチャットのつくりかた

discord.pyでグローバルチャットをつくる

[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)

こんな感じです↓↓↓
discord-gc1.png

おわり

この記事内のコードでは動作しない場合や、思っているような動作にはならない場合があります。
Webhook版は気が向いたら記事を書いてみようと思います。

更新履歴

2023/06/05 13:30 - client内でのintentsを追記しました


Made with 💚 and Stack (Jimmy)