ifa-nextcloud 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,560 @@
1
+ Metadata-Version: 2.4
2
+ Name: ifa_nextcloud
3
+ Version: 0.1.1
4
+ Summary: Python библиотека для создания ботов в Nextcloud Talk с API, похожим на python-telegram-bot
5
+ Project-URL: Homepage, https://github.com/ifake/nextcloud
6
+ Project-URL: Repository, https://github.com/ifake/nextcloud.git
7
+ Project-URL: Issues, https://github.com/ifake/nextcloud/issues
8
+ Author-email: ifake <your@email.com>
9
+ License: MIT
10
+ License-File: LICENSE
11
+ Keywords: bot,chat,ifa,messaging,nextcloud,talk
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Requires-Python: >=3.10
19
+ Requires-Dist: loguru>=0.6.0
20
+ Requires-Dist: requests>=2.25.0
21
+ Description-Content-Type: text/markdown
22
+
23
+ # Nextcloud Talk Bot
24
+
25
+ Python библиотека для создания ботов в Nextcloud Talk с API, похожим на python-telegram-bot.
26
+
27
+ ## Возможности
28
+
29
+ - 🚀 **Простой API** — интерфейс, похожий на python-telegram-bot
30
+ - 📝 **Отправка сообщений** с поддержкой Markdown
31
+ - 📎 **Отправка файлов** (документы, фото, любые вложения)
32
+ - 🔄 **Автоматическое управление членством** в комнатах
33
+ - 💬 **Поддержка threading и ответов на сообщения**
34
+ - 🔌 **Автоматическое определение версии API** (v1-v4)
35
+ - 🛡️ **Автоматическая переавторизация** при ошибках
36
+ - 📡 **Polling режим** для получения сообщений
37
+
38
+ ## Требования
39
+
40
+ - Python 3.7+
41
+ - Nextcloud 33.x и выше (с установленным приложением Talk)
42
+ - Аккаунт бота в Nextcloud (рекомендуется использовать токен приложения)
43
+
44
+ ## Установка
45
+
46
+ ### Из исходного кода
47
+
48
+ ```bash
49
+ git clone https://github.com/your-username/nextcloud-talk-bot.git
50
+ cd nextcloud-talk-bot
51
+ pip install -r requirements.txt
52
+ ```
53
+
54
+ ### Использование как библиотеки
55
+
56
+ Скопируйте папку `core/` в ваш проект или установите как модуль:
57
+
58
+ ```python
59
+ # Просто скопируйте файлы в ваш проект
60
+ from nextcloudbot import Bot
61
+ ```
62
+
63
+ ## Быстрый старт
64
+
65
+ ### Минимальный пример
66
+
67
+ ```python
68
+ from nextcloudbot import Bot
69
+
70
+ # Создаем бота
71
+ bot = Bot(
72
+ host="https://nextcloud.example.com",
73
+ user="bot_user",
74
+ password="your-app-token", # или пароль
75
+ default_room="room_token_here"
76
+ )
77
+
78
+ # Отправляем сообщение
79
+ bot.send_message("Hello, World!")
80
+
81
+ # Запускаем получение сообщений
82
+ bot.run_polling()
83
+ ```
84
+
85
+ ### Бот с обработкой команд
86
+
87
+ ```python
88
+ from nextcloudbot import Bot
89
+
90
+ bot = Bot(
91
+ host="https://nextcloud.example.com",
92
+ user="my_bot",
93
+ password="app-xxxxx",
94
+ default_room="room_token"
95
+ )
96
+
97
+ # Обработчик команды /start
98
+ @bot.command("start")
99
+ def start_command(update, context):
100
+ update.message.reply_text("👋 Привет! Я бот для Nextcloud Talk!")
101
+
102
+ # Обработчик команды /help
103
+ @bot.command("help")
104
+ def help_command(update, context):
105
+ help_text = """
106
+ 🤖 **Доступные команды:**
107
+ /start - Приветствие
108
+ /help - Эта справка
109
+ /echo <текст> - Повторить сообщение
110
+ """
111
+ update.message.reply_text(help_text)
112
+
113
+ # Обработчик команды /echo
114
+ @bot.command("echo")
115
+ def echo_command(update, context):
116
+ # Получаем текст после команды
117
+ text = update.message.text.replace("/echo", "").strip()
118
+ if text:
119
+ update.message.reply_text(f"🔊 {text}")
120
+ else:
121
+ update.message.reply_text("❌ Напишите что-нибудь после /echo")
122
+
123
+ # Обработчик всех текстовых сообщений
124
+ @bot.message_handler
125
+ def handle_message(update, context):
126
+ message = update.message
127
+ user = message.from_user
128
+ print(f"Получено сообщение от {user.full_name}: {message.text}")
129
+ message.reply_text(f"Получил: {message.text}")
130
+
131
+ # Запускаем бота
132
+ if __name__ == "__main__":
133
+ bot.run_polling()
134
+ ```
135
+
136
+ ## Отправка сообщений
137
+
138
+ ### Текстовые сообщения
139
+
140
+ ```python
141
+ # Простой текст
142
+ bot.send_message("Hello, World!")
143
+
144
+ # Markdown форматирование
145
+ bot.send_message("**Жирный текст** и *курсив*")
146
+
147
+ # Ответ на сообщение
148
+ bot.send_message(
149
+ chat_id="room_token", # optional
150
+ text="Это ответ на ваше сообщение",
151
+ reply_to_message_id=12345
152
+ )
153
+ ```
154
+
155
+ ### Отправка файлов
156
+
157
+ ```python
158
+ # Отправить файл с подписью
159
+ bot.send_message(
160
+ chat_id="room_token", # optional
161
+ text="Смотрите документ",
162
+ file_path="/path/to/document.pdf"
163
+ )
164
+
165
+ # Отправить фото
166
+ bot.send_file("/path/to/photo.jpg", caption="Красивый закат")
167
+
168
+ # Или через метод send_photo
169
+ bot.send_photo(
170
+ "room_token", # optional
171
+ "/path/to/photo.jpg",
172
+ caption="Красивый закат"
173
+ )
174
+
175
+ # Отправить документ
176
+ bot.send_document(
177
+ "room_token", # optional
178
+ "/path/to/report.pdf",
179
+ caption="Ежемесячный отчет"
180
+ )
181
+
182
+ # Отправить файл из памяти (например, сгенерированный)
183
+ import io
184
+
185
+ # Создаем файл в памяти
186
+ file_content = b"Hello, this is a text file!"
187
+ bot.send_message(
188
+ chat_id="room_token", # optional
189
+ text="Сгенерированный файл",
190
+ file_content=file_content,
191
+ file_name="hello.txt",
192
+ mime_type="text/plain"
193
+ )
194
+
195
+ # Отправить файл из BytesIO
196
+ from io import BytesIO
197
+
198
+ buffer = BytesIO()
199
+ buffer.write(b"Some data")
200
+ buffer.seek(0)
201
+
202
+ bot.send_document(
203
+ "room_token", # optional
204
+ buffer,
205
+ caption="Данные из буфера"
206
+ )
207
+ ```
208
+
209
+ ## Работа с сообщениями
210
+
211
+ ### Получение сообщений через polling
212
+
213
+ ```python
214
+ # Запускаем получение сообщений
215
+ bot.run_polling(chat_id="room_token", poll_interval=2)
216
+
217
+ # Параметры:
218
+ # - chat_id: токен комнаты (если не указан, используется default_room)
219
+ # - poll_interval: интервал опроса в секундах (по умолчанию 2)
220
+ ```
221
+
222
+ ### Объект Message
223
+
224
+ При получении сообщения вы получаете объект `Message` со следующими атрибутами:
225
+
226
+ ```python
227
+ @bot.message_handler
228
+ def handle_message(update, context):
229
+ message = update.message
230
+
231
+ # Основные атрибуты
232
+ print(f"ID: {message.message_id}")
233
+ print(f"Текст: {message.text}")
234
+ print(f"От: {message.from_user.full_name}")
235
+ print(f"Время: {message.date}")
236
+
237
+ # Ответить на сообщение
238
+ message.reply_text("Получил ваше сообщение!")
239
+
240
+ # Или использовать метод reply (алиас)
241
+ message.reply("Тоже самое")
242
+ ```
243
+
244
+ ## Управление комнатами
245
+
246
+ ### Присоединение к комнате
247
+
248
+ ```python
249
+ # Автоматическое присоединение при запуске
250
+ bot = Bot(
251
+ host="https://nextcloud.example.com",
252
+ user="bot_user",
253
+ password="password",
254
+ default_room="room_token",
255
+ auto_join_room=True # По умолчанию True
256
+ )
257
+
258
+ # Ручное присоединение
259
+ bot.join_room("room_token", password="room_password")
260
+ ```
261
+
262
+ ### Получение информации о комнатах
263
+
264
+ ```python
265
+ # Список всех доступных комнат
266
+ rooms = bot.get_rooms()
267
+ for room in rooms:
268
+ print(f"Комната: {room.get('name')} ({room.get('token')})")
269
+ print(f"Участников: {room.get('participantCount')}")
270
+
271
+ # Информация о конкретной комнате
272
+ room_info = bot.get_room_info("room_token")
273
+ print(f"Название: {room_info.get('name')}")
274
+ print(f"Тип: {room_info.get('type')}")
275
+
276
+ # Список участников
277
+ participants = bot.get_room_participants("room_token")
278
+ for p in participants:
279
+ print(f"Участник: {p.get('actorDisplayName')}")
280
+ ```
281
+
282
+ ## Диагностика
283
+
284
+ ### Проверка подключения
285
+
286
+ ```python
287
+ # Проверка статуса сессии
288
+ status = bot.check_session_status()
289
+ if status['authenticated']:
290
+ print(f"✅ Подключен как: {status['user']}")
291
+ else:
292
+ print("❌ Ошибка аутентификации")
293
+
294
+ # Диагностика доступа к комнате
295
+ diagnostic = bot.diagnose_room_access("room_token")
296
+ print(json.dumps(diagnostic, indent=2, ensure_ascii=False))
297
+ ```
298
+
299
+ ### Логирование
300
+
301
+ Библиотека использует `loguru` для логирования. Вы можете настроить уровень логирования:
302
+
303
+ ```python
304
+ from loguru import logger
305
+
306
+ # Установка уровня логирования
307
+ logger.remove() # Удаляем стандартный обработчик
308
+ logger.add(sys.stderr, level="INFO") # Только INFO и выше
309
+ # или
310
+ logger.add(sys.stderr, level="DEBUG") # Подробное логирование
311
+ ```
312
+
313
+ ## Конфигурация
314
+
315
+ ### Параметры Bot
316
+
317
+ | Параметр | Тип | По умолчанию | Описание |
318
+ |----------|-----|--------------|------------------------------------------------------------------|
319
+ | `host` | str | - | URL Nextcloud сервера |
320
+ | `user` | str | - | Имя пользователя бота |
321
+ | `password` | str | - | Пароль или токен приложения |
322
+ | `default_room` | str | None | Токен комнаты по умолчанию |
323
+ | `read_all_chat` | bool | False | Читать всю историю (c новых к старым) или только новые сообщения |
324
+ | `auto_join_room` | bool | True | Автоматически присоединяться к комнатам |
325
+
326
+
327
+ ## Примеры
328
+
329
+ ### Простой эхо-бот
330
+
331
+ ```python
332
+ from core.nextcloud import Bot
333
+
334
+ bot = Bot(
335
+ host="https://nextcloud.example.com",
336
+ user="echo_bot",
337
+ password="app-xxxxx",
338
+ default_room="room_token"
339
+ )
340
+
341
+ @bot.message_handler
342
+ def echo(update, context):
343
+ message = update.message
344
+ if message.text:
345
+ message.reply_text(f"🔊 Эхо: {message.text}")
346
+ else:
347
+ message.reply_text("Напишите текст, я его повторю!")
348
+
349
+ bot.run_polling()
350
+ ```
351
+
352
+ ### Бот для отправки уведомлений
353
+
354
+ ```python
355
+ import time
356
+ from core.nextcloud import Bot
357
+
358
+ class NotificationBot:
359
+ def __init__(self, host, user, password, room_token):
360
+ self.bot = Bot(
361
+ host=host,
362
+ user=user,
363
+ password=password,
364
+ default_room=room_token
365
+ )
366
+ self.room = room_token
367
+
368
+ def send_notification(self, title, message, priority="info"):
369
+ """Отправить уведомление в чат"""
370
+ emoji = {
371
+ "info": "ℹ️",
372
+ "success": "✅",
373
+ "warning": "⚠️",
374
+ "error": "❌"
375
+ }.get(priority, "📢")
376
+
377
+ text = f"{emoji} **{title}**\n{message}"
378
+ self.bot.send_message(self.room, text)
379
+
380
+ def send_file_notification(self, title, file_path, message=None):
381
+ """Отправить уведомление с файлом"""
382
+ full_text = f"📎 **{title}**"
383
+ if message:
384
+ full_text += f"\n{message}"
385
+
386
+ self.bot.send_message(
387
+ chat_id=self.room,
388
+ text=full_text,
389
+ file_path=file_path
390
+ )
391
+
392
+ # Использование
393
+ notifier = NotificationBot(
394
+ host="https://nextcloud.example.com",
395
+ user="notifier",
396
+ password="app-xxxxx",
397
+ room_token="room_token"
398
+ )
399
+
400
+ notifier.send_notification("Система", "Резервное копирование завершено", "success")
401
+ notifier.send_file_notification("Отчет", "/tmp/report.pdf", "Ежемесячный отчет готов")
402
+ ```
403
+
404
+ ### Бот с обработкой команд
405
+
406
+ ```python
407
+ from core.nextcloud import Bot
408
+ from datetime import datetime
409
+
410
+ bot = Bot(
411
+ host="https://nextcloud.example.com",
412
+ user="helper_bot",
413
+ password="app-xxxxx",
414
+ default_room="room_token"
415
+ )
416
+
417
+ # Хранилище данных пользователей
418
+ user_data = {}
419
+
420
+ @bot.command("start")
421
+ def cmd_start(update, context):
422
+ user = update.message.from_user
423
+ update.message.reply_text(
424
+ f"👋 Привет, {user.first_name}!\n"
425
+ "Я бот-помощник. Доступные команды:\n"
426
+ "/time - текущее время\n"
427
+ "/ping - проверить работу\n"
428
+ "/note <текст> - сохранить заметку\n"
429
+ "/mynote - показать заметку"
430
+ )
431
+
432
+ @bot.command("time")
433
+ def cmd_time(update, context):
434
+ now = datetime.now().strftime("%d.%m.%Y %H:%M:%S")
435
+ update.message.reply_text(f"🕐 Текущее время: {now}")
436
+
437
+ @bot.command("ping")
438
+ def cmd_ping(update, context):
439
+ update.message.reply_text("🏓 Pong!")
440
+
441
+ @bot.command("note")
442
+ def cmd_note(update, context):
443
+ user_id = update.message.from_user.id
444
+ text = update.message.text.replace("/note", "").strip()
445
+
446
+ if text:
447
+ user_data[user_id] = text
448
+ update.message.reply_text("✅ Заметка сохранена!")
449
+ else:
450
+ update.message.reply_text("❌ Напишите текст заметки после /note")
451
+
452
+ @bot.command("mynote")
453
+ def cmd_mynote(update, context):
454
+ user_id = update.message.from_user.id
455
+ note = user_data.get(user_id)
456
+
457
+ if note:
458
+ update.message.reply_text(f"📝 Ваша заметка:\n{note}")
459
+ else:
460
+ update.message.reply_text("📭 У вас нет сохраненных заметок")
461
+
462
+ @bot.message_handler
463
+ def handle_unknown(update, context):
464
+ text = update.message.text
465
+ if text:
466
+ update.message.reply_text(
467
+ f"Неизвестная команда. Напишите /help для списка команд."
468
+ )
469
+
470
+ if __name__ == "__main__":
471
+ bot.run_polling()
472
+ ```
473
+
474
+ ## API Reference
475
+
476
+ ### Bot
477
+
478
+ #### Методы отправки
479
+
480
+ | Метод | Описание |
481
+ |-------|----------|
482
+ | `send_message(chat_id, text, ...)` | Универсальный метод отправки (текст/файлы) |
483
+ | `send_file(chat_id, file_path, caption, ...)` | Отправить файл |
484
+ | `send_photo(chat_id, photo, caption, ...)` | Отправить фото |
485
+ | `send_document(chat_id, document, caption, ...)` | Отправить документ |
486
+
487
+ #### Управление комнатами
488
+
489
+ | Метод | Описание |
490
+ |-------|----------|
491
+ | `join_room(chat_id, password)` | Присоединиться к комнате |
492
+ | `get_rooms()` | Получить список всех комнат |
493
+ | `get_room_info(chat_id)` | Получить информацию о комнате |
494
+ | `get_room_participants(chat_id)` | Получить список участников |
495
+
496
+ #### Диагностика
497
+
498
+ | Метод | Описание |
499
+ |-------|----------|
500
+ | `check_session_status()` | Проверить статус сессии |
501
+ | `diagnose_room_access(chat_id)` | Диагностика доступа к комнате |
502
+
503
+ ### Message
504
+
505
+ | Атрибут/Метод | Описание |
506
+ |---------------|----------|
507
+ | `message_id` | ID сообщения |
508
+ | `text` | Текст сообщения |
509
+ | `from_user` | Объект User (отправитель) |
510
+ | `chat` | Объект Chat (комната) |
511
+ | `date` | Время отправки |
512
+ | `reply_to_message` | Ответ на сообщение (если есть) |
513
+ | `reply_text(text)` | Ответить на сообщение |
514
+ | `reply(text)` | Алиас для reply_text |
515
+
516
+ ## Устранение неполадок
517
+
518
+ ### Ошибка аутентификации
519
+
520
+ ```python
521
+ # Проверьте подключение
522
+ status = bot.check_session_status()
523
+ if not status['authenticated']:
524
+ print(f"Ошибка: {status.get('error')}")
525
+ print("Проверьте логин и пароль/токен")
526
+ ```
527
+
528
+ ### Комната не найдена
529
+
530
+ ```python
531
+ # Получите список доступных комнат
532
+ rooms = bot.get_rooms()
533
+ print("Доступные комнаты:")
534
+ for room in rooms:
535
+ print(f" - {room.get('name')} (токен: {room.get('token')})")
536
+ ```
537
+
538
+ ### Проблемы с отправкой файлов
539
+
540
+ ```python
541
+ # Используйте диагностику
542
+ result = bot.diagnose_room_access("room_token")
543
+ print(json.dumps(result, indent=2))
544
+
545
+ # Проверьте права на запись в WebDAV
546
+ # Убедитесь, что у бота есть права на загрузку файлов
547
+ ```
548
+
549
+ ## Лицензия
550
+
551
+ MIT License
552
+
553
+ ## Вклад в проект
554
+
555
+ Буду рад вашим pull requests и issue!
556
+
557
+ ## Ссылки
558
+
559
+ - [Nextcloud Talk API Documentation](https://nextcloud-talk.readthedocs.io/)
560
+ - [Nextcloud Developer Documentation](https://docs.nextcloud.com/server/latest/developer_manual/)
@@ -0,0 +1,10 @@
1
+ nextcloud/__init__.py,sha256=CyAYogUyfKy3mONwEpdRb-kJPAFCjFNIfs5D7iuz2aI,287
2
+ nextcloud/bot/__init__.py,sha256=P7OrX6TtngcodpiKWGdnfOhwLjJCFPghjcRfQ2oQw-w,161
3
+ nextcloud/bot/bot.py,sha256=fCMyAYMOlV2A8QkZc4X2CT4jWqEAXSBdyP2eZVpf29o,51703
4
+ nextcloud/bot/models.py,sha256=lmrfYrJRfIY13gPCBQNXLk9LIZGSnEsCNvIVHw18GKY,2397
5
+ nextcloud/email/__init__.py,sha256=y12NdYjZWD5ko-oxkCVhiFQjVAYC_hmp1b70Pdwgnzw,106
6
+ nextcloud/email/client.py,sha256=-juRCrepwmrcbfkkoA0too7IUdm19yN5MPSi7tHfFy0,338
7
+ ifa_nextcloud-0.1.1.dist-info/METADATA,sha256=MpRJM_vFiV-H_-ol9HesQDquRKyO6ZvcnErlZPReT1A,17904
8
+ ifa_nextcloud-0.1.1.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
9
+ ifa_nextcloud-0.1.1.dist-info/licenses/LICENSE,sha256=1DHkgeJmVHbuJNOMNVNqoH1eXyYJYdrGOrU0RnEb8Lc,119
10
+ ifa_nextcloud-0.1.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,6 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 ifake
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ ...
nextcloud/__init__.py ADDED
@@ -0,0 +1,9 @@
1
+ """
2
+ Nextcloud Talk Bot — библиотека для создания ботов в Nextcloud Talk.
3
+ """
4
+
5
+ from src.nextcloud.bot.bot import Bot
6
+ from src.nextcloud.bot.models import Update, Message, User, Chat
7
+
8
+ __version__ = "0.1.0"
9
+ __all__ = ["Bot", "Update", "Message", "User", "Chat"]
@@ -0,0 +1,6 @@
1
+ """Bot module for Nextcloud Talk"""
2
+
3
+ from .bot import Bot
4
+ from .models import Update, Message, User, Chat
5
+
6
+ __all__ = ["Bot", "Update", "Message", "User", "Chat"]