From 8252cc21e4f245d21a5dabe2a487e0e692a1fddb Mon Sep 17 00:00:00 2001 From: Shan Wenxiao Date: Sun, 1 Oct 2023 16:17:52 +0800 Subject: [PATCH 01/14] Update SECURITY.md --- SECURITY.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index ce42259..7f88310 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,10 +1,10 @@ # Security Policy -## Supported Versions +## 当前支持的版本Supported Versions -| Version | Supported | -| ------- | ------------------ | -| 0.3.x | :white_check_mark: | -| 0.2.x | :x: | -| 0.1.x | :x: | +| 版本Version | 是否支持Supported | 预计结束支持时间 | 停止支持原因 | +| ------- | ------------------ | --------- | -------- | +| 0.3.x | :white_check_mark: | 预计支持到0.4.x出现后1个月Still developing | 开发中 Under Development | +| 0.2.x | :x: | 已停止支持 Not Supported | 讨论功能重大更新 Great Leap in Discussion Zone | +| 0.1.x | :x: | 已停止支持 Not Supported | 重大安全隐患Security Voulnerability | From 45aeef29ff859a2aebeb31660c99a5f4633e6cb5 Mon Sep 17 00:00:00 2001 From: Chen LangNing Date: Sun, 1 Oct 2023 21:19:44 +0800 Subject: [PATCH 02/14] =?UTF-8?q?[Feature=20Request]=20=E8=87=AA=E5=B7=B1?= =?UTF-8?q?=E9=80=A0=E5=9B=BE=E5=BA=8A=20Fixes=20#432?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Source/Process.ts | 82 ++++++++++++++++++++++++++++++++++++++-- Server/Source/index.ts | 6 +-- XMOJ.user.js | 47 +++++++++++++++++------ 3 files changed, 116 insertions(+), 19 deletions(-) diff --git a/Server/Source/Process.ts b/Server/Source/Process.ts index e666c2a..6ff7889 100644 --- a/Server/Source/Process.ts +++ b/Server/Source/Process.ts @@ -1,7 +1,7 @@ import { Result, ThrowErrorIfFailed } from "./Result"; import { Database } from "./Database"; import { Output } from "./Output"; -import { CaptchaSecretKey } from "./Secret"; +import { CaptchaSecretKey, GithubImagePAT } from "./Secret"; import { CheerioAPI, load } from "cheerio"; import CryptoJS from "crypto-js"; @@ -1017,6 +1017,68 @@ export class Process { return new Result(true, "获得板块列表成功", { "Boards": Boards }); + }, + UploadImage: async (Data: object): Promise => { + const GithubImageRepo = "langningchen/XMOJ-Script-Pictures"; + ThrowErrorIfFailed(this.CheckParams(Data, { + "Image": "string" + })); + let Image: String = Data["Image"]; + let ImageID: String = ""; + for (let i = 0; i < 32; i++) { + ImageID += String.fromCharCode(Math.floor(Math.random() * 26) + 97); + } + let ImageData = Image.replace(/^data:image\/\w+;base64,/, ""); + await fetch(new URL("https://api.github.com/repos/" + GithubImageRepo + "/contents/" + ImageID), { + method: "PUT", + headers: { + "Authorization": "Bearer " + GithubImagePAT, + "Content-Type": "application/json", + "User-Agent": "XMOJ-Script-Server" + }, + body: JSON.stringify({ + message: "Upload image", + content: ImageData + }) + }).then((Response) => { + return Response.json(); + }).then((Response) => { + if (Response["content"]["name"] !== ImageID) { + Output.Error("Upload image failed\n" + + "Username: \"" + this.Username + "\"\n" + + "ImageID : \"" + ImageID + "\"\n" + + "Response: \"" + JSON.stringify(Response) + "\"\n"); + ThrowErrorIfFailed(new Result(false, "上传图片失败")); + } + }).catch((Error) => { + Output.Error("Upload image failed: " + Error + "\n" + + "Username: \"" + this.Username + "\"\n" + + "ImageID : \"" + ImageID + "\"\n"); + ThrowErrorIfFailed(new Result(false, "上传图片失败")); + }); + return new Result(true, "上传图片成功", { + ImageID: ImageID + }); + }, + GetImage: async (Data: object): Promise => { + const GithubImageRepo = "langningchen/XMOJ-Script-Pictures"; + ThrowErrorIfFailed(this.CheckParams(Data, { + "ImageID": "string" + })); + return await fetch(new URL("https://api.github.com/repos/" + GithubImageRepo + "/contents/" + Data["ImageID"]), { + method: "GET", + headers: { + "Authorization": "Bearer " + GithubImagePAT, + "Accept": "application/vnd.github.raw", + "User-Agent": "XMOJ-Script-Server" + } + }).then((Response) => { + return Response.text(); + }).catch((Error) => { + Output.Error("Get image failed: " + Error + "\n" + + "ImageID : \"" + Data["ImageID"] + "\"\n"); + return ""; + }); } }; constructor(RequestData: Request, Environment) { @@ -1024,7 +1086,7 @@ export class Process { this.RequestData = RequestData; this.RemoteIP = RequestData.headers.get("CF-Connecting-IP") || ""; } - public async Process(): Promise { + public async Process(): Promise { try { let PathName = new URL(this.RequestData.url).pathname; PathName = PathName === "/" ? "/index" : PathName; @@ -1032,6 +1094,16 @@ export class Process { if (this.ProcessFunctions[PathName] === undefined) { throw new Result(false, "访问的页面不存在"); } + if (this.RequestData.method === "GET" && PathName === "GetImage") { + let ImageID = new URL(this.RequestData.url).searchParams.get("ImageID"); + return new Response(await this.ProcessFunctions[PathName]({ + ImageID: ImageID + }), { + headers: { + "content-type": "image/png" + } + }); + } if (this.RequestData.method !== "POST") { throw new Result(false, "不允许此请求方式"); } @@ -1067,7 +1139,11 @@ export class Process { Output.Error(ResponseData); ResponseData = new Result(false, "服务器运行错误:" + String(ResponseData).split("\n")[0]); } - return ResponseData; + return new Response(JSON.stringify(ResponseData), { + headers: { + "content-type": "application/json;charset=UTF-8" + } + }); } } } diff --git a/Server/Source/index.ts b/Server/Source/index.ts index 0983476..737c90d 100644 --- a/Server/Source/index.ts +++ b/Server/Source/index.ts @@ -4,11 +4,7 @@ import { Database } from "./Database"; export default { async fetch(RequestData: Request, Environment, Context) { let Processor = new Process(RequestData, Environment); - return new Response(JSON.stringify(await Processor.Process()), { - headers: { - "content-type": "application/json;charset=UTF-8" - } - }); + return await Processor.Process(); }, async scheduled(Event, Environment, Context) { let XMOJDatabase = new Database(Environment.DB); diff --git a/XMOJ.user.js b/XMOJ.user.js index 042d285..566f336 100644 --- a/XMOJ.user.js +++ b/XMOJ.user.js @@ -47,17 +47,22 @@ let GetRelativeTime = (Input) => { else { RelativeName = Math.floor((Now - Input) / 1000 / 60 / 60 / 24 / 365) + "年前"; } return "" + RelativeName + ""; }; -let RenderMathJax = () => { - var ScriptElement = document.createElement("script"); - ScriptElement.id = "MathJax-script"; - ScriptElement.type = "text/javascript"; - ScriptElement.src = "https://cdn.bootcdn.net/ajax/libs/mathjax/3.0.5/es5/tex-chtml.js"; - document.body.appendChild(ScriptElement); - ScriptElement.onload = () => { - MathJax.startup.input[0].findTeX.options.inlineMath.push(["$", "$"]); - MathJax.startup.input[0].findTeX.getPatterns(); - MathJax.typeset(); - }; +let RenderMathJax = async () => { + if (document.getElementById("MathJax-script") === null) { + var ScriptElement = document.createElement("script"); + ScriptElement.id = "MathJax-script"; + ScriptElement.type = "text/javascript"; + ScriptElement.src = "https://cdn.bootcdn.net/ajax/libs/mathjax/3.0.5/es5/tex-chtml.js"; + document.body.appendChild(ScriptElement); + await new Promise((Resolve) => { + ScriptElement.onload = () => { + Resolve(); + }; + }); + } + MathJax.startup.input[0].findTeX.options.inlineMath.push(["$", "$"]); + MathJax.startup.input[0].findTeX.getPatterns(); + MathJax.typeset(); }; let GetUserInfo = async (Username) => { if (localStorage.getItem("UserScript-User-" + Username + "-UserRating") != null && @@ -3853,6 +3858,26 @@ int main() PreviewTab.innerHTML = DOMPurify.sanitize(marked.parse(ContentElement.value)); RenderMathJax(); }); + ContentElement.addEventListener("paste", (Event) => { + let Items = Event.clipboardData.items; + if (Items.length !== 0) { + for (let i = 0; i < Items.length; i++) { + if (Items[i].type.indexOf("image") != -1) { + let Reader = new FileReader(); + Reader.readAsDataURL(Items[i].getAsFile()); + Reader.onload = () => { + RequestAPI("UploadImage", { + "Image": Reader.result + }, (ResponseData) => { + if (ResponseData.Success) { + console.log(ResponseData.Data.ImageID); + } + }); + }; + } + } + } + }); let RefreshReply = (Silent = true) => { if (!Silent) { PostTitle.innerHTML = ``; From b748d12e5e014f15979c4e7093aadb4c8c393ba6 Mon Sep 17 00:00:00 2001 From: Shan Wenxiao Date: Mon, 2 Oct 2023 09:56:36 +0800 Subject: [PATCH 03/14] Update SECURITY.md --- SECURITY.md | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 7f88310..c0577a2 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,10 +1,21 @@ # Security Policy ## 当前支持的版本Supported Versions +### 中文版 -| 版本Version | 是否支持Supported | 预计结束支持时间 | 停止支持原因 | +| 版本 | 是否支持 | 预计结束支持时间 | 停止支持原因 | | ------- | ------------------ | --------- | -------- | -| 0.3.x | :white_check_mark: | 预计支持到0.4.x出现后1个月Still developing | 开发中 Under Development | -| 0.2.x | :x: | 已停止支持 Not Supported | 讨论功能重大更新 Great Leap in Discussion Zone | -| 0.1.x | :x: | 已停止支持 Not Supported | 重大安全隐患Security Voulnerability | +| 0.3.x | :white_check_mark: | 预计支持到0.4.x出现后1个月 | 开发中 | +| 0.2.x | :x: | 已停止支持 | 讨论功能重大更新 | +| 0.1.x | :x: | 已停止支持 | 重大安全隐患 | +注意:在开发过程中,服务器和用户脚本可能在任何时候发生重大变动,造成非最新版本结束支持。在这种情况下,我们会尽快更新用户脚本!感谢您的谅解。 + +### English Version +| Version | Supported? | Estimated Drop time | Drop Reason(s) | +| ------- | ------------------ | --------- | -------- | +| 0.3.x | :white_check_mark: | Still developing | Under Development | +| 0.2.x | :x: | Not Supported | Great Leap in Discussion Zone | +| 0.1.x | :x: | Not Supported | Security Voulnerability | + +Attention: During development, the user-script and its server may be changed at anytime, causing low version user-scripts to be dropped. We will update the user-script as fast as we can when this type of situation arises. From a57ca6a040a532ffbe2e74576456ec1f3af754ef Mon Sep 17 00:00:00 2001 From: Shan Wenxiao Date: Mon, 2 Oct 2023 10:03:45 +0800 Subject: [PATCH 04/14] Update README.md --- README.md | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index e3ec37a..e7ec484 100644 --- a/README.md +++ b/README.md @@ -10,12 +10,12 @@ ### 介绍 -XMOJ增强脚本是一个功能强大的浏览器扩展,旨在提升用户在XMOJ(虚拟在线竞赛平台)上的使用体验。 +小明的OJ是一个功能强大的浏览器扩展,旨在提升用户在小明的OJ(某虚拟在线竞赛平台)上的使用体验。 该脚本通过添加多种实用功能和界面优化,使用户能够更高效地参与竞赛、管理代码和享受更好的界面交互。 - **比赛ACM排名与下载功能**:允许用户查看比赛的ACM排名,并提供下载选项,方便离线查阅。 - **查看更多标程**:展示更多的标准程序代码,帮助用户更好地理解题目要求和正确解法。 -- **获取别人的测试点数据**:允许用户获取其他人的测试点数据,用于分析问题和优化代码。 +- **获取测试点数据**:允许用户获取的测试点数据,加快你调试的速度。 - **自动刷新比赛列表与排名**:使比赛列表和排名页面自动定时刷新,获取最新信息。 - **界面时间自动倒计时**:在比赛列表等界面上自动显示剩余时间倒计时,方便用户了解时间情况。 - **回放视频下载功能**:为回放视频添加下载选项,方便用户离线观看回放。 @@ -46,6 +46,9 @@ XMOJ增强脚本是一个功能强大的浏览器扩展,旨在提升用户在X - **修复登录后跳转失败**:解决登录后跳转问题,确保用户能够顺利进入下一步操作。 - **下载页面增加内容**:在下载页面增加更多内容,提供更多资源下载。 - **比较代码**:允许用户比较不同版本的代码,方便进行代码对比与分析。 +- **讨论区**:我们自行搭建了一个讨论服务,你可以在里面发表你的声音。 +- **短消息**:我们自行搭建了一个短消息服务,你可以在这里和你最好的伙伴交流。 +- **学术模式**:开启学术模式,体验极致的学习环境!(此功能开发中,很快将会发布) ![](Image/01.png) ![](Image/02.png) @@ -68,14 +71,19 @@ XMOJ增强脚本是一个功能强大的浏览器扩展,旨在提升用户在X ![](Image/19.png) ![](Image/20.png) -通过XMOJ增强脚本,您将能够更便捷地参与竞赛,提高AC率,管理代码,优化学习体验,同时享受美化界面带来的愉悦感受。 +通过小明的OJ,您将能够更便捷地参与竞赛,提高AC率,管理代码,优化学习体验,同时享受美化界面带来的愉悦感受。 无论是竞技还是学习,这个脚本都将成为您在XMOJ平台上的得力助手。 -无论您是新手还是经验丰富的竞赛选手,XMOJ增强脚本都将为您的比赛体验带来前所未有的便利和效率。 +无论您是新手还是经验丰富的竞赛选手,小明的OJ都将为您的比赛体验带来前所未有的便利和效率。 立即安装并体验吧! ### 安装 请参考 [官网介绍](https://web.xmoj-bbs.tech) 。 +### 加入我们 +您想为我们的脚本添砖加瓦吗?快加入我们,为小明的OJ用户创造更美好的环境!(具体要求参见Code Of Conduct) + +小明的OJ增强脚本开发期待以您的邂逅! + ### 贡献 -请注意, 请将所有 pull request 提交到`dev`分支, 否则他们会被关闭。 +请注意, 请将所有 pull request 提交到`dev`分支, 否则他们会被自动关闭。 From feba89cfd721f1498d3d583fc9f96ef513033182 Mon Sep 17 00:00:00 2001 From: Chen LangNing Date: Mon, 2 Oct 2023 10:11:14 +0800 Subject: [PATCH 05/14] Update SECURITY.md --- SECURITY.md | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index c0577a2..a386ce8 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,21 +1,11 @@ -# Security Policy +# 安全策略 -## 当前支持的版本Supported Versions -### 中文版 +## 当前支持的版本 | 版本 | 是否支持 | 预计结束支持时间 | 停止支持原因 | | ------- | ------------------ | --------- | -------- | -| 0.3.x | :white_check_mark: | 预计支持到0.4.x出现后1个月 | 开发中 | +| 0.3.x | :white_check_mark: | 预计支持到0.4.x出现后1个月 | | | 0.2.x | :x: | 已停止支持 | 讨论功能重大更新 | | 0.1.x | :x: | 已停止支持 | 重大安全隐患 | 注意:在开发过程中,服务器和用户脚本可能在任何时候发生重大变动,造成非最新版本结束支持。在这种情况下,我们会尽快更新用户脚本!感谢您的谅解。 - -### English Version -| Version | Supported? | Estimated Drop time | Drop Reason(s) | -| ------- | ------------------ | --------- | -------- | -| 0.3.x | :white_check_mark: | Still developing | Under Development | -| 0.2.x | :x: | Not Supported | Great Leap in Discussion Zone | -| 0.1.x | :x: | Not Supported | Security Voulnerability | - -Attention: During development, the user-script and its server may be changed at anytime, causing low version user-scripts to be dropped. We will update the user-script as fast as we can when this type of situation arises. From b419b728b0c406d3d070f5200b99a246f7384d14 Mon Sep 17 00:00:00 2001 From: Chen LangNing Date: Mon, 2 Oct 2023 10:13:00 +0800 Subject: [PATCH 06/14] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e7ec484..35f4269 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ 该脚本通过添加多种实用功能和界面优化,使用户能够更高效地参与竞赛、管理代码和享受更好的界面交互。 - **比赛ACM排名与下载功能**:允许用户查看比赛的ACM排名,并提供下载选项,方便离线查阅。 +- **讨论区**:我们自行搭建了一个讨论服务,你可以在里面发表你的声音。 +- **短消息**:我们自行搭建了一个短消息服务,你可以在这里和你最好的伙伴交流。 - **查看更多标程**:展示更多的标准程序代码,帮助用户更好地理解题目要求和正确解法。 - **获取测试点数据**:允许用户获取的测试点数据,加快你调试的速度。 - **自动刷新比赛列表与排名**:使比赛列表和排名页面自动定时刷新,获取最新信息。 @@ -46,9 +48,7 @@ - **修复登录后跳转失败**:解决登录后跳转问题,确保用户能够顺利进入下一步操作。 - **下载页面增加内容**:在下载页面增加更多内容,提供更多资源下载。 - **比较代码**:允许用户比较不同版本的代码,方便进行代码对比与分析。 -- **讨论区**:我们自行搭建了一个讨论服务,你可以在里面发表你的声音。 -- **短消息**:我们自行搭建了一个短消息服务,你可以在这里和你最好的伙伴交流。 -- **学术模式**:开启学术模式,体验极致的学习环境!(此功能开发中,很快将会发布) +- ~**学术模式**:开启学术模式,体验极致的学习环境!(此功能开发中,很快将会发布)~ ![](Image/01.png) ![](Image/02.png) From 14c42039e119947191121b7fa36113507fb2325b Mon Sep 17 00:00:00 2001 From: Shan Wenxiao Date: Mon, 2 Oct 2023 11:41:11 +0800 Subject: [PATCH 07/14] Update index.html --- index.html | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/index.html b/index.html index aec6484..11e809c 100644 --- a/index.html +++ b/index.html @@ -60,7 +60,7 @@

