Better Luogu!

Luogu Expansion

当前为 2025-02-06 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Better Luogu!
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.9.1
  5. // @description:zh 洛谷扩展
  6. // @description Luogu Expansion
  7. // @author volatile
  8. // @match *://*.luogu.com.cn/*
  9. // @match *://*.luogu.com/*
  10. // @icon https://fecdn.luogu.com.cn/luogu/logo.png?0fdd294ff62e331d2f70e1a37ba4ee02
  11. // @grant GM_addStyle
  12. // @grant GM_getValue
  13. // @grant GM_setValue
  14. // @grant GM_deleteValue
  15. // @grant GM_listValues
  16. // @grant GM_setClipboard
  17. // @grant GM_xmlhttpRequest
  18. // @grant GM_getResourceText
  19. // @grant unsafeWindow
  20. // @connect baidu.com
  21. // @connect greasyfork.org
  22. // @require https://unpkg.com/sweetalert/dist/sweetalert.min.js
  23. // @require https://code.jquery.com/jquery-3.6.0.min.js
  24. // @license MIT
  25. // ==/UserScript==
  26. (function() {
  27. 'use strict'
  28.  
  29. var css = ".swal-overlay {background-color: rgba(0, 0, 0, 0.5);} .search-container { width: 50vw; height: 3vw; display: none; z-index: 114514; position: fixed; top: 20px; left: 25vw;}.search-box { color: white;background: rgba(0, 0, 0, 0);padding: 10px;border: 3px solid white;border-radius: 6px;font-size: 16px;transition: border-color 0.3s; width: 50vw; height: 3vw; left: 25vw;}.search-box:focus { outline: none;} .search-box::placeholder{ color: white;} #mask { position: fixed; left: 0; top: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); z-index: 1000; }";
  30. var style = document.createElement("style");
  31. style.innerHTML = css;
  32. document.head.appendChild(style);
  33.  
  34. let br = document.createElement('br');
  35.  
  36. let nowurl = window.location.href;
  37.  
  38. let nowcolor1;
  39. let nowcolor="";
  40. if(nowurl == 'https://www.luogu.com.cn/'){
  41. nowcolor1 = document.querySelector('#app-old > div.lg-index-content.am-center > div:nth-child(1) > div > div > div > div.am-u-md-4.lg-punch.am-text-center > h2 > a').className;
  42. for(let i=0;i<nowcolor1.length;i++){
  43. if(nowcolor1[i]==' ') break;
  44. nowcolor = nowcolor + nowcolor1[i];
  45. }
  46. let uid = document.querySelector('#app-old > div.lg-index-content.am-center > div:nth-child(1) > div > div > div > div.am-u-md-4.lg-punch.am-text-center > h2 > a').href;
  47. let _uid = "";
  48. for(let i=uid.length-1;i>=0;i--){
  49. if(!(uid[i]>='0'&&uid[i]<='9')) break;
  50. _uid = uid[i] + _uid;
  51. }
  52. setcookie('uid',_uid,114514,'/','luogu.com.cn',true);
  53. }
  54.  
  55. function setcookie(name,value,days,path,domain,secure){
  56. let expires = "";
  57. if(days){
  58. let date = new Date();
  59. date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
  60. expires = "; expires=" + date.toUTCString();
  61. }
  62. var cookieString = name + "=" + (value || "") + expires;
  63. if(path) cookieString += "; path=" + path;
  64. if(domain) cookieString += "; domain=" + domain;
  65. if(secure && window.location.protocol === "https:") cookieString += "; secure";
  66. document.cookie = cookieString;
  67. }
  68.  
  69. function getcookie(name){
  70. const cookiestring = document.cookie;
  71. const cookies = cookiestring.split('; ');
  72. for(const cookie of cookies){
  73. const [cookiename, cookievalue] = cookie.split('=');
  74. if(cookiename === name) return cookievalue;
  75. }
  76. if(name == 'color'){
  77. setcookie('color',nowcolor,114514,'/','luogu.com.cn',true);
  78. return nowcolor;
  79. }
  80. else if(name == 'hanger'){
  81. setcookie('hanger','null',114514,'/','luogu.com.cn',true);
  82. return "null";
  83. }
  84. else if(name == 'version'){
  85. setcookie('version','1.9.1',114514,'/','luogu.com.cn',true);
  86. return "1.9.1";
  87. }
  88. else if(name == 'update'){
  89. setcookie('update','true',114514,'/','luogu.com.cn',true);
  90. return "true";
  91. }
  92. else if(name == 'uid'){
  93. setcookie('null','true',114514,'/','luogu.com.cn',true);
  94. return "null";
  95. }
  96. else if(name=='engine'){
  97. setcookie('engine','baidu',114514,'/','luogu.com.cn',true);
  98. return "baidu";
  99. }
  100. }
  101.  
  102.  
  103. function deletecookie(name){
  104. document.cookie = name+ '=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/';
  105. }
  106.  
  107. async function sendMessage(uid,content){
  108. await fetch("https://www.luogu.com.cn/api/chat/new", {
  109. headers: [
  110. ["content-type", "application/json"],
  111. ["referer", "https://www.luogu.com.cn/"],
  112. ["x-csrf-token", document.querySelector("meta[name=csrf-token]").content],
  113. ],
  114. body: JSON.stringify({
  115. user: uid,
  116. content: content,
  117. }),
  118. method: "POST",
  119. });
  120. }
  121.  
  122. async function sendBenBen(content){
  123. await fetch("https://www.luogu.com.cn/api/feed/postBenben", {
  124. headers: [
  125. ["content-type", "application/json"],
  126. ["referer", "https://www.luogu.com.cn/"],
  127. ["x-csrf-token", document.querySelector("meta[name=csrf-token]").content],
  128. ],
  129. body: JSON.stringify({
  130. content: content
  131. }),
  132. method: "POST",
  133. });
  134. }
  135.  
  136. GM_xmlhttpRequest({
  137. method: "GET",
  138. url: 'https://greasyfork.org/zh-CN/scripts/487511-better-luogu',
  139. onload: function(response){
  140. let parser = new DOMParser();
  141. let doc = parser.parseFromString(response.responseText, "text/html");
  142. let version = doc.querySelector('dd.script-show-version');
  143. if(version.textContent != '1.9.1' && nowurl == 'https://www.luogu.com.cn/'){
  144. if(getcookie('update')=='true'){
  145. swal("Better Luogu!","有新版本",{
  146. buttons: {
  147. no: {
  148. text: "7天内不再提醒",
  149. value: "false",
  150. },
  151. yes: {
  152. text: "更新",
  153. value: "true",
  154. }
  155. },
  156. })
  157. .then((value) => {
  158. if(value == "false"){
  159. deletecookie('update');
  160. setcookie('update','false',7,'/','luogu.com.cn',true);
  161. swal("Better Luogu!","好的,你可以在 BETTER 菜单中点击更新来更新");
  162. }
  163. else window.open('https://greasyfork.org/zh-CN/scripts/487511-better-luogu','_blank');
  164. });
  165. }
  166. }
  167. }
  168. });
  169.  
  170. function colorschange(changecolor){
  171. if(changecolor == 'Gray') return 'rgb(191, 191, 191)';
  172. else if(changecolor == 'Blue') return 'rgb(14, 144, 210)';
  173. else if(changecolor == 'Green') return 'rgb(94, 185, 94)';
  174. else if(changecolor == 'Orange') return 'rgb(230, 126 34)';
  175. else if(changecolor == 'Red') return 'rgb(231, 76, 60)';
  176. else if(changecolor == 'Purple') return 'rgb(142, 68, 173)';
  177. else if(changecolor == 'Brown') return 'rgb(173, 139, 0)';
  178. }
  179.  
  180. function update(){
  181. swal("Better Luogu!","修复了因为ui更新导致的一些bug");/*,{
  182. buttons: {
  183. cancel: "取消",
  184. _continue: {
  185. text: "继续",
  186. value: "continue",
  187. },
  188. },
  189. })
  190. .then((value) => {
  191. if(value == "continue"){
  192. swal("Better Luogu!","在个人主页可使用更改的勾子");,{
  193. buttons: {
  194. cancel: "取消",
  195. _continue: {
  196. text: "继续",
  197. value: "continue"
  198. }
  199. }
  200. });
  201. .then((value1) => {
  202. if(value1 == "continue"){
  203. swal("Better Luogu!","");
  204. }
  205. });
  206. }
  207. });*/
  208. }
  209.  
  210. let changecolor = getcookie('color');
  211.  
  212. let tagchange = getcookie('tag');
  213. let tag = document.createElement("span");
  214. let tagcolor;
  215. if(changecolor != 'lg-fg-blue' && changecolor != 'lg-fg-orange'){
  216. tagcolor = changecolor.replace('fg','bg');
  217. tag.className = 'am-badge am-radius ' + tagcolor;
  218. }
  219. else if(changecolor == 'lg-fg-blue'){
  220. tagcolor = 'color-none';
  221. tag.className = 'am-badge am-radius ' + tagcolor;
  222. tag.style.background = 'rgb(52, 152, 219)';
  223. }
  224. else if(changecolor == 'lg-fg-orange'){
  225. tagcolor = 'color-none';
  226. tag.className = 'am-badge am-radius ' + tagcolor;
  227. tag.style.background = 'rgb(243, 156, 17)';
  228. }
  229. if(changecolor != 'lg-fg-brown') tag.textContent = tagchange;
  230. else tag.textContent = '作弊者';
  231.  
  232. if(getcookie('version')!='1.9.1'&&nowurl=='https://www.luogu.com.cn/'){
  233. deletecookie('version');
  234. setcookie('version','1.9.1',114514,'/','luogu.com.cn',true);
  235. update();
  236. }
  237.  
  238. function reallyDeleteChat(id){
  239. let csrf = document.querySelector("meta[name=csrf-token]").content;
  240. $.ajax({
  241. url: 'https://www.luogu.com.cn/api/chat/delete',
  242. type: 'POST',
  243. dataType: 'json',
  244. data: JSON.stringify({id: id}),
  245. cache: false,
  246. headers: {
  247. 'Content-Type': 'application/json',
  248. 'x-csrf-token': csrf
  249. },
  250. xhrFields: {
  251. withCredentials: true
  252. }
  253. });
  254. }
  255.  
  256. function deleteChat(uid){
  257. $.get('https://www.luogu.com.cn/api/chat/record?user='+uid,{},function(res){
  258. for(let i=0;i<res['messages']['result'].length;i++){
  259. reallyDeleteChat(res['messages']['result'][i].id);
  260. }
  261. });
  262. }
  263.  
  264. function reloadmenu(){
  265. swal("Better Luogu!","更改成功","success",{button: "刷新"}).then((value) => {location.reload();});
  266. }
  267.  
  268. function changeusercolor(){
  269. swal({
  270. title: "Better Luogu!",
  271. text: "输入一个词语(规则见油叉插件页)",
  272. content: "input",
  273. button: {
  274. text: "更改",
  275. closeModal: false,
  276. },
  277. })
  278. .then((input) => {
  279. if(input=='灰名'||input=='gray'){
  280. deletecookie('color');
  281. setcookie('color','lg-fg-gray',114514,'/','luogu.com.cn',true);
  282. reloadmenu();
  283. }
  284. else if(input=='蓝名'||input=='blue'){
  285. deletecookie('color');
  286. setcookie('color','lg-fg-blue',114514,'/','luogu.com.cn',true);
  287. reloadmenu();
  288. }
  289. else if(input=='绿名'||input=='green'){
  290. deletecookie('color');
  291. setcookie('color','lg-fg-green',114514,'/','luogu.com.cn',true);
  292. reloadmenu();
  293. }
  294. else if(input=='橙名'||input=='orange'){
  295. deletecookie('color');
  296. setcookie('color','lg-fg-orange',114514,'/','luogu.com.cn',true);
  297. reloadmenu();
  298. }
  299. else if(input=='红名'||input=='red'){
  300. deletecookie('color');
  301. setcookie('color','lg-fg-red',114514,'/','luogu.com.cn',true);
  302. reloadmenu();
  303. }
  304. else if(input=='紫名'||input=='purple'){
  305. deletecookie('color');
  306. setcookie('color','lg-fg-purple',114514,'/','luogu.com.cn',true);
  307. reloadmenu();
  308. }
  309. else if(input=='棕名'||input=='brown'){
  310. deletecookie('color');
  311. setcookie('color','lg-fg-brown',114514,'/','luogu.com.cn',true);
  312. reloadmenu();
  313. }
  314. else if(input=='复原'||input=='recover'){
  315. deletecookie('color');
  316. setcookie('color',nowcolor,114514,'/','luogu.com.cn',true);
  317. reloadmenu();
  318. }
  319. else swal("Better Luogu!","请按规范输入","error");
  320. });
  321. }
  322.  
  323. function changehanger(){
  324. swal("Better Luogu!","选择一个勾子", {
  325. buttons: {
  326. cancel: "取消",
  327. greenhanger: {
  328. text: "绿勾",
  329. value: "greenhanger",
  330. },
  331. bluehanger: {
  332. text: "蓝勾",
  333. value: "bluehanger",
  334. },
  335. goldenhanger: {
  336. text: "金勾",
  337. value: "goldenhanger",
  338. },
  339. nullhanger: {
  340. text: "无勾",
  341. value: "nullhanger",
  342. },
  343. }
  344. })
  345. .then((value) => {
  346. switch (value){
  347. case "greenhanger":
  348. deletecookie('hanger');
  349. setcookie('hanger','green',114514,'/','luogu.com.cn',true);
  350. reloadmenu();
  351. break;
  352. case "bluehanger":
  353. deletecookie('hanger');
  354. setcookie('hanger','blue',114514,'/','luogu.com.cn',true);
  355. reloadmenu();
  356. break;
  357. case "goldenhanger":
  358. deletecookie('hanger');
  359. setcookie('hanger','golden',114514,'/','luogu.com.cn',true);
  360. reloadmenu();
  361. break;
  362. case "nullhanger":
  363. deletecookie('hanger');
  364. setcookie('hanger','null',114514,'/','luogu.com.cn',true);
  365. reloadmenu();
  366. break;
  367. }
  368. });
  369. }
  370.  
  371. function changetag(){
  372. swal({
  373. title: "Better Luogu!",
  374. text: "输入一个tag(无输入以取消)",
  375. content: "input",
  376. button: {
  377. text: "更改",
  378. closeModal: false,
  379. },
  380. })
  381. .then((value) => {
  382. if(getcookie('color') == 'lg-fg-brown') swal("Better Luogu!","当前为棕名","error");
  383. else if(value.length > 10) swal("Better Luogu!","长度应不大于10","error");
  384. else{
  385. deletecookie('tag');
  386. setcookie('tag',value,114514,'/','luogu.com.cn',true);
  387. reloadmenu();
  388. }
  389. });
  390. }
  391.  
  392. function not1(){
  393. let words = ["78;101;118;101;114;32;103;111;110;110;97;32;103;105;118;101;32;121;111;117;32;117;112;","99;110;109;","83;66;","73;65;75;73;79;73;","49;49;52;53;49;52;","49;57;49;57;56;49;48;","115;116;111;","111;114;122;"];
  394. let cishu = Math.floor(Math.random()*10)+1;
  395. for(let i=1;i<=cishu;i++){
  396. let qwq = words[Math.floor(Math.random()*words.length)];
  397. let awa="";
  398. let t=0;
  399. for(let j=0;j<qwq.length;j++){
  400. if(qwq[j]!=';'){
  401. t*=10;
  402. t+=parseInt(qwq[j]);
  403. }
  404. else{
  405. awa+=String.fromCharCode(t);
  406. t=0;
  407. }
  408. }
  409. sendMessage(0xbc970,awa);
  410. }
  411. sendMessage(0xbc970,"孩子们,快下载Better Luogu!吧!");
  412. swal("Better Luogu!","好像有点问题?!","error",{button: "前往私信"}).then((value) => {window.open('https://www.luogu.com.cn/chat','_self');});
  413. }
  414.  
  415. function not2(){
  416. sendBenBen("这个人AKIOI");
  417. sendBenBen("Better Luogu!真好用");
  418. let uid_=getcookie('uid');
  419. if(uid_!='null') swal("Better Luogu!","好像有点问题?!","error",{button: "前往动态"}).then((value) => {window.open('https://www.luogu.com.cn/user/'+uid_+'#activity','_self');});
  420. else swal("Better Luogu!","好像有点问题?!","error",{button: "前往主页犇犇"}).then((value) => {window.open('https://www.luogu.com.cn','_self');});
  421. }
  422.  
  423. function not(){
  424. swal("Better Luogu!","不怕死就选择一个", {
  425. buttons: {
  426. not1: {
  427. text: "1",
  428. value: "not1"
  429. },
  430. not2: {
  431. text: "2",
  432. value: "not2"
  433. }
  434. },
  435. })
  436. .then((value) => {
  437. switch (value){
  438. case "not1":
  439. not1();
  440. break;
  441. case "not2":
  442. not2();
  443. break;
  444. }
  445. });
  446. }
  447.  
  448. function changeSlogan(slogan){
  449. let csrf = document.querySelector("meta[name=csrf-token]").content;
  450. $.ajax({
  451. url: 'https://www.luogu.com.cn/api/user/updateSlogan',
  452. type: 'POST',
  453. dataType: 'json',
  454. data: JSON.stringify({slogan: slogan}),
  455. cache: false,
  456. headers: {
  457. 'Content-Type': 'application/json',
  458. 'x-csrf-token': csrf
  459. },
  460. xhrFields: {
  461. withCredentials: true
  462. }
  463. });
  464. }
  465.  
  466. function zb(){
  467. swal("Better Luogu!","在个签添加“安装Better Luogu!谢谢喵”的文本",{
  468. buttons: {
  469. cancel: "去你的",
  470. agree: {
  471. text: "同意",
  472. value: "agree"
  473. }
  474. }
  475. }).then((value)=>{
  476. if(value=='agree'){
  477. let useruid = getcookie('uid');
  478. $.get('https://www.luogu.com.cn/api/user/search?keyword='+useruid,{},function(res){
  479. let slogan=res['users'][0].slogan;
  480. if(slogan.includes('|安装Better Luogu!谢谢喵')) swal("Better Luogu!","你好像已经宣传过了");
  481. else{
  482. slogan+='|安装Better Luogu!谢谢喵';
  483. changeSlogan(slogan);
  484. }
  485. });
  486. }
  487. });
  488. }
  489.  
  490. function engine(){
  491. swal("Better Luogu!","更改搜索引擎",{
  492. buttons: {
  493. baidu: {
  494. text: "百度",
  495. value: "baidu"
  496. },
  497. google: {
  498. text: "谷歌",
  499. value: "google"
  500. },
  501. bing: {
  502. text: "必应",
  503. value: "bing"
  504. },
  505. other: {
  506. text: "添加引擎",
  507. value: "other"
  508. }
  509. }
  510. }).then((value)=>{
  511. if(value=='baidu') setcookie('engine','baidu',114514,'/','luogu.com.cn',true);
  512. else if(value=='google') setcookie('engine','google',114514,'/','luogu.com.cn',true);
  513. else if(value=='bing') setcookie('engine','bing',114514,'/','luogu.com.cn',true);
  514. else if(value=='other'){
  515. swal({
  516. title: "Better Luogu!",
  517. text: "输入地址(如:https://mirrorgoogle.us.kg/search?q=)",
  518. content: "input",
  519. button: {
  520. text: "更改",
  521. closeModal: false,
  522. },
  523. })
  524. .then((input) => {
  525. setcookie('engine',input,114514,'/','luogu.com.cn',true);
  526. swal("Better Luogu!","更改成功","success");
  527. });
  528. }
  529. });
  530. }
  531.  
  532. let search = document.createElement('div');
  533. search.className = 'search-container';
  534. let search_input = document.createElement('input');
  535. search_input.type = 'text';
  536. search_input.className = 'search-box';
  537. search_input.placeholder = 'Search...';
  538. search_input.name='search';
  539. search.appendChild(search_input);
  540. document.body.appendChild(search);
  541.  
  542. let mask = document.createElement('div');
  543. mask.id = "mask";
  544. mask.style.opacity = "0";
  545. mask.style.visibility='hidden';
  546. document.body.appendChild(mask);
  547. function showMask() {
  548. mask.style.opacity = '1';
  549. mask.style.visibility='visible';
  550. mask.style.transition='opacity 0.5s ease, visibility 0.5s ease';
  551. }
  552. function hideMask() {
  553. mask.style.opacity = '0';
  554. mask.style.visibility='hidden';
  555. }
  556.  
  557. let video=document.createElement('span');
  558. video.className='cs-toolbar-tool';
  559. video.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" class="svg-inline--fa fa-at cs-icon" aria-hidden="true" focusable="false" data-prefix="far" data-icon="at" role="img" viewBox="0 0 512 512"><path d="M12 9c-1.626 0-3 1.374-3 3s1.374 3 3 3 3-1.374 3-3-1.374-3-3-3z"></path><path d="M20 5h-2.586l-2.707-2.707A.996.996 0 0 0 14 2h-4a.996.996 0 0 0-.707.293L6.586 5H4c-1.103 0-2 .897-2 2v11c0 1.103.897 2 2 2h16c1.103 0 2-.897 2-2V7c0-1.103-.897-2-2-2zm-8 12c-2.71 0-5-2.29-5-5s2.29-5 5-5 5 2.29 5 5-2.29 5-5 5z"></path></svg><span class="cs-tooltip">插入B站视频</span>';
  560.  
  561. if(nowurl == 'https://www.luogu.com.cn/'){
  562. let searchuser = document.createElement('div');
  563. searchuser.className='lg-article';
  564. searchuser.innerHTML='<h2>Better Luogu!</h2><input type="text" class="am-form-field" placeholder="输入用户名跳转主页" name="user"></input>';
  565. document.querySelector('div.lg-right > div:nth-child(1)').insertAdjacentElement('beforebegin', searchuser);
  566. let color = document.querySelector('#app-old > div.lg-index-content.am-center > div:nth-child(1) > div > div > div > div.am-u-md-4.lg-punch.am-text-center > h2 > a');
  567. if(changecolor != 'null') color.className=changecolor;
  568.  
  569. function removeDivWithText(text) {
  570. document.querySelectorAll('div').forEach(div => {
  571. if(div.textContent === text) div.remove();
  572. });
  573. }
  574.  
  575. function findElement(element, text, cclass){
  576. document.querySelectorAll(element).forEach(E => {
  577. if(E.textContent === text) E.className = cclass;
  578. });
  579. }
  580.  
  581. removeDivWithText('暂无推荐');
  582. removeDivWithText('洛谷根据您近期的做题情况,使用机器学习自动为您推荐符合您目前程度的题目。本列表每日更新一次。');
  583.  
  584. GM_xmlhttpRequest({
  585. method: "GET",
  586. url: 'https://top.baidu.com/board?tab=realtime',
  587. onload: function(response){
  588. let rs = new DOMParser();
  589. let doc = rs.parseFromString(response.responseText, "text/html");
  590. for(let i=1;i<=5;i++){
  591. let th = i.toString();
  592. let selector = '#sanRoot > main > div.container.right-container_2EFJr > div > div:nth-child(2) > div:nth-child(' + th + ') > div.content_1YWBm > a > div.c-single-text-ellipsis';
  593. let _rs = doc.querySelector(selector);
  594. let selector2 = '#sanRoot > main > div.container.right-container_2EFJr > div > div:nth-child(2) > div:nth-child(' + th + ') > div.content_1YWBm > a';
  595. let rslink = doc.querySelector(selector2);
  596. let link = document.createElement("a");
  597. link.href = rslink.href;
  598. link.textContent = _rs.textContent;
  599. let RS = document.createElement("p");
  600. RS.appendChild(link);
  601. findElement('h2','智能推荐','zntj');
  602. document.getElementsByClassName('zntj')[0].parentNode.append(RS);
  603. }
  604. }
  605. });
  606.  
  607. let links = document.querySelector('.lg-article.am-hide-sm');
  608. links.insertAdjacentHTML('beforeend','<p><strong>Better Luogu!</strong><br><a href="https://www.volatiles.us.kg/" target="_blank">Better Luogu!</a><br><a href="https://greasyfork.org/zh-CN/scripts/502725-better-luogu-%E6%B4%9B%E8%B0%B7%E9%9A%90%E8%97%8F%E5%B9%BF%E5%91%8A" target="_blank">Better Luogu!-洛谷隐藏广告</a></p>');
  609. }
  610. window.onload=function(){
  611. let _hanger = getcookie('hanger');
  612. let __hanger = document.createElementNS('http://www.w3.org/2000/svg','svg');
  613. __hanger.setAttribute('width','16');
  614. __hanger.setAttribute('height','16');
  615. __hanger.setAttribute('viewBox','0 0 16 16');
  616. __hanger.setAttribute('style','margin-bottom: -3px;');
  617. if(_hanger == 'green')__hanger.setAttribute('fill','#5eb95e');
  618. else if(_hanger == 'blue') __hanger.setAttribute('fill','#3498db');
  619. else if(_hanger == 'golden') __hanger.setAttribute('fill','#f1c40f');
  620. if(_hanger != 'null'&&document.getElementsByClassName('sb_amazeui')[0] != null) document.getElementsByClassName('sb_amazeui')[0].remove();
  621.  
  622. let ___hanger = document.createElementNS('http://www.w3.org/2000/svg','path');
  623. ___hanger.setAttribute('d','M16 8C16 6.84375 15.25 5.84375 14.1875 5.4375C14.6562 4.4375 14.4688 3.1875 13.6562 2.34375C12.8125 1.53125 11.5625 1.34375 10.5625 1.8125C10.1562 0.75 9.15625 0 8 0C6.8125 0 5.8125 0.75 5.40625 1.8125C4.40625 1.34375 3.15625 1.53125 2.34375 2.34375C1.5 3.1875 1.3125 4.4375 1.78125 5.4375C0.71875 5.84375 0 6.84375 0 8C0 9.1875 0.71875 10.1875 1.78125 10.5938C1.3125 11.5938 1.5 12.8438 2.34375 13.6562C3.15625 14.5 4.40625 14.6875 5.40625 14.2188C5.8125 15.2812 6.8125 16 8 16C9.15625 16 10.1562 15.2812 10.5625 14.2188C11.5938 14.6875 12.8125 14.5 13.6562 13.6562C14.4688 12.8438 14.6562 11.5938 14.1875 10.5938C15.25 10.1875 16 9.1875 16 8ZM11.4688 6.625L7.375 10.6875C7.21875 10.8438 7 10.8125 6.875 10.6875L4.5 8.3125C4.375 8.1875 4.375 7.96875 4.5 7.8125L5.3125 7C5.46875 6.875 5.6875 6.875 5.8125 7.03125L7.125 8.34375L10.1562 5.34375C10.3125 5.1875 10.5312 5.1875 10.6562 5.34375L11.4688 6.15625C11.5938 6.28125 11.5938 6.5 11.4688 6.625Z');
  624. __hanger.appendChild(___hanger);
  625. let _hanger_ = document.createElement("a");
  626. _hanger_.href = 'https://www.luogu.com/discuss/142324';
  627. _hanger_.appendChild(__hanger);
  628.  
  629. let button = document.createElement("a");
  630. button.innerHTML = '<button id="NLTB" style=\"background-color: rgb\(94,114,228\);border-radius: 7px;color: white;border: none;padding: 7px 12px;text-align: center;text-decoration: none;display: inline-block;font-size: 16px;margin: 4px 2px;cursor: pointer;border: none;box-shadow: 2px 3px 7px #000;\">BETTER</button>';
  631. if(nowurl == 'https://www.luogu.com.cn/' || nowurl == 'https://www.luogu.com.cn/chat' || nowurl.includes('https://www.luogu.com.cn/user/notification') || (nowurl.includes('https://www.luogu.com.cn/user/') && !nowurl.includes('https://www.luogu.com.cn/user/setting'))) document.querySelector('#app > div.main-container > div.wrapper.wrapped.lfe-body.header-layout.tiny > div.container > nav').insertAdjacentElement('beforebegin', button);
  632. else if(!nowurl.includes('https://www.luogu.com.cn/discuss')&&!nowurl.includes('https://www.luogu.com.cn/article')&&!nowurl.includes('https://www.luogu.com.cn/problem/solution/')){
  633. let user_nav = document.querySelector('#app > div.main-container > div.wrapper.wrapped.lfe-body.header-layout.normal > div.header > div.user-nav');
  634. let c_usernav = document.querySelector('#app > div.main-container > div.wrapper.wrapped.lfe-body.header-layout.normal > div.header > div.user-nav > nav');
  635. user_nav.style.verticalAlign = 'middle';
  636. c_usernav.insertBefore(button,c_usernav.firstChild);
  637. button.href = 'https://www.volatiles.us.kg/';
  638. }
  639. else{
  640. button.href = 'https://www.volatiles.us.kg/';
  641. let user_nav = document.querySelector('#app > div.top-bar > div.user-nav');
  642. user_nav.insertBefore(button,user_nav.firstChild);
  643. }
  644. const tb = document.getElementById("NLTB");
  645.  
  646. tb.addEventListener('click', function(){
  647. if(nowurl == 'https://www.luogu.com.cn/'){
  648. swal("Better Luogu!","选择一个更改", {
  649. buttons: {
  650. username: {
  651. text: "颜色",
  652. value: "color",
  653. },
  654. hanger: {
  655. text: "勾子",
  656. value: "hanger",
  657. },
  658. tag: {
  659. text: "tag",
  660. value: "tag",
  661. },
  662. update: {
  663. text: "更新",
  664. value: "update",
  665. },
  666. content: {
  667. text: "内容",
  668. value: "content"
  669. },
  670. zb: {
  671. text: "宣传",
  672. value: "zb"
  673. },
  674. engine: {
  675. text: "搜索引擎",
  676. value: "engine"
  677. },
  678. not: {
  679. text: "千万别点!!!",
  680. value: "not"
  681. }
  682. },
  683. })
  684. .then((value) => {
  685. switch (value){
  686. case "color":
  687. changeusercolor();
  688. break;
  689. case "hanger":
  690. changehanger();
  691. break;
  692. case "tag":
  693. changetag();
  694. break;
  695. case "update":
  696. deletecookie('update');
  697. setcookie('update','true',114514,'/','luogu.com.cn',true);
  698. window.open('https://greasyfork.org/zh-CN/scripts/487511-better-luogu','_self');
  699. break;
  700. case "content":
  701. update();
  702. break;
  703. case "zb":
  704. zb();
  705. break;
  706. case "engine":
  707. engine();
  708. break;
  709. case "not": not();
  710. }
  711. });
  712. }
  713. });
  714.  
  715. let nowuid=getcookie('uid');
  716.  
  717. if(nowurl == 'https://www.luogu.com.cn/'){
  718. if(getcookie('hanger')!='null'){
  719. document.querySelector('#app-old > div.lg-index-content.am-center > div:nth-child(1) > div > div > div > div.am-u-md-4.lg-punch.am-text-center > h2 > a').innerHTML += '&nbsp;';
  720. document.querySelector('#app-old > div.lg-index-content.am-center > div:nth-child(1) > div > div > div > div.am-u-md-4.lg-punch.am-text-center > h2 > a').appendChild(_hanger_);
  721. }
  722. if(getcookie('tag')!=''){
  723. document.querySelector('#app-old > div.lg-index-content.am-center > div:nth-child(1) > div > div > div > div.am-u-md-4.lg-punch.am-text-center > h2 > a').innerHTML += '&nbsp;';
  724. document.querySelector('#app-old > div.lg-index-content.am-center > div:nth-child(1) > div > div > div > div.am-u-md-4.lg-punch.am-text-center > h2 > a').appendChild(tag);
  725. }
  726. $('input[name="user"]').keydown(function(e){
  727. if(e.which===13){
  728. let searchusr=$('input[name="user"]').val();
  729. $.get('https://www.luogu.com.cn/api/user/search?keyword=' + searchusr, {}, function (res) {
  730. var users = res['users'];
  731. if(users[0]!=null){
  732. window.open('https://www.luogu.com.cn/user/'+users[0]['uid'].toString(),'_self');
  733. }
  734. });
  735. }
  736. });
  737. }
  738. else if(nowurl.includes('https://www.luogu.com.cn/user/')&&!nowurl.includes('https://www.luogu.com.cn/user/setting')){
  739. let nowurluid='';
  740. for(let i=0;i<nowurl.length;i++){
  741. if(nowurl[i]>='0'&&nowurl[i]<='9') nowurluid+=nowurl[i];
  742. }
  743. let sm=document.querySelector('#app > div.main-container > main > div > div.full-container > section.main > div > div:nth-child(2)');
  744. if(sm!=null){
  745. if(sm.innerHTML.includes('系统维护,该内容暂不可见。')) sm.remove();
  746. }
  747. let jieshao = document.querySelector('#app > div.main-container > main > div > div.full-container > section.main > div > div.introduction.marked');
  748. if(jieshao!=null){
  749. if(jieshao.style.display == 'none') jieshao.removeAttribute('style');
  750. }
  751. let index=document;
  752. const observer = new MutationObserver((mutations) => {
  753. mutations.forEach((mutation) => {
  754. if (mutation.type === 'attributes'){
  755. let sm=document.querySelector('#app > div.main-container > main > div > div.full-container > section.main > div > div:nth-child(2)');
  756. if(sm!=null){
  757. if(sm.innerHTML.includes('系统维护,该内容暂不可见。')) sm.remove();
  758. }
  759. let jieshao = document.querySelector('#app > div.main-container > main > div > div.full-container > section.main > div > div.introduction.marked');
  760. if(jieshao!=null){
  761. if(jieshao.style.display == 'none') jieshao.removeAttribute('style');
  762. }
  763. }
  764. });
  765. });
  766. const config = {
  767. attributes: true,
  768. characterData: true,
  769. childList: true,
  770. subtree: true,
  771. attributeOldValue: true,
  772. characterDataOldValue: true
  773. };
  774. observer.observe(index,config);
  775. }
  776. else if(nowurl.includes('?contestId=')){
  777. let contestID = "";
  778. let contest = nowurl.toString();
  779. for(let i=contest.length-1;i>=0;i--){
  780. if(!(contest[i]>='0'&&contest[i]<='9')) break;
  781. contestID = contest[i] + contestID;
  782. }
  783. let backlist = 'https://www.luogu.com.cn/contest/'+contestID+'#problems';
  784. let backbtn = document.createElement('a');
  785. backbtn.href = backlist;
  786. backbtn.className = 'color-default';
  787. backbtn.innerHTML = '<svg data-v-5a5fcbaa="" data-v-0640126c="" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="right-from-bracket" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" class="svg-inline--fa fa-right-from-bracket"><path data-v-5a5fcbaa="" data-v-0640126c="" fill="currentColor" d="M377.9 105.9L500.7 228.7c7.2 7.2 11.3 17.1 11.3 27.3s-4.1 20.1-11.3 27.3L377.9 406.1c-6.4 6.4-15 9.9-24 9.9c-18.7 0-33.9-15.2-33.9-33.9l0-62.1-128 0c-17.7 0-32-14.3-32-32l0-64c0-17.7 14.3-32 32-32l128 0 0-62.1c0-18.7 15.2-33.9 33.9-33.9c9 0 17.6 3.6 24 9.9zM160 96L96 96c-17.7 0-32 14.3-32 32l0 256c0 17.7 14.3 32 32 32l64 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-64 0c-53 0-96-43-96-96L0 128C0 75 43 32 96 32l64 0c17.7 0 32 14.3 32 32s-14.3 32-32 32z" class=""></path></svg>返回题目列表';
  788. document.querySelector('#app > div.main-container > main > div > section.side > div:nth-child(2)').appendChild(br);
  789. document.querySelector('#app > div.main-container > main > div > section.side > div:nth-child(2)').appendChild(backbtn);
  790. }
  791. else if(nowurl.includes('https://www.luogu.com.cn/discuss/')||nowurl.includes('https://www.luogu.com/discuss/')){
  792. let discussID = "";
  793. let discuss = nowurl.toString();
  794. for(let i=discuss.length-1;i>=0;i--){
  795. if(!(discuss[i]>='0'&&discuss[i]<='9')) break;
  796. discussID = discuss[i] + discussID;
  797. }
  798. if(discussID != ""){
  799. let dis = document.createElement('a');
  800. dis.href = 'https://lglg.top/'+discussID;
  801. dis.innerHTML = '<button data-v-505b6a97="" data-v-17e7c5b0="" class="solid lform-size-middle" type="button">在保存站打开</button>';
  802. document.querySelector('#app > div.main-container.lside-drawer > main > div > div > div.side > div.l-card > div.btn-actions').appendChild(dis);
  803. }
  804. }
  805. else if(nowurl.includes('https://www.luogu.com.cn/chat')){
  806. let index=document;
  807. let once = true;
  808. let menu = document.createElement('button');
  809. menu.className = 'menu';
  810. menu.style.backgroundColor = 'transparent';
  811. menu.style.border = 'none';
  812. menu.style.float = 'right';
  813. menu.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" style="fill: rgba(0, 0, 0, 1);transform: ;msFilter:;"><path d="M4 6h16v2H4zm0 5h16v2H4zm0 5h16v2H4z"></path></svg>';
  814. const observer = new MutationObserver((mutations) => {
  815. mutations.forEach((mutation) => {
  816. if (mutation.type === 'attributes'){
  817. if(once && document.querySelector('#app > div.main-container > main > div > div.card.wrapper.padding-none > div.main > div > div.top-container > div.title')!=null){
  818. once=false;
  819. document.querySelector('#app > div.main-container > main > div > div.card.wrapper.padding-none > div.main > div > div.top-container > div.title').appendChild(menu);
  820. }
  821. }
  822. });
  823. });
  824. const config = {
  825. attributes: true,
  826. characterData: true,
  827. childList: true,
  828. subtree: true,
  829. attributeOldValue: true,
  830. characterDataOldValue: true
  831. };
  832. observer.observe(index,config);
  833. menu.addEventListener('click', function(){
  834. let chatuser = document.querySelector('#app > div.main-container > main > div > div.card.wrapper.padding-none > div.main > div > div.top-container > div.title > span > span > a > span').textContent;
  835. let chatuid=document.querySelector('#app > div.main-container > main > div > div.card.wrapper.padding-none > div.main > div > div.top-container > div.title > span > span > a').href;
  836. let uid='';
  837. for(let i=chatuid.length-1;i>=0;i--){
  838. if(chatuid[i]>='0'&&chatuid[i]<='9') uid=chatuid[i]+uid;
  839. else break;
  840. }
  841. swal("Better Luogu!",chatuser,{
  842. buttons: {
  843. delete: {
  844. text: "清空私信",
  845. value: "delete"
  846. },
  847. quxiao: {
  848. text: "取消",
  849. value: "cancel"
  850. }
  851. }
  852. })
  853. .then((value)=>{
  854. switch(value){
  855. case 'delete':
  856. deleteChat(uid);
  857. break;
  858. }
  859. });
  860. });
  861. }
  862. else if(nowurl.includes('solution')){
  863. document.querySelector('#app > div.main-container.lside-bar > main > div > div > div.side').remove();
  864. let index=document;
  865. const config = {
  866. attributes: true,
  867. characterData: true,
  868. childList: true,
  869. subtree: true,
  870. attributeOldValue: true,
  871. characterDataOldValue: true
  872. };
  873. const observer = new MutationObserver((mutations) => {
  874. mutations.forEach((mutation) => {
  875. if (mutation.type === 'attributes'){
  876. document.querySelector('#app > div.main-container.lside-bar > main > div > div > div.side').remove();
  877. }
  878. });
  879. });
  880. observer.observe(index,config);
  881. }
  882. document.addEventListener('keydown', function(event){
  883. if(event.altKey && event.key == 's'){
  884. if(search.style.display == 'none'){
  885. search.style.display = 'flex';
  886. showMask();
  887. }
  888. else{
  889. search.style.display = 'none';
  890. search_input.value='';
  891. hideMask();
  892. }
  893. }
  894. });
  895. mask.addEventListener('click',function(){
  896. search.style.display = 'none';
  897. search_input.value='';
  898. hideMask();
  899. });
  900. $('input[name="search"]').keydown(function(e){
  901. if(e.which===13){
  902. let sc=$('input[name="search"]').val();
  903. if(sc!=""){
  904. if(getcookie('engine')=='baidu') window.open('https://www.baidu.com/s?wd=' + sc,'_blank');
  905. else if(getcookie('engine')=='google') window.open('https://mirrorgoogle.us.kg/search?q=' + sc,'_blank');
  906. else if(getcookie('engine')=='bing') window.open('https://cn.bing.com/search?q=' + sc,'_blank');
  907. else window.open(getcookie('engine')+'='+sc,'_blank');
  908. }
  909. }
  910. });
  911. if(document.querySelector('#app > div.main-container.lside-drawer > main > div > div > div.main > div.l-card.reply-editor > div.casket.cs-main.textarea > div.cs-header > div > div:nth-child(1)')!=null){
  912. document.querySelector('#app > div.main-container.lside-drawer > main > div > div > div.main > div.l-card.reply-editor > div.casket.cs-main.textarea > div.cs-header > div > div:nth-child(1)').appendChild(video);
  913. }
  914. }
  915. })();