Skip to content

Commit b8de5aa

Browse files
committed
improve code runner feature
1 parent 6539b3f commit b8de5aa

File tree

2 files changed

+63
-36
lines changed

2 files changed

+63
-36
lines changed

src/Traits/CommandTrait.php

Lines changed: 60 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use APP\Helpers\Helper;
66
use danog\MadelineProto\EventHandler\Filter\FilterNotEdited;
77
use danog\MadelineProto\EventHandler\Media;
8+
use danog\MadelineProto\EventHandler\Message\Entities\Pre;
89
use danog\MadelineProto\LocalFile;
910
use danog\MadelineProto\RPCErrorException;
1011
use danog\MadelineProto\EventHandler\Message;
@@ -16,12 +17,12 @@ public function commands(Message $message): void{
1617
$message_text = trim($message->message);
1718
$lower_case_message = mb_strtolower($message_text);
1819
if (in_array($lower_case_message, ['/start', '/usage', '/restart', '/help', '/shutdown', '/getsettings','/getmessage','/cancel','/test'])) {
19-
$this->addsCommand($message);
20+
$this->addsCommand($message);
2021
}
2122
elseif (preg_match("/^\/last\s+((?:-[\w!]+\s*)+)?(\d+)?\s*(reset)?$/", $message_text)) {
2223
$this->lastCommand($message);
2324
}
24-
elseif (preg_match("/^\/(php|cli|run)\s?(.+)$/su", $message_text)) {
25+
elseif (str_starts_with($lower_case_message,'/php') or str_starts_with($lower_case_message,'/run') or str_starts_with($lower_case_message,'/code') or str_starts_with($lower_case_message,'/cli')) {
2526
$this->codeRunner($message);
2627
}
2728
elseif (preg_match("/^\/query\s?(.+)$/su", $message_text)) {
@@ -134,42 +135,62 @@ public function lastCommand(Message $message): void{
134135

135136
public function codeRunner(Message $message):void{
136137
$message_text = $message->message;
138+
$lower_case_message = strtolower($message_text);
137139
$chat = $message->chatId;
138-
if (preg_match("/^\/(php|cli|run)\s?(.+)$/su", $message_text, $match)) {
139-
$message_to_edit = $message->reply(__('running'));
140-
$this->logger("start runner:");
141-
$code = $match[2];
142-
$torun = "return (function () use
140+
if (str_starts_with($lower_case_message,'/php') or str_starts_with($lower_case_message,'/code') or str_starts_with($lower_case_message,'/cli')) {
141+
if(preg_match("/^\/(php|code|cli|run)\s?(.+)$/sui", $message_text, $match)){
142+
$entities = $message->entities;
143+
$code = $match[2];
144+
$message_to_edit = $message->reply(__('running'));
145+
}elseif (in_array($lower_case_message , ['/run','/php','/cli','/code']) and $message->getReply() !== null){
146+
$message_to_edit = $message->replyOrEdit(__('running'));
147+
$reply = $message->getReply();
148+
$entities = $reply->entities ?? null;
149+
}
150+
if(!empty($entities)) {
151+
foreach ($entities as $entity) {
152+
if ($entity instanceof Pre && $entity->language === 'php') {
153+
$code = substr($reply->message ?? $message_text, $entity->offset, $entity->length);
154+
$this->logger($code);
155+
break;
156+
}
157+
}
158+
}
159+
if(!empty($code)) {
160+
$this->logger("start runner: ".$code);
161+
$torun = "return (function () use
143162
(&\$message ,&\$chat ,&\$reply_to_message_id){
144163
{$code}
145164
}
146165
)();";
147-
$result = "";
148-
$error = "";
149-
ob_start();
150-
try {
151-
(eval($torun));
152-
$result .= ob_get_contents() . "\n";
153-
} catch (\Throwable $e) {
154-
$error .= $e->getMessage() . "\n";
155-
$error .= $e->getTraceAsString() . "\n";
156-
}
157-
ob_end_clean();
158-
$result = trim($result);
159-
$error = trim($error);
160-
$text = !empty($result) ? $result : "empty result.";
161-
$text .= !empty($error) ? "\n---------------\n" . "Errors :\n" . $error : "";
162-
try {
163-
$text = __('results', ['data' => trim($text)]);
164-
$message_to_edit->editText($text, parseMode: Constants::DefaultParseMode);
165-
} catch (\Throwable $e) {
166-
$message_to_edit->editText("#error for edit result:\n<code>" . $e->getMessage() . "</code>\nResult file:👇🏻", parseMode: Constants::DefaultParseMode);
167-
$file_path = './data/run-result.txt';
168-
\Amp\File\write($file_path, $text);
169-
$this->sendDocument($chat, (new LocalFile($file_path)), caption: '<code>' . $match[2] . '</code>', parseMode: Constants::DefaultParseMode, fileName: 'run-result.txt', mimeType: 'text/plain', replyToMsgId: $message_to_edit->id);
170-
\Amp\File\deleteFile($file_path);
171-
}
172-
$this->logger("end runner");
166+
$result = "";
167+
$error = "";
168+
ob_start();
169+
try {
170+
(eval($torun));
171+
$result .= ob_get_contents() . "\n";
172+
} catch (\Throwable $e) {
173+
$error .= $e->getMessage() . "\n";
174+
$error .= $e->getTraceAsString() . "\n";
175+
}
176+
ob_end_clean();
177+
$result = trim($result);
178+
$error = trim($error);
179+
$text = !empty($result) ? __('code',['code'=>$result]) : "empty result.";
180+
$text .= !empty($error) ? __('bold',['bold'=>"\n---------------\nErrors :\n"]) . $error : "";
181+
try {
182+
$text = __('results', ['data' => trim($text)]);
183+
$message_to_edit->editText($text, parseMode: Constants::DefaultParseMode);
184+
} catch (\Throwable $e) {
185+
$message_to_edit->editText("#error for edit result:\n<code>" . $e->getMessage() . "</code>\nResult file:👇🏻", parseMode: Constants::DefaultParseMode);
186+
$file_path = './data/run-result.txt';
187+
\Amp\File\write($file_path, $text);
188+
$this->sendDocument($chat, (new LocalFile($file_path)), caption: '<code>' . $match[2] . '</code>', parseMode: Constants::DefaultParseMode, fileName: 'run-result.txt', mimeType: 'text/plain', replyToMsgId: $message_to_edit->id);
189+
\Amp\File\deleteFile($file_path);
190+
}
191+
$this->logger("end runner");
192+
}else $fe = __('code_not_found');
193+
$this->answer($chat,$fs ?? null,$fe ?? null,$message_to_edit ?? $message,$reply2id ?? null);
173194
}
174195
}
175196

@@ -231,7 +252,7 @@ public function features(Message $message):void{
231252
case 'ls':
232253
case 'list':
233254
case 'status':
234-
$status_string = ($this->settings[$command]['status'] ?? false) === true ? __('status.on') : __('status.off');
255+
$status_string = ($this->settings[$command]['status'] ?? false) === true ? __('status.on') : __('status.off');
235256
$fs = $status_string . "\n";
236257
if (!empty($this->settings[$command]['indexes'])) {
237258
foreach ($this->settings[$command]['indexes'] as $key => $index) {
@@ -412,7 +433,11 @@ private function answer(int|string $peer,string $fs = null,string $fe = null,Mes
412433
$reply2id = $reply2id instanceof Message ? $reply2id->id : $reply2id;
413434
$this->logger("new answer fs: ".(!empty($fs) ? "`$fs`" : 'null')." fe: " . (!empty($fe) ? "`$fe`" : 'null'));
414435
if (!empty($fs)) $this->sendMessage($peer, $fs, parseMode: Constants::DefaultParseMode, replyToMsgId: $reply2id);
415-
if (!empty($fe)) $message_to_edit->replyOrEdit($fe, parseMode: Constants::DefaultParseMode);
436+
if (!empty($fe)){
437+
if($message_to_edit->out) {
438+
$message_to_edit->editText($fe, parseMode: Constants::DefaultParseMode);
439+
}else $message_to_edit->reply($fe, parseMode: Constants::DefaultParseMode);
440+
}
416441
}
417442
private function globalOutCommand(Message $message) : string{
418443
$message_text = $message->message;

src/localization/en/messages.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
return [
55
'json'=>'<pre language="json"><code>:json</code></pre>',
66
'code'=>'<code>:code</code>',
7+
'bold'=>'<b>:bold</b>',
78
'start_message'=>"the bot uptime is:\n:counter",
89
'mention'=>'<a href=":url">:name</a>',
910
'memory_usage'=>"Memory now Usage : :usage <b>/</b>:real_usage <b>MB</b>\nMemory peak Usage : :peak_usage <b>/</b>:real_peak_usage <b>MB</b>",
@@ -60,5 +61,6 @@
6061
'downloading'=>'downloading...',
6162
'canceled'=>'canceled.!',
6263
'channel_is_private'=>'channel is private. join with join link.',
63-
'getmessagelink_bad_command'=> "bad command. reply to message contain url or /getmessagelink [link]\nurl sample: https://t.me/telegram/2|https://t.me/example/5-10"
64+
'getmessagelink_bad_command'=> "bad command. reply to message contain url or /getmessagelink [link]\nurl sample: https://t.me/telegram/2|https://t.me/example/5-10",
65+
'code_not_found'=>"code not found.\n use /php [CODE] or reply to messages contain php code pre",
6466
];

0 commit comments

Comments
 (0)