Skip to main content

Message Methods

The messages namespace provides methods for working with messages in Telegram.

Accessing Messages Methods

// In EventHandler
$this->messages->sendMessage([...]);

// In API instance
$MadelineProto->messages->sendMessage([...]);

Sending Messages

sendMessage

Send a text message.
peer
string|int
required
Destination peer (username, ID, or peer object)
message
string
required
Message text (up to 4096 characters)
parse_mode
string
Parse mode: ‘Markdown’, ‘HTML’, or ‘MarkdownV2’
reply_to_msg_id
int
Message ID to reply to
reply_markup
array
Inline keyboard or reply keyboard
no_webpage
bool
default:"false"
Disable link previews
silent
bool
default:"false"
Send silently (no notification)
schedule_date
int
Schedule message (Unix timestamp)
clear_draft
bool
default:"false"
Clear draft after sending
// Simple message
$this->messages->sendMessage([
    'peer' => '@username',
    'message' => 'Hello from MadelineProto!',
]);

// With formatting
$this->messages->sendMessage([
    'peer' => $chatId,
    'message' => '**Bold** and _italic_ text',
    'parse_mode' => 'Markdown',
]);

// With keyboard
$this->messages->sendMessage([
    'peer' => $chatId,
    'message' => 'Choose an option:',
    'reply_markup' => [
        'inline_keyboard' => [[
            ['text' => 'Button 1', 'callback_data' => 'btn1'],
            ['text' => 'Button 2', 'callback_data' => 'btn2'],
        ]],
    ],
]);

// Reply to message
$this->messages->sendMessage([
    'peer' => $chatId,
    'message' => 'This is a reply',
    'reply_to_msg_id' => $messageId,
]);

// Silent message
$this->messages->sendMessage([
    'peer' => $chatId,
    'message' => 'Silent notification',
    'silent' => true,
]);

// Schedule message
$this->messages->sendMessage([
    'peer' => $chatId,
    'message' => 'Scheduled message',
    'schedule_date' => time() + 3600, // Send in 1 hour
]);

sendMedia

Send media (photos, videos, documents).
peer
string|int
required
Destination peer
media
array
required
Media object
message
string
default:""
Caption text
parse_mode
string
Caption parse mode
reply_to_msg_id
int
Message ID to reply to
silent
bool
default:"false"
Send silently
// Send photo from path
$this->messages->sendMedia([
    'peer' => $chatId,
    'media' => [
        '_' => 'inputMediaUploadedPhoto',
        'file' => '/path/to/photo.jpg',
    ],
    'message' => 'Photo caption',
]);

// Send document
$this->messages->sendMedia([
    'peer' => $chatId,
    'media' => [
        '_' => 'inputMediaUploadedDocument',
        'file' => '/path/to/file.pdf',
        'attributes' => [
            ['_' => 'documentAttributeFilename', 'file_name' => 'document.pdf'],
        ],
    ],
    'message' => 'Here is your document',
]);

// Send from URL
$this->messages->sendMedia([
    'peer' => $chatId,
    'media' => [
        '_' => 'inputMediaPhotoExternal',
        'url' => 'https://example.com/image.jpg',
    ],
]);

Editing Messages

editMessage

Edit a sent message.
peer
string|int
required
Peer where message was sent
id
int
required
Message ID to edit
message
string
required
New message text
parse_mode
string
Parse mode
reply_markup
array
New keyboard
no_webpage
bool
default:"false"
Disable link previews
$this->messages->editMessage([
    'peer' => $chatId,
    'id' => $messageId,
    'message' => 'Updated message text',
]);

// Edit with new keyboard
$this->messages->editMessage([
    'peer' => $chatId,
    'id' => $messageId,
    'message' => 'Updated message',
    'reply_markup' => [
        'inline_keyboard' => [[
            ['text' => 'New Button', 'callback_data' => 'new'],
        ]],
    ],
]);

Deleting Messages

deleteMessages

Delete messages.
id
array<int>
required
Array of message IDs to delete
revoke
bool
default:"true"
Delete for all users (requires permissions)
// Delete single message
$this->messages->deleteMessages([
    'id' => [$messageId],
    'revoke' => true,
]);

// Delete multiple messages
$this->messages->deleteMessages([
    'id' => [123, 124, 125],
    'revoke' => true,
]);

Forwarding Messages

forwardMessages

Forward messages to another chat.
from_peer
string|int
required
Source peer
to_peer
string|int
required
Destination peer
id
array<int>
required
Message IDs to forward
silent
bool
default:"false"
Forward silently
drop_author
bool
default:"false"
Hide original sender
// Forward message
$this->messages->forwardMessages([
    'from_peer' => $sourceChat,
    'to_peer' => $destChat,
    'id' => [$messageId],
]);

