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
میدلاین چیست؟
میدلاین یک لایبرری (کتابخانه ای بهتر از tg-cli) است که به شما اجازه میدهد که ربات بسازید، ربات هایی با اکانتهای معمولی تلگرام بسازید و یا حتی رادیو راه اندازی کنید! نمونه ربات: @magnaluna (با این اکانت تماس بگیرید و رادیو گوش دهید!).

⬅️ این کتابخانه به شما اجازه میدهد که بصورت یک اکانت معمولی یا ربات تلگرام لاگین کنید و امکانات زیر را در اختیار شما قرار میدهد:

مدیریت چت های امنیتی (Secret Chat).
پخش فایل صوتی دلخواه در تماس های ورودی.
ایجاد کیبورد با دکمه های اینلاین و معمولی.
آپلود و دانلود فایل تا حجم 1.5گیگ.
ورود به گروه ها.
مدیریت پسورد ورود دو مرحله ای اکانت.
ساخت ربات با قابلیت پرداخت های تحت تلگرام.
تغییر پس زمینه چت.
گزارش تخلف کاربران، کانل و ربات ها (report).
ارسال پیام به کاربر دلخواه.
مدیرت بیوگرافی، عکس پروفایل و مشخصات اکانت خود.
ساخت و مدیرت گروه، سوپرگروه و کانال.
ساخت اکانت تلگرام (ثبت نام شماره جدید).
افزودن و دعوت کاربران به گروه و کانال.
قابلیت پیش نمایش صفحات وب.
افزودن، مدیریت و یا بلاک کردن مخاطب.
دانلود مستقیم ترجمه های تلگرام از سرورهای تلگرام.
جستجوی پیام کاربران، مخاطبان.
بدست آوردن لیست کامل کابران گروه و یا کانال.
مدیریت اعضای گروه، مانند ایجاد محدودیت در ارسال پیام، استیکر و... و یا پین کردن یک پیام در گروه، تغییر لینک دعوت گروه و همچنین مدیرت اعضای کانال های خود.
و هر امکانی که ربات های رسمی میتوانند انجام دهند با میدلاین هم میتوانید انجام دهید.
همچنین هر امکانی که نرم افزار تلگرام رسمی دارد، میدلاین نیز دارد.

📌 این کتابخانه قابل استفاده در اکثر زبان ها مانند PHP, Lua, Python, Javascript, Java, Rust, C++, C#, VBS (xd) است و هم اکنون توسط سایت رسمی تلگرام مورد تایید قرارگرفته است. (telegram.org/apps).

🌐 راهنمای کامل این کتابخانه را از لینک های زیر مطالعه کنید:
🔗 docs.madelineproto.xyz
🔗 pwrtelegram.xyz

📕 کانال رسمی مدلین فارسی رو به دوستان خود معرفی کنید.
@Madeline_Farsi
👍1
📘 آموزش جهت بکارگیری راحت تر دکمه های اینلاین. | #API | #ای‌پی‌آی

🔖 امروز لازم شد برای راحت تر شدن ساختن دکمه های اینلاین (شیشه ای) برای ربات های میدلاین یه فانکشن بنویسم.
کد و طرز استفادشو اینجا میزارم شاید بدرد شما هم بخوره! جا داره بگم که این آموزش فقط برای اکانت های ربات کاربرد داره و توی user bot ها نمیشه کیبورد ساخت.
اول از همه این که این فانکشن باید توی کلاس ایونت هندلر استفاده بشه،
مثلا قبل از جایی که نوشته
public function onUpdateNewMessage(array $update)

