Skip to content

Commit 0fbb927

Browse files
committed
Add Shoutout events
Add Shoutout events Also correct Shield names before release.
1 parent b10265a commit 0fbb927

File tree

5 files changed

+135
-21
lines changed

5 files changed

+135
-21
lines changed

docs/changelog.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Master
1515
- Added :func:`~twitchio.PartialUser.fetch_shield_mode_status`
1616
- Added :func:`~twitchio.PartialUser.update_shield_mode_status`
1717
- Added :func:`~twitchio.PartialUser.fetch_followed_streams`
18+
- Added :func:`~twitchio.PartialUser.shoutout`
1819

1920
- Bug fixes
2021
- Fix :func:`~twitchio.PartialUser.fetch_bits_leaderboard` not handling ``started_at`` and :class:`~twitchio.BitsLeaderboard` not correctly parsing
@@ -27,6 +28,9 @@ Master
2728
- Added Shield Status events
2829
- :func:`~twitchio.ext.eventsub.EventSubClient.subscribe_channel_shield_mode_begin`
2930
- :func:`~twitchio.ext.eventsub.EventSubClient.subscribe_channel_shield_mode_end`
31+
- Added Shoutout events
32+
- :func:`~twitchio.ext.eventsub.EventSubClient.subscribe_channel_shoutout_create`
33+
- :func:`~twitchio.ext.eventsub.EventSubClient.subscribe_channel_shoutout_receive`
3034

3135
2.5.0
3236
======

docs/exts/eventsub.rst

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -192,14 +192,22 @@ This is a list of events dispatched by the eventsub ext.
192192

193193
Called when a hype train ends on their channel.
194194

195-
.. function:: event_eventsub_notification_channel_shield_mode_begin(event: ShieldModeBegin)
195+
.. function:: event_eventsub_notification_channel_shield_mode_begin(event: ChannelShieldModeBeginData)
196196

197197
Called when a channel's Shield Mode status is activated.
198198

199-
.. function:: event_eventsub_notification_channel_shield_mode_end(event: ShieldModeEnd)
199+
.. function:: event_eventsub_notification_channel_shield_mode_end(event: ChannelShieldModeEndData)
200200

201201
Called when a channel's Shield Mode status is deactivated.
202202

203+
.. function:: event_eventsub_notification_channel_shoutout_create(event: ChannelShoutoutCreateData)
204+
205+
Called when a channel sends a shoutout.
206+
207+
.. function:: event_eventsub_notification_channel_shoutout_receive(event: ChannelShoutoutReceiveData)
208+
209+
Called when a channel receives a shoutout.
210+
203211
API Reference
204212
--------------
205213

@@ -227,6 +235,30 @@ API Reference
227235
:members:
228236
:inherited-members:
229237

238+
.. attributetable::: ChannelShieldModeBeginData
239+
240+
.. autoclass:: ChannelShieldModeBeginData
241+
:members:
242+
:inherited-members:
243+
244+
.. attributetable::: ChannelShieldModeEndData
245+
246+
.. autoclass:: ChannelShieldModeEndData
247+
:members:
248+
:inherited-members:
249+
250+
.. attributetable::: ChannelShoutoutCreateData
251+
252+
.. autoclass:: ChannelShoutoutCreateData
253+
:members:
254+
:inherited-members:
255+
256+
.. attributetable::: ChannelShoutoutReceiveData
257+
258+
.. autoclass:: ChannelShoutoutReceiveData
259+
:members:
260+
:inherited-members:
261+
230262
.. attributetable::: ChannelSubscribeData
231263
232264
.. autoclass:: ChannelSubscribeData
@@ -395,18 +427,6 @@ API Reference
395427
:members:
396428
:inherited-members:
397429

398-
.. attributetable::: ShieldModeBegin
399-
400-
.. autoclass:: ShieldModeBegin
401-
:members:
402-
:inherited-members:
403-
404-
.. attributetable::: ShieldModeEnd
405-
406-
.. autoclass:: ShieldModeEnd
407-
:members:
408-
:inherited-members:
409-
410430
.. attributetable::: StreamOnlineData
411431
412432
.. autoclass:: StreamOnlineData

