EMP UA Helper

Десктопний інструмент для одночасного надсилання сповіщень про трансляції та відео у Telegram і Discord, із підтвердженою доставкою та захистом від дублів. Підтримує незалежне налаштування платформ, кілька каналів Discord, повністю ручний режим без шаблону з прикріпленням зображень, налаштовуваний часовий пояс та автоматичне визначення типу контенту через YouTube RSS/API з локальним кешем.

Останній реліз: v1.5.6 · 22 жовтня 2026 р. ·що нового

Можливості

Гнучкість та незалежність платформ — Telegram, YouTube, Discord та Twitch повністю опціональні. Ви можете вмикати чи вимикати будь-яку комбінацію платформ (достатньо мати активним хоча б один канал сповіщень: Telegram або Discord) у будь-який момент через вікно “⚙️ Налаштування” в треї, без перезапуску програми та без втрати збережених ключів.

Розумна автоматизація з локальним кешем — автоматичне визначення типу контенту (Live / Upcoming / Video / Short) за допомогою комбінації YouTube RSS та YouTube Data API v3, без потреби в OAuth-авторизації. Оскільки сам RSS-фід YouTube обмежений останніми ~15 записами каналу, програма веде локальний кеш: заплановані трансляції зберігаються в ньому без обмеження за часом, доки не настане їхня дата, — навіть якщо за цей час ви опублікуєте достатньо іншого контенту, щоб анонс випав з вікна RSS. На випадок тривалого збою самого RSS-фіду є опціональний запасний шлях напряму через YouTube Data API — з’являється лише в банері помилки, коштує квоти (~202 одиниці на запуск) і вимагає окремого підтвердження в діалозі, а не запускається автоматично.

Надіслати сповіщення — єдине вікно для будь-якого анонсу з живим прикладом повідомлення окремо для Telegram і Discord ще до відправки. За бажанням можна покластись на автопідбір останнього опублікованого контенту або обрати конкретне відео зі списку кандидатів — кожен пункт показує мініатюру, назву й реальну дату публікації чи старту трансляції, що зручно, коли кілька публікацій одного дня мають схожі назви. Поля дати й часу трансляції мають кнопки календаря, вибору години/хвилини та миттєвої підстановки поточного часу — набирати вручну більше не обов’язково. Поле посилання є необов’язковим: якщо воно порожнє, відповідні рядки із заповнювачем {url} автоматично прибираються з повідомлення, запобігаючи появі битих посилань. Якщо вставлене посилання не схоже ні на YouTube, ні на Twitch, з’являється м’яке попередження, яке не блокує відправку. Перед кнопкою “Надіслати” програма сама перевіряє з’єднання з увімкненими платформами — для Telegram це дійсність токена бота й те, що саме цей бот бачить саме цей канал, для Discord — дійсність і неревокованість URL вебхука; перевірка одноразова (при відкритті вікна й повторно за кнопкою 🔄), нічого не публікує й не видно підписникам каналу.

Надійна доставка — Discord-запит явно чекає на підтвердження створення повідомлення (а не повертає порожню відповідь одразу, як було раніше), Telegram-помилки на кшталт 429 “Too Many Requests” логуються, а відправка на кожну платформу обробляється незалежно, тож збій однієї не ховає інформацію про другу. Автоматичні повтори бібліотеки Telegram.Bot після 429 вимкнено: помилка повертається одразу, а не після кількох прихованих спроб із паузами, а під час відправки для кожної платформи показується «⏳ надсилається…». Вікно показує реальний статус окремо для Telegram і Discord (“✓ відправлено” / “✗ не вдалось” з описом помилки / “— не надсилалось”) і не закривається автоматично, доки хоч одна платформа не підтвердила успіх; кожен результат логується. Окреме вікно результату відправки показує картку на кожну платформу з великим кольоровим статусом (✓ з ID повідомлення чи ✗ з текстом помилки) ще до закриття вікна відправки; режим налаштовується в “⚙️ Налаштування” → Загальне: завжди, лише при помилці (типово) або ніколи. Підсумок називає й обхідні шляхи, якими відправку було виконано, — «надіслано як фото з мініатюрою» замість прев’ю посилання, «список відео отримано через YouTube Data API» чи «з локального кешу» замість звичайного RSS. Повторне натискання “Надіслати” без зміни вмісту питає окреме підтвердження для платформи, яка вже підтвердила успіх минулого разу (за замовчуванням пропускається) — захист від випадкових дублів; зміна тексту чи вкладень знову дозволяє надсилання без запитань.

