1
votes

Discord.py - Marquer un utilisateur aléatoire

J'ai récemment commencé à travailler avec Discord.py. Ma question est la suivante: comment puis-je marquer un utilisateur aléatoire, par exemple si vous écrivez! Tag dans le chat? Je n'ai pas encore trouvé de réponse.

 if message.content.startswith('+best'):
        userid = '<@ # A RANDOM ID #>'
        yield from client.send_message(message.channel, ' : %s is the best ' % userid)

Merci


0 commentaires

4 Réponses :


2
votes

Voici comment je procéderais:

  1. Générez une liste d'utilisateurs sur votre serveur
  2. Utilisez random.choice pour sélectionner un utilisateur aléatoire dans la liste
  3. Mentionnez cet utilisateur utilisant l'API (ou si vous le souhaitez, faites-le manuellement) avec votre message

Voici l'implémentation:

from random import choice

if message.content.startswith('+best'):
    user = choice(message.channel.guild.members)
    yield from client.send_message(message.channel, ' : %s is the best ' % user.mention)


2 commentaires

Vous mélangez une partie de la syntaxe des branches async et réécrivez ici. Sur la version 0.16, guild devrait être server , et sur 1.0.0, client.send_message (message.channel, ... devrait être < code> message.channel.send (...


Ignorer l'exception dans on_message Traceback (dernier appel le plus récent): Fichier "D: \ Development \ Projects \ mymanager.py \ venv \ lib \ site-packages‌ \ discord \ client.py", ligne 307, dans _run_event yield from getattr ( self, event) (* args, ** kwargs) Fichier "D: /Development/Projects/mymanager.py/main.py", ligne 62, dans on_message user = choice (message.channel.server.members) Fichier "C : \ Users \ HP \ AppData \ Local \ Programs \ Python \ Python35-32 \ lib \ r‌ andom.py ", ligne 265, au choix retourne seq [i] TypeError: l'objet 'dict_values' ne prend pas en charge l'indexation



1
votes

En élaborant sur la réponse de aeshthetic, vous pouvez faire quelque chose comme ceci:

import random

if message.content.startswith('+best'):
    channel = message.channel
    randomMember = random.choice(channel.guild.members)
    await channel.send(f'{randomMember.mention} is the best')

Veuillez noter que le code est dans la version de réécriture de discord.py et non dans la version asynchrone - si vous êtes en utilisant la version async, je vous recommande de migrer pour réécrire car la prise en charge de la version async de discord.py a cessé. Pour en savoir plus, reportez-vous à la documentation sur la migration qui se trouve ici . p>

Faites-moi savoir si vous avez besoin d'aide - bon codage!


0 commentaires

0
votes

Tout d'abord, je vous suggère d'installer discord.py-rewrite , car il est plus avancé.

Ensuite, je vous suggère de créer des commandes de bot en utilisant le décorateur @ client.command () , comme ceci:

XXX

Maintenant que vous avez fait les deux choses, il y a plusieurs façons de le faire. Par exemple, si vous ne voulez pas que le bot mentionne l'invocateur de commande ou d'autres bots, vous pouvez écrire:

from random import choice
from discord.ext import commands

@client.command()
@commands.guild_only()
async def tag(ctx):
    await ctx.send(choice(tuple(member.mention for member in ctx.guild.members)))

Si vous ne voulez pas que le bot mentionne d'autres bots, mais il peut mentionner l'invocateur de la commande, utilisez:

from random import choice
from discord.ext import commands

@client.command()
@commands.guild_only()
async def tag(ctx):
    await ctx.send(choice(tuple(member.mention for member in ctx.guild.members if not member.bot)))

Si vous voulez que le bot mentionne un membre de la guilde, humain ou bot, utilisez:

from random import choice
from discord.ext import commands

@client.command()
@commands.guild_only()
async def tag(ctx):
    try:
        await ctx.send(choice(tuple(member.mention for member in ctx.guild.members if not member.bot and member!=ctx.author)))
    except IndexError:
        await ctx.send("You are the only human member on it!")


0 commentaires

0
votes

J'ai joué un peu et j'ai réussi à faire fonctionner cela, vous pouvez l'essayer.

@client.command(pass_context=True)
async def hug(ctx):
    user = choice(ctx.message.channel.guild.members)
    await ctx.send(f'{ctx.message.author.mention} hugged {user.mention}')


0 commentaires