MadelineProto | Persian Channel
332 subscribers
3 photos
1 file
44 links
کانال تلگرامی MadelineProto Farsi !
مرجع آموزش و آپدیت های مدلین به زبان فارسی!

👥 Persian Group: https://t.me/joinchat/DtxwN0RlsQoKyN-lpSuOEw

👥 English Group: https://t.me/joinchat/Bgrajz6K-aJS2Dc5HJ7dsA

📢 English Channel:
@MadelineProto
Download Telegram
#handle_update #simple_filter
هندل آپدیت ها در نسخه 100 بتا

با توجه به php8 و قابلیت جدید Attribute مدلین قابلیت جدیدی برای هندل اپدیت ها ارائه کرده.
* هندل اپدیت بصورت قدیمی هنوز ممکنه ولی این روش کار رو بسیار آسون کرده.

برای هندل آپدیت ها ابتدا یک متود با Attribute Handler مینویسیم :

use danog\MadelineProto\EventHandler\Attributes\Handler;

#[Handler]
public function h1(Incoming & Message $message): void
{
// Handle all incoming messages (private+groups+channels).
}

هر متودی که اتربیوت Handler رو داشته باشه اپدیت ها به اون ارسال میشن.
برای فیلتر آپدیت ها دوتا راه دارید:
1- استفاده از Attribute Filter
2- استفاده از Simple Filter
- Simple Filter :
شما میتونید آبجکت هارو با هم ترکیب کنید
A|B , A&B
(A&B)|(C&D) ->
(فقط در php 8.2^)

مثال ها:
( پیام های ورودی: پیام هایی که دیگران میفرستند.
پیام های خروجی: پیام هایی که ربات میفرستد. )
Message
‎پیام های ورودی و خروجی

ChannelMessage
‎پیام های ورودی و خروجی کانال

GroupMessage
‎پیام های ورودی و خروجی گروه

PrivateMessage
‎پیام های ورودی و خروجی پیوی

ServiceMessage
‎پیام های ورودی و خروجی سرویس مسیج

AbstractMessage
‎پیام های ورودی و خروجی سرویس مسیج و پیام های عادی

Incoming & Message
‎پیام های ورودی

Incoming & GroupMessage & HasMedia
‎پیام های ورودی دارای رسانه گروه

موارد بیشتر رو میتونید از داکیومنت بررسی کنید.
#handle_update #attribute_filter

هندل آپدیت ها در نسخه 100 بتا - 2

- Attribute Filter :

use danog\MadelineProto\EventHandler\Filter\FilterIncoming;
#[FilterIncoming]
public function h1(Message $message): void
{
// Handle all incoming messages (private+groups+channels).
}

*نکته:
Attribute Filter ها کاملا با Simple Filter سازگار هستن و میتونن با همدیگه ترکیب بشن:

#[new FilterOr(new FilterGroup, new FilterChannel)]
public function h4(Incoming&Message&HasMedia $message)

#[new FilterAnd(new FilterIncoming, new FilterMessage, new FilterMedia, new FilterOr(new FilterGroup, new FilterChannel))]
public function h3($message): void

که این دو حالت کاملا شبیه زیر هست :
#[Handler]
public function h3(
(Incoming & GroupMessage & HasMedia) |
(Incoming & ChannelMessage & HasMedia)
$message
): void

لیست کامل فیلترها و مثال داخل داکیومنت وجود داره.
شما حتی میتونید یک فیلتر دلخواه ایجاد کنید یا حتی حالت فیلتر هارو تغییر بدید. (اطلاعات بیشتر)
#handle_update #bound_methods

در صورت استفاده از Filter ها شما میتونید از Bound Methods استفاده کنید.
برای این مورد واقعا اصطلاح فارسی بذهنم نمیرسه بنابراین مستقیم میرم سراغ مثال:

use danog\MadelineProto\EventHandler\Attributes\Handler;

#[Handler]
public function h1(Incoming & Message $message): void
{
$message->reply('HI');
}

معادل این کد:
public function onUpdateNewMessage($update): void
{
if(
!$update['message']['out'] &&
$update['message']['_'] == 'message'
)
$this->messages->sendMessage(
peer: $update,
message: 'Hi',
reply_to_msg_id: $update['message']['id']
);
}

واضحه که کارمون راحتتره.

همچنین پراپرتی ها و متودهایی داره که کارمون رو راحتتر کرده و میتونید از اینجا لیست کامل رو بچکید.
👎1
#cron

