From bbb3f18f421e7d07af3249b07485d878ef737be6 Mon Sep 17 00:00:00 2001 From: Zomatree Date: Wed, 30 Mar 2022 19:00:02 +0100 Subject: [PATCH] add edit self --- revolt/client.py | 59 +++++++++++++++++++++++++++++++++++++++++++++ revolt/http.py | 24 ++++++++++++++++++ revolt/state.py | 8 +++--- revolt/websocket.py | 6 +---- 4 files changed, 88 insertions(+), 9 deletions(-) diff --git a/revolt/client.py b/revolt/client.py index de159ae..64c64cb 100755 --- a/revolt/client.py +++ b/revolt/client.py @@ -13,6 +13,7 @@ from .invite import Invite from .message import Message from .state import State from .websocket import WebsocketHandler +from .utils import Missing try: import ujson as json @@ -285,3 +286,61 @@ class Client: return message raise LookupError + + async def edit_self(self, **kwargs): + """Edits the client's own user + + Parameters + ----------- + avatar: Optional[:class:`File`] + The avatar to change to, passing in ``None`` will remove the avatar + """ + if kwargs.get("avatar", Missing) == None: + del kwargs["avatar"] + remove = "Avatar" + else: + remove = None + + await self.state.http.edit_self(remove, kwargs) + + async def edit_status(self, **kwargs): + """Edits the client's own status + + Parameters + ----------- + presence: :class:`PresenceType` + The presence to change to + text: Optional[:class:`str`] + The text to change the status to, passing in ``None`` will remove the status + """ + if kwargs.get("text", Missing) == None: + del kwargs["text"] + remove = "StatusText" + else: + remove = None + + if presence := kwargs.get("presence"): + kwargs["presence"] = presence.value + + await self.state.http.edit_self(remove, {"status": kwargs}) + + async def edit_profile(self, **kwargs): + """Edits the client's own profile + + Parameters + ----------- + content: Optional[:class:`str`] + The new content for the profile, passing in ``None`` will remove the profile content + background: Optional[:class:`File`] + The new background for the profile, passing in ``None`` will remove the profile background + """ + if kwargs.get("content", Missing) == None: + del kwargs["content"] + remove = "ProfileContent" + elif kwargs.get("background", Missing) == None: + del kwargs["background"] + remove = "ProfileBackground" + else: + remove = None + + await self.state.http.edit_self(remove, {"profile": kwargs}) diff --git a/revolt/http.py b/revolt/http.py index b79bc84..ce22e7d 100755 --- a/revolt/http.py +++ b/revolt/http.py @@ -6,6 +6,8 @@ from typing import (TYPE_CHECKING, Any, Coroutine, Literal, Optional, TypeVar, import aiohttp import ulid +from revolt.utils import Missing + from .errors import HTTPError, ServerError from .file import File @@ -388,3 +390,25 @@ class HttpClient: values["remove"] = remove return self.request("PATCH", f"/servers/{server_id}/roles/{role_id}", json=values) + + async def edit_self(self, remove: Optional[str], values: dict[str, Any]): + if remove: + values["remove"] = remove + + if avatar := values.get("avatar"): + asset = await self.upload_file(avatar, "avatars") + values["avatar"] = asset["id"] + + if profile := values.get("profile"): + if background := profile.background(): + asset = await self.upload_file(background, "backgrounds") + profile["background"] = asset["id"] + + if not values.get("profile", Missing): + del values["profile"] + + if not values.get("status", Missing): + del values["status"] + + print(remove, values) + return await self.request("PATCH", "/users/@me", json=values) diff --git a/revolt/state.py b/revolt/state.py index 6242d85..4bc0a25 100755 --- a/revolt/state.py +++ b/revolt/state.py @@ -73,7 +73,7 @@ class State: message = Message(payload, self) if len(self.messages) >= self.max_messages: self.messages.pop() - + self.messages.appendleft(message) return message @@ -81,15 +81,15 @@ class State: for msg in self.messages: if msg.id == message_id: return msg - + raise KeyError async def fetch_all_server_members(self): for server_id in self.servers.keys(): data = await self.http.fetch_members(server_id) - + for user in data["users"]: self.add_user(user) - + for member in data["members"]: self.add_member(server_id, member) diff --git a/revolt/websocket.py b/revolt/websocket.py index 74c682b..23f550c 100755 --- a/revolt/websocket.py +++ b/revolt/websocket.py @@ -276,11 +276,7 @@ class WebsocketHandler: user.profile = UserProfile(profile.content, None) elif clear == "StatusText": - # user.status will never be None because they are trying to remove the text - if user.status.presence is None: # type: ignore - user.status = None - else: - user.status = Status(None, user.status.presence) # type: ignore + user.status = Status(None, user.status.presence if user.status else None) elif clear == "Avatar": user.original_avatar = None