55use APP \Helpers \Helper ;
66use danog \MadelineProto \EventHandler \Filter \FilterNotEdited ;
77use danog \MadelineProto \EventHandler \Media ;
8+ use danog \MadelineProto \EventHandler \Message \Entities \Pre ;
89use danog \MadelineProto \LocalFile ;
910use danog \MadelineProto \RPCErrorException ;
1011use 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 ;
0 commit comments