loop.run_in_executor
.import concurrent
...
async def CheckForNewMsgs():
channel = client.get_channel(755448398584479824)
sock = socket.socket() # нужно ли указывать данные аргументы, если они являются стандартными значениями? https://docs.python.org/3/library/socket.html?highlight=socket#socket.socket
server_address = ('127.0.0.1', 6000)
sock.bind(server_address)
sock.listen(10)
while True:
with concurrent.futures.ThreadPoolExecutor() as pool:
connection, client_address = await loop.run_in_executor(pool, sock.accept) # не уверен что из этого блокирует, что нет, в сокеты особо не углублялся
data = connection.recv(16)
serial = data.decode('utf-8')
datas = serial.split('|')
playername = datas[0]
await channel.send(playername + "connected!")
msgs_check_task = asyncio.create_task(CheckForNewMsgs())
# msgs_check_task.cancel() для остановки, подробнее: https://docs.python.org/3/library/asyncio-task.html#asyncio.Task
import concurrent
from discord.ext import tasks
...
@tasks.loop() # будет работать как while True
async def CheckForNewMsgs():
channel = client.get_channel(755448398584479824)
sock = socket.socket() # нужно ли указывать данные аргументы, если они являются стандартными значениями? https://docs.python.org/3/library/socket.html?highlight=socket#socket.socket
server_address = ('127.0.0.1', 6000)
sock.bind(server_address)
sock.listen(10)
with concurrent.futures.ThreadPoolExecutor() as pool:
connection, client_address = await loop.run_in_executor(pool, sock.accept) # не уверен что из этого блокирует, что нет, в сокеты особо не углублялся
data = connection.recv(16)
serial = data.decode('utf-8')
datas = serial.split('|')
playername = datas[0]
await channel.send(playername + "connected!")
CheckForNewMsgs.start()
# CheckForNewMsgs.stop() - остановит после окончания выполнения текущего "прохода", подробнее: https://discordpy.readthedocs.io/en/v1.4.1/ext/tasks/index.html#discord.ext.tasks.Loop.stop
@bot.group()
async def clear(ctx):
"""Строка помощи к [p]clear"""
...
@clear.command(name="all")
async def _all(ctx):
"""Строка помощи для [p]clear all"""
...
@commands.command()
async def command_name(ctx, user: discord.Member):
if role := ctx.guild.get_role(779490160819217032)
await user.add_roles(role)
arg
у вас не имеет стандартного значения. Аргументы без стандартного значения считаются обязательными аргументами.@bot.command() # pass_context НЕ существует в текущей версии discord.py: https://discordpy.readthedocs.io/en/v1.4.1/migrating.html#context-changes
async def help(ctx, arg = None):
emb = discord.Embed(title = 'Помощь', colour = 0x2e2d2d)
if arg == 'poll':
emb.add_field(name = f"{ctx.prefix}poll", value = f"Использовать:\nder poll (название голосования), (первый параметр), (второй параметр), (и так до 9 раз)\nПример создания голосования:\npoll test, 1, 2")
await ctx.send(embed = emb)
else:
emb.add_field(name = f"{ctx.prefix}poll", value = f"Создание голосовния.")
await ctx.send(embed = emb)
from typing import Optional
@commands.command()
async def cmd(ctx, arg: Optional[str]): ...
guild
не определена. В данном случае Вы, скорее всего, хотите получить её из контекста - ctx.guildGuild.voice_channels
и Guild.text_channels
- "списки" (list) с каналами соответствующего типа. Списки не имеют атрибута set_permissions
. Данный атрибут есть у каналов в списке. Для установки прав для каждого канала нужно данный список итерировать. @client.command()
async def set_permissions(сtx, role: discord.Role):
for textchannel in ctx.guild.text_channels:
await alltext.set_permissions(
role,
read_messages=True,
send_messages=True,
manage_channels=True,
manage_roles=True,
)
for voicechannel in ctx.guild.voice_channels:
await allvoice.set_permissions(
role, connect=True, manage_channels=True, manage_roles=True
)
await ctx.send(
f"{ctx.author.mention}, вы успешно установили {role.mention} права доступа во всех текстовых/голосовых каналах"
)
Замена стандартного `on_message` предотвращает выполнение любых дополнительных команд. Для исправления этого добавьте добавьте строку `bot.process_commands(message)` в конце вашего `on_message`, например:
@bot.event
async def on_message(message):
# делаем что-нибудь тут
await bot.process_commands(message)
if message.guild.id != 282480459897027773:
return
Message.reactions
. discord.Reaction
- тип возвращаемых объектов в reactions.@bot.command()
async def start(ctx):
mess = await channel.send('Набор в игру')
await asyncio.sleep(10)
mess = await ctx.channel.fetch_message(mess.id)
if yes_react := discord.utils.get(mess.reactions, emoji=ctx.guild.get_emoji(471483388532742130)):
async for user in yes_react.users:
print(str(user)) # выведет всех пользователей поставивших реакцию в консоль
bot.event
используется только для событий.@bot.command()
или @commands.command()
в модулях.from datetime import date
import discord
from datetime import date
@bot.command()
async def bdays4(ctx):
cur_year = date.today().year
bdays = {
"Kenshi": date(day=12, month=8, year=1997),
"Broody": date(day=11, month=11, year=1009),
"Melanie": date(day=22, month=1, year=1941),
"Blueface Baby": date(day=18, month=8, year=2020),
}
for bday_name, date in bdays.items():
bday = date.update(year=cur_year)
if bday == date.today():
await ctx.send(
embed=discord.Embed(
description=f"Happy birthday {bday_name}",
colour=discord.Color.green(),
)
)
on_error_command(context, error)
: https://discordpy.readthedocs.io/en/v1.4.1/ext/com...from discord.ext import commands
from contextlib import suppress
class MyBot(commands.Bot):
async def on_command_error(self, ctx, error):
if isinstance(error, commands.BadArgument):
await ctx.send(f"Неверный аргумент: {error.message}")
else:
await super().on_command_error(ctx, error) # вызывает изначальное поведение on_error_message
bot = MyBot(command_prefix="!")
from discord.ext import commands
from contextlib import suppress
bot = commands.Bot(command_prefix="!")
@bot.event
async def on_command_error(ctx, error):
if isinstance(error, commands.BadArgument):
await ctx.send(f"Неверный аргумент: {error.message}")
.post
, рискну предположить что Disc
- экземпляр объекта типа aiohttp.ClientSession
. Он не знает что такое дискорд.import discord
import aiohttp
session = aiohttp.ClientSession()
# Discord поддерживает только markdown для форматирования. html-теги (<i> и прочие) будут отображаться напрямую
embed_obj = discord.Embed(
title="*Заголовок*", colour=0x21D3CD, url="https://example.com"
) # Цвет в HEX более читаемый
embed_obj.set_image(url="https://via.placeholder.com/140x100")
embed_obj.set_thumbnail(url="https://via.placeholder.com/140x100")
embed_obj.set_footer(text="*Текст*", icon_url="https://via.placeholder.com/140x100")
embed_obj.set_author(
name="*Текст*",
url="https://example.com",
icon_url="https://via.placeholder.com/140x100",
)
embed_obj.add_field(
name="*Текст*", value="\N{Zero Width Space}"
) # Значение поля не может быть пустым, такой embed дискорд отклонит. Используем визуально пустой символ для этого.
await session.post(
"https://discord.com/api/webhooks/%WEBHOOK_ID%/%WEBHOOK_TOKEN",
json={"embeds": [embed_obj.to_dict()]},
)
import aiohttp
import discord
session = aiohttp.ClientSession()
webhook = discord.Webhook.from_url(
"https://discord.com/api/webhooks/%WEBHOOK_ID%/%WEBHOOK_TOKEN",
adapter=discord.AsyncWebhookAdapter(session),
)
embed_obj = ...
await webhook.send(embed=embed_obj)
on_guild_join
передаётся аргумент guild
, который и является сервером, к которому присоединился бот.import logging
@listener # client.event / commands.Cog.listener / etc...
async def on_guild_join(guild):
logging.info(f"Joined guild {guild.name} ({guild.id})"