Discord.py modifier une permission

Résolu/Fermé
MathKode Messages postés 25 Date d'inscription mardi 25 février 2020 Statut Membre Dernière intervention 10 juin 2022 - Modifié le 4 mars 2022 à 15:51
mamiemando Messages postés 33367 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 novembre 2024 - 7 mars 2022 à 15:02
Bonjour à tous,

Je code un bot python et je suis confronté à un problème... J'ai cette liste de tuples (qui contient le nom de la permission et sa valeur) :
ls=[("speak", False),("ban_members", True)...]

... et je voudrais la transformer en objet
discord.Permission
...

Quelqu'un peut il m'aider ?
Merci beaucoup
A voir également:

1 réponse

mamiemando Messages postés 33367 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 novembre 2024 7 801
4 mars 2022 à 16:04
Bonjour,

D'après cette page, les permissions discord sont encodées à l'aide d'un masque, dont chaque bit correspond à une permission (1 si la permission est autorisée, 0 sinon). Par exemple :
  • CREATE_INSTANT_INVITE
    correspond au 1er bit de poids faible (
    1 << 0 == 1
    ).
  • KICK_MEMBERS
    correspond au 2e bit de poids faible (
    1 << 1 == 1
    ).
  • BAN_MEMBERS
    correspond au 3e bit de poids faible (
    1 << 2 == 2
    ).
  • ...


Donc ce que tu pourrais faire c'est définir dans ton programme python une variable par permission, puis faire le OU logique (avec
|
) des permissions à activer en fonction de ta liste.

MAP_PERMISSION_VALUE = {
    "create_instant_invite" : 1 << 0,
    "kick_members"          : 1 << 1, 
    "ban_members"           : 1 << 2, 
    # ...
    "speak"                 : 1 << 21,
}

def make_permission(tuples):
    ret = 0
    for (name, enabled) in tuples:
        value = MAP_PERMISSION_VALUE[name]
        if enabled:
            ret |= value
    return ret

print(
    make_permission([
        ("speak", False),
        ("ban_members", True)
    ])
)

print(
    make_permission([
        ("speak", True),
        ("ban_members", True)
    ])
)
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 551
4 mars 2022 à 17:34
Je pense qu'il y a moyen de faire plus simple, car les noms des permissions sont des noms d'arguments de mot clé:
import discord
p=["ban_members"]
d=dict.fromkeys(p, True)
permissions = discord.Permissions(**d)
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 551 > yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024
4 mars 2022 à 17:40
ou
ls={"speak": False,"ban_members": True}
p2=discord.Permissions(**ls)
1
mamiemando Messages postés 33367 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 novembre 2024 7 801 > yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024
Modifié le 7 mars 2022 à 15:03
Bonjour

Effectivement yg_be, d'après la documentation. Le code que tu proposes s'écrit plus naturellement :

import discord

permissions = discord.Permissions(ban_members=True, speak=True)


Toujours d'après la documentation, tu peux également passer par ses propriétés :

import discord

permissions = discord.Permissions()
permissions.ban_members = True
permissions.speak = True


Bonne chance
0