OnePlusBBS QuickKey

一加社区快捷键

当前为 2019-12-28 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name OnePlusBBS QuickKey
  3. // @description 一加社区快捷键
  4. // @namespace https://greasyfork.org/
  5. // @author choosezzz
  6. // @version 1.7
  7. // @match https://www.oneplusbbs.com/forum*
  8. // @match https://www.oneplusbbs.com/thread*
  9. // @match https://www.oneplusbbs.com/homemod-space-uid*
  10. // @icon https://static.oneplus.cn/data/attachment/common/4c/common_121_icon.png
  11. // @require https://cdn.jsdelivr.net/npm/vue
  12. // @grant GM_addStyle
  13. // ==/UserScript==
  14.  
  15. (function() {
  16.  
  17. //settings
  18. appendSettingDiv();
  19. //css
  20. GM_addStyle("#settingMountParent{font-size:15px;width:400px;z-index:999;background-color:white;position:absolute;top:50%;left:50%;transform:translateX(-50%) translateY(-50%);-moz-transform:translateX(-50%) translateY(-50%);-webkit-transform:translateX(-50%) translateY(-50%);-ms-transform:translateX(-50%) translateY(-50%);border-radius:5px;box-shadow:3px 3px 10px red}");
  21. GM_addStyle("#setting_content{padding:2px;border-top:2px solid black;border-bottom:2px solid black}");
  22. GM_addStyle(".setting_op{background:#34aff4;width:50px;padding:3px 20px;}.setting_op:hover{background:#EEDA0A;color:#ffffff;}");
  23. document.onkeydown = function(event) {
  24. var href = window.location.href;
  25. var e = event || window.event;
  26. if (!e) {
  27. return;
  28. }
  29. if (e.ctrlKey && e.keyCode == 83) {
  30. stopDefault(e);
  31. settingApp.ctrlShow();
  32. alert(settingApp.isShow)
  33. }
  34. //个人主页
  35. if (href.search("homemod-space-uid*") != -1) {
  36. //Ctrl+Alt
  37. if (e.altKey && e.ctrlKey) {
  38. var uid = href.replace(/https:\/\/www.oneplusbbs.com\/homemod-space-uid-/g, "").replace(/.html/g, "");
  39. $("a_sendpm_" + uid).click();
  40. }
  41. }
  42.  
  43. //Ctrl+number
  44. if (((e.keyCode >= 49 && e.keyCode <= 57) || (e.keyCode >= 97 && e.keyCode <= 105)) && e.ctrlKey) {
  45. var msgId = e.keyCode - 96 < 0 ? e.keyCode - 48 : e.keyCode - 96;
  46. quickPaste(e, msgId);
  47. }
  48.  
  49. //普通帖子页
  50. if (href.indexOf("thread-") != -1 || href.indexOf("viewthread") != -1) {
  51. handlePost(e);
  52. }
  53.  
  54. //列表页
  55. if (href.indexOf("forum-") != -1 || href.indexOf("forumdisplay") != -1) {
  56. handleList(e);
  57. }
  58.  
  59. }
  60. })();
  61.  
  62. function appendSettingDiv() {
  63. var settingMount = document.createElement("div");
  64. settingMount.id = "settingMountParent";
  65. settingMount.innerHTML = '<div id="setting_mount" v-show="isShow">' +
  66. '<div style="padding: 3px;background: #aadcdf;text-align: center;">' +
  67. '<span>【使用 Ctrl+S 打开设置选项】</span></div>' +
  68. '<span style="text-align: center;color: red;font-size: 16px">{{tips}}</span>' +
  69. '<div id="setting_content"><div v-for="item of 9" :key="item" style="padding-left: 12px;padding-top: 2px;">' +
  70. '<span>Ctrl+{{item}}:</span>' +
  71. '<input type="text" style="width: 75%" v-model="quickMsg[item-1]"></div></div>' +
  72. '<div style="text-align: center;padding: 4px;"><span class="setting_op" @click="ctrlShow">关闭</span>' +
  73. '<span style="width:50px;padding:3px 50px;"> | </span><span class="setting_op" @click="saveSettings">{{saveTips}}</span></div></div>';
  74. document.body.appendChild(settingMount);
  75.  
  76. dragFunc("settingMountParent");
  77. }
  78.  
  79. function dragFunc(id) {
  80. var Drag = document.getElementById(id);
  81. Drag.onmousedown = function(event) {
  82. var ev = event || window.event;
  83. event.stopPropagation();
  84. var disX = ev.clientX - Drag.offsetLeft;
  85. var disY = ev.clientY - Drag.offsetTop;
  86. document.onmousemove = function(event) {
  87. var ev = event || window.event;
  88. Drag.style.left = ev.clientX - disX + "px";
  89. Drag.style.top = ev.clientY - disY + "px";
  90. Drag.style.cursor = "move";
  91. };
  92. };
  93. Drag.onmouseup = function() {
  94. document.onmousemove = null;
  95. this.style.cursor = "default";
  96. };
  97. }
  98. var settingApp = new Vue({
  99. el: "#setting_mount",
  100. data: {
  101. isShow: false,
  102. tips: "",
  103. saveTips: "保存",
  104. quickMsg: ["请勿灌水或回复与帖子无关的内容", "请勿发布纯标题无内容贴"],
  105.  
  106. },
  107. methods: {
  108. ctrlShow: function() {
  109. this.isShow = !this.isShow;
  110. if (this.isShow) {
  111. var msg = getQuickMsg();
  112. if(null != msg){
  113. this.quickMsg = msg;
  114. }
  115. }
  116. },
  117. saveSettings: function() {
  118. var result = this.quickMsg.join("$");
  119. localStorage.quickMsg = result;
  120. this.saveTips = "保存成功";
  121. setTimeout(() => {
  122. this.isShow = false;
  123. this.saveTips = "保存";
  124. }, 1500);
  125. }
  126. }
  127. });
  128.  
  129. function getQuickMsg() {
  130.  
  131. var msg = localStorage.quickMsg;
  132. if (!msg || null == msg || msg.split("$").length == 0) {
  133. settingApp.isShow=true;
  134. settingApp.tips = "请先设置快捷键对应的内容";
  135. setTimeout(function() {
  136. settingApp.tips = "";
  137. }, 2000);
  138. return null;
  139. } else {
  140. return msg.split("$");
  141. }
  142. }
  143.  
  144. function pasteMsg(element, msgArr, id) {
  145. if (msgArr == null || msgArr.length < id) {
  146. settingApp.isShow=true;
  147. settingApp.tips = "当前快捷键暂未定义任何内容,请自定义后使用";
  148. setTimeout(function() {
  149. settingApp.tips = "";
  150. }, 2000);
  151. return;
  152. }
  153. if (element && msgArr.length >= id) {
  154. if (msgArr[id - 1] == "") {
  155. settingApp.isShow=true;
  156. settingApp.tips = "当前快捷键暂未定义任何内容,请自定义后使用";
  157. setTimeout(function() {
  158. settingApp.tips = "";
  159. }, 2000);
  160. return;
  161. }
  162. element.value = msgArr[id - 1];
  163. return;
  164. }
  165.  
  166. }
  167. //屏蔽默认快捷键
  168. function stopDefault(e) {
  169.  
  170. // W3C标准
  171. if (e.preventDefault) {
  172. e.preventDefault();
  173. } else {
  174. //IE
  175. window.event.returnValue = false;
  176. }
  177. return false;
  178. }
  179.  
  180. function quickPaste(e, id) {
  181.  
  182. var href = window.location.href;
  183. stopDefault(e);
  184. var quickMsg = getQuickMsg();
  185. //操作说明输入
  186. var mods = $("fwin_mods");
  187. if (mods && mods.style.display != "none") {
  188. pasteMsg($("reason"), quickMsg, id);
  189. return;
  190. }
  191. //列表页
  192. var ftadmin = $("floatlayout_topicadmin");
  193. if (ftadmin && ftadmin.style.display != "none") {
  194. pasteMsg($("reason"), quickMsg, id);
  195. return;
  196. }
  197. //回帖输入
  198. var reply = $("fwin_reply");
  199. if (reply && reply.style.display != "none") {
  200. pasteMsg($("postmessage"), quickMsg, id);
  201. return;
  202. }
  203. //消息
  204. var showMsgBox = $("fwin_showMsgBox");
  205. if (showMsgBox && showMsgBox.style.display != "none") {
  206. pasteMsg($("pmmessage"), quickMsg, id);
  207. return;
  208. }
  209. //管理页面
  210. if (href.search("op=ban&uid=") != -1) {
  211. pasteMsg($("ct").getElementsByClassName("pt")[0], quickMsg, id);
  212. }
  213. }
  214.  
  215. //判断是否已显示操作选项
  216. var cateShow = false;
  217. //分类选项索引
  218. var cateIndex = 0;
  219.  
  220. //移动操作
  221. var moveShow = false;
  222. //游乐园
  223. var moveIndex = 21;
  224.  
  225. function handlePost(e) {
  226.  
  227. // Ctrl + z 快速回复
  228. if (e.keyCode == 90 && e.ctrlKey) {
  229. stopDefault(e);
  230. $("post_reply").click();
  231. return;
  232. }
  233.  
  234. //获取操作列表
  235. var modMenu = $("modmenu");
  236. if (!modMenu) {
  237. console.log("当前板块无权限");
  238. return;
  239. }
  240. var links = modMenu.getElementsByTagName("a");
  241. //Ctrl+D 快速删除
  242. if (e.keyCode == 68 && e.ctrlKey) {
  243. stopDefault(e);
  244. var mdly = $("mdly");
  245. if (mdly && mdly.style.display != "none") {
  246. var aList = mdly.getElementsByClassName("c")[0].getElementsByTagName("a");
  247. if (aList.length >= 3) {
  248. if (aList[2].innerHTML == "删除") {
  249. aList[2].click();
  250. }
  251. }
  252. return;
  253. }
  254. links[0].click();
  255. return;
  256. }
  257. //Ctrl+Alt 快速分类功能
  258. if (e.altKey && e.ctrlKey) {
  259. stopDefault(e);
  260. //快捷点击分类链接
  261. if (!cateShow) {
  262. let type = links[10];
  263. if (type) {
  264. type.click();
  265. cateShow = true;
  266. }
  267. } else {
  268. let types = $("typeid");
  269. if (types && types.options.length > 0) {
  270. types.options[cateIndex].selected = "true";
  271. cateIndex++;
  272. }
  273. if (cateIndex == types.options.length) {
  274. cateIndex = 0;
  275. }
  276. }
  277. return;
  278. }
  279. //Ctrl+X 快速移动功能
  280. if (e.ctrlKey && e.keyCode == 88) {
  281. stopDefault(e);
  282. //快捷点击移动链接
  283. if (!moveShow) {
  284. let type = links[9];
  285. if (type) {
  286. type.click();
  287. moveShow = true;
  288. }
  289. } else {
  290. var moveTo = $("moveto");
  291. if (moveTo && moveTo.options.length > 0) {
  292. moveTo.options[moveIndex].selected = "true";
  293. moveTo.onchange();
  294. //游乐园 <--> 轻摄影
  295. moveIndex = moveIndex == 21 ? 13 : 21;
  296. }
  297.  
  298. }
  299. } else {
  300. //重置
  301. moveIndex = 21;
  302. cateIndex = 0;
  303. moveShow = false;
  304. cateShow = false;
  305. }
  306. }
  307.  
  308. function handleList(e) {
  309. var checkBoxs = document.getElementsByClassName("o");
  310. if (!checkBoxs || checkBoxs.length < 5) {
  311. console.log("此版块权限");
  312. }
  313. var mdly = $("mdly");
  314. if (mdly) {
  315. var ops = mdly.getElementsByTagName("p")[0].getElementsByTagName("a");
  316. if (e.altKey && e.ctrlKey) {
  317. stopDefault(e);
  318. ops[2].click();
  319. }
  320. if (e.ctrlKey && e.keyCode == 88) {
  321. stopDefault(e);
  322. ops[1].click();
  323. }
  324. if (e.keyCode == 90 && e.ctrlKey) {
  325. stopDefault(e);
  326. ops[0].click();
  327. }
  328. }
  329. }