🔖 کد (فانکشن) زیر را قرار دهید:
public function makeKeyboard(array $Keyboard): array{
$_keyboard['_'] = 'replyInlineMarkup';
foreach ($Keyboard as $row) {
$_row['_'] = 'keyboardButtonRow';
foreach ($row as $button) {
if (isset($button['data'])) {
$_button['_'] = 'keyboardButtonCallback';
} elseif (isset($button['url'])) {
$_button['_'] = 'keyboardButtonUrl';
} elseif (isset($button['phone'])) {
$_button['_'] = 'keyboardButtonRequestPhone';
} elseif (isset($button['location'])) {
$_button['_'] = 'keyboardButtonRequestGeoLocation';
} elseif (isset($button['query'])) {
$_button['_'] = 'keyboardButtonSwitchInline';
} else {
$_button['_'] = 'keyboardButton';
}
$_button = array_merge($_button, $button);
$_row['buttons'][] = $_button;
unset($_button);
}
$_keyboard['rows'][] = $_row;
unset($_row);
}
return $_keyboard;
}

روش استفاده هم بسیار راحت هست...
یه متغیر تعریف میکنیم با شماره ردیف دکمه و دکمه ها
$keyboard[ROW_NUMBER][] = [BUTTON];
$keyboard = yield $this->makeKeyboard($keyboard);

این متغیر دکمه BUTTON رو در ردیف ROW_NUMBER قرار میده (البته باید به این توجه کنین که شماره ردیف دکمه باید از 0 شروع بشه و برای هر ردیف حداقل یه دکمه در نظر بگیرین).
کافیه یکم اطلاعات راجب دکمه های اینلاین داشته باشین که هر کدوم چه پارامتر هایی لازم دارن و یه نگاهی هم به طرز کار فانکشن بندازین.
🔖 توضیح چند مورد از پر کاربرد ترین ها:

1) نحوه ساختن دکمه خالی:
این دکمه هیچ کاری قرار نیست انجام بده! فقط زیر پیام قرار میگیره.
تنها پارامتری که این دکمه لازم داره 'text' هست.
مثال:
$keyboard[0][] = ['text' => 'متن دکمه 1 ردیف 1'];
$keyboard[0][] = ['text' => 'متن دکمه 2 ردیف 1'];
$keyboard[1][] = ['text' => 'متن دکمه 1 ردیف 2'];
$keyboard = yield $this->makeKeyboard($keyboard);

2) نحوه ساخت دکمه کالبک (callback):
این دکمه اگه توسط کاربر کلیک بشه آپدیت callback query رو به ربات برمیگردونه.
پارامتر های لازم برای این دکمه 'text' و 'data' هستن.
$keyboard[0][] = ['text' => 'متن دکمه' data => 'کالبک کوئری'];
$keyboard = yield $this->makeKeyboard($keyboard);

بعد از همه اینا برای استفاده از کیبورد توی پیام ربات کافیه که متغیر $keyboard رو توی متد هایی که پارامتر reply_markup دارند بزارید!
مثلا:
yield $this->messages->sendMessage(['peer' => $update, 'message' => 'test', 'parse_mode' => 'Markdown', 'reply_markup' => $keyboard]);


📕 کانال رسمی میدلاین فارسی رو به دوستان خود معرفی کنید.
@Madeline_Farsi
سلام دوستان
دیدم یه عده با کارکردن روی پروفایل توی میدلاین ی سری مشکلا دارن
این سورس رو نوشتم برای این دسته از دوستان
قابلیت ها:
* تنظیم عکس های پیام ها بعنوان پروفایل
* حذف دسته ای پروفایل ها
* کپی پروفایل کاربران
* تنظیم ساعت روی عکس پروفایل همراه با جایگزینی هر عکس با عکس قبلی

لینک گیتهاب فایل:
https://github.com/realSamy/MadelineProto.Examples/blob/master/ProfilePhotoManager.php

دانلود کل ریبازیتوری:
https://github.com/realSamy/MadelineProto.Examples/archive/master.zip

📕 کانال رسمی مدلین فارسی رو به دوستان خود معرفی کنید.
@Madeline_Farsi
📘 دریافت و ذخیره اطلاعات بصورت اسینک در ربات های میدلاین | async

