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"])
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: ライブラリ未インストール