从用户中删除角色,然后将它们添加回 Discord.py(使用 Repl.it)

Posted

技术标签:

【中文标题】从用户中删除角色,然后将它们添加回 Discord.py(使用 Repl.it)【英文标题】:Removing roles from a user then adding them back in Discord.py (Using Repl.it) 【发布时间】:2021-08-05 05:36:21 【问题描述】:

我目前正在尝试在 python 中为我的不和谐机器人创建 2 个命令,一个静音和取消静音命令。该命令应该删除用户的所有角色,然后添加“静音”角色。在此之后,当我们使用 unmute 命令取消静音用户时,“静音”角色被删除,用户之前的角色被重新分配。我在 Repl.it 中对机器人进行编码,所以如果需要一个数据库,是否可以使用 repl.it 的内置数据库来执行此操作?非常感谢任何回答这个问题的人,我已经挣扎了几个小时。到目前为止,这是我所拥有的:

@commands.command()
@commands.has_permissions(manage_roles = True)
async def mute(self, ctx, member: discord.Member = None, *, reason = None):
  if member is None:
    embed = discord.Embed(title = "Please provide a user tag.", \
            colour = discord.Colour.from_rgb(255, 0, 0))
    await ctx.send(embed = embed)
    return

  everyone = ctx.guild.get_role(795989660920053770)
  role = discord.utils.get(ctx.guild.roles, name='Muted')
  roles = member.roles
  roles.remove(everyone)

  if "userRoles" not in db.keys():
    db["userRoles"] = roles
  else:
    userRoles = db["userRoles"]
    userRoles.append(roles)
    db["userRoles"] = userRoles

  await member.remove_roles(*roles)
  await member.add_roles(role)

  if reason is None:
    embed = discord.Embed(title = f"***Muted member***", \
            colour = discord.Colour.green())
    await ctx.send(embed = embed)
  else:
    embed = discord.Embed(title = f"***Muted member***", \
            description = f"Reason: reason", \
            colour = discord.Colour.green())
    await ctx.send(embed = embed)
  return

@mute.error
async def mute_error(self, ctx, error):
  if isinstance(error, MissingPermissions):
    embed = discord.Embed(title = "***You don't have the right permissions for that.***", \
            colour = discord.Colour.from_rgb(255, 0, 0))
    await ctx.send(embed = embed)
    return

@commands.command()
@commands.has_permissions(manage_roles = True)
async def unmute(self, ctx, member: discord.Member = None, *, reason = None):
  if member is None:
    embed = discord.Embed(title = "Please provide a user tag.", \
            colour = discord.Colour.from_rgb(255, 0, 0))
    await ctx.send(embed = embed)
    return

  userRoles = f"member.id_roles"
  
  await member.remove_roles("Muted")
  await member.add_roles(db[userRoles])

  if reason is None:
    embed = discord.Embed(title = f"***Unmuted member***", \
            colour = discord.Colour.green())
    await ctx.send(embed = embed)
  else:
    embed = discord.Embed(title = f"***Unmuted member***", \
            description = f"Reason: reason", \
            colour = discord.Colour.green())
    await ctx.send(embed = embed)
  return

@unmute.error
async def unmute_error(self, ctx, error):
  if isinstance(error, MissingPermissions):
    embed = discord.Embed(title = "***You don't have the right permissions for that.***", \
            colour = discord.Colour.from_rgb(255, 0, 0))
    await ctx.send(embed = embed)```

【问题讨论】:

因此,如果您已经战斗了几个小时,请向我们展示您的最佳尝试。我们不会为您编写所有代码。 我已经用我目前拥有的静音和取消静音代码编辑了我的问题。很抱歉没有事先包含它。 【参考方案1】:

如果您只是想进行一些成员角色更新,则不需要使用数据库,使用 repl.it 应该没问题。对于您的命令,您可以只使用成员对象的 add role 和 remove role 函数。您确实提到您只是为命令执行此操作,但是如果您确实需要等待 x 时间来取消静音成员,我强烈建议使用 asyncio 模块的 sleep function。

我知道您是 *** 的新手,因此请注意下次可能会包含有关您尝试过的内容的更多详细信息,因为它确实有助于更好地了解它是什么你正在尝试做。

【讨论】:

基本上没问题。我想要的是一个静音功能,它删除所有用户的角色,并将它们保存在某个地方,这样当用户取消静音时,他们将被分配回他们以前的所有角色。我以为我需要使用数据库来存储用户的角色,但如果不需要,那也可以。 我确实忘记提及的一件事是我遇到问题的主要原因是因为可能有多个人静音,所以我可能需要一个不同的变量来存储他们每个人的角色,所以当他们取消静音时,他们可以重新分配适当的角色。我对数据库还很陌生,所以这就是我求助于帮助的原因,我自己也弄不明白。 我了解您想要做什么,但我强烈建议您以不同的方式执行此操作。 Discord 的工作原理是,如果您拥有任何被拒绝发送消息权限的角色,您将无法发送消息。做到这一点的理想方法就是让静音的人扮演一个角色,拒绝访问发送消息。 StarbuckBarista 这是我想使用的原始方法,但问题是有些人的角色会覆盖静音角色。例如,一些自定义角色允许访问由于某种原因覆盖没有说话权限的静音角色的聊天。所以我认为解决这个问题的最佳方法是删除所有其他角色并分配静音角色。 那么您正在处理的问题是频道权限。这些权限仅适用于特定频道,并将覆盖任何预设权限。您需要做的就是进入这些频道并设置静音角色向 X 发送消息的权限。

以上是关于从用户中删除角色,然后将它们添加回 Discord.py(使用 Repl.it)的主要内容,如果未能解决你的问题,请参考以下文章

在 Discord.py 中添加/删除角色使用控制台输入重写

如何在discord bot上删除所有角色并添加一个角色,然后删除添加的角色并恢复以前的角色

检查用户是不是具有 x 角色之一,然后从他们中删除该角色

使用 Discord.js 检测到添加的特定角色时删除另一个角色

Discord.js - 删除所有包含角色的用户的命令

使用参数 Discord.JS 按名称将用户添加到角色