@@ -34,6 +34,11 @@ def setup_db():
3434 bot .db .messages .create_index ("user_id" )
3535 bot .db .messages .create_index ("channel_id" )
3636 bot .db .messages .create_index ("guild_id" )
37+ bot .db .messages .create_index (
38+ "message_id" ,
39+ unique = True ,
40+ partialFilterExpression = {"message_id" : {"$exists" : True }},
41+ )
3742
3843 # TTL Index: 30日後に自動的に削除
3944 bot .db .messages .create_index ("timestamp" , expireAfterSeconds = 30 * 24 * 60 * 60 )
@@ -85,6 +90,7 @@ async def on_message(message):
8590 roles = message .author .roles
8691
8792 data = {
93+ "message_id" : str (message .id ),
8894 "guild_id" : str (message .guild .id ),
8995 "guild_name" : message .guild .name ,
9096 "user_id" : str (message .author .id ),
@@ -101,6 +107,69 @@ async def on_message(message):
101107 await bot .process_commands (message )
102108
103109
110+ def _delete_message_records (message_ids ):
111+ normalized_ids = [str (message_id ) for message_id in message_ids ]
112+ result = bot .db .messages .delete_many ({"message_id" : {"$in" : normalized_ids }})
113+ return result .deleted_count
114+
115+
116+ @bot .event
117+ async def on_guild_remove (guild ):
118+ print (f"Left guild: { guild .name } (ID: { guild .id } )" )
119+ # サーバーから退出した際に、そのサーバーのメッセージデータを削除する
120+ result = bot .db .messages .delete_many ({"guild_id" : str (guild .id )})
121+ print (
122+ f"Deleted { result .deleted_count } messages from the database for guild { guild .name } "
123+ )
124+ # 設定の削除
125+ settings_result = bot .db .guild_settings .delete_many ({"guild_id" : str (guild .id )})
126+ print (
127+ f"Deleted { settings_result .deleted_count } guild settings from the database for guild { guild .name } "
128+ )
129+ channel_settings_result = bot .db .channel_settings .delete_many (
130+ {"guild_id" : str (guild .id )}
131+ )
132+ print (
133+ f"Deleted { channel_settings_result .deleted_count } channel settings from the database for guild { guild .name } "
134+ )
135+
136+
137+ @bot .event
138+ async def on_raw_message_delete (payload ):
139+ """
140+ メッセージが削除された際のイベントハンドラー
141+ """
142+ if payload .guild_id is None :
143+ return
144+
145+ deleted_count = _delete_message_records ([payload .message_id ])
146+ if deleted_count > 0 :
147+ guild = bot .get_guild (payload .guild_id )
148+ channel = bot .get_channel (payload .channel_id )
149+ guild_name = guild .name if guild is not None else "Unknown Guild"
150+ channel_name = channel .name if channel is not None else "Unknown Channel"
151+ print (
152+ f"Deleted { deleted_count } message records from the database for deleted message in guild '{ guild_name } ' (ID: { payload .guild_id } ), channel '{ channel_name } ' (ID: { payload .channel_id } )"
153+ )
154+
155+
156+ @bot .event
157+ async def on_raw_bulk_message_delete (payload ):
158+ """
159+ 複数メッセージが一度に削除された際のイベントハンドラー
160+ """
161+ if payload .guild_id is None :
162+ return
163+
164+ deleted_count = _delete_message_records (payload .message_ids )
165+ if deleted_count > 0 :
166+ guild = bot .get_guild (payload .guild_id )
167+ guild_name = guild .name if guild is not None else "Unknown Guild"
168+ print (
169+ f"Deleted { deleted_count } message records from the database for bulk deleted messages in guild '{ guild_name } ' (ID: { payload .guild_id } )"
170+ )
171+
172+
104173@bot .event
105174async def on_guild_join (guild ):
106175 print (f"Joined guild: { guild .name } (ID: { guild .id } )" )
0 commit comments