async def command(ctx, param: str)
даст первое слово в строке (до пробела, или строку в кавычках).async def command(ctx, *params: str)
даст каждое слово в строке (разделенной по пробелам, с учётом кавычек) отдельно, в виде кортежа.async def command(ctx, *, param: str)
даст всё содержимое строки в виде одной строки. @commands.has_any_role('mute' , 908382396112592926 )
A check() that is added that checks if the member invoking the command has any of the roles specified. This means that if they have one out of the three roles specified, then this check will return True.
muted_role = discord.utils.get( ctx.message.guild.roles, name = mute )
from collections import Counter
counts = Counter(reaction.emoji for reaction in message.reactions)
if counts['✅'] > counts['❌']:
KABOOM()
queue_len = len(self.song_queue[ctx.guild.id])
KeyError: 902227097647468664
with open('afk_users.json', 'w', encoding='utf-8') as file:
file.write(json.dumps(afk_users, indent=4, ensure_ascii=False))
file.close()
with open('afk_users.json', 'w', encoding='utf-8') as file:
json.dump(afk_users, file, indent=4, ensure_ascii=False))
description = f"""У тебя , **{ctx.author}** вот столько балов!**{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]} :polegar_para_cima:**"""
description = f"""У тебя , **{ctx.author}** вот столько балов!**{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]} :polegar_para_cima:**"""
score = cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]
description = f"""У тебя , **{ctx.author}** вот столько балов!**{score} :polegar_para_cima:**"""
score = cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id))
score = cursor.execute("SELECT cash FROM users WHERE id = ?", (ctx.author.id,) )
score = cursor.execute("SELECT cash FROM users WHERE id = ?", (ctx.author.id,) ).fetchone()[0]
description = f"""У тебя , **{ctx.author}** вот столько балов!**{score} :polegar_para_cima:**"""
score_row = cursor.execute("SELECT cash FROM users WHERE id = ?", (ctx.author.id,) ).fetchone()
if score_row is not None:
description = f"""У тебя , **{ctx.author}** вот столько балов!**{score_row[0]} :polegar_para_cima:**"""
else:
# что делать, если такого юзера еще нет в базе?
cursor.execute("INSERT INTO users (id, cash) VALUES (?, 0)", (ctx.author.id,) ) # можно его добавить
description = f"""У тебя , **{ctx.author}** пока нет ничего! Но скоро будет!"""
# команда вызывается как !choice вариант1 вариант_2 "вариант 3"
@commands.command(pass_context=True)
async def choice(self, ctx, *args:str):
chosen = random.choice(args)
# команда вызывается как !choice вариант1, вариант 2, вариант 3
@commands.command(pass_context=True)
# discord.py интерпретирует * как "всю остальную строку засунь в следующий параметр"
async def choice(self, ctx, *, args:str):
choices = [arg.strip() for arg in args.split(',')]
chosen = random.choice(choices)
@client.command()
async def test(ctx):
await ctx.author.send(f'test')
# сохраняем набор и порядок каналов на случай, если он поменяется в процессе отправки.
channels = list(ctx.guild.text_channels)
# формируем пачку корутин, выполняющих отправку
send_coroutines = [channel.send('test') for channel in channels]
# планируем одновременное выполнение этих корутин и ждём завершения.
# Исключения будут возвращены наравне с результатами, а не выброшены.
results = await asyncio.gather(*send_coroutines, return_exceptions=True)
# анализируем results на предмет ошибок.
# Успешная отправка вернёт объект сообщения, неудачная вернет (а не выбросит!) объект исключения.
failed = [ (ch.name, str(res)) for res, ch in zip(results, channels) if isinstance(res, (Exception, asyncio.CancelledError)) ]
if failed: # были ошибки?
await ctx.author.send('Failed to send to the following channels:\n' + '\n'.join(f'- {ch}: {msg}' for ch, msg in failed))
else: # ошибок не было
await ctx.author.send('Message has been spammed successfully.')
sum(len(vc.members) for vc in member.guild.voice_channels)