Advertisement
Guest User

Untitled

a guest
Mar 30th, 2020
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.38 KB | None | 0 0
  1. // ==UserScript==
  2. // @name Torn: Sort lists
  3. // @namespace lugburz.sort_lists
  4. // @version 0.5.2
  5. // @description Sort lists (such as blacklist, friendlist, userlist, faction members list, stocks) by various columns.
  6. // @author Lugburz
  7. // @match https://www.torn.com/blacklist.php*
  8. // @match https://www.torn.com/friendlist.php*
  9. // @match https://www.torn.com/userlist.php*
  10. // @match https://www.torn.com/factions.php*
  11. // @match https://www.torn.com/stockexchange.php*
  12. // @match https://www.torn.com/companies.php*
  13. // @match https://www.torn.com/joblist.php*
  14. // @require https://greasyfork.org/scripts/390917-dkk-torn-utilities/code/DKK%20Torn%20Utilities.js?version=744690
  15. // @grant GM_addStyle
  16. // ==/UserScript==
  17.  
  18. GM_addStyle(`
  19. .headerSortable {
  20. cursor: pointer;
  21. }
  22.  
  23. .headerSortDown:after {
  24. content: " ▾";
  25. font: inherit;
  26. }
  27.  
  28. .headerSortUp:after {
  29. content: " ▴";
  30. font: inherit;
  31. }`);
  32.  
  33. function compare (aText, bText, asc) {
  34. // Returning -1 will place element `a` before element `b`
  35. if (aText < bText) {
  36. if (asc) return -1;
  37. else return 1;
  38. }
  39.  
  40. // Returning 1 will do the opposite
  41. if (aText > bText) {
  42. if (asc) return 1;
  43. else return -1;
  44. }
  45.  
  46. // Returning 0 leaves them as-is
  47. return 0;
  48. }
  49.  
  50. function doSort(items, column, ascending, divPrefix = '.title-black > .') {
  51. if ('level'.localeCompare(column) == 0 || 'lvl'.localeCompare(column) == 0 || 'days'.localeCompare(column) == 0) {
  52. let sortedByLevel = Array.prototype.sort.bind(items);
  53. sortedByLevel(function (a, b) {
  54. let aText = $(a).find('.'+column).text().match(/(\d+)/)[0];
  55. let bText = $(b).find('.'+column).text().match(/(\d+)/)[0];
  56.  
  57. return compare(Number(aText), Number(bText), ascending);
  58. });
  59. } else if ('title'.localeCompare(column) == 0 || 'desk'.localeCompare(column) == 0 ||
  60. 'name'.localeCompare(column) == 0 || 'employee'.localeCompare(column) == 0) {
  61. let sortedByName = Array.prototype.sort.bind(items);
  62. sortedByName(function (a, b) {
  63. // works with honors enabled or disabled
  64. let aText = $(a).find('.name').attr('data-placeholder') || $(a).find('.name').text();
  65. let bText = $(b).find('.name').attr('data-placeholder') || $(b).find('.name').text();
  66. if (typeof aText !== 'undefined') aText = aText.toLowerCase();
  67. if (typeof bText !== 'undefined') bText = bText.toLowerCase();
  68.  
  69. return compare(aText, bText, ascending);
  70. });
  71. } else if ('status'.localeCompare(column) == 0) {
  72. let sortedByStatus = Array.prototype.sort.bind(items);
  73. sortedByStatus(function (a, b) {
  74. let aText = $(a).find('.'+column).text().replace('Status:', '').trim();
  75. let bText = $(b).find('.'+column).text().replace('Status:', '').trim();
  76.  
  77. return compare (aText, bText, ascending);
  78. });
  79. // 'Last Action' script support
  80. } else if ('member-icons'.localeCompare(column) == 0) {
  81. // Do not show arrows if no 'Last Action'
  82. if ($('.title-black > .'+column).text() === 'undefined' || !$('.title-black > .'+column).text().includes('Last Action'))
  83. return items;
  84.  
  85. let sortedByLastAction = Array.prototype.sort.bind(items);
  86. sortedByLastAction(function (a, b) {
  87. let aText = $(a).find('.last-action').text().trim();
  88. let bText = $(b).find('.last-action').text().trim();
  89.  
  90. let days = aText.match(/((\d+) day)?/)[2] || 0
  91. let hours = aText.match(/((\d+) hour)?/)[2] || 0
  92. let mins = aText.match(/((\d+) minute)?/)[2] || 0
  93. let aMins = Number(days)*24*60 + Number(hours)*60 + Number(mins)
  94.  
  95. days = bText.match(/((\d+) day)?/)[2] || 0
  96. hours = bText.match(/((\d+) hour)?/)[2] || 0
  97. mins = bText.match(/((\d+) minute)?/)[2] || 0
  98. let bMins = Number(days)*24*60 + Number(hours)*60 + Number(mins)
  99.  
  100. return compare (Number(aMins), Number(bMins), ascending);
  101. });
  102. } else if ('price'.localeCompare(column) == 0 || 'owned'.localeCompare(column) == 0 || 'change'.localeCompare(column) == 0) {
  103. let sortedByPrice = Array.prototype.sort.bind(items);
  104. sortedByPrice(function (a, b) {
  105. let aText = $(a).find('.'+column).text().match(/((\d+\,)?\d+(\.\d+)?)/)[0].replace(',', '');
  106. let bText = $(b).find('.'+column).text().match(/((\d+\,)?\d+(\.\d+)?)/)[0].replace(',', '');
  107.  
  108. // 'down' means the number is negative
  109. if ('change'.localeCompare(column) == 0) {
  110. if ($(a).find('.'+column).hasClass('down')) aText = -1 * Number(aText);
  111. if ($(b).find('.'+column).hasClass('down')) bText = -1 * Number(bText);
  112. }
  113.  
  114. return compare(Number(aText), Number(bText), ascending);
  115. });
  116. } else if ('rank'.localeCompare(column) == 0) {
  117. let sortedByStatus = Array.prototype.sort.bind(items);
  118. sortedByStatus(function (a, b) {
  119. let aText = $(a).find('.'+column).text().replace('Rank:', '').trim();
  120. let bText = $(b).find('.'+column).text().replace('Rank:', '').trim();
  121.  
  122. return compare (aText, bText, ascending);
  123. });
  124. } else {
  125. // shouldn't happen
  126. return items;
  127. }
  128.  
  129. [ 'level', 'lvl', 'title', 'desk', 'name', 'days', 'status', 'member-icons', 'price', 'owned', 'change' ].forEach((elem) => {
  130. $(divPrefix+elem).removeClass('headerSortUp');
  131. $(divPrefix+elem).removeClass('headerSortDown');
  132. });
  133.  
  134. if (ascending) {
  135. $(divPrefix+column).addClass('headerSortDown');
  136. } else {
  137. $(divPrefix+column).addClass('headerSortUp');
  138. }
  139.  
  140. return items;
  141. }
  142.  
  143. // Blacklist, friendlist, userlist
  144. function addUserlistSort() {
  145. let ascending = true;
  146. let last_sort = '';
  147.  
  148. // for friendlist and blacklist
  149. let user_list = $('ul.user-info-blacklist-wrap');
  150. let users = $(user_list).children('li');
  151.  
  152. // for userlist (search results)
  153. if (users.length == 0) {
  154. user_list = $('ul.user-info-list-wrap');
  155. users = $(user_list).children('li');
  156. }
  157.  
  158. let columns = ['title', 'level', 'status'].forEach((column) => {
  159. $('div.title-black > div.'+column).addClass('headerSortable');
  160. $('div.'+column).on('click', function() {
  161. // discard old data
  162. if(!$(users).is(':visible')) {
  163. return;
  164. }
  165.  
  166. if (column != last_sort) ascending = true;
  167. last_sort = column;
  168. users = doSort(users, column, ascending);
  169. ascending = !ascending;
  170. $(user_list).append(users);
  171. });
  172. });
  173. }
  174.  
  175. // Faction members
  176. function addMemberlistSort() {
  177. let user_list = $('ul.member-list');
  178. let users = $(user_list).children('li');
  179. let ascending = true;
  180. let last_sort = '';
  181.  
  182. let columns = ['desk', 'lvl', 'days', 'status', 'member-icons'].forEach((column) => {
  183. $('ul.title-black > li.'+column).addClass('headerSortable');
  184. $('ul.title-black > li.'+column).on('click', function() {
  185. if (column != last_sort) ascending = true;
  186. last_sort = column;
  187. users = doSort(users, column, ascending);
  188. ascending = !ascending;
  189. $(user_list).append(users);
  190. });
  191. });
  192. }
  193.  
  194. // Faction control (money & points)
  195. function doFactionDepSort(items, column, ascending) {
  196. if ('name-money'.localeCompare(column) == 0 || 'name-points'.localeCompare(column) == 0) {
  197. let sortedByName = Array.prototype.sort.bind(items);
  198. sortedByName(function (a, b) {
  199. // works with honors enabled or disabled
  200. let aText = $(a).find('.name').attr('data-placeholder') || $(a).find('.name').text();
  201. let bText = $(b).find('.name').attr('data-placeholder') || $(b).find('.name').text();
  202. if (typeof aText !== 'undefined') aText = aText.toLowerCase();
  203. if (typeof bText !== 'undefined') bText = bText.toLowerCase();
  204.  
  205. return compare(aText, bText, ascending);
  206. });
  207. } else if ('money'.localeCompare(column) == 0 || 'points'.localeCompare(column) == 0) {
  208. let sortedByPrice = Array.prototype.sort.bind(items);
  209. sortedByPrice(function (a, b) {
  210. let aText = $(a).find('.'+column).attr('data-value');
  211. let bText = $(b).find('.'+column).attr('data-value');
  212.  
  213. return compare(Number(aText), Number(bText), ascending);
  214. });
  215. }
  216.  
  217. if (column.includes('money')) {
  218. $('div.money-wrap > div.userlist-wrapper > div.info > span.bold').removeClass('headerSortUp');
  219. $('div.money-wrap > div.userlist-wrapper > div.info > span.bold').removeClass('headerSortDown');
  220.  
  221. if (ascending) {
  222. if ('name-money'.localeCompare(column) == 0) $('div.money-wrap > div.userlist-wrapper > div.info').find('span.bold:first').addClass('headerSortDown');
  223. else if ('money'.localeCompare(column) == 0) $('div.money-wrap > div.userlist-wrapper > div.info').find('span.bold.amount:first').addClass('headerSortDown');
  224. } else {
  225. if ('name-money'.localeCompare(column) == 0) $('div.money-wrap > div.userlist-wrapper > div.info').find('span.bold:first').addClass('headerSortUp');
  226. else if ('money'.localeCompare(column) == 0) $('div.money-wrap > div.userlist-wrapper > div.info').find('span.bold.amount:first').addClass('headerSortUp');
  227. }
  228. } else if (column.includes('points')) {
  229. $('div.point-wrap > div.userlist-wrapper > div.info > span.bold').removeClass('headerSortUp');
  230. $('div.point-wrap > div.userlist-wrapper > div.info > span.bold').removeClass('headerSortDown');
  231.  
  232. if (ascending) {
  233. if ('name-points'.localeCompare(column) == 0) $('div.point-wrap > div.userlist-wrapper > div.info').find('span.bold:first').addClass('headerSortDown');
  234. else if ('points'.localeCompare(column) == 0) $('div.point-wrap > div.userlist-wrapper > div.info').find('span.bold.amount:first').addClass('headerSortDown');
  235. } else {
  236. if ('name-points'.localeCompare(column) == 0) $('div.point-wrap > div.userlist-wrapper > div.info').find('span.bold:first').addClass('headerSortUp');
  237. else if ('points'.localeCompare(column) == 0) $('div.point-wrap > div.userlist-wrapper > div.info').find('span.bold.amount:first').addClass('headerSortUp');
  238. }
  239. }
  240.  
  241. return items;
  242. }
  243.  
  244. function addFactionMoneyDepSort() {
  245. let user_list = $('ul.user-info-list-wrap.money-depositors');
  246. let users = $(user_list).children('li.depositor');
  247. let ascending = true;
  248. let last_sort = '';
  249.  
  250. $('div.money-wrap > div.userlist-wrapper > div.info > span.bold').addClass('headerSortable');
  251. $('div.money-wrap > div.userlist-wrapper > div.info').find('span.bold:first').on('click', function() {
  252. if ('name-money' != last_sort) ascending = true;
  253. last_sort = 'name-money';
  254. users = doFactionDepSort(users, 'name-money', ascending);
  255. ascending = !ascending;
  256. $(user_list).append(users);
  257. });
  258. $('div.money-wrap > div.userlist-wrapper > div.info').find('span.bold.amount:first').on('click', function() {
  259. if ('money' != last_sort) ascending = true;
  260. last_sort = 'money';
  261. users = doFactionDepSort(users, 'money', ascending);
  262. ascending = !ascending;
  263. $(user_list).append(users);
  264. });
  265. }
  266. function addFactionPointsDepSort() {
  267. let user_list = $('ul.user-info-list-wrap.points-depositors');
  268. let users = $(user_list).children('li.depositor');
  269. let ascending = true;
  270. let last_sort = '';
  271.  
  272. $('div.point-wrap > div.userlist-wrapper > div.info > span.bold').addClass('headerSortable');
  273. $('div.point-wrap > div.userlist-wrapper > div.info').find('span.bold:first').on('click', function() {
  274. if ('name-points' != last_sort) ascending = true;
  275. last_sort = 'name-points';
  276. users = doFactionDepSort(users, 'name-points', ascending);
  277. ascending = !ascending;
  278. $(user_list).append(users);
  279. });
  280. $('div.point-wrap > div.userlist-wrapper > div.info').find('span.bold.amount:first').on('click', function() {
  281. if ('points' != last_sort) ascending = true;
  282. last_sort = 'points';
  283. users = doFactionDepSort(users, 'points', ascending);
  284. ascending = !ascending;
  285. $(user_list).append(users);
  286. });
  287. }
  288. // ===
  289.  
  290. // Stocks
  291. function addStocklistSort() {
  292. let stock_list = $('ul.stock-list');
  293. let stocks = $(stock_list).children('li');
  294. let ascending = true;
  295. let last_sort = '';
  296.  
  297. let columns = ['name', 'price', 'change', 'owned'].forEach((column) => {
  298. $('div.title-black > ul.title > li.'+column).addClass('headerSortable');
  299. $('div.title-black > ul.title > li.'+column).on('click', function() {
  300. if (column != last_sort) ascending = true;
  301. last_sort = column;
  302. stocks = doSort(stocks, column, ascending, 'div.title-black > ul.title > li.');
  303. ascending = !ascending;
  304. $(stock_list).append(stocks);
  305. });
  306. });
  307. }
  308.  
  309. // Company (your company)
  310. function addCompanylistSort() {
  311. let user_list = $('ul.employee-list');
  312. let users = $(user_list).children('li');
  313. let ascending = true;
  314. let last_sort = '';
  315.  
  316. let columns = ['employee', 'days'].forEach((column) => {
  317. $('ul.employee-list-title > li.'+column).addClass('headerSortable');
  318. $('ul.employee-list-title > li.'+column).on('click', function() {
  319. if (column != last_sort) ascending = true;
  320. last_sort = column;
  321. users = doSort(users, column, ascending);
  322. ascending = !ascending;
  323. $(user_list).append(users);
  324. });
  325. });
  326. }
  327.  
  328. // Joblist (someone else's company)
  329. function addJoblistSort() {
  330. let user_list = $('ul.employees-list');
  331. let users = $(user_list).children('li');
  332. let ascending = true;
  333. let last_sort = '';
  334.  
  335. let columns = ['employee', 'rank', 'lvl'].forEach((column) => {
  336. $('div.title-black > ul.title > li.'+column).addClass('headerSortable');
  337. $('div.title-black > ul.title > li.'+column).on('click', function() {
  338. if (column != last_sort) ascending = true;
  339. last_sort = column;
  340. users = doSort(users, column, ascending);
  341. ascending = !ascending;
  342. $(user_list).append(users);
  343. });
  344. });
  345. }
  346.  
  347. (function() {
  348. 'use strict';
  349.  
  350. // Your code here...
  351. ajax((page, json, uri) => {
  352. if (page == "userlist") {
  353. if ($(location).attr('href').includes('userlist.php')) {
  354. $('ul.user-info-list-wrap').ready(addUserlistSort);
  355. } else {
  356. $('ul.user-info-blacklist-wrap').ready(addUserlistSort);
  357. }
  358. } else if (page == "factions") {
  359. $('ul.member-list').ready(addMemberlistSort);
  360.  
  361. if ($(location).attr('href').includes('tab=controls')) {
  362. $('ul.user-info-list-wrap.money-depositors').ready(addFactionMoneyDepSort);
  363. $('ul.user-info-list-wrap.points-depositors').ready(addFactionPointsDepSort);
  364. }
  365. } else if (page == "stockexchange") {
  366. $('ul.stock-list').ready(addStocklistSort);
  367. } else if (page == "companies") {
  368. $('ul.employee-list').ready(addCompanylistSort);
  369. } else if (page == "joblist") {
  370. $('ul.employees-list').ready(addJoblistSort);
  371. }
  372. });
  373.  
  374. if ($(location).attr('href').includes('factions.php')) {
  375. $('ul.member-list').ready(addMemberlistSort);
  376.  
  377. if ($(location).attr('href').includes('tab=controls')) {
  378. $('ul.user-info-list-wrap.money-depositors').ready(addFactionMoneyDepSort);
  379. $('ul.user-info-list-wrap.points-depositors').ready(addFactionPointsDepSort);
  380. }
  381. } else if ($(location).attr('href').includes('stockexchange.php')) {
  382. $('ul.stock-list').ready(addStocklistSort);
  383. } else if ($(location).attr('href').includes('companies.php')) {
  384. $('ul.employee-list').ready(addCompanylistSort);
  385. } else if ($(location).attr('href').includes('joblist.php')) {
  386. $('ul.employees-list').ready(addCompanylistSort);
  387. }
  388. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement