<?php

error_reporting(E_ALL);
ini_set('display_errors','1');
ini_set('memory_limit' , '-1');
ini_set('max_execution_time','0');
ini_set('display_startup_errors','1');

if (!file_exists('madeline.php')) {
    copy('https://phar.madelineproto.xyz/madeline.php', 'madeline.php');
}
include 'madeline.php';

use \danog\MadelineProto\API;
use \danog\Loop\Generic\GenericLoop;
use \danog\MadelineProto\EventHandler;
use function Amp\File\{get, put, exists, unlink};

!is_dir('data') ? mkdir('data') : NULL;

function SaveData($data, $filename)
{
    $outjson = json_encode($data, true);
    file_put_contents("$filename", $outjson);
}
if (!file_exists("data/data.json")) {
    file_put_contents("data/data.json", "");
    $dataE = json_decode(file_get_contents("data/data.json"), true);
    $dataE["data"]["send"]   = 0;
    $dataE["data"]["text"]   = "????";
    SaveData($dataE, "data/data.json");
}

class XHandler extends EventHandler
{
    const Admins = [5064846800];
    const Report = '@dofiiiy';
    
    public function getReportPeers()
    {
        return [self::Report];
    }
    
    public function genLoop()
    {
        @$dataE = json_decode((yield get("data/data.json")), true);
        $TXT = $dataE["data"]["text"] ?? '';
        if ($dataE["data"]["send"] == 1) {
                $dialogs = yield $this->getDialogs();
                foreach ($dialogs as $peer) {
                    try {
                        $type = yield $this->getInfo($peer);
                    } catch (Exception $r) {
                    }
                    if ($type['type'] == 'supergroup' || $type['type'] == 'chat') {
                        try {
                            yield $this->messages->sendMessage([
                                'peer' => $peer,
                                'message' => $TXT
                            ]);
                        } catch (Exception $r) {
                        }
                    }
                }
        }
        return 15 * 60000;
    }
    
    public function onStart()
    {
        $genLoop = new GenericLoop([$this, 'genLoop'], 'update Status');
        $genLoop->start();
    }
    
    public function onUpdateNewChannelMessage($update)
    {
        yield $this->onUpdateNewMessage($update);
    }
    
    public function onUpdateNewMessage($update)
    {
        if (time() - $update['message']['date'] > 1) {
            return;
        }
        try {
            $messageId = $update['message']['id'] ?? 0;
            $msgOrig   = $update['message']['message'] ?? null;
            $fromId    = $update['message']['from_id']['user_id'] ?? 0;
            $replyToId = $update['message']['reply_to']['reply_to_msg_id'] ?? 0;
            $peer      = yield $this->getID($update);
            @$dataE = json_decode(file_get_contents("data/data.json"), true);
                
            if(in_array($fromId, self::Admins)) {
                if(preg_match('/^[\/\#\!\.]?(ping|????)$/si', $msgOrig)) {
                    yield $this->messages->sendMessage([
                        'peer'            => $peer,
                        'message'         => '??',
                        'reply_to_msg_id' => $messageId
                    ]);
                }
                elseif (preg_match('/^[\/\#\!\.]?(help|??????)$/si', $msgOrig)) {
                    yield $this->messages->sendMessage([
                        'peer'            => $peer,
                        'message'         => '#?????? ???? ??????? :)
??=>????? ?? ??????? /ping

??=>???? ? ????? ???? ????? ???   send on|of

??=>??????? ?????     restart

??=>????? ???? ?????     status

??=>????? ??? ???    settext TEXT',
                        'reply_to_msg_id' => $messageId
                    ]);
                }
                elseif (preg_match('/^[\/\#\!]?(restart|???????)$/si',$msgOrig)){
                    yield $this->messages->sendMessage([
                        'peer'            => $peer,
                        'message'         => 'Restarted ...',
                        'reply_to_msg_id' => $messageId
                    ]);
                    $this->restart();
                }
                elseif(preg_match('/^[\/\#\!\.]?(status|?????|???|????|usage)$/si', $msgOrig)){
                    $answer = 'Memory Usage : ' . round(memory_get_usage() / 1021 / 1024, 2) . ' MB';
                    yield $this->messages->sendMessage([
                        'peer'            => $peer,
                        'message'         => $answer,
                        'reply_to_msg_id' => $messageId
                    ]);
                }
                elseif (preg_match("/^[#!\/]?(send) (on|off)$/i", $msgOrig, $mch)) {
                    if (preg_match("/on/i", $mch[2])) {
                        $dataE['data']['send'] = 1;
                        yield put('data/data.json', json_encode($dataE, 128 | 256));
                        yield $this->messages->sendMessage([
                            'peer' => $peer,
                            'reply_to_msg_id' => $messageId,
                            'message' => "?#????? ??????_???????_????????????_??????????_??????!",
                            'parse_mode' => "html"
                        ]);
                        yield $this->sleep(2);
                    } else {
                        $dataE['data']['send'] = 0;
                        yield put('data/data.json', json_encode($dataE, 128 | 256));
                        yield $this->messages->sendMessage([
                            'peer' => $peer,
                            'reply_to_msg_id' => $messageId,
                            'message' => "?#?????????_???????_????????????_??????????_??????!",
                            'parse_mode' => "html"
                        ]);
                        yield $this->sleep(2);
                    }
                }
                elseif (preg_match('/^[\/\#\!]?(settext) (.*)$/si', $msgOrig, $limit)) {
                    $limit1 = $limit[2];
                    $dataE["data"]["text"] = $limit1;
                    yield put("data/data.json", json_encode($dataE, 128 | 256));
                    yield $this->messages->sendMessage(['peer' => $peer, 'id' => $messageId, 'message' => "?#??? ????? ?????? ??\n\n$limit1\n????? ????!", 'parse_mode' => 'MarkDown']);
                }

            }
        } catch (\Throwable $e){
            $this->report("Surfaced: $e");
            unset($e);
        }
    }
}
$settings = [
    'serialization' => [
        'cleanup_before_serialization' => true,
    ],
    'logger' => [
        'max_size' => 1*1024*1024,
    ],
    'peer' => [
        'full_fetch' => false,
        'cache_all_peers_on_startup' => false,
    ],
    'db'            => [
        'type'  => 'mysql',
        'mysql' => [
            'host'     => 'localhost',
            'port'     => '3306',
            'user'     => 'Drill_farsi',
            'password' => '?iPov9KhLTDt',
            'database' => 'Drill_farsi',
        ]
    ]
];

$bot = new \danog\MadelineProto\API('PHP0_0CODE.session', $settings);
$bot->startAndLoop(XHandler::class);
?>
    