Разработка каналов доставки¶
Провайдер RePost — канал доставки: Telegram, VK, webhook, своя БД, внешний API и т.п. Контракт: ProviderInterface → рекомендуется extends AbstractProvider → send(…): SendResult.
flowchart TB
Dispatch[DispatchService] --> Registry[ProviderRegistry]
Registry --> P[ProviderInterface]
P --> Abstract[AbstractProvider]
Abstract --> TG[TelegramProvider]
Abstract --> Custom[Webhook / DB / API / ...]
P --> DTO["PostContext + RenderedMessage → SendResult"]
Структура каталога¶
init.php¶
| PHP | |
|---|---|
ProviderRegistry сканирует подкаталоги с init.php и регистрирует по ключу name.
Обязательно: теги шаблона (TemplateTagsInterface)¶
Каждый канал должен вернуть реализацию из templateTags():
implements TemplateTagsInterfaceилиextends DefaultTemplateTags- свои HTML-теги канала — в
allowedHtmlTags()/sanitizeHtml() - UI-чипы редактора —
hints(); post-pass —applyAfterParse(); плейсхолдеры —extraPlaceholders()
По умолчанию AbstractProvider::templateTags() → DefaultTemplateTags. Telegram: TelegramTemplateTags (кнопки, [repost_media_*], allowlist Bot API).
| Text Only | |
|---|---|
ContentRenderer вызывает tags выбранного подключения после ParseTemplateTags::apply.
Обязательно: лимиты медиа¶
Каждый extends AbstractProvider должен:
- Реализовать
mediaByteLimits(): array— ключиphoto/video/audio/document→ байты. Нет ключа или0= без лимита для типа. - В
send()до аплоада вызватьfilterMediaByLimits($message)и работать уже с отфильтрованнымRenderedMessage.
Локальные файлы больше лимита отбрасываются; публичный URL без локального файла остаётся (размер неизвестен). В skipped — список отброшенных (path, kind, bytes, limit).
Webhook / БД без лимитов:
| PHP | |
|---|---|
Telegram: см. Provider/Telegram/MediaLimits.php (photo 10 MiB, video/audio/document 50 MiB).
Обязательно: расширения медиа (allowedMediaExtensions)¶
| PHP | |
|---|---|
- Default в
AbstractProvider— пустые списки (не фильтровать по расширению). - Telegram: photo
jpg,jpeg,png,gif,webp; videomp4; audiomp3,m4a; document — без жёсткого списка. - Несовпадение заявленного типа с allowlist → переклассификация / отправка как document.
- Внешний
url=перед аплоадом скачивается на сервер (downloadRemoteMedia); private/localhost — skip.
Минимальный класс¶
connectionConfig— JSON изsettingsSchema().RenderedMessageуже отфильтрован поtg_send_typeв ContentRenderer; лимиты размера — зона провайдера.- Ошибки —
$this->fail()→ Admin logs (LogGenerator::for('RePost')).
Примерный settings.schema.php¶
FormSchemaBuilder как в Provider/Telegram/settings.schema.php.
Чеклист¶
- Каталог
Provider/{Code}/+init.php+ класс + schema. extends AbstractProvider+mediaByteLimits()+ при необходимостиallowedMediaExtensions().templateTags()—DefaultTemplateTagsили свой класс (TemplateTagsInterface).- В
send()вызватьfilterMediaByLimits()до аплоада. - Подключение в админке → шаблон → add/edit или cron.
Платные / внешние каналы¶
Каналы вроде VK поставляются отдельным ZIP (свой install.xml + дерево upload/…/Provider/{Code}/), а не патчами ядра RePost.
needplugin→ RePost- Composer-зависимости канала — notice + при необходимости патч
composer_requiredвmanifest.phpRePost - Vendor в ZIP не кладётся
Пример: providers/vk.md (RePost Provider: VK).