wtf

wtf t4esr

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.gf.qytechs.cn/scripts/539401/1607518/wtf.js

  1. Tabs.TruceMonitor = {
  2. tabOrder: 2180,
  3. tabLabel: 'Truce Monitor',
  4. tabDisabled: false,
  5. myDiv: null,
  6. targets: [],
  7. timer: null,
  8. checkInterval: 5 * 60 * 1000, // Check every 5 minutes
  9.  
  10. init: function(div) {
  11. var t = Tabs.TruceMonitor;
  12. t.myDiv = div;
  13.  
  14. if (!Options.TruceMonitorOptions) {
  15. Options.TruceMonitorOptions = {
  16. targets: [],
  17. alertSound: true,
  18. chatAlert: true,
  19. notifyMinutes: 30
  20. };
  21. }
  22.  
  23. t.targets = Options.TruceMonitorOptions.targets || [];
  24. t.paint();
  25. },
  26.  
  27. paint: function() {
  28. var t = Tabs.TruceMonitor;
  29. var m = '<DIV class="divHeader" align="center">Truce Monitor</div>';
  30.  
  31. m += '<div style="padding:10px;">';
  32. m += '<table width="100%">';
  33. m += '<tr><td width="30%">Player Name or UID:</td>';
  34. m += '<td><input type="text" id="truceMonitorTarget" style="width:200px" class="btInput"></td></tr>';
  35. m += '<tr><td colspan="2" align="center"><input type="button" id="addTruceTarget" value="Add Target" class="buttonv2 std green"></td></tr>';
  36. m += '</table>';
  37.  
  38. m += '<div style="max-height:300px; overflow-y:auto; margin-top:10px;">';
  39. m += '<table width="100%" id="truceMonitorTable" class="xtab">';
  40. m += '<tr><th width="40%">Player</th><th width="40%">Truce Status</th><th width="20%">Actions</th></tr>';
  41. m += '</table></div>';
  42.  
  43. m += '<div style="margin-top:10px; border-top:1px solid #888; padding-top:10px;">';
  44. m += '<table width="100%">';
  45. m += '<tr><td width="50%"><input type="checkbox" id="truceMonitorSound" ' + (Options.TruceMonitorOptions.alertSound ? 'checked' : '') + '> Play sound alert</td>';
  46. m += '<td><input type="checkbox" id="truceMonitorChat" ' + (Options.TruceMonitorOptions.chatAlert ? 'checked' : '') + '> Send chat alert</td></tr>';
  47. m += '<tr><td colspan="2">Notify when <input type="text" id="truceMonitorMinutes" size="3" value="' + Options.TruceMonitorOptions.notifyMinutes + '" class="btInput"> minutes remain</td></tr>';
  48. m += '</table></div>';
  49.  
  50. m += '</div>';
  51.  
  52. t.myDiv.innerHTML = m;
  53.  
  54. document.getElementById('addTruceTarget').addEventListener('click', t.addTarget, false);
  55. document.getElementById('truceMonitorSound').addEventListener('change', function () {
  56. Options.TruceMonitorOptions.alertSound = this.checked;
  57. saveOptions();
  58. }, false);
  59. document.getElementById('truceMonitorChat').addEventListener('change', function () {
  60. Options.TruceMonitorOptions.chatAlert = this.checked;
  61. saveOptions();
  62. }, false);
  63. document.getElementById('truceMonitorMinutes').addEventListener('change', function () {
  64. Options.TruceMonitorOptions.notifyMinutes = parseInt(this.value) || 30;
  65. saveOptions();
  66. }, false);
  67.  
  68. t.displayTargets();
  69.  
  70. // Start monitoring
  71. if (t.timer) clearTimeout(t.timer);
  72. t.timer = setTimeout(t.checkStatus, 10000);
  73. },
  74.  
  75. addTarget: function() {
  76. var t = Tabs.TruceMonitor;
  77. var input = document.getElementById('truceMonitorTarget').value.trim();
  78. if (!input) return;
  79.  
  80. // Check if input is a UID (number) or name
  81. var isUID = !isNaN(input);
  82. var targetInfo = null;
  83.  
  84. if (isUID) {
  85. // Search by UID
  86. targetInfo = t.findPlayerByUID(input);
  87. } else {
  88. // Search by name
  89. targetInfo = t.findPlayerByName(input);
  90. }
  91.  
  92. if (targetInfo) {
  93. // Check if already in list
  94. for (var i = 0; i < t.targets.length; i++) {
  95. if (t.targets[i].uid == targetInfo.uid) {
  96. alert('This player is already in your monitor list!');
  97. return;
  98. }
  99. }
  100.  
  101. t.targets.push({
  102. uid: targetInfo.uid,
  103. name: targetInfo.name,
  104. lastTruceCheck: 0,
  105. truceEnd: 0,
  106. notified: false
  107. });
  108.  
  109. Options.TruceMonitorOptions.targets = t.targets;
  110. saveOptions();
  111. t.displayTargets();
  112. document.getElementById('truceMonitorTarget').value = '';
  113.  
  114. // Check the new target immediately
  115. t.checkTargetNow(t.targets.length - 1);
  116. } else {
  117. alert('Player not found. Please check the name or UID.');
  118. }
  119. },
  120.  
  121. findPlayerByUID: function(uid) {
  122. // This function searches the game data for a player with this UID
  123. for (var p in Seed.players) {
  124. if (p == uid) {
  125. return { uid: p, name: Seed.players[p].n };
  126. }
  127. }
  128. return null;
  129. },
  130.  
  131. findPlayerByName: function(name) {
  132. // Search for player by name
  133. // Case insensitive search
  134. name = name.toLowerCase();
  135.  
  136. for (var p in Seed.players) {
  137. if (Seed.players[p].n.toLowerCase() == name) {
  138. return { uid: p, name: Seed.players[p].n };
  139. }
  140. }
  141. return null;
  142. },
  143.  
  144. displayTargets: function() {
  145. var t = Tabs.TruceMonitor;
  146. var table = document.getElementById('truceMonitorTable');
  147. if (!table) return;
  148.  
  149. // Keep the header row
  150. while (table.rows.length > 1) {
  151. table.deleteRow(1);
  152. }
  153.  
  154. for (var i = 0; i < t.targets.length; i++) {
  155. var target = t.targets[i];
  156. var row = table.insertRow(-1);
  157.  
  158. // Player name
  159. var cell = row.insertCell(0);
  160. cell.innerHTML = target.name;
  161.  
  162. // Truce status
  163. cell = row.insertCell(1);
  164. if (target.truceEnd > 0) {
  165. var timeLeft = target.truceEnd - unixTime();
  166. if (timeLeft > 0) {
  167. cell.innerHTML = 'Active: ' + timeFormatShort(timeLeft);
  168. if (timeLeft < Options.TruceMonitorOptions.notifyMinutes * 60) {
  169. cell.style.color = 'red';
  170. cell.style.fontWeight = 'bold';
  171. }
  172. } else {
  173. cell.innerHTML = 'Expired';
  174. }
  175. } else {
  176. cell.innerHTML = 'Unknown';
  177. }
  178.  
  179. // Actions
  180. cell = row.insertCell(2);
  181. cell.innerHTML = '<a href="#" onclick="Tabs.TruceMonitor.removeTarget(' + i + '); return false;">Remove</a> | ' +
  182. '<a href="#" onclick="Tabs.TruceMonitor.checkTargetNow(' + i + '); return false;">Check Now</a>';
  183. }
  184. },
  185.  
  186. removeTarget: function(index) {
  187. var t = Tabs.TruceMonitor;
  188. if (index >= 0 && index < t.targets.length) {
  189. t.targets.splice(index, 1);
  190. Options.TruceMonitorOptions.targets = t.targets;
  191. saveOptions();
  192. t.displayTargets();
  193. }
  194. },
  195.  
  196. checkTargetNow: function(index) {
  197. var t = Tabs.TruceMonitor;
  198. if (index >= 0 && index < t.targets.length) {
  199. var target = t.targets[index];
  200.  
  201. // Make API call to get player status
  202. t.fetchPlayerStatus(target.uid, function (status) {
  203. if (status) {
  204. t.updateTargetStatus(index, status);
  205. t.displayTargets();
  206. }
  207. });
  208. }
  209. },
  210.  
  211. fetchPlayerStatus: function(uid, callback) {
  212. // Make API call to get player's truce status
  213. var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams);
  214. params.pid = uid;
  215. params.tab = 1;
  216.  
  217. new Ajax.Request(unsafeWindow.g_ajaxpath + "ajax/viewCourt.php" + unsafeWindow.g_ajaxsuffix, {
  218. method: "post",
  219. parameters: params,
  220. onSuccess: function (transport) {
  221. try {
  222. var data = eval("(" + transport.responseText + ")");
  223. if (data.ok) {
  224. var status = {
  225. truceEnd: 0
  226. };
  227.  
  228. // Parse truce status
  229. if (data.truce && data.truce.et) {
  230. status.truceEnd = data.truce.et;
  231. }
  232.  
  233. callback(status);
  234. } else {
  235. callback(null);
  236. }
  237. } catch (e) {
  238. logit("Error parsing player status: " + e);
  239. callback(null);
  240. }
  241. },
  242. onFailure: function () {
  243. logit("Failed to fetch player status");
  244. callback(null);
  245. }
  246. });
  247. },
  248.  
  249. updateTargetStatus: function(index, status) {
  250. var t = Tabs.TruceMonitor;
  251. if (index >= 0 && index < t.targets.length) {
  252. var now = unixTime();
  253. var target = t.targets[index];
  254. target.truceEnd = status.truceEnd;
  255. target.lastTruceCheck = now;
  256. // Reset notification flag if status has changed
  257. if (target.truceEnd > 0 && target.truceEnd - now > Options.TruceMonitorOptions.notifyMinutes * 60) {
  258. target.notified = false;
  259. }
  260. Options.TruceMonitorOptions.targets = t.targets;
  261. saveOptions();
  262. }
  263. },
  264.  
  265. checkStatus: function() {
  266. var t = Tabs.TruceMonitor;
  267. var now = unixTime();
  268. // Check each target
  269. for (var i = 0; i < t.targets.length; i++) {
  270. var target = t.targets[i];
  271. // Check if truce is about to expire
  272. if (target.truceEnd > 0) {
  273. var timeLeft = target.truceEnd - now;
  274. if (timeLeft > 0 && timeLeft <= Options.TruceMonitorOptions.notifyMinutes * 60 && !target.notified) {
  275. // Notify user
  276. var minutesLeft = Math.ceil(timeLeft / 60);
  277. var message = target.name + "'s truce will expire in " + minutesLeft + " minutes!";
  278. if (Options.TruceMonitorOptions.alertSound) {
  279. AudioManager.play('boing');
  280. }
  281. if (Options.TruceMonitorOptions.chatAlert) {
  282. if (Tabs.chatPane) {
  283. Tabs.chatPane.addToChat({
  284. msg: message,
  285. sender: "TruceMonitor",
  286. alliance: false,
  287. notification: true
  288. });
  289. }
  290. }
  291. // Mark as notified
  292. target.notified = true;
  293. Options.TruceMonitorOptions.targets = t.targets;
  294. saveOptions();
  295. }
  296. }
  297. // Check if we need to refresh the status
  298. var lastCheckTime = target.lastTruceCheck || 0;
  299. if (now - lastCheckTime > t.checkInterval) {
  300. // Time to check this target again
  301. t.checkTargetNow(i);
  302. }
  303. }
  304. // Update display if tab is visible
  305. if (t.myDiv.style.display != 'none') {
  306. t.displayTargets();
  307. }
  308. // Schedule next check
  309. if (t.timer) clearTimeout(t.timer);
  310. t.timer = setTimeout(t.checkStatus, t.checkInterval);
  311. }
  312. };

QingJ © 2025

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