首页

介绍

- 小明的OJ增强脚本是一个功能强大的浏览器扩展,旨在提升用户在小明的OJ(虚拟在线竞赛平台)上的使用体验。 + 小明的OJ是一个功能强大的浏览器扩展,旨在提升用户在小明的OJ(某虚拟在线竞赛平台)上的使用体验。 该脚本通过添加多种实用功能和界面优化,使用户能够更高效地参与竞赛、管理代码和享受更好的界面交互。

From 6e0c6408bd1e23f32953212871d8417602b49a9b Mon Sep 17 00:00:00 2001 From: Shan Wenxiao Date: Mon, 2 Oct 2023 11:47:18 +0800 Subject: [PATCH 08/14] Update AddonScript.js --- AddonScript.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/AddonScript.js b/AddonScript.js index 6550c25..2cc71b1 100644 --- a/AddonScript.js +++ b/AddonScript.js @@ -1,10 +1,10 @@ -if (localStorage.getItem("UserScript-ImportantNotice-20230830") == null) { - let InputValue = prompt("警告!警告!警告!请仔细阅读以下内容!您需要重新安装用户脚本!安装指南在https://web.xmoj-bbs.tech/#Install。因为此次更新开发者误修改了更新内容,导致无法检查出新的更新。如果你已经明白了这些内容,或者你使用的已经是0.2.80及以上版本,那么请在下方输入“我已知晓”并点击确定。"); +if (localStorage.getItem("UserScript-ImportantNotice-20231002") == null) { + let InputValue = prompt("警告!警告!警告!请仔细阅读以下内容!您需要重新安装用户脚本!安装指南在https://web.xmoj-bbs.tech/#Install。因为从0.3.x版本开始,脚本出现重大更新,非0.3.x已不再支持(甚至会出现错误)。如果你已经明白了这些内容,或者你使用的已经是0.3.143及以上版本,那么请在下方输入“我已知晓”并点击确定。"); if (InputValue != "我已知晓") { alert("您输入的内容不正确!请重新安装用户脚本!安装指南在https://web.xmoj-bbs.tech/#Install。"); window.location.href = "https://web.xmoj-bbs.tech/#Install"; } else { - localStorage.setItem("UserScript-ImportantNotice-20230830", "true") + localStorage.setItem("UserScript-ImportantNotice-20231002", "true") } } From 26380eff57325a392c5602aae2f8c21a74db0ffb Mon Sep 17 00:00:00 2001 From: Chen LangNing Date: Mon, 2 Oct 2023 12:40:35 +0800 Subject: [PATCH 09/14] =?UTF-8?q?=E7=BB=88=E4=BA=8E=E5=BC=84=E5=A5=BD?= =?UTF-8?q?=E5=9B=BE=E5=BA=8A=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Source/Process.ts | 16 ++++++++-------- XMOJ.user.js | 3 ++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Server/Source/Process.ts b/Server/Source/Process.ts index 6ff7889..dd7fefa 100644 --- a/Server/Source/Process.ts +++ b/Server/Source/Process.ts @@ -4,6 +4,7 @@ import { Output } from "./Output"; import { CaptchaSecretKey, GithubImagePAT } from "./Secret"; import { CheerioAPI, load } from "cheerio"; import CryptoJS from "crypto-js"; +import md5 from "crypto-js/md5"; export class Process { private AdminUserList: Array = ["chenlangning", "zhuchenrui2", "shanwenxiao"]; @@ -1037,7 +1038,7 @@ export class Process { "User-Agent": "XMOJ-Script-Server" }, body: JSON.stringify({ - message: "Upload image", + message: `${this.Username} ${new Date().getFullYear()}/${new Date().getMonth() + 1}/${new Date().getDate()} ${new Date().getHours()}:${new Date().getMinutes()}:${new Date().getSeconds()}`, content: ImageData }) }).then((Response) => { @@ -1060,24 +1061,24 @@ export class Process { ImageID: ImageID }); }, - GetImage: async (Data: object): Promise => { + GetImage: async (Data: object): Promise => { const GithubImageRepo = "langningchen/XMOJ-Script-Pictures"; ThrowErrorIfFailed(this.CheckParams(Data, { "ImageID": "string" })); - return await fetch(new URL("https://api.github.com/repos/" + GithubImageRepo + "/contents/" + Data["ImageID"]), { + return await fetch(new URL("https://api.github.com/repos/" + GithubImageRepo + "/contents/" + Data["ImageID"] + "?1=1"), { method: "GET", headers: { "Authorization": "Bearer " + GithubImagePAT, - "Accept": "application/vnd.github.raw", + "Accept": "application/vnd.github.v3.raw", "User-Agent": "XMOJ-Script-Server" } }).then((Response) => { - return Response.text(); + return Response.blob(); }).catch((Error) => { Output.Error("Get image failed: " + Error + "\n" + "ImageID : \"" + Data["ImageID"] + "\"\n"); - return ""; + return new Blob(); }); } }; @@ -1095,9 +1096,8 @@ export class Process { throw new Result(false, "访问的页面不存在"); } if (this.RequestData.method === "GET" && PathName === "GetImage") { - let ImageID = new URL(this.RequestData.url).searchParams.get("ImageID"); return new Response(await this.ProcessFunctions[PathName]({ - ImageID: ImageID + ImageID: new URL(this.RequestData.url).searchParams.get("ImageID") }), { headers: { "content-type": "image/png" diff --git a/XMOJ.user.js b/XMOJ.user.js index 566f336..f428e1f 100644 --- a/XMOJ.user.js +++ b/XMOJ.user.js @@ -3870,7 +3870,8 @@ int main() "Image": Reader.result }, (ResponseData) => { if (ResponseData.Success) { - console.log(ResponseData.Data.ImageID); + ContentElement.value += `![](https://api.xmoj-bbs.tech/GetImage?ImageID=${ResponseData.Data.ImageID})`; + ContentElement.dispatchEvent(new Event("input")); } }); }; From b232fdfbc7c81a033efd4b6ef91a72e936d24ef3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 2 Oct 2023 04:42:28 +0000 Subject: [PATCH 10/14] Update version info to 0.3.192 --- Update.json | 10 ++++++++++ XMOJ.user.js | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Update.json b/Update.json index 0e37846..3f8dcf2 100644 --- a/Update.json +++ b/Update.json @@ -705,6 +705,16 @@ "Description": "修复关闭时左上角仍显示为高老师的OJ" } ] + }, + "0.3.192": { + "UpdateDate": 1696221748461, + "Prerelease": true, + "UpdateContents": [ + { + "PR": 583, + "Description": "自制图床,讨论区 Ctrl+V 上传图片" + } + ] } } } \ No newline at end of file diff --git a/XMOJ.user.js b/XMOJ.user.js index f428e1f..61c9d50 100644 --- a/XMOJ.user.js +++ b/XMOJ.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name XMOJ -// @version 0.3.191 +// @version 0.3.192 // @description XMOJ增强脚本 // @author @langningchen // @namespace https://github/langningchen From e53a8779bd2107c68d8ca2b3221c8c205048ad24 Mon Sep 17 00:00:00 2001 From: Chen LangNing Date: Mon, 2 Oct 2023 12:44:39 +0800 Subject: [PATCH 11/14] =?UTF-8?q?=E5=9C=A8=E7=BC=96=E8=BE=91=E4=B8=8E?= =?UTF-8?q?=E5=8F=91=E5=B8=83=E6=97=B6=E4=B9=9F=E5=8F=AF=E4=BB=A5=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- XMOJ.user.js | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/XMOJ.user.js b/XMOJ.user.js index f428e1f..b9539c2 100644 --- a/XMOJ.user.js +++ b/XMOJ.user.js @@ -3702,14 +3702,33 @@ int main() } }); ContentElement.addEventListener("input", () => { + ContentElement.classList.remove("is-invalid"); PreviewTab.innerHTML = DOMPurify.sanitize(marked.parse(ContentElement.value)); RenderMathJax(); }); TitleElement.addEventListener("input", () => { TitleElement.classList.remove("is-invalid"); }); - ContentElement.addEventListener("input", () => { - ContentElement.classList.remove("is-invalid"); + ContentElement.addEventListener("paste", (Event) => { + let Items = Event.clipboardData.items; + if (Items.length !== 0) { + for (let i = 0; i < Items.length; i++) { + if (Items[i].type.indexOf("image") != -1) { + let Reader = new FileReader(); + Reader.readAsDataURL(Items[i].getAsFile()); + Reader.onload = () => { + RequestAPI("UploadImage", { + "Image": Reader.result + }, (ResponseData) => { + if (ResponseData.Success) { + ContentElement.value += `![](https://api.xmoj-bbs.tech/GetImage?ImageID=${ResponseData.Data.ImageID})`; + ContentElement.dispatchEvent(new Event("input")); + } + }); + }; + } + } + } }); SubmitElement.addEventListener("click", async () => { ErrorElement.style.display = "none"; @@ -4083,6 +4102,27 @@ int main() PreviewTab.innerHTML = DOMPurify.sanitize(marked.parse(ContentEditor.value)); RenderMathJax(); }); + ContentElement.addEventListener("paste", (Event) => { + let Items = Event.clipboardData.items; + if (Items.length !== 0) { + for (let i = 0; i < Items.length; i++) { + if (Items[i].type.indexOf("image") != -1) { + let Reader = new FileReader(); + Reader.readAsDataURL(Items[i].getAsFile()); + Reader.onload = () => { + RequestAPI("UploadImage", { + "Image": Reader.result + }, (ResponseData) => { + if (ResponseData.Success) { + ContentElement.value += `![](https://api.xmoj-bbs.tech/GetImage?ImageID=${ResponseData.Data.ImageID})`; + ContentElement.dispatchEvent(new Event("input")); + } + }); + }; + } + } + } + }); } let UsernameElements = document.getElementsByClassName("Usernames"); From a780a520cea5921842ea267fa5bed9eb67327319 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 2 Oct 2023 04:45:12 +0000 Subject: [PATCH 12/14] Update time and description of 0.3.192 --- Update.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Update.json b/Update.json index 3f8dcf2..9b4aa59 100644 --- a/Update.json +++ b/Update.json @@ -707,7 +707,7 @@ ] }, "0.3.192": { - "UpdateDate": 1696221748461, + "UpdateDate": 1696221911906, "Prerelease": true, "UpdateContents": [ { From 8810afe747535e351fbfb2af9296aa4833227089 Mon Sep 17 00:00:00 2001 From: Chen LangNing Date: Mon, 2 Oct 2023 12:48:22 +0800 Subject: [PATCH 13/14] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E7=B2=98=E8=B4=B4=E5=9B=BE=E7=89=87=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- XMOJ.user.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/XMOJ.user.js b/XMOJ.user.js index 6c981f5..3d9e8f9 100644 --- a/XMOJ.user.js +++ b/XMOJ.user.js @@ -4102,7 +4102,7 @@ int main() PreviewTab.innerHTML = DOMPurify.sanitize(marked.parse(ContentEditor.value)); RenderMathJax(); }); - ContentElement.addEventListener("paste", (Event) => { + ContentEditor.addEventListener("paste", (Event) => { let Items = Event.clipboardData.items; if (Items.length !== 0) { for (let i = 0; i < Items.length; i++) { @@ -4114,8 +4114,8 @@ int main() "Image": Reader.result }, (ResponseData) => { if (ResponseData.Success) { - ContentElement.value += `![](https://api.xmoj-bbs.tech/GetImage?ImageID=${ResponseData.Data.ImageID})`; - ContentElement.dispatchEvent(new Event("input")); + ContentEditor.value += `![](https://api.xmoj-bbs.tech/GetImage?ImageID=${ResponseData.Data.ImageID})`; + ContentEditor.dispatchEvent(new Event("input")); } }); }; From c45bc1f77a4a9710e831d916da913f6c10b5ed64 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 2 Oct 2023 04:48:55 +0000 Subject: [PATCH 14/14] Update time and description of 0.3.192 --- Update.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Update.json b/Update.json index 9b4aa59..a718806 100644 --- a/Update.json +++ b/Update.json @@ -707,7 +707,7 @@ ] }, "0.3.192": { - "UpdateDate": 1696221911906, + "UpdateDate": 1696222135180, "Prerelease": true, "UpdateContents": [ {