diff --git a/docs/getting-started/changelog.rst b/docs/getting-started/changelog.rst index b6d3e6e3..74db26ba 100644 --- a/docs/getting-started/changelog.rst +++ b/docs/getting-started/changelog.rst @@ -26,6 +26,7 @@ Changelog - Bug fixes - Fix :func:`~twitchio.utils.setup_logging` breaking coloured formatting on `CRITICAL` logging level + - Fix :class:`~models.eventsub_.ChannelPointsAutoRedeemAdd` now accounts for attribute message in payload to be None 3.1.0 diff --git a/twitchio/models/eventsub_.py b/twitchio/models/eventsub_.py index 7656a165..90c67335 100644 --- a/twitchio/models/eventsub_.py +++ b/twitchio/models/eventsub_.py @@ -3407,7 +3407,7 @@ class ChannelPointsAutoRedeemAdd(_ResponderEvent): id: str The ID of the redemption. text: str - The text of the chat message. + The text of the chat message. This will be an empty string for redemptions that do not contain a message (e.g. emote unlocks). redeemed_at: datetime.datetime The datetime object of when the reward was redeemed. reward: AutoRedeemReward @@ -3416,7 +3416,7 @@ class ChannelPointsAutoRedeemAdd(_ResponderEvent): V2 does not cover Power-ups e.g. `gigantify_an_emote`, `celebration`, and `message_effect`. Please see ChannelBitsUseSubscription for those specific types if using V2. emotes: list[ChannelPointsEmote] - A list of ChannelPointsEmote objects that appear in the text. + A list of ChannelPointsEmote objects that appear in the text. Not populated for redemptions that do not contain a message. - If using V1, this is populated by Twitch. - If using V2, the emotes can be found in the fragments, but we calculate the index ourselves for this property. @@ -3424,7 +3424,7 @@ class ChannelPointsAutoRedeemAdd(_ResponderEvent): user_input: str | None The text input by the user if the reward requires input. This is `None` when using V2. `text` is the preferred attribute to use. fragments: list[ChatMessageFragment] - The ordered list of chat message fragments. This is only populated when using V2. + The ordered list of chat message fragments. This is only populated when using V2, and only for redemptions that contain a message. """ subscription_type = "channel.channel_points_automatic_reward_redemption.add" @@ -3437,13 +3437,14 @@ def __init__(self, payload: ChannelPointsAutoRewardRedemptionEvent, *, http: HTT ) self.user: PartialUser = PartialUser(payload["user_id"], payload["user_login"], payload["user_name"], http=http) self.id: str = payload["id"] - self.text: str = payload["message"]["text"] + message = payload.get("message") or {} + self.text: str = message.get("text", "") self.user_input: str | None = payload.get("user_input") self.redeemed_at: datetime.datetime = parse_timestamp(payload["redeemed_at"]) self.reward: AutoRedeemReward = AutoRedeemReward(payload["reward"]) - fragments = payload["message"].get("fragments", []) + fragments = message.get("fragments", []) self.fragments: list[ChatMessageFragment] = [ChatMessageFragment(f, http=http) for f in fragments] - self._raw_emotes = payload.get("message", {}).get("emotes", []) + self._raw_emotes = message.get("emotes", []) def __repr__(self) -> str: return f"" diff --git a/twitchio/types_/eventsub.py b/twitchio/types_/eventsub.py index d8b170e1..abaaadb4 100644 --- a/twitchio/types_/eventsub.py +++ b/twitchio/types_/eventsub.py @@ -948,7 +948,7 @@ class BaseChannelPointsRewardData(TypedDict): class ChannelPointsAutoRewardRedemptionEvent(BroadcasterUserEvent): id: str reward: BaseChannelPointsRewardData - message: ChannelPointsMessageData + message: ChannelPointsMessageData | None user_input: str | None redeemed_at: str