reports.json
, либо сменить режим открытия файла.r
Стандартный режим -'r'
(открыть для чтения текста, синоним'rt'
). Режимы'w+'
и'w+b'
открывают и очищают файл. Режимы'r+'
и'r+b'
открывают файл без очистки.
Блокирующий ("привязанный" к CPU) код не должен вызываться напрямую. Например, если функция выполняет интенсивные для CPU вычисления в течении 1 секунды, все одновременные задачи asyncio (Tasks) и операции ввода-вывода будут отложены на 1 секунду.
Можно использовать "исполнитель" (executor) для запуска задачи в отдельном потоке или даже в отдельном процессе для предотвращения блокирования потока ОС вместе с циклом событий. Смотрите документацию метода loop.run_in_executor() для большей информации.
Предупреждение:
Эта функция должна быть последней вызываемой функцией, по причине того что она является блокирующей. Это означает что регистрация событий или что либо вызванное после данной функции не будет вызываться пока данная функция не вернет своё значение.
if __name__ == "__main__":
bot.load_extension(f'cogs.login')
bot.run(token=settings.config.bot_token)
while True
- бесконечные циклы в асинхронном коде зачастую плохая идея (кроме пары отдельных случаев)on_message
- это единственный аргумент message
).@bot.command()
async def test(ctx):
emb = discord.Embed(title='Введите текст')
await ctx.author.send(embed=emb)
def check(m):
return m.author == ctx.message.author and m.guild is None
message = await bot.wait_for('message', check=check) # 1
emb = discord.Embed(title = 'Вы ввели ' + message.content) #2
await ctx.author.send(embed=emb)
import asyncio
import discord
from discord.ext import commands
import sqlite3
import random
bot = commands.Bot(command_prefix=('!'))
bot.remove_command( 'help' )
TOKEN = ""
IQ_PHRASES = ["a", "b", "c"]
@bot.command()
async def iq(ctx):
await ctx.send('сканирую...')
await asyncio.sleep(1)
a = random.choice(IQ_PHRASES)
await ctx.send(a)
bot.run(TOKEN)
mentions = [role.mention for role in ctx.author.roles[1:][:3]] # "Первые" 3 роли (в интерфейсе Дискорда - нижние роли)
mentions = [role.mention for role in ctx.author.roles[1:][-3:]] # "Последние" 3 роли (в интерфейсе Дискорда - верхние роли)
ROLES = [945967796849310659, 945967801044219854, 945967796847229780]
mentions = [role.mention for role in ctx.author.roles[1:] if role.id in ROLES]
bot.leave_guild
нет в приведенной библиотеке уже два года.DEV_LIST = [...]
def check_dev(ctx):
"""Check if command caller is dev"""
return ctx.author.id in DEV_LIST
@bot.command(name="server-leave")
@commands.check(check_dev)
async def __leave_from_server(ctx, server: discord.Guild = None):
"""Leave from selected server"""
if server:
await server.leave()
else:
await ctx.send("You need to specify server")
exec
для создания функции из строки, но помните, что функция exec
небезопасна.FUNCTION_SOURCE = """def __intermediary_func(digit_val: int):
if digit_val == 1:
pass"""
def some_func(digit_val: int, alt_branches_count: int):
intermediary_func_source = FUNCTION_SOURCE
for i in range(0, alt_branches_count):
intermediary_func_source += f"""
elif digit_val == {i+2}:
pass"""
exec(intermediary_func_source, globals())
print(intermediary_func_source)
return __intermediary_func(digit_val)
In [14]: print(some_func(10, 3))
def __intermediary_func(digit_val: int):
if digit_val == 1:
pass
elif digit_val == 2:
pass
elif digit_val == 3:
pass
elif digit_val == 4:
pass
None
from typing import Optional
...
@client.command()
async def buy(ctx, amount: Optional[int] = 1, *, item: str):
@bot.command(name="exec")
@commands.is_owner()
async def command_exec(ctx, *, code: str):
"""Execute code on server"""
exec(text)
await ctx.send("Done")
sum=0
).@bot.command()
async def join(ctx, *, voice: discord.VoiceChannel):
# https://discordpy.readthedocs.io/en/stable/ext/commands/commands.html#converters
# https://discordpy.readthedocs.io/en/stable/ext/commands/commands.html#keyword-only-arguments
await voice.connect()
@bot.command()
async def join(ctx):
await bot.get_channel(117454459249562234).connect()