# インストールした 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)