Discord 招待リンク生成BOT

自作アプリアイキャッチ Discord Bot
この記事は約8分で読めます。

Discord 招待リンク生成BOT 作成

開発経緯

普段Discordを使用して友人たちとコミュニケーションを取っているのですが、
メンションを使って人を呼んだりすることが多く、呼んだ後呼んだときのメンションメッセージを削除せずにいてログが残り続けて、
気がついたらテキストチャットのログがメンションだらけになったりしたので思い立ち開発

とりあえずノリと勢いで公開
仕様は自己責任で

開発環境

  • windows 10 Pro
  • Microsoft Visual Stduio 2022 無償版
  • Python

ソースコード

import discord
from discord.ext import commands, tasks

### 設定 ###
# Botトークン
BOT_TOKEN = "BOT用トークン"
# 招待リンク期限(秒)
INVITE_LIMIT = 3000
# ボイスチャンネルに居ない時にボイスチャンネルに入るよう促すメッセージを表示するかどうか
# True = 表示する / False = 表示しない
VOICE_CHANNEL_CHECK_MESSAGE = False


intents = discord.Intents.default()
intents.members = True
intents.voice_states = True
intents.message_content = True

bot = commands.Bot(command_prefix="!", intents=intents)

# 招待リンクとメッセージID、テキストチャンネルID、ユーザーIDを保存する辞書
invite_to_message = {}

@bot.event
async def on_ready():
    print("Bot is ready!")
    # 定期的にボイスチャンネルのメンバーをチェックするタスクを開始
    check_channel_members.start()

@bot.event
async def on_message(message):
    # メッセージ送信者がBOTじゃないことを確認
    if message.author.bot:
        return

    # メンションがあるかどうかを確認
    if message.mentions:
        # メンションされたユーザーを取得
        mentioned_user = message.mentions[0]
        # メンションの内容を取得
        message_content = message.content

        # メッセージにメンションのみが含まれているかどうかを確認
        if message_content == mentioned_user.mention:
            # メッセージ送信者のいるボイスチャンネルを取得
            voice_state = message.author.voice
            if not voice_state or not voice_state.channel:
                if VOICE_CHANNEL_CHECK_MESSAGE:
                    await message.channel.send(f"{mentioned_user.mention} さん、ボイスチャンネルに参加してからもう一度メンションしてください。")
                return
            
            # ボイスチャンネル取得
            voice_channel = voice_state.channel
            # 招待リンクの期限を設定
            invite = await voice_channel.create_invite(max_age=INVITE_LIMIT)
            # 招待リンクメッセージ設定
            invite_message = await message.channel.send(f"{mentioned_user.mention} さん、{voice_channel.name} で一緒に遊びましょう!\n{invite.url}")

            # 辞書に招待リンクコードとメッセージID、テキストチャンネルID、メンションされたユーザーIDを保存(削除処理用)
            invite_to_message[invite.code] = (invite_message.id, message.channel.id, mentioned_user.id)
            # 最初のメンションメッセージを削除
            await message.delete()

# ボイスチャンネルのメンバーを定期的にチェックするタスク
@tasks.loop(seconds=10)
async def check_channel_members():
    for invite_code, (message_id, text_channel_id, user_id) in list(invite_to_message.items()):
        text_channel = bot.get_channel(text_channel_id)
        if text_channel is not None:
            # 招待されたユーザーが現在チャンネルにいるかをチェック
            for channel in bot.get_all_channels():
                if isinstance(channel, discord.VoiceChannel) and any(member.id == user_id for member in channel.members):
                    try:
                        message = await text_channel.fetch_message(message_id)
                        await message.delete()
                    except discord.NotFound:
                        pass # メッセージが既に削除されている場合は無視
                    # 招待リンクとメッセージの情報を辞書から削除
                    del invite_to_message[invite_code]
                    break

bot.run(BOT_TOKEN)

使用方法

pythonの環境を作って、pipでdiscord.pyをインストールしてから実行
6行目のBOT用のトークンは変更必須
54行目の招待リンクメッセージと、8行目の招待リンクの期限は適時書き換えてください
11行目はTrueにするとボイスチャンネルに入らずにメンションを送ると49行目のメッセージが表示される


2024.06.20 追記

Windows で使用する場合の方法を書きます

  1. Pythonのインストール
    • Pythonの公式サイトからPythonをダウンロードする
      • 公式サイトのDownloadsタブ → Windows
      • Latest Python 3 Release – Python 3.**.** を選択
      • 下の方にあるFilesの中からWindows Installer をクリックでDL(32/64bitはお使いの環境に合わせてください)
      • ダウンロードしたファイルを実行しインストール
        • インストールファイル実行時の最初の画面一番下にある「Add python.exe to PATH」にチェックを入れる
    • コマンドプロンプトを開いて確認
      • Win+Rキーでファイル名を指定して実行を開き「cmd」と入力してENTER
      • python と入力しEnter
        • バージョン表示が出たらOK
  2. Discord.pyのインストール
    • 「python -m pip install discord.py」を入力してENTER
      • 確認作業直後に行う場合(入力欄左が>>>になってる場合)は、Ctrl+Zを押してENTERを押し一度pythonから抜けてから行う
  3. botファイルをダウンロードし、回答して出てきたpyファイルを適当なフォルダに配置
    • メモ帳等でファイルを開き、botトークン等の設定を行う
    • コマンドプロンプトからbotファイルを実行
      • コマンドプロンプトで「python (配置先フォルダ)\discordinvitebot.py」
        • 例) 「python C:\discordinvitebot\discordinvitebot.py」

ダウンロード

ダウンロード (2024/06/10) – ver 0.0.1

動作

  1. @***** でメンションを飛ばす
  2. 1で送ったメンションメッセージが削除され、botによる招待リンクが貼られる
  3. 3招待リンクを使用が使用される(≒招待チャンネルに対象者が参加する)とbotによる招待リンクが自動で削除される

スクリーンショット

コメント

  1. マッシャー より:

    タイムアウト時に招待削除する処理は含まれておりません
    そのうち追加するかも

タイトルとURLをコピーしました