Skip to content

Commit 104a2ba

Browse files
committed
Feat: sponsored messages support
1 parent ec4fb2e commit 104a2ba

9 files changed

Lines changed: 88 additions & 23 deletions

File tree

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ RUN apt-get update \
66
&& docker-php-ext-install -j$(nproc) sockets zip \
77
&& mkdir -p /usr/src/php/ext/ && cd /usr/src/php/ext/ \
88
&& pecl bundle openswoole \
9-
&& docker-php-ext-configure openswoole --enable-sockets=yes --enable-openssl=yes \
9+
&& docker-php-ext-configure openswoole --enable-openssl=yes \
1010
&& docker-php-ext-install -j$(nproc) openswoole \
1111
# Cleanup
1212
&& docker-php-source delete \

Dockerfile-dev

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
FROM xtrime/telegram-rss:latest
2+
3+
RUN pecl install xdebug
4+
5+
EXPOSE 9504
6+
7+
ENTRYPOINT php server.php --docker

app/Client.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,19 @@ public function getId($chat) {
9696
return $this->get('getId', [$chat]);
9797
}
9898

99+
public function getSponsoredMessages($peer) {
100+
$messages = (array) $this->get('getSponsoredMessages', $peer);
101+
foreach ($messages as $message) {
102+
$id = $this->getId($message->from_id);
103+
$message->peer = $this->getInfo($id);
104+
}
105+
return $messages;
106+
}
107+
108+
public function viewSponsoredMessage($peer, $message) {
109+
return $this->get('viewSponsoredMessage', ['peer' => $peer, 'message' => $message]);
110+
}
111+
99112
/**
100113
* @param string $method
101114
* @param mixed $parameters
@@ -187,10 +200,10 @@ private function get(string $method, $parameters = [], array $headers = [], stri
187200
throw new \UnexpectedValueException(static::MESSAGE_CLIENT_UNAVAILABLE, $curl->statusCode);
188201
}
189202

190-
if (!$result = $body->response ?? null) {
203+
if (!property_exists($body, 'response')) {
191204
throw new \UnexpectedValueException(static::MESSAGE_CLIENT_UNAVAILABLE, $curl->statusCode);
192205
}
193-
return $result;
206+
return $body->response;
194207

195208
}
196209
}

app/Controller.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,9 +234,10 @@ private function generateResponse(Client $client, Request $request): self
234234
try {
235235
if ($this->request['peer']) {
236236
//Make request to refresh cache.
237+
$isChannel = in_array($client->getInfo($this->request['peer'])->type, ['channel', 'supergroup']);
237238
if (
238239
Config::getInstance()->get('access.only_public_channels') &&
239-
!in_array($client->getInfo($this->request['peer'])->type, ['channel', 'supergroup'])
240+
!$isChannel
240241
) {
241242
throw new UnexpectedValueException('This is not a public channel', 403);
242243
}
@@ -275,6 +276,9 @@ private function generateResponse(Client $client, Request $request): self
275276
'add_offset' => ($this->request['page'] - 1) * $this->request['limit'],
276277
]
277278
);
279+
if ($isChannel) {
280+
$this->response['data']->sponsored_messages = $client->getSponsoredMessages($this->request['peer']);
281+
}
278282
}
279283
}
280284
} catch (Exception $e) {

app/Messages.php

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ public function __construct(\stdClass $telegramResponse, Client $client, string
2929

3030
private function parseMessages(): self {
3131
if ($messages = $this->telegramResponse->messages ?? []) {
32+
$messages = array_merge($this->telegramResponse->sponsored_messages ?? [], $messages);
33+
3234
$groupedMessages = [];
3335
foreach ($messages as $key => $message) {
3436
if (
@@ -43,7 +45,7 @@ private function parseMessages(): self {
4345
if ($description || $this->hasMedia($message)) {
4446
$info = $this->getMediaInfo($message);
4547
$parsedMessage = [
46-
'url' => $this->getMessageUrl($message->id),
48+
'url' => $this->getMessageUrl($message),
4749
'title' => null,
4850
'description' => $description,
4951
'media' => [$info],
@@ -84,7 +86,7 @@ private function parseMessages(): self {
8486

8587
$parsedMessage = $this->setTitle($parsedMessage, $message);
8688

87-
$this->list[$message->id] = $parsedMessage;
89+
$this->list[] = $parsedMessage;
8890
}
8991
}
9092
}
@@ -102,35 +104,52 @@ private function setTitle(array $parsedMessage, \stdClass $message): array {
102104
$parsedMessage['title'] = $matches['sentence'] ?? null;
103105
$parsedMessage['title'] = trim($parsedMessage['title']);
104106

105-
if ($parsedMessage['title']) {
106-
return $parsedMessage;
107-
}
108-
109-
//Get first 100 symbols from description
110-
$parsedMessage['title'] = mb_strimwidth($descriptionText, 0, 100, ' [...]');
111-
return $parsedMessage;
112107
}
113108

114109
if (!empty($message->media)) {
115110
$mime = $message->media->document->mime_type ?? '';
116111
if (strpos($mime, 'video') !== false) {
117-
$parsedMessage['title'] = '[Video]';
112+
$parsedMessage['title'] = '[Video] ' . $parsedMessage['title'];
118113
} elseif ($message->media->_ === 'messageMediaPhoto') {
119-
$parsedMessage['title'] = '[Photo]';
114+
$parsedMessage['title'] = '[Photo] ' . $parsedMessage['title'];
120115
} else {
121-
$parsedMessage['title'] = '[Media]';
116+
$parsedMessage['title'] = '[Media] ' . $parsedMessage['title'];
122117
}
123118
}
124119

120+
if ($message->_ === 'sponsoredMessage') {
121+
$parsedMessage['title'] = '[Sponsored] ' . $parsedMessage['title'];
122+
}
123+
124+
$parsedMessage['title'] = trim($parsedMessage['title']);
125+
126+
//Get first 100 symbols from description
127+
if (mb_strlen($parsedMessage['title']) > 100) {
128+
$parsedMessage['title'] = mb_strimwidth($descriptionText, 0, 100, ' [...]');
129+
}
130+
125131
return $parsedMessage;
126132
}
127133

128134
/**
129-
* @param string $messageId
130-
* @return string|null
135+
* @param object $message
136+
* @return string
131137
*/
132-
private function getMessageUrl($messageId = '') {
133-
return $this->channelUrl . $messageId;
138+
private function getMessageUrl(object $message): string {
139+
if ($message->_ === 'sponsoredMessage') {
140+
$postId = !empty($message->channel_post) ? '/' . $message->channel_post : '';
141+
$startParam = !empty($message->start_param) ? '/?start=' . $message->start_param : '';
142+
$peer = $message->peer->bot_api_id;
143+
foreach ($message->peer as $property) {
144+
if (property_exists($property, 'username')) {
145+
$peer = $property->username;
146+
break;
147+
}
148+
}
149+
return self::TELEGRAM_URL . $peer . $postId . $startParam;
150+
} else {
151+
return $this->channelUrl . $message->id;
152+
}
134153
}
135154

136155
private function getMediaInfo($message): ?\stdClass {

bin/docker-build.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#!/usr/bin/env bash
2+
3+
SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
4+
5+
docker buildx build --platform linux/amd64,linux/arm64 -t xtrime/telegram-rss:latest "$@" --push "$SCRIPT_DIR/../"

docker-compose.dev.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
version: '3.9'
2+
services:
3+
telegram-rss:
4+
image: xtrime/telegram-rss:dev
5+
build:
6+
context: .
7+
dockerfile: Dockerfile-dev
8+
ports:
9+
- "127.0.0.1:9504:9504"
10+
- "9003"
11+
environment:
12+
PHP_IDE_CONFIG: "serverName=Docker"

docker-compose.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version: '3'
1+
version: '3.9'
22
services:
33
telegram-rss:
44
image: xtrime/telegram-rss:latest
@@ -17,5 +17,5 @@ services:
1717
max-file: "2"
1818
networks:
1919
default:
20-
external:
21-
name: telegram-api-server
20+
external: true
21+
name: telegram-api-server

docker/php/conf.d/xdebug.ini

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
xdebug.max_nesting_level=512
2+
xdebug.mode=debug
3+
xdebug.start_with_request=yes
4+
xdebug.client_host=host.docker.internal
5+
xdebug.client_port=9003

0 commit comments

Comments
 (0)