diff --git a/bridges/TelegramBridge.php b/bridges/TelegramBridge.php new file mode 100644 index 00000000..5fec905e --- /dev/null +++ b/bridges/TelegramBridge.php @@ -0,0 +1,265 @@ + array( + 'name' => 'Username', + 'type' => 'text', + 'exampleValue' => '@telegram', + ) + ) + ); + + const CACHE_TIMEOUT = 900; // 15 mins + + private $feedName = ''; + private $enclosures = array(); + private $itemTitle = ''; + + private $backgroundImageRegex = "/background-image:url\('(.*)'\)/"; + + public function collectData() { + + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Could not request: ' . $this->getURI()); + + $channelTitle = htmlspecialchars_decode( + $html->find('div.tgme_channel_info_header_title span', 0)->plaintext, + ENT_QUOTES + ); + $this->feedName = $channelTitle . ' (@' . $this->processUsername() . ')'; + + foreach($html->find('div.tgme_widget_message_wrap.js-widget_message_wrap') as $index => $messageDiv) { + $this->itemTitle = ''; + $this->enclosures = array(); + $item = array(); + + $item['uri'] = $this->processUri($messageDiv); + $item['content'] = $this->processContent($messageDiv); + $item['title'] = $this->itemTitle; + $item['timestamp'] = $this->processDate($messageDiv); + $item['enclosures'] = $this->enclosures; + + $this->items[] = $item; + } + $this->items = array_reverse($this->items); + } + + public function getURI() { + + if (!is_null($this->getInput('username'))) { + return self::URI . '/s/' . $this->processUsername(); + } + + return parent::getURI(); + } + + public function getName() { + + if (!empty($this->feedName)) { + return $this->feedName . ' - Telegram'; + } + + return parent::getName(); + } + + private function processUsername() { + + if (substr($this->getInput('username'), 0, 1) === '@') { + return substr($this->getInput('username'), 1); + } + + return $this->getInput('username'); + } + + private function processUri($messageDiv) { + return $messageDiv->find('a.tgme_widget_message_date', 0)->href; + } + + private function processContent($messageDiv) { + $message = ''; + + if ($messageDiv->find('div.tgme_widget_message_forwarded_from', 0)) { + $message = $messageDiv->find('div.tgme_widget_message_forwarded_from', 0)->innertext . '

'; + } + + if ($messageDiv->find('a.tgme_widget_message_reply', 0)) { + $message = $this->processReply($messageDiv); + } + + if ($messageDiv->find('div.tgme_widget_message_sticker_wrap', 0)) { + $message .= $this->processSticker($messageDiv); + } + + if ($messageDiv->find('div.tgme_widget_message_poll', 0)) { + $message .= $this->processPoll($messageDiv); + } + + if ($messageDiv->find('video', 0)) { + $message .= $this->processVideo($messageDiv); + } + + if ($messageDiv->find('a.tgme_widget_message_photo_wrap', 0)) { + $message .= $this->processPhoto($messageDiv); + } + + if ($messageDiv->find('div.tgme_widget_message_text.js-message_text', 0)) { + $message .= $messageDiv->find('div.tgme_widget_message_text.js-message_text', 0); + + $this->itemTitle = $this->ellipsisTitle( + $messageDiv->find('div.tgme_widget_message_text.js-message_text', 0)->plaintext + ); + } + + if ($messageDiv->find('a.tgme_widget_message_link_preview', 0)) { + $message .= $this->processLinkPreview($messageDiv); + } + + return $message; + } + + private function processReply($messageDiv) { + + $reply = $messageDiv->find('a.tgme_widget_message_reply', 0); + + return <<{$reply->find('span.tgme_widget_message_author_name', 0)->plaintext}
+{$reply->find('div.tgme_widget_message_text', 0)->innertext} +{$reply->href}
+EOD; + } + + private function processSticker($messageDiv) { + + if (empty($this->itemTitle)) { + $this->itemTitle = '@' . $this->processUsername() . ' posted a sticker'; + } + + $stickerDiv = $messageDiv->find('div.tgme_widget_message_sticker_wrap', 0); + + preg_match($this->backgroundImageRegex, $stickerDiv->find('i', 0)->style, $sticker); + + $this->enclosures[] = $sticker[1]; + + return << +EOD; + } + + private function processPoll($messageDiv) { + + $poll = $messageDiv->find('div.tgme_widget_message_poll', 0); + + $title = $poll->find('div.tgme_widget_message_poll_question', 0)->plaintext; + $type = $poll->find('div.tgme_widget_message_poll_type', 0)->plaintext; + + if (empty($this->itemTitle)) { + $this->itemTitle = $title; + } + + $pollOptions = ''; + + return <<$type
{$pollOptions} +EOD; + } + + private function processLinkPreview($messageDiv) { + + $image = ''; + $title = ''; + $site = ''; + $description = ''; + + $preview = $messageDiv->find('a.tgme_widget_message_link_preview', 0); + + if (trim($preview->innertext) === '') { + return ''; + } + + if($preview->find('i', 0) && + preg_match($this->backgroundImageRegex, $preview->find('i', 0)->style, $photo)) { + + $image = ''; + $this->enclosures[] = $photo[1]; + } + + if ($preview->find('div.link_preview_title', 0)) { + $title = $preview->find('div.link_preview_title', 0)->plaintext; + } + + if ($preview->find('div.link_preview_site_name', 0)) { + $site = $preview->find('div.link_preview_site_name', 0)->plaintext; + } + + if ($preview->find('div.link_preview_description', 0)) { + $description = $preview->find('div.link_preview_description', 0)->plaintext; + } + + return <<$image
+{$title} - {$site}
{$description} +EOD; + } + + private function processVideo($messageDiv) { + + if (empty($this->itemTitle)) { + $this->itemTitle = '@' . $this->processUsername() . ' posted a video'; + } + + preg_match($this->backgroundImageRegex, $messageDiv->find('i.tgme_widget_message_video_thumb', 0)->style, $photo); + + $this->enclosures[] = $photo[1]; + + return << + + +EOD; + } + + private function processPhoto($messageDiv) { + + if (empty($this->itemTitle)) { + $this->itemTitle = '@' . $this->processUsername() . ' posted a photo'; + } + + $photos = ''; + + foreach ($messageDiv->find('a.tgme_widget_message_photo_wrap') as $photoWrap) { + preg_match($this->backgroundImageRegex, $photoWrap->style, $photo); + + $this->enclosures[] = $photo[1]; + + $photos .= <<
+EOD; + } + return $photos; + } + + private function processDate($messageDiv) { + return $messageDiv->find('time', 0)->datetime; + } + + private function ellipsisTitle($text) { + + $length = 100; + + if (strlen($text) > $length) { + $text = explode('
', wordwrap($text, $length, '
')); + return $text[0] . '...'; + } + return $text; + } +}