feat: update privacy data

This commit is contained in:
firedotguy
2026-02-12 23:40:59 +03:00
parent 62730b48e9
commit b3b109613b
5 changed files with 64 additions and 8 deletions

View File

@@ -8,7 +8,7 @@ from time import sleep
from requests.exceptions import ConnectionError, HTTPError
from sseclient import SSEClient
from itd.routes.users import get_user, update_profile, follow, unfollow, get_followers, get_following, update_privacy
from itd.routes.users import get_user, update_profile, follow, unfollow, get_followers, get_following, update_privacy, update_privacy_new
from itd.routes.etc import get_top_clans, get_who_to_follow, get_platform_status
from itd.routes.comments import get_comments, add_comment, delete_comment, like_comment, unlike_comment, add_reply_comment, get_replies
from itd.routes.hashtags import get_hashtags, get_posts_by_hashtag
@@ -26,7 +26,7 @@ from itd.models.notification import Notification
from itd.models.post import Post, NewPost, PollData, Poll
from itd.models.clan import Clan
from itd.models.hashtag import Hashtag
from itd.models.user import User, UserProfileUpdate, UserPrivacy, UserFollower, UserWhoToFollow
from itd.models.user import User, UserProfileUpdate, UserPrivacy, UserFollower, UserWhoToFollow, UserPrivacyData
from itd.models.pagination import Pagination, PostsPagintaion, LikedPostsPagintaion
from itd.models.verification import Verification, VerificationStatus
from itd.models.report import NewReport
@@ -194,7 +194,7 @@ class Client:
@refresh_on_error
def update_privacy(self, wall_closed: bool = False, private: bool = False) -> UserPrivacy:
"""Обновить настройки приватности
"""(УСТАРЕЛО! Используйте update_privacy_new) настройки приватности
Args:
wall_closed (bool, optional): Закрыть стену. Defaults to False.
@@ -208,6 +208,21 @@ class Client:
return UserPrivacy.model_validate(res.json())
@refresh_on_error
def update_privacy_new(self, privacy: UserPrivacyData) -> UserPrivacy:
"""Обновить настройки приватности
Args:
privacy (UserPrivacyData): Данные приватности
Returns:
UserPrivacy: Обновленные данные приватности
"""
res = update_privacy_new(self.token, privacy)
res.raise_for_status()
return UserPrivacy.model_validate(res.json())
@refresh_on_error
def follow(self, username: str) -> int:
"""Подписаться на пользователя
@@ -615,7 +630,6 @@ class Client:
res = mark_all_as_read(self.token)
res.raise_for_status()
@refresh_on_error
def get_unread_notifications_count(self) -> int:
"""Получить количество непрочитанных уведомлений

View File

@@ -33,3 +33,10 @@ class AttachType(Enum):
class PostsTab(Enum):
FOLLOWING = 'following'
POPULAR = 'popular'
class AccessType(Enum):
"""Типы разрешений для видимости лайков и записей на стене"""
NOBODY = 'nobody' # никто
MUTUAL = 'mutual' # взаимные
FOLLOWERS = 'followers' # подписчики
EVERYONE = 'everyone' # все

View File

@@ -74,6 +74,7 @@ class _Post(_PostShort):
is_reposted: bool = Field(False, alias='isReposted')
is_viewed: bool = Field(False, alias='isViewed')
is_owner: bool = Field(False, alias='isOwner')
is_pinned: bool = Field(False, alias='isPinned') # only for user wall
attachments: list[PostAttach] = []
comments: list[Comment] = []

View File

@@ -4,13 +4,41 @@ from datetime import datetime
from pydantic import BaseModel, Field
from itd.models.pin import ShortPin
from itd.enums import AccessType
class UserPrivacy(BaseModel):
class _UserPrivacy(BaseModel):
private: bool | None = Field(None, alias='isPrivate') # none for not me
wall_closed: bool = Field(False, alias='wallClosed')
wall_closed: bool | None = Field(None, alias='wallClosed', deprecated=True)
wall_access: AccessType = Field(AccessType.EVERYONE, alias='wallAccess')
likes_visibility: AccessType = Field(AccessType.EVERYONE, alias='likesVisibility')
model_config = {'populate_by_name': True}
model_config = {'serialize_by_alias': True}
class UserPrivacy(_UserPrivacy):
show_last_seen: bool = Field(True, alias='showLastSeen')
class UserPrivacyData:
def __init__(self, private: bool | None = None, wall_access: AccessType | None = None, likes_visibility: AccessType | None = None, show_last_seen: bool | None = None) -> None:
self.private = private
self.wall_access = wall_access
self.likes_visibility = likes_visibility
self.show_last_seen = show_last_seen
def to_dict(self):
data = {}
if self.private is not None:
data['isPrivate'] = self.private
if self.wall_access is not None:
data['wallAccess'] = self.wall_access.value
if self.likes_visibility is not None:
data['likesVisibility'] = self.likes_visibility.value
if self.show_last_seen is not None:
data['showLastSeen'] = self.show_last_seen
return data
class UserProfileUpdate(BaseModel):
@@ -51,7 +79,7 @@ class UserSearch(UserFollower, UserWhoToFollow):
pass
class User(UserSearch, UserPrivacy):
class User(UserSearch, _UserPrivacy):
banner: str | None = None
bio: str | None = None
pinned_post_id: UUID | None = Field(None, alias='pinnedPostId')
@@ -62,3 +90,5 @@ class User(UserSearch, UserPrivacy):
is_followed: bool | None = Field(None, alias='isFollowedBy') # none for me
created_at: datetime = Field(alias='createdAt')
last_seen_at: datetime | None = Field(None, alias='lastSeen')
online: bool = False

View File

@@ -1,6 +1,7 @@
from uuid import UUID
from itd.request import fetch
from itd.models.user import UserPrivacyData
def get_user(token: str, username: str):
@@ -26,6 +27,9 @@ def update_privacy(token: str, wall_closed: bool = False, private: bool = False)
data['isPrivate'] = private
return fetch(token, 'put', 'users/me/privacy', data)
def update_privacy_new(token: str, privacy: UserPrivacyData):
return fetch(token, 'put', 'users/me/privacy', privacy.to_dict())
def follow(token: str, username: str):
return fetch(token, 'post', f'users/{username}/follow')