Как получить id сервера discord py
Перейти к содержимому

Как получить id сервера discord py

  • автор:

Вопросы с меткой [discord.py]

Я тестирую бота в Discord и пытаюсь получить текущее время в часах у пользователя, в каком часовом поясе он находиться не известно. Естественно datetime.now() и datetime.now(pytz.timezone(‘Europe/.

задан 24 июл 2021 в 12:55
2k показов

Как использовать кнопки и подсказки при вводе команд, присутствующие в верифицированных ботах в библиотеке discord.py

При использовании бота Juniper Bot я заметил кнопки, которых нет у обычных ботов, но эту функцию мне хотелось бы использовать. Можете пожалуйста сказать, как использовать изображённые снизу функцию (.

задан 25 июн 2021 в 14:04
4k показов

Как установить ограничение в использовании команды по роли Discord.py

Я делаю бота для Discord на Python с помощью модуля Discord.py. И мне нужно сделать так, чтобы определенную команду могли использовать только участники имеющие определенные роли. Я Пробовал перед .

задан 21 янв 2021 в 5:35
3k показов

Как отключить бота discord от голосового канала?

Есть проблема при отключении бота от голосового чата: import discord import asyncio from discord.ext import commands from discord.ext.commands import Bot Bot = commands.Bot(command_prefix=’!’) @Bot.

задан 27 сен 2019 в 22:51
887 показов

Редактирование embed по нажатию кнопки

Пытаюсь повторить функцию, в которой по нажатию кнопки «голос пользователя» добавляется в определённый столбец Embed. (См. скрины 1 и 2) @bot.slash_command(description=»Создание .

задан 28 дек 2021 в 18:56
1k показов

Прямой вывод звука из Ютуб в канал дискорда

Хочу сделать музыкального бота сам. Но проблема в выводе звука. Он берет аргументы, ищет в ютубе, берет href первого видео и выдает ссылку. Я это сделал с помощью bs4 и requests. Дальше я хотел .

задан 8 дек 2019 в 23:14
79 показов

Ошибка при объявлении двух глобальных переменных

if message.content.lower().startswith(‘!m_change’): global DIR global MODE if (DIR == ‘arts/normal’ and MODE == ‘Обычный.’): DIR = ‘arts/hentai’ MODE = ‘Хентай.’ .

задан 19 дек 2020 в 11:46
657 показов

Как вывести ошибку Forbidden discord.py

Здраствуйте! Не знаю как вывести ошибку discord.errors.Forbidden: 403 Forbidden (error code: 50013): Missing Permissions. Различные методы пробовал, через cog_command_error() и isinstance(error, .

задан 23 июн 2021 в 13:35
4k показов

Discord.py | Слэш команды

Моя проблема заключается в том что когда я хочу использовать слэш команду то ответ на неё появляется не сразу. Только после 2-х, 3-х раз использовании данной команды. Сперва появляется ошибка, а .

задан 23 июл 2021 в 16:24
265 показов

Как забанить участников у которых нет определённой роли discord.py?

Мне нужно забанить всех участников у которых нет определённой роли, но я не понимаю, как это сделать.

задан 13 апр 2021 в 19:07
3k показов

Как считать время проведенное в голосовом канале? | discord.py

У меня есть код, который реагирует на вход в голосовой, и выход из него. При входе пишется «1», при выходе «0». Как мне его изменить, чтобы он еще и считал время проведенное в .

задан 21 дек 2020 в 11:50
438 показов

Не работает команда random у бота на discord.py. В консоли пусто

Бот просто не отвечает на команду. Если не ввести первое или второе число, то он об этом напишет, а если ввести всё правильно, то следом не последуют никакой реакции, но при этом работают абсолютно .

задан 12 дек 2020 в 10:08
2k показов

Как получить информацию о том, какую роль в дискорде занимает человек discord.py

Как в коде python с помощью библиотеки discord.py получить сведения о том, какую роль занимает человек?

задан 24 фев 2020 в 13:48
412 показов

Как узнать, что в голосовом канале, кроме бота, больше никого нет? [discord-py]

Использую библиотеку discord.py, событие на вход/выход пользователей определять умею, а вот как узнать, что в канале больше никого нет кроме бота? Каким образом это можно реализовать? Код для события .

задан 13 янв 2021 в 7:21
272 показа

Магазин на Discord.py

Я пишу магазин для своего сервера Discord. У меня возникла проблема с добавлением роли в магазин. Буду очень благодарен, если вы мне поможете. @Client.command() async def shop(ctx, value=None, price=.

Frequently Asked Questions¶

This is a list of Frequently Asked Questions regarding using discord.py and its extension modules. Feel free to suggest a new question or submit one via pull requests.

  • Coroutines
    • What is a coroutine?
    • Where can I use await ?
    • What does “blocking” mean?
    • Where can I find usage examples?
    • How do I set the “Playing” status?
    • How do I send a message to a specific channel?
    • How do I send a DM?
    • How do I get the ID of a sent message?
    • How do I upload an image?
    • How can I add a reaction to a message?
    • How do I pass a coroutine to the player’s “after” function?
    • How do I run something in the background?
    • How do I get a specific model?
    • How do I make a web request?
    • How do I use a local image file for an embed image?
    • Is there an event for audit log entries being created?
    • Why does on_message make my commands stop working?
    • Why do my arguments require quotes?
    • How do I get the original message ?
    • How do I make a subcommand?
    • How can I disable all items on timeout?
    • My bot’s commands are not showing up!

    Coroutines¶

    Questions regarding coroutines and asyncio belong here.

    What is a coroutine?¶

    A coroutine is a function that must be invoked with await or yield from . When Python encounters an await it stops the function’s execution at that point and works on other things until it comes back to that point and finishes off its work. This allows for your program to be doing multiple things at the same time without using threads or complicated multiprocessing.

    If you forget to await a coroutine then the coroutine will not run. Never forget to await a coroutine.

    Where can I use await ?¶

    You can only use await inside async def functions and nowhere else.

    What does “blocking” mean?¶

    In asynchronous programming a blocking call is essentially all the parts of the function that are not await . Do not despair however, because not all forms of blocking are bad! Using blocking calls is inevitable, but you must work to make sure that you don’t excessively block functions. Remember, if you block for too long then your bot will freeze since it has not stopped the function’s execution at that point to do other things.

    If logging is enabled, this library will attempt to warn you that blocking is occurring with the message: Heartbeat blocked for more than N seconds. See Setting Up Logging for details on enabling logging.

    A common source of blocking for too long is something like time.sleep() . Don’t do that. Use asyncio.sleep() instead. Similar to this example:

    # bad time.sleep(10) # good await asyncio.sleep(10) 

    Another common source of blocking for too long is using HTTP requests with the famous module Requests: HTTP for Humans™ . While Requests: HTTP for Humans™ is an amazing module for non-asynchronous programming, it is not a good choice for asyncio because certain requests can block the event loop too long. Instead, use the aiohttp library which is installed on the side with this library.

    Consider the following example:

    # bad r = requests.get('http://aws.random.cat/meow') if r.status_code == 200: js = r.json() await channel.send(js['file']) # good async with aiohttp.ClientSession() as session: async with session.get('http://aws.random.cat/meow') as r: if r.status == 200: js = await r.json() await channel.send(js['file']) 

    General¶

    General questions regarding library usage belong here.

    Where can I find usage examples?¶

    Example code can be found in the examples folder in the repository.

    How do I set the “Playing” status?¶

    The activity keyword argument may be passed in the Client constructor or Client.change_presence() , given an Activity object.

    The constructor may be used for static activities, while Client.change_presence() may be used to update the activity at runtime.

    It is highly discouraged to use Client.change_presence() or API calls in on_ready() as this event may be called many times while running, not just once.

    There is a high chance of disconnecting if presences are changed right after connecting.

    The status type (playing, listening, streaming, watching) can be set using the ActivityType enum. For memory optimisation purposes, some activities are offered in slimmed-down versions:

    Putting both of these pieces of info together, you get the following:

    client = discord.Client(activity=discord.Game(name='my game')) # or, for watching: activity = discord.Activity(name='my activity', type=discord.ActivityType.watching) client = discord.Client(activity=activity) 

    How do I send a message to a specific channel?¶

    You must fetch the channel directly and then call the appropriate method. Example:

    channel = client.get_channel(12324234183172) await channel.send('hello') 

    How do I send a DM?¶

    Get the User or Member object and call abc.Messageable.send() . For example:

    user = client.get_user(381870129706958858) await user.send('��') 

    If you are responding to an event, such as on_message() , you already have the User object via Message.author :

    await message.author.send('��') 

    How do I get the ID of a sent message?¶

    abc.Messageable.send() returns the Message that was sent. The ID of a message can be accessed via Message.id :

    message = await channel.send('hmm…') message_id = message.id 

    How do I upload an image?¶

    To upload something to Discord you have to use the File object.

    A File accepts two parameters, the file-like object (or file path) and the filename to pass to Discord when uploading.

    If you want to upload an image it’s as simple as:

    await channel.send(file=discord.File('my_file.png')) 

    If you have a file-like object you can do as follows:

    with open('my_file.png', 'rb') as fp: await channel.send(file=discord.File(fp, 'new_filename.png')) 

    To upload multiple files, you can use the files keyword argument instead of file :

    my_files = [ discord.File('result.zip'), discord.File('teaser_graph.png'), ] await channel.send(files=my_files) 

    If you want to upload something from a URL, you will have to use an HTTP request using aiohttp and then pass an io.BytesIO instance to File like so:

    import io import aiohttp async with aiohttp.ClientSession() as session: async with session.get(my_url) as resp: if resp.status != 200: return await channel.send('Could not download file. ') data = io.BytesIO(await resp.read()) await channel.send(file=discord.File(data, 'cool_image.png')) 

    How can I add a reaction to a message?¶

    If you want to use unicode emoji, you must pass a valid unicode code point in a string. In your code, you can write this in a few different ways:

    emoji = '\N ' # or '\U0001f44d' or '��' await message.add_reaction(emoji) 

    In case you want to use emoji that come from a message, you already get their code points in the content without needing to do anything special. You cannot send ‘:thumbsup:’ style shorthands.

    For custom emoji, you should pass an instance of Emoji . You can also pass a » string, but if you can use said emoji, you should be able to use Client.get_emoji() to get an emoji via ID or use utils.find() / utils.get() on Client.emojis or Guild.emojis collections.

    The name and ID of a custom emoji can be found with the client by prefixing :custom_emoji: with a backslash. For example, sending the message \:python3: with the client will result in .

    # if you have the ID already emoji = client.get_emoji(310177266011340803) await message.add_reaction(emoji) # no ID, do a lookup emoji = discord.utils.get(guild.emojis, name='LUL') if emoji: await message.add_reaction(emoji) # if you have the name and ID of a custom emoji: emoji = '' await message.add_reaction(emoji) 

    How do I pass a coroutine to the player’s “after” function?¶

    The library’s music player launches on a separate thread, ergo it does not execute inside a coroutine. This does not mean that it is not possible to call a coroutine in the after parameter. To do so you must pass a callable that wraps up a couple of aspects.

    The first gotcha that you must be aware of is that calling a coroutine is not a thread-safe operation. Since we are technically in another thread, we must take caution in calling thread-safe operations so things do not bug out. Luckily for us, asyncio comes with a asyncio.run_coroutine_threadsafe() function that allows us to call a coroutine from another thread.

    However, this function returns a Future and to actually call it we have to fetch its result. Putting all of this together we can do the following:

    def my_after(error): coro = some_channel.send('Song is done!') fut = asyncio.run_coroutine_threadsafe(coro, client.loop) try: fut.result() except: # an error happened sending the message pass voice.play(discord.FFmpegPCMAudio(url), after=my_after) 

    How do I run something in the background?¶

    How do I get a specific model?¶

    There are multiple ways of doing this. If you have a specific model’s ID then you can use one of the following functions:

    • Client.get_channel()
    • Client.get_guild()
    • Client.get_user()
    • Client.get_emoji()
    • Guild.get_member()
    • Guild.get_channel()
    • Guild.get_role()

    The following use an HTTP request:

    • abc.Messageable.fetch_message()
    • Client.fetch_user()
    • Client.fetch_guilds()
    • Client.fetch_guild()
    • Guild.fetch_emoji()
    • Guild.fetch_emojis()
    • Guild.fetch_member()

    If the functions above do not help you, then use of utils.find() or utils.get() would serve some use in finding specific models.

    # find a guild by name guild = discord.utils.get(client.guilds, name='My Server') # make sure to check if it's found if guild is not None: # find a channel by name channel = discord.utils.get(guild.text_channels, name='cool-channel') 

    How do I make a web request?¶

    To make a request, you should use a non-blocking library. This library already uses and requires a 3rd party library for making requests, aiohttp .

    async with aiohttp.ClientSession() as session: async with session.get('http://aws.random.cat/meow') as r: if r.status == 200: js = await r.json() 

    How do I use a local image file for an embed image?¶

    Discord special-cases uploading an image attachment and using it within an embed so that it will not display separately, but instead in the embed’s thumbnail, image, footer or author icon.

    To do so, upload the image normally with abc.Messageable.send() , and set the embed’s image URL to attachment://image.png , where image.png is the filename of the image you will send.

    file = discord.File("path/to/my/image.png", filename="image.png") embed = discord.Embed() embed.set_image(url="attachment://image.png") await channel.send(file=file, embed=embed) 

    Is there an event for audit log entries being created?¶

    This event is now available in the library and Discord as of version 2.2. It can be found under on_audit_log_entry_create() .

    Commands Extension¶

    Questions regarding discord.ext.commands belong here.

    Why does on_message make my commands stop working?¶

    Overriding the default provided on_message forbids any extra commands from running. To fix this, add a bot.process_commands(message) line at the end of your on_message . For example:

    @bot.event async def on_message(message): # do some extra stuff here await bot.process_commands(message) 

    Alternatively, you can place your on_message logic into a listener. In this setup, you should not manually call bot.process_commands() . This also allows you to do multiple things asynchronously in response to a message. Example:

    @bot.listen('on_message') async def whatever_you_want_to_call_it(message): # do stuff here # do not process commands here 

    Why do my arguments require quotes?¶

    In a simple command defined as:

    @bot.command() async def echo(ctx, message: str): await ctx.send(message) 

    Calling it via ?echo a b c will only fetch the first argument and disregard the rest. To fix this you should either call it via ?echo «a b c» or change the signature to have “consume rest” behaviour. Example:

    @bot.command() async def echo(ctx, *, message: str): await ctx.send(message) 

    This will allow you to use ?echo a b c without needing the quotes.

    How do I get the original message ?¶

    The Context contains an attribute, message to get the original message.

    @bot.command() async def length(ctx): await ctx.send(f'Your message is len(ctx.message.content)> characters long.') 

    How do I make a subcommand?¶

    Use the group() decorator. This will transform the callback into a Group which will allow you to add commands into the group operating as “subcommands”. These groups can be arbitrarily nested as well.

    @bot.group() async def git(ctx): if ctx.invoked_subcommand is None: await ctx.send('Invalid git command passed. ') @git.command() async def push(ctx, remote: str, branch: str): await ctx.send(f'Pushing to remote> branch>') 

    This could then be used as ?git push origin master .

    Views and Modals¶

    Questions regarding discord.ui.View , discord.ui.Modal , and their components such as buttons, select menus, etc.

    How can I disable all items on timeout?¶

    This requires three steps.

    1. Attach a message to the View using either the return type of send() or retrieving it via Interaction.original_response() .
    2. Inside on_timeout() , loop over all items inside the view and mark them disabled.
    3. Edit the message we retrieved in step 1 with the newly modified view.

    Putting it all together, we can do this in a text command:

    class MyView(discord.ui.View): async def on_timeout(self) -> None: # Step 2 for item in self.children: item.disabled = True # Step 3 await self.message.edit(view=self) @discord.ui.button(label='Example') async def example_button(self, interaction: discord.Interaction, button: discord.ui.Button): await interaction.response.send_message('Hello!', ephemeral=True) @bot.command() async def timeout_example(ctx): """An example to showcase disabling buttons on timing out""" view = MyView() # Step 1 view.message = await ctx.send('Press me!', view=view) 

    Application commands do not return a message when you respond with InteractionResponse.send_message() , therefore in order to reliably do this we should retrieve the message using Interaction.original_response() .

    Putting it all together, using the previous view definition:

    @tree.command() async def more_timeout_example(interaction): """Another example to showcase disabling buttons on timing out""" view = MyView() await interaction.response.send_message('Press me!', view=view) # Step 1 view.message = await interaction.original_response() 

    Application Commands¶

    Questions regarding Discord’s new application commands, commonly known as “slash commands” or “context menu commands”.

    My bot’s commands are not showing up!¶

    1. Did you sync() your command? Commands need to be synced before they will appear.
    2. Did you invite your bot with the correct permissions? Bots need to be invited with the applications.commands scope in addition to the bot scope. For example, invite the bot with the following URL: https://discord.com/oauth2/authorize?client_id=&scope=applications.commands+bot . Alternatively, if you use utils.oauth_url() , you can call the function as such: oauth_url(, scopes=(«bot», «applications.commands»)) .

    Бот для Discord API на Python (discord.py) с командами

    Бот для Discord API на Python (discord.py) с командами

    Сегодня разберём создание бота для популярной соцсети Discord. Эта платформа предназначена для общения посредством голосовых чатов и сообщений и чем-то схожа с телеграмом.

    Недавно я столкнулся с задачей написания подобного бота. Поскольку на просторах интернета, нет внятных гайдов, решил сделать свой. Про официальную документацию можно не говорить, там чёрт ногу сломит. В YouTube охватывают лишь самое начало. Я постараюсь более детально погрузиться в discord.py и работу с Discord API.

    Структура проекта и установка библиотек

    1. Компьютер или ноутбук
    2. Редактор кода (Notepad++ тоже подойдет).
    3. Python версии 3.9 и выше.
    4. Соединение с интернетом

    Установка для Windows:

    pip install discord.py

    Установка для MacOS:

    pip3 install discord.py
    +---discord | +---cogs | | +---everyone.py | | +---logs.py | | \---moder.py | +---config.py | \---main.py

    Структура максимально простая, все модули для обработки команд будут храниться в директории cogs. Остальное можно структурировать как угодно.

    Создание бота и получение токена

    Заходим на этот сайт https://discord.com/developers/docs/intro и нажимаем на «applications». После проходим авторизацию (видео инструкция тут ).

    Создаем новое приложение:

    Дальше переходим во вкладку Bot и создаем бота. Тут вы сможет создать и скопировать токен:

    После всех манипуляций выбираем уровень доступа для бота — administrator.

    Как добавить бота на сервер

    Переходим во вкладку OAuth2 General, ставим такие настройки и сохраняем:

    Потом переходим в URL General, выбираем те же самые настройки и копируем ссылку ниже:

    Переходим по ссылке и выбираем на какой сервер хотим добавить бота. Добавлять можно только на тот сервер, который вы администрируете (у вас есть права администратора на нем). Дальше следуем иструкциям Discord.

    Разработка бота

    Main.py

    import asyncio import os import discord from discord.ext import commands import config

    Подробнее остановимся на commands и config .

    В commands будет инициализироваться и храниться бот. В дальнейшем через этот объект класса будем обращаться к методам.

    Анонсы всех видео, статей и полезностей — в нашем Telegram-канале ��
    Присоединяйтесь, обсуждайте и автоматизируйте!

    Config – там будут храниться все глобальные переменные — токены, ID каналов, ID ролей и т д.

    discord_intents = discord.Intents.all() discord_intents.members = True

    discord_intents – мы наделяем бота полными правами доступа (когда будем добавлять его, то он запросит разрешение для управления)

    bot – тут собирается бот. Аргументы: command_prefix — на какой спец символ будет откликаться бот; intents — права доступа.

    discord_intents = discord.Intents.all() discord_intents.members = True bot = commands.Bot(command_prefix=config.prefix, intents=discord_intents) bot.remove_command("help") @bot.event @commands.has_any_role(*config.admin_id_role) async def on_ready(): await bot.change_presence(status=discord.Status.idle, activity=discord.Game(config.prefix+"info")) await bot.wait_until_ready() @bot.command() @commands.has_any_role(*config.admin_id_role) async def load(ctx, extension): bot.load_extension(f"cogs.") print(f"load module: cogs.") @bot.command() @commands.has_any_role(*config.admin_id_role) async def unload(ctx, extension): bot.unload_extension(f"cogs.") print(f"unload module: cogs.") @bot.command() @commands.has_any_role(*config.admin_id_role) async def reload(ctx, extension): bot.unload_extension(f"cogs.") bot.load_extension(f"cogs.") print(f"reload module: cogs.") async def load_extensions(): for filename in os.listdir("./cogs"): if filename.endswith(".py"): await bot.load_extension(f"cogs.") async def main(): print('zit goot') await load_extensions() await bot.start(config.token) if __name__ == "__main__": # bot.run(config.token) asyncio.run(main())

    Пробежимся по функциям.

    On_ready – срабатывает при загрузке бота. bot.change_presence — тут мы устанавливаем активность (Discord может показывать во что вы сейчас играете).

    Дальше подгружаются все винтики. Почему пакеты в Discord называют винтики? Потому что в официальной документации разработчики назвали именно так;)

    Load и unload — позволяют отключить и подключить винтики. Загрузка происходит с помощью обращения к методам объекта бота.

    Reload — по сути вызывает по очереди unload и load.

    Цикл for перебирает все файлы и загружает их в первый раз.

    Ну и в конце мы запускаем бота, передавая в него токен.

    Config.py

    token = '12345' prefix = '!' recurring_guild_id = 1234 admin_id_role = '938435735701311538' id_mute_role = '938437343751319613' id_user_role = '938437452920672327'

    Этот файл будет хранить в себе только служебные переменные — токены, ID ролей, ID серверов.

    Директория cogs

    Everyone.py

    import discord import time import config from discord.ext import commands class Everyone(commands.Cog): def __init__(self, bot): self.bot = bot @commands.Cog.listener() async def on_ready(self): print('everyone is ready') @commands.command() async def info(self, ctx): embed = discord.Embed(title=f">> Команды ", icon_url=f"") embed.add_field(name=f"***mute*** --- отключить возможность говорить и писать человеку", value=f"Пример: mute @1234", inline=False) embed.add_field(name=f"***unmute*** --- вернуть все возможности человку", value=f"Пример: unmute @1234", inline=False) embed.add_field(name=f"***ban*** --- добавить человека в черный список и выгнать", value=f"Пример: ban @1234", inline=False) embed.add_field(name=f"***unban*** --- убрать человека из чероного списка", value=f"Пример: unban @1234", inline=False) embed.add_field(name=f"***kick*** --- выгрнать человека", value=f"Пример: kick @1234", inline=False) embed.add_field(name=f"***clear*** --- удалить последние сообщения", value=f"Пример: clear 40", inline=False) embed.set_footer(text=f"BOT • ") await ctx.channel.purge(limit=1) await ctx.send(embed=embed) async def setup(bot): await bot.add_cog(Everyone(bot))

    В этом файле будут храниться все команды доступные обычному пользователю. Импорты отдельно разбирать не буду, там и так все понятно.

    Вероятно, вы спросите что это за класс. Everyone наследуется от commands.Cog . Винтики работают за счёт объектов — когда мы запускаем бота, то перебираем все объекты и собираем всё вместе.

    Для отслеживания команд мы используем декоратор commands.command() . Для корректной работы при создании класса мы передаём в него нашего бота. Дальше описываем в методах логику.

    Функция info будет высылать пользователю embed (сообщение) с указанием доступных команд. Внутрь функции передаем ctx (полное его название context) — это полученное сообщение.

    Мы создаем объект, в который передаем: заголовок, свет линии с краю, подпись автора и ссылку на изображение. Дальше, обращаясь к методу add_field , добавляем строки с именем и значением — можно их назвать заголовок и текст.

    Метод set_footer добавляет маленькую подпись в конце сообщения. В завершение мы обращаемся к await ctx.channel.purge(limit=1) , что удаляет одно сообщение (можно указать любое количество в limit). Await позволяет нам дождаться окончания асинхронного метода.

    После этого отправляем сообщение с помощью await ctx.send(embed=embed) , передавая внутрь сформированное сообщение. Или можно просто отправить текст await ctx.send(text=”your message”) .

    Эта конструкция нужна библиотеке, что бы она могла увидеть и загрузить винтик:

    async def setup(bot): await bot.add_cog(Everyone(bot))

    Удобный конструктор embed, который сразу выдает python код, находится тут .

    Moder.py

    import discord import time from discord.ext import commands import config class Moder(commands.Cog): def __init__(self, bot): self.bot = bot @commands.Cog.listener() async def on_ready(self): print('moder is ready') @commands.command() @commands.has_any_role(config.admin_id_role) async def mute(self, ctx, user: discord.Member, reason=None): channel = self.bot.get_channel(config.log_mes_channel_id) guild = self.bot.get_guild(config.recurring_guild_id) role = guild.get_role(config.id_mute_role) embed = discord.Embed(title=f"Пользователя заглушили", color=0xfac400) embed.set_author(name=f"", icon_url=f"") embed.add_field(name="Причина:", value=f"", inline=True) embed.set_footer(text=f"BOT • ") await user.add_roles(role) await channel.send(embed=embed) await ctx.channel.purge(limit=1) await ctx.send(embed=embed, delete_after=30) @commands.command() @commands.has_any_role(config.admin_id_role) async def unmute(self, ctx, user: discord.Member): channel = self.bot.get_channel(config.log_mes_channel_id) guild = self.bot.get_guild(config.recurring_guild_id) role = guild.get_role(config.id_mute_role) embed = discord.Embed(title=f"Пользователя разглушили", color=0xfac400) embed.set_author(name=f"", icon_url=f"") embed.set_footer(text=f"BOT • ") await user.remove_roles(role) await channel.send(embed=embed) await ctx.channel.purge(limit=1) await ctx.send(embed=embed, delete_after=30) @commands.command() @commands.has_any_role(config.admin_id_role) async def ban(self, ctx, user: discord.Member, *, reason=None): channel = self.bot.get_channel(config.log_mes_channel_id) embed = discord.Embed(title=f"Пользователя забанили", color=0xfac400) embed.set_author(name=f"", icon_url=f"") embed.add_field(name="Причина:", value=f"", inline=True) embed.set_footer(text=f"BOT • ") await channel.send(embed=embed) await user.ban(reason=reason) await ctx.channel.purge(limit=1) await ctx.send(embed=embed, delete_after=30) @commands.command() @commands.has_any_role(config.admin_id_role) async def unban(self, ctx, *, member): banned_users = await ctx.guild.bans() channel = self.bot.get_channel(config.log_mes_channel_id) member_name, member_discriminator = member.split("#") for ban_entry in banned_users: user = ban_entry.user if (user.name, user.discriminator) == (member_name, member_discriminator): await ctx.guild.unban(user) embed = discord.Embed(title=f"Пользователя разбанили", color=0xfac400) embed.set_author(name=f"", icon_url=f"") embed.set_footer(text=f"Silence. • ") await channel.send(embed=embed) await ctx.channel.purge(limit=1) await ctx.send(embed=embed, delete_after=30) return @commands.command() @commands.has_any_role(config.admin_id_role) async def kick(self, ctx, user: discord.Member, *, reason=""): channel = self.bot.get_channel(config.log_mes_channel_id) embed = discord.Embed(title=f"Пользователя выгнали из сервера", color=0xfac400) embed.set_author(name=f"", icon_url=f"") embed.add_field(name="Причина:", value=f"", inline=True) embed.set_footer(text=f"BOT • ") await channel.send(embed=embed) await ctx.channel.purge(limit=1) await ctx.send(embed=embed, delete_after=30) await user.kick() @commands.command() @commands.has_any_role(config.admin_id_role) async def clear(self, ctx, amount=20): channel = self.bot.get_channel(config.log_mes_channel_id) if amount < 200: embed = discord.Embed(title=f"Очистил чат \"\" на сообщений(ия)", color=0xfac400) embed.set_author(name=f"", icon_url=f"") embed.set_footer(text=f"BOT • ") await ctx.channel.purge(limit=int(amount)) await channel.send(embed=embed) await ctx.send(embed=discord.Embed(description=f":wheelchair: удалено сообщений(я)"), delete_after=30) else: await ctx.send(embed=discord.Embed(description=f":Вы не можете удалить больше 200 сообщений"), delete_after=30) async def setup(bot): await bot.add_cog(Moder(bot))

    Пройдёмся по функциям сверху вниз.

    @commands.has_any_role(config.admin_id_role) - это новый декоратор, он проверяет есть ли у пользователя роль (нужен ID роли). Также можно указывать перечень ролей в массиве (для этого распаковывайте массив).

    Mute принимает в себя само сообщение, пользователя (пример @user), и причину. Первым делом мы заготавливаем объект чата, в который будем присылать действия администратора. Потом сам сервер (в документации discord.py сервер называется гильдия). И в конце получаем роль, которую будем давать пользователю.

    Когда всё готово, собираем сообщение-уведомление (не забывайте пользоваться конструктором embed тут ). Дальше к объекту пользователя добавляем роль. И отправляем сообщение в логи и в чат, откуда пришла команда. Не забываем удалять отправленную команду.

    Unmute зеркальна с функций mute, только для пользователя мы используем метод remove role .

    Ban - выгоняет пользователя с сервера и добавляет его в черный список (в дальнейшем его не смогут пригласить на сервер пока он в ЧС).

    Для работы в переменных нам потребуется только канал для системы логов. Следом проходим процедуру сборки красивого сообщения и отправляем его как в mute.

    Unban - не просто зеркальная функция, потому что тут нам потребуется обращаться к списку ЧС. banned_users делает запрос к ЧС сервера. Дальше мы делаем полный перебор всех заблокированных и сравниваем с нашим пользователем. Как только находим его, убираем юзера из списка и выводим сообщение о разблокировке.

    Kick - с этой функций дела обстоят намного проще, так как у пользователя есть метод для изгнания user.kick .

    Clear - последняя возможность для администрирования. В нее поступает не только сообщение, но и количество сообщений, которое нужно удалить. Дальше идет защита от опечатки.

    ctx.channel.purge(limit=int(amount)) отвечает за удаление сообщений, в limit передаем полученное значение.

    Заключение

    Библиотека discord.py не проста в понимании и требует много времени на разбор. Но лучших аналогов для Python не найти из-за обширности API.

    Если захотите разобраться глубже, самостоятельно изучайте новые методы и классы. Производите глубокий анализ, что откуда исходит (какой вы получаете объект в ответе и как его можно получить еще).

    Для дальнейшего развития советую попытаться добавить в бота интеграцию с базой данных. Например есть хорошая БД MongoDB - на ней можно простроить мощную многоуровневую систему администрирования сервера.

    Как получить идентификатор пользователя в Discord.py?

    Мы создаем бота для нашего сервера Discord, который должен упоминать человека, запускающего определенную команду. Для этого мне понадобится идентификатор пользователя, но я не могу понять, как его получить.

    @bot.command() async def name(): author = discord.User.id await bot.say(str(author)) 

    Мы попробовали это таким образом, так как в документации сказано, что идентификатор пользователя находится в классе User. Но единственное, что мы получаем, это

    На наших глазах мы получили правильный параметр, но не можем получить сам идентификатор? Нам нужно как-то его преобразовать?

    Поделиться Источник 29 октября 2018 в 19:51

    2 ответа

    Чтобы заставить бота упомянуть автора сообщения в асинхронной ветке, вам нужно обратиться к этому автору через сообщение, которое вызвало команду, ctx.message :

    @bot.command(pass_context=True) async def name(ctx): await bot.say("<> is your name".format(ctx.message.author.mention)) 

    Чтобы получить их идентификатор:

    @bot.command(pass_context=True) async def myid(ctx): await bot.say("<> is your id".format(ctx.message.author.id)) 

    Поделиться 29 октября 2018 в 20:17

    Вам необходимо указать параметр в имени функции. Каждая команда bot.command должна иметь хотя бы один параметр, известный как "контекст". Например:

    async def name(ctx): author = ctx.message.author user_name = author.name 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *