Discord 중간 역할

19425 단어 pythonrolesdiscordbot

서버 특정 역할 명령 만들기



프로모션 또는 강등을 제공하도록 봇을 설정하면 사용자가 서버 상태를 업데이트한 시기를 추적하려고 할 때 유용할 수 있습니다(틈새 Discords의 경우).

가장 먼저 필요한 것은 홍보할 수 있는 역할입니다. 역할의 ID는 변수로 설정되거나 이것이 표시되는 방식인 사전에 설정됩니다.

다음은 서버 ID입니다. 이것은 help 명령을 실행할 때 일을 깔끔하게 유지하기 위해 봇이 있을 수 있는 다른 서버와 명령을 별도로 유지하기 위해 Cog 파일에서 사용됩니다.

클래스 선언 위에 사전을 순서대로 1로 설정하지만 명령 확인 중에 많은 역할이 사용됩니다. 역할은 가장 낮은 "순위"에서 가장 높은 순서로 정렬되어야 합니다.
role1ID가 가장 낮아야 하고 role3ID가 가장 낮아야 합니다.

import nextcord
from nextcord.ext.commands.core import has_permissions
from nextcord.utils import get
from nextcord.ext import commands

RANKS = {
  1: role1ID,
  2: role2ID,
  3: role3ID
}

class ServerRoles(commands.Cog):
  def __init__(self, client):P
    self.client = client

  def cog_check(self, ctx):
    return ctx.guild.id == <the-server-id>
...

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


승격 명령에 대한 논리를 추가하기 위해 이제 지정된 서버에 사용할 파일이 설정되었습니다.

@commands.command(brief="Gives promotion")
@has_permissions(manage_roles = True)
async def promote(self, ctx, user: nextcord.Member):
  def getRole(key):
    return get(ctx.guild.roles, id = RANKS.get(key))

  # Loop through the RANKS dictionary for the current role
  for key, value in RANKS.items():
      try:
        currentRole = getRole(key)
        if key != 1:
          previousRole = getRole(key -1)
        if key != 3:
          nextRole = getRole(key + 1)
        if key == 3:
          await ctx.send(f'{user} already has the highest attainable role!')
          return
        if currentRole in user.roles:
          previousRole = currentRole
          print(f'current role in user.roles section {currentRole}')
          print(f'{user} has the {currentRole} role')
          print(f'{user} will recieve the {nextRole} role and lose the {previousRole} role')
          await user.add_roles(nextRole)
          await user.remove_roles(previousRole)
          await ctx.send(f'{user} has been promoted to {nextRole}')
          return

      except:
        print("PROMOTE FAILED SOMEWHERE!!\n")
        return
      finally:
        print("EOL for promote command")


강등 명령은 승격 명령과 매우 유사하지만 런타임 오류가 없고 봇이 충돌하지 않도록 목록에서 가장 낮은 순위를 확인합니다.

@commands.command(brief="Gives demotion")
  @has_permissions(manage_roles=True)
  async def demote(self, ctx, user: nextcord.Member):
    def getRole(key):
      return get(ctx.guild.roles, id = RANKS.get(key))
    for key, value in RANKS.items():
      try:
        currentRole = getRole(key)
        print(currentRole)
        if currentRole in user.roles and key == 1:
          print(f'{currentRole} is the lowest role')
          await ctx.send(f'{user} is currently at the lowest rank!')
          return
        if key != 1:
          previousRole = getRole(key - 1)
        if currentRole in user.roles:
          # Give previousRole
          print(f'{user} has {currentRole} to be removed and {previousRole} to be given')
          await user.add_roles(previousRole)
          await user.remove_roles(currentRole)
          await ctx.send(f'{user} has been demoted to {previousRole}')
          return
        else:
          print('something else needs to happen before here')
      except:
        print('DEMOTION FAILED\n')
        return
      finally:
        print('EOL for demotion\n')


최소 역할 요구 사항이 있는 서버



대화/연결 등을 위해 "필수"낮은 역할이 필요한 Discord에서 RANKS 사전의 순서를 계층화된 시스템으로 뒤집어서 1: role1ID가 Discord의 최상위 계층임을 표시해야 합니다. 가장 낮은 순위를 향해 노력할 것이며, 그 중 필수 역할이 되어야 합니다.

# without required role
if key != 1:
  previousRole = getRole(key - 1)
if key != 3:
  nextRole = getRole(key + 1)

# with required role
if key != 3:
  previousRole = getRole(key + 1)
if key != 1:
  nextRole = getRole(key - 1)


이렇게 하면 수표가 뒤집혀서 가장 낮은 순위가 아닌 가장 높은 순위를 먼저 보게 됩니다.

승격 및 사용자 상승 시 최저 순위를 유지하고 다시 최저 순위로 강등하려면 다른 변경이 필요합니다.

# promote command

# Check for top rank
if currentRole in user.roles and key == 1:
  await ctx.send("This is the highest rank!")
  return

# Check for bottom rank
if currentRole in user.roles and key == 3:
  await user.add_roles(nextRole)
  return

# demote command

# Check for bottom role
if currentRole in user.roles and key == 3:
  await ctx.send("User is at the lowest rank already!")
  return

# Remove currentRole but retain bottom role
if currentRole in user.roles and key == 2:
  await user.remove_roles(currentRole)
  return

좋은 웹페이지 즐겨찾기