twitchio/ext/eventsub/models.py

Lines changed: 82 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1314,7 +1314,7 @@ def __init__(self, client: EventSubClient, data: dict):
13141314
self.ended_at: datetime.datetime = _parse_datetime(data["ended_at"])
13151315

13161316

1317-
class ShieldModeBegin:
1317+
class ChannelShieldModeBeginData(EventData):
13181318
"""
13191319
Represents a Shield Mode activation status.
13201320
@@ -1336,7 +1336,7 @@ def __init__(self, client: EventSubClient, data: dict):
13361336
self.started_at: datetime.datetime = _parse_datetime(data["started_at"])
13371337

13381338

1339-
class ShieldModeEnd:
1339+
class ChannelShieldModeEndData(EventData):
13401340
"""
13411341
Represents a Shield Mode activation status.
13421342
@@ -1358,6 +1358,77 @@ def __init__(self, client: EventSubClient, data: dict):
13581358
self.ended_at: datetime.datetime = _parse_datetime(data["ended_at"])
13591359

13601360

1361+
class ChannelShoutoutCreateData(EventData):
1362+
"""
1363+
Represents a Shoutout event being sent.
1364+
1365+
Requires the ``moderator:read:shoutouts`` or ``moderator:manage:shoutouts`` scope.
1366+
1367+
Attributes
1368+
-----------
1369+
broadcaster: :class:`~twitchio.PartialUser`
1370+
The broadcaster from who sent the shoutout event.
1371+
moderator: :class:`~twitchio.PartialUser`
1372+
The moderator who sent the shoutout event.
1373+
to_broadcaster: :class:`~twitchio.PartialUser`
1374+
The broadcaster who the shoutout was sent to.
1375+
started_at: :class:`datetime.datetime`
1376+
The datetime the shoutout was sent.
1377+
viewer_count: :class:`int`
1378+
The viewer count at the time of the shoutout
1379+
cooldown_ends_at: :class:`datetime.datetime`
1380+
The datetime the broadcaster can send another shoutout.
1381+
target_cooldown_ends_at: :class:`datetime.datetime`
1382+
The datetime the broadcaster can send another shoutout to the same broadcaster.
1383+
"""
1384+
1385+
__slots__ = (
1386+
"broadcaster",
1387+
"moderator",
1388+
"to_broadcaster",
1389+
"started_at",
1390+
"viewer_count",
1391+
"cooldown_ends_at",
1392+
"target_cooldown_ends_at",
1393+
)
1394+
1395+
def __init__(self, client: EventSubClient, data: dict):
1396+
self.broadcaster: PartialUser = _transform_user(client, data, "broadcaster_user")
1397+
self.moderator: PartialUser = _transform_user(client, data, "moderator_user")
1398+
self.to_broadcaster: PartialUser = _transform_user(client, data, "to_broadcaster_user")
1399+
self.started_at: datetime.datetime = _parse_datetime(data["started_at"])
1400+
self.viewer_count: int = data["viewer_count"]
1401+
self.cooldown_ends_at: datetime.datetime = _parse_datetime(data["cooldown_ends_at"])
1402+
self.target_cooldown_ends_at: datetime.datetime = _parse_datetime(data["target_cooldown_ends_at"])
1403+
1404+
1405+
class ChannelShoutoutReceiveData(EventData):
1406+
"""
1407+
Represents a Shoutout event being received.
1408+
1409+
Requires the ``moderator:read:shoutouts`` or ``moderator:manage:shoutouts`` scope.
1410+
1411+
Attributes
1412+
-----------
1413+
broadcaster: :class:`~twitchio.PartialUser`
1414+
The broadcaster receiving shoutout event.
1415+
from_broadcaster: :class:`~twitchio.PartialUser`
1416+
The broadcaster who sent the shoutout.
1417+
started_at: :class:`datetime.datetime`
1418+
The datetime the shoutout was sent.
1419+
viewer_count: :class:`int`
1420+
The viewer count at the time of the shoutout
1421+
"""
1422+
1423+
__slots__ = ("broadcaster", "from_broadcaster", "started_at", "viewer_count")
1424+
1425+
def __init__(self, client: EventSubClient, data: dict):
1426+
self.broadcaster: PartialUser = _transform_user(client, data, "broadcaster_user")
1427+
self.from_broadcaster: PartialUser = _transform_user(client, data, "to_broadcaster_user")
1428+
self.started_at: datetime.datetime = _parse_datetime(data["started_at"])
1429+
self.viewer_count: int = data["viewer_count"]
1430+
1431+
13611432
_DataType = Union[
13621433
ChannelBanData,
13631434
ChannelUnbanData,
@@ -1386,8 +1457,10 @@ def __init__(self, client: EventSubClient, data: dict):
13861457
UserAuthorizationGrantedData,
13871458
UserAuthorizationRevokedData,
13881459
UserUpdateData,
1389-
ShieldModeBegin,
1390-
ShieldModeEnd,
1460+
ChannelShieldModeBeginData,
1461+
ChannelShieldModeEndData,
1462+
ChannelShoutoutCreateData,
1463+
ChannelShoutoutReceiveData,
13911464
]
13921465

