mirror of
https://github.com/danog/MadelineProto.git
synced 2024-11-30 08:39:00 +01:00
Allow usage of getPlugin from IPC clients thanks to the PluginEventHandlerProxy
This commit is contained in:
parent
e5fddecce9
commit
f314cd9f2c
@ -263,7 +263,7 @@ Want to add your own open-source project to this list? [Click here!](https://doc
|
||||
* <a href="https://docs.madelineproto.xyz/API_docs/methods/stickers.changeStickerPosition.html" name="stickers.changeStickerPosition">Changes the absolute position of a sticker in the set to which it belongs; for bots only. The sticker set must have been created by the bot: stickers.changeStickerPosition</a>
|
||||
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.setDefaultHistoryTTL.html" name="messages.setDefaultHistoryTTL">Changes the default value of the Time-To-Live setting, applied to all new chats: messages.setDefaultHistoryTTL</a>
|
||||
* <a href="https://docs.madelineproto.xyz/API_docs/methods/account.updateUsername.html" name="account.updateUsername">Changes username for the current user: account.updateUsername</a>
|
||||
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#hasplugininstance-class-string-eventhandler-class-bool" name="hasPluginInstance">Check if a certain event handler plugin is installed: hasPluginInstance</a>
|
||||
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#hasplugin-class-string-eventhandler-class-bool" name="hasPlugin">Check if a certain event handler plugin is installed: hasPlugin</a>
|
||||
* <a href="https://docs.madelineproto.xyz/API_docs/methods/channels.checkUsername.html" name="channels.checkUsername">Check if a username is free and can be assigned to a channel/supergroup: channels.checkUsername</a>
|
||||
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#haseventhandler-bool" name="hasEventHandler">Check if an event handler instance is present: hasEventHandler</a>
|
||||
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#hasreportpeers-bool" name="hasReportPeers">Check if has report peers: hasReportPeers</a>
|
||||
@ -628,7 +628,7 @@ Want to add your own open-source project to this list? [Click here!](https://doc
|
||||
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.readMessageContents.html" name="messages.readMessageContents">Notifies the sender about the recipient having listened a voice message or watched a video: messages.readMessageContents</a>
|
||||
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.sendScreenshotNotification.html" name="messages.sendScreenshotNotification">Notify the other user in a private chat that a screenshot of the chat was taken: messages.sendScreenshotNotification</a>
|
||||
* <a href="https://docs.madelineproto.xyz/API_docs/methods/users.setSecureValueErrors.html" name="users.setSecureValueErrors">Notify the user that the sent passport data contains some errors The user will not be able to re-submit their Passport data to you until the errors are fixed (the contents of the field for which you returned the error must change): users.setSecureValueErrors</a>
|
||||
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#getplugininstance-class-string-t-class-danog-madelineproto-eventhandler" name="getPluginInstance">Obtain a certain event handler plugin instance: getPluginInstance</a>
|
||||
* <a href="https://docs.madelineproto.xyz/PHP/danog/MadelineProto/API.html#getplugin-class-string-t-class-danog-madelineproto-plugineventhandler-danog-madelineproto-ipc-plugineventhandlerproxy-null" name="getPlugin">Obtain a certain event handler plugin instance: getPlugin</a>
|
||||
* <a href="https://docs.madelineproto.xyz/API_docs/methods/bots.getBotCommands.html" name="bots.getBotCommands">Obtain a list of bot commands for the specified bot scope and language code: bots.getBotCommands</a>
|
||||
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.getEmojiKeywordsLanguages.html" name="messages.getEmojiKeywordsLanguages">Obtain a list of related languages that must be used when fetching emoji keyword lists »: messages.getEmojiKeywordsLanguages</a>
|
||||
* <a href="https://docs.madelineproto.xyz/API_docs/methods/messages.getAvailableReactions.html" name="messages.getAvailableReactions">Obtain available message reactions »: messages.getAvailableReactions</a>
|
||||
|
@ -949,11 +949,11 @@ abstract class InternalDoc
|
||||
*
|
||||
* @param class-string<T> $class
|
||||
*
|
||||
* return T
|
||||
* return T|null
|
||||
*/
|
||||
public function getPluginInstance(string $class): \danog\MadelineProto\EventHandler
|
||||
public function getPlugin(string $class): \danog\MadelineProto\PluginEventHandler|\danog\MadelineProto\Ipc\PluginEventHandlerProxy|null
|
||||
{
|
||||
return $this->wrapper->getAPI()->getPluginInstance($class);
|
||||
return $this->wrapper->getAPI()->getPlugin($class);
|
||||
}
|
||||
/**
|
||||
* Get download info of the propic of a user
|
||||
@ -1081,9 +1081,9 @@ abstract class InternalDoc
|
||||
*
|
||||
* @param class-string<EventHandler> $class
|
||||
*/
|
||||
public function hasPluginInstance(string $class): bool
|
||||
public function hasPlugin(string $class): bool
|
||||
{
|
||||
return $this->wrapper->getAPI()->hasPluginInstance($class);
|
||||
return $this->wrapper->getAPI()->hasPlugin($class);
|
||||
}
|
||||
/**
|
||||
* Check if has report peers.
|
||||
|
@ -78,6 +78,11 @@ final class Client extends ClientAbstract
|
||||
self::$instances[$session->getSessionDirectoryPath()] = $this;
|
||||
EventLoop::queue($this->loopInternal(...));
|
||||
}
|
||||
/** @internal */
|
||||
public function getSession(): SessionPaths
|
||||
{
|
||||
return $this->session;
|
||||
}
|
||||
/**
|
||||
* Run the provided async callable.
|
||||
*
|
||||
@ -316,4 +321,8 @@ final class Client extends ClientAbstract
|
||||
{
|
||||
throw new Exception("Can't use ".__FUNCTION__.' in an IPC client instance, please use startAndLoop, instead!');
|
||||
}
|
||||
public function getPlugin(string $class): ?PluginEventHandlerProxy
|
||||
{
|
||||
return $this->hasPlugin($class) ? new PluginEventHandlerProxy($class, $this) : null;
|
||||
}
|
||||
}
|
||||
|
@ -16,10 +16,14 @@ abstract class IpcCapable
|
||||
|
||||
/** @internal */
|
||||
protected function __construct(
|
||||
MTProto $API,
|
||||
MTProto|Client $API,
|
||||
) {
|
||||
$this->API = $API;
|
||||
if ($API instanceof MTProto) {
|
||||
$this->session = $API->wrapper->getSession()->getSessionDirectoryPath();
|
||||
} else {
|
||||
$this->session = $API->getSession()->getSessionDirectoryPath();
|
||||
}
|
||||
}
|
||||
|
||||
/** @internal */
|
||||
|
40
src/Ipc/PluginEventHandlerProxy.php
Normal file
40
src/Ipc/PluginEventHandlerProxy.php
Normal file
@ -0,0 +1,40 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace danog\MadelineProto\Ipc;
|
||||
|
||||
/**
|
||||
* Plugin event handler proxy object, for use through the IPC API.
|
||||
*/
|
||||
final class PluginEventHandlerProxy extends IpcCapable
|
||||
{
|
||||
public function __construct(
|
||||
private readonly ?string $__plugin,
|
||||
Client $API
|
||||
) {
|
||||
parent::__construct($API);
|
||||
}
|
||||
public function __call(string $name, array $arguments): mixed
|
||||
{
|
||||
return $this->API->callPluginMethod(
|
||||
$this->__plugin,
|
||||
$name,
|
||||
$arguments
|
||||
);
|
||||
}
|
||||
public function __get(string $name): mixed
|
||||
{
|
||||
return $this->API->getPluginProperty($this->__plugin, $name);
|
||||
}
|
||||
public function __set(string $name, mixed $value): void
|
||||
{
|
||||
$this->API->setPluginProperty($this->__plugin, $name, $value);
|
||||
}
|
||||
public function __isset(string $name): bool
|
||||
{
|
||||
return $this->API->issetPluginProperty($this->__plugin, $name);
|
||||
}
|
||||
public function __unset(string $name): void
|
||||
{
|
||||
$this->API->unsetPluginProperty($this->__plugin, $name);
|
||||
}
|
||||
}
|
@ -1740,7 +1740,7 @@ final class MTProto implements TLCallback, LoggerGetter
|
||||
throw Exception::extension('memprof');
|
||||
}
|
||||
if (!\memprof_enabled()) {
|
||||
throw new Exception("Memory profiling is not enabled in the database settings, set the MEMPROF_PROFILE=1 environment variable or GET parameter to enable it.");
|
||||
throw new Exception("Memory profiling is not enabled, set the MEMPROF_PROFILE=1 environment variable or GET parameter to enable it.");
|
||||
}
|
||||
|
||||
$current = "Current memory usage: ".\round(\memory_get_usage()/1024/1024, 1) . " MB";
|
||||
|
@ -21,9 +21,10 @@ declare(strict_types=1);
|
||||
namespace danog\MadelineProto\Wrappers;
|
||||
|
||||
use __PHP_Incomplete_Class;
|
||||
use AssertionError;
|
||||
use danog\MadelineProto\EventHandler;
|
||||
use danog\MadelineProto\Exception;
|
||||
use danog\MadelineProto\Ipc\PluginEventHandlerProxy;
|
||||
use danog\MadelineProto\PluginEventHandler;
|
||||
use danog\MadelineProto\Settings;
|
||||
use danog\MadelineProto\UpdateHandlerType;
|
||||
|
||||
@ -107,7 +108,7 @@ trait Events
|
||||
*
|
||||
* @param class-string<EventHandler> $class
|
||||
*/
|
||||
final public function hasPluginInstance(string $class): bool
|
||||
final public function hasPlugin(string $class): bool
|
||||
{
|
||||
return isset($this->pluginInstances[$class]);
|
||||
}
|
||||
@ -118,14 +119,11 @@ trait Events
|
||||
*
|
||||
* @param class-string<T> $class
|
||||
*
|
||||
* return T
|
||||
* return T|null
|
||||
*/
|
||||
final public function getPluginInstance(string $class): EventHandler
|
||||
final public function getPlugin(string $class): PluginEventHandler|PluginEventHandlerProxy|null
|
||||
{
|
||||
if (!isset($this->pluginInstances[$class]) || !$this->pluginInstances[$class] instanceof EventHandler) {
|
||||
throw new AssertionError("Plugin instance for $class not found!");
|
||||
}
|
||||
return $this->pluginInstances[$class];
|
||||
return $this->pluginInstances[$class] ?? null;
|
||||
}
|
||||
/**
|
||||
* Unset event handler.
|
||||
@ -154,4 +152,29 @@ trait Events
|
||||
{
|
||||
return isset($this->event_handler_instance);
|
||||
}
|
||||
/** @internal */
|
||||
public function callPluginMethod(string $class, string $method, array $args): mixed
|
||||
{
|
||||
return $this->pluginInstances[$class]->$method(...$args);
|
||||
}
|
||||
/** @internal */
|
||||
public function setPluginProperty(string $class, string $property, mixed $value): void
|
||||
{
|
||||
$this->pluginInstances[$class]->$property = $value;
|
||||
}
|
||||
/** @internal */
|
||||
public function getPluginProperty(string $class, string $property): mixed
|
||||
{
|
||||
return $this->pluginInstances[$class]->$property;
|
||||
}
|
||||
/** @internal */
|
||||
public function issetPluginProperty(string $class, string $property): bool
|
||||
{
|
||||
return isset($this->pluginInstances[$class]->$property);
|
||||
}
|
||||
/** @internal */
|
||||
public function unsetPluginProperty(string $class, string $property): void
|
||||
{
|
||||
unset($this->pluginInstances[$class]->$property);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user