discord.pyでCogとSlashCommandを両方使う

# discord.pyの開発再開~~終了~~とSlashCommandの必須化
~~discord.pyの開発が終了したのはご存じの通り。開発者の方々おつかれさまでした。~~
追記: discord.pyの開発が再開しました。
それでも我々discord依存民はこれまで作って使い慣れてきたdiscord.botを手放すことはできません。したくありません。
もうかなりの工数を突っ込んでいるので引き返せないんだよォ！
なので開発途中のdiscord_slashライブラリを活用したdiscord.botのひな形を用意しました。
## ひな形
###testbot.py：実行本体ファイル
```python3:testbot.py
#!/usr/bin/env python3
import discord
from discord.ext import commands
from discord_slash import SlashCommand
from discord_slash.utils import manage_commands
from logging import basicConfig, getLogger

basicConfig(level = config.LOG_LEVEL)
LOG = getLogger(__name__)

# 読み込むCogファイル名を格納しておく
INITIAL_EXTENSIONS = [
  'test_cog',
]

# テストbotクラス本体
class TestBot(commands.Bot):
  # コンストラクタ
  def __init__(self, command_prefix, intents, help_command, description, **options):
    super().__init__(command_prefix,
                      case_insensitive = True,
                      intents = intents,
                      help_command = help_command,
                      description = description, **options)

    # スラッシュコマンドオブジェクトのインスタンス
    slash = SlashCommand(self, sync_commands = True, override_type = True)
    guild_ids = [botを稼働させるDiscordのサーバID]

    # コグを読み込む
    for cog in INITIAL_EXTENSIONS:
      self.load_extension(cog)

  async def on_ready(self):
    LOG.info('We have logged in as {0.user}'.format(self))
    LOG.info(f'### guilds ### \n{self.guilds}')
    LOG.info('bot ready.')
    activity = discord.Activity(name = 'アクティビティサンプル', type = discord.ActivityType.watching)
    await self.change_presence(activity = activity)

    cmds = await manage_commands.get_all_commands(config.BOT_USER_ID, config.DISCORD_TOKEN, config.GUILD_ID)
    for cmd in cmds:
      LOG.info(cmd)

    # グローバルコマンドを登録した場合、以下のコマンドで削除します
    # await manage_commands.remove_all_commands_in(config.BOT_USER_ID, config.DISCORD_TOKEN, config.GUILD_ID)
    # LOG.info('remove all guild command.')

if __name__ == '__main__':
# discord-Infobotのインスタンス化、および、起動処理
  intents = discord.Intents.all()
  intents.typing = False
  intents.members = False
  intents.voice_states = False
  intents.presences = False

  bot = TestBot(command_prefix = '/', intents = intents,
                help_command = None, description = 'テストbot')
  bot.run(ディスコードBOTトークン)
```
###test_cog.py：コグで実装したスラッシュコマンド本体を記述したファイル
```python3:test_cog.py
#!/usr/bin/env python3
from discord.ext import commands
from logging import getLogger

LOG = getLogger(__name__)

# テストコグスラッシュコマンドクラス
class Test_Cog(commands.Cog):
  guild_ids = [botを稼働させるDiscordのサーバID]

  # /test オプション
  test_options = [
    manage_commands.create_option(name = 'param',
                                  description = 'テストコマンドの第一パラメータです',
                                  option_type = SlashCommandOptionType.STRING, # 3
                                  required = True),
  ]
  # クラスコンストラクタ
  def __init__(self, bot):
    self.bot = bot
    LOG.info('constructor end')

  # コグアンロード処理
  def cog_unload(self):
    return super().cog_unload()

  # テストコマンド
  @cog_ext.cog_slash(name = 'test', description = 'テストコマンド',
                     options = test_options, guild_ids = guild_ids)
  async def _test(self, ctx: SlashContext, param: str = None):
    message = '次のメッセージを入力しました：{0}'.format(param)
    await ctx.send(message)

# メンバ関数ではないことに注意する
def setup(bot):
  bot.add_cog(Test_Cog(bot))
  print('Test_Cog setupped')

```
###Thanks discord.py and enjoy discord
discord_slash ライブラリがどう転ぶのか分かりませんが、この実装が主流になると信じて。