با آپدیت بتا 100 از این ببعد برای لوپ میشه اینشکلی استفاده کرد:

use danog\MadelineProto\EventHandler\Attributes\Cron;

#[Cron(period: 60.0)]
public function cron1(): void
{
$this->sendMessageToAdmins("The bot is online, current time ".date(DATE_RFC850)."!");
}

این متود هر شصت ثانیه اجرا میشه.

شما میتونید برای اتربیوت ها اعشار هم بدید که معادل میلی ثانیه میشه.
همچنین میتونید برای دریافت اطلاعات و سیگنال دادن از متود زیر استفاده کنید:
$this->getPeriodicLoop('اسم متود');

اطلاعات بیشتر
#beta102 #update

- اضافه شدن متود openFileAppendOnly برای بازکردن یک فایل بصورت async و مود a (فقط نوشتن)

- اضافه شدن متود getDownloadLink برای گرفتن لینک دانلود (تا 4 گیگ)

مثال:
<?php

if (!file_exists('madeline.php')) {
copy('https://phar.madelineproto.xyz/madeline.php', 'madeline.php');
}
include 'madeline.php';

$MadelineProto = new \danog\MadelineProto\API('session.madeline');
$MadelineProto->botLogin('توکن');

$link = $MadelineProto->getDownloadLink($fileId);

شما میتونید از MessageMedia هم استفاده کنید.

حتی میتونید تو bound method هم ازش استفاده کنید:
class MyEventHandler extends SimpleEventHandler {
/**
* Gets a download link for any file up to 4GB!
*/
#[FilterCommand('dl')]
public function downloadLink(Incoming&Message $message): void
{
if (!$message->replyToMsgId) {
$message->reply("This command must reply to a media message!");
return;
}
$message = $message->getReply();
if (!$message instanceof Message || !$message->media) {
$message->reply("This command must reply to a media message!");
return;
}
$message->reply("Download link: ".$message->media->getDownloadLink());
}
}

* نکته: درصورت اجرا توسط web لینک دانلود بصورت خودکار ساخته میشود.

در غیر اینصورت برای استفاده در حالت cli یا تغییر لینک باید مراحل زیر رو دنبال کنید.
فایل dl.php شما باید این شکلی باشه:
<?php

if (!file_exists('madeline.php')) {
copy('https://phar.madelineproto.xyz/madeline.php', 'madeline.php');
}
include 'madeline.php';

danog\MadelineProto\API::downloadServer('session.madeline');

و هنگام استفاده:
$link = $MadelineProto->getDownloadLink(
$botApiFileId,
'https://yourhost.com/dl.php',
size: $fileSize,
name: $fileName,
mime: $mimeType
);

و در صورت استفاده از فایل ایدی برای دریافت لینک باید اسم و سایز و نوع فایل رو بصورت دستی به متود بدید.

$botApiFileId = '...';
$fileName = '...';
$fileSize = 123..;
$mimeType = '...';

$link = $MadelineProto->getDownloadLink(
$botApiFileId,
size: $fileSize,
name: $fileName,
mime: $mimeType
);
#beta107 #update

قابلیت های جدید
- اضافه شدن متود getPeriodicLoops برای گرفتن تمام لوپ هایی که توسط اتربیوت cron ایجاد میشوند.
- اضافه شدن isReply به bound methods
#bound_methods
- لیست پراپرتی های bound methods :
- $message->message: string
متن پیام

- $message->fwdInfo: ?ForwardedInfo
اطلاعات درباره پیام هدایت شده

- $message->command: ?string
دستور ربات (در صورت وجود)

- $message->commandType: ?CommandType
نوع دستورات ربات (درصورت وجود)

- $message->commandArgs: list<string>
لیست دستورات بات (در صورت وجود)

- $message->protected: bool
آیا پیام حفاظت شده است؟

- $message->matches: list<string>
FilterRegex

- $message->fromScheduled: bool
آیا این یک پیام زمان بندی شده بوده است؟

- $message->viaBotId: ?int
در صورتی که پیام بصورت اینلاین ارسال شده باشد آیدی بات را نشان میدهد.

- $message->editDate: ?int
آخرین زمان ویرایش پیام

- $message->keyboard: InlineKeyboard|ReplyKeyboard|null
کیبورد پیام

- $message->nextSent: ?self @readonly
اگه پیام بیش از 4096 کاراکتر باشه ادامه پیام رو در قالب کلاس برمیگردونه

- $message->id: int
آیدی مسیج

