travelSFC

show faction and company while flying

  1. // ==UserScript==
  2. // @name travelSFC
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.5
  5. // @description show faction and company while flying
  6. // @author You
  7. // @match https://www.torn.com/factions.php*
  8. // @match https://www.torn.com/joblist.php*
  9. // @match https://www.torn.com/preferences.php*
  10. // @grant none
  11. // @run-at document-end
  12.  
  13. /* globals jQuery, $, waitForKeyElements */
  14. // ==/UserScript==
  15. (function () {
  16. "use strict"; // check for apikey and get it from user
  17.  
  18. var apiKey;
  19.  
  20. if (localStorage.XrayApiKey === null || localStorage.XrayApiKey === undefined) {
  21. console.log('api is null');
  22.  
  23. if (window.location.href.includes('preferences.php')) {
  24. var checkExist = function checkExist() {
  25. if (!$("input.input___1n_f_").size() || $("input.input___1n_f_").val() === undefined || $("input.input___1n_f_").val() === '') {
  26. console.log('retry', $("input.input___1n_f_").val());
  27. window.requestAnimationFrame(checkExist);
  28. } else {
  29. console.log($("input.input___1n_f_").val());
  30. if (confirm('Allow travelShowFC to use your apiKey?')) window.localStorage.XrayApiKey = $('input.input___1n_f_').val();
  31. }
  32. };
  33.  
  34. document.getElementsByTagName('a').addEventListener('onclick', checkExist(), false);
  35. checkExist();
  36. } else {
  37. var child = document.createElement('div');
  38. var span = document.createElement('span');
  39.  
  40. span.onclick = function () {
  41. this.parentElement.parentElement.removeChild(this.parentElement);
  42. };
  43.  
  44. span.innerHTML = '×';
  45. span.style = "margin-left: 25px;color:white;font-weight:bold;\nfloat: right;font-size:30px;line-height:20px;cursor:pointer;";
  46. child.style = "z-index:99999;width:100%;height:auto;position:fixed;top:0px;\ntext-align:center;background-color:orange;color:white;padding-bottom:1%;padding-top:1%;";
  47. child.innerHTML = '<strong>Warning!</strong> Go to the <a href="https://www.torn.com/preferences.php#tab=api">prefrencepage</a> to allow apikey use <br><br> or do it manualy: <input type="text" id="apiKeyInput">';
  48. child.appendChild(span);
  49. document.body.appendChild(child);
  50.  
  51. document.getElementById('apiKeyInput').onkeyup = function (e) {
  52. if(e.keyCode==13){
  53. if (confirm('Allow travelShowFC to use '+e.target.value+' as your apiKey?')) window.localStorage.XrayApiKey = e.target.value;
  54. }
  55. };
  56.  
  57. }
  58. return;
  59. } else {
  60. apiKey = window.localStorage.XrayApiKey;
  61. } //end apikey part
  62.  
  63. //test if flying
  64. var element = document.getElementsByClassName('travelling');
  65. if (element.length < 1) return;
  66. console.log('traveling');
  67. var factionStyle = "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://www.torn.com/css/style/faction/faction_info.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"https://www.torn.com/css/style/faction/faction.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"https://www.torn.com/css/style/faction/faction_chain.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"https://www.torn.com/css/style/faction/faction_war.css\">";
  68. var companyStyle = "\n<link rel=\"stylesheet\" type=\"text/css\" href=\"https://www.torn.com/css/style/job_lists/job_lists.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"https://www.torn.com/css/style/job_lists/job_lists_apply.css\">";
  69. var userUrl = window.location.href;
  70.  
  71. if (userUrl.includes("joblist.php") || userUrl.includes("factions.php")) {
  72. document.getElementsByClassName('right-round')[0].innerHTML = "<center><img src=\"/images/v2/main/ajax-loader.gif\"></center>";
  73. var company_faction = userUrl.includes("joblist.php");
  74. document.head.innerHTML += company_faction ? companyStyle : factionStyle;
  75.  
  76. if (userUrl.includes("userID")) {
  77. getID();
  78. } else if(userUrl.includes("ID")) {
  79. let e = userUrl.split('ID=')[1].replace('#','');
  80. if(e.substring(e.length - 1,e.length) == "/")e =e.substring(0, e.length - 1);
  81. let tempUrl = company_faction ? "https://api.torn.com/company/" + e + "?selections=profile&key=" : "https://api.torn.com/faction/" + e + "?selections=basic,territory,chain&key=";
  82. tempUrl += apiKey;
  83. console.log(tempUrl);
  84. getData(tempUrl);
  85. } else if(userUrl.includes("step=your")){
  86. let tempUrl = company_faction ? "https://api.torn.com/company/" : "https://api.torn.com/faction/";
  87. tempUrl += "?selections=basic,territory,chain&key="+apiKey;
  88. getData(tempUrl);
  89. }
  90. }
  91.  
  92. function getID() {
  93. var userFetchUrl = "https://api.torn.com/user/" + userUrl.split('userID=')[1] + "?selections=profile&key=" + apiKey;
  94. fetch(userFetchUrl).then(function (response) {
  95. return response.json();
  96. }).then(function (data) {
  97. var tempUrl = company_faction ? "https://api.torn.com/company/" + data.job.company_id + "?selections=profile&key=" + apiKey : "https://api.torn.com/faction/" + data.faction.faction_id + "?selections=basic,territory,chain&key=" + apiKey;
  98. getData(tempUrl);
  99. }).catch(function (e) {
  100. console.error(e);
  101. });
  102. }
  103.  
  104. function getData(url) {
  105. fetch(url).then(function (response) {
  106. return response.json();
  107. }).then(function (data) {
  108. if('error' in data){console.log("TravelFC:"+data.error.error);return;}
  109. document.getElementById('mainContainer').innerHTML = company_faction ? showCompany(data) : showFaction(data);
  110. }).catch(function (e) {
  111. console.error(e);
  112. });
  113. }
  114.  
  115. function showFaction(data) {
  116. try {
  117. var factionId = data.ID;
  118. var factionName = data.name;
  119. var respect = data.respect;
  120. var leaderId = data.leader;
  121. var leaderName = data.members[leaderId].name;
  122. var coleaderId = data['co-leader'];
  123. var coleaderName = coleaderId !== 0 ? data.members[coleaderId].name : 'none';
  124. var memberCount = Object.keys(data.members).length;
  125. var bestChain = data.best_chain;
  126. var territory = data.territory;
  127. var territoryCount = territory !== null ? Object.keys(territory).length : '0';
  128. var memberHtml = '';
  129. var memberIds = Object.keys(data.members);
  130. var inWar = data.territory_wars[0] !== undefined ? true : false;
  131. var chainCount = data.chain.current;
  132. var activeChain = chainCount > 0 ? true : false;
  133. var timeLeftToChain = new Date(1000 * data.chain.timeout).toISOString().substr(14, 5);
  134. window.timeout = timeLeftToChain;
  135. memberIds.forEach(function (memberId) {
  136. var member = data.members[memberId];
  137. var memberName = member.name;
  138. var memberLvl = 'NA';
  139. var memberDaysFaction = member.days_in_faction;
  140. var memberStatus = member.status.state;
  141. var statusColor = member.status.color;
  142. var icon = member.last_action.status == 'Offline' ? 'icon2' : member.last_action.status == 'Online' ? 'icon1' : 'icon62';
  143. memberHtml += "\n<li>\n<div class=\"member icons\">\n<ul id=\"iconTray\" class=\"big svg singleicon\" style=\"display: inline-block;\">\n<li id=\"" + icon + "\" class=\"iconShow\" title=\"<b>Offline</b>\" style=\"\"></li>\n</ul><span class=\"m-hide\"><a class=\"user name\" data-placeholder=\"" + memberName + " [" + memberId + "]\" href=\"/profiles.php?XID=" + memberId + "\">" + memberName + " [" + memberId + "]<div></div></a></span><span class=\"m-show\"><a class=\"user name\" data-placeholder=\"" + memberName + " [" + memberId + "]\" href=\"/profiles.php?XID=" + memberId + "\">" + memberName + " [" + memberId + "]<div></div></a> </span>\n</div>\n<div class=\"arrow-wrap right\"><i class=\"arrow-999\"></i></div>\n<div class=\"acc-wrap\">\n<div class=\"lvl\"><span class=\"t-show\">Level:</span>" + memberLvl + "</div><div class=\"member-icons\"><span class=\"t-show\">Icons:</span><ul id=\"iconTray\" class=\"big svg singleicon\" style=\"display: inline-block;\"><li id=\""+((memberId == leaderId || memberId == coleaderId)?"icon74":"icon9")+"-profile-"+memberId+"\" class=\"user-status-16-Faction left\"><a href=\"factions.php?step=profile&amp;userID="+memberId+"\"></a></li>"+((memberStatus == 'Traveling' || memberStatus == 'Abroad')?'<li id="icon71" class="user-status-16-Travelling left"></li>':'')+((memberStatus == 'Hospital')?'<li id="icon15" class="user-status-16-Hospital left"><a href="hospitalview.php"></a></li>':'')+((memberStatus == 'Fallen')?'<li id="icon77" class="user-status-16-Fallen left"></li>':'')+"</ul></div>\n<div class=\"info-wrap right\">\n<div class=\"days\"><span class=\"t-show\">Days:</span>" + memberDaysFaction + "</div>\n<div class=\"status\"><span class=\"t-show\">Status:</span><span class=\"t-" + statusColor + "\">" + memberStatus + "</span></div>\n<div class=\"clear\"></div>\n</div>\n<div class=\"clear\"></div>\n</div>\n<div class=\"clear\"></div>\n</li>";
  144. });
  145. var endHtml = "<div class=\"content-wrapper m-left20 left winter no-precipitation \" role=\"main\">\n<div class=\"content-title m-bottom10\">\n<h4 id=\"skip-to-content\" class=\"left\">Faction</h4>\n<div class=\"clear\"></div>\n<hr class=\"page-head-delimiter\">\n</div>\n<div id=\"factions\">\n<div class=\"faction-info-wrap another-faction\">\n<div class=\"title-black top-round m-top10\" role=\"heading\" aria-level=\"5\"> " + factionName + "</div>\n<div class=\"faction-info bottom-round\" data-faction=\"\">\n<div class=\"f-info-wrap left\">\n<ul class=\"f-info\">\n<li><span class=\"bold\">Leader:</span><a class=\"t-blue-d h\" href=\"/profiles.php?XID=" + leaderId + "\"> " + leaderName + "</a> </li>\n<li><span class=\"bold\">Co-Leader:</span><a class=\"t-blue-d h\" href=\"/profiles.php?XID=" + coleaderId + "\"> " + coleaderName + "</a> </li>\n<li><span class=\"bold\">Members:</span> " + memberCount + "</li>\n<li><span class=\"bold\">Best chain:</span> " + bestChain + "</li>\n<li><span class=\"bold\">Territories:</span><a class=\"t-blue-d h\" href=\"/city.php#factionID=" + factionId + "\"> " + territoryCount + "</a></li>\n<li><span class=\"bold\">Treaties:</span>0 </li>\n</ul>\n<div class=\"clear\"></div>\n</div>\n<div class=\"clear\"></div>\n</div>\n</div>\n<hr class=\"delimiter-999 m-top10\">\n<div class=\"f-msg m-top10" + (inWar ? ' red' : '') + "\">\n<div class=\"l\"></div><div class=\"r\"></div>\n<div class=\"rank-icon left\"></div>\n<div class=\"respect-icon right\"></div>\n<span class=\"title\"> THIS FACTION IS" + (inWar ? ' ' : ' NOT ') + "IN A WAR </span>\n<div class=\"rank\">TIER: NA</div><div class=\"respect\">RESPECT: " + respect + "</div>\n<div class=\"clear\"></div></div>\n<ul class=\"f-war-list war-new\">\n<li class=\"warListItem___AXFi0 first-in-row " + (activeChain ? 'green green' : 'no-active no-active') + "\">\n<a style=\"text-decoration: none;\"><div class=\"chain-box\"><div class=\"chain-box-title-block\"><span class=\"chain-box-title\">" + (activeChain ? 'Chain active' : 'No active chain') + "</span><i class=\"chain-war-icon\"></i></div><div class=\"chain-box-stats-block\"><div class=\"chain-box-general-info\"><span class=\"chain-box-top-stat\">NA</span><span class=\"chain-box-center-stat\" id=\"chain\">" + chainCount + "</span><span class=\"chain-box-timeleft\" id=\"timeout\">" + timeLeftToChain + "</span></div></div></div></a></li><li class=\"inactive\"></li><li class=\"inactive\"></li><li class=\"clear\"></li></ul>\n<hr class=\"delimiter-999 m-top10\">\n<div class=\"clear\"></div>\n<div class=\"faction-info-wrap another-faction\">\n<div class=\"f-war-list m-top10\">\n<ul class=\"title title-black top-round\">\n<li class=\"desk\" role=\"heading\" aria-level=\"5\">" + memberCount + " Faction Members</li>\n<li class=\"lvl\">Level</li>\n<li class=\"member-icons\">Icons</li>\n<li class=\"days\">Days</li>\n<li class=\"status\">Status</li>\n<li class=\"act\">Kick</li>\n</ul>\n<ul class=\"member-list info-members bottom-round t-blue-cont h\">" + memberHtml + "</ul>\n</div>\n</div>\n</div>\n</div>";
  146. chainUpdate(factionId);
  147. return endHtml;
  148. } catch (error) {
  149. console.error(error);
  150. }
  151. }
  152.  
  153. function showCompany(data) {
  154. data = data.company;
  155. var companyName = data.name;
  156. var companyType = data.company_type;
  157. var companyAge = data.days_old;
  158. var dailyIncome = data.daily_profit;
  159. var weeklyIncome = data.weekly_profit;
  160. var dailyCostumers = data.daily_customers;
  161. var weeklyCostumers = data.weekly_customers;
  162. var directorId = data.director;
  163. var directorName = data.employees[directorId].name;
  164. var hired = data.employees_hired;
  165. var capacity = data.employees_capacity;
  166. var employeeHtml = '';
  167. var employees = data.employees;
  168. var employeeIds = Object.keys(data.employees);
  169. employeeIds.forEach(function (employeeId) {
  170. var employee = employees[employeeId];
  171. var employeeName = employee.name;
  172. var employeeLvl = 'NA';
  173. employeeHtml += "<li>\n<ul class=\"item icons\">\n<li class=\"employee\">\n<ul id=\"iconTray\" class=\"big svg singleicon\" style=\"display: inline-block;\">\n<li id=\"icon2___fbdaf888\" class=\"iconShow\" title=\"<b>Offline</b>\" style=\"\"></li>\n</ul><a class=\"user name\" data-placeholder=\"" + employeeName + " [" + employeeId + "]\" href=\"/profiles.php?XID=" + employeeId + "\" 0=\"\"> " + employeeName + " [" + employeeId + "]</a>\n</li>\n<li class=\"rank t-overflow\">\n<span class=\"t-show bold\">Rank:</span>employeeRank</li>\n<li class=\"lvl\">" + employeeLvl + "</li>\n<li class=\"status\">\n<ul id=\"iconTray\" class=\"big svg\" style=\"display: inline-block;\">NA</ul>\n</li>\n<li class=\"clear\"></li>\n</ul>\n<div class=\"clear\"></div>\n</li>";
  174. });
  175. var starCount = data.rating;
  176. var starsHtml = '';
  177.  
  178. for (var i = 1; i < 11; i++) {
  179. var starState = i < starCount ? 'active' : 'inactive';
  180. starsHtml += "<li class=\"star-icon " + starState + "\" title=\"" + starCount + " Star Company\"></li>";
  181. }
  182.  
  183. var endHtml = "<div class=\"content-wrapper m-left20 left winter\" role=\"main\">\n<div class=\"content-title m-bottom10\">\n<h4 id=\"skip-to-content\" class=\"left\">\nJob Listing\n</h4>\n\n<div class=\"links-top-wrap \">\n<button id=\"top-page-links-button\" class=\"links-top-arrow wai-btn\" aria-label=\"Top page links\"></button>\n<div id=\"top-page-links-list\" class=\"content-title-links\" role=\"list\" aria-labelledby=\"top-page-links-button\">\n<div class=\"left-side\"></div>\n<div class=\"right-side\"></div>\n<div class=\"links-header\">\n<div class=\"l\"></div>\n</div>\n\n<div class=\"links-footer\">\n<div class=\"l\"></div>\n<div class=\"r\"></div>\n</div>\n</div>\n</div>\n<div class=\"clear\"></div>\n<hr class=\"page-head-delimiter\">\n</div>\n<div></div>\n\n<div class=\"company-details m-top10\">\n<div class=\"title-black top-round\" role=\"heading\" aria-level=\"5\">\n<span class=\"m-hide\">Details of</span> " + companyName + "<span class=\"m-hide\">- " + companyType + "</span>\n</div>\n<div class=\"details-wrap active\">\n\n<ul class=\"info\">\n<li class=\"m-title\">\n<span class=\"arrow-left right m-show\"></span>\n<span class=\"m-show\">" + companyType + "</span>\n<ul class=\"ranks light\" id=\"ui-id-2\">\n" + starsHtml + "\n</ul>\n<span class=\"clear\"></span>\n</li>\n<li class=\"m-hide\">\nType: " + companyType + " </li>\n<li>\nDirector: <a class=\"t-white h\" href=\"profiles.php?XID=" + directorId + "\"> " + directorName + "</a>\n</li>\n<li>\nAge: " + companyAge + " </li>\n</ul>\n<ul class=\"info\">\n<li>\nDaily income: $" + dailyIncome + " </li>\n<li>\nWeekly income: $" + weeklyIncome + " </li>\n<li>\nDaily customers: " + dailyCostumers + " </li>\n<li>\nWeekly customers: " + weeklyCostumers + " </li>\n</ul>\n<div class=\"clear\"></div>\n</div>\n\n</div>\n<hr class=\"delimiter-999 m-top10 m-bottom10\">\n<div class=\"employees-wrap\">\n<div class=\"title-black top-round\">\n<ul class=\"title\">\n<li class=\"employee\" role=\"heading\" aria-level=\"5\">" + hired + " / " + capacity + " Company Employees</li>\n<li class=\"rank\">Job Title</li>\n<li class=\"lvl\">Level</li>\n<li class=\"status\">Status</li>\n<li class=\"clear\"></li>\n</ul>\n</div>\n<ul class=\"employees-list cont-gray bottom-round\">\n" + employeeHtml + "\n\n</ul>\n</div>\n<div class=\"doctorn-widgets doctorn-widgets--bottom\"></div>\n<div></div>\n</div>";
  184. return endHtml;
  185. }
  186.  
  187. function TimeoutUpdate() {
  188. var timeoutStart = setInterval(function () {
  189. var el = document.getElementById("timeout");
  190. var elHtml = el.innerHTML;
  191.  
  192. if (elHtml == '00:00'){document.getElementById("chain").innerHTML = 0; return;}
  193. var elInt = parseInt(elHtml.split(':')[0]) * 60 + parseInt(elHtml.split(':')[1]) - 1;
  194. var elNewHtml = new Date(1000 * elInt).toISOString().substr(14, 5);
  195. el.innerHTML = elNewHtml;
  196. }, 1000);
  197. }
  198.  
  199. function chainUpdate(id) {
  200. var chain = setInterval(function () {
  201. var el = document.getElementById("chain");
  202. var elRefresh = document.getElementById("timeout");
  203. var chainUrl = "https://api.torn.com/faction/" + id + "?selections=chain&key=" + apiKey;
  204. fetch(chainUrl).then(function (response) {
  205. return response.json();
  206. }).then(function (data) {
  207. if (parseInt(el.innerHTML) !== parseInt(data.chain.current)) elRefresh.innerHTML = '05:00';
  208. if(data.chain.current == '0')elRefresh.innerHTML = '00:00';
  209. el.innerHTML = data.chain.current;
  210. }).catch(function (e) {
  211. console.error(e);
  212. });
  213. }, 40000);
  214. TimeoutUpdate();
  215. }
  216. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址