3장. 톱니바퀴

, 우리는 톱니바퀴를 볼 수 있습니다. 그러나 먼저:

톱니란 무엇입니까?



톱니바퀴는 봇의 "확장"이며 Python 모듈처럼 작동합니다. 명령 및 이벤트 리스너를 포함할 수 있습니다. 한 가지 예를 살펴보겠습니다.

Cog의 해부학.



이 자습서를 따라 수행하는 경우 miscellaneous.pysrc/cogs라는 파일이 있습니다. 열면 Miscellaneous 라는 클래스의 클래스 선언이 있습니다. 각 톱니에는 톱니 클래스와 setup 기능의 두 부분이 포함됩니다. 먼저 수업을 살펴보자.

class Miscellaneous(commands.Cog):
    """Cog class containing all miscellaneous commands."""

    def __init__(self, bot: commands.Bot):
        self.bot = bot


여기에서 Miscellaneous가 모든 톱니바퀴가 상속해야 하는 클래스인 commands.Cog에서 속성을 상속받는 것을 볼 수 있습니다. 더 아래에서 cog_load에 대한 함수 선언을 볼 수 있습니다.

async def cog_load(self):
        """Method called when the cog has been fully loaded."""
        print("The Miscellaneous cog is loaded.")


이름에서 알 수 있듯이 이 기능은 특정 코그가 완전히 로드될 때마다 호출되는 특수 기능입니다. 그러나 좋은 것은 아직 오지 않았습니다. 여기서 우리는 첫 번째 명령을 봅니다. 슬래시 명령이 궁금하십니까? 나중에 이야기하겠습니다.

@commands.command(
        name="ping", description="Get the current latency of the bot."
    )  # This could be implemented as a slash command.
    async def ping(self, ctx: commands.Context):
        """Get the current latency of the bot."""
        await ctx.channel.send(
            f"The current latency of the bot is {round(self.bot.latency * 1000, 1)}ms."
        )


와! 이 코드는 처음에는 혼란스러울 수 있지만(코드에 @가 있는 이유는 무엇입니까???) 먼저 살펴보겠습니다. 함수 데코레이터가 무엇인지 모르신다면 좋아. 또한 namedescription 매개변수가 commands.command 로 전달되는 것을 볼 수 있습니다. 그런 다음 ping() 를 인수로 사용하는 ctx 의 실제 함수 선언을 봅니다. 유형 힌트에서 알 수 있듯이 이 인수는 commands.Context 유형입니다. the docs에 따르면:

Represents the context in which a command is being invoked under.



그런 다음 send() 에서 ctx.channel 함수를 호출하는 명령문을 봅니다. 또한 self.bot.latency 값을 제공하는 인수인 f-문자열을 전달하고 있습니다.

받아 들일 게 많았죠? 그렇다면 이 명령은 실제로 무엇을 할까요? 봇의 대기 시간을 보냅니다. 네.



명령이 어떻게 작동하는지 잘 이해하지 못했다면(내 말은 명령이 Discord 봇의 핵심입니다) 걱정하지 마세요. 시리즈의 다음 기사에서는 전적으로 명령에 대해 다룰 것입니다.

설정 기능


miscellaneous.py의 끝에서 setup()에 대한 함수 선언을 찾을 수 있습니다.

async def setup(bot: commands.Bot):
    await bot.add_cog(Miscellaneous(bot))


이 기능은 모든 코그를 로드하는 데 필수입니다. 누락된 경우 다음과 같은 멋진 오류 메시지가 표시됩니다.

discord.ext.commands.errors.NoEntryPointError: Extension 'src.cogs.miscellaneous' has no 'setup' function.

setup 함수는 async 함수여야 합니다. (참고: 이전에 설치한 Discord.py v2.0에만 해당됩니다. 이전 버전을 사용하는 경우 setup 기능을 만들지 마십시오. async ). 설정 기능 내에서 commands.Bot.add_cog(cog) 매개변수가 cog 클래스인 cog에 대한 비동기 호출을 찾습니다.

로딩 톱니바퀴



톱니바퀴 자체는 로드되지 않으면 실제로 유용하지 않습니다. commands.Bot.load_extension(name)를 사용하여 로드할 수 있습니다. 여기서 name는 로드하려는 톱니의 이름입니다. 톱니바퀴는 파이썬 모듈과 같은 방식으로 작동하므로 다음과 같이 참조해야 합니다. 모듈을 가져올 때 다음과 같이 수행하지 마십시오.

import path/to/module


그러나 다음과 같이:

import path.to.module


따라서 commands.Bot.load_extension() 를 사용할 때 모듈을 가져오려고 할 때와 동일한 표기법(점 표기법이라고 함)을 사용해야 합니다.

결론



이 기사에서 우리는 톱니바퀴에 대해 배웠습니다. 이 시리즈의 이 시점에서 "도대체 우리가 언제 명령을 작성할 것인가?"라고 궁금해할 수 있습니다. 안심하십시오. 다음 기사에 나올 것입니다. 계속 지켜봐!

추가 자료


  • commands.Cog
  • commands.Bot.load_extension
  • Function Decorators
  • commands.command()
  • 좋은 웹페이지 즐겨찾기