Skip to content

Commit

Permalink
ES Charity Events
Browse files Browse the repository at this point in the history
  • Loading branch information
chillymosh committed Aug 24, 2024
1 parent 52e5e36 commit a36e6bb
Show file tree
Hide file tree
Showing 3 changed files with 197 additions and 3 deletions.
60 changes: 60 additions & 0 deletions twitchio/eventsub/payloads.py
Original file line number Diff line number Diff line change
Expand Up @@ -645,6 +645,66 @@ def condition(self) -> Condition:
return {"broadcaster_user_id": self.broadcaster_user_id, "moderator_user_id": self.moderator_user_id}


class CharityDonationSubscription(SubscriptionPayload):
type: ClassVar[Literal["channel.charity_campaign.donate"]] = "channel.charity_campaign.donate"
version: ClassVar[Literal["1"]] = "1"

def __init__(self, **condition: Unpack[Condition]) -> None:
self.broadcaster_user_id: str = condition.get("broadcaster_user_id", "")

if not self.broadcaster_user_id:
raise ValueError('The parameter "broadcaster_user_id" must be passed.')

@property
def condition(self) -> Condition:
return {"broadcaster_user_id": self.broadcaster_user_id}


class CharityCampaignStartSubscription(SubscriptionPayload):
type: ClassVar[Literal["channel.charity_campaign.start"]] = "channel.charity_campaign.start"
version: ClassVar[Literal["1"]] = "1"

def __init__(self, **condition: Unpack[Condition]) -> None:
self.broadcaster_user_id: str = condition.get("broadcaster_user_id", "")

if not self.broadcaster_user_id:
raise ValueError('The parameter "broadcaster_user_id" must be passed.')

@property
def condition(self) -> Condition:
return {"broadcaster_user_id": self.broadcaster_user_id}


class CharityCampaignProgressSubscription(SubscriptionPayload):
type: ClassVar[Literal["channel.charity_campaign.progress"]] = "channel.charity_campaign.progress"
version: ClassVar[Literal["1"]] = "1"

def __init__(self, **condition: Unpack[Condition]) -> None:
self.broadcaster_user_id: str = condition.get("broadcaster_user_id", "")

if not self.broadcaster_user_id:
raise ValueError('The parameter "broadcaster_user_id" must be passed.')

@property
def condition(self) -> Condition:
return {"broadcaster_user_id": self.broadcaster_user_id}


class CharityCampaignStopSubscription(SubscriptionPayload):
type: ClassVar[Literal["channel.charity_campaign.stop"]] = "channel.charity_campaign.stop"
version: ClassVar[Literal["1"]] = "1"

def __init__(self, **condition: Unpack[Condition]) -> None:
self.broadcaster_user_id: str = condition.get("broadcaster_user_id", "")

if not self.broadcaster_user_id:
raise ValueError('The parameter "broadcaster_user_id" must be passed.')

@property
def condition(self) -> Condition:
return {"broadcaster_user_id": self.broadcaster_user_id}


class GoalBeginSubscription(SubscriptionPayload):
type: ClassVar[Literal["channel.goal.begin"]] = "channel.goal.begin"
version: ClassVar[Literal["1"]] = "1"
Expand Down
100 changes: 97 additions & 3 deletions twitchio/models/eventsub_.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

from twitchio.assets import Asset
from twitchio.eventsub import RevocationReason, TransportMethod
from twitchio.models.charity import CharityValues
from twitchio.models.chat import EmoteSet
from twitchio.user import PartialUser
from twitchio.utils import Colour, parse_timestamp
Expand Down Expand Up @@ -1333,6 +1334,99 @@ def __repr__(self) -> str:
return f"<ChannelWarningSend broadcaster={self.broadcaster} user={self.user} moderator={self.moderator}>"


class CharityDonation(BaseEvent):
subscription_type = "channel.charity_campaign.donate"

__slots__ = ("broadcaster", "user", "id", "campaign_id", "name", "description", "logo", "website", "amount")

def __init__(self, payload: CharityCampaignDonationEvent, *, http: HTTPClient) -> None:
self.broadcaster: PartialUser = PartialUser(
payload["broadcaster_user_id"], payload["broadcaster_user_login"], http=http
)
self.user: PartialUser = PartialUser(payload["user_id"], payload["user_login"], http=http)
self.id: str = payload["id"]
self.campaign_id: str = payload["campaign_id"]
self.name: str = payload["charity_name"]
self.description: str = payload["charity_description"]
self.logo: Asset = Asset(payload["charity_logo"], http=http, dimensions=(100, 100))
self.website: str = payload["charity_website"]
self.amount: CharityValues = CharityValues(payload["amount"])

def __repr__(self) -> str:
return f"<CharityDonation broadcaster={self.broadcaster} user={self.user} id={self.id} name={self.name}>"


class CharityCampaignStart(BaseEvent):
subscription_type = "channel.charity_campaign.start"

__slots__ = ("broadcaster", "id", "name", "description", "logo", "website", "current", "target", "started_at")

def __init__(self, payload: CharityCampaignStartEvent, *, http: HTTPClient) -> None:
self.broadcaster: PartialUser = PartialUser(
payload["broadcaster_user_id"], payload["broadcaster_user_login"], http=http
)
self.id: str = payload["id"]
self.name: str = payload["charity_name"]
self.description: str = payload["charity_description"]
self.logo: Asset = Asset(payload["charity_logo"], http=http, dimensions=(100, 100))
self.website: str = payload["charity_website"]
self.current: CharityValues = CharityValues(payload["current_amount"])
self.target: CharityValues = CharityValues(payload["target_amount"])
self.started_at: datetime.datetime = parse_timestamp(payload["started_at"])

