Client.wait_for(event, *, check, timeout)
: https://discordpy.readthedocs.io/en/stable/api.htm...def check(message):
return message.author.id == ctx.author.id
try:
m = await bot.wait_for("message", check=check, timeout = 30)
except asyncio.TimeoutError:
pass
async for ... in history(...)
: https://discordpy.readthedocs.io/en/stable/api.htm...counter = 0
async for message in channel.history(limit=200):
if message.author == client.user:
counter += 1
messages = await channel.history(limit=123).flatten()
# messages is now a list of Message...
from datetime import datetime, timedelta
# ...
async for message in channel.history(
limit=None, # If None, retrieves every message in the channel. Note, however, that this would make it a slow operation.
after=datetime.utcnow()-timedelta(hours=2) # If a date is provided it must be a timezone-naive datetime representing UTC time. (https://docs.python.org/3/library/datetime.html#datetime.datetime.utcnow)
):
command_prefix
можно использовать функцию:The command prefix is what the message content must contain initially to have a command invoked. This prefix could either be a string to indicate what the prefix should be, or a callable that takes in the bot as its first parameter and discord.Message as its second parameter and returns the prefix. This is to facilitate “dynamic” command prefixes. This callable can be either a regular function or a coroutine.
SPECIAL_PREFIX = "."
def context_prefix(bot, message):
special_command = bot.get_command("choose")
if any(
message.content.startswith(f"{SPECIAL_PREFIX}{command_string}")
for command_string in [special_command.name, *special_command.aliases]
):
return SPECIAL_PREFIX
return "&"
bot = commands.Bot(command_prefix=context_prefix)
choose
будет вызываться с префиксом .
, в то время как остальные с префиксом &
: client.event
не должен вызываться: https://discordpy.readthedocs.io/en/v1.4.1/api.htm...@client.event # вызов функции-декоратора (скобки) отсуствует
async def on_ready():
print('Ready!')
on_group_*
на клиенте-боте абсолютно бесполезны, так как дискорд не предоставляет возможности добавления ботов в "группы"on_guild_*
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.event()
async def on_voice_state_update(member, before, after):
if not before.channel and after.channel:
...
@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)
async def special_command_check(ctx):
return ctx.author.id in [204191975222080878, 544689912660601908]
@commands.check(special_command_check)
@bot.command()
async def scmd(ctx):
await ctx.send("You can run this command!")
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)) # выведет всех пользователей поставивших реакцию в консоль