- $message->out: bool
آیا این پیام از سمت خود اکانت ارسال شده

- $message->chatId: int
آیدی جایی که پیام ارسال شده

- $message->senderId: int
آیدی فرد فرستنده

- $message->replyToMsgId: ?int
آیدی پیامی که روی آن ریپلی شده

- $message->date: int
زمان ارسال پیام

- $message->topicId: ?int
آیدی تاپیکی که پیام در آن ارسال شده

- $message->replyToScheduled: bool
آیا پیام ریپلی شده یک پیام زمان بندی شده است؟

- $message->mentioned: bool
آیا اکانت در این پیام منشن شده است؟

- $message->silent: bool
آیا پیام بصورت بی صدا ارسال شده است؟

- $message->ttlPeriod: ?int
مدت زمان یک پیام نابود شونده

- $message->media
Media|null رسانه پیام
- $message->media->botApiFileId
    - $message->media->botApiFileUniqueId
‎ فایل ایدی رسانه
- $message->media->fileName, fileExt, creationDate, size, ...
لیست کامل پراپرتی های رسانه در اینجا موجود است.
#bound_methods
- لیست متود های bound methods :

- $message->getHTML(
bool $allowTelegramTags = false
): string
یک نسخه پیام با تگ های html برمیگرداند.
پارامتر allowTelegramTags مشخص میکند که تگ های خاص تلگرام مثل اسپویلر، منشن و ... نیز نمایش داده شوند یا نه.

- $message->getReply(): ?self
گرفتن اطلاعات پیام ریپلی شده.
درصورت پاک شدن پیام ریپلی شده null برمیگرداند.

- $message->delete(bool $revoke = true): void
پاک کردن پیام.
بصورت پیش فرض true = revoke است.
اگر false باشد پیام ها بصورت یک طرفه پاک میشوند.


- $message->reply(
string $message,
ParseMode $parseMode,
...
): \danog\MadelineProto\EventHandler\Message

ریپلی بر روی پیام.
برای پارامتر های بیشتر به داکیومنت مراجعه کنید.


برای کلیک کردن بر روی دکمه های کیبورد از روش زیر میتوانید کمک بگیرید:

- کلیک بر روی اولین دکمه ای که مقدارش برابر با label باشد.
$message->keyboard->press(
string $label,
bool $waitForResult
);

- کلیک بر روی دکمه با مختصات
$message->keyboard->pressByCoordinates(
int $row,
int $column,
bool $waitForResult
);
#beta108 #update
قابلیت های جدید :
- اضافه شدن پارامتر اختیاری type به FilterCommand و اضافه شدن ثابت های مربوط به آن(CommandType)
شما میتونید از این به بعد علاوه بر کامند به فیلتر مربوط به کامند تایپ هم بدین
مثال :
#[CommandFilter('hello',[CommandType::DOT,Command::SLASH])]
public function replyHello(Message&Incoming $message){
$message->reply('hello');
}

تو این حالت ربات فقط به ۲ تا کامند /hello , .hello جواب میده . در حال حاظر فقط ۳ تا حالت DOT,SLASH,BANG رو میتونید استفاده کنید و حتماباید به صورت ارایه ای از ثابت های CommandType به فیلترتون بدین(فیلتر کامند پارامتر دومش اختیاری هست و به صور دیفالت هر ۳ حالت رو درنظر میگیره)
مشکل های حل شده :
- حل مشکل مربوط به IPC در نسخه های Phar
- حل مشکل یکسری از مشکلات داخلی
MadelineProto | Persian Channel
#handle_update #simple_filter هندل آپدیت ها در نسخه 100 بتا با توجه به php8 و قابلیت جدید Attribute مدلین قابلیت جدیدی برای هندل اپدیت ها ارائه کرده. * هندل اپدیت بصورت قدیمی هنوز ممکنه ولی این روش کار رو بسیار آسون کرده. برای هندل آپدیت ها ابتدا یک متود…
دوستان یه چند تا نکته در مورد اپدیت #beta100 به بعد بگم خواهشا این پست رو بخونید و اگه باز سوالی بود زیر همین پست کامنت کنید :

1- اگر از کلاس EventHandler تو کدتون برای کلاس اصلی اکستند کنید :

- دیگ نمیتونید از فیلتر ها و توابع bound برا ساده سازی کدتون استفاده کنید