Обхід збою прев’ю Telegram — коли сервер Telegram не може побудувати прев’ю YouTube-посилання, sendMessage відповідає 429 “Too Many Requests”, і повідомлення не створюється (відомий збій на боці Telegram). У такому разі шаблонне сповіщення одразу надсилається як фото з мініатюрою YouTube (завантажує сама програма) і текстом-підписом, а в статусі й вікні результату з’являється відповідна примітка. Перемикач «🖼 Мініатюра YouTube як фото замість прев’ю посилання» в “⚙️ Налаштування” → Telegram надсилає фото одразу, без спроби прев’ю.

Тестова відправка — галочка «🧪 Тестова відправка» у вікні надсилання спрямовує Telegram у тестовий чат (числовий ID особистого чату з ботом), а Discord — у вебхук окремого тестового каналу; підписники основних каналів тесту не бачать. Обидві цілі задаються в “⚙️ Налаштування”; кнопка «🔎 Знайти мій ID» знаходить ID особистого чату через getUpdates після /start, надісланого боту. Платформа без тестової цілі у тестовому режимі не надсилається зовсім — повернення до основного каналу немає; захист від дублів на тестову відправку не діє, а в лозі такі записи позначені [TEST].

Повністю ручний режим — перемикач “✍️ Повністю ручний режим” вимикає будь-яку підстановку шаблону: окремі текстові поля для Telegram (HTML-теги на кшталт <b>, <a href>) і Discord (Markdown, теги ролей/користувачів) — відправляється рівно те, що введено, порожнє поле означає “не надсилати на цю платформу”. Над полями — кнопки форматування (жирний/курсив/підкреслення/закреслення/код/спойлер/посилання), що застосовують розмітку до виділеного тексту або вставляють пару тегів під курсором. Під кожним полем — лічильник символів (Telegram: 4096 без зображення чи 1024 з ним, бо підпис коротший; Discord: завжди 2000) — перевищення ліміту блокує відправку саме на цю платформу, а якщо лишається хоч одна платформа в межах ліміту, перед відправкою пропонується підтвердити часткову відправку лише туди. Тут-таки доступні генератори готових до копіювання позначок часу (окремо для Telegram і Discord) та згадок Discord (роль/користувач/канал — досить лише вставити ID; цілий скопійований тег замість ID відхиляється); нічого не підставляється в текст автоматично, лише генерується для копіювання кнопкою. У цьому ж режимі можна прикріпити до 10 зображень (скріншотів, фото) — спільну галерею для обох платформ, з мініатюрами, кнопкою видалення, зміною порядку (кнопки ◀/▶ або перетягування — порядок у галереї визначає порядок у самому повідомленні) і переглядом у повний розмір по кліку.

Кілька каналів Discord — довільна кількість іменованих каналів Discord (наприклад, тестовий чи іншомовний) на додачу до основного. У вікні надсилання при двох і більше налаштованих каналах з’являється галочка, яка дозволяє свідомо обрати, куди піде конкретне сповіщення; автоматичні сповіщення завжди йдуть в основний канал. Окремо можна зберегти довільну кількість пар назва+ID для ролей Discord у “⚙️ Налаштування” — у генераторі згадок ручного режиму вони з’являються списком швидкого вибору поруч із основною роллю зі сповіщень (та додається туди автоматично, без потреби дублювати її вручну).

Налаштовуваний часовий пояс — більше не захардкоджений на київський час: при першому запуску автоматично підставляється системною зоною цього комп’ютера, коректно враховує перехід літній/зимовий час і зберігається незмінним, навіть якщо системний час комп’ютера пізніше зміниться (відрядження, VPN тощо). Існуючі інсталяції без цього налаштування й далі коректно працюють за київським часом.

Гнучкі шаблони — вбудований редактор шаблонів для кожного типу контенту окремо для Telegram та Discord (зокрема заголовок embed та тіло повідомлення). Підтримуються змінні:

  • {title} — назва контенту;
  • {url} — посилання;
  • {twitch} — посилання на Twitch;
  • {scheduled_telegram} та {scheduled_discord} — час початку запланованої трансляції (для Telegram у читабельному форматі з урахуванням літнього/зимового часу, для Discord — у форматі Unix timestamp із динамічним відображенням відносного часу).

Під кожним полем — лічильник символів: для Telegram це 4096 (текст повідомлення), для Discord окремо 256 (заголовок embed) і 4096 (текст embed) — різні поля API з різними лімітами, а не один спільний ліміт, як у ручному режимі. Перевищення позначається червоним і блокує кнопку “Зберегти” до скорочення тексту.

Форматування — Discord embed з можливістю додавання мініатюри, вибору кольору та згадуванням ролі, а також Telegram HTML-форматування з гнучким керуванням прев’ю посилань (а якщо Telegram не може побудувати прев’ю YouTube — автоматичний перехід на фото з мініатюрою, див. вище).

Зручність та конфіденційність — програма згортається у системний трей і не заважає під час роботи; за бажанням вікно «Надіслати сповіщення» можна відкривати одразу при запуску (“⚙️ Налаштування” → Загальне, типово вимкнено). У всіх текстових полях працюють стандартні дії з буфером обміну — Ctrl+C / Ctrl+X / Ctrl+V / Ctrl+A, Ctrl+Insert, Shift+Insert, Shift+Delete та контекстне меню (Вирізати / Копіювати / Вставити / Виділити все), зокрема в полях ручної відправки; біля прикладів повідомлень у шаблонному режимі є кнопки 📋 для копіювання всього тексту, а збій доступу до буфера обміну записується в лог. Секретні поля (токени, ключі) за замовчуванням приховані маскою з можливістю перегляду. Інтерфейс є повністю двомовним (UA/EN).

Вимоги

Програма підтримує роботу на Windows 10/11 (x64 та x86). Доступні кілька варіантів збірок:

  • Self-contained (win-x64 / win-x86) — повністю готові до роботи версії, які не потребують встановлення додаткового ПЗ.
  • Generic — полегшена версія, яка потребує встановленого у системі .NET 10 Desktop Runtime.

Завантаження

Актуальні релізи та готові збірки під різні архітектури доступні на сторінці GitHub Releases.

Безпека та прозорість

Вихідний код проєкту є повністю відкритим. Усі API-ключі (Telegram Bot Token, YouTube API Key, Discord Webhook) вказуються користувачем та зберігаються локально у файлі appsettings.json поруч із виконуваним файлом. Локальний кеш контенту (content-cache.json), який може містити назви ще неанонсованих запланованих трансляцій, так само зберігається лише на диску користувача. Ці дані ніколи не передаються на сторонні сервери.

Діагностичний лог у теці logs/ фіксує кожен HTTP-запит до Telegram ([TG-HTTP]) і Discord ([DC-HTTP]): метод чи вебхук, тривалість, HTTP-статус, заголовки rate-limit, тіло запиту й тіло відповіді з помилкою, включно з автоматичними повторами бібліотеки Telegram.Bot; час у лозі — з мілісекундами. Токен бота й URL вебхуків у лог не потрапляють. Паралельний запис у лог (Telegram і Discord одночасно) виконується послідовно, тож рядки не губляться.

З версії 1.5.0 реліз збирається автоматично в GitHub Actions за тегом версії, з коду цього самого репозиторію — кожен запуск збірки публічний, із повним логом кроків (попередні версії були зібрані й завантажені вручну). Перед запакуванням кожного з трьох варіантів (generic, win-x64, win-x86) окремий крок перевіряє публікацію на відсутність appsettings.json, templates.json, content-cache.json, символів відлагодження (*.pdb) чи теки logs/; якщо щось із цього знайдено, збірка зупиняється і реліз не публікується. Опис релізу на GitHub формується автоматично з відповідного розділу цього changelog.

Подяки