diff --git a/.gitignore b/.gitignore
index 25dd441e9..cb5fef111 100644
--- a/.gitignore
+++ b/.gitignore
@@ -149,3 +149,4 @@ config.json
/docker-compose.yml
/Caddyfile
/tt.php
+/changelog
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ca7c26c5f..d69f63fc2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,92 +1,12 @@
Introducing MadelineProto's biggest update yet, 8.0.0-beta100!
-This version introduces [plugins](https://docs.madelineproto.xyz/docs/PLUGINS.html), [bound methods](https://docs.madelineproto.xyz/docs/UPDATES.html#bound-methods), [filters](https://docs.madelineproto.xyz/docs/FILTERS.html), [a built-in cron system](https://docs.madelineproto.xyz/docs/UPDATES.html#cron), [IPC support for the event handler](https://docs.madelineproto.xyz/docs/UPDATES.html#persisting-data-and-ipc) and automatic static analysis for event handler code.
+This version introduces [plugins »](https://docs.madelineproto.xyz/docs/PLUGINS.html), [bound methods »](https://docs.madelineproto.xyz/docs/UPDATES.html#bound-methods), [filters »](https://docs.madelineproto.xyz/docs/FILTERS.html), [a built-in cron system »](https://docs.madelineproto.xyz/docs/UPDATES.html#cron), [IPC support for the event handler »](https://docs.madelineproto.xyz/docs/UPDATES.html#persisting-data-and-ipc) and [automatic static analysis for event handler code »](https://docs.madelineproto.xyz/docs/UPDATES.html#automatic-static-analysis).
-- [Plugins](https://docs.madelineproto.xyz/docs/PLUGINS.html)
-
-To create a plugin, simply create an event handler that extends PluginEventHandler.
-
-For example, create a `plugins/Danogentili/PingPlugin.php` file:
-```
-commandArgs;
-
- $message->reply($args[0] ?? '');
- }
-
- #[FilterRegex('/.*(mt?proto).*/i')]
- public function testRegex(Incoming & Message $message): void
- {
- $message->reply("Did you mean to write MadelineProto instead of ".$message->matches[1].'?');
- }
-
- #[FilterText('ping')]
- public function pingCommand(Incoming&Message $message): void
- {
- $message->reply("Pong");
- }
-}
-```
-
-And use a [plugin base](https://raw.githubusercontent.com/danog/MadelineProto/v8/examples/PluginBase.php) to run all plugins included in the `plugins` folder.
-
-See the [documentation](https://docs.madelineproto.xyz/docs/PLUGINS.html) for more info on how to create MadelineProto plugins!
-
-- [Message](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message.html) objects with bound methods
-
-Both plugins and normal bots can make use of [bound update methods](https://docs.madelineproto.xyz/docs/UPDATES.html#bound-methods) like `reply()`, `delete()`, `getReply()`, `getHTML()` and simplified properties like `chatId`, `senderId`, `command`, `commandArgs` and many more, see the [documentation](https://docs.madelineproto.xyz/docs/UPDATES.html#bound-methods) for more info!
-
-- [Filters](https://docs.madelineproto.xyz/docs/FILTERS.html)
-
-Plugins and bots can now use three different filtering systems, to easily receive only updates satisfying certain conditions (incoming/outgoing, from group, channel, private, from an admin or a specific peer, with an audio/sticker/..., satisfying a certain regex or a certain /command, and much more!), [see the documentation](https://docs.madelineproto.xyz/docs/FILTERS.html) for more info!
-
-- [Built-in cron system](https://docs.madelineproto.xyz/docs/UPDATES.html#cron)
-
-All event handler methods marked by the `Cron` attribute are now automatically invoked by MadelineProto every `period` seconds:
-
-```
-use danog\MadelineProto\EventHandler\Attributes\Cron;
-
-class MyEventHandler extends SimpleEventHandler
-{
- /**
- * This cron function will be executed forever, every 60 seconds.
- */
- #[Cron(period: 60.0)]
- public function cron1(): void
- {
- $this->sendMessageToAdmins("The bot is online, current time ".date(DATE_RFC850)."!");
- }
-}
-```
-
-See the [documentation](https://docs.madelineproto.xyz/docs/UPDATES.html#cron) for more info!
-
-- [IPC support for the event handler](https://docs.madelineproto.xyz/docs/UPDATES.html#persisting-data-and-ipc)
-
-You can now call event handler and plugin methods from outside of the event handler, using `getEventHandler()` on an `API` instance, see [the docs for more info](https://docs.madelineproto.xyz/docs/PLUGINS.html#limitations)!
-
-- Automatic static analysis of event handler code
-
-Finally, all new bots and plugins will be automatically analyzed by MadelineProto, blocking execution if performance or security issues are detected!
+See the [following post](https://t.me/MadelineProto/630) for examples!
Other features:
- Thanks to the many translation contributors @ https://weblate.madelineproto.xyz/, MadelineProto is now localized in Hebrew, Persian, Kurdish, Uzbek, Russian, French and Italian!
-- Added simplified sendMessage, sendDocument, sendPhoto methods that return abstract [Message](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message.html) objects with simplified properties and bound methods!
+- Added simplified [sendMessage](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#sendmessage-int-string-peer-string-message-parsemode-parsemode-danog-madelineproto-parsemode-text-int-null-replytomsgid-null-int-null-topmsgid-null-array-null-replymarkup-null-int-null-sendas-null-int-null-scheduledate-null-bool-silent-false-bool-noforwards-false-bool-background-false-bool-cleardraft-false-bool-nowebpage-false-bool-updatestickersetsorder-false-danog-madelineproto-eventhandler-message), [sendDocument](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#senddocument-int-string-peer-message-media-localfile-remoteurl-botapifileid-readablestream-file-message-media-localfile-remoteurl-botapifileid-readablestream-null-thumb-null-string-caption-parsemode-parsemode-danog-madelineproto-parsemode-text-callable-callback-null-string-filename-null-string-mimetype-null-int-ttl-null-bool-spoiler-false-int-null-replytomsgid-null-int-null-topmsgid-null-array-null-replymarkup-null-int-null-sendas-null-int-null-scheduledate-null-bool-silent-false-bool-noforwards-false-bool-background-false-bool-cleardraft-false-bool-updatestickersetsorder-false-danog-madelineproto-eventhandler-message), [sendPhoto](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#sendphoto-int-string-peer-message-media-localfile-remoteurl-botapifileid-readablestream-file-string-caption-parsemode-parsemode-danog-madelineproto-parsemode-text-callable-callback-null-string-filename-null-int-ttl-null-bool-spoiler-false-int-null-replytomsgid-null-int-null-topmsgid-null-array-null-replymarkup-null-int-null-sendas-null-int-null-scheduledate-null-bool-silent-false-bool-noforwards-false-bool-background-false-bool-cleardraft-false-bool-updatestickersetsorder-false-danog-madelineproto-eventhandler-message) methods that return abstract [Message](https://docs.madelineproto.xyz/PHP/danog/MadelineProto/EventHandler/Message.html) objects with simplified properties and bound methods!
- You can now use `Tools::callFork` to fork a new green thread!
- You can now automatically pin messages broadcasted using `broadcastMessages`, `broadcastForwardMessages` by using the new `pin: true` parameter!
- You can now use `sendMessageToAdmins` to send messages to the bot's admin (the peers returned by `getReportPeers`).
@@ -99,6 +19,13 @@ Other features:
- You can now use `reportMemoryProfile()` to generate and send a `pprof` memory profile to all report peers to debug the causes of high memory usage.
- Added support for `pay`, `login_url`, `web_app` and `tg://user?id=` buttons in bot API syntax!
- Added a `getAdminIds` function that returns the IDs of the admin of the bot (equal to the peers returned by getReportPeers in the event handler).
+- Added a new `ParseMode` enum!
+- Added support for HTML lists in parseMode!
+- Fixed parsing of markdown code blocks!
+
+Breaking changes:
+- Switched to a custom markdown parser with [bot API MarkdownV2](https://core.telegram.org/bots/api#markdownv2-style) syntax, which differs from the previous Markdown syntax supported by parsedown.
+- Markdown text can't contain HTML anymore.
Fixes:
- Fixed file uploads with ext-uv!
@@ -111,4 +38,6 @@ Fixes:
- Reduced memory usage by clearing the min database automatically as needed.
- Automatically try caching all dialogs if a peer not found error is about to be thrown.
- Fixed some issues with pure phar installs.
+- Fixed splitting of HTML and markdown messages
+- Fixed formatting of multiline markdown codeblocks
- And many other performance improvements and bugfixes!
diff --git a/README.md b/README.md
index 803bd33b8..61ca357f9 100644
--- a/README.md
+++ b/README.md
@@ -102,6 +102,7 @@ Want to add your own open-source project to this list? [Click here!](https://doc
* [Restarting](https://docs.madelineproto.xyz/docs/UPDATES.html#restarting)
* [Self-restart on webhosts](https://docs.madelineproto.xyz/docs/UPDATES.html#self-restart-on-webhosts)
* [Multi-account](https://docs.madelineproto.xyz/docs/UPDATES.html#multiaccount)
+ * [Automatic static analysis](https://docs.madelineproto.xyz/docs/UPDATES.html#automatic-static-analysis)
* [Webhook (for HTTP APIs)](https://docs.madelineproto.xyz/docs/UPDATES.html#webhook)
* [getUpdates (only for Javascript APIs)](https://docs.madelineproto.xyz/docs/UPDATES.html#getUpdates)
* [Noop (default)](https://docs.madelineproto.xyz/docs/UPDATES.html#noop)
@@ -413,7 +414,7 @@ Want to add your own open-source project to this list? [Click here!](https://doc
* Extract an update message constructor from an Updates constructor: extractMessageUpdate
* Extract file info from bot API message: extractBotAPIFile
* Fetch custom emoji stickers »: messages.getCustomEmojiDocuments
- * Fetch new chats associated with an imported chat folder deep link ». Must be invoked at most every chatlist_update_period seconds (as per the related client configuration parameter »): chatlists.getChatlistUpdates
+ * Fetch new chats associated with an imported chat folder deep link ». Must be invoked at most every chatlistupdateperiod seconds (as per the related client configuration parameter »): chatlists.getChatlistUpdates
* Fetch saved notification sounds: account.getSavedRingtones
* Find out if a media message's caption can be edited: messages.getMessageEditData
* Finish account takeout session: account.finishTakeoutSession
@@ -575,7 +576,7 @@ Want to add your own open-source project to this list? [Click here!](https://doc
* Get unread messages where we were mentioned: messages.getUnreadMentions
* Get unread reactions to messages you sent: messages.getUnreadReactions
* Get web login widget authorizations: account.getWebAuthorizations
- * Get which users read a specific message: only available for groups and supergroups with less than chat_read_mark_size_threshold members, read receipts will be stored for chat_read_mark_expire_period seconds after the message was sent, see client configuration for more info »: messages.getMessageReadParticipants
+ * Get which users read a specific message: only available for groups and supergroups with less than chatreadmarksizethreshold members, read receipts will be stored for chatreadmarkexpireperiod seconds after the message was sent, see client configuration for more info »: messages.getMessageReadParticipants
* Gets current notification settings for a given user/group, from all users/all groups: account.getNotifySettings
* Gets featured custom emoji stickersets: messages.getFeaturedEmojiStickers
* Gets the default value of the Time-To-Live setting, applied to all new chats: messages.getDefaultHistoryTTL
@@ -637,7 +638,7 @@ Want to add your own open-source project to this list? [Click here!](https://doc
* MTProto to TDCLI params: MTProtoToTdcli
* Make a user admin in a basic group: messages.editChatAdmin
* Manually convert HTML to a message and a set of entities: htmlToMessageEntities
- * Manually convert markdown to a message and a set of entities: markdownToMessageEntities
+ * Manually convert markdown to a message and a set of entities: markdownToMessageEntities
* Manually mark dialog as unread: messages.markDialogUnread
* Mark channel/supergroup history as read: channels.readHistory
* Mark channel/supergroup message contents as read: channels.readMessageContents
diff --git a/composer.json b/composer.json
index 4f49ea8d7..df51f3777 100644
--- a/composer.json
+++ b/composer.json
@@ -26,7 +26,6 @@
"require": {
"php-64bit": ">=8.1",
"danog/primemodule": "^1",
- "erusev/parsedown": "^1.7",
"symfony/polyfill-mbstring": "*",
"ext-mbstring": "*",
"ext-json": "*",
diff --git a/docs b/docs
index d24140ca5..1dae2c3bc 160000
--- a/docs
+++ b/docs
@@ -1 +1 @@
-Subproject commit d24140ca57f743943341d38777f1246f038ce63b
+Subproject commit 1dae2c3bc73effbcd19cb61fe16e61050c1d6553
diff --git a/examples/bot.php b/examples/bot.php
index f723a6a92..e4dbe0a59 100755
--- a/examples/bot.php
+++ b/examples/bot.php
@@ -30,9 +30,7 @@ use danog\MadelineProto\EventHandler\Filter\FilterText;
use danog\MadelineProto\EventHandler\Message;
use danog\MadelineProto\EventHandler\SimpleFilter\FromAdmin;
use danog\MadelineProto\EventHandler\SimpleFilter\Incoming;
-use danog\MadelineProto\LocalFile;
use danog\MadelineProto\Logger;
-use danog\MadelineProto\RemoteUrl;
use danog\MadelineProto\Settings;
use danog\MadelineProto\Settings\Database\Mysql;
use danog\MadelineProto\Settings\Database\Postgres;
diff --git a/tests/danog/MadelineProto/EntitiesTest.php b/tests/danog/MadelineProto/EntitiesTest.php
index 3c64d9136..fdb7a5340 100644
--- a/tests/danog/MadelineProto/EntitiesTest.php
+++ b/tests/danog/MadelineProto/EntitiesTest.php
@@ -336,6 +336,19 @@ class EntitiesTest extends MadelineTestCase
],
],
],
+ [
+ 'markdown',
+ '![link ](https://google.com/)',
+ 'link ',
+ [
+ [
+ 'offset' => 0,
+ 'length' => 4,
+ 'type' => 'text_url',
+ 'url' => 'https://google.com/'
+ ],
+ ],
+ ],
[
'html',
'link test',
diff --git a/tests/makephar.sh b/tests/makephar.sh
index 9257abdd5..63513d1fe 100755
--- a/tests/makephar.sh
+++ b/tests/makephar.sh
@@ -31,7 +31,7 @@ if [ "$TAG" == "" ]; then
fi
if [ "$TAG" != "7777" ]; then
- grep -q "const RELEASE = '$TAG'" src/MTProto.php || {
+ grep -q "const RELEASE = '$TAG'" src/API.php || {
echo "The RELEASE constant is not up to date!"
exit 1
}