|
74 | 74 | "Boundary", |
75 | 75 | "ChannelAdBreakBegin", |
76 | 76 | "ChannelBan", |
| 77 | + "ChannelBitsUse", |
77 | 78 | "ChannelChatClear", |
78 | 79 | "ChannelChatClearUserMessages", |
79 | 80 | "ChannelCheer", |
|
156 | 157 | "ModerateUnbanRequest", |
157 | 158 | "ModerateWarn", |
158 | 159 | "PollVoting", |
| 160 | + "PowerUp", |
| 161 | + "PowerUpEmote", |
159 | 162 | "SharedChatSessionBegin", |
160 | 163 | "SharedChatSessionEnd", |
161 | 164 | "SharedChatSessionUpdate", |
@@ -719,6 +722,97 @@ def __repr__(self) -> str: |
719 | 722 | return f"<AutomodTermsUpdate broadcaster={self.broadcaster} moderator={self.moderator} action={self.action} automod={self.automod}>" |
720 | 723 |
|
721 | 724 |
|
| 725 | +class PowerUpEmote: |
| 726 | + """ |
| 727 | + Represents a PowerUp Emote on a channel bits use event. |
| 728 | +
|
| 729 | + Attributes |
| 730 | + ---------- |
| 731 | + id: str |
| 732 | + The ID that uniquely identifies this emote. |
| 733 | + name: str |
| 734 | + The human readable emote token. |
| 735 | + """ |
| 736 | + |
| 737 | + __slots__ = ("id", "name") |
| 738 | + |
| 739 | + def __init__(self, data: PowerUpEmoteDataData) -> None: |
| 740 | + self.id: str = data["id"] |
| 741 | + self.name: str = data["name"] |
| 742 | + |
| 743 | + |
| 744 | +class PowerUp: |
| 745 | + """ |
| 746 | + Represents a PowerUp on a channel bits use event. |
| 747 | +
|
| 748 | + Attributes |
| 749 | + ---------- |
| 750 | + emote: PowerUpEmote | None |
| 751 | + Emote associated with the reward. Is `None` if no emote was used. |
| 752 | + type: typing.Literal["message_effect", "celebration", "gigantify_an_emote"] |
| 753 | + The type of Power-up redeemed. |
| 754 | +
|
| 755 | + - message_effect |
| 756 | + - celebration |
| 757 | + - gigantify_an_emote |
| 758 | +
|
| 759 | + message_effect_id: str | None |
| 760 | + The ID of the message effect. Is `None` if no message effect was used. |
| 761 | + """ |
| 762 | + |
| 763 | + __slots__ = ("emote", "message_effect_id", "type") |
| 764 | + |
| 765 | + def __init__(self, data: PowerUpData) -> None: |
| 766 | + emote = data.get("emote") |
| 767 | + self.emote: PowerUpEmote | None = PowerUpEmote(emote) if emote is not None else None |
| 768 | + self.type: Literal["message_effect", "celebration", "gigantify_an_emote"] = data["type"] |
| 769 | + self.message_effect_id: str | None = data.get("message_effect_id") |
| 770 | + |
| 771 | + |
| 772 | +class ChannelBitsUse(BaseEvent): |
| 773 | + """ |
| 774 | + Represents a channel bits use event. |
| 775 | +
|
| 776 | + Attributes |
| 777 | + ---------- |
| 778 | + broadcaster: PartialUser |
| 779 | + The broadcastter / channel where the Bits were redeemed. |
| 780 | + user: PartialUser |
| 781 | + The redeeming user. |
| 782 | + bits: int |
| 783 | + The number of Bits used. |
| 784 | + type: typing.Literal["cheer", "power_up"] |
| 785 | + What the Bits were used for. |
| 786 | + text: str | None |
| 787 | + The chat message in plain text. Is `None` if no chat message was used. |
| 788 | + fragments: list[ChatMessageFragment] |
| 789 | + The ordered list of chat message fragments. Is `None` if no chat message was used. |
| 790 | + power_up: PowerUp | None |
| 791 | + Data about Power-up. Is `None` if a Power-up is not used. |
| 792 | + """ |
| 793 | + |
| 794 | + subscription_type = "channel.bits.use" |
| 795 | + |
| 796 | + __slots__ = ("bits", "broadcaster", "fragments", "power_up", "text", "type", "user") |
| 797 | + |
| 798 | + def __init__(self, payload: ChannelBitsUseEvent, *, http: HTTPClient) -> None: |
| 799 | + self.broadcaster = PartialUser( |
| 800 | + payload["broadcaster_user_id"], payload["broadcaster_user_login"], payload["broadcaster_user_name"], http=http |
| 801 | + ) |
| 802 | + self.user = PartialUser(payload["user_id"], payload["user_login"], payload["user_name"], http=http) |
| 803 | + self.bits: int = int(payload["bits"]) |
| 804 | + self.type: Literal["cheer", "power_up"] = payload["type"] |
| 805 | + self.text: str | None = payload.get("message").get("text") |
| 806 | + power_up = payload.get("power_up") |
| 807 | + self.power_up: PowerUp | None = PowerUp(power_up) if power_up is not None else None |
| 808 | + self.fragments: list[ChatMessageFragment] = [ |
| 809 | + ChatMessageFragment(fragment, http=http) for fragment in payload["message"]["fragments"] |
| 810 | + ] |
| 811 | + |
| 812 | + def __repr__(self) -> str: |
| 813 | + return f"<ChannelBitsUse broadcaster={self.broadcaster} user={self.user} bits={self.bits} type={self.type}>" |
| 814 | + |
| 815 | + |
722 | 816 | class ChannelUpdate(BaseEvent): |
723 | 817 | """ |
724 | 818 | Represents a channel update event. |
|
0 commit comments