👈🏻 همونطور که شاید ندونید! میدلاین یه متد داره به اسم fileGetContents برای دریافت اطلاعات بصورت async که طرز استفاده ازش به این صورته.

$results = yield $MadelineProto->fileGetContents('
http://domain.com/file.txt');

👈🏻 دلیل بهتر بودن این متد نسبت به تابع file_get_contents اینه که اگه ما از این تابع استفاده کنیم توی مدت زمانی که این تابع داره عملیاتشو انجام میده ربات هم کند کار میکنه یا کلا متوقف میشه چون این تابع توی فعالیت async اختلال ایجاد میکنه.
ولی متدی که گفته شد بصورت async عمل میکنه و مانع فعالیت کلی ربات نمیشه.

👈🏻 و همینطور که شاید اینم ندونین میدلاین متدی برای ذخیره اطلاعات خارج از تلگرام توی هاست (لوکال) نداره و دوستانی که از دیتابیس های بصورت فایل مثلا json استفاده میکنن معمولا از تابع file_put_contents استفاده میکنن که متاسفانه این تابع هم فعالیت async رو مختل میکنه! ولی به راحتی با استفاده از کتابخانه Amphp که همراه با میدلاین نصب میشه میتونین یه متد برای ذخیره اطلاعات بصورت async داشته باشین، کافیه متد پایین رو توی کلاس ایونت هندلرتون قرار بدین:

final public function filePutContents (string $fileName, string $contents): Amp\Promise{
return Amp\File\put($fileName, $contents);
}

✳️ برای استفاده از این متد توی کلاس ایونت هندلر کافیه بصورت پایین عمل کنین:

yield $this->filePutContents('path/to/file.ext', 'content to save');

به پست های جدید رجوع کنید
1- استفاده از پراپرتی ها
2- نوشتن درون یک فایل
📕 کانال رسمی مدلین فارسی رو به دوستان خود معرفی کنید.
@Madeline_Farsi
MadelineProto | Persian Channel
📘 دریافت و ذخیره اطلاعات بصورت اسینک در ربات های میدلاین | async 👈🏻 همونطور که شاید ندونید! میدلاین یه متد داره به اسم fileGetContents برای دریافت اطلاعات بصورت async که طرز استفاده ازش به این صورته. $results = yield $MadelineProto->fileGetContents('htt…
سلام دوستان

👈🏻از اونجایی که متد fileGetContents فقط برای دریافت محتویات لینک ها کاربرد داره متد جدیدی رو براتون آماده کردم برای گرفتن محتویات فایل های داخل هاستتون بصورت async!

👈🏻همونطور که توی مثال های قبل دیدین این متد رو توی کلاس ایونت هندلر تعریف کنین:

final public function getLocalContents(string $path): Amp\Promise
{
return Amp\File\get($path);
}

👈🏻و بعد برای دریافت محتویات فایلتون اینطوری عمل کنین:

$fileContents = yield $this->getLocalContents('file.txt');

به پست های جدید رجوع کنید
1- استفاده از پراپرتی ها
2- نوشتن درون یک فایل
📕 کانال رسمی مدلین فارسی رو به دوستان خود معرفی کنید.
@Madeline_Farsi
سلام دوستان
#api #restapi

💠تاحالا لازمتون شده بخواین از میدلاین به عنوان یه rest api استفاده کنین و اطلاعاتی رو با کمک میدلاین خروجی بگیرین؟

یه سورس ساده نوشتم براتون که بتونین با کمک اون خروجی متد getInfo رو بصورت json بگیرین!

<?php
use \danog\MadelineProto\API;
if (!file_exists('madeline.php')) {
copy('https://phar.madelineproto.xyz/madeline.php', 'madeline.php');
}
include 'madeline.php';
$MadelineProto = new API('@Madeline_Farsi');
$MadelineProto->start();
$info = $MadelineProto->getInfo($_GET['user'] ?? 'me');
header('Content-Type: application/json');
echo json_encode($info, 64|128|256);

👈🏻 کد نکته خاصی نداره فقط اینکه اطلاعات کاربر، کانال یا گروهی که بصورت لینک پایین بهش داده بشه رو بصورت json بهتون برمیگرونه!
https://domain.ext/path/to/source.php?user=realSamy

📕 کانال رسمی مدلین فارسی رو به دوستان خود معرفی کنید.
@Madeline_Farsi
تیکه کد تگ کردن تمام اعضای گروه
if (preg_match("/^[\/\#\!]?(tag)(.*)$/i", $text)) {
$chat = yield $this->getPwrChat($chat_id);
$chats = $chat['participants'];
while (sizeof($chats) >= 100) {
$spl = $chats;
$Safa = false;
$chats = array_splice($spl, 100);
foreach ($spl as $number => $up) {
$id = $up['user']['id'];
$Safa .= $number + 1 . "-[$id](tg://user?id=$id) ";
}
yield $this->messages->sendMessage([
'peer' => $chat_id,
'message' => "بالا باشید : \n$Safa",
'parse_mode' => 'Markdown'
]);
}
$Safa = false;
foreach ($chats as $number => $up) {
$id = $up['user']['id'];
if ($up['user']['type'] == "user")
$Safa .= $number + 1 . "-[$id](tg://user?id=$id) ";
}
yield $this->messages->sendMessage([
'peer' => $chat_id,
'message' => "بالا باشید : \n$Safa",
'parse_mode' => 'Markdown'
]);
return;
}
کاملا بهینه
کافیست دستور tag رو در گروه بفرستید
Forwarded from MadelineProto | Official Channel (Daniil Gentili)
PSA: please DO NOT remove the madeline.phar.version and madeline.phar files in your sources.

This will greatly slow down your source on each startup, and it has already caused me some issues due to excessive composer install reports.

Please, remove all unlink('madeline.phar'); unlink('madeline.phar.version'); codes from your sources.
من همچنین برخی از به روز رسانی ها را برای کانال های اجتماعی MadelineProto اعلام می کنم.

- معرفی گروههای چت جداگانه OT، تا امکان گفتگو در مورد فناوری ، سیاست و الگوهای رفتاری فراهم شود.
- معرفی یک گروه پشتیبانی بین المللی جدید MadelineProto برای کمک و پشتیبانی MadelineProto
- در آخر معرفی کانال رسمی meme MadelineProto ، تنها مملو از ممتازهای مبتنی بر الگوهای رفتاری!
- معرفی یک گروه گفتگوی رسمی برای AMPHP ، async و کتابخانه PHP موازی سازی شده با عملکرد بالا و کارآمد!

همچنین ، در انتها معرفی یک کانال رسمی فارسی MadelineProto:
@madeline_farsi
این کانال ترجمه های فارسی ارسال شده در کانال اصلی را به همراه منابع MadelineProto ، نکات AMPHP و موارد دیگر منتشر خواهد کرد!
https://t.me/c/1355706999/5
AMPHP چیست؟

Amp یک چارچوب همزمانی غیر مسدودکننده است که پی اچ پی را برای مدیریت همزمان از قبیل event loop ، promises و تکرارهای ناهمزمان فراهم می کند.

خوب، به عبارت ساده تر؟

AMPHP یک کتابخانه PHP با کارایی بالا و موازی است که به شما امکان می دهد برنامه هایی بسیار سریع و کارآمد بنویسید که به طور موازی با استفاده از تِردهای سبز کار می کنند.

* b r a i n m e l t *

بله!

---

MadelineProto در PHP نوشته نشده است: MadelineProto با استفاده از AMPHP نوشته شده است.
این بدان معنی است که وقتی از MadelineProto استفاده می کنید (و async فعال است) ، تمام پیام های دریافتی به صورت موازی ، هر یک در یک ترد جداگانه ، حتی در هاست های وب (هاست اشتراکی) هندل می شوند.

این امر به شما امکان می دهد تا رباتهای شما همیشه پاسخگو باشند ، حتی هنگام انجام کارهای پیچیده.

با این وجود ، بسیار مهم است که هنگام نوشتن ربات خود از AMPHP (نه PHP!) نیز استفاده کنید.
معنی این امر اینست که توابع PHP و پسوندهای زیر نمی توانند در رباتهای MadelineProto استفاده شوند (در غیر این صورت همه مزایای AMPHP باطل می شوند): در عوض ، شما باید از کتابخانه صحیح AMPHP (که بطور خودکار در madeline.php درج شده است) استفاده کنید.

file_get_contents
amphp/file برای فایلها ، amphp/http-client و $MadelineProto->fileGetContents برای آدرس های اینترنتی

curl, guzzle
amphp/http-client بصورت async است ، خیلی سریعتر از سایر کتابخانه ها ، و همچنین از HTTP/2 پشتیبانی می کند!

mysqli, PDO, sqlite
amphp/mysql از پشتیبان MySQL و SQLite پشتیبانی می کند ، و کاملاً async است!
همچنین شما میتوانید از amphp/postgres و amphp/redis برای PostgreSQL و Redis استفاده کنید!

php-fpm
amphp/http-server یک سرور HTTP/2 با عملکرد بالا و async است که می تواند برای ایجاد سرورهای دانلود فایل با MadelineProto رابط باشد!

include, require
از این عملکردها زیاد استفاده نکنید و از همه مهمتر ، آن را در داخل کلاس event handler استفاده نکنید.
شما باید هنگام راه اندازی بات ، فقط یک بار از آن استفاده کنید، یا در هنگام بارگیری مجدد ربات (به زودی سورس افزونه ارائه خواهد شد!)

---

به طور خلاصه ، AMPHP یک چارچوب عالی برای استفاده از PHP async در سال 2020 است: شما می توانید در صورت داشتن هرگونه سؤال یا پیشنهادی در مورد چیز دیگری که به AMPHP اضافه کنید می توانید به گروه رسمی تلگرامی پشتیبانی @amphpchat بپیوندید!
نسخه 5.1 میدلاین یک ویژگی خاص را ارائه می دهد:
native error reporting (گزارش خطاهای بومی).

گزارش خطای بومی، فرایند توسعه ربات های MadelineProto را بسیار ساده می کند.
به سادگی با مشخص کردن نام کاربری سرپرست ربات، کلیه خطاهای ایجاد شده توسط ربات(یا خود MadelineProto!) بطور خودکار به همراه فایل لاگ به مدیر گزارش می شوند.


در این نسخه شروع با استفاده از
unlink('MadelineProto.log');
میدلاین
را خراب میکند و کرش میکند.
در صورت نیاز به کاهش اندازه فایل لاگ، به این صورت کانفیگ کنید: $settings['logger']['max_size'] (minimum 100kb = 100*1000).

یک نمونه سورس برای MadelineProto 5.1:

<?php

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

use danog\MadelineProto\EventHandler;
use danog\MadelineProto\Tools;
use danog\MadelineProto\API;
use danog\MadelineProto\Logger;
use danog\MadelineProto\RPCErrorException;

/**
* Event handler class.
*/
class MyEventHandler extends EventHandler
{
/**
* @var int|string Username or ID of bot admin
*/
const ADMIN = "danogentili"; // Change this
/**
* Get peer(s) where to report errors
*
* @return int|string|array
*/
public function getReportPeers()
{
return [self::ADMIN];
}
/**
* Called on startup, can contain async calls for initialization of the bot
*
* @return void
*/
public function onStart()
{
}
/**
* Handle updates from supergroups and channels
*
* @param array $update Update
*
* @return void
*/
public function onUpdateNewChannelMessage(array $update): \Generator
{
return $this->onUpdateNewMessage($update);
}
/**
* Handle updates from users.
*
* @param array $update Update
*
* @return \Generator
*/
public function onUpdateNewMessage(array $update): \Generator
{
if ($update['message']['_'] === 'messageEmpty' || $update['message']['out'] ?? false) {
return;
}
$res = \json_encode($update, JSON_PRETTY_PRINT);

try {
yield $this->messages->sendMessage(['peer' => $update, 'message' => "<code>$res</code>", 'reply_to_msg_id' => $update['message']['id'] ?? null, 'parse_mode' => 'HTML']);
if (isset($update['message']['media']) && $update['message']['media']['_'] !== 'messageMediaGame') {
yield $this->messages->sendMedia(['peer' => $update, 'message' => $update['message']['message'], 'media' => $update]);
}
} catch (RPCErrorException $e) {
$this->report("Surfaced: $e");
} catch (Exception $e) {
if (\stripos($e->getMessage(), 'invalid constructor given') === false) {
$this->report("Surfaced: $e");
}
}
}
}

$settings = [];

$MadelineProto = new API('bot.madeline', $settings);
$MadelineProto->startAndLoop(MyEventHandler::class);


متد جدید startAndLoop بصورت خودکار میدلاین را آماده سازی کرده ، async را فعال میکند، حالت لاگ را آماده میکند ، حالت گزارش خطا را آماده سازی میکند، بصورت try & cache رفتار میکند و همه خطاهایی که در کلاس event در ارتباط با peer ها رخ میدهد را نگه داری کرده و با استفاده از متد getReportPeers قابل دریافت و گزارشگیری هستند.

همچنین کمک می کند به عدم تکرار در تعاریف و کدها و اضافات $MadelineProto->loop() که در سورسهای بهم ریختگی ایجاد کرده است را حذف می کند.
از میان سایر ویژگی های جدید ، می توان از متد onStart بصورت async برای اجرای متدها در هنگام راه اندازی ربات (به جای $MadelineProto->loop() خارج از ربات) استفاده کرد.
درمورد اهمیت لاگ گیری:

برای یک برنامه نویس ، برنامه نویسی بدون لاگ مانند رانندگی با چشمان بسته است: هر لحظه می توانستید با یک دیوار تصادف کنید ، و حتی نمی خواهید در آینده با آن مواجه شوید.

بسیاری از مواقع می بینم که کاربران MadelineProto از من درخواست کمک می کنند و می گویند که "رباتهایشان کار نمی کنند" یا "دیروز کار میکرده" ، و اغلب من را به خاطر اشتباهات خودشان سرزنش می کنند.

این دقیقاً به همین دلیل است که شما نیاز به لاگ دارید: با لاگ، می توانید بفهمید که چه اشتباهی در کدتان (یا سورس من!) رخ داده است، و فوراً خطا را برطرف کنید.

اکنون MadelineProto به شما اجازه می دهد گزارش خطای خودکار را با لاگ کامل و ردیابی اکسپشن ها به محض کرش اسکریپت انجام دهید (به طور خودکار بازیابی ربات از هرگونه خطا) .

اگر لاگ فعال باشد و از getReportPeers + startAndLoop استفاده کنید: این یک ویژگی بسیار مفید برای دولاپرها است ، و می تواند به شما کمک کند تا قبل از اینکه کاربران متوجه خطا و مشکل شوند، شما مشکلات را پیدا کرده و برطرف کنید.


منابع:
- Error reporting
- Logging
- Exceptions
آموزش استفاده از نسخه جدید میدلاین (قابلیت استفاده از MySQL بجای رم) روی هاست

سلام دوستان
همونطور که شاید بدونین میدلاین هنوز این نسخه رو بصورت phar منتشر نکرده و فقط روی سرور و با استفاده از composer میشه از این ورژن استفاده کرد
ولی من یه نسخه غیر رسمی از این ورژن رو برای هاست ها آماده کردم که میتونین موقتا تا آپدیت جدید میدلاین برای هاست ها از این نسخه استفاده کنین

برای نصب نسخه غیر رسمی میدلاین باید توی سورستون بجای تکه کد:
if (!file_exists('madeline.php')) {
copy('http://phar.madelineproto.xyz/madeline.php', 'madeline.php');
}
include 'madeline.php';

شما باید تکه کد پایین رو جایگزین کنین:
if (!file_exists('MadelineProto.php')) {
copy('https://MadelineProto.realsamy.ir/', 'MadelineProto.php');
}
include 'MadelineProto.php';

این تکه کد بجای نسخه رسمی قدیمی میدلاین، نسخه غیررسمی جدید (با قابلیت استفاده از MySQL بجای رم) رو نصب میکنه
البته بخاطر phar نبودن این نسخه و مدت زمانی که برای extract کردن فایل لازمه، نصب این فایل ممکنه یکم بیشتر از نسخه های قبلی طول بکشه (چون حجم فایل حدود 100 مگابایته)

ضمنا برای فعال کردن استفاده از MySQL باید از تنظیمات پایین توی سورستون استفاده کنین:
$settings = [
'db' => [
'type' => 'mysql',
'mysql' => [
'host' => '127.0.0.1',
'port' => '3306',
'user' => 'USERNAME',
'password' => 'PASSWORD',
'database' => 'DATABASE',
]
],
];

استفاده از این نسخه یه سری توضیحات لازم داره
اول اینکه این نسخه فقط برای ورژن پی اچ پی 7.4 به بالا هست و روی نسخه های پایینتر پی اچ پی جواب نمیده.
دوم اینکه برای اتصال به دیتابیس هاست پیشفرض همونطور که میبینید 127.0.0.1 هست که برای خودم روی هاست سیپنل جواب نداد و آیپی هاستینگ که توی صفحه اصلی سیپنل با اسم Shared IP Address مشخص شده جواب داد، ترجیحا اول آیپی پیشفرض رو تست کنین و اگه جواب نگرفتین آیپی هاستینگ رو استفاده کنین!

خیلی مخلصیم❤️
Sorry about all of this drama guys, didn't mean to hurt anyone.
MadelineProto is a free and open source project, and people can do what they want with it, I can't control you.

You can earn money on your sources, you can obfuscate your sources.

Personally, I do not approve of spamming and flooding with MadelineProto, and I would very much appreciate if a percentage of your earnings was contributed to me, as the developer of the original library.
However, if you decide to obfuscate sell your source, I'm 100% fine with it.

Previously some deobfuscated sources were posted on the official @madeline_farsi channel without the permission of the original creators, and in violation of internal MadelineProto admin rules.

I'm sorry about this, won't happen again.

The only thing I want is an open and international MadelineProto community with lots of sources and resources for MadelineProto users.
I don't have much time to work on MadelineProto myself these days, but I always appreciate people taking their time to help out the MadelineProto community.

Thank you all for the support ❤️
سلام به تمام اعضای کانال بزرگ میدلاین
چند روز پیش بنا به درخواست شما و بی احتیاطی بنده سورسی از یکی از دوستان بصورت دیکد شده در کانال قرار گرفت و باعث رنجش و آزرده خاطر شدن بعضی از دوستان شد
هدف ما فقط نشان دادن قدرت کتابخانه میدلاین بود که باعث نقض قوانین کپی رایت شد
بابت این اتفاق ازتون معذرت می‌خوام
#صفا

Hello to all members of the big madeline channel
A few days ago, at your request and with the carelessness of my servant, a source from a friend was decoded on the channel and caused annoyance and annoyance to some friends.
Our only goal was to show the power of the madeline Library, which violated copyright laws
I apologize for this
#Safa