Skip to content

Instantly share code, notes, and snippets.

@peco2282
Created November 30, 2022 04:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save peco2282/b8bb9231e3a301d97d1d4a5ff4966be5 to your computer and use it in GitHub Desktop.
Save peco2282/b8bb9231e3a301d97d1d4a5ff4966be5 to your computer and use it in GitHub Desktop.
# main.py
import discord
client = discord.Client(intents=discord.Intents.all())
# テキストチャンネルの先頭につける文字
CHANNEL_PREFIX = "private_"
# botたちのロール名 (botはテキストチャンネルに参加していてほしい)
BOT_ROLE_NAME = "bot"
voice_channelID_1 = "ボイスチャンネルID"
voice_channelID_2 = "ボイスチャンネルID2"
@client.event
async def on_ready():
print("ready")
def _initial_permissions(member: discord.Member):
guild = member.guild
channel = member.voice.channel
overwrites = {
guild.default_role: discord.PermissionOverwrite(read_messages=False),
member: discord.PermissionOverwrite(read_messages=True)
}
bot_role = discord.utils.get(guild.roles, name=BOT_ROLE_NAME)
if bot_role:
bot_overwrites = {
bot_role: discord.PermissionOverwrite(read_messages=True)
}
overwrites.update(bot_overwrites)
return overwrites
async def _create_new_channel(member: discord.Member, channel: discord.VoiceChannel):
# 権限追加したい場合はここで
overwrites = _initial_permissions(member)
# 以下同じカテゴリにチャンネル作成
# {CHANNEL_PREFIX}{member.name}_voiceという名前で新規VC作成
vc = await channel.category.create_voice_channel(
f"{CHANNEL_PREFIX}{member.name}_voice",
overwrites=overwrites
)
# {CHANNEL_PREFIX}{member.name}_textという名前で新規TC作成
await channel.category.create_text_channel(
f"{CHANNEL_PREFIX}{member.name}_text",
overwrites=overwrites
)
# 作成したVCに移動
await member.move_to(vc)
async def _delete_channels(member: discord.Member):
category = member.voice.channel.category
# メンバーのいるカテゴリで
# `{CHANNEL_PREFIX}{member.name}_text`, `{CHANNEL_PREFIX}{member.name}_voice`
# を探し、見つかった場合削除する
text_ch = discord.utils.get(category.text_channels, name=f"{CHANNEL_PREFIX}{member.name}_text")
vc = discord.utils.get(category.voice_channels, name=f"{CHANNEL_PREFIX}{member.name}_voice")
if text_ch:
await text_ch.delete()
if vc:
await vc.delete()
@client.event
async def on_voice_state_update(
member: discord.Member,
before: discord.VoiceState,
after: discord.VoiceState
):
if before.channel == after.channel:
return
# 新規参加
if (before.channel is None) and after.channel:
# 参加先が指定したところの場合
if after.channel.id == voice_channelID_1:
# 新しくちゃんねる作成
await _create_new_channel(member, after.channel)
# ボイチャを抜けた時
if before.channel and (after.channel is None):
# ボイチャ削除
await _delete_channels(member)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment