High-Performance Telegram Broadcast Manager for MadelineProto. Manage broadcasts efficiently: send messages, media albums, pin/unpin messages, control broadcasts in real-time, and track live progress with advanced features.
-
π High-Performance Broadcasts Send messages concurrently to thousands of users, groups, or channels with configurable concurrency.
-
βΈ Pause / Resume / Cancel Broadcasts Control ongoing broadcasts in real-time without restarting.
-
π Pin & Unpin Messages
- Pin the last broadcasted message automatically.
- Unpin all messages for all subscribers.
-
π§Ή Delete Last Broadcast
- Remove previously sent messages from all users.
- Retries failed deletions and handles Telegram API limits automatically.
-
β»οΈ Delete All Broadcasts
- Remove previously all sent messages from all users.
- Retries failed deletions and handles Telegram API limits automatically.
-
π Live Progress Tracking
- Visual progress bars
- Messages per second (TPS)
- Sent, failed, and pending counts
- Paused/cancelled indicators
-
πΌ Media Albums Support
- Send multiple images/documents in a single broadcast using
sendMultiMedia. - Supports captions and message entities.
- Send multiple images/documents in a single broadcast using
-
πΎ Saving & Reusing Albums
Save albums to a JSON file for reuse in future broadcasts.
Use album-bot as an example to store album files locally. -
π‘ FLOOD_WAIT Handling & Retries Automatically respects Telegram rate limits and retries failed messages.
-
π Inline Buttons / Reply Markup
- Include interactive buttons for links, commands, or actions.
composer require wizardloop/broadcastmanagerInclude autoload:
require 'vendor/autoload.php';use BroadcastTool\BroadcastManager;
$manager = new BroadcastManager($api);
$manager->broadcastWithProgress($users, $messages, $adminChatId, true, 20);This method returns an integer ID that can be used.
use BroadcastTool\BroadcastManager;
$manager = new BroadcastManager($api);
$broadcastId = $manager->broadcastWithProgress($users, $messages, null, true, 20);
/**
* Get progress (can be polled)
*/
$progress = $manager->progress($broadcastId);
if ($progress !== null) {
// π Core stats
$processed = $progress['processed'];
$success = $progress['success'];
$failed = $progress['failed'];
$pending = $progress['pending'];
$flood = $progress['flood'];
// π Progress %
$progressPercent = $progress['progressPercent'];
// π¦ Breakdown
$sent = $progress['breakdown']['sent'];
$deleted = $progress['breakdown']['deleted'];
$unpin = $progress['breakdown']['unpin'];
// βοΈ State
$done = $progress['done'];
$paused = $progress['paused'];
$cancel = $progress['cancel'];
// β± Timing
$startedAt = $progress['startedAt'];
/**
* Example usage
*/
echo "Progress: {$progressPercent}%\n";
echo "Sent: {$sent}\n";
echo "Failed: {$failed}\n";
if ($done) {
echo "Broadcast finished!";
}
if ($paused) {
echo "Broadcast paused...";
}
}* progress return array|null {
* processed: int, // total processed items (sent + deleted + unpin + failed)
* success: int, // successful operations (sent + deleted + unpin)
* failed: int, // failed operations count
* pending: int, // remaining items in queue
* flood: int, // FLOOD_WAIT occurrences
*
* progressPercent: float, // completion percentage (processed / total)
*
* breakdown: array {
* sent: int,
* deleted: int,
* unpin: int
* },
*
* done: bool, // process finished
* paused: bool, // process paused
* cancel: bool, // process cancelled
*
* startedAt: float // microtime start timestamp
* }$filterSub = $manager->filterPeers($users, 'users');
$targets = $filterSub['targets']; # array
$failed = $filterSub['failed']; # int
$total = $filterSub['total']; # int$manager->pause($broadcastId);
$manager->resume($broadcastId);
$manager->cancel($broadcastId);if ($manager->isActive($broadcastId));
if ($manager->isPaused($broadcastId));
if ($manager->isCancelled($broadcastId));
if (!$manager->hasLastBroadcast($broadcastId));
if (!$manager->hasAllBroadcast($broadcastId));
print_r($manager->progress($broadcastId));BroadcastManager::setDataDir(__DIR__ . '/data'); // default: __DIR__ . '/../data'$broadcastId = $manager->deleteLastBroadcastForAll($users, $adminChatId, 20);$broadcastId = $manager->deleteAllBroadcastsForAll($users, $adminChatId, 20);$broadcastId = $manager->lastBroadcastData();$broadcastId = $manager->broadcastWithProgress(..., pin: true);$broadcastId = $manager->unpinAllMessagesForAll(...);$message = [
'message' => "Click a button below:",
'buttons' => [
[['text' => "Visit Website", 'url' => "https://example.com"]],
[['text' => "Start", 'callback_data' => "start_action"]]
]
];- Concurrency - Number of parallel workers.
- Filter Types - 'users', 'groups', 'channels', 'all'
- Album Handling - JSON-based albums with multiple media files.
- Retries & Delays - Automatic retries with backoff.
- Progress Tracking - Real-time broadcast stats with
progress().
- Fork repo
- Create branch:
git checkout -b feature/my-feature - Commit changes:
git commit -m "Add feature" - Push branch:
git push origin feature/my-feature - Open Pull Request
GNU AGPL-3.0 - see LICENSE.
See [CHANGELOG.md] for updates.
β Pro Tips
- Use
pin: trueto pin important broadcasts. - Include
buttonsfor interactive messages. - Adjust
concurrencyfor optimal performance. - Use
pause/resume/cancelfor safe broadcast control.