// Forward without attribution
$this->messages->forwardMessages([
    'from_peer' => $sourceChat,
    'to_peer' => $destChat,
    'id' => [$messageId],
    'drop_author' => true,
]);

Getting Messages

getHistory

Get message history.
peer
string|int
required
Peer to get history from
offset_id
int
default:"0"
Offset message ID
limit
int
default:"100"
Number of messages to retrieve (max 100)
max_id
int
default:"0"
Maximum message ID
min_id
int
default:"0"
Minimum message ID
// Get latest messages
$history = $this->messages->getHistory([
    'peer' => $chatId,
    'limit' => 50,
]);

// Get messages before specific ID
$history = $this->messages->getHistory([
    'peer' => $chatId,
    'offset_id' => $messageId,
    'limit' => 50,
]);

getMessages

Get specific messages by ID.
id
array<int>
required
Message IDs
$messages = $this->messages->getMessages([
    'id' => [123, 456, 789],
]);

search

Search messages.
peer
string|int
required
Peer to search in
q
string
required
Search query
filter
array
default:"{'_': 'inputMessagesFilterEmpty'}"
Message filter
limit
int
default:"100"
Number of results
// Search for text
$results = $this->messages->search([
    'peer' => $chatId,
    'q' => 'search term',
    'limit' => 50,
]);

// Search for photos
$results = $this->messages->search([
    'peer' => $chatId,
    'q' => '',
    'filter' => ['_' => 'inputMessagesFilterPhotos'],
    'limit' => 50,
]);

// Search for documents
$results = $this->messages->search([
    'peer' => $chatId,
    'q' => '',
    'filter' => ['_' => 'inputMessagesFilterDocument'],
]);

Pinning Messages

updatePinnedMessage

Pin a message.
peer
string|int
required
Peer
id
int
required
Message ID to pin
silent
bool
default:"false"
Pin silently
pm_oneside
bool
default:"false"
Pin only for yourself in PM
// Pin message
$this->messages->updatePinnedMessage([
    'peer' => $chatId,
    'id' => $messageId,
]);

// Pin silently
$this->messages->updatePinnedMessage([
    'peer' => $chatId,
    'id' => $messageId,
    'silent' => true,
]);

unpinAllMessages

Unpin all messages.
peer
string|int
required
Peer
$this->messages->unpinAllMessages([
    'peer' => $chatId,
]);

Read History

readHistory

Mark messages as read.
peer
string|int
required
Peer
max_id
int
required
Mark as read up to this message ID
$this->messages->readHistory([
    'peer' => $chatId,
    'max_id' => $messageId,
]);

Complete Example

use danog\MadelineProto\EventHandler;
use danog\MadelineProto\EventHandler\Message;
use danog\MadelineProto\EventHandler\Filter\FilterRegex;
use danog\MadelineProto\ParseMode;

class MessageBot extends EventHandler
{
    #[FilterRegex('/^\/send (.+)/')]
    public function handleSend(Message $message): void
    {
        $text = $message->matches[1];
        
        // Send message
        $this->messages->sendMessage([
            'peer' => $message->chatId,
            'message' => "You said: $text",
            'reply_to_msg_id' => $message->id,
        ]);
    }
    
    #[FilterRegex('/^\/forward (\d+)/')]
    public function handleForward(Message $message): void
    {
        $msgId = (int)$message->matches[1];
        
        // Forward message
        $this->messages->forwardMessages([
            'from_peer' => $message->chatId,
            'to_peer' => $message->chatId,
            'id' => [$msgId],
        ]);
    }
    
    #[FilterRegex('/^\/search (.+)/')]
    public function handleSearch(Message $message): void
    {
        $query = $message->matches[1];
        
        // Search messages
        $results = $this->messages->search([
            'peer' => $message->chatId,
            'q' => $query,
            'limit' => 10,
        ]);
        
        $count = count($results['messages']);
        $message->reply("Found $count messages matching '$query'");
    }
    
    #[FilterRegex('/^\/edit (\d+) (.+)/')]
    public function handleEdit(Message $message): void
    {
        $msgId = (int)$message->matches[1];
        $newText = $message->matches[2];
        
        // Edit message
        $this->messages->editMessage([
            'peer' => $message->chatId,
            'id' => $msgId,
            'message' => $newText,
        ]);
    }
}

See Also

Build docs developers (and LLMs) love