Skip to content

Commit

Permalink
ChannelFollower/Followed http and models
Browse files Browse the repository at this point in the history
  • Loading branch information
chillymosh committed Apr 1, 2024
1 parent 9ab7b29 commit 6719e0a
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 1 deletion.
53 changes: 52 additions & 1 deletion twitchio/http.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,16 @@

from . import __version__
from .exceptions import HTTPException
from .models import Clip, ExtensionTransaction, Game, SearchChannel, Stream, Video
from .models import (
ChannelFollowedEvent,
ChannelFollowerEvent,
Clip,
ExtensionTransaction,
Game,
SearchChannel,
Stream,
Video,
)
from .utils import _from_json # type: ignore


Expand All @@ -52,6 +61,8 @@
AdSchedulePayload,
BitsLeaderboardPayload,
ChannelEditorsPayload,
ChannelFollowedResponse,
ChannelFollowerResponse,
ChannelInfoPayload,
ChatBadgePayload,
ChatterColorPayload,
Expand Down Expand Up @@ -708,3 +719,43 @@ async def get_channel_editors(self, broadcaster_id: str | int, token_for: str) -
params = {"broadcaster_id": broadcaster_id}
route: Route = Route("GET", "channels/editors", params=params, token_for=token_for)
return await self.request_json(route)

async def get_followed_channels(
self,
user_id: str | int,
token_for: str,
broadcaster_id: str | int | None = None,
first: int = 20,
) -> HTTPAsyncIterator[ChannelFollowedEvent]:
params = {"first": first, "user_id": user_id}

if broadcaster_id is not None:
params["broadcaster_id"] = broadcaster_id

route = Route("GET", "channels/followed", params=params, token_for=token_for)

async def converter(data: ChannelFollowedResponse) -> ChannelFollowedEvent:
return ChannelFollowedEvent(data)

iterator = self.request_paginated(route, converter=converter)
return iterator

async def get_channel_followers(
self,
broadcaster_id: str | int,
token_for: str,
user_id: str | int | None = None,
first: int = 20,
) -> HTTPAsyncIterator[ChannelFollowerEvent]:
params = {"first": first, "broadcaster_id": broadcaster_id}

if user_id is not None:
params["user_id"] = broadcaster_id

route = Route("GET", "channels/followers", params=params, token_for=token_for)

async def converter(data: ChannelFollowerResponse) -> ChannelFollowerEvent:
return ChannelFollowerEvent(data)

iterator = self.request_paginated(route, converter=converter)
return iterator
42 changes: 42 additions & 0 deletions twitchio/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@
BitsLeaderboardResponse,
CCLResponse,
ChannelEditorsResponse,
ChannelFollowedResponse,
ChannelFollowerResponse,
ChannelInfoResponse,
ChatBadgeSetResponse,
ChatBadgeVersionResponse,
Expand Down Expand Up @@ -71,6 +73,8 @@
"ChatBadge",
"ChatBadgeVersions",
"ChannelEditor",
"ChannelFollowedEvent",
"ChannelFollowerEvent",
"CheerEmoteTier",
"CheerEmote",
"Clip",
Expand Down Expand Up @@ -206,6 +210,44 @@ def __repr__(self) -> str:
return f"<ChannelEditor user={self.user} created_at={self.created_at}>"


class ChannelFollowedEvent:
"""
Represents a ChannelFollowedEvent
Attributes
-----------
broadcaster: twitchio.PartialUser
PartialUser that identifies the channel that this user is following.
followed_at: datetime.datetime
The datetime of when the user followed the channel.
"""

__slots__ = ("broadcaster", "followed_at")

def __init__(self, data: ChannelFollowedResponse) -> None:
self.broadcaster = PartialUser(data["broadcaster_id"], data["broadcaster_login"])
self.followed_at = parse_timestamp(data["followed_at"])


class ChannelFollowerEvent:
"""
Represents a ChannelFollowerEvent
Attributes
-----------
broadcaster: twitchio.PartialUser
PartialUser that identifies a user that follows this channel.
followed_at: datetime.datetime
The datetime of when the user followed the channel.
"""

__slots__ = ("user", "followed_at")

def __init__(self, data: ChannelFollowerResponse) -> None:
self.user = PartialUser(data["user_id"], data["user_login"])
self.followed_at = parse_timestamp(data["followed_at"])


class ChannelInfo:
"""
Represents a channel's current information
Expand Down
28 changes: 28 additions & 0 deletions twitchio/types_/responses.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@
"ChatterColorPayload",
"ChannelEditorsResponse",
"ChannelEditorsPayload",
"ChannelFollowedResponse",
"ChannelFollowedPayload",
"ChannelFollowerResponse",
"ChannelFollowerPayload",
"ChannelInfoResponse",
"ChannelInfoPayload",
"CheerEmoteTierResponse",
Expand Down Expand Up @@ -179,6 +183,20 @@ class ChannelEditorsResponse(TypedDict):
created_at: str


class ChannelFollowedResponse(TypedDict):
broadcaster_id: str
broadcaster_login: str
broadcaster_name: str
followed_at: str


class ChannelFollowerResponse(TypedDict):
user_id: str
user_login: str
user_name: str
followed_at: str


class ChannelInfoResponse(TypedDict):
broadcaster_id: str
broadcaster_login: str
Expand Down Expand Up @@ -379,6 +397,16 @@ class BitsLeaderboardPayload(TypedDict):
total: int


class ChannelFollowedPayload(TypedDict):
data: list[ChannelFollowedResponse]
pagination: Pagination


class ChannelFollowerPayload(TypedDict):
data: list[ChannelFollowerResponse]
pagination: Pagination


class ExtensionTransactionPayload(TypedDict):
data: list[ExtensionTransactionResponse]
pagination: Pagination
Expand Down

0 comments on commit 6719e0a

Please sign in to comment.