Better Luogu!

Luogu Expansion

目前為 2024-11-02 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name Better Luogu!
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.8
  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. // @license MIT
  24. // ==/UserScript==
  25.  
  26. (function() {
  27. 'use strict'
  28. var css = ".swal-overlay {background-color: rgba(0, 0, 0, 0.5);}";
  29. var style = document.createElement("style");
  30. style.innerHTML = css;
  31. document.head.appendChild(style);
  32.  
  33.  
  34. let nowurl = window.location.href;
  35.  
  36. let nowcolor1;
  37. let nowcolor="";
  38. if(nowurl == 'https://www.luogu.com.cn/'){
  39. 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;
  40. for(let i=0;i<nowcolor1.length;i++){
  41. if(nowcolor1[i]==' ') break;
  42. nowcolor = nowcolor + nowcolor1[i];
  43. }
  44. }
  45.  
  46. function setcookie(name,value,days,path,domain,secure){
  47. let expires = "";
  48. if(days){
  49. let date = new Date();
  50. date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
  51. expires = "; expires=" + date.toUTCString();
  52. }
  53. var cookieString = name + "=" + (value || "") + expires;
  54. if(path) cookieString += "; path=" + path;
  55. if(domain) cookieString += "; domain=" + domain;
  56. if(secure && window.location.protocol === "https:") cookieString += "; secure";
  57. document.cookie = cookieString;
  58. }
  59.  
  60. function getcookie(name){
  61. const cookiestring = document.cookie;
  62. const cookies = cookiestring.split('; ');
  63. for(const cookie of cookies){
  64. const [cookiename, cookievalue] = cookie.split('=');
  65. if(cookiename === name) return cookievalue;
  66. }
  67. if(name == 'color'){
  68. setcookie('color',nowcolor,114514,'/','luogu.com.cn',true);
  69. return nowcolor;
  70. }
  71. else if(name == 'hanger'){
  72. setcookie('hanger','null',114514,'/','luogu.com.cn',true);
  73. return "null";
  74. }
  75. else if(name == 'version'){
  76. setcookie('version','1.8',114514,'/','luogu.com.cn',true);
  77. return "1.8";
  78. }
  79. else if(name == 'update'){
  80. setcookie('update','true',114514,'/','luogu.com.cn',true);
  81. return "true";
  82. }
  83. }
  84.  
  85.  
  86. function deletecookie(name){
  87. document.cookie = name+ '=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/';
  88. }
  89.  
  90. async function sendMessage(uid,content){
  91. await fetch("https://www.luogu.com.cn/api/chat/new", {
  92. headers: [
  93. ["content-type", "application/json"],
  94. ["referer", "https://www.luogu.com.cn/"],
  95. ["x-csrf-token", document.querySelector("meta[name=csrf-token]").content],
  96. ],
  97. body: JSON.stringify({
  98. user: uid,
  99. content: content,
  100. }),
  101. method: "POST",
  102. });
  103. }
  104.  
  105. GM_xmlhttpRequest({
  106. method: "GET",
  107. url: 'https://greasyfork.org/zh-CN/scripts/487511-better-luogu',
  108. onload: function(response){
  109. let parser = new DOMParser();
  110. let doc = parser.parseFromString(response.responseText, "text/html");
  111. let version = doc.querySelector('dd.script-show-version');
  112. if(version.textContent != '1.8' && nowurl == 'https://www.luogu.com.cn/'){
  113. if(getcookie('update')=='true'){
  114. swal("Better Luogu!","有新版本",{
  115. buttons: {
  116. no: {
  117. text: "7天内不再提醒",
  118. value: "false",
  119. },
  120. yes: {
  121. text: "更新",
  122. value: "true",
  123. }
  124. },
  125. })
  126. .then((value) => {
  127. if(value == "false"){
  128. deletecookie('update');
  129. setcookie('update','false',7,'/','luogu.com.cn',true);
  130. swal("Better Luogu!","好的,你可以在 NEWLG 菜单中点击更新来更新");
  131. }
  132. else window.open('https://greasyfork.org/zh-CN/scripts/487511-better-luogu','_blank');
  133. });
  134. }
  135. }
  136. }
  137. });
  138.  
  139. function colorschange(changecolor){//emm,这个函数,额,可能要用吧
  140. if(changecolor == 'lg-fg-gray') return 'rgb\(191, 191, 191\)';
  141. else if(changecolor == 'lg-fg-blue') return 'rgb\(14, 144, 210\)';
  142. else if(changecolor == 'lg-fg-green') return 'rgb\(94, 185, 94\)';
  143. else if(changecolor == 'lg-fg-orange') return 'rgb\(230, 126 34\)';
  144. else if(changecolor == 'lg-fg-red') return 'rgb\(231, 76, 60\)';
  145. else if(changecolor == 'lg-fg-purple') return 'rgb\(142, 68, 173\)';
  146. else if(changecolor == 'lg-fg-brown') return 'rgb\(173, 139, 0\)';
  147. }
  148.  
  149. function update(){
  150. swal("Better Luogu!","BETTER 按钮里好像多了点东西?!");/*,{
  151. buttons: {
  152. cancel: "取消",
  153. _continue: {
  154. text: "继续",
  155. value: "continue",
  156. },
  157. },
  158. });
  159. .then((value) => {
  160. if(value == "continue") swal("Better Luogu!","我什么时候把这个删了(bushi");
  161. });*/
  162. }
  163.  
  164. let changecolor = getcookie('color');
  165.  
  166. let tagchange = getcookie('tag');
  167. let tag = document.createElement("span");
  168. let tagcolor;
  169. if(changecolor != 'lg-fg-blue' && changecolor != 'lg-fg-orange'){
  170. tagcolor = changecolor.replace('fg','bg');
  171. tag.className = 'am-badge am-radius ' + tagcolor;
  172. }
  173. else if(changecolor == 'lg-fg-blue'){
  174. tagcolor = 'color-none';
  175. tag.className = 'am-badge am-radius ' + tagcolor;
  176. tag.style.background = 'rgb(52, 152, 219)';
  177. }
  178. else if(changecolor == 'lg-fg-orange'){
  179. tagcolor = 'color-none';
  180. tag.className = 'am-badge am-radius ' + tagcolor;
  181. tag.style.background = 'rgb(243, 156, 17)';
  182. }
  183. if(changecolor != 'lg-fg-brown') tag.textContent = tagchange;
  184. else tag.textContent = '作弊者';
  185.  
  186. if(getcookie('version')!='1.8'&&nowurl=='https://www.luogu.com.cn/'){
  187. deletecookie('version');
  188. setcookie('version','1.8',114514,'/','luogu.com.cn',true);
  189. update();
  190. }
  191.  
  192. //首页
  193. if(nowurl == 'https://www.luogu.com.cn/'){
  194. //日历
  195. const today=new Date();
  196. const year=today.getFullYear();
  197. const month=String(today.getMonth()+1);
  198. const day=String(today.getDate());
  199. let date_html='<h2>今天是 '+year+'-'+month+'-'+day+'</h2>';
  200. if(month==1&&day==1){
  201. date_html+='<h2>今天是元旦,新的一年,新的开始</h2>';
  202. }
  203. else if(month==2&&day==29){
  204. date_html+='<h2>今年是闰年</h2>';
  205. }
  206. else if(month==4&&day==1){
  207. date_html+='<h2>今天是愚人节</h2>';
  208. }
  209. else if(month==5&&day==1){
  210. date_html+='<h2>今天是劳动节</h2>';
  211. }
  212. else if(month==6&&day==1){
  213. date_html+='<h2>今天是儿童节</h2>';
  214. }
  215. else if(month==9&&day==10){
  216. date_html+='<h2>今天是教师节</h2>';
  217. }
  218. else if(month==10&&day==1){
  219. date_html+='<h2>今天是国庆节,七天小长假,启动!</h2>'
  220. }
  221. else if(month==12&&day==31){
  222. date_html+='<h2>明年见</h2>';
  223. }
  224. else date_html+='<h2>欢迎!</h2>';
  225. let date = document.createElement('div');
  226. date.className = 'lg-article';
  227. date.innerHTML = date_html;
  228. document.querySelector('div.lg-right > div:nth-child(1)').insertAdjacentElement('beforebegin', date);
  229.  
  230. //更改用户名颜色
  231. 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');
  232. if(changecolor != 'null') color.className=changecolor;
  233.  
  234. function removeDivWithText(text) {
  235. document.querySelectorAll('div').forEach(div => {
  236. if(div.textContent === text) div.remove();
  237. });
  238. }
  239.  
  240. function findElement(element, text, cclass){
  241. document.querySelectorAll(element).forEach(E => {
  242. if(E.textContent === text) E.className = cclass;
  243. });
  244. }
  245.  
  246. removeDivWithText('暂无推荐');
  247. removeDivWithText('洛谷根据您近期的做题情况,使用机器学习自动为您推荐符合您目前程度的题目。本列表每日更新一次。');
  248.  
  249. GM_xmlhttpRequest({
  250. method: "GET",
  251. url: 'https://top.baidu.com/board?tab=realtime',
  252. onload: function(response){
  253. let rs = new DOMParser();
  254. let doc = rs.parseFromString(response.responseText, "text/html");
  255. for(let i=1;i<=5;i++){
  256. let th = i.toString();
  257. 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';
  258. let _rs = doc.querySelector(selector);
  259. let selector2 = '#sanRoot > main > div.container.right-container_2EFJr > div > div:nth-child(2) > div:nth-child(' + th + ') > div.content_1YWBm > a';
  260. let rslink = doc.querySelector(selector2);
  261. let link = document.createElement("a");
  262. link.href = rslink.href;
  263. link.textContent = _rs.textContent;
  264. let RS = document.createElement("p");
  265. RS.appendChild(link);
  266. findElement('h2','智能推荐','zntj');
  267. document.getElementsByClassName('zntj')[0].parentNode.append(RS);
  268. }
  269. }
  270. });
  271.  
  272. let links = document.querySelector('.lg-article.am-hide-sm');
  273. 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>');
  274. }
  275. window.onload=function(){
  276. let _hanger = getcookie('hanger');
  277. let __hanger = document.createElementNS('http://www.w3.org/2000/svg','svg');
  278. __hanger.setAttribute('width','16');
  279. __hanger.setAttribute('height','16');
  280. __hanger.setAttribute('viewBox','0 0 16 16');
  281. __hanger.setAttribute('style','margin-bottom: -3px;');
  282. if(_hanger == 'green')__hanger.setAttribute('fill','#5eb95e');
  283. else if(_hanger == 'blue') __hanger.setAttribute('fill','#3498db');
  284. else if(_hanger == 'golden') __hanger.setAttribute('fill','#f1c40f');
  285. if(_hanger != 'null') document.getElementsByClassName('sb_amazeui')[0].remove();
  286.  
  287. let ___hanger = document.createElementNS('http://www.w3.org/2000/svg','path');
  288. ___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');
  289. __hanger.appendChild(___hanger);
  290. let _hanger_ = document.createElement("a");
  291. _hanger_.href = 'https://www.luogu.com/discuss/142324';
  292. _hanger_.appendChild(__hanger);
  293.  
  294. let button = document.createElement("a");
  295. 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>';
  296. 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);
  297. else{
  298. let user_nav = document.querySelector('div.user-nav[data-v-2dfcfd35]');
  299. let c_usernav = document.querySelector('nav[data-v-2dfcfd35]');
  300. user_nav.style.verticalAlign = 'middle';
  301. c_usernav.insertBefore(button,c_usernav.firstChild);
  302. button.href = 'https://www.volatiles.us.kg/';
  303. }
  304. const tb = document.getElementById("NLTB");
  305.  
  306. function reloadmenu(){
  307. swal("Better Luogu!","更改成功","success",{button: "刷新"}).then((value) => {location.reload();});
  308. }
  309.  
  310. function changeusercolor(){
  311. swal({
  312. title: "Better Luogu!",
  313. text: "输入一个词语(规则见油叉插件页)",
  314. content: "input",
  315. button: {
  316. text: "更改",
  317. closeModal: false,
  318. },
  319. })
  320. .then((input) => {
  321. if(input=='灰名'||input=='gray'){
  322. deletecookie('color');
  323. setcookie('color','lg-fg-gray',114514,'/','luogu.com.cn',true);
  324. reloadmenu();
  325. }
  326. else if(input=='蓝名'||input=='blue'){
  327. deletecookie('color');
  328. setcookie('color','lg-fg-blue',114514,'/','luogu.com.cn',true);
  329. reloadmenu();
  330. }
  331. else if(input=='绿名'||input=='green'){
  332. deletecookie('color');
  333. setcookie('color','lg-fg-green',114514,'/','luogu.com.cn',true);
  334. reloadmenu();
  335. }
  336. else if(input=='橙名'||input=='orange'){
  337. deletecookie('color');
  338. setcookie('color','lg-fg-orange',114514,'/','luogu.com.cn',true);
  339. reloadmenu();
  340. }
  341. else if(input=='红名'||input=='red'){
  342. deletecookie('color');
  343. setcookie('color','lg-fg-red',114514,'/','luogu.com.cn',true);
  344. reloadmenu();
  345. }
  346. else if(input=='紫名'||input=='purple'){
  347. deletecookie('color');
  348. setcookie('color','lg-fg-purple',114514,'/','luogu.com.cn',true);
  349. reloadmenu();
  350. }
  351. else if(input=='棕名'||input=='brown'){
  352. deletecookie('color');
  353. setcookie('color','lg-fg-brown',114514,'/','luogu.com.cn',true);
  354. reloadmenu();
  355. }
  356. else if(input=='复原'||input=='recover'){
  357. deletecookie('color');
  358. setcookie('color',nowcolor,114514,'/','luogu.com.cn',true);
  359. reloadmenu();
  360. }
  361. else swal("Better Luogu!","请按规范输入","error");
  362. });
  363. }
  364.  
  365. function changehanger(){
  366. swal("Better Luogu!","选择一个勾子", {
  367. buttons: {
  368. cancel: "取消",
  369. greenhanger: {
  370. text: "绿勾",
  371. value: "greenhanger",
  372. },
  373. bluehanger: {
  374. text: "蓝勾",
  375. value: "bluehanger",
  376. },
  377. goldenhanger: {
  378. text: "金勾",
  379. value: "goldenhanger",
  380. },
  381. nullhanger: {
  382. text: "无勾",
  383. value: "nullhanger",
  384. },
  385. }
  386. })
  387. .then((value) => {
  388. switch (value){
  389. case "greenhanger":
  390. deletecookie('hanger');
  391. setcookie('hanger','green',114514,'/','luogu.com.cn',true);
  392. reloadmenu();
  393. break;
  394. case "bluehanger":
  395. deletecookie('hanger');
  396. setcookie('hanger','blue',114514,'/','luogu.com.cn',true);
  397. reloadmenu();
  398. break;
  399. case "goldenhanger":
  400. deletecookie('hanger');
  401. setcookie('hanger','golden',114514,'/','luogu.com.cn',true);
  402. reloadmenu();
  403. break;
  404. case "nullhanger":
  405. deletecookie('hanger');
  406. setcookie('hanger','null',114514,'/','luogu.com.cn',true);
  407. reloadmenu();
  408. break;
  409. }
  410. });
  411. }
  412.  
  413. function changetag(){
  414. swal({
  415. title: "Better Luogu!",
  416. text: "输入一个tag(无输入以取消)",
  417. content: "input",
  418. button: {
  419. text: "更改",
  420. closeModal: false,
  421. },
  422. })
  423. .then((value) => {
  424. if(getcookie('color') == 'lg-fg-brown') swal("Better Luogu!","当前为棕名","error");
  425. else if(value.length > 10) swal("Better Luogu!","长度应不大于10","error");
  426. else{
  427. deletecookie('tag');
  428. setcookie('tag',value,114514,'/','luogu.com.cn',true);
  429. reloadmenu();
  430. }
  431. });
  432. }
  433.  
  434. function not(){
  435. 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;"];
  436. let cishu = Math.floor(Math.random()*10)+1;
  437. for(let i=1;i<=cishu;i++){
  438. let qwq = words[Math.floor(Math.random()*words.length)];
  439. let awa="";
  440. let t=0;
  441. for(let j=0;j<qwq.length;j++){
  442. if(qwq[j]!=';'){
  443. t*=10;
  444. t+=parseInt(qwq[j]);
  445. }
  446. else{
  447. awa+=String.fromCharCode(t);
  448. t=0;
  449. }
  450. }
  451. sendMessage(0xbc970,awa)
  452. }
  453. swal("Better Luogu!","好像有点问题?!","error",{button: "前往私信"}).then((value) => {window.open('https://www.luogu.com.cn/chat','_self');});
  454. }
  455.  
  456. tb.addEventListener('click', function(){
  457. if(nowurl == 'https://www.luogu.com.cn/'){
  458. swal("Better Luogu!","选择一个更改", {
  459. buttons: {
  460. username: {
  461. text: "颜色",
  462. value: "color",
  463. },
  464. hanger: {
  465. text: "勾子",
  466. value: "hanger",
  467. },
  468. tag: {
  469. text: "tag",
  470. value: "tag",
  471. },
  472. update: {
  473. text: "更新",
  474. value: "update",
  475. },
  476. content: {
  477. text: "内容",
  478. value: "content"
  479. },
  480. not: {
  481. text: "千万别点!!!",
  482. value: "not"
  483. }
  484. },
  485. })
  486. .then((value) => {
  487. switch (value){
  488. case "color":
  489. changeusercolor();
  490. break;
  491. case "hanger":
  492. changehanger();
  493. break;
  494. case "tag":
  495. changetag();
  496. break;
  497. case "update":
  498. deletecookie('update');
  499. setcookie('update','true',114514,'/','luogu.com.cn',true);
  500. window.open('https://greasyfork.org/zh-CN/scripts/487511-better-luogu','_self');
  501. break;
  502. case "content":
  503. update();
  504. break;
  505. case "not": not();
  506. }
  507. });
  508. }
  509. });
  510. if(nowurl == 'https://www.luogu.com.cn/'){
  511. if(getcookie('hanger')!='null'){
  512. 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;';
  513. 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_);
  514. }
  515. if(getcookie('tag')!=''){
  516. 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;';
  517. 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);
  518. }
  519. }
  520. else if(nowurl.includes('https://www.luogu.com.cn/user/')&&!nowurl.includes('https://www.luogu.com.cn/user/setting')){
  521. if(document.querySelector('#app > div.main-container > main > div > div.full-container > section.main > div > div:nth-child(2)').className == 'introduction marked') document.querySelector('#app > div.main-container > main > div > div.full-container > section.main > div > div:nth-child(2)').removeAttribute('style');
  522. else document.querySelector('#app > div.main-container > main > div > div.full-container > section.main > div > div:nth-child(2)').remove();
  523. let jieshao = document.querySelector('#app > div.main-container > main > div > div.full-container > section.main > div > div.introduction.marked');
  524. if(jieshao.style.display == 'none') jieshao.removeAttribute('style');
  525. }
  526. let editor = document.getElementsByClassName('mp-editor-menu');
  527. console.log(editor);
  528. }
  529. })();