nonebot / adapter-discord

NoneBot2 Discord 适配器 / Discord adapter for nonebot2
20 stars 6 forks source link

使用 `bot.get_channel_webhooks()` 时,遇到当 Channel Follower Webhook,pydantic 抛出 `ValidationError` #29

Closed Autuamn closed 2 months ago

Autuamn commented 3 months ago

Webhook类中的 source_guildsource_guild 并不是完整的 ChannelGuild, 导致 pydantic 抛出 ValidationError

Example Channel Follower Webhook

{
  "type": 2,
  "id": "752831914402115456",
  "name": "Guildy name",
  "avatar": "bb71f469c158984e265093a81b3397fb",
  "channel_id": "561885260615255432",
  "guild_id": "56188498421443265",
  "application_id": null,
  "source_guild": {
    "id": "56188498421476534",
    "name": "Guildy name",
    "icon": "bb71f469c158984e265093a81b3397fb"
  },
  "source_channel": {
    "id": "5618852344134324",
    "name": "announcements"
  },
  "user": {
    "username": "test",
    "discriminator": "7479",
    "id": "190320984123768832",
    "avatar": "b004ec1740a63ca06ae2e14c5cee11f3",
    "public_flags": 131328
  }
}

我收到的

{
    "application_id": null,
    "avatar": "e0582bf64ecc58c529f16bf9f672943a",
    "channel_id": "1180868274368548975",
    "guild_id": "1171294052839333910",
    "id": "111",
    "name": "CoFH #thaumcraft-teasers",
    "type": 2,
    "user": {
        "id": "474564749217234954",
        "username": "autuamn_end",
        "avatar": "7a8c1eacb63acfd711543f86244e5572",
        "discriminator": "0",
        "public_flags": 0,
        "flags": 0,
        "banner": null,
        "accent_color": null,
        "global_name": "Autuamn End",
        "avatar_decoration_data": null,
        "banner_color": null,
        "clan": null
    },
    "source_guild": {
        "id": "399037120930512897",
        "icon": "e0582bf64ecc58c529f16bf9f672943a",
        "name": "CoFH"
    },
    "source_channel": {
        "id": "1098341229491654827",
        "name": "thaumcraft-teasers"
    }
}
log

```python 05-21 11:46:37 [TRACE] nonebot | Discord | API code: 200 response: b'[{"application_id":null,"avatar":"e0582bf64ecc58c529f16bf9f672943a","channel_id":"1180868274368548975","guild_id":"1171294052839333910","id":"111","name":"CoFH #thaumcraft-teasers","type":2,"user":{"id":"474564749217234954","username":"autuamn_end","avatar":"7a8c1eacb63acfd711543f86244e5572","discriminator":"0","public_flags":0,"flags":0,"banner":null,"accent_color":null,"global_name":"Autuamn End","avatar_decoration_data":null,"banner_color":null,"clan":null},"source_guild":{"id":"399037120930512897","icon":"e0582bf64ecc58c529f16bf9f672943a","name":"CoFH"},"source_channel":{"id":"1098341229491654827","name":"thaumcraft-teasers"}}]\n' 05-21 11:46:37 [ERROR] nonebot | Error when running WebSocketConnection hook. Running cancelled! Traceback (most recent call last): File "", line 17, in File "C:\Users\autua\Desktop\NoneBot\DiscordBot\.venv\Lib\site-packages\nonebot\__init__.py", line 334, in run get_driver().run(*args, **kwargs) File "C:\Users\autua\Desktop\NoneBot\DiscordBot\.venv\Lib\site-packages\nonebot\drivers\none.py", line 56, in run loop.run_until_complete(self._serve()) File "C:\Program Files\Python312\Lib\asyncio\base_events.py", line 651, in run_until_complete self.run_forever() File "C:\Program Files\Python312\Lib\asyncio\windows_events.py", line 321, in run_forever super().run_forever() File "C:\Program Files\Python312\Lib\asyncio\base_events.py", line 618, in run_forever self._run_once() File "C:\Program Files\Python312\Lib\asyncio\base_events.py", line 1951, in _run_once handle._run() File "C:\Program Files\Python312\Lib\asyncio\events.py", line 84, in _run self._context.run(self._callback, *self._args) > File "C:\Users\autua\Desktop\NoneBot\DiscordBot\.venv\Lib\site-packages\nonebot\internal\driver\abstract.py", line 156, in _run_hook await asyncio.gather(*coros) File "C:\Users\autua\Desktop\NoneBot\DiscordBot\.venv\Lib\site-packages\nonebot\utils.py", line 249, in run_coro_with_catch return await coro File "C:\Users\autua\Desktop\NoneBot\DiscordBot\.venv\Lib\site-packages\nonebot\dependencies\__init__.py", line 106, in __call__ return await cast(Callable[..., Awaitable[R]], self.call)(**values) File "C:\Users\autua\Desktop\NoneBot\DiscordBot\src\plugins\sync_message_to_discord\__init__.py", line 79, in get_webhook list_list_webhook = await asyncio.gather(*task_get_webhook) File "C:\Users\autua\Desktop\NoneBot\DiscordBot\.venv\Lib\site-packages\nonebot\internal\adapter\bot.py", line 122, in call_api raise exception File "C:\Users\autua\Desktop\NoneBot\DiscordBot\.venv\Lib\site-packages\nonebot\internal\adapter\bot.py", line 97, in call_api result = await self.adapter._call_api(self, api, **data) File "C:\Users\autua\Desktop\NoneBot\DiscordBot\.venv\Lib\site-packages\nonebot\adapters\discord\adapter.py", line 455, in _call_api return await api_handler(self, bot, **data) File "C:\Users\autua\Desktop\NoneBot\DiscordBot\.venv\Lib\site-packages\nonebot\adapters\discord\api\handle.py", line 2861, in _get_channel_webhooks return type_validate_python(List[Webhook], await _request(adapter, bot, request)) File "C:\Users\autua\Desktop\NoneBot\DiscordBot\.venv\Lib\site-packages\nonebot\compat.py", line 215, in type_validate_python return TypeAdapter(type_).validate_python(data) File "C:\Users\autua\Desktop\NoneBot\DiscordBot\.venv\Lib\site-packages\pydantic\type_adapter.py", line 260, in validate_python return self.validator.validate_python(object, strict=strict, from_attributes=from_attributes, context=context) pydantic_core._pydantic_core.ValidationError: 30 validation errors for list[Webhook] 1.source_guild.literal[] Input should be [type=literal_error, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/literal_error 1.source_guild.Guild.splash Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.discovery_splash Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.owner_id Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.afk_channel_id Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.afk_timeout Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.verification_level Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.default_message_notifications Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.explicit_content_filter Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.roles Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.emojis Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.features Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.mfa_level Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.application_id Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.system_channel_id Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.system_channel_flags Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.rules_channel_id Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.max_presences Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.max_members Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.vanity_url_code Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.description Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.banner Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.premium_tier Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.premium_subscription_count Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.preferred_locale Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.public_updates_channel_id Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.nsfw_level Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_guild.Guild.premium_progress_bar_enabled Field required [type=missing, input_value={'id': '39903712093051289...72943a', 'name': 'CoFH'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing 1.source_channel.literal[] Input should be [type=literal_error, input_value={'id': '10983412294916548...': 'thaumcraft-teasers'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/literal_error 1.source_channel.Channel.type Field required [type=missing, input_value={'id': '10983412294916548...': 'thaumcraft-teasers'}, input_type=dict] For further information visit https://errors.pydantic.dev/2.7/v/missing ```