fix: stylize examples

This commit is contained in:
firedotguy
2026-02-10 15:49:06 +03:00
parent d49fb2d4cb
commit 51518ce0d7
3 changed files with 48 additions and 58 deletions

View File

@@ -1,4 +1,3 @@
# from warnings import deprecated
from uuid import UUID from uuid import UUID
from _io import BufferedReader from _io import BufferedReader
from typing import cast, Iterator from typing import cast, Iterator
@@ -994,8 +993,9 @@ class Client:
return File.model_validate(res.json()) return File.model_validate(res.json())
# @deprecated # Этот декоратор появился в 3.13, а наша библиотека поддерживает с 3.9
def update_banner(self, name: str) -> UserProfileUpdate: def update_banner(self, name: str) -> UserProfileUpdate:
"""Обновить банер (шорткат из upload_file + update_profile) """[DEPRECATED] Обновить банер (шорткат из upload_file + update_profile)
Args: Args:
name (str): Имя файла name (str): Имя файла
@@ -1006,6 +1006,19 @@ class Client:
id = self.upload_file(name, cast(BufferedReader, open(name, 'rb'))).id id = self.upload_file(name, cast(BufferedReader, open(name, 'rb'))).id
return self.update_profile(banner_id=id) return self.update_profile(banner_id=id)
def update_banner_new(self, name: str) -> tuple[File, UserProfileUpdate]:
"""Обновить банер (шорткат из upload_file + update_profile)
Args:
name (str): Имя файла
Returns:
File: Загруженный файл
UserProfileUpdate: Обновленный профиль
"""
file = self.upload_file(name, cast(BufferedReader, open(name, 'rb')))
return file, self.update_profile(banner_id=file.id)
@refresh_on_error @refresh_on_error
def restore_post(self, post_id: UUID) -> None: def restore_post(self, post_id: UUID) -> None:
"""Восстановить удалённый пост """Восстановить удалённый пост
@@ -1088,6 +1101,7 @@ class Client:
return res.json()['pin'] return res.json()['pin']
@refresh_on_error @refresh_on_error
def stream_notifications(self) -> Iterator[StreamConnect | StreamNotification]: def stream_notifications(self) -> Iterator[StreamConnect | StreamNotification]:
"""Слушать SSE поток уведомлений """Слушать SSE поток уведомлений

View File

@@ -1,18 +1,19 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from argparse import ArgumentParser
import argparse from os import getenv
import os from os.path import isfile
import sys import sys
from itd import ITDClient from itd import ITDClient
def main(): def main():
parser = argparse.ArgumentParser( parser = ArgumentParser(
description='Upload image and set it as profile banner' description='Upload image and set it as profile banner'
) )
parser.add_argument( parser.add_argument(
'--token', '--token',
default=os.getenv('ITD_TOKEN'), default=getenv('ITD_TOKEN'),
help='API token (or ITD_TOKEN env var)' help='API token (or ITD_TOKEN env var)'
) )
@@ -22,56 +23,33 @@ def main():
help='Path to image file' help='Path to image file'
) )
parser.add_argument(
'--name',
help='Filename on server (default: local filename)'
)
args = parser.parse_args() args = parser.parse_args()
if not args.token: if not args.token:
print('❌ Токен не задан (--token или ITD_TOKEN)', file=sys.stderr) print('❌ Токен не задан (--token или ITD_TOKEN)', file=sys.stderr)
sys.exit(1) quit()
file_path = args.file file_path = args.file
if not os.path.isfile(file_path): if not isfile(file_path):
print(f'❌ Файл не найден: {file_path}', file=sys.stderr) print(f'❌ Файл не найден: {file_path}', file=sys.stderr)
sys.exit(1) quit()
server_name = args.name or os.path.basename(file_path)
try: try:
client = ITDClient(None, args.token) client = ITDClient(None, args.token)
data, _ = client.update_banner_new(file_path)
# Загружаем файл
with open(file_path, 'rb') as f:
response = client.upload_file(server_name, f)
# Проверяем, что получили id
file_id = getattr(response, 'id', None)
if file_id is None:
print('Не удалось получить id файла')
print(response)
sys.exit(1)
# Преобразуем UUID в строку
file_id_str = str(file_id)
# Обновляем баннер
update_resp = client.update_profile(banner_id=file_id_str)
print('✅ Баннер обновлён!') print('✅ Баннер обновлён!')
print('📄 Информация о файле:') print('📄 Информация о файле:')
print(f' id: {file_id_str}') print(f' id: {data.id}')
print(f' filename: {response.filename}') print(f' filename: {data.filename}')
print(f' mime_type: {response.mime_type}') print(f' mime_type: {data.mime_type}')
print(f' size: {response.size} bytes') print(f' size: {data.size} bytes')
print(f' url: {response.url}') print(f' url: {data.url}')
except Exception as e: except Exception as e:
print('❌ Произошла ошибка:', e, file=sys.stderr) print('❌ Произошла ошибка:', e, file=sys.stderr)
sys.exit(1) quit()
if __name__ == '__main__': if __name__ == '__main__':

