Upgrading from MadelineProto v7 to v8
MadelineProto v8 is a major MadelineProto update, that removes a large number of long-deprecated APIs: I’ve created this upgrade checklist, to simplify the upgrade process.
A much simpler way to check for backwards incompatible changes is to scan your project using Psalm, it’s truly a lifesaver!
Make sure to recreate the session too, as v7 sessions are not compatible with v8.
Settings
The main breaking change is the removal of array settings, deprecated since v6.
You can use object settings, instead, see here » for the full documentation, here’s a brief conversion example:
Before:
$settings = ['app_info' => ['api_id' => 123456, 'api_hash' => 'xxx']];
After:
$settings = (new \danog\MadelineProto\Settings\AppInfo)
->setApiId(123456)
->setApiHash('xxx');
See here » for the full list of MadelineProto v8 settings.
Please note that since v8, usage of invalid setting setters and getters will throw an exception (in v7 those usages were simply ignored).
Amp v3
MadelineProto v8 switches to using fibers and Amp v3 libraries.
Check out the changelogs of the amphp libraries for a list of breaking changes introduced with the update of Amp v3.
Regarding MadelineProto, yield
support in the event handler was removed and the async
and loop
methods were removed, along with all the Generator combinator methods (Tools::after
, Tools::all
, Tools::any
, Tools::first
, et cetera).
Instead, you can use the new async Amp v3 APIs, which do not require special keywords like yield
anymore!
Before:
class MyEventHandler {
public function onUpdateNewMessage(array $update): \Generator
{
$this->callForkDefer(function () {
yield $this->sleep(1.0);
yield $this->messages->sendMessage(...);
});
yield $this->messages->sendMessage(...);
}
}
After:
use Revolt\EventLoop;
use Amp\delay;
class MyEventHandler {
public function onUpdateNewMessage(array $update): void
{
EventLoop::queue(function () {
delay(1.0);
$this->messages->sendMessage(...);
});
$this->messages->sendMessage(...);
}
}
Before:
$API = new \danog\MadelineProto\API('session.madeline');
$API->async(true);
$API->loop(function () use ($API) {
yield $API->messages->sendMessage();
});
After:
$API = new \danog\MadelineProto\API('session.madeline');
$API->messages->sendMessage();
Loop API
The danog/loop
library was refactored, making it much more stable, and fixing some coroutine leaks which may have occurred in certain conditions.
All loop classes were moved to the danog\Loop
namespace, and the API now works with seconds instead of milliseconds.
Before:
use \danog\Loop\Generic\GenericLoop;
class ZeusHandler extends EventHandler
{
public function genLoop()
{
yield $this->account->updateStatus([
'offline' => false
]);
return 20 * 1000;
}
public function onStart()
{
$genLoop = new GenericLoop([$this, 'genLoop'], 'update Status');
$genLoop->start();
}
}
After:
use \danog\Loop\GenericLoop;
class ZeusHandler extends EventHandler
{
public function genLoop(): ?float
{
$this->account->updateStatus([
'offline' => false
]);
return 20.0;
}
public function onStart()
{
$genLoop = new GenericLoop($this->genLoop(...), 'update Status');
$genLoop->start();
}
}
Event handler
- Removed the long-deprecated
setEventHandler
and$MadelineProto->startAndLoop
methods, you should useMyEventHandler::startAndLoop
, instead. - Removed support for the deprecated onLoop method.
Most importantly, the EventHandler
class was deprecated, please use the SimpleEventHandler
class now.
The SimpleEventHandler
class still supports the legacy onUpdatexxx
event handler methods, however starting from v8 they are not covered by the backwards compatibility promise anymore.
This means that the structure of updates received in onUpdatexxx
event handler methods will change at any time, including in minor versions of MadelineProto v8: fields will be removed and changed with only a minor note will be added to the changelog.
The new filter-based event API » should be used instead of onUpdatexxx
methods: it’s much simpler to use, and is covered by the backwards compatibility promise, so its fields will not change or be removed in minor versions of MadelineProto v8.
class MyEventHandler extends \danog\MadelineProto\EventHandler {
}
$settings = ['app_info' => ['api_id' => 123456, 'api_hash' => 'xxx']];
$API = new \danog\MadelineProto\API('bot.madeline', $settings);
$API->startAndLoop(MyEventHandler::class);
After:
class MyEventHandler extends \danog\MadelineProto\SimpleEventHandler {
}
$settings = (new \danog\MadelineProto\Settings\AppInfo)
->setApiId(123456)
->setApiHash('xxx');
MyEventHandler::startAndLoop('bot.madeline', $settings);
Also, MadelineProto will actively prevent new event handler code from using blocking functions like file_get_contents
, file_put_contents
, curl
: see here » for a more detailed list of async alternatives.
No more snake_case methods
You can’t use snake_case
variants of MadelineProto methods anymore (deprecated since v5).
Before:
$info = $API->get_info('danogentili');
$me = $API->get_self();
After:
$info = $API->getInfo('danogentili');
$me = $API->getSelf();
Full breaking changelog
- [BC] REMOVED: the
getDialogs
method, please use thegetDialogIds
method, instead. - [BC] CHANGED: all
peerUser
,peerChat
,peerChannel
constructors were replaced with integer IDs. - [BC] REMOVED: internal
Input*
fields returned bygetInfo
- [BC] REMOVED: the long-deprecated
setEventHandler
method, you should useMyEventHandler::startAndLoop
, instead. - [BC] REMOVED: the deprecated $MadelineProto->startAndLoop method. Please use MyEventHandler::startAndLoop instead, remove any new \danog\MadelineProto\API line you have in your code if you’re using only the event handler.
- [BC] REMOVED: support for the deprecated onLoop method.
- [BC] REMOVED: the setCallback update handling method, please use the event handler with onAny instead.
- [BC] REMOVED: Promise wrapper types from return types everywhere.
- [BC] REMOVED: Removed the legacy MadelineProto Loop APIs, the new github.com/danog/loop APIs do not support generators anymore.
- [BC] REMOVED: Removed support for the long-deprecated snake_case methods, now only camelCase is supported (get_info will not work, only getInfo; and so on).
- [BC] REMOVED: Method danog\MadelineProto\VoIP#whenCreated() was removed
- [BC] REMOVED: Method danog\MadelineProto\StrTools::methodEscape() was removed
- [BC] REMOVED: Method danog\MadelineProto\StrTools::typeEscape() was removed
- [BC] REMOVED: Method danog\MadelineProto\Tools::after() was removed
- [BC] REMOVED: Method danog\MadelineProto\Tools::all() was removed
- [BC] REMOVED: Method danog\MadelineProto\Tools::any() was removed
- [BC] REMOVED: Method danog\MadelineProto\Tools::callForkDefer() was removed
- [BC] REMOVED: Method danog\MadelineProto\Tools::call() was removed
- [BC] REMOVED: Method danog\MadelineProto\Tools::first() was removed
- [BC] REMOVED: Method danog\MadelineProto\Tools::getVar() was removed
- [BC] REMOVED: Method danog\MadelineProto\Tools::hasVar() was removed
- [BC] REMOVED: Method danog\MadelineProto\Tools::setVar() was removed
- [BC] REMOVED: Method danog\MadelineProto\Tools::some() was removed
- [BC] REMOVED: Method danog\MadelineProto\Tools::timeout() was removed
- [BC] REMOVED: Method danog\MadelineProto\Tools::timeoutWithDefault() was removed
- [BC] REMOVED: Method danog\MadelineProto\Tools::wait() was removed
- [BC] REMOVED: Method danog\MadelineProto\Wrappers\Events#setEventHandler() was removed
- [BC] REMOVED: Method danog\MadelineProto\Wrappers\Loop#loopFork() was removed
- [BC] REMOVED: Method danog\MadelineProto\Wrappers\Loop#loop() was removed
- [BC] CHANGED: the isSupergroup, toSupergroup, fromSupergroup methods to a DialogId class, which also has many other useful methods to work with bot API IDs.
- [BC] CHANGED: All download methods except for downloadToFile and downloadToDir now return null instead of true.
- [BC] CHANGED: All
danog\MadelineProto\VoIP
constants were replaced with thedanog\MadelineProto\VoIP\CallState
,danog\MadelineProto\VoIP\VoIPState
enums. - [BC] CHANGED: The
danog\MadelineProto\VoIP
class was completely refactored, check out the new API for more info. - [BC] CHANGED: ORM properties can directly be iterated upon in a foreach without using getIterator (which will not return an amphp iterator anymore).
- [BC] CHANGED: Finalized a lot of classes that were mistakenly not marked as final.
- [BC] CHANGED: Made some internal details fully private.
- [BC] CHANGED: The session is now contained in a directory, instead of separate files.
- [BC] CHANGED: Automatic API ID fetching via the my.telegram.org wrapper was temporarily removed due to possible IP bans on webhosts.
- [BC] CHANGED: onStart now blocks all updates until it finishes executing. Use the amphp async primitives to start long-running processes in onStart like starting a webserver.
- [BC] CHANGED: You can’t assign arbitrary properties to an API instance anymore.
- [BC] CHANGED: Switched to a custom markdown parser with bot API MarkdownV2 syntax, which differs from the previous Markdown syntax supported by parsedown.
- [BC] CHANGED: Markdown text can’t contain HTML anymore.
- [BC] CHANGED: danog\MadelineProto\StrTools::methodEscape() was marked “@internal”
- [BC] CHANGED: danog\MadelineProto\StrTools::typeEscape() was marked “@internal”
- [BC] CHANGED: danog\MadelineProto\Tools::getVar() was marked “@internal”
- [BC] CHANGED: danog\MadelineProto\Tools::setVar() was marked “@internal”
- [BC] CHANGED: Parameter 0 of danog\MadelineProto\Tools::callFork() changed name from promise to callable
- [BC] CHANGED: Parameter 0 of danog\MadelineProto\Tools::genVectorHash() changed name from ints to longs
- [BC] CHANGED: Parameter 1 of danog\MadelineProto\Tools::callFork() changed name from actual to args
- [BC] CHANGED: The parameter $token of danog\MadelineProto\Tools::flock() changed from Amp\Promise|null to Amp\Cancellation|null
- [BC] CHANGED: The parameter $token of danog\MadelineProto\Tools::flock() changed from Amp\Promise|null to a non-contravariant Amp\Cancellation|null
- [BC] CHANGED: The return type of danog\MadelineProto\Tools::callFork() changed to Amp\Future
- [BC] CHANGED: The return type of danog\MadelineProto\Tools::echo() changed from Amp\Promise to the non-covariant void
- [BC] CHANGED: The return type of danog\MadelineProto\Tools::echo() changed from Amp\Promise to void
- [BC] CHANGED: The return type of danog\MadelineProto\Tools::flock() changed from Amp\Promise to Closure|null
- [BC] CHANGED: The return type of danog\MadelineProto\Tools::flock() changed from Amp\Promise to the non-covariant Closure|null
- [BC] CHANGED: The return type of danog\MadelineProto\Tools::readLine() changed from Amp\Promise to string
- [BC] CHANGED: The return type of danog\MadelineProto\Tools::readLine() changed from Amp\Promise to the non-covariant string
- [BC] CHANGED: The return type of danog\MadelineProto\Tools::sleep() changed from Amp\Promise to the non-covariant void
- [BC] CHANGED: The return type of danog\MadelineProto\Tools::sleep() changed from Amp\Promise to void
- [BC] CHANGED: The return type of danog\MadelineProto\Wrappers\Events#getEventHandler() changed from danog\MadelineProto\EventHandler to danog\MadelineProto\EventHandler|danog\MadelineProto\Ipc\EventHandlerProxy|__PHP_Incomplete_Class|null
- [BC] CHANGED: The return type of danog\MadelineProto\Wrappers\Events#getEventHandler() changed from danog\MadelineProto\EventHandler to the non-covariant danog\MadelineProto\EventHandler|danog\MadelineProto\Ipc\EventHandlerProxy|__PHP_Incomplete_Class|null