integrations.discord.events.handler

integrations/discord/events/handler.py

  1"""
  2integrations/discord/events/handler.py
  3"""
  4
  5import logging
  6import os
  7import sys
  8from typing import TYPE_CHECKING
  9
 10import integrations.discord.events.audioop as _audioop
 11import libs.dispatcher
 12
 13if TYPE_CHECKING:
 14    from integrations.discord.adapter import ServiceAdapter
 15
 16
 17def main(adapter: "ServiceAdapter"):
 18    """メイン処理
 19
 20    Args:
 21        adapter (ServiceAdapter): アダプタインターフェース
 22
 23    Raises:
 24        ModuleNotFoundError: ライブラリ未インストール
 25    """
 26
 27    try:
 28        sys.modules["audioop"] = _audioop
 29        import discord
 30        from discord.ext import commands
 31    except ModuleNotFoundError as err:
 32        raise ModuleNotFoundError(err.msg) from None
 33
 34    # ログレベル変更
 35    for name in logging.Logger.manager.loggerDict:
 36        if name.startswith(("discord_", "discord")):
 37            logging.getLogger(name).setLevel(logging.WARNING)
 38
 39    intents = discord.Intents.default()
 40    intents.message_content = True
 41    intents.messages = True
 42    bot = commands.Bot(intents=intents)
 43    adapter.api.bot = bot
 44
 45    @bot.event
 46    async def on_ready():
 47        logging.info("login: %s", bot.user)
 48        adapter.conf.bot_name = bot.user
 49
 50    @bot.event
 51    async def on_message(message: discord.Message):
 52        if message.author.bot:
 53            return
 54
 55        adapter.api.response = message
 56
 57        m = adapter.parser()
 58        m.data.status = "message_append"
 59        m.parser(message)
 60
 61        libs.dispatcher.by_keyword(m)
 62
 63    @bot.event
 64    async def on_raw_message_edit(payload: discord.RawMessageUpdateEvent):
 65
 66        channel = bot.get_channel(payload.channel_id)
 67        if channel is None or not isinstance(channel, discord.TextChannel):
 68            return
 69
 70        try:
 71            message = await channel.fetch_message(payload.message_id)
 72        except discord.NotFound:
 73            return  # メッセージが既に削除されていた場合
 74        except discord.Forbidden:
 75            return  # 権限不足
 76        except discord.HTTPException:
 77            return  # Discord API 側の一時的エラーなど
 78
 79        assert isinstance(message, discord.Message)
 80
 81        if message.author.bot:
 82            return
 83
 84        adapter.api.response = message
 85
 86        m = adapter.parser()
 87        m.data.status = "message_changed"
 88        m.parser(message)
 89
 90        libs.dispatcher.by_keyword(m)
 91
 92    @bot.event
 93    async def on_message_delete(message: discord.Message):
 94        if message.author.bot:
 95            return
 96
 97        adapter.api.response = message
 98
 99        m = adapter.parser()
100        m.data.status = "message_deleted"
101        m.parser(message)
102
103        libs.dispatcher.by_keyword(m)
104
105    @bot.slash_command(name=adapter.conf.slash_command)
106    async def slash_command(ctx: discord.ApplicationContext, command: str):
107        adapter.api.response = ctx
108
109        m = adapter.parser()
110        m.status.command_flg = True
111        m.data.text = command
112        m.data.status = "message_append"
113        m.data.thread_ts = "0"
114
115        libs.dispatcher.by_keyword(m)
116
117    bot.run(token=os.environ["DISCORD_TOKEN"])
def main(adapter: integrations.discord.adapter.ServiceAdapter):
 18def main(adapter: "ServiceAdapter"):
 19    """メイン処理
 20
 21    Args:
 22        adapter (ServiceAdapter): アダプタインターフェース
 23
 24    Raises:
 25        ModuleNotFoundError: ライブラリ未インストール
 26    """
 27
 28    try:
 29        sys.modules["audioop"] = _audioop
 30        import discord
 31        from discord.ext import commands
 32    except ModuleNotFoundError as err:
 33        raise ModuleNotFoundError(err.msg) from None
 34
 35    # ログレベル変更
 36    for name in logging.Logger.manager.loggerDict:
 37        if name.startswith(("discord_", "discord")):
 38            logging.getLogger(name).setLevel(logging.WARNING)
 39
 40    intents = discord.Intents.default()
 41    intents.message_content = True
 42    intents.messages = True
 43    bot = commands.Bot(intents=intents)
 44    adapter.api.bot = bot
 45
 46    @bot.event
 47    async def on_ready():
 48        logging.info("login: %s", bot.user)
 49        adapter.conf.bot_name = bot.user
 50
 51    @bot.event
 52    async def on_message(message: discord.Message):
 53        if message.author.bot:
 54            return
 55
 56        adapter.api.response = message
 57
 58        m = adapter.parser()
 59        m.data.status = "message_append"
 60        m.parser(message)
 61
 62        libs.dispatcher.by_keyword(m)
 63
 64    @bot.event
 65    async def on_raw_message_edit(payload: discord.RawMessageUpdateEvent):
 66
 67        channel = bot.get_channel(payload.channel_id)
 68        if channel is None or not isinstance(channel, discord.TextChannel):
 69            return
 70
 71        try:
 72            message = await channel.fetch_message(payload.message_id)
 73        except discord.NotFound:
 74            return  # メッセージが既に削除されていた場合
 75        except discord.Forbidden:
 76            return  # 権限不足
 77        except discord.HTTPException:
 78            return  # Discord API 側の一時的エラーなど
 79
 80        assert isinstance(message, discord.Message)
 81
 82        if message.author.bot:
 83            return
 84
 85        adapter.api.response = message
 86
 87        m = adapter.parser()
 88        m.data.status = "message_changed"
 89        m.parser(message)
 90
 91        libs.dispatcher.by_keyword(m)
 92
 93    @bot.event
 94    async def on_message_delete(message: discord.Message):
 95        if message.author.bot:
 96            return
 97
 98        adapter.api.response = message
 99
100        m = adapter.parser()
101        m.data.status = "message_deleted"
102        m.parser(message)
103
104        libs.dispatcher.by_keyword(m)
105
106    @bot.slash_command(name=adapter.conf.slash_command)
107    async def slash_command(ctx: discord.ApplicationContext, command: str):
108        adapter.api.response = ctx
109
110        m = adapter.parser()
111        m.status.command_flg = True
112        m.data.text = command
113        m.data.status = "message_append"
114        m.data.thread_ts = "0"
115
116        libs.dispatcher.by_keyword(m)
117
118    bot.run(token=os.environ["DISCORD_TOKEN"])

メイン処理

Arguments:
  • adapter (ServiceAdapter): アダプタインターフェース
Raises:
  • ModuleNotFoundError: ライブラリ未インストール