server.voice.channels
- получить у объекта сервер свойство voice, а у объекта в этом свойстве - свойство channels.member_full = bot.get_user(id=id)
banned_users = await ctx.guild.bans()
for ban in banned_users: ...
member_full = bot.get_user(id=id)
async for ban in ctx.guild.bans(): ...
async for x in y
- это не то же самое, что и for x in await y
. Асинхронный генератор (первый случай) каждый элемент запрашивает асинхронно, а во втором случае - асинхронно запрашивается вся коллекция, которая потом синхронно итерируется. Разные подходы, разные методы, так что объект вполне может поддерживать только один из них. for filename in os.listdir("./cogs"):
from pathlib import Path
import sys
# каталог скрипта
SCRIPT_DIR = Path(sys.argv[0]).parent.resolve()
# каталог с когами
COGS_DIR = SCRIPT_DIR / 'cogs'
# список имён когов
COGS = [f.stem for f in COGS_DIR.glob('*.py')]
asyncio.create_task(bot.start(TOKEN))
Similar to has_permissions(), but operates on guild wide permissions instead of the current channel permissions.
A check() that is added that checks if the member has all of the permissions necessary.
Note that this check operates on the current channel permissions, not the guild wide permissions.
The permissions passed in must be exactly like the properties shown under discord.Permissions.
@bot.command()
@commands.has_permissions(manage_messages=True) # имя параметра должно быть взято из discord.Permissions
async def test(ctx):
await ctx.send('You can manage messages.')
has_guild_permissions(administrator=True)
.@Code.bot.command()
@commands.command()
. async def role(ctx, target: discord.Member):
# discord.py попытается сначала интерпретировать первый аргумент как пользователя.
# Если не получится - будет просто строка
async def nick(ctx, arg1: typing.Union[discord.Member, str], *, arg2: str = None):
if ctx.message.reference is not None and isintance(arg1, str): # сообщение - это ответ
member = ctx.message.reference.resolved.author
# arg1 будет содержать первое слово ника - доклеиваем к нему остальные.
newnick = f'{arg1} {arg2}' if arg2 is not None else arg1
elif ctx.message.reference is None and isintance(arg1, discord.Member) and arg2 is not None: # сообщение - не ответ
member, newnick = arg1, arg2
else:
... # выводим сообщение о неправильном использовании команды
await member.edit(nick = newnick)
@bot.event
async def on_raw_reaction_add(payload):
f"SELECT premium FROM premusers WHERE id = {ctx.guild.id}"
@discord.app_commands.checks.dynamic_cooldown(factory, *, key=...)
If a factory function is given, it must be a function that accepts a single parameter of type discord.Interaction and must return a Cooldown or None. If None is returned then that cooldown is effectively bypassed.