mirror of
https://github.com/xuthus83/LittlePaimon.git
synced 2024-12-16 13:40:53 +08:00
63 lines
2.8 KiB
Python
63 lines
2.8 KiB
Python
import re
|
||
import aiohttp
|
||
from ._language_dict import search_dict, suffix_list
|
||
|
||
GLOT_TOKEN = "2b42fd59-563f-4855-870d-f564c4e407b5"
|
||
|
||
|
||
async def run(command: str) -> str:
|
||
# "py -i 50,100,3 import random" -> {'language_type': 'py', 'stdin': '50,100,3', 'code': 'import random'}
|
||
match_obj = re.match(r"^(?P<language_type>[^ \n]+) ?(-i *(?P<stdin>[^ \n]+))?[\n ]+(?P<code>[\w\W]+)", command)
|
||
code_type = match_obj.group("language_type").strip()
|
||
if code_type not in search_dict: # 如果发送的语言类型不在查询字典里面
|
||
return f"输入有误, www找不到{code_type}, 请检查您的输入"
|
||
code = match_obj.group("code").strip() # 获取code的字段
|
||
if len(code) == 0: # 如果code为空
|
||
return "运行代码不能为空~"
|
||
stdin = match_obj.group("stdin") # 获取stdin的输入
|
||
type_name = search_dict[code_type] # 从查询字典中拿到运行代码的完整语言名
|
||
|
||
# 请求部分
|
||
header = {
|
||
"Authorization": f"Token {GLOT_TOKEN}",
|
||
"Content-type": "application/json"
|
||
}
|
||
data = {
|
||
"files": [
|
||
{
|
||
'name': f'main.{suffix_list[type_name]}', # 固定文件名的话用户在处理java类文件的时候类名可能会不方便, 需要改进
|
||
'content': code
|
||
}
|
||
],
|
||
"stdin": stdin if stdin is not None else "",
|
||
"command": ""
|
||
}
|
||
try:
|
||
async with aiohttp.TCPConnector(ssl=False) as connector:
|
||
async with aiohttp.request("POST", headers=header,
|
||
json=data,
|
||
url=f"https://glot.io/api/run/{type_name}/latest",
|
||
connector=connector
|
||
) as resp:
|
||
rep_json = await resp.json() # 获取响应
|
||
if 'message' in rep_json: # 如果message在里面的话基本上都是请求失败了, 运行时间过长或者api出错
|
||
return rep_json['message']
|
||
|
||
result = "\n"
|
||
stdout = rep_json['stdout'].rstrip()
|
||
error = rep_json["error"].rstrip()
|
||
stderr = rep_json["stderr"].rstrip()
|
||
if stdout:
|
||
result += f"{stdout}\n"
|
||
if stderr:
|
||
result += f"{stderr}\n"
|
||
if error:
|
||
result += f"{error}\n"
|
||
if len(result) > 500 or result.count("\n") > 15:
|
||
return f"输出结果过长,仅显示前500:\n{result[0:500]}"
|
||
return result
|
||
except Exception as e: # 网络请求失败时走该分支
|
||
from . import sv
|
||
sv.logger.error(f"{e} occurred when request l: {code_type} c:{code}")
|
||
return f"请求失败...请联系维护者"
|