13931466

@@ -1433,8 +1506,11 @@ class _SubscriptionTypes(metaclass=_SubTypesMeta):
14331506
channel_goal_progress = "channel.goal.progress", 1, ChannelGoalBeginProgressData
14341507
channel_goal_end = "channel.goal.end", 1, ChannelGoalEndData
14351508

1436-
channel_shield_mode_begin = "channel.shield_mode.begin", 1, ShieldModeBegin
1437-
channel_shield_mode_end = "channel.shield_mode.end", 1, ShieldModeEnd
1509+
channel_shield_mode_begin = "channel.shield_mode.begin", 1, ChannelShieldModeBeginData
1510+
channel_shield_mode_end = "channel.shield_mode.end", 1, ChannelShieldModeEndData
1511+
1512+
channel_shoutout_create = "channel.shoutout.create", 1, ChannelShoutoutCreateData
1513+
channel_shoutout_receive = "channel.shoutout.receive", 1, ChannelShoutoutReceiveData
14381514

14391515
hypetrain_begin = "channel.hype_train.begin", 1, HypeTrainBeginProgressData
14401516
hypetrain_progress = "channel.hype_train.progress", 1, HypeTrainBeginProgressData

twitchio/ext/eventsub/server.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,20 @@ def subscribe_channel_shield_mode_end(
245245
models.SubscriptionTypes.channel_shield_mode_end, broadcaster, moderator
246246
)
247247

248+
def subscribe_channel_shoutout_create(
249+
self, broadcaster: Union[PartialUser, str, int], moderator: Union[PartialUser, str, int]
250+
):
251+
return self._subscribe_with_broadcaster_moderator(
252+
models.SubscriptionTypes.channel_shield_mode_end, broadcaster, moderator
253+
)
254+
255+
def subscribe_channel_shoutout_receive(
256+
self, broadcaster: Union[PartialUser, str, int], moderator: Union[PartialUser, str, int]
257+
):
258+
return self._subscribe_with_broadcaster_moderator(
259+
models.SubscriptionTypes.channel_shield_mode_end, broadcaster, moderator
260+
)
261+
248262
async def subscribe_user_authorization_granted(self):
249263
return await self._http.create_subscription(
250264
models.SubscriptionTypes.user_authorization_grant, {"client_id": self.client._http.client_id}

twitchio/user.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1582,7 +1582,7 @@ async def shoutout(self, token: str, to_broadcaster_id: int, moderator_id: int):
15821582
Parameters
15831583
-----------
15841584
token: :class:`str`
1585-
An oauth user token with the ``moderator:manage:shoutouts``scope.
1585+
An oauth user token with the ``moderator:manage:shoutouts`` scope.
15861586
to_broadcaster: :class:`int`
15871587
The ID of the broadcaster that is recieving the shoutout.
15881588
moderator_id: :class:`int`

0 commit comments

Comments
 (0)