diff --git a/itd/client.py b/itd/client.py index 7d36255..f238984 100644 --- a/itd/client.py +++ b/itd/client.py @@ -1,4 +1,3 @@ -# from warnings import deprecated from uuid import UUID from _io import BufferedReader from typing import cast, Iterator @@ -994,8 +993,9 @@ class Client: return File.model_validate(res.json()) + # @deprecated # Этот декоратор появился в 3.13, а наша библиотека поддерживает с 3.9 def update_banner(self, name: str) -> UserProfileUpdate: - """Обновить банер (шорткат из upload_file + update_profile) + """[DEPRECATED] Обновить банер (шорткат из upload_file + update_profile) Args: name (str): Имя файла @@ -1006,6 +1006,19 @@ class Client: id = self.upload_file(name, cast(BufferedReader, open(name, 'rb'))).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 def restore_post(self, post_id: UUID) -> None: """Восстановить удалённый пост @@ -1088,6 +1101,7 @@ class Client: return res.json()['pin'] + @refresh_on_error def stream_notifications(self) -> Iterator[StreamConnect | StreamNotification]: """Слушать SSE поток уведомлений diff --git a/scripts/itd-change-banner.py b/scripts/itd-change-banner.py index 13e3463..36b86bf 100644 --- a/scripts/itd-change-banner.py +++ b/scripts/itd-change-banner.py @@ -1,18 +1,19 @@ #!/usr/bin/env python3 - -import argparse -import os +from argparse import ArgumentParser +from os import getenv +from os.path import isfile import sys + from itd import ITDClient def main(): - parser = argparse.ArgumentParser( + parser = ArgumentParser( description='Upload image and set it as profile banner' ) parser.add_argument( '--token', - default=os.getenv('ITD_TOKEN'), + default=getenv('ITD_TOKEN'), help='API token (or ITD_TOKEN env var)' ) @@ -22,56 +23,33 @@ def main(): help='Path to image file' ) - parser.add_argument( - '--name', - help='Filename on server (default: local filename)' - ) - args = parser.parse_args() if not args.token: print('❌ Токен не задан (--token или ITD_TOKEN)', file=sys.stderr) - sys.exit(1) + quit() file_path = args.file - if not os.path.isfile(file_path): + if not isfile(file_path): print(f'❌ Файл не найден: {file_path}', file=sys.stderr) - sys.exit(1) - - server_name = args.name or os.path.basename(file_path) + quit() try: client = ITDClient(None, args.token) - - # Загружаем файл - 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) + data, _ = client.update_banner_new(file_path) print('✅ Баннер обновлён!') print('📄 Информация о файле:') - print(f' id: {file_id_str}') - print(f' filename: {response.filename}') - print(f' mime_type: {response.mime_type}') - print(f' size: {response.size} bytes') - print(f' url: {response.url}') + print(f' id: {data.id}') + print(f' filename: {data.filename}') + print(f' mime_type: {data.mime_type}') + print(f' size: {data.size} bytes') + print(f' url: {data.url}') except Exception as e: print('❌ Произошла ошибка:', e, file=sys.stderr) - sys.exit(1) + quit() if __name__ == '__main__': diff --git a/scripts/itd-create-post.py b/scripts/itd-create-post.py index 349f17e..c8c9739 100644 --- a/scripts/itd-create-post.py +++ b/scripts/itd-create-post.py @@ -1,18 +1,19 @@ #!/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 def main(): - parser = argparse.ArgumentParser( + parser = ArgumentParser( description='Create a post on ITD via CLI' ) parser.add_argument( '--token', - default=os.getenv('ITD_TOKEN'), + default=getenv('ITD_TOKEN'), help='Refresh token (or set ITD_TOKEN environment variable)' ) @@ -35,46 +36,43 @@ def main(): args = parser.parse_args() if not args.token: - print('❌ Token not provided (--token or ITD_TOKEN)', file=sys.stderr) - sys.exit(1) + print('❌ Token not provided (--token or ITD_TOKEN)') + quit() try: client = ITDClient(None, args.token) file_id = None if args.file: - if not os.path.isfile(args.file): - print(f'❌ File not found: {args.file}', file=sys.stderr) - sys.exit(1) + if not isfile(args.file): + print(f'❌ File not found: {args.file}') + 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: response = client.upload_file(server_name, f) file_id = str(getattr(response, 'id', None)) if not file_id: print('❌ Failed to get file ID') - sys.exit(1) + quit() print(f'✅ File uploaded: {response.filename} (id={file_id})') # Создаём пост с правильным аргументом 'content' 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: post_resp = client.create_post(content=args.text) - # Вывод результата print('✅ Post created successfully!') print(f' id: {post_resp.id}') - if hasattr(post_resp, 'url'): - print(f' url: {post_resp.url}') print(f' text: {args.text}') if file_id: print(f' attached file id: {file_id}') except Exception as e: - print('❌ Error:', e, file=sys.stderr) - sys.exit(1) + print('❌ Error:', e) + quit() if __name__ == '__main__': main()