Better Luogu!

Luogu Expansion

当前为 2025-01-26 提交的版本,查看 最新版本

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