Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.92 KB | None | 0 0
  1. Logger = BetterLog.useSpreadsheet("1kmdpcGogAwDT7wyd2HqiOr1rjkPJVpWzyrPSRO3dgRc")
  2.  
  3. function getLogMetaData(logID,excludedPlayers,countTries,includedIds) {
  4.  
  5. //logID="nV9JvKRr612PWQYa"
  6. if(logID==undefined || logID.length==0) return "";
  7.  
  8.  
  9. //var logsJSON = UrlFetchApp.fetch("https://www.warcraftlogs.com:443/v1/reports/guild/untitled+spreadsheet/eredar/eu?start="+date+"&api_key=bafb317c52cb13076ff2a3f3363371f1");
  10.  
  11. var logJSON = UrlFetchApp.fetch("https://www.warcraftlogs.com:443/v1/report/fights/"+logID+"?api_key=0f9e772cb350e61d740df5b391e383b1");
  12. var log = Utilities.jsonParse(logJSON.getContentText());
  13.  
  14. //get first mythic boss fight
  15. var day = log.start/1000;
  16. var first=undefined;
  17. var last=undefined;
  18. for(var i=0;i<log.fights.length;i++) {
  19. var fight = log.fights[i];
  20. if(first == undefined && fight.difficulty == 5 ) {
  21. first = fight;
  22. }
  23. if(last !=undefined && fight.difficulty && fight.difficulty != 5) {
  24. break;
  25. }
  26. last = fight;
  27. }
  28.  
  29.  
  30. var ms = new Date(day+last.end_time)-new Date(day+first.start_time)
  31. var divisor = 1000*60*60*24
  32. var duration = ms /divisor;
  33.  
  34. return [new Date(log.start),getPlayersSorted(log.friendlies,excludedPlayers),getNumberOfTries(log.fights,includedIds), getNumberOfKills(log.fights,includedIds),duration,getStartEndTimes(log),getFightIds(log.fights)];
  35.  
  36. }
  37.  
  38. /***
  39. **/
  40. function getIncludedIdsFromRange(includedIdsArray) {
  41. var includedIds = []
  42. for(var i=0; i<includedIdsArray.length;i++) {
  43. if(includedIdsArray[i][0]==true) {
  44. includedIds.push(includedIdsArray[i][1]);
  45. }
  46. }
  47. return includedIds;
  48. }
  49.  
  50. /***
  51. **/
  52. function getFightIds(fights) {
  53. var validBossIDs=[2076,2074,2070,2064,2075,2082,2088,2069,2073,2063,2092] //vari is 2069
  54. var bossIDs = []
  55. for(var i=0; i <fights.length;i++) {
  56. if(contains(validBossIDs,fights[i].boss) && fights[i].difficulty == 5) {
  57. bossIDs.push([fights[i].id,fights[i].boss].join(","))
  58. }
  59. }
  60. return bossIDs.join("-");
  61. }
  62.  
  63. /***
  64. **/
  65. function possibleTwinks(logRange, charStructure, ignorePlayers) {
  66. //ignored players
  67. var ignos = ignorePlayers.split("-");
  68.  
  69. // find all players in logs
  70. var totalChars = []
  71. for(var i=0;i<logRange[0].length;i++) {
  72. var log = logRange[0][i];
  73. var players = log.split("-");
  74. for(var j=0;j<players.length;j++) {
  75. var charName = players[j].split(",")[0];
  76. // add char if not already in list and not ingored
  77. if(!contains(totalChars,charName)&&!contains(ignos,charName)) totalChars.push(charName)
  78. }
  79. }
  80.  
  81. var knownChars = [];
  82. //maps twinks to mains
  83. for(var i=0;i<charStructure.length;i++) {
  84. var cell = charStructure[i][0]
  85. if(cell.length>0) {
  86. var chars = cell.split("-")
  87.  
  88. for(var c = 0;c<chars.length;c++) {
  89. knownChars.push(chars[c]);
  90. }
  91. }
  92. }
  93.  
  94. var possibleChars = [];
  95. for(var j = 0;j<totalChars.length;j++){
  96. if(!contains(knownChars,totalChars[j])) possibleChars.push(totalChars[j])
  97. }
  98. return possibleChars;
  99.  
  100. }
  101.  
  102. /***
  103. **/
  104. function stripName(name) {
  105. return name.replace(/\s/g,'').replace("-","")
  106. }
  107.  
  108. /***
  109. **/
  110. function getTotalDeathsFromLogs(playerName,logRange,mainsTwinks,merge) {
  111. var charStructure = makeCharStructure(mainsTwinks)
  112. playerName=stripName(playerName);
  113. var chars = getCharactersOfPlayer(charStructure, playerName)
  114.  
  115. var counter = 0;
  116. for(var i=0;i<logRange[0].length;i++) {
  117. var log = logRange[0][i];
  118. var players = log.split("-");
  119. for(var j=0;j<players.length;j++) {
  120. if(merge) {
  121. if(contains(chars,players[j])) counter++;
  122. } else {
  123. if(playerName==players[j]) counter++;
  124. }
  125. }
  126. }
  127. return counter;
  128. }
  129.  
  130. /***
  131. **/
  132. function getNumberOfTries(fights,includedIds) {
  133.  
  134. var includedIds = getIncludedIdsFromRange(includedIds)
  135. var bossIDs = []
  136. for(var i=0; i <fights.length;i++) {
  137. if(contains(includedIds,fights[i].boss) && fights[i].difficulty == 5) {
  138. bossIDs.push(fights[i].id)
  139. }
  140. }
  141. return bossIDs.length;
  142. }
  143.  
  144.  
  145. /***
  146. **/
  147. function getNumberOfKills(fights,includedIds) {
  148. var includedIds = getIncludedIdsFromRange(includedIds)
  149. var bossIDs = []
  150. for(var i=0; i <fights.length;i++) {
  151. if(contains(includedIds,fights[i].boss) && fights[i].kill && fights[i].difficulty ==5) {
  152. bossIDs.push(fights[i].id)
  153. }
  154. }
  155. return bossIDs.length;
  156. }
  157.  
  158. /***
  159. **/
  160. function getPlayersSorted(friendlies,excludedPlayers) {
  161.  
  162. if(friendlies.length==0) return "";
  163. if(!excludedPlayers) return""
  164. excludedPlayers = excludedPlayers.split("-")
  165.  
  166. var playerNames = []
  167. var invalidTypes = ["NPC","Boss","Pet"]
  168. for(var i=0; i<friendlies.length;i++) {
  169.  
  170. if(!contains(invalidTypes,friendlies[i].type) && !contains(excludedPlayers,friendlies[i].name)) {
  171.  
  172. playerNames.push([friendlies[i].name,friendlies[i].type])
  173.  
  174. }
  175. }
  176. playerNames.sort();
  177. return playerNames.join("-")
  178. }
  179.  
  180. /***
  181. **/
  182. function getClasses(playerArea, logs) {
  183. var classes = [];
  184. for(var i =0;i<playerArea.length;i++) {
  185. var name = playerArea[i][0];
  186. name = stripName(name);
  187. if(name.length<1) continue;
  188. var found = false;
  189. //go through logs to find class
  190. for(var p=0;p<logs[0].length;p++) {
  191. var log = logs[0][p];
  192.  
  193. //iterate over players per log
  194. if(log.length>0) {
  195. var split = log.split("-")
  196.  
  197. //split input per log
  198. for (var j=0;j<split.length;j++) {
  199. var split2 = split[j].split(",")
  200. if(split2[0]==name) {
  201. //player class found
  202. var class = split2[1]
  203. classes.push(class)
  204. found=true;
  205. break;
  206. }
  207. }
  208. if(found) break;
  209. }
  210. }
  211. if(!found) classes.push("")
  212. }
  213. return classes;
  214. }
  215.  
  216. /***
  217. **/
  218. function getStartEndTimes(log) {
  219. var fights = log.fights;
  220. var times = [];
  221. /*for(var i=0;i<fights.length;i++) {
  222. var t = [fights[i].start_time,fights[i].end_time]
  223. times.push(t);
  224. }*/
  225. // return times.join("-");
  226. var start = fights[0].start_time
  227. var end = fights[fights.length-1].end_time
  228. return [start,end].join(",")
  229. }
  230.  
  231. /***
  232. **/
  233. function getDeaths(logID,times,cutoff,mainsTwinks,fightIdsCell, includedIdsArray) {
  234.  
  235. if(logID==undefined || logID.length==0) return "";
  236.  
  237. if(cutoff==0 || cutoff==undefined) cutoff=100;
  238. var chars = charStructureToList(mainsTwinks);
  239.  
  240. var includedIds = getIncludedIdsFromRange(includedIdsArray)
  241.  
  242. var fightIdsSplit = fightIdsCell.split("-");
  243. var fightIds=[];
  244. for(var i=0;i<fightIdsSplit.length;i++) {
  245. var id = fightIdsSplit[i].split(",")[0]
  246. var bossId = fightIdsSplit[i].split(",")[1];
  247. if(contains(includedIds,bossId)) {
  248. fightIds.push(id);
  249. }
  250. }
  251.  
  252. //restore start end times
  253. var start = times.split(",")[0]
  254. var end = times.split(",")[1]
  255.  
  256. //get log to this fight
  257. //hymsi key: bafb317c52cb13076ff2a3f3363371f1
  258. //leo key: 0f9e772cb350e61d740df5b391e383b1
  259. // hauex key: 836d35ba618368db3fbfe970da5cc81b
  260. var logJSON = UrlFetchApp.fetch("https://www.warcraftlogs.com:443/v1/report/tables/deaths/"+logID+"?start="+start+"&end="+end+"&cutoff="+(cutoff+2)+"&api_key=bafb317c52cb13076ff2a3f3363371f1");
  261. var log = Utilities.jsonParse(logJSON.getContentText());
  262.  
  263. var entries = log.entries
  264. var deaths = [];
  265. var deathCounter=0;
  266. var id = 0;
  267. for (var i = 0;i<entries.length;i++) {
  268. var entry = entries[i];
  269. if(contains(chars,entry.name)) { //only look up chars from the squad
  270. if(!contains(fightIds,entry.fight)) {
  271. // if the id is not a valid fight id (e.g. because boss was excluded), continue
  272. continue;
  273. }
  274. if(id!=entry.fight) {
  275. //new fight
  276. id = entry.fight;
  277. deaths.push(entry.name);
  278. deathCounter = 1;
  279. } else {
  280. //same fight
  281. if(deathCounter==cutoff) {
  282. //deathCounter reached -> continue to next entry
  283. continue;
  284. } else {
  285. deaths.push(entry.name);
  286. deathCounter++;
  287. }
  288. }
  289. }
  290. }
  291.  
  292. return deaths.join("-");
  293. }
  294.  
  295.  
  296. /***
  297. **/
  298. function getParticipation(logID,playerArea,mainsTwinks,mergeTwinks,countTries,includedIds) {
  299.  
  300.  
  301.  
  302. //var logsJSON = UrlFetchApp.fetch("https://www.warcraftlogs.com:443/v1/reports/guild/untitled+spreadsheet/eredar/eu?start="+date+"&api_key=0f9e772cb350e61d740df5b391e383b1");
  303. if(logID.length==0) return "";
  304.  
  305. var logJSON = UrlFetchApp.fetch("https://www.warcraftlogs.com:443/v1/report/fights/"+logID+"?api_key=836d35ba618368db3fbfe970da5cc81b");
  306. var log = Utilities.jsonParse(logJSON.getContentText());
  307.  
  308. var charStructure = makeCharStructure(mainsTwinks)
  309. var fights = log.fights
  310.  
  311. var includedIds = getIncludedIdsFromRange(includedIds)
  312.  
  313. // get IDs of boss tries
  314. var bossIDs = []
  315. // garothi - felhounds - high command - Hasabel - Eonar - Imonar - Kingaroth - Vari - Coven - Aggramar - Argus
  316. var validBossIDs=[2076,2074,2070,2064,2075,2082,2088,2069,2073,2063,2092]
  317. for(var i=0; i<fights.length;i++) {
  318. //exclude trash fights (boss=0), non mythic fights (difficulty !=5), non Antorusfights (boss not in range)
  319. if(contains(includedIds,fights[i].boss) && fights[i].difficulty==5) {
  320. if(!countTries) { //only count kills
  321. if(fights[i].kill) bossIDs.push(fights[i].id)
  322. }else{
  323. bossIDs.push(fights[i].id)
  324. }
  325. }
  326. }
  327.  
  328. var friendlies = log.friendlies
  329. var participation=[]
  330. for(var x = 0;x<playerArea.length;x++) {
  331. var name = playerArea[x][0];
  332. if(!name || name.length<1) continue;
  333. name = stripName(name)
  334. //get all characters of that player
  335. var chars = getCharactersOfPlayer(charStructure, name)
  336. Logger.log("Chars: "+chars)
  337.  
  338. var playerNames = [];
  339.  
  340. //find playerNames in logs
  341. for(var i=0; i<friendlies.length;i++) {
  342. if(mergeTwinks) {
  343. if(contains(chars,friendlies[i].name)) {
  344. playerNames.push(friendlies[i]);
  345. }
  346. } else {
  347. if(friendlies[i].name==name)
  348. playerNames.push(friendlies[i])
  349. }
  350. }
  351.  
  352.  
  353. if(playerNames.length == 0) participation.push(0);
  354. else {
  355. var tries = 0;
  356. // get for each char name of the player each fight id he participated in
  357. for(var j=0;j<playerNames.length;j++) {
  358. for(var i=0;i<playerNames[j].fights.length;i++){
  359. var id = playerNames[j].fights[i].id;
  360.  
  361. if(contains(bossIDs,id)) tries++;
  362. }
  363. }
  364.  
  365. participation.push(tries)
  366. }
  367. }
  368. return participation
  369. }
  370.  
  371. /***
  372. **/
  373. function getCharactersOfPlayer(charStructure, main) {
  374. var chars = [main]
  375. for(var twink in charStructure) {
  376.  
  377. if(charStructure.hasOwnProperty(twink)) {
  378. if(charStructure[twink] == main) {
  379. chars.push(twink)
  380. }
  381. }
  382. }
  383. return chars
  384.  
  385. }
  386.  
  387. /***
  388. **/
  389. function contains(array,obj) {
  390. for(var i=0;i<array.length;i++) {
  391. if(array[i]==obj) return true;
  392. }
  393. return false;
  394. }
  395.  
  396. /***
  397. **/
  398. function contains2D(array,obj) {
  399. for(var i=0;i<array.length;i++) {
  400. var first = array[i][0]
  401. if(first==obj) return true;
  402. }
  403. return false;
  404. }
  405.  
  406. /***
  407. **/
  408. function makeCharStructure(mainsTwinks) {
  409. var charStructure = {}
  410. //maps twinks to mains
  411. for(var i=0;i<mainsTwinks.length;i++) {
  412. var cell = mainsTwinks[i][0]
  413. if(cell.length>0) {
  414. var chars = cell.split("-")
  415.  
  416. for(var c = 1;c<chars.length;c++) {
  417. var main = chars[0]
  418. var twink = chars[c]
  419. charStructure[twink] = main;
  420.  
  421. }
  422. }
  423. }
  424. return charStructure;
  425. }
  426.  
  427.  
  428. /***
  429. **/
  430. function getCharacters(range,splitter,mainsTwinks,mergeTwinks) {
  431.  
  432. var charStructure = makeCharStructure(mainsTwinks)
  433. Logger.log(charStructure)
  434.  
  435. var names = [];
  436. //iterate over players per log
  437. for (var i=0;i<range[0].length;i++) {
  438. if(range[0][i].length>0) {
  439. var split = range[0][i].split(splitter)
  440.  
  441. //split input per log
  442. for (var j=0;j<split.length;j++) {
  443. var split2 = split[j].split(",")
  444. var name = split2[0]
  445. var class = split2[1]
  446. if(!contains2D(names,name)) { //only add each name once
  447.  
  448. var main = charStructure[name]
  449. Logger.log(main)
  450. // 1. solo main -> main immer undefined, oben oder unten je nach mergeTwinks
  451. // 2. main mit twink -> main immer undefined
  452. // 3. twink -> main defined -> wird nur hinzugefügt wenn mergeTwinks = False
  453. if(mergeTwinks) {
  454. if(main==undefined) names.push([name,class])
  455. } else {
  456. names.push([name,class])
  457. }
  458. }
  459. }
  460. }
  461. }
  462. return names.sort(function(a,b) {
  463. var nameA = a[0].toUpperCase(); // ignore upper and lowercase
  464. var nameB = b[0].toUpperCase(); // ignore upper and lowercase
  465. if (nameA < nameB) {
  466. return -1;
  467. }
  468. if (nameA > nameB) {
  469. return 1;
  470. }
  471.  
  472. // names must be equal
  473. return 0;
  474. });
  475. }
  476.  
  477. /***
  478. **/
  479. function getCharactersFromList(mainsTwinks,mergeTwinks) {
  480. var mains = [];
  481. for(var i=0;i<mainsTwinks.length;i++) {
  482. var cell = mainsTwinks[i][0]
  483. if(cell.length>0) {
  484. var chars = cell.split("-")
  485.  
  486. mains.push(chars[0])
  487. if(!mergeTwinks)
  488. for(var j=1; j<chars.length;j++){
  489. mains.push("- "+chars[j]);
  490. }
  491. }
  492. }
  493. return mains;
  494. }
  495.  
  496. /***
  497. **/
  498. function charStructureToList(mainsTwinks) {
  499. var mains = [];
  500. for(var i=0;i<mainsTwinks.length;i++) {
  501. var cell = mainsTwinks[i][0]
  502. if(cell.length>0) {
  503. var chars = cell.split("-")
  504.  
  505. mains.push(chars[0])
  506. for(var j=1; j<chars.length;j++){
  507. mains.push(chars[j]);
  508. }
  509. }
  510. }
  511. return mains;
  512. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement