Skip to content
This repository has been archived by the owner on Nov 4, 2023. It is now read-only.

Commit

Permalink
Merge pull request #6 from PythonSmall-Q/dev
Browse files Browse the repository at this point in the history
Merge Dev
  • Loading branch information
PythonSmall-Q committed Oct 2, 2023
2 parents 2e507e6 + 31987e6 commit 13d7afb
Show file tree
Hide file tree
Showing 8 changed files with 361 additions and 85 deletions.
6 changes: 3 additions & 3 deletions AddonScript.js
Original file line number Diff line number Diff line change
@@ -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")
}
}
18 changes: 13 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@

### 介绍

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

- **比赛ACM排名与下载功能**:允许用户查看比赛的ACM排名,并提供下载选项,方便离线查阅。
- **讨论区**:我们自行搭建了一个讨论服务,你可以在里面发表你的声音。
- **短消息**:我们自行搭建了一个短消息服务,你可以在这里和你最好的伙伴交流。
- **查看更多标程**:展示更多的标准程序代码,帮助用户更好地理解题目要求和正确解法。
- **获取别人的测试点数据**允许用户获取其他人的测试点数据,用于分析问题和优化代码
- **获取测试点数据**允许用户获取的测试点数据,加快你调试的速度
- **自动刷新比赛列表与排名**:使比赛列表和排名页面自动定时刷新,获取最新信息。
- **界面时间自动倒计时**:在比赛列表等界面上自动显示剩余时间倒计时,方便用户了解时间情况。
- **回放视频下载功能**:为回放视频添加下载选项,方便用户离线观看回放。
Expand Down Expand Up @@ -46,6 +48,7 @@ XMOJ增强脚本是一个功能强大的浏览器扩展,旨在提升用户在X
- **修复登录后跳转失败**:解决登录后跳转问题,确保用户能够顺利进入下一步操作。
- **下载页面增加内容**:在下载页面增加更多内容,提供更多资源下载。
- **比较代码**:允许用户比较不同版本的代码,方便进行代码对比与分析。
- ~**学术模式**:开启学术模式,体验极致的学习环境!(此功能开发中,很快将会发布)~

