Torn Helper

Adds extra information to different pages all around Torn.

目前为 2017-01-16 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Torn Helper
  3. // @namespace Jebster.Torn
  4. // @author Jeggy
  5. // @description Adds extra information to different pages all around Torn.
  6. // @include *.torn.com/profiles.php?XID=*
  7. // @version 0.1.11
  8. // @require http://code.jquery.com/jquery-2.2.4.min.js
  9. // @require http://code.jquery.com/ui/1.12.1/jquery-ui.min.js
  10. // @resource jquery-ui http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/black-tie/jquery-ui.min.css
  11. // @resource jquery-base http://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css
  12. // @grant GM_addStyle
  13. // @grant GM_getResourceText
  14. // ==/UserScript==
  15. // debugger;
  16.  
  17. GM_addStyle(GM_getResourceText('jquery-base'));
  18. GM_addStyle(GM_getResourceText('jquery-ui'));
  19.  
  20. String.prototype.format = function() {
  21. var formatted = this;
  22. for (var i = 0; i < arguments.length; i++) {
  23. var regexp = new RegExp('\\{'+i+'\\}', 'gi');
  24. formatted = formatted.replace(regexp, arguments[i]);
  25. }
  26. return formatted;
  27. };
  28.  
  29. var icons = {
  30. // https://www.iconfinder.com/icons/1303892/add_circle_create_new_plus_sign_icon
  31. plus: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAARUElEQVR4Xu2dCfRt1RzHv5kzxJMh4mVIZhkqicxDLUkKJUSmBiyRKENkTC/zmESShmd4oYQoczKVogyR6BUZInmUwvrc9rnde/77t88+4z3Tb62z3n+9e/b029+z92//pr2W+kdrSbqjpLu7f/l7uaRbSrqFpJtLuqGk60u6nhv+FZIul7RG0l8l/VnSnyT9TtJ57jlb0m8l/a9PLINZXafbSnqwezaVdG9JN6lpUJdK+qmk70v6jnsuqqmtRqrtIgD4ah8uaWv33LURTtmN/FzSie75hiRWk85QVwBwHUmPkbSjpO0k3bSlHP6bpFWSjpX0VUlXtbSf0261HQDs38+TtKuk27Sdman+rZb0MUmHOdmhld1vKwAeKmlvSU+Q1NY+xk7ofyV9QdLBkr4dW6ip99rG3MdLep0khLmq6BJJv5D0e0n/SD2XuUZu7ARHhEeedSTdThLyxbKqOiLpe5Le4OSFCqstXlVbAPAoSW+StHnxoUz22x9L+qakc9ykM/Ec58rQrRwQAANHS1an+0u6VolKvyvpVZIQGhdKiwbAXSS93S31eRnBeZwj2cnugZl/z1tJwfdvJulhkh7pnnsVrAeB8eWSflOwfOliiwIASpjXStpnRhkTO5hfSvqEe86PLVTzewirz3TPhjnbQgH1NklvXsQRchEA2FLSoW5ZjeUV+/gxko5w+2hsuUW8t4WkXdyRlZUilti2OPGwPTRGTQIABQ4oR7qPbRctG9LzIZL+2RhXqmkIwXIPN95bR1bJiWGFWx3/E1mm1GuxE1GqEfe1Hy3pfpEVsbSzLH7U6egji7XytRu4L/sVkm4f2cMfSnqapHMj3y/8WhMA2F7S4ZH6eYwwSMcoUK4sPKp2FryupOe6VRCDVBYh0LKVfD7rxTK/1wkA6mbJ3y+igyx9H3HvYo3rM2GRZHVDu5nFf0468HD/uqyQWR0oOhFrOyl9h4gKOLuzV2JhGxIhLH5A0sYRg8a28Kw6tsM6ALCupOMjlDos8a9xQg8rwBDp2m7Ve70k/g4R5mdU45yIKqOqAbCes4LdM6OHqGV3avrIUxnXqq8I7SJCMr4NITrTWUUvrqoLVQIA3TlaObR7ITrBLWd/qWoQPakHj6UjJT02Yzyot1GdY20sTVUBgC8fHXxo8hFokPARgHrlVlV6Fq6pgPlgW8RgFCJAwKpReiWoAgDs+ejhQ8s+So1nSzqqQmb1uSp4hbYURxiL2A4e4XwYC/OiLABQcpySIfChweM08OXCvRxmwW0krZTEicoiBEO2A+wJhagMACj7KTe5VuPs89j4TyvUu7EQR0VOVCGfBGwkOxfdVssA4C0ZSh4mn30Kd+qRinMAUzPyVQgEyAw40uSmogBAvfuZQGss+9jKh6bcyT0BkQVYCXAytbYDhOonOtezyCqvfq0IAPCM+UFAt4/Ah8Ji3PNzTUXmy8gEOJBYgiG2g03yGpDyAgCTLn5tllUPJD5jlPYzJ7PoC5wOMJRZxIfJahFtSMsLAGzVuDBZhOHnwKKjG8tFcYC9HtWxRchmr46qKecWgCcP530LNGj4WPpHJU8s94u9hzPql5xK2FcDdpWHSDo1pvrYFQAfPhQPGxmVottnWxjVuzFcL/8OnspnBIJlOHkxH5lharEAwGXbWlbYb/CQbdSXrTwPO18D8ZGcDCwrItvEAVmjjAEAXq4/C3jv7uv0+1ltjb9XzwEcRaxJ/reLYyCk3aQYAOCSxN7uI5w5iOIZqj2/+inNVyNHwtMlWXEJ6GqeXAYA6JlZZixh40GjsiffjNXwNgIfmkLrY2Z75ncvZa0AnPkfaJT9sKTdahjQWGV+DuB0i8uYj77lVPK5AYARB0OEj/DeRSPYZQdO4vye6gaHQQUbe1cJZxL6b9kLcDI5yTe40AqAHt+K0n2Bs1d3lWGPlvRFSbhqQxyXtnKm7a6O6YWS3md0nhMaaXSWkAUArHhW5CpBG5wMotWNLeQowmtanU0wRpVh6U0PGzU9QabrGw0DgCVHdQsAn5O0rVHRnpI+2PToKm6PUPJ0eDcnmSzP3Iq7UXl1e0l6p1ErhiSsuHPkAwCRrr82pEpi9fi9sAdK5UMuVqGlrs4Siou11lwp0t9x7kcmSBMAv5OkuYhq34CJRMF500cEdr6jufHU1lJfAQDDMMhhEPLREseRNABQLJAc0ZeQiYAEghu7FqXrY0SfAUCKmwtcmpv02Pn/O8xmL0sDgNx7SMc+Yt9n/+8D9RkAzA9xlgSi+oh0e1PlXhoAIYUCWj8UQ32gvgMA7d/XjYkCHM9PfpsFAMeIP0ryZbUgLcuiM3JWCby+A4B55UjIcp8mTPZs8ZMEFLMAQFtk+fGRzweTcF+o7wBgnt7ooox8c4bDLvEccwDg/Mg5Mk0wi6NfWxIyVQHCIQCAMD1Wbh/h2kfGkjkAkPTYt8yfJek+VXC9RXUMAQCwG/uAz4uL9HpkVZ8CgLBkK9r03cbK0KL5zN2VoQCAk9vuBndIXHVxIgM8xcWh+d4l4KDWPDW5p698gaEAIDSvqIVXJQB4l6SXePiKzpzo36YycJaf2rgahgIA8hERQu7T+KLR3Tv5gShTAgrSRKDBZnE87dRbQwEAk/ITQ4Yjc/mWAICHL9x3zQp5fEOBIJ2a9ZnODgkA75X0Is9EcbnFMiYfCxHWPx+RupQLD/pGQwIA6vv3GxO4AQAIuX4RDdS6Sw4qQOOQABBy7N0aALA8sEz4iAiUsvn2K5ivyqsYEgBI3kXklo/2BADs8y/z/Ir5NyalaeWz00CFQwIA7OSmFJJXp2kFACDNiy94AMsfFsA+0tAA8CN3y0l6LlcCAMyGmA/TBDASt+m+gWBoADjOZRBJz+MpAAC9sC/FG6naLaeCrgNiaADghhUSd6TpLABwoeEC1kcbQMKAoQGApNQk5E7ThQAAhYDvJk7s//gBNE0EbRzksmiXuZmr6X6H2sMjlyBOlGqWp06d/SU768T8m6JLAMC/JJHwMU2vdBNRZ8fSdROuheoyidhpsu0m2sKdHjPsr5pobKYN0s/iIJKmNQDAFyTBi4QasXQ0SVn5b5rsS11tkWjDctuuq00MfRj80nTVCIC6WG7XS8zFWxtuNgiANm0BeCSRiwgH1T4SWTtI5mDZXuoac3ALaJsQSAZshMCy17PWxcwi9bLNooxBCCRev2kKCoHjMfCa6eh6bKAFLOsYuHpUBM2zrK8AsBRBZ4ZUwZ+WhE9ZH2loiqCgKng0BvV/C/AlxGDUx47m4P5vAcwx5uAbeZbyg7IcQia+4z3cA4a0BYQcQvbIcgkjV9Aiji11Y25IAAi5hG0FAIj7I5LUR4QRE07cNxoSAELZw5YnbuEog9bxzPIkeKBvsx9Iad/HYyCp4wBBmqZu4fxgBYZ0PXWahd0hrQCo1ieBoCmaZBBNEG+FhqPCJLwItPSJhgIAsoWR9MO3sk2CfpIfcApFH+Cj7SSRN7BPNBQA4NPJ1fM+epKk4xIAkDIEm4CP3mMEjnYZEEMBwIcCCb0nMR+zS8M5ku7mmdVpMoEuz3iq70MBABlCfBd6IxdsDE9mAYDE/1JjkokfPG8EQKc4gG8FWV98hLkdl785AJA/7itGAVy1sq407xJ3hrAChDK+4nMxcU6dXQFCaeLONZaSLk36bF/7DgDmlRV7A88EkSZuvSTbe/p4QDDIrsasetONdxQBfQcAN4pN0sB5aO6mlzQAHucuJfQVPCSQcKhrOOg7AEIfMraBk5MJSwOAfPkkiyZrWJpQBpEs+rKuzbanv30GAEE+hIP7Mr4wt9h+pre8+TREoUsi95F08AiAVnOAuAMrqyt3DM7dO+wDAPllcVv2hWX9wSEI9+YuU19XAJw+uDAC9X2a+Or5+lkFpmRZvywfMgq+OHA5UVdA4YuG4v+4L6HLRKIPdPw+8l4iaQGAywgtRxD2lzsn2aY7yi2snA9I9Z1b0qw7ErswTC745ujnu+yD/m8u6bT0QEL279ClkYQao2fuKnFM4gp2mAaxpZEtvcveT1b4F+MzL48MASB0ewgXRqJq5ALJrhI6ctzekQdWLiBcq0q+4btJYmhfmD/tEHL/NV+DWR4wlqMIdfU5g0iVk9NEXUdKerrRECpfVL9eygJASKPEl4OssOQywiZGPLYx5UBojngpqMHNAgAVfFYSzgM+IpkDwhQS9EjNc4BEGmdIuofRNM4gO4W6FQMATMFnzwhM6fr6dp1M89NYvEUstFYaH8L+8e+YO/enm4oBAGXQIO1v9JOvnztozDvqi49vLBngAIIddzxZeZTICYBJOEixAMBUzFJDDh8f4U52356mlc3i4SJ+56zPfODW5SOu+WFrntwMVnYLSMojTPCVW4gDjRwdLTVrVl/G3+M4AP+5+NGS7FmRmaslSh9f9bErQFL2wMSVyOgr24QvG1Xc0Ma3YjgQMtZRHv5b2/WS+vMCAKmTY98mRk/5+nEo+XjMSMZ3cnOAUD0cOixCe0uK/ytja84LAOrdUBK6dEvrROPEEpwQ24nxvSgOwFOSduCz4SOyu7Pv53LeLQIAGt+WoAIj4oTf1zj146lRQxtfyuIAXzUOu76EnpRl5d0mcPG3WX9RACR7DUcNi0Ak4eXEFYxUnAP476PO9d3pnNRa2Gu7DAAoe0xGSnlAADJHdXExAPABEZYXmvxPGpnAo1osAwAaYEniSMKxwyI0UsSoHR/Vo/GlhAPs+UcHln3e41hOPMcVRdlWFgC0u8wtUaH7hREMkWAPL9rRgZWDV1z7agl8sANFELqAUpHbVQCAzqCRAo2+y6dn5w6HRM6pU6/UgU1s1nBR8qDfx7EzRMRxcstL6Qu9qgIAnV3fOR1kgeAkt2f1MflU1gSHfida56iQ7d4VZvKxA1jR3Ln6UCUAkpUAmcCXkWK2YxdJ2nlBlyfkYlBDLzOhOHXg2RMiLp0geKf0l580UjUAqJer5rhtPCQY8h46a5Y7cudHa64ampCmmkGzijmXJT/rdhS2WG5yL7XnpwdWBwBoA2dL1ME7RnASyxXXm/bxhtLQ8PHk4UpXy5ljtixHveeUkfatjtQFANqjbvwIUBZltYMm6whJRB5VtrxFgG8Rr7DM47tv+fDN9glhGR7WFpqfNTFVMAi1MZNr2Q5m20BxxJJ4aB1or2IwJepgVdzdTWgsLwDJiSXazCzaBADoBAYkJNxNM3t09QurJa1wli8USV0mwrWYePItWkEb6fFh1UNIzmXYKcKkpgBA3xB4WM5ITZIl8CRj4ahICjv2ShIed4lIvEkY3V5GrJ5vLAjGCMUs+Y0Ixk0CIBkw9xGTfjZG+EnKXOrS2LGVEOXSVq8j+ImCZhd3H7MvRNsCMcIwGsAoT56qvoRFAIC+42O4n6R9M3TdvnES/cqZGTA0ff+exXeUX0w6e7YvLUtovtjicN4kcVOmD19VE5/UsygAJO0Tik6+gR0KDow0aGS74CElSlOhamTgRA+PNzSPLxVbzJDw2+dGz6DrdkxFRd9ZNACSfmP2xNcNx4eixLbAMorCBHUpsXI8FxSt0JUj3z5fOD72eEXTV65+K8M77PsofxZuJi8ziJJ89RbHtInBaIsKKyelDSsFYe0IkumHptir089ySRsZN20U7R7yC4KwN1CzaKVlyrUNAMlYAAB37KH6jD0xlOFDnWVR5qxyx9pGBbyYQbUVAEnfEahQgfKwFHeJWHEOc1HU/N1KajsAEqbhGIHQhW1he2dwaiNDScJIKhaEO/b51vs9dAUAs5ONQomwdKKQeBDIFkkkXibbCCpbDFqNKHCqGnAXAZAeO95ImJ4BxWbOFyFG116Eh5hiOWmQT4jJJoFGp41XfQCAbyKR4NE0khaNB1mCszvp09aVtLYzWSc5gi6XxEM8A8s4D2ro850+Hp08IfKt3cuLoJky/wcplP9Ea7lnPAAAAABJRU5ErkJggg==',
  32. // https://www.iconfinder.com/icons/1303875/circle_close_minimize_minus_remove_icon
  33. minus: 'data:image/png;base64,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',
  34. };
  35.  
  36. var data = {};
  37.  
  38. (function() {
  39. 'use strict';
  40.  
  41. var site = window.location.pathname;
  42.  
  43. loadData();
  44. saveOwnData();
  45.  
  46. loadAttackLog();
  47. $( 'head' ).append( '<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">' );
  48.  
  49. if(site.indexOf('profiles.php') > 0) profileView();
  50.  
  51. })();
  52.  
  53. function loadAttackLog(){
  54. var selections = 'attacks';
  55. if('attackLogLoad' in data)
  56. //if(data.attackLogLoad > new Date().getTime() + (60*60*6))
  57. logAttacks(false);
  58. else
  59. logAttacks(true);
  60. }
  61.  
  62. function logAttacks(full){
  63. var selections = 'attacks' + (full ? 'full' : '');
  64. var url = 'https://api.torn.com/user/'+data.me.id+'?selections='+selections+'&key='+data.apikey;
  65. var now = new Date().getTime();
  66. if(!('attackLogLoad' in data) || data.attackLogLoad < now - (60*60*1000)){ // every one hour
  67. data.attackLogLoad = now;
  68.  
  69. apiCall(url, function(d) {
  70. if(d.error) getApiKey();
  71. else{
  72. for(var p in d.attacks){
  73. if (d.attacks.hasOwnProperty(p)) {
  74. var attack = d.attacks[p];
  75. var defender_id = attack.defender_id;
  76. if(!(defender_id in data)) data[defender_id] = {};
  77.  
  78. if(attack.attacker_id == data.me.id){
  79. // My attack
  80. if(!('attacks' in data[defender_id])) data[defender_id].attacks = {};
  81. data[defender_id].attacks[p] = attack;
  82. }else{
  83. // I'm being attacked
  84. if(!('defends' in data[attack.attacker_id])) data[attack.attacker_id].defends = {};
  85. data[attack.attacker_id].defends[p] = attack;
  86. }
  87. }
  88.  
  89. }
  90.  
  91. save();
  92. }
  93. });
  94. }
  95. }
  96.  
  97. function profileView(){
  98. var userid = getParameterByName('XID');
  99. var userData = data[userid];
  100. var content = '';
  101. content += profileViewSelectionPopUp(); // TODO: Figoure out how to call tampermonkey function from the injected code.
  102. content += '<div id="compareStats">';
  103. content += 'Loading...';
  104. content += '<br />';
  105. content += '</div>';
  106.  
  107. var a = accordion('Torn Helper', content);
  108.  
  109. $(a).insertAfter('.tutorial-cont + .profile-wrapper');
  110.  
  111. var compareFunc = function(){
  112. $('#compareStats').replaceWith(compareTemplate(userid, data.me.userid));
  113. };
  114. apiUserStats(userid, compareFunc);
  115. apiUserStats(data.me.userid, compareFunc);
  116. }
  117.  
  118. // Only supports one accordion on the page at the moment.
  119. function accordion(title, block){
  120. var css = '<style>'+
  121. 'button.Jaccordion {'+
  122. 'cursor: pointer;'+
  123. 'padding: 18px;'+
  124. 'width: 100%;'+
  125. 'text-align: left;'+
  126. 'transition: 0.4s;'+
  127. '}'+
  128. 'div.Jpanel {'+
  129. 'max-height: 0;'+
  130. 'overflow: hidden;'+
  131. 'transition: 0.8s ease-in-out;'+
  132. 'opacity: 0;'+
  133. '}'+
  134. 'div.Jshow {'+
  135. 'opacity: 1;'+
  136. 'max-height: 1000px;'+
  137. 'width: auto;'+
  138. '}'+
  139. 'div.JAccordionIconShow {'+
  140. 'opacity: 1;'+
  141. 'max-height: 30px;'+
  142. 'width: auto;'+
  143. '}'+
  144. '.JProfileViewAccordion{'+
  145. 'width: 0;'+
  146. 'float: right;'+
  147. 'max-height: 0;'+
  148. 'overflow: hidden;'+
  149. 'opacity: 0;'+
  150. 'padding-right: 7px;'+
  151. '}'+
  152. '.JAccordionIcon{'+
  153. 'padding: 6px 5px 6px 25px;'+
  154. 'cursor: pointer;'+
  155. '}'+
  156. '</style>';
  157.  
  158. var script = '<script>$(".JAccordionIcon").click(function() {'+
  159. '$(".Jpanel").toggleClass("Jshow");'+
  160. '$(".JProfileViewAccordion").toggleClass("JshJAccordionIconShowow");'+
  161. '$(".JProfileViewAccordion").toggleClass("JAccordionIconShow");'+
  162. '});</script>';
  163.  
  164. var show = data.profileview.show;
  165.  
  166. var html = '<div class="Jaccordion profile-wrapper medals-wrapper m-top10">'+
  167. '<div class="menu-header">'+title+
  168. '<div class="JProfileViewAccordion '+(show ? '' : 'JAccordionIconShow')+'"><i class="fa fa-plus-square JAccordionIcon" aria-hidden="true" /></div>'+
  169. '<div class="JProfileViewAccordion '+(show ? 'JAccordionIconShow' : '')+'"><i class="fa fa-minus-square JAccordionIcon" aria-hidden="true" /></div>'+
  170. '</div>'+
  171. '<div class="Jpanel '+(show ? 'Jshow' : '')+'">'+
  172. block+
  173. '</div>'+
  174. '</div>';
  175.  
  176. $(document).on('click','.JAccordionIcon', function(){
  177. data.profileview.show = !data.profileview.show;
  178. save();
  179. });
  180.  
  181. return css+script+html;
  182. }
  183.  
  184. function profileViewSelectionPopUp(){
  185. var possibilities = possibleStats();
  186.  
  187. var popupHtml = '<div>';
  188. var categories = {};
  189. for(var p in possibilities){
  190. var o = possibilities[p];
  191. var checked = inArray(p, data.profileview.display) ? 'checked' : '';
  192.  
  193. if(o.category){
  194. if(!categories[o.category]) categories[o.category] = {display: o.category, html: ''};
  195. }else{
  196. if(!categories.others) categories.others = {display: 'Others', html: ''};
  197. }
  198.  
  199. var cat = o.category ? o.category : 'others';
  200.  
  201. var html = '<label id="JC'+cat+'" for="view'+p+'" style="';
  202. html += 'border-radius: 2px;border: 1px solid gray;background-color: lightgray;margin: 3px;';
  203. html += 'padding: 3px 10px 3px 5px;display: inline-block;cursor: pointer;';
  204. html += '"><input type="checkbox" name="view'+p+'" id="view'+p+'" '+checked+'>';
  205. html += o.display+'</label>';
  206. categories[cat].html += html;
  207. }
  208.  
  209. for(var category in categories){
  210. if (categories.hasOwnProperty(category)) {
  211. popupHtml += '<fieldset style="border:1px solid black; padding: 10px; margin: 10px 0;">';
  212. popupHtml += '<legend onclick=\'document.getElementById("JC'+category+'").style.display = document.getElementById("JC'+category+'").style.display == "none" ? "block" : "none";\'';
  213. popupHtml += '><b>'+categories[category].display+'</b></legend>';
  214. popupHtml += categories[category].html;
  215. popupHtml += '</fieldset>';
  216. }
  217. }
  218.  
  219. popupHtml += '</div>';
  220. var popup = popupWindow(
  221. {
  222. element: '#editProfileView',
  223. title: 'Edit Profile view',
  224. width: 640
  225. },
  226. popupHtml,
  227. [
  228. {
  229. 'display': 'Close',
  230. 'close': true
  231. },
  232. {
  233. 'display': 'Save',
  234. 'callback': function(){
  235. var selected = [];
  236. for(var p in possibleStats()){
  237. var checked = $("#view"+p).is(':checked');
  238. if(checked) selected.push(p);
  239. }
  240. data.profileview.display = selected;
  241. save();
  242. location.reload();
  243. }
  244. }
  245. ]
  246. );
  247.  
  248. var button = '<div style="float:right">' +
  249. '<button id="editProfileView" style="';
  250. button += 'background-color: #282828;';
  251. button += 'border: none;';
  252. button += 'border-radius: 5px;';
  253. button += 'color: white;';
  254. button += 'padding: 5px 5px 5px 7px;';
  255. button += 'text-align: center;';
  256. button += 'text-decoration: none;';
  257. button += 'display: inline-block;';
  258. button += 'font-size: 16px;';
  259. button += 'margin: 4px 2px;';
  260. button += 'cursor: pointer;';
  261. button += '"><i class="fa fa-pencil-square-o" aria-hidden="true" /></button></div>';
  262.  
  263. return button+popup;
  264. }
  265.  
  266. /**
  267. * Example usage:
  268. * popupWindow(
  269. * { 'element': '#myDialogButton', 'title': 'Hello World' },
  270. * '<h3>Something</h3><input type="text" id="myfield" />',
  271. * [{'display': 'Save',
  272. * 'close': false, // default: true
  273. * callback: function(){var something = $("#myfield").val();}
  274. * }]);
  275. */
  276. function popupWindow(e, content, buttons){
  277. var script = '<script>$("'+e.element+'").click(function(){$("#dialog-message").dialog({'+
  278. 'modal: true,'+
  279. 'draggable: true,'+
  280. 'create: function(){$(this).css("maxHeight", $(window).height()-240);},'+
  281. 'resizable: true,'+
  282. 'position: [\'center\'],'+
  283. 'show: \'blind\','+
  284. 'hide: \'blind\','+
  285. 'width: '+(e.width ? e.width : 400)+','+
  286. 'buttons: [';
  287. var test = '';
  288. for(var i = 0; i < buttons.length; i++){
  289. script += '{';
  290. script += 'text: \''+buttons[i].display+'\',';
  291. script += 'id: \'dialogButton'+i+'\'';
  292. script += '},';
  293.  
  294. // this only supports up to 10 buttons.
  295. $(document).on('click','#dialogButton'+i, function(){
  296. var pressed = this.id.substr(this.id.length -1);
  297. if(buttons[pressed].callback)
  298. buttons[pressed].callback();
  299.  
  300. if(buttons[pressed].close)
  301. $("a.ui-dialog-titlebar-close")[0].click();
  302. });
  303. }
  304. script = script.slice(0, -1);
  305.  
  306. script += ']}';
  307. script += ');});'+test;
  308.  
  309. script += '</script>';
  310.  
  311. var html = '<div id="dialog-message" title="'+e.title+'" style="display: none; max-height: 80%;">';
  312. html += content;
  313. html += '</div>';
  314. return script+html;
  315. }
  316.  
  317. function inArray(c, a){
  318. // Somehow $.inArray is not working? ?
  319. for(var i = 0; i < a.length; i++){
  320. if(c == a[i]) return true;
  321. }
  322. return false;
  323. }
  324.  
  325. function getUserValue(userid, property){
  326. var user = data[userid];
  327. if(user){
  328. if($.isArray(property)){
  329. for(var i = 0; i < property.length; i++){
  330. user = user[property[i]];
  331. }
  332. return user;
  333. }else{
  334. var userData = user[property];
  335. if(userData){
  336. return userData;
  337. }
  338. }
  339. }
  340. return -1;
  341. }
  342.  
  343. function setUserValue(userid, property, value){
  344. if(data[userid] === undefined) data[userid] = {};
  345. data[userid][property] = value;
  346. }
  347.  
  348. function save(){
  349. localStorage.setItem('jebster.torn', JSON.stringify(data));
  350. }
  351.  
  352. function saveOwnData(){
  353. if(!('me' in data) || !('id' in data.me) || data.me.id < 1){
  354. var url = 'https://api.torn.com/user/'+data.me.id+'?selections=basic&key='+data.apikey;
  355. apiCall(url, function(d) {
  356. id = d.player_id;
  357. data.me = {'id': id};
  358. save();
  359. });
  360. }
  361. }
  362.  
  363. function loadData(){
  364. data = localStorage.getItem('jebster.torn');
  365. if(data === undefined || data === null){
  366. // Default settings
  367. data = {
  368. profileview:{
  369. show: true,
  370. display: ['xantaken','logins','refills','useractivity']
  371. }
  372. };
  373. }else{
  374. data = JSON.parse(data);
  375. }
  376.  
  377. if(data.apikey === undefined || data.apikey === ''){
  378. getApiKey();
  379. }
  380. }
  381.  
  382. var asked = false;
  383. function getApiKey(){
  384. // Add some beautiful input/popup on the page itself
  385. if(asked) return; asked = true;
  386. var key = prompt('You API Key', 'key');
  387. if(!('me' in data)) data.me = {};
  388. data.apikey = key;
  389. save();
  390. }
  391.  
  392. function apiUserStats(userid, cb){
  393. var lastRequest = getUserValue(userid, 'lastRequest');
  394. var now = new Date();
  395. if(lastRequest === 0 || lastRequest < now.getTime() - (60*60*5*1000)){ // TODO:
  396. var selections = 'personalstats,basic,crimes';
  397. var url = 'https://api.torn.com/user/'+userid+'?selections='+selections+'&key='+data.apikey;
  398. apiCall(url, function(data) {
  399. if(data.error) getApiKey();
  400. else{
  401. setUserValue(userid, 'stats', data.personalstats);
  402. setUserValue(userid, 'lastRequest', now.getTime());
  403. setUserValue(userid, 'username', data.name);
  404. setUserValue(userid, 'crimes', data.crimes);
  405. save();
  406. cb(data);
  407. }
  408. });
  409. }else{
  410. cb(data[userid].stats);
  411. }
  412. }
  413.  
  414. function compareTemplate(user1Id, user2Id){
  415.  
  416. var css = '<style>'+
  417. '.tornHelper{' +
  418. 'min-width:200px;' +
  419. '}' +
  420. '</style>';
  421.  
  422. var html = css+'<div class="profile-container basic-info"><ul class="basic-list">' +
  423. '<li>' +
  424. '<div class="user-information-section left"><span class="bold"></span></div>' +
  425. '<div class="user-information-section left tornHelper"><span class="bold">'+getUserValue(user1Id, 'username')+'</span></div>' +
  426. '<div class="tornHelper"><span class="bold">'+getUserValue(user2Id, 'username')+' (You)</span></div>' +
  427. '</li>';
  428.  
  429. var stats = possibleStats();
  430. for(var i = 0; i < data.profileview.display.length; i++){
  431. var display = stats[data.profileview.display[i]];
  432. if(stats[data.profileview.display[i]]){
  433. var user1Value = getUserValue(user1Id, display.apiname);
  434. var user2Value = getUserValue(user2Id, display.apiname);
  435.  
  436. user1Value = user1Value ? user1Value : 0;
  437. user2Value = user2Value ? user2Value : 0;
  438.  
  439. if(display.format){
  440. user1Value = display.format(user1Value);
  441. user2Value = display.format(user2Value);
  442. }
  443.  
  444. html += '<li>' +
  445. '<div class="user-information-section left"><span class="bold">' +
  446. display.display +
  447. '</span></div>' +
  448. '<div class="user-information-section left tornHelper">' +
  449. user1Value +'</div>' +
  450. '<div class="tornHelper">'+user2Value+'</div>' +
  451. '</li>';
  452. }
  453. }
  454. html += '</ul><hr />';
  455. var attacks = {hosp: {display: 'Hosped', times: 0, other: 0}, mug: {display: 'Mugged', times: 0}, left: {display: 'Left', times: 0}, lost: {display: 'Lost', times: 0}};
  456. if('attacks' in data[user1Id]){
  457. for(var p in data[user1Id].attacks){
  458. var attack = data[user1Id].attacks[p];
  459.  
  460. switch(attack.result){
  461. case 'Mug':
  462. attacks.mug.times++;
  463. break;
  464. case 'Hospitalize':
  465. attacks.hosp.times++;
  466. break;
  467. case 'Leave':
  468. attacks.left.times++;
  469. break;
  470. case 'Lose':
  471. attacks.lost.times++;
  472. break;
  473. }
  474. }
  475. }
  476.  
  477. var ahtml = '<ul class="basic-list">';
  478. var anyAttacks = false;
  479. for(var type in attacks){
  480. if(attacks[type].times > 0){
  481. ahtml += '<li>';
  482. ahtml += '<div class="user-information-section left width112"><span class="bold">'+attacks[type].display+'</span></div>';
  483. ahtml += attacks[type].times;
  484. ahtml += '</li>';
  485. anyAttacks = true;
  486. }
  487. }
  488. ahtml += '</ul></div>';
  489. html += anyAttacks ? 'Attacks you made against \''+getUserValue(user1Id, 'username')+'\'' : 'You haven\'t attacked '+getUserValue(user1Id, 'username')+' before.';
  490. html += ahtml;
  491. return html;
  492. }
  493.  
  494. function possibleStats(){
  495. return {
  496. attackswon:{apiname:['stats','attackswon'], display: 'Attacks won', category: 'Attacking'},
  497. attackslost:{apiname:['stats','attackslost'], display: 'Attacks lost', category: 'Attacking'},
  498. attacksdraw:{apiname:['stats','attacksdraw'], display: 'Attacks Draw', category: 'Attacking'},
  499. // Attacks stalemated
  500. attacksassisted:{apiname:['stats','attacksassisted'], display: 'Attacks assisted', category: 'Attacking'},
  501. defendswon:{apiname:['stats','defendswon'], display: 'Defends won', category: 'Attacking'},
  502. defendslost:{apiname:['stats','defendslost'], display: 'Defends lost', category: 'Attacking'},
  503. defendsstalemated:{apiname:['stats','defendsstalemated'], display: 'Defends stalemated', category: 'Attacking'},
  504. yourunaway:{apiname:['stats','yourunaway'], display: 'Run Aways', category: 'Attacking'},
  505. theyrunaway:{apiname:['stats','theyrunaway'], display: 'Other Ran Away', category: 'Attacking'},
  506. bestkillstreak:{apiname:['stats','bestkillstreak'], display: 'Best Kill Streak', category: 'Attacking'},
  507. attackcriticalhits:{apiname:['stats','attackcriticalhits'], display: 'Attack Critical Hits', category: 'Attacking'},
  508. attackhits:{apiname:['stats','attackhits'], display: 'Attack Hits', category: 'Attacking'},
  509. attackmisses:{apiname:['stats','attackmisses'], display: 'Attack Misses', category: 'Attacking'},
  510. roundsfired:{apiname:['stats','roundsfired'], display: 'Rounds Fired', category: 'Attacking'},
  511. attacksstealthed:{apiname:['stats','attacksstealthed'], display: 'Attacks Stealthed', category: 'Attacking'},
  512. moneymugged:{apiname:['stats','moneymugged'], display: 'Money Mugged', category: 'Attacking'},
  513. largestmug:{apiname:['stats','largestmug'], display: 'Largest Mug', category: 'Attacking'},
  514. highestbeaten:{apiname:['stats','highestbeaten'], display: 'Highest Level Beaten', category: 'Attacking'},
  515. respectforfaction:{apiname:['stats','respectforfaction'], display: 'Respect For Faction', category: 'Attacking'},
  516. itemsbought:{apiname:['stats','itemsbought'], display: 'Items Bought', category: 'Trading'},
  517. auctionswon:{apiname:['stats','auctionswon'], display: 'Auctions Won', category: 'Trading'},
  518. auctionsells:{apiname:['stats','auctionsells'], display: 'Auction Sells', category: 'Trading'},
  519. itemssent:{apiname:['stats','itemssent'], display: 'Items Sent', category: 'Trading'},
  520. trades:{apiname:['stats','trades'], display: 'Trades', category: 'Trading'},
  521. weaponsbought:{apiname:['stats','weaponsbought'], display: 'Weapons Bought', category: 'Trading'},
  522. pointssold:{apiname:['stats','pointssold'], display: 'Points Sold', category: 'Trading'},
  523. pointsbought:{apiname:['stats','pointsbought'], display: 'Points Bought', category: 'Trading'},
  524. bazaarcustomers:{apiname:['stats','bazaarcustomers'], display: 'Bazaar Customers', category: 'Trading'},
  525. bazaarsales:{apiname:['stats','bazaarsales'], display: 'Bazaar Sales', category: 'Trading'},
  526. bazaarprofit:{apiname:['stats','bazaarprofit'], display: 'Bazaar Profit', category: 'Trading'},
  527. jailed:{apiname:['stats','jailed'], display: 'Jailed', category: 'Jail'},
  528. peoplebusted:{apiname:['stats','peoplebusted'], display: 'People Busted', category: 'Jail'},
  529. failedbusts:{apiname:['stats','failedbusts'], display: 'Failed Busts', category: 'Jail'},
  530. peoplebought:{apiname:['stats','peoplebought'], display: 'People Bought out of Jail', category: 'Jail'},
  531. peopleboughtspent:{apiname:['stats','peopleboughtspent'], display: 'Money Spent on buying people out of jail', category: 'Jail'}, // TODO: Some shorter display text
  532. hospital:{apiname:['stats','hospital'], display: 'Hospital', category: 'Hospital'},
  533. medicalitemsused:{apiname:['stats','medicalitemsused'], display: 'Medical Items Used', category: 'Hospital'},
  534. bloodwithdrawn:{apiname:['stats','bloodwithdrawn'], display: 'Blood Withdrawn'}, category: 'Hospital',
  535. revives:{apiname:['stats','revives'], display: 'Revives', category: 'Hospital'},
  536. revivesreceived:{apiname:['stats','revivesreceived'], display: 'Revives Received', category: 'Hospital'},
  537. medstolen:{apiname:['stats','medstolen'], display: 'Medical Items Stolen', category: 'Hospital'},
  538. heahits:{apiname:['stats','heahits'], display: 'Heavy artillery', category: 'Finishing Hits'},
  539. machits:{apiname:['stats','machits'], display: 'Machine guns', category: 'Finishing Hits'},
  540. rifhits:{apiname:['stats','rifhits'], display: 'Rifles', category: 'Finishing Hits'},
  541. smghits:{apiname:['stats','smghits'], display: 'Sub machine guns', category: 'Finishing Hits'},
  542. shohits:{apiname:['stats','shohits'], display: 'Shotguns', category: 'Finishing Hits'},
  543. pishits:{apiname:['stats','pishits'], display: 'Pistols', category: 'Finishing Hits'},
  544. grehits:{apiname:['stats','grehits'], display: 'Temporary weapons', category: 'Finishing Hits'},
  545. piehits:{apiname:['stats','piehits'], display: 'Piercing weapons', category: 'Finishing Hits'},
  546. slahits:{apiname:['stats','slahits'], display: 'Slashing weapons', category: 'Finishing Hits'},
  547. axehits:{apiname:['stats','axehits'], display: 'Clubbed weapons', category: 'Finishing Hits'},
  548. chahits:{apiname:['stats','chahits'], display: 'Mechanical weapons', category: 'Finishing Hits'},
  549. mailssent:{apiname:['stats','mailssent'], display: 'Mail Sent', category: 'Communication'},
  550. friendmailssent:{apiname:['stats','friendmailssent'], display: 'Friend Mail Sent', category: 'Communication'},
  551. factionmailssent:{apiname:['stats','factionmailssent'], display: 'Faction Mail Sent', category: 'Communication'},
  552. companymailssent:{apiname:['stats','companymailssent'], display: 'Company Mail Sent', category: 'Communication'},
  553. spousemailssent:{apiname:['stats','spousemailssent'], display: 'Spouse Mail Sent', category: 'Communication'},
  554. classifiedadsplaced:{apiname:['stats','classifiedadsplaced'], display: 'Classified Newspaper Ads Placed', category: 'Communication'},
  555. personalsplaced:{apiname:['stats','personalsplaced'], display: 'Personal Placed', category: 'Communication'},
  556. bountiesplaced:{apiname:['stats','bountiesplaced'], display: 'Bounties Placed', category: 'Bounties'},
  557. totalbountyspent:{apiname:['stats','totalbountyspent'], display: 'Total Bounty Money Spent', category: 'Bounties'},
  558. bountiescollected:{apiname:['stats','bountiescollected'], display: 'Bounties Collected', category: 'Bounties'},
  559. totalbountyreward:{apiname:['stats','totalbountyreward'], display: 'Total Bounty Money Gained', category: 'Bounties'},
  560. bountiesreceived:{apiname:['stats','bountiesreceived'], display: 'Bounties Received', category: 'Bounties'},
  561. cityfinds:{apiname:['stats','cityfinds'], display: 'City Finds', category: 'Items'},
  562. itemsdumped:{apiname:['stats','itemsdumped'], display: 'Items Dumped', category: 'Items'},
  563. dumpsearches:{apiname:['stats','dumpsearches'], display: 'Dump Searches', category: 'Items'},
  564. dumpfinds:{apiname:['stats','dumpfinds'], display: 'Dump Finds', category: 'Items'},
  565. traveltimes:{apiname:['stats','traveltimes'], display: 'Travel Times', category: 'Travel'},
  566. itemsboughtabroad:{apiname:['stats','itemsboughtabroad'], display: 'Items Bought Abroad', category: 'Travel'},
  567. argtravel:{apiname:['stats','argtravel'], display: 'Argentina Traveled', category: 'Travel'},
  568. mextravel:{apiname:['stats','mextravel'], display: 'Mexico Traveled', category: 'Travel'},
  569. dubtravel:{apiname:['stats','dubtravel'], display: 'Dubai Traveled', category: 'Travel'},
  570. hawtravel:{apiname:['stats','hawtravel'], display: 'Hawaii Traveled', category: 'Travel'},
  571. japtravel:{apiname:['stats','japtravel'], display: 'Japan Traveled', category: 'Travel'},
  572. lontravel:{apiname:['stats','lontravel'], display: 'London Traveled', category: 'Travel'},
  573. soutravel:{apiname:['stats','soutravel'], display: 'South Africa Traveled', category: 'Travel'},
  574. switravel:{apiname:['stats','switravel'], display: 'Switzerland Traveled', category: 'Travel'},
  575. chitravel:{apiname:['stats','chitravel'], display: 'China Traveled', category: 'Travel'},
  576. cantravel:{apiname:['stats','cantravel'], display: 'Canada Traveled', category: 'Travel'},
  577. caytravel:{apiname:['stats','caytravel'], display: 'Cayman Islands Traveled', category: 'Travel'},
  578. drugsused:{apiname:['stats','drugsused'], display: 'Drug Used', category: 'Drugs'},
  579. overdosed:{apiname:['stats','overdosed'], display: 'Drug Overses', category: 'Drugs'},
  580. cantaken:{apiname:['stats','cantaken'], display: 'Canabis Taken', category: 'Drugs'},
  581. exttaken:{apiname:['stats','exttaken'], display: 'Ecstasy Taken', category: 'Drugs'},
  582. kettaken:{apiname:['stats','kettaken'], display: 'Ketamine Taken', category: 'Drugs'},
  583. lsdtaken:{apiname:['stats','lsdtaken'], display: 'LSD Taken', category: 'Drugs'},
  584. opitaken:{apiname:['stats','opitaken'], display: 'Opium Taken', category: 'Drugs'},
  585. shrtaken:{apiname:['stats','shrtaken'], display: 'Shrooms Taken', category: 'Drugs'},
  586. spetaken:{apiname:['stats','spetaken'], display: 'Speed Taken', category: 'Drugs'},
  587. pcptaken:{apiname:['stats','pcptaken'], display: 'PCP Taken', category: 'Drugs'},
  588. xantaken:{apiname:['stats','xantaken'], display: 'Xanax Taken', category: 'Drugs'},
  589. victaken:{apiname:['stats','victaken'], display: 'Vicodin Taken', category: 'Drugs'},
  590. networth:{apiname:['stats','networth'], display: 'Networth', format: formatMoney},
  591. logins:{apiname:['stats','logins'], display: 'Logins'},
  592. useractivity:{apiname:['stats','useractivity'], display: 'Time Played', format: formatSeconds},
  593. meritsbought:{apiname:['stats','meritsbought'], display: 'Merits Bought'},
  594. refills:{apiname:['stats','refills'], display: 'Refills'},
  595. trainsreceived:{apiname:['stats','trainsreceived'], display: 'Trains Received'},
  596. spydone:{apiname:['stats','spydone'], display: 'Spies Done'},
  597. statenhancersused:{apiname:['stats','statenhancersused'], display: 'Stat Enhancers Used'},
  598. virusescoded:{apiname:['stats','virusescoded'], display: 'Viruses Coded'},
  599. daysbeendonator:{apiname:['stats','daysbeendonator'], display: 'Days Been Donator'},
  600. missionscompleted:{apiname:['stats','missionscompleted'], display: 'Missions Completed', category: 'Missions'},
  601. contractscompleted:{apiname:['stats','contractscompleted'], display: 'Contracts Completed', category: 'Missions'},
  602. dukecontractscompleted:{apiname:['stats','dukecontractscompleted'], display: 'Duke Contracts Completed', category: 'Missions'},
  603. missioncreditsearned:{apiname:['stats','missioncreditsearned'], display: 'Mission Credits Earned', category: 'Missions'},
  604. sellingillegalproducts:{apiname:['crimes','selling_illegal_products'], display: 'Illegal Products Sold', category: 'Crimes'},
  605. theft:{apiname:['crimes','theft'], display: 'Theft', category: 'Crimes'},
  606. auto_theft:{apiname:['crimes','auto_theft'], display: 'Auto Theft', category: 'Crimes'},
  607. drug_deals:{apiname:['crimes','drug_deals'], display: 'Drug Deals', category: 'Crimes'},
  608. computer_crimes:{apiname:['crimes','computer_crimes'], display: 'Computer Crimes', category: 'Crimes'},
  609. murder:{apiname:['crimes','murder'], display: 'Murder', category: 'Crimes'},
  610. fraud_crimes:{apiname:['crimes','fraud_crimes'], display: 'Fraud Crimes', category: 'Crimes'},
  611. other:{apiname:['crimes','other'], display: 'Other Crimes', category: 'Crimes'},
  612. total:{apiname:['crimes','total'], display: 'Total Crimes', category: 'Crimes'},
  613. };
  614. }
  615.  
  616. function apiCall(url, cb){
  617. console.log(url);
  618. $.ajax({
  619. url: url,
  620. type: 'GET',
  621. success: function(data) {
  622. cb(data);
  623. },
  624. //async: false
  625. });
  626. }
  627.  
  628. function removeFirstAndLastLine(text){
  629. var lines = text.split('\n');
  630. lines.splice(0,1);
  631. lines.splice(-1,1);
  632. var newtext = lines.join('\n');
  633. }
  634.  
  635. function formatSeconds(s){
  636. var minutes = Math.floor(s/60)%60;
  637. var hours = Math.floor(s/(60*60))%24;
  638. var days = Math.floor(s/(60*60*24));
  639. var seconds = s%60;
  640.  
  641. return '{0}d {1}h {2}m {3}s'.format(days, hours, minutes, seconds);
  642. }
  643.  
  644. function formatNumber(n){
  645. return n;
  646. }
  647.  
  648. function formatMoney(m){
  649. return '$'+m.toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
  650. }
  651.  
  652. // Taken from: http://stackoverflow.com/a/15724300/1832471
  653. function getCookieValue(name) {
  654. var nameEQ = name + "=";
  655. var ca = document.cookie.split(';');
  656. for(var i=0;i < ca.length;i++) {
  657. var c = ca[i];
  658. while (c.charAt(0)==' ') c = c.substring(1,c.length);
  659. if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length,c.length);
  660. }
  661. return null;
  662. }
  663.  
  664. // Taken from: http://stackoverflow.com/a/901144/1832471
  665. function getParameterByName(name, url) {
  666. if (!url) {
  667. url = window.location.href;
  668. }
  669. name = name.replace(/[\[\]]/g, "\\$&");
  670. var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
  671. results = regex.exec(url);
  672. if (!results) return null;
  673. if (!results[2]) return '';
  674. return decodeURIComponent(results[2].replace(/\+/g, " "));
  675. }
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682.  
  683.  
  684.  
  685.  
  686.  
  687.  
  688.  
  689.  
  690.  
  691.