- استفاده از توابع بلاک شده و کلاس های بلاک شده (از جمله :
file_get_contents, file_put_contents,
Amp\file\{get, put},
mysql, mysqli, PDO
کدتون به وارنینگ میخوره (ربات به کار خودش ادامه میده).
بجز تابع openFileAppendOnly بقیه توابع فایل بلاک هستند

- استفاده نکردن یا لیک strict_types=1 یک عدد وارنینگ خواهد داشت. (ربات همچنان به کارش ادامه میده)

- استفاده از unlink('MadelineProto.Log') وارنینگ خواهد داشت.
(اینو من بالای ۱۰۰ بار تو سورس های قدیمی دیدم و میبینید فایل لاگ چقدر مهمه که دنیل هم رو این مورد حساس شده )

- استفاده از توابع require , include داخل کلاس ها یا متود ها یک عدد fatal-error خواهد داشت.
(تو این حالت به کل ارور به شما میده و دیگ به کارش ادامه نمیده)
برا استفاده از این توابع بالای کدتون و خارج از کلاس ها و توابع تون استفاده کنید.

2- اگر کلاستون از کلاس SimpleEventHandler استفاده کنه و اکستند کنه به عنوان کلاس اصلی :

- شما میتونید از فیلتر ها یا توابع bound برا راحتی هندل کار هاتون و مسیج هاتون استفاده کنید

- استفاده از توابع فایل و کلاس ها و توابع بن شده اینبار fatal-error خواهد داشت و ربات دیگ به کار خودش ادامه نخواهد داد.
(بجز متود openFileAppendOnly)

- استفاده نکردن از strict_types=1 یا لیک آن fatal-error خواهد داشت

- استفاده از unlink('MadelineProto.Log') به دنبال خود fatal-error خواهد داشت

- استفاده از توابع require و include هر کجای کدتون fatal-error خواهد داشت.
شما باید از استراتژی PSR-4 برا لود کردن پلاگین ها و شناسوندنشون به تابع getPluginPaths استفاده کنید.

همچنین میتونید توابعتون رو داخل فایل به نام functions.php بزارید و مدلین بصورت خودکار اونو لود میکنه.

(نیم اسپیستون بهتره MadelinPlugin\name باشه که اینجا name اسم خودتون هستش)

و در اخر این که دنیل در مورد فایل ها خیلی جدی هستش و گفته میخواد استفاده از همشون رو بن کنه ولی در حال حاظر گفته به همین حالت که توضیح دادم رهاشون کرده ...

📕 کانال رسمی مدلین فارسی رو به دوستان خود معرفی کنید.
@Madeline_Farsi
👍1
#update #beta109 & #beta110

- اضافه کردن قابلیت گرفتن نام کلاس هندلر به متود getEventHandler
- حل مشکل پارس کردن thumbnail ( بکگراند فیلم ها)
- حل مشکل content-type/extension در دو متود (getDownloadLink ,downloadToBrowser)

این اپدیت بیشتر جنبه فیکس کردن باگ ها رو داشته
#update #beta111 & #beta112
- بهبود لاگر
- حل مشکل متود باند delete در سوپر گروه ها و چنل ها
شما برای ذخیره پراپرتی ها و چک کردنشون واستفاده از اونا میومدین از کد زیر استفاده میکردین

use Amp\File\read;
use Amp\File\write;
// WRONG!
if (!read('online.txt'))
{
write('online.txt', 'on');
}

اما این کد اصلا پیشنهاد نمیشه!!(چرا که شما برا رباتتون قطعا از دیتابیس استفاده میکنید پس چرا یه مرحله بیاین تو فایل بنویسید و فقط سرورتون رو شلوغ کنید یا دیگ بدتر از توابعی مثل file_get_contents و file_put_contents استفاده کنید که کلا کارشون بلاک کردن اون ترد یا پروسه تا اتمام کارشون هست!!!)

حالا راه حل چیه؟ از اونجا که تو این پست گفتم توابع فایل به کل بلاک هستن پس فایل رو میریزیم دور
بجاش میایم یا از amphp/mysql استفاده میکنیم(که اینم برا کسایه که مجبورن و خب به هر طریقی نمیتونن از پراپرتی استفاده کنن)

یا راه حل بهتر استفاده از پراپرتی هاست
حالا چطوری؟ بزارید یه مثال بزنم

class OnlinePlugin extends PluginEventHandler
{
private bool $online = true;
public function setOnline(bool $online): void
{
$this->online = $online;
}
public function __sleep() : void
{
return ['online'];
}
#[FilterCommand('online')]
public function toggleOnline(Message $message)
{
$this->online = true;
}
.......
}

استفادش همینقدر راحته شما یه پراپرتی هاتون اول کد تعریف میکنید در نهایت داخل تابع __sleep به صورت ارایه ای از اسم پراپرتی ها ریترن میکنیدشون کد کاملش اینجاست

اما خب این برا دوستانی که ربات هلپر هم برا سلفشون دارن میتونه بسیار کمک کنه اما چجوری؟
تصور کنید من یه یوزر بات دارم که اسم کلاس پلاگینم همون OnlinePlugin هستش و داخلش همونطور که بالا میبینید تابعی هست به اسم setOnline(در واقع setter امون هستش)
اگه بخوام ربات هلپر رو به یوزر بات متصل کنم و اون پراپرتی رو کنترلش کنم(on , off اش رو)

$online = true;

$API = new \danog\MadelineProto\API('session.madeline');

$API->getEventHandler(\MadelinePlugin\Danogentili\OnlinePlugin::class)->setOnline($online);
#update #beta113 #beta115

- اضافه شدن متود های مربوط به استوری تلگرام

- اضافه شدن لینک دانلود استوری به متود getDownloadLink

- ربات tgstories_dl_bot توسط مدلین نوشته شده و هر استوری تلگرام را میتونه دانلود کنه!
همچنین سورس کد اون در گیتهاب موجوده.

همچنین میتونید لینک ، فایل لوکال ، یا MessageMedia را با مدلین استوری کنید!
مثال:
$media = [
'_' => 'inputMediaUploadedPhoto',
'file' => 'faust.jpg'
];

$MadelineProto->stories->sendStory(
media: $media,
caption: "This story was posted using [MadelineProto](https://t.me/MadelineProto)!",
parse_mode: ParseMode::MARKDOWN,
privacy_rules: [['_' => 'inputPrivacyValueAllowAll']]
);
- پارس مود برای متود های استوری پشتیبانی میشه.

- حل شدن مشکل متود getReply در کانال و سوپرگروه
همچنین در صورت ریپلی نشدن پیام روی پیام دیگری null برمیگرداند.

- اضافه شدن متود های isSelfUser, isSelfBot که مشخص میکنه اکانت یوزر هست یا ربات.

- اضافه شدن تعیین لینک پیشفرض برای متود getDownloadLink در تنظیمات (CLI)

- اضافه شدن DialogMessagePinned بهمراه متود getPinnedMessage

- فیکس شدن باگ startAndLoopMulti
#update #beta116
- حل مشکلات updateSettings, getReply and FilterReplyToSelf!
#update #beta118

- اضافه شدن فیلتر FilterTextCaseInsensitive
این فیلتر مثل FilterText هستش با این تفاوت که به حروف بزرگ و کوچک حساس نیستش

- فیکس شدن باگ های جزئی
#update #beta119
- بررسی توابع کلاس eventHandler و PluginEventHandler و گزارش ارور ها (از جمله use نشدن کلاس ها و ...)
- بهبود کلاس BotApiFileId و اضافه شدن ۳ پارامتر اجباری $siza و $fileName و $protected
- بن شدن توابع exec,shell_exec , proc_open ( از این پس بجای این توابع شما از amphp/process اسفاده میکنید )
#update #beta120
- بهبود تابع getReply
- هشدار درباره اپدیت ها و توابع ( همون use نکردن و یه جورایی انالیز کد شما ) در صحفه لاگین
- حل مشکل کانکت شدن در HTTP/HTTPS/WS/WSS پروتکل های مربوط به MTProto
#update #beta125
- اضافه شدن StaticSticker, AnimatedSticker, VideoSticker به مدیا ها.
- فیکس شدن ارور های داخلی
- اضافه شدن FilterFromSender ( نسخه تکی FilterFromSenders )
- عوض شدن استراکچر IPC در داخل API داخلی و بهبود آن
- فیکس شدن باگ IPC
#update #beta126

- اضافه شدن باند متود های مسیج : addReaction, delReaction, getOurReactions, pin, unpin توسط @J_A_V_A

- از این پس شما میتوانید از traits, interfaces در پلاگین ها استفاده کنید

- حل مشکل ساخت سشن
CopyMsg.php
2.3 KB
پلاگین جدید
❗️برای ورژن پلاگینی مدلین (beta126)

> قابلیت کپی کردن هر پیامی
> در پوشه Plugins آپلود کنید
> دستور copy + ریپلای روی پیام

*️⃣
Please open Telegram to view this post
VIEW IN TELEGRAM