Skip to content
This repository was archived by the owner on Oct 3, 2023. It is now read-only.

Commit 86d688e

Browse files
author
Chen LangNing
authored
Merge pull request #568 from langningchen/dev
Dev
2 parents 1dd7235 + 6456559 commit 86d688e

6 files changed

Lines changed: 306 additions & 18 deletions

File tree

.github/workflows/CodeQL.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ name: CodeQL
22
on:
33
push:
44
branches:
5+
- master
56
- dev
67
pull_request:
78
branches:
9+
- master
810
- dev
911
jobs:
1012
CodeQL:

Server/Source/Initial.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ CREATE TABLE bbs_reply (
4747
edit_person TEXT
4848
);
4949

50-
DROP TABLE IF EXISTS board_id;
50+
DROP TABLE IF EXISTS bbs_board;
5151

52-
CREATE TABLE board_id (
52+
CREATE TABLE bbs_board (
5353
board_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
5454
board_name TEXT NOT NULL
5555
);

Server/Source/Process.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ export class Process {
401401
Title: Post["title"],
402402
PostTime: Post["post_time"],
403403
BoardID: Post["board_id"],
404-
BoardName: ThrowErrorIfFailed(await this.XMOJDatabase.Select("board_id", ["board_name"], {
404+
BoardName: ThrowErrorIfFailed(await this.XMOJDatabase.Select("bbs_board", ["board_name"], {
405405
board_id: Post["board_id"]
406406
}))[0]["board_name"],
407407
ReplyCount: ReplyCount,
@@ -450,7 +450,7 @@ export class Process {
450450
ResponseData.Title = Post[0]["title"];
451451
ResponseData.PostTime = Post[0]["post_time"];
452452
ResponseData.BoardID = Post[0]["board_id"];
453-
ResponseData.BoardName = ThrowErrorIfFailed(await this.XMOJDatabase.Select("board_id", ["board_name"], { board_id: Post[0]["board_id"] }))[0]["board_name"];
453+
ResponseData.BoardName = ThrowErrorIfFailed(await this.XMOJDatabase.Select("bbs_board", ["board_name"], { board_id: Post[0]["board_id"] }))[0]["board_name"];
454454

455455
let Locked = ThrowErrorIfFailed(await this.XMOJDatabase.Select("bbs_lock", [], {
456456
post_id: Data["PostID"]
@@ -1006,7 +1006,7 @@ export class Process {
10061006
GetBoards: async (Data: object): Promise<Result> => {
10071007
ThrowErrorIfFailed(this.CheckParams(Data, {}));
10081008
let Boards: Array<Object> = new Array<Object>();
1009-
let BoardsData = ThrowErrorIfFailed(await this.XMOJDatabase.Select("board_id", []));
1009+
let BoardsData = ThrowErrorIfFailed(await this.XMOJDatabase.Select("bbs_board", []));
10101010
for (let i in BoardsData) {
10111011
let Board = BoardsData[i];
10121012
Boards.push({

Update.json

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,7 @@
579579
]
580580
},
581581
"0.3.182": {
582-
"UpdateDate": 1695991801853,
582+
"UpdateDate": 1696049743852,
583583
"Prerelease": false,
584584
"UpdateContents": [
585585
{
@@ -603,6 +603,68 @@
603603
"Description": "增加讨论板块功能"
604604
}
605605
]
606+
},
607+
"0.3.183": {
608+
"UpdateDate": 1696047124160,
609+
"Prerelease": true,
610+
"UpdateContents": [
611+
{
612+
"PR": 557,
613+
"Description": "解决无法发帖"
614+
}
615+
]
616+
},
617+
"0.3.184": {
618+
"UpdateDate": 1696048489225,
619+
"Prerelease": true,
620+
"UpdateContents": [
621+
{
622+
"PR": 559,
623+
"Description": "解决无法在题目板块发布讨论"
624+
}
625+
]
626+
},
627+
"0.3.185": {
628+
"UpdateDate": 1696059816627,
629+
"Prerelease": true,
630+
"UpdateContents": [
631+
{
632+
"PR": 566,
633+
"Description": "允许直接获取数据,而不是申请数据"
634+
}
635+
]
636+
},
637+
"0.3.186": {
638+
"UpdateDate": 1696060570244,
639+
"Prerelease": true,
640+
"UpdateContents": [
641+
{
642+
"PR": 567,
643+
"Description": "修复月赛界面下部缺失"
644+
}
645+
]
646+
},
647+
"0.3.187": {
648+
"UpdateDate": 1696060746821,
649+
"Prerelease": false,
650+
"UpdateContents": [
651+
{
652+
"PR": 557,
653+
"Description": "解决无法发帖"
654+
},
655+
{
656+
"PR": 559,
657+
"Description": "解决无法在题目板块发布讨论"
658+
},
659+
{
660+
"PR": 566,
661+
"Description": "允许直接获取数据,而不是申请数据"
662+
},
663+
{
664+
"PR": 567,
665+
"Description": "修复月赛界面下部缺失"
666+
}
667+
]
606668
}
607669
}
608670
}

XMOJ.user.js

Lines changed: 115 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
11
// ==UserScript==
22
// @name XMOJ
3-
// @version 0.3.182
3+
// @version 0.3.187
44
// @description XMOJ增强脚本
55
// @author @langningchen
66
// @namespace https://github/langningchen
77
// @match http://*.xmoj.tech/*
88
// @match http://116.62.212.172/*
99
// @require https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/crypto-js.min.js
10-
// @require https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/hmac-sha1.min.js
1110
// @require https://cdn.bootcdn.net/ajax/libs/codemirror/6.65.7/codemirror.min.js
1211
// @require https://cdn.bootcdn.net/ajax/libs/codemirror/6.65.7/mode/clike/clike.min.js
1312
// @require https://cdn.bootcdn.net/ajax/libs/codemirror/6.65.7/addon/merge/merge.js
1413
// @require https://cdn.bootcdn.net/ajax/libs/diff_match_patch/20121119/diff_match_patch_uncompressed.js
1514
// @require https://cdn.bootcdn.net/ajax/libs/dompurify/3.0.2/purify.min.js
1615
// @require https://cdn.bootcdn.net/ajax/libs/marked/4.3.0/marked.min.js
17-
// @require https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/core.min.js
18-
// @require https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/md5.min.js
1916
// @grant GM_registerMenuCommand
2017
// @grant GM_xmlhttpRequest
2118
// @grant GM_setClipboard
@@ -2927,6 +2924,107 @@ else {
29272924
CurrentElement.innerText = TimeToStringTime(Temp[0]) + "/" + SizeToStringSize(Temp[1]);
29282925
}
29292926
if (document.getElementById("apply_data")) {
2927+
let ApplyDiv = document.getElementById("apply_data").parentElement;
2928+
let GetDataButton = document.createElement("button");
2929+
GetDataButton.className = "ms-2 btn btn-outline-secondary";
2930+
GetDataButton.innerText = "获取数据";
2931+
ApplyDiv.appendChild(GetDataButton);
2932+
GetDataButton.addEventListener("click", async () => {
2933+
GetDataButton.disabled = true;
2934+
GetDataButton.innerText = "正在获取数据...";
2935+
let PID = localStorage.getItem("UserScript-Solution-" + SearchParams.get("sid") + "-Problem");
2936+
let Code = "";
2937+
if (localStorage.getItem(`UserScript-Problem-${PID}-IOFilename`) !== null) {
2938+
Code = `#define IOFile "${localStorage.getItem(`UserScript-Problem-${PID}-IOFilename`)}"\n`;
2939+
}
2940+
Code += `#include <bits/stdc++.h>
2941+
using namespace std;
2942+
string Base64Encode(string Input)
2943+
{
2944+
const string Base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
2945+
string Output;
2946+
for (int i = 0; i < Input.length(); i += 3)
2947+
{
2948+
Output.push_back(i + 0 > Input.length() ? '=' : Base64Chars[(Input[i + 0] & 0xfc) >> 2]);
2949+
Output.push_back(i + 1 > Input.length() ? '=' : Base64Chars[((Input[i + 0] & 0x03) << 4) + ((Input[i + 1] & 0xf0) >> 4)]);
2950+
Output.push_back(i + 2 > Input.length() ? '=' : Base64Chars[((Input[i + 1] & 0x0f) << 2) + ((Input[i + 2] & 0xc0) >> 6)]);
2951+
Output.push_back(i + 3 > Input.length() ? '=' : Base64Chars[Input[i + 2] & 0x3f]);
2952+
}
2953+
return Output;
2954+
}
2955+
int main()
2956+
{
2957+
#ifdef IOFile
2958+
freopen(IOFile ".in", "r", stdin);
2959+
freopen(IOFile ".out", "w", stdout);
2960+
#endif
2961+
string Input;
2962+
while (1)
2963+
{
2964+
char Data = getchar();
2965+
if (Data == EOF)
2966+
break;
2967+
Input.push_back(Data);
2968+
}
2969+
throw runtime_error("[" + Base64Encode(Input.c_str()) + "]");
2970+
return 0;
2971+
}`;
2972+
2973+
await fetch("http://www.xmoj.tech/submit.php", {
2974+
"headers": {
2975+
"content-type": "application/x-www-form-urlencoded"
2976+
},
2977+
"referrer": "http://www.xmoj.tech/submitpage.php?id=" + PID,
2978+
"method": "POST",
2979+
"body": "id=" + PID + "&" +
2980+
"language=1&" +
2981+
"source=" + encodeURIComponent(Code) + "&" +
2982+
"enable_O2=on"
2983+
});
2984+
2985+
let SID = await fetch("http://www.xmoj.tech/status.php").then((Response) => {
2986+
return Response.text();
2987+
}).then((Response) => {
2988+
let ParsedDocument = new DOMParser().parseFromString(Response, "text/html");
2989+
return ParsedDocument.querySelector("#result-tab > tbody > tr:nth-child(1) > td:nth-child(2)").innerText;
2990+
});
2991+
2992+
await new Promise((Resolve) => {
2993+
let Interval = setInterval(async () => {
2994+
await fetch("status-ajax.php?solution_id=" + SID).then((Response) => {
2995+
return Response.text();
2996+
}).then((Response) => {
2997+
if (Response.split(",")[0] >= 4) {
2998+
clearInterval(Interval);
2999+
Resolve();
3000+
}
3001+
});
3002+
}, 500);
3003+
});
3004+
3005+
await fetch(`http://www.xmoj.tech/reinfo.php?sid=${SID}`).then((Response) => {
3006+
return Response.text();
3007+
}).then((Response) => {
3008+
let ParsedDocument = new DOMParser().parseFromString(Response, "text/html");
3009+
let ErrorData = ParsedDocument.getElementById("errtxt").innerText;
3010+
let MatchResult = ErrorData.match(/\what\(\): \[([A-Za-z0-9+\/=]+)\]/g);
3011+
for (let i = 0; i < MatchResult.length; i++) {
3012+
let Data = CryptoJS.enc.Base64.parse(MatchResult[i].substring(10, MatchResult[i].length - 1)).toString(CryptoJS.enc.Utf8);
3013+
ApplyDiv.appendChild(document.createElement("hr"));
3014+
ApplyDiv.appendChild(document.createTextNode("数据" + (i + 1) + ":"));
3015+
let CodeElement = document.createElement("div");
3016+
ApplyDiv.appendChild(CodeElement);
3017+
CodeMirror(CodeElement, {
3018+
value: Data,
3019+
theme: (UtilityEnabled("DarkMode") ? "darcula" : "default"),
3020+
lineNumbers: true,
3021+
readOnly: true
3022+
}).setSize("100%", "auto");
3023+
}
3024+
GetDataButton.innerText = "获取数据成功";
3025+
GetDataButton.disabled = false;
3026+
});
3027+
});
29303028
document.getElementById("apply_data").addEventListener("click", () => {
29313029
let ApplyElements = document.getElementsByClassName("data");
29323030
for (let i = 0; i < ApplyElements.length; i++) {
@@ -3123,7 +3221,7 @@ else {
31233221
Time = Temp[i].children[1].innerText;
31243222
}
31253223
let Body = Temp[i + 1].innerHTML;
3126-
NewsData.push({ "Title": Title, "Time": Time, "Body": Body });
3224+
NewsData.push({ "Title": Title, "Time": new Date(Time), "Body": Body });
31273225
}
31283226
document.querySelector("body > div > div.mt-3 > div > div.col-md-8").innerHTML = "";
31293227
for (let i = 0; i < NewsData.length; i++) {
@@ -3132,7 +3230,7 @@ else {
31323230
let NewsRowHead = document.createElement("div");
31333231
NewsRowHead.className = "cnt-row-head title";
31343232
NewsRowHead.innerText = NewsData[i].Title;
3135-
if (NewsData[i].Time != 0) {
3233+
if (NewsData[i].Time.getTime() != 0) {
31363234
NewsRowHead.innerHTML += "<small class=\"ms-3\">" + NewsData[i].Time.toLocaleDateString() + "</small>";
31373235
}
31383236
NewsRow.appendChild(NewsRowHead);
@@ -3596,9 +3694,6 @@ else {
35963694
let TurnstileScript = document.createElement("script");
35973695
TurnstileScript.src = "https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit&onload=CaptchaLoadedCallback";
35983696
document.body.appendChild(TurnstileScript);
3599-
if (!isNaN(ProblemID)) {
3600-
BoardSelect.style.display = "none";
3601-
}
36023697
ContentElement.addEventListener("keydown", (Event) => {
36033698
if (Event.ctrlKey && Event.keyCode == 13) {
36043699
SubmitElement.click();
@@ -3668,6 +3763,14 @@ else {
36683763
if (SearchParams.get("bid") !== null && SearchParams.get("bid") == Data[i].BoardID) {
36693764
RadioInput.checked = true;
36703765
}
3766+
if (!isNaN(ProblemID)) {
3767+
RadioInput.disabled = true;
3768+
}
3769+
if (Data[i].BoardID == 4) {
3770+
if (!isNaN(ProblemID))
3771+
RadioInput.checked = true;
3772+
RadioInput.disabled = true;
3773+
}
36713774
let RadioLabel = document.createElement("label");
36723775
RadioLabel.className = "form-check-label";
36733776
RadioLabel.htmlFor = "Board" + Data[i].BoardID;
@@ -3686,10 +3789,10 @@ else {
36863789
let Page = Number(SearchParams.get("page")) || 1;
36873790
document.querySelector("body > div > div").innerHTML = `<h3 id="PostTitle"></h3>
36883791
<div class="row mb-3">
3689-
<span class="col-3 text-muted">作者:<div style="display: inline-block;" id="PostAuthor"></div></span>
3792+
<span class="col-5 text-muted">作者:<div style="display: inline-block;" id="PostAuthor"></div></span>
36903793
<span class="col-3 text-muted">发布时间:<span id="PostTime"></span></span>
3691-
<span class="col-3 text-muted">板块:<span id="PostBoard"></span></span>
3692-
<span class="col-3">
3794+
<span class="col-2 text-muted">板块:<span id="PostBoard"></span></span>
3795+
<span class="col-2">
36933796
<button id="Delete" type="button" class="btn btn-sm btn-danger" style="display: none;">
36943797
删除
36953798
<div class="spinner-border spinner-border-sm" role="status" style="display: none;">

0 commit comments

Comments
 (0)