Extra Player Details

Designed to provide extra information about players

  1. // ==UserScript==
  2. // @name Extra Player Details
  3. // @namespace https://github.com/kamarov-therussiantank
  4. // @author kamarov
  5. // @description Designed to provide extra information about players
  6. // @version 1.0.4
  7. // @license GPL-3.0
  8. // @match https://tanktrouble.com/*
  9. // @run-at document-end
  10. // @grant GM_addStyle
  11. // @require https://update.greasyfork.org/scripts/482092/1309109/TankTrouble%20Development%20Library.js
  12. // @noframes
  13. // ==/UserScript==
  14.  
  15. GM_addStyle(`
  16. .exp.tooltipstered {
  17. position: relative;
  18. height: 30px;
  19. }
  20. #tankinfo .rank, #tankinfo .xp {
  21. position: relative;
  22. height: 30px;
  23. }
  24. .exp-bar {
  25. background-image: image-set(url(https://i.imgur.com/R2CiGV4.png) 1x, url(https://i.imgur.com/6BC4tAu.png) 2x);
  26. background-size: 10px 22px;
  27. height: 100%;
  28. }
  29. .about-container {
  30. position: relative;
  31. z-index: 2;
  32. font-size: 12px;
  33. }
  34. .bannedText-container {
  35. position: relative;
  36. z-index: 2;
  37. font-size: 12px;
  38. margin: 20px 0 20px 0;
  39. }
  40. span.exp-text {
  41. position: absolute;
  42. top: 3px;
  43. left: 32%;
  44. font-family: 'Arial';
  45. font-size: 14px;
  46. font-weight: bold;
  47. color: #fff;
  48. text-shadow: -1.4px -1.4px 0 black, 1.4px -1.4px 0 black, -1.4px 1.4px 0 black, 1.4px 1.4px 0 black;
  49. }
  50. #tankinfo .username {
  51. z-index: 2;
  52. }
  53. .adminBadge {
  54. z-index: 1;
  55. position: absolute;
  56. top: -75px;
  57. right: -22px;
  58. }
  59. .banned-Icon {
  60. z-index: 1;
  61. position: absolute;
  62. top: -140px;
  63. left: 10px;
  64. }
  65. tr.tooltipstered {
  66. display: none !important;
  67. }
  68. .statsContainer img.statsIcon {
  69. position: absolute;
  70. }
  71. .statsContainer svg {
  72. left: 45px;
  73. }
  74. .deaths.tooltipstered {
  75. left: 55px;
  76. }
  77. #tankinfo table td:first-child .statsIcon {
  78. left: 3px;
  79. }
  80. #tankinfo table td:first-child svg {
  81. left: 44px;
  82. }
  83. #tankinfo table td:last-child .statsIcon {
  84. right: 5px;
  85. }
  86. #tankinfo table td:last-child svg {
  87. left: 5px;
  88. }
  89. `);
  90.  
  91. (() => {
  92. Loader.interceptFunction(TankTrouble.TankInfoBox, '_initialize', (original, ...args) => {
  93. original(...args);
  94.  
  95. // Initialize badges Div
  96. TankTrouble.TankInfoBox.infoBadgesDiv = $('<div class="badge-container"/>');
  97.  
  98. // Define icons for badges
  99. TankTrouble.TankInfoBox.infoBadgesIcon1 = $('<img class="badgeIcon" src="https://i.imgur.com/EM9M66p.png"/>'); // Premium
  100. TankTrouble.TankInfoBox.infoBadgesIcon2 = $('<img class="badgeIcon" src="https://i.imgur.com/FTvsqiv.png"/>'); // Kickstarter
  101. TankTrouble.TankInfoBox.infoBadgesIcon3 = $('<img class="badgeIcon" src="https://i.imgur.com/PfnLu7l.png"/>'); // Admin
  102. TankTrouble.TankInfoBox.infoBadgesIcon4 = $('<img class="badgeIcon" src="https://i.imgur.com/1UQeWVB.png"/>'); // Beta Tester
  103. TankTrouble.TankInfoBox.infoBadgesIcon5 = $('<img class="badgeIcon" src="https://i.imgur.com/9WCCK6U.png"/>'); // Classic Player
  104. TankTrouble.TankInfoBox.infoBannedIcon = $('<img class="banned-Icon" src="https://i.imgur.com/AlA3MSg.png"/>'); // Banned Player
  105.  
  106. // Create badges
  107. TankTrouble.TankInfoBox.classicPlayerBadge = $('<div class="classicBadge"/>');
  108. TankTrouble.TankInfoBox.classicPlayerBadge.append(TankTrouble.TankInfoBox.infoBadgesIcon5);
  109. TankTrouble.TankInfoBox.classicPlayerBadge.append(TankTrouble.TankInfoBox.classicPlayerText);
  110. TankTrouble.TankInfoBox.betaTesterBadge = $('<div class="betaTesterBadge"/>');
  111. TankTrouble.TankInfoBox.betaTesterBadge.append(TankTrouble.TankInfoBox.infoBadgesIcon4);
  112. TankTrouble.TankInfoBox.premiumBadge = $('<div class="premiumMemberBadge"/>');
  113. TankTrouble.TankInfoBox.premiumBadge.append(TankTrouble.TankInfoBox.infoBadgesIcon1);
  114. TankTrouble.TankInfoBox.kickstarterBadge = $('<div class="kickstarterBadge"/>');
  115. TankTrouble.TankInfoBox.kickstarterBadge.append(TankTrouble.TankInfoBox.infoBadgesIcon2);
  116. TankTrouble.TankInfoBox.adminBadge = $('<div class="adminBadge"/>');
  117. TankTrouble.TankInfoBox.adminBadge.append(TankTrouble.TankInfoBox.infoBadgesIcon3);
  118. TankTrouble.TankInfoBox.bannedIcon = $('<div class="bannedIcon"/>');
  119. TankTrouble.TankInfoBox.bannedIcon.append(TankTrouble.TankInfoBox.infoBannedIcon);
  120.  
  121. // Experience progress bar
  122. TankTrouble.TankInfoBox.infoExpDiv = $('<div class="exp tooltipstered"/>');
  123. TankTrouble.TankInfoBox.infoExpTextDiv = $('<div class="progress"/>');
  124. TankTrouble.TankInfoBox.infoExpBorder = $('<div class="border"/>');
  125. TankTrouble.TankInfoBox.infoExpBar = $('<div class="exp-bar"/>');
  126. TankTrouble.TankInfoBox.infoExpText = $('<span class="exp-text"/>');
  127. TankTrouble.TankInfoBox.infoExpTextDiv.append(TankTrouble.TankInfoBox.infoExpBorder);
  128. TankTrouble.TankInfoBox.infoExpTextDiv.append(TankTrouble.TankInfoBox.infoExpBar);
  129. TankTrouble.TankInfoBox.infoExpTextDiv.append(TankTrouble.TankInfoBox.infoExpText);
  130. TankTrouble.TankInfoBox.infoExpDiv.append(TankTrouble.TankInfoBox.infoExpTextDiv);
  131. TankTrouble.TankInfoBox.infoExpDiv.insertAfter(TankTrouble.TankInfoBox.infoRank);
  132.  
  133. // Player additional information element
  134. TankTrouble.TankInfoBox.infoAboutDiv = $('<div class="tooltipstered"/>');
  135. TankTrouble.TankInfoBox.infoAboutTextDiv = $('<div class="about-container"/>');
  136. TankTrouble.TankInfoBox.infoAboutText = $('<span class="about-text"/>');
  137. TankTrouble.TankInfoBox.infoAboutTextDiv.append(TankTrouble.TankInfoBox.infoAboutText);
  138. TankTrouble.TankInfoBox.infoAboutDiv.append(TankTrouble.TankInfoBox.infoAboutTextDiv);
  139. TankTrouble.TankInfoBox.infoAboutDiv.insertAfter(TankTrouble.TankInfoBox.infoName);
  140.  
  141. // Banned information element
  142. TankTrouble.TankInfoBox.infoBannedPlayerDiv = $('<div class="tooltipstered"/>');
  143. TankTrouble.TankInfoBox.infoBannedPlayerTextDiv = $('<div class="bannedText-container"/>');
  144. TankTrouble.TankInfoBox.infoBannedPlayerText = $('<span class="bannedText-text"/>');
  145. TankTrouble.TankInfoBox.infoBannedPlayerTextDiv.append(TankTrouble.TankInfoBox.infoBannedPlayerText);
  146. TankTrouble.TankInfoBox.infoBannedPlayerDiv.append(TankTrouble.TankInfoBox.infoBannedPlayerTextDiv);
  147. TankTrouble.TankInfoBox.infoBannedPlayerDiv.insertAfter(TankTrouble.TankInfoBox.infoRank);
  148.  
  149. // Create a container for the icon and text
  150. TankTrouble.TankInfoBox.infoDeathsDiv = $('<td class="deaths tooltipstered"/>');
  151. TankTrouble.TankInfoBox.infoDeaths = $(`
  152. <div class="statsContainer">
  153. <img class="statsIcon" src="https://i.imgur.com/ze2jYnc.png" srcset="https://i.imgur.com/XIQFQn6.png 2x"/>
  154. <div class="hasSVG">
  155. <svg version="1.1" width="58" height="34">
  156. <text id="deathsTextOutline" x="1" y="22" text-anchor="start" font-family="Arial Black" font-size="14" fill="none" stroke="black" stroke-linejoin="round" stroke-width="3" letter-spacing="1">N/A</text>
  157. <text id="deathsText" x="1" y="22" text-anchor="start" font-family="Arial Black" font-size="14" fill="white" letter-spacing="1">N/A</text>
  158. </svg>
  159. </div>
  160. </div>
  161. `);
  162. TankTrouble.TankInfoBox.infoDeathsDiv.append(TankTrouble.TankInfoBox.infoDeaths);
  163.  
  164. TankTrouble.TankInfoBox.infoDeathsDiv.tooltipster({
  165. content: 'Deaths',
  166. position: 'left',
  167. offsetX: 5
  168. });
  169.  
  170. TankTrouble.TankInfoBox.infoDeathsDiv.insertAfter(TankTrouble.TankInfoBox.infoKillsAndVictoriesTableRow);
  171.  
  172. // Style badges Div
  173. TankTrouble.TankInfoBox.infoBadgesDiv.css({
  174. display: 'flex',
  175. 'align-items': 'center',
  176. 'justify-content': 'center',
  177. 'flex-wrap': 'wrap',
  178. margin: '0px auto',
  179. width: 'fit-content'
  180. });
  181.  
  182. // Icon Styling
  183. // Scale the icons
  184. TankTrouble.TankInfoBox.infoBadgesIcon1.css({
  185. width: '38px',
  186. margin: '0'
  187. });
  188.  
  189. TankTrouble.TankInfoBox.infoBadgesIcon2.css({
  190. width: '38px',
  191. margin: '0'
  192. });
  193.  
  194. TankTrouble.TankInfoBox.infoBadgesIcon3.css({
  195. width: '102px',
  196. margin: '0'
  197. });
  198.  
  199. TankTrouble.TankInfoBox.infoBadgesIcon4.css({
  200. width: '38px',
  201. margin: '0'
  202. });
  203.  
  204. TankTrouble.TankInfoBox.infoBadgesIcon5.css({
  205. width: '38px',
  206. margin: '0'
  207. });
  208.  
  209. TankTrouble.TankInfoBox.infoBannedIcon.css({
  210. width: '200px',
  211. margin: '0',
  212. });
  213.  
  214. TankTrouble.TankInfoBox.classicPlayerBadge.tooltipster({
  215. position: 'top',
  216. offsetX: 0
  217. });
  218.  
  219. TankTrouble.TankInfoBox.betaTesterBadge.tooltipster({
  220. position: 'top',
  221. offsetX: 0
  222. });
  223.  
  224. TankTrouble.TankInfoBox.premiumBadge.tooltipster({
  225. position: 'top',
  226. offsetX: 0
  227. });
  228.  
  229. TankTrouble.TankInfoBox.kickstarterBadge.tooltipster({
  230. position: 'top',
  231. offsetX: 0
  232. });
  233.  
  234. TankTrouble.TankInfoBox.infoExpDiv.tooltipster({
  235. position: 'right',
  236. offsetX: 5
  237. });
  238.  
  239. // Append all elements
  240. TankTrouble.TankInfoBox.infoBadgesDiv.append(TankTrouble.TankInfoBox.classicPlayerBadge);
  241. TankTrouble.TankInfoBox.infoBadgesDiv.append(TankTrouble.TankInfoBox.betaTesterBadge);
  242. TankTrouble.TankInfoBox.infoBadgesDiv.append(TankTrouble.TankInfoBox.premiumBadge);
  243. TankTrouble.TankInfoBox.infoBadgesDiv.append(TankTrouble.TankInfoBox.kickstarterBadge);
  244. TankTrouble.TankInfoBox.infoBadgesDiv.append(TankTrouble.TankInfoBox.adminBadge);
  245. TankTrouble.TankInfoBox.infoBadgesDiv.append(TankTrouble.TankInfoBox.bannedIcon);
  246. TankTrouble.TankInfoBox.infoBadgesDiv.insertBefore(TankTrouble.TankInfoBox.infoRank);
  247.  
  248. // Hide badges by default
  249. TankTrouble.TankInfoBox.infoExpDiv.hide();
  250. TankTrouble.TankInfoBox.infoBadgesDiv.hide();
  251. TankTrouble.TankInfoBox.classicPlayerBadge.hide();
  252. TankTrouble.TankInfoBox.betaTesterBadge.hide();
  253. TankTrouble.TankInfoBox.premiumBadge.hide();
  254. TankTrouble.TankInfoBox.kickstarterBadge.hide();
  255. TankTrouble.TankInfoBox.adminBadge.hide();
  256. });
  257.  
  258. // Display
  259. Loader.interceptFunction(TankTrouble.TankInfoBox, 'show', (original, ...args) => {
  260. original(...args);
  261.  
  262. TankTrouble.TankInfoBox.classicPlayerBadge.tooltipster('content', 'Classic Player');
  263. TankTrouble.TankInfoBox.betaTesterBadge.tooltipster('content', 'Beta Tester');
  264. TankTrouble.TankInfoBox.premiumBadge.tooltipster('content', 'Premium Member');
  265. TankTrouble.TankInfoBox.kickstarterBadge.tooltipster('content', 'Kickstarter Backer');
  266. TankTrouble.TankInfoBox.infoExpDiv.tooltipster('content', 'Classic EXP');
  267.  
  268. const [,, playerId] = args;
  269.  
  270. Backend.getInstance().getPlayerDetails(result => {
  271. if (typeof result === 'object') {
  272. const playerId = result.getPlayerId();
  273. const username = result.getUsername();
  274. const banned = result.getBanned();
  275. const classicPlayer = result.getExperience();
  276. const premiumMember = result.getPremium();
  277. const betaTester = result.getBeta();
  278. const adminMember = result.getGmLevel();
  279. const deaths = result.getDeaths();
  280. const lastLogin = result.getLastLogin();
  281.  
  282. $("#deathsTextOutline").text(deaths);
  283. $("#deathsText").text(deaths);
  284.  
  285. if (deaths > 100000) {
  286. $("#deathsTextOutline").attr("font-size", "12"); // Increase font size
  287. $("#deathsText").attr("font-size", "12"); // Increase font size
  288. } else {
  289. $("#deathsTextOutline").attr("font-size", "14"); // Default size
  290. $("#deathsText").attr("font-size", "14"); // Default size
  291. }
  292.  
  293. // Always show the badges div
  294. TankTrouble.TankInfoBox.infoBadgesDiv.show();
  295.  
  296. // Kickstarter Badge
  297. Backend.getInstance().ajax.getBackers(backerResult => {
  298. const backers = backerResult.result.data;
  299.  
  300. if (backers.includes(username)) {
  301. TankTrouble.TankInfoBox.kickstarterBadge.show();
  302. } else {
  303. TankTrouble.TankInfoBox.kickstarterBadge.hide();
  304. }
  305. });
  306.  
  307. // Classic Player badge & Experience progress bar
  308. if (classicPlayer) {
  309. TankTrouble.TankInfoBox.infoExpDiv.show();
  310. TankTrouble.TankInfoBox.classicPlayerBadge.show();
  311. TankTrouble.TankInfoBox.infoExpText.text(`EXP: ${classicPlayer}`);
  312.  
  313. // Adjust EXP text position based on value
  314. const expTextElement = TankTrouble.TankInfoBox.infoExpText[0];
  315.  
  316. if (classicPlayer <= 9999999) {
  317. expTextElement.style.left = '27%';
  318. }
  319.  
  320. if (classicPlayer <= 999999) {
  321. expTextElement.style.left = '29%';
  322. }
  323.  
  324. if (classicPlayer <= 99999) {
  325. expTextElement.style.left = '32%';
  326. }
  327.  
  328. if (classicPlayer <= 9999) {
  329. expTextElement.style.left = '34%';
  330. }
  331.  
  332. if (classicPlayer <= 999) {
  333. expTextElement.style.left = '35%';
  334. }
  335.  
  336. if (classicPlayer <= 99) {
  337. expTextElement.style.left = '37%';
  338. }
  339.  
  340. } else {
  341. TankTrouble.TankInfoBox.infoExpDiv.hide();
  342. TankTrouble.TankInfoBox.classicPlayerBadge.hide();
  343. }
  344.  
  345. // Display player info or banned message
  346. if (banned) {
  347. TankTrouble.TankInfoBox.bannedIcon.show();
  348. TankTrouble.TankInfoBox.infoAboutDiv.show();
  349. TankTrouble.TankInfoBox.infoAboutText.text(`#${playerId}`);
  350. TankTrouble.TankInfoBox.infoBannedPlayerDiv.show();
  351. TankTrouble.TankInfoBox.infoBannedPlayerText.text(`Player has been permanently banned because of rules violation. Player statistics are counted towards the scrapyard.`);
  352. document.querySelector(".about-container").style.color = "#fff";
  353. document.querySelector("#tankinfo .rank").style.display = "none";
  354. document.querySelector("#tankinfo .xp").style.display = "none";
  355. document.querySelector(".exp.tooltipstered").style.display = "none";
  356. document.querySelector("#tankinfo table").style.display = "none";
  357. document.querySelector(".actions.centered").style.display = "none";
  358. } else if (playerId) {
  359. TankTrouble.TankInfoBox.bannedIcon.hide();
  360. TankTrouble.TankInfoBox.infoBannedPlayerDiv.hide();
  361. TankTrouble.TankInfoBox.infoAboutDiv.show();
  362. TankTrouble.TankInfoBox.infoAboutText.text(`#${playerId}`);
  363. document.querySelector(".about-container").style.color = "";
  364. document.querySelector("#tankinfo .rank").style.display = "";
  365. document.querySelector("#tankinfo .xp").style.display = "";
  366. document.querySelector("#tankinfo table").style.display = "";
  367. document.querySelector(".actions.centered").style.display = "";
  368. } else {
  369. TankTrouble.TankInfoBox.infoAboutDiv.hide();
  370. document.querySelector(".exp.tooltipstered").style.display = "";
  371. }
  372.  
  373. // Show or hide other badges
  374. premiumMember ? TankTrouble.TankInfoBox.premiumBadge.show() : TankTrouble.TankInfoBox.premiumBadge.hide();
  375. betaTester ? TankTrouble.TankInfoBox.betaTesterBadge.show() : TankTrouble.TankInfoBox.betaTesterBadge.hide();
  376. adminMember ? TankTrouble.TankInfoBox.adminBadge.show() : TankTrouble.TankInfoBox.adminBadge.hide();
  377. } else {
  378. TankTrouble.TankInfoBox.infoBadgesDiv.hide();
  379. }
  380.  
  381. }, () => {}, () => {}, playerId, Caches.getPlayerDetailsCache());
  382. });
  383. })();