Как установить лимит для использования команды одним пользователем discord.py

Я хочу чтобы бот создавал приватный текстовый канал (канал видит только его создатель). Я уже сделал чтобы бот при прописывании команды создавал приватный канал, но эту команду можно использовать бесконечно. Я хочу чтобы это можно было сделать только 1 раз. Я предполагаю что это надо работать с файлами(записывать в файл и читать), но я новичок и не могу, посмотрел в интернете: не чего не понял.

from discord.ext import commands
bot = commands.Bot(command_prefix='.')
bot.remove_command( 'help' ) #удаление стандартной команды
token = 'Мой токен'


@bot.command()
async def приват(ctx):
    #Выдача прав на канал
    overwrites = {
        ctx.guild.default_role: discord.PermissionOverwrite(read_messages=False),
        ctx.author: discord.PermissionOverwrite(read_messages=True)
    } 
    userName = ctx.author
    nameChannelbefore = "?╎"
    after = str(nameChannelbefore) + str(userName) #переменная с именем канала (?╎ник)
    await ctx.guild.create_text_channel(after, overwrites=overwrites) #создание канала


@bot.event
async def on_ready():
    print('Bot started...')
bot.run(token)

Спасибо


Ответы (1 шт):

Автор решения: denisnumb

Могу предложить такой алгоритм работы:

  1. При использовании команды, пользователь записывается в массив, а его id - в текстовый файл

  2. При запуске бота, считываем id пользователей из файла и добавляем в тот же массив

Поскольку вторым пунктом будет заниматься бот, алгоритм нужно поместить в функцию on_ready(), когда бот уже будет готов к получению пользователей.

В итоге, получаем что-то такое:

import os
import discord
from discord.ext import commands

TOKEN = 'token'

# массив пользователей, использовавших команду
used_users = []

@bot.event
async def on_ready():
    # проверяем, существует ли текстовый файл, хранящий id. Если нет - создаем.
    if not os.path.exists('used_users.txt'):
        with open('used_users.txt', 'w') as file:
            file.close()
    
    # открываем файл в режиме чтения и считываем все строки в список
    with open('used_users.txt', 'r') as file:
        ids = file.readlines()
        for i in range(0, len(ids)):
            # в цикле от нуля до количества пользователей считываем их id и добавляем в массив
            used_users.append(await bot.fetch_user(int(ids[i])))

# сюда подставьте свою команду
@bot.command()
async def my_command(ctx):
    # получаем автора сообщения
    author = ctx.message.author

    # если автора нет в списке, то выполняем команду и заносим в список
    if author not in used_users:

        await ctx.send('Команда выполнена! Использования осталось: 0')
        used_users.append(author)
        with open('used_users.txt', 'a') as file:
            file.write(f'{author.id}\n')
            
    else:
        await ctx.send('Вы **НЕ** имеете право на выполнение данной команды')


bot.run(TOKEN)
→ Ссылка