From be2747e4d4b820ca0f1f988d3b77a628da26fe7b Mon Sep 17 00:00:00 2001 From: Kyomotoi Date: Thu, 8 Jul 2021 22:09:00 +0800 Subject: =?UTF-8?q?=F0=9F=94=96=E2=99=BB=EF=B8=8F=F0=9F=90=9B=F0=9F=94=A7?= =?UTF-8?q?=F0=9F=94=A5=F0=9F=93=9D=20=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=9AYHN-001-A03?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🔖 更新版本至:YHN-001-A03 ✨ 新增插件: - 涩图 - 闲聊(文爱 ♻️ 重构: - Service - 所有插件 🐛 修复部分小bug 🔧 暂时移除部分设置 🔥 删除: - 插件:nsfw、wife。日后加回 - 插件 essential 中部分内容 📝 更新README --- ATRI/plugins/code_runner/data_source.py | 111 ++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 ATRI/plugins/code_runner/data_source.py (limited to 'ATRI/plugins/code_runner/data_source.py') diff --git a/ATRI/plugins/code_runner/data_source.py b/ATRI/plugins/code_runner/data_source.py new file mode 100644 index 0000000..bbe0d2e --- /dev/null +++ b/ATRI/plugins/code_runner/data_source.py @@ -0,0 +1,111 @@ +from ATRI.rule import is_in_service +from ATRI.service import Service +from ATRI.utils import request +from ATRI.exceptions import RequestError + + +RUN_API_URL_FORMAT = "https://glot.io/run/{}?version=latest" +SUPPORTED_LANGUAGES = { + "assembly": {"ext": "asm"}, + "bash": {"ext": "sh"}, + "c": {"ext": "c"}, + "clojure": {"ext": "clj"}, + "coffeescript": {"ext": "coffe"}, + "cpp": {"ext": "cpp"}, + "csharp": {"ext": "cs"}, + "erlang": {"ext": "erl"}, + "fsharp": {"ext": "fs"}, + "go": {"ext": "go"}, + "groovy": {"ext": "groovy"}, + "haskell": {"ext": "hs"}, + "java": {"ext": "java", "name": "Main"}, + "javascript": {"ext": "js"}, + "julia": {"ext": "jl"}, + "kotlin": {"ext": "kt"}, + "lua": {"ext": "lua"}, + "perl": {"ext": "pl"}, + "php": {"ext": "php"}, + "python": {"ext": "py"}, + "ruby": {"ext": "rb"}, + "rust": {"ext": "rs"}, + "scala": {"ext": "scala"}, + "swift": {"ext": "swift"}, + "typescript": {"ext": "ts"}, +} + + +__doc__ = """ +在线跑代码 +""" + + +class CodeRunner(Service): + + def __init__(self): + Service.__init__(self, "在线跑代码", __doc__, rule=is_in_service("在线跑代码")) + + @staticmethod + def help() -> str: + return ( + "/code {语言}\n" + "{代码}\n" + "For example:\n" + "/code python\n" + "print('hello world')" + ) + + @staticmethod + def list_supp_lang() -> str: + msg0 = "咱现在支持的语言如下:\n" + msg0 += ", ".join(map(str, SUPPORTED_LANGUAGES.keys())) + return msg0 + + @staticmethod + async def runner(msg: str): + args = msg.split("\n") + if not args: + return "请检查键入内容..." + + lang = args[0].replace("\r", "") + if lang not in SUPPORTED_LANGUAGES: + return "该语言暂不支持..." + + del args[0] + code = "\n".join(map(str, args)) + url = RUN_API_URL_FORMAT.format(lang) + js = { + "files": [ + { + "name": ( + SUPPORTED_LANGUAGES[lang].get("name", "main") + + f".{SUPPORTED_LANGUAGES[lang]['ext']}" + ), + "content": code, + } + ], + "stdin": "", + "command": "" + } + + try: + res = await request.post(url, json=js) + except RequestError: + raise RequestError("Request failed!") + + payload = await res.json() + sent = False + for k in ["stdout", "stderr", "error"]: + v = payload.get(k) + lines = v.splitlines() + lines, remained_lines = lines[:10], lines[10:] + out = "\n".join(lines) + out, remained_out = out[: 60 * 10], out[60 * 10 :] + + if remained_lines or remained_out: + out += f"\n(太多了太多了...)" + + if out: + return f"\n{k}:\n{out}" + + if not sent: + return "\n运行完成,没任何输出呢..." \ No newline at end of file -- cgit v1.2.3