View File

@@ -1,18 +1,19 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from uuid import UUID
from argparse import ArgumentParser
from os import getenv
from os.path import isfile, basename
import argparse
import os
import sys
from itd import ITDClient from itd import ITDClient
def main(): def main():
parser = argparse.ArgumentParser( parser = ArgumentParser(
description='Create a post on ITD via CLI' description='Create a post on ITD via CLI'
) )
parser.add_argument( parser.add_argument(
'--token', '--token',
default=os.getenv('ITD_TOKEN'), default=getenv('ITD_TOKEN'),
help='Refresh token (or set ITD_TOKEN environment variable)' help='Refresh token (or set ITD_TOKEN environment variable)'
) )
@@ -35,46 +36,43 @@ def main():
args = parser.parse_args() args = parser.parse_args()
if not args.token: if not args.token:
print('❌ Token not provided (--token or ITD_TOKEN)', file=sys.stderr) print('❌ Token not provided (--token or ITD_TOKEN)')
sys.exit(1) quit()
try: try:
client = ITDClient(None, args.token) client = ITDClient(None, args.token)
file_id = None file_id = None
if args.file: if args.file:
if not os.path.isfile(args.file): if not isfile(args.file):
print(f'❌ File not found: {args.file}', file=sys.stderr) print(f'❌ File not found: {args.file}')
sys.exit(1) quit()
server_name = args.filename or os.path.basename(args.file) server_name = args.filename or basename(args.file)
with open(args.file, 'rb') as f: with open(args.file, 'rb') as f:
response = client.upload_file(server_name, f) response = client.upload_file(server_name, f)
file_id = str(getattr(response, 'id', None)) file_id = str(getattr(response, 'id', None))
if not file_id: if not file_id:
print('❌ Failed to get file ID') print('❌ Failed to get file ID')
sys.exit(1) quit()
print(f'✅ File uploaded: {response.filename} (id={file_id})') print(f'✅ File uploaded: {response.filename} (id={file_id})')
# Создаём пост с правильным аргументом 'content' # Создаём пост с правильным аргументом 'content'
if file_id: if file_id:
post_resp = client.create_post(content=args.text, file_ids=[file_id]) post_resp = client.create_post(content=args.text, attach_ids=[UUID(file_id)])
else: else:
post_resp = client.create_post(content=args.text) post_resp = client.create_post(content=args.text)
# Вывод результата
print('✅ Post created successfully!') print('✅ Post created successfully!')
print(f' id: {post_resp.id}') print(f' id: {post_resp.id}')
if hasattr(post_resp, 'url'):
print(f' url: {post_resp.url}')
print(f' text: {args.text}') print(f' text: {args.text}')
if file_id: if file_id:
print(f' attached file id: {file_id}') print(f' attached file id: {file_id}')
except Exception as e: except Exception as e:
print('❌ Error:', e, file=sys.stderr) print('❌ Error:', e)
sys.exit(1) quit()
if __name__ == '__main__': if __name__ == '__main__':
main() main()