Discord.py modifier une permission

Résolu
MathKode Messages postés 28 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
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
By MathKode

1 réponse

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        ou
        ls={"speak": False,"ban_members": True}
        p2=discord.Permissions(**ls)
        1
      2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        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