1
0
mirror of https://github.com/danog/MadelineProto.git synced 2025-01-11 13:28:17 +01:00
MadelineProto/src/EventHandler/Message.php

168 lines
6.3 KiB
PHP
Raw Normal View History

2023-06-28 15:50:38 +02:00
<?php declare(strict_types=1);
namespace danog\MadelineProto\EventHandler;
2023-07-01 18:45:35 +02:00
use danog\MadelineProto\API;
2023-07-01 19:14:53 +02:00
use danog\MadelineProto\EventHandler\Keyboard\InlineKeyboard;
use danog\MadelineProto\EventHandler\Keyboard\ReplyKeyboard;
2023-06-28 15:50:38 +02:00
use danog\MadelineProto\MTProto;
2023-07-01 14:39:33 +02:00
use danog\MadelineProto\StrTools;
2023-06-28 15:50:38 +02:00
/**
* Represents an incoming or outgoing message.
*/
2023-07-01 13:04:59 +02:00
abstract class Message extends Update
2023-06-28 15:50:38 +02:00
{
/** Message ID */
public readonly int $id;
/** Content of the message */
public readonly string $message;
/** ID of the chat where the message was sent */
public readonly int $chatId;
2023-07-01 18:45:35 +02:00
/** ID of the message to which this message is replying */
public readonly ?int $replyToMsgId;
2023-07-01 13:04:59 +02:00
/** When was the message sent */
2023-06-28 15:50:38 +02:00
public readonly int $date;
2023-07-01 19:06:30 +02:00
/** Info about a forwarded message */
public readonly ?ForwardedInfo $fwdInfo;
2023-07-01 18:45:35 +02:00
/** ID of the forum topic where the message was sent */
public readonly ?int $topicId;
/** ID of the message thread where the message was sent */
public readonly ?int $threadId;
/** Whether this is a reply to a scheduled message */
public readonly bool $replyToScheduled;
2023-06-28 15:50:38 +02:00
/** Whether we were mentioned in this message */
public readonly bool $mentioned;
/** Whether this message was sent without any notification (silently) */
public readonly bool $silent;
/** Whether this message is a sent scheduled message */
public readonly bool $fromScheduled;
/** Whether this message is a pinned message */
public readonly bool $pinned;
/** Whether this message is protected (and thus can't be forwarded or downloaded) */
public readonly bool $protected;
2023-07-01 13:04:59 +02:00
/** If the message was generated by an inline query, ID of the bot that generated it */
2023-06-28 15:50:38 +02:00
public readonly ?int $viaBotId;
2023-07-01 13:04:59 +02:00
/** Last edit date of the message */
public readonly ?int $editDate;
/** Time-to-live of the message */
public readonly ?int $ttlPeriod;
2023-07-01 17:53:29 +02:00
/** Inline or reply keyboard. */
2023-07-01 19:14:53 +02:00
public readonly InlineKeyboard|ReplyKeyboard|null $keyboard;
2023-07-01 14:39:33 +02:00
2023-07-01 19:06:30 +02:00
/** Whether this message was [imported from a foreign chat service](https://core.telegram.org/api/import) */
public readonly bool $imported;
/** For Public Service Announcement messages, the PSA type */
public readonly string $psaType;
// Todo media, albums, reactions, replies
2023-06-28 15:50:38 +02:00
/** @internal */
2023-07-01 18:04:20 +02:00
protected function __construct(
2023-06-28 15:50:38 +02:00
MTProto $API,
2023-07-01 18:22:27 +02:00
array $rawMessage
2023-06-28 15:50:38 +02:00
) {
2023-07-01 13:04:59 +02:00
parent::__construct($API);
2023-07-01 18:45:35 +02:00
$info = $this->API->getInfo($rawMessage);
2023-06-28 15:50:38 +02:00
2023-07-01 19:06:30 +02:00
$this->entities = $rawMessage['entities'] ?? null;
2023-06-28 15:50:38 +02:00
$this->id = $rawMessage['id'];
$this->message = $rawMessage['message'] ?? '';
2023-07-01 18:45:35 +02:00
$this->chatId = $info['bot_api_id'];
2023-06-28 15:50:38 +02:00
$this->date = $rawMessage['date'];
$this->mentioned = $rawMessage['mentioned'];
$this->silent = $rawMessage['silent'];
$this->fromScheduled = $rawMessage['from_scheduled'];
$this->pinned = $rawMessage['pinned'];
$this->protected = $rawMessage['noforwards'];
$this->viaBotId = $rawMessage['via_bot_id'] ?? null;
2023-07-01 13:04:59 +02:00
$this->editDate = $rawMessage['edit_date'] ?? null;
$this->ttlPeriod = $rawMessage['ttl_period'] ?? null;
2023-07-01 17:53:29 +02:00
$this->keyboard = isset($rawMessage['reply_markup'])
? Keyboard::fromRawReplyMarkup($rawMessage['reply_markup'])
: null;
2023-07-01 18:45:35 +02:00
if (isset($rawMessage['reply_to'])) {
$replyTo = $rawMessage['reply_to'];
$this->replyToScheduled = $replyTo['reply_to_scheduled'];
if ($replyTo['forum_topic']) {
if (isset($replyTo['reply_to_top_id'])) {
$this->topicId = $replyTo['reply_to_top_id'];
$this->replyToMsgId = $replyTo['reply_to_msg_id'];
} else {
$this->topicId = $replyTo['reply_to_msg_id'];
$this->replyToMsgId = null;
}
$this->threadId = null;
} elseif ($info['Chat']['forum'] ?? false) {
$this->topicId = 1;
$this->replyToMsgId = $replyTo['reply_to_msg_id'];
$this->threadId = $replyTo['reply_to_top_id'] ?? null;
} else {
$this->topicId = null;
$this->replyToMsgId = $replyTo['reply_to_msg_id'];
$this->threadId = $replyTo['reply_to_top_id'] ?? null;
}
} elseif ($info['Chat']['forum'] ?? false) {
$this->topicId = 1;
$this->replyToMsgId = null;
$this->threadId = null;
$this->replyToScheduled = false;
} else {
$this->topicId = null;
$this->replyToMsgId = null;
$this->threadId = null;
$this->replyToScheduled = false;
}
2023-07-01 19:06:30 +02:00
if (isset($rawMessage['fwd_from'])) {
$fwdFrom = $rawMessage['fwd_from'];
$this->fwdInfo = new ForwardedInfo(
$fwdFrom['date'],
isset($fwdFrom['from_id'])
? $this->API->getIdInternal($fwdFrom['from_id'])
: null,
$fwdFrom['from_name'] ?? null,
$fwdFrom['channel_post'] ?? null,
$fwdFrom['post_author'] ?? null,
isset($fwdFrom['saved_from_peer'])
? $this->API->getIdInternal($fwdFrom['saved_from_peer'])
: null,
$fwdFrom['saved_from_msg_id'] ?? null
);
$this->psaType = $fwdFrom['psa_type'] ?? null;
} else {
$this->fwdInfo = null;
$this->psaType = null;
}
2023-07-01 14:39:33 +02:00
}
2023-07-01 17:53:29 +02:00
private readonly string $html;
private readonly string $htmlTelegram;
2023-07-01 19:06:30 +02:00
private readonly ?array $entities;
2023-07-01 14:39:33 +02:00
/**
* Get an HTML version of the message.
*
* @param bool $allowTelegramTags Whether to allow telegram-specific tags like tg-spoiler, tg-emoji, mention links and so on...
*/
public function getHTML(bool $allowTelegramTags = false): string
{
2023-07-01 19:06:30 +02:00
if (!$this->entities) {
return htmlentities($this->message);
}
2023-07-01 17:53:29 +02:00
if ($allowTelegramTags) {
2023-07-01 19:06:30 +02:00
return $this->htmlTelegram ??= StrTools::messageEntitiesToHtml($this->message, $this->entities, $allowTelegramTags);
2023-07-01 17:53:29 +02:00
}
2023-07-01 19:06:30 +02:00
return $this->html ??= StrTools::messageEntitiesToHtml($this->message, $this->entities, $allowTelegramTags);
2023-06-28 15:50:38 +02:00
}
}