Je fais un classement pour le système de mise à niveau mon bot de discordance. La liste fera une liste des personnes avec la plupart des XP et les commandera de la plus haute à la quantité la plus faible. J'ai déjà atteint cet objectif, mais je ne peux que montrer à l'adresse d'utilisateur à côté de leur montant XP dans le classement. Comment puis-je éteindre cet identifiant d'utilisateur dans un nom d'utilisateur?
foreach (ulong n in DbContext.Experiences.OrderByDescending(x => x.XP).Select(x => x.ID)) { Context.Guild.GetUser(n).ToString() } var leaderboard = string.Concat(DbContext.Experiences.OrderByDescending(x => x.XP).Select(x => $"Level {x.LevelNumber} with {x.XP} xp {//username must be here}\n")); await ReplyAsync(leaderboard.ToString());
3 Réponses :
supposer que vous avez déjà l'ID utilisateur souhaité P>
Si votre classement est global (où l'utilisateur peut ne pas être sur le serveur dans lequel la commande est exécutée) (ou vous accédez également à la propriété contexte.Guild.Gettuser (the_user_id_here) .Aname code>
Cela renvoie le nom d'utilisateur de l'utilisateur s'il existe. P>
Vous pouvez utiliser client.geturer (the_user_id_here) .Asername code> plutôt que < Code> Client Code> est le client de socket actuel de votre BOT. P>
surnom code> si vous souhaitez afficher le nom de l'utilisateur attaché au serveur à la place) p>
J'ai déjà essayé cela avant et ça marche pour un utilisateur. Mais je veux que cela reçoive le nom d'utilisateur de tout le monde, avec seulement avoir son identifiant comme référence.
@Vacefron boucle ensuite dans la liste de leurs identifiants, puis récupérez leurs noms d'utilisateur avec la méthode spécifiée (en passant dans une liste pour vous permettre de faire ce que vous voulez avec cela, ou de l'ajouter au StringBuilder si vous envisagez d'imprimer tous. le nom de l'utilisateur).
Ce que je voudrais voir voir (jamais regardé la discorde si c'est là que la structure de la base de données vient de) serait une table pour:
Je m'attendrais à ce que dbcontext.utilisateur ait quelque chose comme: p> et ensuite une table de guildes pour avoir quelque chose comme: P> var leaders = from g in context.Guilds
join u in context.Users on g.UserId = u.UserId
join e in context.Experience on u.UserId = e.UserId
select new LeaderView
{
UserName = u.UserName,
UserId = u.UserId,
GuildId = g.UserId,
Experience = e.Experience
};
leaders = leaders.OrderByDescending(o => o.Experience);
return leaders.ToList();
Corrigez-moi si je me trompe, mais je pense que vous supposez que j'ai les noms d'utilisateur stockés dans la base de données, ce que je n'ai pas. Je sais déjà comment obtenir l'ID utilisateur de tout le monde, mais je cherche à transformer ces identifiants utilisateur dans les noms d'utilisateur. Je peux cependant sélectionner la première personne sur la liste et obtenir son nom d'utilisateur avec ceci: context.guild.getuser (insertion_id) code> Mais je cherche à le faire pour tout le monde sur la liste et utilisez le entraîner un message.
Je suis. Et est-ce que le contexte n'est pas un contexte de base de données? J'ai fait une tonne d'hypothèses ne connaissant pas la discorde
Ouais, dbcontext est un contexte de base de données. Cependant, je n'ai pas les noms d'utilisateur stockés dans la base de données (sinon ce serait très simple haha).
Voir les commentaires dans le code: Votre code modifié doit ressembler à quelque chose comme: p> Remarque: j'ai remplacé string.concat code> avec
string.join code> car il s'agit d'une méthode de construction de chaînes plus efficace. p> p>