Дискорд бот - раздача ролей после получения секретного кода - PullRequest
0 голосов
/ 31 октября 2019

Есть ли способ, как этот бот будет добавлять роль пользователю, когда он отправляет код на определенный канал или в DM'а бота?

Например:! Redeem xxx-xxxx-xxx И тогда бот предоставит ему роль клиента

Также возможно ли защитить с помощью одного и того же кода более одного раза?

1 Ответ

0 голосов
/ 02 ноября 2019

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

Полный код:

import discord
from discord.ext import commands

import string
import random

client = commands.Bot(command_prefix='!')


@client.command(pass_context=True)
async def redeem(ctx, code='xxx-xxxx-xxx'):
    # opens the file that holds the key
    with open('key_codes', 'r') as key_codes:
        # the first line in the file holds the key and only the key
        key = key_codes.readline()

    # if the code given and the actual key are equal then give the user the customer role and generate a new key
    if code == key:
        await ctx.author.add_roles(discord.utils.get(ctx.guild.roles, name='Customer'))
        # all letters (upper and lower) and digits to build the new code from
        chars = string.ascii_letters + string.digits
        # creates the key string
        key = (''.join(random.choice(chars) for i in range(3)) + '-' + ''.join(random.choice(chars) for i in range(4)) + '-' + ''.join(random.choice(chars) for i in range(3)))
        # opens the file and writes the new code to it, opening a file in mode 'w' overrites the file rather than appending (old key is lost)
        with open('key_codes', 'w') as key_codes:
            key_codes.write(key)
    # if the code given does not match the key we send the channel a message
    else:
        await ctx.channel.send("This code is not valid!")


client.run(os.environ['DISCORD_TOKEN'])

Этот код работает в канале гильдии, если вы хотите прочитатьподробнее об отправке команд через DM этот ответ может вам помочь.

...