Распознать активность участника дискорд сервера на питоне
Всем привет. Я сделал бота, который при подключении к голосовому каналу "Во что будем играть?" узнает игру запускаемую пользователем, перемещает участника в канал с названием игры. Но как бы я не старался, member.activity или member.activities всегда пустые (там есть пару строк от нейросетки и от ответов на похожие проблемы пользователей интернета). Так как я первый раз делаю бота, то не очень могу разобраться в документации discord.py либо в чужих кодах. Прилагаю скрипт:
import discord
from discord.ext import commands
import asyncio
intents = discord.Intents.default().all()
intents.voice_states = True
intents.members = True
intents.presences = True # Убедитесь, что этот интент включен
bot = commands.Bot(command_prefix='--', intents=intents)
@bot.event
async def on_ready():
print(f'Logged in as {bot.user}')
async def check_activity(member):
while True:
if member.voice and member.voice.channel.name == "Во что будем играть?":
print(f"Checking activity for {member.name} in 'Во что будем играть?'")
game_name = None
for m in member.voice.channel.members:
print(f"Checking member: {m.name}, activities: {m.activities}") # Выводим активность участника
for activity in m.activities:
if isinstance(activity, discord.Game):
game_name = activity.name
print(f"Found game '{game_name}' for {m.name}")
break
if game_name:
existing_channel = discord.utils.get(member.guild.voice_channels, name=game_name)
if not existing_channel:
print(f"Creating new voice channel '{game_name}'")
existing_channel = await member.guild.create_voice_channel(name=game_name)
if member.voice.channel != existing_channel:
print(f"Moving {member.name} to channel '{existing_channel.name}'")
await member.move_to(existing_channel)
else:
print(f"{member.name} is already in the channel '{existing_channel.name}'")
else:
print(f"{member.name} is not in the channel 'Во что будем играть?'")
await asyncio.sleep(1)
@bot.event
async def on_voice_state_update(member, before, after):
if after.channel and after.channel.name == "Во что будем играть?":
print(f"{member.name} has joined the voice channel 'Во что будем играть?'")
bot.loop.create_task(check_activity(member))
# Замените 'YOUR_TOKEN' на токен вашего бота (я просто не стал вставлять его, он есть в запускаемом файле)
bot.run('')
Ответы (1 шт):
Все решилось проще, чем я думал. В настройках дискорд, есть вкладка
"Конфидециальность" (их 2 штуки, нужна конфидециальность игровой активности. Она ниже) , там необходимо включить параметр " Делитесь своими активностями с другими"
До этого, на этот вопрос отвечал другой пользователь, но так как я решил зарегистрироваться, вопрос переместился в мой аккаунт без его ответа. Выражаю благодарность за оперативность и верное решение вопроса.