Skip to content

Commit 281a874

Browse files
committed
feat: Implement setting own presence (Active/Cloaked aka. offline)
1 parent bcfc0a7 commit 281a874

3 files changed

Lines changed: 49 additions & 0 deletions

File tree

tests/test_presence.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from httpx import Response
22
import pytest
33

4+
from xbox.webapi.api.provider.presence.models import PresenceState
5+
46
from tests.common import get_response_json
57

68

@@ -44,3 +46,27 @@ async def test_presence_own(respx_mock, xbl_client):
4446
await xbl_client.presence.get_presence_own()
4547

4648
assert route.called
49+
50+
51+
@pytest.mark.asyncio
52+
async def test_presence_own_set(respx_mock, xbl_client):
53+
route = respx_mock.put(
54+
"https://userpresence.xboxlive.com/users/xuid(2669321029139235)/state"
55+
).mock(return_value=Response(200))
56+
57+
ret = await xbl_client.presence.set_presence_own(PresenceState.ACTIVE)
58+
59+
assert route.called
60+
assert ret
61+
62+
63+
@pytest.mark.asyncio
64+
async def test_presence_own_set_fail(respx_mock, xbl_client):
65+
route = respx_mock.put(
66+
"https://userpresence.xboxlive.com/users/xuid(2669321029139235)/state"
67+
).mock(return_value=Response(500))
68+
69+
ret = await xbl_client.presence.set_presence_own(PresenceState.CLOAKED)
70+
71+
assert route.called
72+
assert not ret

xbox/webapi/api/provider/presence/__init__.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
PresenceBatchResponse,
99
PresenceItem,
1010
PresenceLevel,
11+
PresenceState,
1112
)
1213

1314

@@ -91,3 +92,20 @@ async def get_presence_own(
9192
)
9293
resp.raise_for_status()
9394
return PresenceItem(**resp.json())
95+
96+
async def set_presence_own(self, presence_state: PresenceState, **kwargs) -> bool:
97+
"""
98+
Set presence of own profile
99+
100+
Args:
101+
presence_state: State of presence
102+
103+
Returns:
104+
`True` on success, `False` otherwise
105+
"""
106+
url = self.PRESENCE_URL + f"/users/xuid({self.client.xuid})/state"
107+
data = {"state": presence_state.value}
108+
resp = await self.client.session.put(
109+
url, json=data, headers=self.HEADERS_PRESENCE, **kwargs
110+
)
111+
return resp.status_code == 200

xbox/webapi/api/provider/presence/models.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ class PresenceLevel(str, Enum):
1111
ALL = "all"
1212

1313

14+
class PresenceState(str, Enum):
15+
ACTIVE = "Active"
16+
CLOAKED = "Cloaked"
17+
18+
1419
class LastSeen(CamelCaseModel):
1520
device_type: str
1621
title_id: Optional[str]

0 commit comments

Comments
 (0)