def __repr__(self) -> str:
return f"<CharityCampaignStart broadcaster={self.broadcaster} id={self.id} name={self.name} started_at={self.started_at}>"


class CharityCampaignProgress(BaseEvent):
subscription_type = "channel.charity_campaign.progress"

__slots__ = ("broadcaster", "id", "name", "description", "logo", "website", "current", "target")

def __init__(self, payload: CharityCampaignProgressEvent, *, http: HTTPClient) -> None:
self.broadcaster: PartialUser = PartialUser(
payload["broadcaster_user_id"], payload["broadcaster_user_login"], http=http
)
self.broadcaster: PartialUser = PartialUser(
payload["broadcaster_user_id"], payload["broadcaster_user_login"], http=http
)
self.id: str = payload["id"]
self.name: str = payload["charity_name"]
self.description: str = payload["charity_description"]
self.logo: Asset = Asset(payload["charity_logo"], http=http, dimensions=(100, 100))
self.website: str = payload["charity_website"]
self.current: CharityValues = CharityValues(payload["current_amount"])
self.target: CharityValues = CharityValues(payload["target_amount"])

def __repr__(self) -> str:
return f"<CharityCampaignProgress broadcaster={self.broadcaster} id={self.id} name={self.name} current={self.current} target={self.target}>"


class CharityCampaignStop(BaseEvent):
subscription_type = "channel.charity_campaign.stop"

__slots__ = ("broadcaster", "id", "name", "description", "logo", "website", "current", "target", "stopped_at")

def __init__(self, payload: CharityCampaignStopEvent, *, http: HTTPClient) -> None:
self.broadcaster: PartialUser = PartialUser(
payload["broadcaster_user_id"], payload["broadcaster_user_login"], http=http
)
self.broadcaster: PartialUser = PartialUser(
payload["broadcaster_user_id"], payload["broadcaster_user_login"], http=http
)
self.id: str = payload["id"]
self.name: str = payload["charity_name"]
self.description: str = payload["charity_description"]
self.logo: Asset = Asset(payload["charity_logo"], http=http, dimensions=(100, 100))
self.website: str = payload["charity_website"]
self.current: CharityValues = CharityValues(payload["current_amount"])
self.target: CharityValues = CharityValues(payload["target_amount"])
self.stopped_at: datetime.datetime = parse_timestamp(payload["stopped_at"])

def __repr__(self) -> str:
return f"<CharityCampaignStop broadcaster={self.broadcaster} id={self.id} name={self.name} stopped_at={self.stopped_at}>"


class ShieldModeBegin(BaseEvent):
subscription_type = "channel.shield_mode.begin"

Expand Down Expand Up @@ -1367,7 +1461,7 @@ def __repr__(self) -> str:

class GoalBegin(BaseEvent):
subscription_type = "channel.goal.begin"

__slots__ = ("id", "broadcaster", "type", "description", "current_amount", "target_amount", "started_at")

def __init__(self, payload: GoalBeginEvent, *, http: HTTPClient) -> None:
Expand Down Expand Up @@ -1395,7 +1489,7 @@ def __repr__(self) -> str:

class GoalProgress(BaseEvent):
subscription_type = "channel.goal.progress"

__slots__ = ("id", "broadcaster", "type", "description", "current_amount", "target_amount", "started_at")

def __init__(self, payload: GoalProgressEvent, *, http: HTTPClient) -> None:
Expand Down Expand Up @@ -1423,7 +1517,7 @@ def __repr__(self) -> str:

class GoalEnd(BaseEvent):
subscription_type = "channel.goal.end"

__slots__ = (
"id",
"broadcaster",
Expand Down
40 changes: 40 additions & 0 deletions twitchio/types_/eventsub.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,10 @@
"ChannelVIPRemoveEvent",
"ChannelWarningAcknowledgeEvent",
"ChannelWarningSendEvent",
"CharityCampaignDonationEvent",
"CharityCampaignStartEvent",
"CharityCampaignProgressEvent",
"CharityCampaignStopEvent",
"ChatAnnouncementData",
"ChatBitsBadgeTierData",
"ChatCharityAmountData",
Expand Down Expand Up @@ -828,6 +832,42 @@ class ChannelWarningSendEvent(BroadcasterModUserEvent):
chat_rules_cited: list[str] | None


class CharityDonationData(TypedDict):
value: int
decimal_places: int
currency: str


class BaseCharityCampaignData(BaseBroadcasterEvent):
id: str
charity_name: str
charity_description: str
charity_logo: str
charity_website: str


class CharityCampaignDonationEvent(BaseCharityCampaignData, BaseUserEvent):
campaign_id: str
amount: CharityDonationData


class CharityCampaignStartEvent(BaseCharityCampaignData):
current_amount: CharityDonationData
target_amount: CharityDonationData
started_at: str


class CharityCampaignProgressEvent(BaseCharityCampaignData):
current_amount: CharityDonationData
target_amount: CharityDonationData


class CharityCampaignStopEvent(BaseCharityCampaignData):
current_amount: CharityDonationData
target_amount: CharityDonationData
stopped_at: str


class GoalBeginEvent(TypedDict):
id: str
broadcaster_user_id: str
Expand Down

0 comments on commit a36e6bb

Please sign in to comment.