1
1

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でボイスチャンネルに参加しているユーザにランダムにMsgを送るBot

Last updated at Posted at 2021-06-15

用途

  • あもあすで「てるてる」とか「狂人」をメンバーに割り当てたい時とか

仕様

  • ボイスチャンネルに参加しているユーザからランダムに一人選んで何らか(例えば「狂人」)のメッセージを送る機能
  • 誰が狂人設定かを教えてくれる機能

使い方

  • /random_role
    • ボイスチャンネルに参加しているメンバー1人に、「狂人」と送る。
    • ボイスチャンネルに参加している上記以外のメンバーには「not 狂人」を送る
  • /who_is
    • 直前に誰に「狂人」と送ったかを、返信してくれる
      • 例) 「catty is 狂人」

設定

  • DeveloperAccount でTOKENを取得する
  • PRESENCE INTENT、SERVER MEMBERS INTENTをオンにしておく

コード


# インストールした discord.py を読み込む
import discord
import random

# 設定全般まとめる
BOT_NAME = "cats0830v"
SERVER_NAME = "cattyのサーバー(botのテスト用)"
RAISE_WORD = "/random_role"
RAISE_WORD_CONFIRM = "/who_is"
MSG_WORD = "狂人"
WHO_IS_TARGET = ""

# 自分のBotのアクセストークンに置き換えてください
TOKEN = 'xxxxx'
#誰が狂人かをローカルにメモする
def mkmemo(name):
    path = 'memo.txt'
    f = open(path,'w')
    f.write(name)
    f.close()
    return

def readmemo():
    path = 'memo.txt'
    with open(path) as f:
        s = f.read()
    return s

#ボイスチャンネルに入っているメンバーを取得する関数
def getVoiceUsers(guild):
    chs = guild.channels
    voice_members = []
    for ch in chs:
        if ch.type == discord.ChannelType.voice:
            for mem in ch.members:
                voice_members.append(mem)
    return voice_members

#オンラインのメンバーを取得する関数
def getOnlineUsers(guild):
    online_members = []
    for member in guild.members:
        if member.status == discord.Status.online and member:
            if member.name != BOT_NAME:#ほんとはBotじゃないという条件にしたい
                 online_members.append(member)
                 #print(member.name, " is online")
    return online_members

# 接続に必要なオブジェクトを生成
intents = discord.Intents.default()
intents = discord.Intents.all()
client = discord.Client(intents=intents)

# 起動時に動作する処理
@client.event
async def on_ready():
    # 起動したらターミナルにログイン通知が表示される
    print('ログインしました')

# メッセージ受信時に動作する処理
@client.event
async def on_message(message):
    # メッセージ送信者がBotだった場合は無視する
    if message.author.bot:
        return
    # RAISE_WORDを発言したらがDMが返る処理
    if message.content == RAISE_WORD:
        guild = discord.utils.get(client.guilds, name=SERVER_NAME)

        online_members = getVoiceUsers(guild)
        # 誰もいない場合は抜ける
        if len(online_members) == 0:
            return
        # ランダムな数字を作成
        rand_idx = random.randrange(len(online_members))
        target_name = online_members[rand_idx].name
        mkmemo(target_name)

        for i in range(len(online_members)):
            if i != rand_idx:
                dm_channel = await online_members[i].create_dm()
                await dm_channel.send("not "+MSG_WORD)
            else:
                dm_channel = await online_members[i].create_dm()
                await dm_channel.send(MSG_WORD)
        print("完了")
    
    if message.content == RAISE_WORD_CONFIRM:
        await message.channel.send(readmemo() + " is " + MSG_WORD)

# Botの起動とDiscordサーバーへの接続
client.run(TOKEN)

参考

1
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?