@weRifiCatoR
Начинающий программист

Discord.py как сделать глобальный чат?

Я хотел сделать глобальный чат в боте использую discord.py.

Его принцип работы: если человек написал сообщение в этом чате, то бот его удаляет и пишет (на все сервера где есть бот в указанный канал) ник человека и его сообщение.
Проблема в том что бот отправляет только на тот сервер сообщение где оно и было написано, но не делает рассылку на все сервера.

Вот мой код:

globals_chat = 'глобальный-чат'

@client.event
async def on_message( message ):
	channel = discord.utils.get( message.guild.text_channels, name = globals_chat )
	if message.author.id == айди бота:
		pass
	else:
		if message.channel == channel:
			for a in client.guilds:
				if channel in a.text_channels:
					await message.delete()
					await channel.send( '**{0.author}:** {0.content}'.format( message ) )
  • Вопрос задан
  • 596 просмотров
Решения вопроса 1
Через discord.utils.get вы получаете канал того сервера, в котором было написано сообщение.

Он принадлежит тому серверу, в котором написано сообщение. Объект канала с таким же названием на других серверах будет другим.

Следовательно: вам нужно искать канал на том сервере, на который сообщение отправляется
GLOBAL_CHAT = 'глобальный-чат'  # PEP8: Названия констант пишутся капсом

@client.event
async def on_message(message):
    channel = discord.utils.get(message.guild.text_channels, name=GLOBAL_CHAT)
    if message.author.id == client.user.id:
        return  # return предотвратит выполнение следующего кода
    if message.channel.id != channel.id:
        return
    await message.delete()  # удаляем сообщение один раз
    for guild in client.guilds:
        if channel := discord.utils.get(guild.text_channels, name=GLOBAL_CHAT):
            # py3.8: walrus operator ("моржовый" оператор)
            # равносильно следующему:
            # channel = discord.utils.get(guild.text_channels, name=GLOBAL_CHAT)
            # if channel: ...
            try:
                await channel.send('**{0.author}:** {0.content}'.format(message))
            except discord.Forbidden:
                print(f"Невозможно отправить сообщение на сервер {guild.name}: Недостаточно прав")
            except discord.HTTPException as e:
                print(f"Невозможно отправить сообщение на сервер {guild.name}: {e}")
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@maximnaum
кстати если нужно с названием сервера то держи:
GLOBAL_CHAT = 'глобальный-чат'  # PEP8: Названия констант пишутся капсом

@client.event
async def on_message(message):
    channel = discord.utils.get(message.guild.text_channels, name=GLOBAL_CHAT)
    if message.author.id == client.user.id:
        return  # return предотвратит выполнение следующего кода
    if message.channel.id != channel.id:
        return
    await message.delete()  # удаляем сообщение один раз
    for guild in client.guilds:
        if channel := discord.utils.get(guild.text_channels, name=GLOBAL_CHAT):
            # py3.8: walrus operator ("моржовый" оператор)
            # равносильно следующему:
            # channel = discord.utils.get(guild.text_channels, name=GLOBAL_CHAT)
            # if channel: ...
            try:
                await channel.send('**[{0.guild}]** **{0.author}:** {0.content}'.format(message))
            except discord.Forbidden:
                print(f"Невозможно отправить сообщение на сервер {guild.name}: Недостаточно прав")
            except discord.HTTPException as e:
                print(f"Невозможно отправить сообщение на сервер {guild.name}: {e}")

если есть вопросы то можешь написать мне в дс: CRAIZESdsYT#0953 :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы