首页 > 解决方案 > 如何使此命令适用于所有用户

问题描述

伙计们,我的命令仅适用于我的机器人,有人可以帮助我吗?
更好地解释:
*fake @mybot blabla (works)
*fake @SrWonka blabla (dotn work)

代码:
Soucebin:https ://sourceb.in/rkhH6YdTCx

import discord
import re
from discord.ext import commands


class fake(commands.Cog):

    def _init_(self, client):
        self.client = client

    @commands.command()
    async def fake(self, ctx, userid: str, *, message):
        await ctx.message.delete()
        userid = re.sub('[^0-9]', '', userid)
        webhooks = await ctx.message.channel.webhooks()
        noneWH = True
        server = ctx.message.guild
        for member in server.members:
            if member.id == int(userid):
                user = member
        for webhook in webhooks:
            if(webhook.name == "boteco"):
                if user.nick == None:
                    await webhook.send(content=message, username=user.name ,avatar_url=user.avatar_url)
                else:
                    await webhook.send(content=message, username=user.nick ,avatar_url=user.avatar_url)
                noneWH = False
        if noneWH:
            webhook = await ctx.message.channel.create_webhook(name="boteco")
            if user.nick == None:
                await webhook.send(content=message, username=user.name ,avatar_url=user.avatar_url)
            else:
                await webhook.send(content=message, username=user.nick ,avatar_url=user.avatar_url)

def setup(client):
    client.add_cog(fake(client))

标签: pythondiscord.py

解决方案


做出改变:

  • 您获取用户的方式不是我使用的最佳方式,Typing.union您可以查看下面的文档。

  • display_name如果没有,它将显示昵称,如果没有,它将显示用户名。

  • discord.utils.get获取 webhook 而不是循环

这是编辑的代码:

class fake(commands.Cog):

    def _init_(self, client):
        self.client = client

    @commands.command()
    async def fake(self, ctx, user: typing.Union[discord.Member, discord.User], *, message):
        # await ctx.message.delete()
        webhooks = await ctx.message.channel.webhooks()

        # get the webhook if it is there
        webhook = discord.utils.get(webhooks, name="boteco")
        if webhook:
            await webhook.send(content=message, username=user.display_name, avatar_url=user.avatar_url)
        else:
            webhook = await ctx.message.channel.create_webhook(name="boteco")
            await webhook.send(content=message, username=user.display_name ,avatar_url=user.avatar_url)

首先是为另一个用户。

其次是机器人本身。

在此处输入图像描述

文件:

typing.union

Typing.Union 是一种特殊的类型提示,它允许命令采用任何特定类型而不是单数类型。

Member.display_name

返回用户的显示名称。对于普通用户,这只是他们的用户名,但如果他们有公会特定的昵称,则返回该昵称。

discord.utils.get

一个帮助器,它返回满足在 attrs 中传递的所有特征的迭代中的第一个元素。这是一个替代方案find().


推荐阅读