TW Friends

Friend Management for The West Events

目前为 2014-07-06 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name TW Friends
  3. // @version 0.03
  4. // @description Friend Management for The West Events
  5. // @author hiroaki
  6. // @include http://*.the-west.*/game.php*
  7. // @namespace https://greasyfork.org/users/3197
  8. // ==/UserScript==
  9.  
  10.  
  11. function hf(fn) {
  12. var script = document.createElement('script');
  13. script.setAttribute("type", "application/javascript");
  14. script.textContent = '(' + fn + ')();';
  15. document.body.appendChild(script);
  16. document.body.removeChild(script);
  17. }
  18.  
  19. hf (function() {
  20. var VERSION = 0.03;
  21. var eventName = 'Independence';
  22. var refreshMs = 2 * 60 * 1000; // 2 minutes
  23.  
  24. HiroFriends = {
  25. version: VERSION,
  26. storageItem: "HiroFriends.version",
  27. eventName : '',
  28. eventInfo : {},
  29. friends : [],
  30. total : 0,
  31. avail: 0,
  32. };
  33. HiroFriends.init = function(eventName) {
  34. if (undefined === Game.sesData[eventName] || undefined === Game.sesData[eventName].friendsbar) return false;
  35. HiroFriends.eventName = eventName;
  36. HiroFriends.eventInfo = Game.sesData[eventName].friendsbar;
  37. var base_href = (undefined === Game.cdnURL) ? "http://westzz.innogamescdn.com" : Game.cdnURL;
  38. var hiro_div = document.createElement('div');
  39. var event_image = base_href + "/images/interface/friendsbar/events/Independence.png"; // to be based on the event
  40. hiro_div.setAttribute("style", "position: absolute; top: 32px; right: 50%; margin-right: 120px; z-index: 16; width: 180px; height: 36px; text-align: left; text-shadow: 1px 1px 1px #000; background: url('"+base_href+"/images/interface/custom_unit_counter_sprite.png?2') no-repeat scroll 50% 0px transparent;");
  41. hiro_div.innerHTML='<div id="hiro_friends" style="background: url(\''+base_href+'/images/interface/custom_unit_counter_sprite.png?2\') no-repeat scroll 0 -36px rgba(0, 0, 0, 0); color: #f8c57c; font-size: 13pt; height: 25px; left: 32px; line-height: 25px; padding: 0 5px; position: absolute; text-align: right; top: 3px; width: 105px; z-index: 1; text-shadow: 1px 1px 1px #000;"></div><span style="width: 36px; height: 36px; position: absolute; left: 8px; top: 3px; z-index: 3"><a href="#" onClick="MessageSuccess(\'Fetching friends list\').show(); HiroFriends.fetch(); return false;"><img src="data:image/png;base64,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" style="width: 24px; height: 24px;" alt="" title="Refresh"></a></span><span style="width: 26px; height: 26px; left: auto; position: absolute; right: 7px; top: 2px; z-index: 3;" title=""><a href="#" onclick="HiroFriends.open(); return false;"><img src="'+event_image+'" style="width: 26px; height: 26px;" alt="" title="'+HiroFriends.eventInfo.label+'"></a></span>';
  42. document.body.appendChild(hiro_div);
  43. if(typeof(Storage) !== "undefined") {
  44. var previousVersion = (localStorage.getItem(HiroFriends.storageItem) === null) ? 0 : parseFloat(localStorage.getItem(HiroFriends.storageItem));
  45. localStorage.setItem(HiroFriends.storageItem, HiroFriends.version);
  46. // if (HiroFriends.version > previousVersion) var msg=new west.gui.Dialog("TW Friends", "Script was updated to version "+HiroFriends.version, west.gui.Dialog.SYS_WARNING).addButton("OK").show();
  47. }
  48. return true;
  49. };
  50. HiroFriends.compare = function (a,b) {
  51. if (a.time < b.time) return -1;
  52. if (a.time > b.time) return 1;
  53. return 0;
  54. };
  55. HiroFriends.open = function() {
  56. if (!WestUi.FriendsBar.hidden) WestUi.FriendsBar.toggle();
  57. HiroFriends.fetch().done(function() {;
  58. var td;
  59. var idx = 1;
  60. var tbl = $('<table style="width: 100%" border="0" cellpadding="0" cellspacing="0">');
  61. $.each(HiroFriends.friends, function (key, val) {
  62. if (val.time > 0) td = $('<td style="vertical-align: middle;">(' + val.time.formatDurationBuffWay() + ')</td>');
  63. else {
  64. td = $('<td style="vertical-align: middle;"><a href="#">' + HiroFriends.eventInfo.label + "</a></td>").click({ id: val.id, ev: HiroFriends.eventName }, function (e) {
  65. $(this).parent().remove();
  66. var t = e.handleObj.data;
  67. Ajax.remoteCall("friendsbar", "event", { player_id: t.id, event: t.ev }, function (e) {
  68. if (e.error) return MessageError(e.msg).show();
  69. MessageSuccess(e.msg).show();
  70. HiroFriends.friends[key].time = HiroFriends.eventInfo.cooldown;
  71. if (HiroFriends.avail) -- HiroFriends.avail;
  72. HiroFriends.update();
  73. })
  74. })
  75. }
  76. tbl.append($('<tr style="background-image: url(\'/images/tw2gui/table/table_row_mark.png\'); height: 29px;">)').append($('<td style="width: 10%; vertical-align: middle; text-align: right; padding-right: 8px">' + idx + '.</td><td style="width: 35%; vertical-align: middle;"><a href="javascript:void(PlayerProfileWindow.open('+val.id+'));">' + val.name + "</a></td>"), td))
  77. ++ idx;
  78. });
  79. var hiroWindow = wman.open("HiroFriends_"+HiroFriends.eventName, null, "noreload").setMiniTitle(HiroFriends.eventInfo.label).setTitle(HiroFriends.eventInfo.label);
  80. var hiroPane = new west.gui.Scrollpane;
  81. hiroPane.appendContent(tbl);
  82. hiroWindow.appendToContentPane(hiroPane.getMainDiv())
  83. });
  84. };
  85. HiroFriends.update = function() {
  86. document.getElementById("hiro_friends").innerHTML = HiroFriends.avail+' <span style="color: #d3d3d3; font-size: 11px;">/ '+HiroFriends.total+'</span>';
  87. }
  88. HiroFriends.fetch = function() {
  89. if (interval !== false) clearInterval (interval);
  90. var event_times = {};
  91. var friends = [], total = 0, avail = 0;
  92. var server_time = (new ServerDate).getTime() / 1e3, activation_time, friend_time;
  93. return $.post( "/game.php?window=friendsbar&mode=search", { search_type: "friends" } , function (data) {
  94. $.each(data.eventActivations, function (key, val) {
  95. if (val.event_name == HiroFriends.eventName) event_times[val.friend_id] = val.activation_time;
  96. });
  97. $.each(data.players, function (key, val) {
  98. if (val.name !== Character.name) {
  99. activation_time = (event_times[val.player_id] !== undefined) ? event_times[val.player_id]: 0;
  100. friend_time = activation_time + HiroFriends.eventInfo.cooldown - server_time;
  101. friends.push ({ id: val.player_id, name: val.name, time: friend_time });
  102. ++ total;
  103. if (friend_time <= 0) ++ avail;
  104. }
  105. });
  106. if (total) friends.sort(HiroFriends.compare);
  107. HiroFriends.friends = friends;
  108. HiroFriends.avail = avail;
  109. HiroFriends.total = total;
  110. interval = setInterval(function() { HiroFriends.fetch(); }, refreshMs);
  111. HiroFriends.update();
  112. });
  113. };
  114. var interval = false;
  115. if (HiroFriends.init(eventName)) HiroFriends.fetch();
  116. });