![](Image/01.png)
![](Image/02.png)
Expand All @@ -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`分支, 否则他们会被自动关闭
15 changes: 8 additions & 7 deletions SECURITY.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
# Security Policy
# 安全策略

## Supported Versions
## 当前支持的版本

| Version | Supported |
| ------- | ------------------ |
| 0.3.x | :white_check_mark: |
| 0.2.x | :x: |
| 0.1.x | :x: |
| 版本 | 是否支持 | 预计结束支持时间 | 停止支持原因 |
| ------- | ------------------ | --------- | -------- |
| 0.3.x | :white_check_mark: | 预计支持到0.4.x出现后1个月 | |
| 0.2.x | :x: | 已停止支持 | 讨论功能重大更新 |
| 0.1.x | :x: | 已停止支持 | 重大安全隐患 |

注意:在开发过程中,服务器和用户脚本可能在任何时候发生重大变动,造成非最新版本结束支持。在这种情况下,我们会尽快更新用户脚本!感谢您的谅解。
82 changes: 79 additions & 3 deletions Server/Source/Process.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
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";
import md5 from "crypto-js/md5";

export class Process {
private AdminUserList: Array<string> = ["chenlangning", "zhuchenrui2", "shanwenxiao"];
Expand Down Expand Up @@ -1017,21 +1018,92 @@ export class Process {
return new Result(true, "获得板块列表成功", {
"Boards": Boards
});
},
UploadImage: async (Data: object): Promise<Result> => {
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: `${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) => {
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<Blob> => {
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"] + "?1=1"), {
method: "GET",
headers: {
"Authorization": "Bearer " + GithubImagePAT,
"Accept": "application/vnd.github.v3.raw",
"User-Agent": "XMOJ-Script-Server"
}
}).then((Response) => {
return Response.blob();
}).catch((Error) => {
Output.Error("Get image failed: " + Error + "\n" +
"ImageID : \"" + Data["ImageID"] + "\"\n");
return new Blob();
});
}
};
constructor(RequestData: Request, Environment) {
this.XMOJDatabase = new Database(Environment.DB);
this.RequestData = RequestData;
this.RemoteIP = RequestData.headers.get("CF-Connecting-IP") || "";
}
public async Process(): Promise<Result> {
public async Process(): Promise<Response> {
try {
let PathName = new URL(this.RequestData.url).pathname;
PathName = PathName === "/" ? "/index" : PathName;
PathName = PathName.substring(1);
if (this.ProcessFunctions[PathName] === undefined) {
throw new Result(false, "访问的页面不存在");
}
if (this.RequestData.method === "GET" && PathName === "GetImage") {
return new Response(await this.ProcessFunctions[PathName]({
ImageID: new URL(this.RequestData.url).searchParams.get("ImageID")
}), {
headers: {
"content-type": "image/png"
}
});
}
if (this.RequestData.method !== "POST") {
throw new Result(false, "不允许此请求方式");
}
Expand Down Expand Up @@ -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"
}
});
}
}
}
6 changes: 1 addition & 5 deletions Server/Source/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
118 changes: 118 additions & 0 deletions Update.json
Original file line number Diff line number Diff line change
Expand Up @@ -665,6 +665,124 @@
"Description": "修复月赛界面下部缺失"
}
]
},
"0.3.188": {
"UpdateDate": 1696118603087,
"Prerelease": true,
"UpdateContents": [
{
"PR": 575,
"Description": "修复无法显示problem_video.php"
}
]
},
"0.3.189": {
"UpdateDate": 1696120262725,
"Prerelease": true,
"UpdateContents": [
{
"PR": 576,
"Description": "更换预编译接口,解决奇怪的Compile Error"
}
]
},
"0.3.190": {
"UpdateDate": 1696120459819,
"Prerelease": true,
"UpdateContents": [
{
"PR": 577,
"Description": "修复短消息接受用户显示异常"
}
]
},
"0.3.191": {
"UpdateDate": 1696120913676,
"Prerelease": true,
"UpdateContents": [
{
"PR": 578,
"Description": "修复关闭时左上角仍显示为高老师的OJ"
}
]
},
"0.3.192": {
"UpdateDate": 1696222135180,
"Prerelease": true,
"UpdateContents": [
{
"PR": 583,
"Description": "自制图床,讨论区 Ctrl+V 上传图片"
}
]
},
"0.3.193": {
"UpdateDate": 1696227624991,
"Prerelease": true,
"UpdateContents": [
{
"PR": 586,
"Description": "修复因为严格导致的 @ 不显示"
}
]
},
"0.3.194": {
"UpdateDate": 1696228292398,
"Prerelease": true,
"UpdateContents": [
{
"PR": 588,
"Description": "修复题目中表格线条缺失"
}
]
},
"0.3.195": {
"UpdateDate": 1696235895109,
"Prerelease": true,
"UpdateContents": [
{
"PR": 5,
"Description": "Update XMOJ.user.js"
}
]
},
"0.3.196": {
"UpdateDate": 1696236634830,
"Prerelease": false,
"UpdateContents": [
{
"PR": 575,
"Description": "修复无法显示problem_video.php"
},
{
"PR": 576,
"Description": "更换预编译接口,解决奇怪的Compile Error"
},
{
"PR": 577,
"Description": "修复短消息接受用户显示异常"
},
{
"PR": 578,
"Description": "修复关闭时左上角仍显示为高老师的OJ"
},
{
"PR": 583,
"Description": "自制图床,讨论区 Ctrl+V 上传图片"
},
{
"PR": 586,
"Description": "修复因为严格导致的 @ 不显示"
},
{
"PR": 588,
"Description": "修复题目中表格线条缺失"
},
{
"PR": 5,
"Description": "Update XMOJ.user.js"
}
]
}
}
}
Loading

0 comments on commit 13d7afb

Please sign in to comment.