Discord.py Система разрешений - PullRequest
0 голосов
/ 23 апреля 2020

Я создаю публичного бота c в discord.py и хочу проверить, являюсь ли я администратором или нет через базу данных sqlite3. Он возвращает ошибку, показанную ниже:

Traceback (most recent call last):
  File "C:\Users\me\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\core.py", line 83, in wrapped
    ret = await coro(*args, **kwargs)
  File "C:/Users/me/OneDrive/Programming/WUYEK/bot.py", line 143, in permission
    isadmin = conn.cursor().execute('''SELECT rp.GuildID, rp.Permission
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\me\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\bot.py", line 892, in invoke
    await ctx.command.invoke(ctx)
  File "C:\Users\me\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\core.py", line 797, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "C:\Users\me\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\core.py", line 92, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: InterfaceError: Error binding parameter 0 - probably unsupported type.

Вот часть моего кода:

    admin = 0
    while admin == 0:
        for y in ctx.message.author.roles:
            print(y)
            isadmin = conn.cursor().execute('''SELECT rp.GuildID, rp.Permission
            FROM rolePermissions AS rp
            WHERE rp.roleID = ? AND rp.GuildID = ? AND rp.Permission = "Admin"''', (y, ctx.message.guild.id))
            print(str(isadmin.fetchall()))
            if str(isadmin.fetchone()) != "None":
                admin = 1
            else:
                admin = 0

    if admin == 1 or ctx.message.author.has_permisions(administrator=True):
        print("User Is Admin")
    else:
        await ctx.channel.send(embed=NoPerms)
        return

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Существует гораздо более простой способ сделать это.

discord.py имеет встроенную функцию @commands.hasrole(role).

import discord
from discord.ext import commands

role = 'rolenamegoeshere'

@bot.command(name='test', help='testing')
@commands.has_role(role)
async def test(ctx):
    #stuff goes here


Вам определенно не нужно использовать базу данных или что угодно, так как у discord.py есть простой способ сделать это!

0 голосов
/ 23 апреля 2020

Просто догадка: rolePermissions.roleID - это INTEGER PRIMARY KEY, а y - это строка. Sqlite использует динамическую c типизацию с одним исключением (из sqlite FAQ (3) ):

Столбцы типа INTEGER PRIMARY KEY могут содержать только 64-разрядное целое число со знаком. Ошибка приведет к тому, что вы попытаетесь поместить в столбец INTEGER PRIMARY KEY что-либо, кроме целого числа.

...