Skip to content

Commit

Permalink
feat: update state of players
Browse files Browse the repository at this point in the history
  • Loading branch information
ooliver1 committed Oct 22, 2022
1 parent 6663cf4 commit 6bce46e
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 8 deletions.
2 changes: 2 additions & 0 deletions mafic/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,9 @@ async def _handle_msg(self, data: IncomingMessage) -> None:
_log.error(
"Could not find player for guild %s, discarding event.", guild_id
)
return

player.update_state(data["state"])
# TODO: update player
elif data["op"] == "stats":
# TODO
Expand Down
52 changes: 44 additions & 8 deletions mafic/player.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,27 @@
VoiceServerUpdatePayload,
)
from .node import Node
from .typings import PlayerUpdateState


_log = getLogger(__name__)


class Player(VoiceProtocol):
__slots__ = (
"_connected",
"_guild_id",
"_last_update",
"_node",
"_ping",
"_position",
"_server_state",
"_session_id",
"channel",
"client",
"guild",
)

def __init__(
self,
client: Client,
Expand All @@ -47,11 +62,39 @@ def __init__(
self._session_id: str | None = None
self._server_state: VoiceServerUpdatePayload | None = None
self._connected: bool = False
self._position: int = 0
self._last_update: int = 0
self._ping = 0

@property
def connected(self) -> bool:
return self._connected

@property
def position(self) -> int:
return self._position

@property
def ping(self) -> int:
return self._ping

@property
def node(self) -> Node:
if self._node is None:
_log.warning(
"Unable to use best node, player not connected, finding random node.",
extra={"guild": self._guild_id},
)
return NodePool.get_random_node()

return self._node

def update_state(self, state: PlayerUpdateState) -> None:
self._last_update = state["time"]
self._position = state.get("position", 0)
self._connected = state["connected"]
self._ping = state["ping"]

# If people are so in love with the VoiceClient interface
def is_connected(self):
return self._connected
Expand Down Expand Up @@ -151,14 +194,7 @@ async def destroy(self) -> None:
async def fetch_tracks(
self, query: str, search_type: SearchType | str = SearchType.YOUTUBE
) -> list[Track] | Playlist | None:
if self._node is None:
_log.warning(
"Unable to use best node, player not connected, finding random node.",
extra={"guild": self._guild_id},
)
node = NodePool.get_random_node()
else:
node = self._node
node = self.node

raw_type: str
if isinstance(search_type, SearchType):
Expand Down
4 changes: 4 additions & 0 deletions mafic/typings/incoming.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,12 @@
from .misc import FriendlyWithCause

__all__ = (
"CPU",
"EventPayload",
"FrameStats",
"Memory",
"PlayerUpdatePayload",
"PlayerUpdateState",
"StatsPayload",
"IncomingMessage",
"TrackEndEvent",
Expand Down

0 comments on commit 6bce46e

Please sign in to comment.