Add exec tasks
This commit is contained in:
parent
a97fdb9548
commit
8353710194
|
@ -9,6 +9,8 @@ from io import StringIO, BytesIO
|
|||
from pyrogram import Client, filters
|
||||
from .. import config, help_dict, log_errors, slave, apps, session, public_log_errors
|
||||
|
||||
exec_tasks = dict()
|
||||
|
||||
PYEXEC_REGEX = '^(?:' + '|'.join(map(re.escape, config['config']['prefixes'])) + r')exec\s+([\s\S]+)$'
|
||||
@Client.on_message(~filters.forwarded & ~filters.sticker & ~filters.via_bot & ~filters.edited & filters.me & filters.regex(PYEXEC_REGEX))
|
||||
@log_errors
|
||||
|
@ -39,8 +41,15 @@ async def pyexec(client, message):
|
|||
if ex.msg != "'return' with value in async generator":
|
||||
raise
|
||||
exx = _gf(obody)
|
||||
reply = await message.reply_text('Executing...')
|
||||
async_obj = exx(client, client, message, message, reply, message.reply_to_message, message.reply_to_message, UniqueExecReturnIdentifier)
|
||||
reply = await message.reply_text(f'Executing <code>{hash(UniqueExecReturnIdentifier)}</code>...')
|
||||
oasync_obj = exx(client, client, message, message, reply, message.reply_to_message, message.reply_to_message, UniqueExecReturnIdentifier)
|
||||
if inspect.isasyncgen(oasync_obj):
|
||||
async def async_obj():
|
||||
return [i async for i in oasync_obj]
|
||||
else:
|
||||
async def async_obj():
|
||||
to_return = [await oasync_obj]
|
||||
return [] if to_return == [UniqueExecReturnIdentifier] else to_return
|
||||
stdout = sys.stdout
|
||||
stderr = sys.stderr
|
||||
wrapped_stdout = StringIO()
|
||||
|
@ -48,15 +57,19 @@ async def pyexec(client, message):
|
|||
try:
|
||||
sys.stdout = wrapped_stdout
|
||||
sys.stderr = wrapped_stderr
|
||||
if inspect.isasyncgen(async_obj):
|
||||
returned = [i async for i in async_obj]
|
||||
else:
|
||||
returned = [await async_obj]
|
||||
if returned == [UniqueExecReturnIdentifier]:
|
||||
returned = []
|
||||
task = asyncio.create_task(async_obj())
|
||||
exec_tasks[hash(UniqueExecReturnIdentifier)] = task
|
||||
returned = await async_obj
|
||||
except asyncio.CancelledError:
|
||||
sys.stdout = stdout
|
||||
sys.stderr = stderr
|
||||
exec_tasks.pop(hash(UniqueExecReturnIdentifier), None)
|
||||
await reply.edit_text('Cancelled')
|
||||
return
|
||||
finally:
|
||||
sys.stdout = stdout
|
||||
sys.stderr = stderr
|
||||
exec_tasks.pop(hash(UniqueExecReturnIdentifier), None)
|
||||
wrapped_stderr.seek(0)
|
||||
wrapped_stdout.seek(0)
|
||||
output = ''
|
||||
|
@ -83,4 +96,36 @@ async def pyexec(client, message):
|
|||
else:
|
||||
await reply.edit_text(output)
|
||||
|
||||
help_dict['exec'] = ('Exec', '{prefix}exec <i><python code></i> - Executes python code')
|
||||
@Client.on_message(~filters.forwarded & ~filters.sticker & ~filters.via_bot & ~filters.edited & filters.me & filters.command(['listexecs', 'listexec', 'lexec'], prefixes=config['config']['prefixes']))
|
||||
@log_errors
|
||||
@public_log_errors
|
||||
async def listexec(client, message):
|
||||
text = '\n'.join(map(str, exec_tasks))
|
||||
if len(text) > 4096:
|
||||
f = BytesIO(text.encode('utf-8'))
|
||||
f.name = 'exectasks.txt'
|
||||
await message.reply_document(f)
|
||||
else:
|
||||
text = '\n'.join(map(lambda i: f'<code>{i}</code>', exec_tasks))
|
||||
await message.reply_text(text)
|
||||
|
||||
@Client.on_message(~filters.forwarded & ~filters.sticker & ~filters.via_bot & ~filters.edited & filters.me & filters.command(['cancelexec', 'cexec'], prefixes=config['config']['prefixes']))
|
||||
@log_errors
|
||||
@public_log_errors
|
||||
async def cancelexec(client, message):
|
||||
try:
|
||||
task = exec_tasks.get(int(message[1]))
|
||||
except IndexError:
|
||||
return
|
||||
if not task:
|
||||
await message.reply_text('Task does not exist')
|
||||
return
|
||||
task.cancel()
|
||||
|
||||
help_dict['exec'] = ('Exec', '''{prefix}exec <i><python code></i> - Executes python code
|
||||
|
||||
{prefix}listexecs - List exec tasks
|
||||
Aliases: {prefix}listexec, {prefix}lexec
|
||||
|
||||
{prefix}cancelexec <i><task id></i> - Cancel exec task
|
||||
Aliases: {prefix}cexec''')
|
||||
|
|
Loading…
Reference in New Issue