diff --git a/asset-manifest.json b/asset-manifest.json index 7035c48..b57c4e9 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,8 +1,8 @@ { "files": { "main.css": "/SkillDisplay/static/css/main.af6b9f88.chunk.css", - "main.js": "/SkillDisplay/static/js/main.0c5861c3.chunk.js", - "main.js.map": "/SkillDisplay/static/js/main.0c5861c3.chunk.js.map", + "main.js": "/SkillDisplay/static/js/main.e1247fe5.chunk.js", + "main.js.map": "/SkillDisplay/static/js/main.e1247fe5.chunk.js.map", "runtime-main.js": "/SkillDisplay/static/js/runtime-main.58acd0bf.js", "runtime-main.js.map": "/SkillDisplay/static/js/runtime-main.58acd0bf.js.map", "static/js/2.4d71e7f6.chunk.js": "/SkillDisplay/static/js/2.4d71e7f6.chunk.js", @@ -15,6 +15,6 @@ "static/js/runtime-main.58acd0bf.js", "static/js/2.4d71e7f6.chunk.js", "static/css/main.af6b9f88.chunk.css", - "static/js/main.0c5861c3.chunk.js" + "static/js/main.e1247fe5.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index f1c9502..e4e311e 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -Skill Display
\ No newline at end of file +Skill Display
\ No newline at end of file diff --git a/static/js/main.0c5861c3.chunk.js b/static/js/main.e1247fe5.chunk.js similarity index 97% rename from static/js/main.0c5861c3.chunk.js rename to static/js/main.e1247fe5.chunk.js index b7b7bf2..5d93529 100644 --- a/static/js/main.0c5861c3.chunk.js +++ b/static/js/main.e1247fe5.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonpskilldisplay=this.webpackJsonpskilldisplay||[]).push([[0],{15:function(n,t,e){},17:function(n,t,e){},18:function(n,t,e){},19:function(n,t,e){"use strict";e.r(t);var a=e(0),o=e(1),c=e.n(o),r=e(4),i=e.n(r),s=e(2),u=e(8),d=function(){return/[?&]HOST_PORT=(wss?:\/\/[^&/]+)/.exec(window.location.search)};function f(n){return d()?l(n):function(n){var t=function(t){n.apply(void 0,Object(u.a)(t.detail))};return document.addEventListener("onLogLine",t),function(){document.removeEventListener("onLogLine",t)}}(n)}function l(n){var t="".concat(d()[1],"/BeforeLogLineRead")||!1,e=new WebSocket(t);return e.onerror=function(){return e.close()},e.onclose=function(){return setTimeout((function(){l(n)}),1e3)},e.onmessage=function(t,a){if("."===t.data)return e.send(".");var o=JSON.parse(t.data);return"SendCharName"===o.msgtype?n(o.msg):"Chat"===o.msgtype?n.apply(void 0,Object(u.a)(o.msg.split("|"))):void 0},function(){e.close()}}e(15);var v=e(7),m=e.n(v),p=e(9),j=(e(17),new Set([15997,15998,15999,16e3,16001,16002,16003,16004,16191,16192,16193,16194,16195,16196,7418,16484,16485,16486,2259,18805,2261,18806,2263,18807,2265,18873,18874,18875,2267,18877,2266,18876,2268,18878,16492,16471,16491,2270,18880,2269,18879,2271,18881,2272])),h=new Set([3559,116,114]),b=new Map;function g(n){var t=n.actionId,e=n.additionalClasses,o=c.a.useState(),r=Object(s.a)(o,2),i=r[0],u=r[1];return c.a.useEffect((function(){var n=b.get(t);if(null==n){var e=!0;return Object(p.a)(m.a.mark((function n(){var a;return m.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,fetch("https://xivapi.com/Action/".concat(t,"?columns=Icon,Name,ActionCategoryTargetID"),{mode:"cors"});case 2:return n.next=4,n.sent.json();case 4:a=n.sent,e&&(b.set(t,a),u(a));case 6:case"end":return n.stop()}}),n)})))(),function(){e=!1}}u(n)}),[t]),void 0!==i&&i.Icon?Object(a.jsx)("img",{className:j.has(t)||!h.has(t)&&4!==i.ActionCategoryTargetID?"gcd ".concat(e):"ogcd ".concat(e),src:"https://xivapi.com/".concat(i.Icon),alt:i.Name||""}):null}e(18);function O(n){var t=n.encounterId,e=n.name,o=n.actionList,r=c.a.useState(!1),i=Object(s.a)(r,2),u=i[0],d=i[1];return Object(a.jsxs)(a.Fragment,{children:[Object(a.jsx)("button",{className:u?"rotation-button expanded":"rotation-button",onClick:function(){d((function(n){return!n}))},children:0===t?"Current Rotation":e}),Object(a.jsx)(x,{expanded:u,actionList:o})]})}function x(n){var t=n.expanded,e=n.actionList;return t?Object(a.jsx)("div",{className:"rotation-list",children:e.map((function(n,t){return Object(a.jsx)(g,{actionId:n,additionalClasses:"action-rotation"},t)}))}):null}var w=new Set(["00","01","02","21","22","33"]);function I(){var n=c.a.useState([]),t=Object(s.a)(n,2),e=t[0],o=t[1],r=c.a.useState([]),u=Object(s.a)(r,2),d=u[0],l=u[1];return c.a.useEffect((function(){var n,t="",e=-1,a="Unknown",c=1,r=f((function(){for(var r=function(){l((function(n){return n[0]&&n[0].rotation&&n[0].rotation.length<=0&&n.shift(),n.unshift({name:a,rotation:[]}),n.slice(0,3)}))},s=arguments.length,u=new Array(s),d=0;d2e4)&&(h<100001||h>100300)||v===t&&h===e)){Date.now()-Date.parse(t)>12e4&&r(),t=v,e=h;var b=c%256+1;c=b,i.a.unstable_batchedUpdates((function(){o((function(n){return n.concat({action:h,key:b})})),l((function(n){return n[0]||(n[0]={name:a,rotation:[]}),n[0].rotation.push(h),n}))})),setTimeout((function(){o((function(n){return n.slice(1)}))}),1e4)}}}}));return function(){r()}}),[]),Object(a.jsx)(a.Fragment,{children:Object(a.jsxs)("div",{className:"container",children:[Object(a.jsx)("div",{className:"actions",children:e.map((function(n){var t=n.action,e=n.key;return Object(a.jsx)(g,{actionId:t,additionalClasses:"action-move"},e)}))}),d.map((function(n,t){return Object(a.jsx)(O,{encounterId:t,name:n.name,actionList:n.rotation},t)}))]})})}i.a.render(Object(a.jsx)(I,{}),document.getElementById("root"))}},[[19,1,2]]]); -//# sourceMappingURL=main.0c5861c3.chunk.js.map \ No newline at end of file +(this.webpackJsonpskilldisplay=this.webpackJsonpskilldisplay||[]).push([[0],{15:function(n,t,e){},17:function(n,t,e){},18:function(n,t,e){},19:function(n,t,e){"use strict";e.r(t);var a=e(0),o=e(1),c=e.n(o),r=e(4),i=e.n(r),s=e(2),u=e(8),d=function(){return/[?&]HOST_PORT=(wss?:\/\/[^&/]+)/.exec(window.location.search)};function f(n){return d()?l(n):function(n){var t=function(t){n.apply(void 0,Object(u.a)(t.detail))};return document.addEventListener("onLogLine",t),function(){document.removeEventListener("onLogLine",t)}}(n)}function l(n){var t="".concat(d()[1],"/BeforeLogLineRead")||!1,e=new WebSocket(t);return e.onerror=function(){return e.close()},e.onclose=function(){return setTimeout((function(){l(n)}),1e3)},e.onmessage=function(t,a){if("."===t.data)return e.send(".");var o=JSON.parse(t.data);return"SendCharName"===o.msgtype?n(o.msg):"Chat"===o.msgtype?n.apply(void 0,Object(u.a)(o.msg.split("|"))):void 0},function(){e.close()}}e(15);var v=e(7),m=e.n(v),p=e(9),j=(e(17),new Set([15997,15998,15999,16e3,16001,16002,16003,16004,16191,16192,16193,16194,16195,16196,7418,16484,16485,16486,2259,18805,2261,18806,2263,18807,2265,18873,18874,18875,2267,18877,2266,18876,2268,18878,16492,16471,16491,2270,18880,2269,18879,2271,18881,2272])),h=new Set([3559,116,114]),b=new Map;function g(n){var t=n.actionId,e=n.additionalClasses,o=c.a.useState(),r=Object(s.a)(o,2),i=r[0],u=r[1];return c.a.useEffect((function(){var n=b.get(t);if(null==n){var e=!0;return Object(p.a)(m.a.mark((function n(){var a;return m.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,fetch("https://xivapi.com/Action/".concat(t,"?columns=Icon,Name,ActionCategoryTargetID"),{mode:"cors"});case 2:return n.next=4,n.sent.json();case 4:a=n.sent,e&&(b.set(t,a),u(a));case 6:case"end":return n.stop()}}),n)})))(),function(){e=!1}}u(n)}),[t]),void 0!==i&&i.Icon?Object(a.jsx)("img",{className:j.has(t)||!h.has(t)&&4!==i.ActionCategoryTargetID?"gcd ".concat(e):"ogcd ".concat(e),src:"https://xivapi.com/".concat(i.Icon),alt:i.Name||""}):null}e(18);function O(n){var t=n.encounterId,e=n.name,o=n.actionList,r=c.a.useState(!1),i=Object(s.a)(r,2),u=i[0],d=i[1];return Object(a.jsxs)(a.Fragment,{children:[Object(a.jsx)("button",{className:u?"rotation-button expanded":"rotation-button",onClick:function(){d((function(n){return!n}))},children:0===t?"Current Rotation":e}),Object(a.jsx)(x,{expanded:u,actionList:o})]})}function x(n){var t=n.expanded,e=n.actionList;return t?Object(a.jsx)("div",{className:"rotation-list",children:e.map((function(n,t){return Object(a.jsx)(g,{actionId:n,additionalClasses:"action-rotation"},t)}))}):null}var w=new Set(["00","01","02","21","22","33"]);function I(){var n=c.a.useState([]),t=Object(s.a)(n,2),e=t[0],o=t[1],r=c.a.useState([]),u=Object(s.a)(r,2),d=u[0],l=u[1];return c.a.useEffect((function(){var n,t="",e=-1,a="Unknown",c=1,r=f((function(){for(var r=function(){l((function(n){return n[0]&&n[0].rotation&&n[0].rotation.length<=0&&n.shift(),n.unshift({name:a,rotation:[]}),n.slice(0,3)}))},s=arguments.length,u=new Array(s),d=0;d3e4)&&(h<100001||h>100300)||v===t&&h===e)){Date.now()-Date.parse(t)>12e4&&r(),t=v,e=h;var b=c%256+1;c=b,i.a.unstable_batchedUpdates((function(){o((function(n){return n.concat({action:h,key:b})})),l((function(n){return n[0]||(n[0]={name:a,rotation:[]}),n[0].rotation.push(h),n}))})),setTimeout((function(){o((function(n){return n.slice(1)}))}),1e4)}}}}));return function(){r()}}),[]),Object(a.jsx)(a.Fragment,{children:Object(a.jsxs)("div",{className:"container",children:[Object(a.jsx)("div",{className:"actions",children:e.map((function(n){var t=n.action,e=n.key;return Object(a.jsx)(g,{actionId:t,additionalClasses:"action-move"},e)}))}),d.map((function(n,t){return Object(a.jsx)(O,{encounterId:t,name:n.name,actionList:n.rotation},t)}))]})})}i.a.render(Object(a.jsx)(I,{}),document.getElementById("root"))}},[[19,1,2]]]); +//# sourceMappingURL=main.e1247fe5.chunk.js.map \ No newline at end of file diff --git a/static/js/main.0c5861c3.chunk.js.map b/static/js/main.e1247fe5.chunk.js.map similarity index 98% rename from static/js/main.0c5861c3.chunk.js.map rename to static/js/main.e1247fe5.chunk.js.map index 92feefe..50bc7b7 100644 --- a/static/js/main.0c5861c3.chunk.js.map +++ b/static/js/main.e1247fe5.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["ACTListener.js","Action.js","Rotation.js","App.js","index.js"],"names":["getHost","exec","window","location","search","listenToACT","callback","listenActWebSocket","listener","e","detail","document","addEventListener","removeEventListener","listenOverlayPlugin","wsUri","undefined","ws","WebSocket","onerror","close","onclose","setTimeout","onmessage","m","data","send","obj","JSON","parse","msgtype","msg","split","gcdOverrides","Set","ogcdOverrides","actionMap","Map","Action","actionId","additionalClasses","React","useState","apiData","setApiData","useEffect","mapData","get","current","a","fetch","mode","json","set","Icon","className","has","ActionCategoryTargetID","src","alt","Name","RotationContainer","encounterId","name","actionList","open","setOpen","onClick","RotationContents","expanded","map","action","i","handleCodes","App","setActionList","encounterList","setEncounterList","selfId","lastTimestamp","lastAction","currentZone","lastKey","closeFn","openNewEncounter","rotation","length","shift","unshift","slice","logSplit","charID","logCode","logTimestamp","logParameter1","logParameter2","logParameter3","parseInt","Date","now","key","ReactDOM","unstable_batchedUpdates","concat","push","encounter","render","getElementById"],"mappings":"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","file":"static/js/main.0c5861c3.chunk.js","sourcesContent":["const getHost = () => /[?&]HOST_PORT=(wss?:\\/\\/[^&/]+)/.exec(window.location.search)\n\nexport default function listenToACT(callback) {\n\tif (!getHost()) return listenOverlayPlugin(callback)\n\treturn listenActWebSocket(callback)\n}\n\nfunction listenActWebSocket(callback) {\n\tconst wsUri = `${getHost()[1]}/BeforeLogLineRead` || undefined\n\tconst ws = new WebSocket(wsUri)\n\tws.onerror = () => ws.close()\n\tws.onclose = () =>\n\t\tsetTimeout(() => {\n\t\t\tlistenActWebSocket(callback)\n\t\t}, 1000)\n\tws.onmessage = function(e, m) {\n\t\tif (e.data === \".\") return ws.send(\".\")\n\n\t\tconst obj = JSON.parse(e.data)\n\t\tif (obj.msgtype === \"SendCharName\") {\n\t\t\treturn callback(obj.msg)\n\t\t} else if (obj.msgtype === \"Chat\") {\n\t\t\treturn callback(...obj.msg.split(\"|\"))\n\t\t}\n\t}\n\n\treturn () => {\n\t\tws.close()\n\t}\n}\n\nfunction listenOverlayPlugin(callback) {\n\tconst listener = e => {\n\t\tcallback(...e.detail)\n\t}\n\n\tdocument.addEventListener(\"onLogLine\", listener)\n\n\treturn () => {\n\t\tdocument.removeEventListener(\"onLogLine\", listener)\n\t}\n}\n","import React from \"react\"\nimport \"./css/Action.css\"\n\nconst gcdOverrides = new Set([\n\t15997, //standard step\n\t15998, //technical step\n\t15999,\n\t16000,\n\t16001,\n\t16002, //step actions\n\t16003, //standard finish\n\t16004, //technical finish\n\t16191, //single standard finish\n\t16192, //double standard finish (WHY IS IT LIKE THIS)\n\t16193, //single technical finish\n\t16194, //double technical finish\n\t16195, //triple technical finish\n\t16196, //quadruple technical finish\n\t7418, //flamethrower\n\t16484, //kaeshi higanbana\n\t16485, //kaeshi goken\n\t16486, //kaeshi setsugekka\n\t2259, //ten\n\t18805, \n\t2261, //chi\n\t18806,\n\t2263, //jin\n\t18807,\n\t2265, //fuma shurikan\n\t18873,\n\t18874,\n\t18875,\n\t2267, //raiton\n\t18877,\n\t2266, //katon\n\t18876,\n\t2268, //hyoton\n\t18878,\n\t16492, //hyosho ranryu\n\t16471, //goka meykakku\n\t16491, //goka meykakku (16471 is the PvP version, 16491 is the PvE version)\n\t2270, //doton\n\t18880,\n\t2269, //huton\n\t18879,\n\t2271, //suiton\n\t18881,\n\t2272, //rabbit medium\n])\n\nconst ogcdOverrides = new Set([\n\t3559, //bard WM\n\t116, //bard AP\n\t114 //bard MB\n])\n\nconst actionMap = new Map()\n\nexport default function Action({ actionId, additionalClasses }) {\n\tconst [apiData, setApiData] = React.useState()\n\n\tReact.useEffect(() => {\n\t\tconst mapData = actionMap.get(actionId)\n\t\tif (mapData != null) {\n\t\t\tsetApiData(mapData)\n\t\t\treturn\n\t\t}\n\n\t\tlet current = true\n\t\tvoid (async () => {\n\t\t\tconst data = await (await fetch(`https://xivapi.com/Action/${actionId}?columns=Icon,Name,ActionCategoryTargetID`, {\n\t\t\t\tmode: \"cors\"\n\t\t\t})).json()\n\t\t\tif (current) {\n\t\t\t\tactionMap.set(actionId, data)\n\t\t\t\tsetApiData(data)\n\t\t\t}\n\t\t})()\n\n\t\treturn () => {\n\t\t\tcurrent = false\n\t\t}\n\t}, [actionId])\n\n\tif (apiData === undefined || !apiData.Icon) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t\n\t)\n}\n","import React from \"react\"\nimport \"./css/Rotation.css\"\nimport Action from \"./Action\"\n\nexport default function RotationContainer({ encounterId, name, actionList }) {\n\tconst [open, setOpen] = React.useState(false)\n\n\treturn (\n\t\t<>\n\t\t\t {\n\t\t\t\t\tsetOpen(open => !open)\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{encounterId === 0 ? \"Current Rotation\" : name}\n\t\t\t\n\t\t\t\n\t\t\n\t)\n}\n\nfunction RotationContents({ expanded, actionList }) {\n\tif (!expanded) return null\n\n\treturn (\n\t\t
\n\t\t\t{actionList.map((action, i) => (\n\t\t\t\t\n\t\t\t))}\n\t\t
\n\t)\n}\n","import React from \"react\"\nimport listenToACT from \"./ACTListener\"\nimport \"./css/App.css\"\nimport Action from \"./Action\"\nimport RotationContainer from \"./Rotation\"\nimport ReactDOM from \"react-dom\"\n\nconst handleCodes = new Set([\"00\", \"01\", \"02\", \"21\", \"22\", \"33\"])\n\nexport default function App() {\n\tconst [actionList, setActionList] = React.useState([])\n\tconst [encounterList, setEncounterList] = React.useState([])\n\n\tReact.useEffect(() => {\n\t\tlet selfId\n\t\tlet lastTimestamp = \"\"\n\t\tlet lastAction = -1\n\t\tlet currentZone = \"Unknown\"\n\n\t\tlet lastKey = 1\n\n\t\tlet closeFn = listenToACT((...logSplit) => {\n\t\t\tconst openNewEncounter = () => {\n\t\t\t\tsetEncounterList(encounterList => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tencounterList[0] &&\n\t\t\t\t\t\tencounterList[0].rotation &&\n\t\t\t\t\t\tencounterList[0].rotation.length <= 0\n\t\t\t\t\t) {\n\t\t\t\t\t\tencounterList.shift()\n\t\t\t\t\t}\n\n\t\t\t\t\tencounterList.unshift({\n\t\t\t\t\t\tname: currentZone,\n\t\t\t\t\t\trotation: []\n\t\t\t\t\t})\n\n\t\t\t\t\treturn encounterList.slice(0, 3)\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (logSplit.length === 1 && logSplit[0].charID) {\n\t\t\t\tselfId = logSplit[0].charID\n\t\t\t\topenNewEncounter()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst [\n\t\t\t\tlogCode,\n\t\t\t\tlogTimestamp,\n\t\t\t\tlogParameter1,\n\t\t\t\tlogParameter2,\n\t\t\t\tlogParameter3\n\t\t\t] = logSplit\n\n\t\t\tif (!handleCodes.has(logCode)) return\n\n\t\t\tswitch (logCode) {\n\t\t\t\tcase \"00\":\n\t\t\t\t\tif (logParameter1 === \"0038\" && logParameter3 === \"end\")\n\t\t\t\t\t\topenNewEncounter()\n\t\t\t\t\treturn\n\t\t\t\tcase \"01\":\n\t\t\t\t\tcurrentZone = logParameter2\n\t\t\t\t\treturn\n\t\t\t\tcase \"02\":\n\t\t\t\t\tselfId = parseInt(logParameter1, 16)\n\t\t\t\t\topenNewEncounter()\n\t\t\t\t\treturn\n\t\t\t\tcase \"33\":\n\t\t\t\t\tif (logParameter2 === \"40000012\" || logParameter2 === \"40000010\")\n\t\t\t\t\t\topenNewEncounter()\n\t\t\t\t\treturn\n\t\t\t\tdefault:\n\t\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tif (selfId === undefined) return\n\n\t\t\tif (parseInt(logParameter1, 16) !== selfId) return\n\n\t\t\tconst action = parseInt(logParameter3, 16)\n\n\t\t\tif ( //sanity check the tea sis period wig snapped\n\t\t\t\t((action < 9 || action > 20000) && //is not a combat action\n (action < 100001 || action > 100300)) || //and is not a crafting action\n\t\t\t\t(logTimestamp === lastTimestamp && action === lastAction) //or this action is a bug/duplicate\n\t\t\t)\n\t\t\t\treturn\n\n\t\t\tif (Date.now() - Date.parse(lastTimestamp) > 120000) openNewEncounter() //last action > 120s ago\n\n\t\t\tlastTimestamp = logTimestamp\n\t\t\tlastAction = action\n\n\t\t\tconst key = (lastKey % 256) + 1\n\t\t\tlastKey = key\n\n\t\t\t// This is pretty silly but it's the neatest way to handle the updates going\n\t\t\t// out at the same time, without finding some way to merge the action lists....\n\t\t\tReactDOM.unstable_batchedUpdates(() => {\n\t\t\t\tsetActionList(actionList => actionList.concat({ action, key }))\n\t\t\t\tsetEncounterList(encounterList => {\n\t\t\t\t\tif (!encounterList[0]) {\n\t\t\t\t\t\tencounterList[0] = {\n\t\t\t\t\t\t\tname: currentZone,\n\t\t\t\t\t\t\trotation: []\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tencounterList[0].rotation.push(action)\n\n\t\t\t\t\treturn encounterList\n\t\t\t\t})\n\t\t\t})\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tsetActionList(actionList => actionList.slice(1))\n\t\t\t}, 10000)\n\t\t})\n\n\t\treturn () => {\n\t\t\tcloseFn()\n\t\t}\n\t}, [])\n\n\treturn (\n\t\t<>\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{actionList.map(({ action, key }) => (\n\t\t\t\t\t\t\n\t\t\t\t\t))}\n\t\t\t\t
\n\t\t\t\t{encounterList.map((encounter, i) => (\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\t
\n\t\t\n\t)\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport App from './App'\n\nReactDOM.render(, document.getElementById('root'))\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["ACTListener.js","Action.js","Rotation.js","App.js","index.js"],"names":["getHost","exec","window","location","search","listenToACT","callback","listenActWebSocket","listener","e","detail","document","addEventListener","removeEventListener","listenOverlayPlugin","wsUri","undefined","ws","WebSocket","onerror","close","onclose","setTimeout","onmessage","m","data","send","obj","JSON","parse","msgtype","msg","split","gcdOverrides","Set","ogcdOverrides","actionMap","Map","Action","actionId","additionalClasses","React","useState","apiData","setApiData","useEffect","mapData","get","current","a","fetch","mode","json","set","Icon","className","has","ActionCategoryTargetID","src","alt","Name","RotationContainer","encounterId","name","actionList","open","setOpen","onClick","RotationContents","expanded","map","action","i","handleCodes","App","setActionList","encounterList","setEncounterList","selfId","lastTimestamp","lastAction","currentZone","lastKey","closeFn","openNewEncounter","rotation","length","shift","unshift","slice","logSplit","charID","logCode","logTimestamp","logParameter1","logParameter2","logParameter3","parseInt","Date","now","key","ReactDOM","unstable_batchedUpdates","concat","push","encounter","render","getElementById"],"mappings":"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","file":"static/js/main.e1247fe5.chunk.js","sourcesContent":["const getHost = () => /[?&]HOST_PORT=(wss?:\\/\\/[^&/]+)/.exec(window.location.search)\n\nexport default function listenToACT(callback) {\n\tif (!getHost()) return listenOverlayPlugin(callback)\n\treturn listenActWebSocket(callback)\n}\n\nfunction listenActWebSocket(callback) {\n\tconst wsUri = `${getHost()[1]}/BeforeLogLineRead` || undefined\n\tconst ws = new WebSocket(wsUri)\n\tws.onerror = () => ws.close()\n\tws.onclose = () =>\n\t\tsetTimeout(() => {\n\t\t\tlistenActWebSocket(callback)\n\t\t}, 1000)\n\tws.onmessage = function(e, m) {\n\t\tif (e.data === \".\") return ws.send(\".\")\n\n\t\tconst obj = JSON.parse(e.data)\n\t\tif (obj.msgtype === \"SendCharName\") {\n\t\t\treturn callback(obj.msg)\n\t\t} else if (obj.msgtype === \"Chat\") {\n\t\t\treturn callback(...obj.msg.split(\"|\"))\n\t\t}\n\t}\n\n\treturn () => {\n\t\tws.close()\n\t}\n}\n\nfunction listenOverlayPlugin(callback) {\n\tconst listener = e => {\n\t\tcallback(...e.detail)\n\t}\n\n\tdocument.addEventListener(\"onLogLine\", listener)\n\n\treturn () => {\n\t\tdocument.removeEventListener(\"onLogLine\", listener)\n\t}\n}\n","import React from \"react\"\nimport \"./css/Action.css\"\n\nconst gcdOverrides = new Set([\n\t15997, //standard step\n\t15998, //technical step\n\t15999,\n\t16000,\n\t16001,\n\t16002, //step actions\n\t16003, //standard finish\n\t16004, //technical finish\n\t16191, //single standard finish\n\t16192, //double standard finish (WHY IS IT LIKE THIS)\n\t16193, //single technical finish\n\t16194, //double technical finish\n\t16195, //triple technical finish\n\t16196, //quadruple technical finish\n\t7418, //flamethrower\n\t16484, //kaeshi higanbana\n\t16485, //kaeshi goken\n\t16486, //kaeshi setsugekka\n\t2259, //ten\n\t18805, \n\t2261, //chi\n\t18806,\n\t2263, //jin\n\t18807,\n\t2265, //fuma shurikan\n\t18873,\n\t18874,\n\t18875,\n\t2267, //raiton\n\t18877,\n\t2266, //katon\n\t18876,\n\t2268, //hyoton\n\t18878,\n\t16492, //hyosho ranryu\n\t16471, //goka meykakku\n\t16491, //goka meykakku (16471 is the PvP version, 16491 is the PvE version)\n\t2270, //doton\n\t18880,\n\t2269, //huton\n\t18879,\n\t2271, //suiton\n\t18881,\n\t2272, //rabbit medium\n])\n\nconst ogcdOverrides = new Set([\n\t3559, //bard WM\n\t116, //bard AP\n\t114 //bard MB\n])\n\nconst actionMap = new Map()\n\nexport default function Action({ actionId, additionalClasses }) {\n\tconst [apiData, setApiData] = React.useState()\n\n\tReact.useEffect(() => {\n\t\tconst mapData = actionMap.get(actionId)\n\t\tif (mapData != null) {\n\t\t\tsetApiData(mapData)\n\t\t\treturn\n\t\t}\n\n\t\tlet current = true\n\t\tvoid (async () => {\n\t\t\tconst data = await (await fetch(`https://xivapi.com/Action/${actionId}?columns=Icon,Name,ActionCategoryTargetID`, {\n\t\t\t\tmode: \"cors\"\n\t\t\t})).json()\n\t\t\tif (current) {\n\t\t\t\tactionMap.set(actionId, data)\n\t\t\t\tsetApiData(data)\n\t\t\t}\n\t\t})()\n\n\t\treturn () => {\n\t\t\tcurrent = false\n\t\t}\n\t}, [actionId])\n\n\tif (apiData === undefined || !apiData.Icon) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t\n\t)\n}\n","import React from \"react\"\nimport \"./css/Rotation.css\"\nimport Action from \"./Action\"\n\nexport default function RotationContainer({ encounterId, name, actionList }) {\n\tconst [open, setOpen] = React.useState(false)\n\n\treturn (\n\t\t<>\n\t\t\t {\n\t\t\t\t\tsetOpen(open => !open)\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{encounterId === 0 ? \"Current Rotation\" : name}\n\t\t\t\n\t\t\t\n\t\t\n\t)\n}\n\nfunction RotationContents({ expanded, actionList }) {\n\tif (!expanded) return null\n\n\treturn (\n\t\t
\n\t\t\t{actionList.map((action, i) => (\n\t\t\t\t\n\t\t\t))}\n\t\t
\n\t)\n}\n","import React from \"react\"\nimport listenToACT from \"./ACTListener\"\nimport \"./css/App.css\"\nimport Action from \"./Action\"\nimport RotationContainer from \"./Rotation\"\nimport ReactDOM from \"react-dom\"\n\nconst handleCodes = new Set([\"00\", \"01\", \"02\", \"21\", \"22\", \"33\"])\n\nexport default function App() {\n\tconst [actionList, setActionList] = React.useState([])\n\tconst [encounterList, setEncounterList] = React.useState([])\n\n\tReact.useEffect(() => {\n\t\tlet selfId\n\t\tlet lastTimestamp = \"\"\n\t\tlet lastAction = -1\n\t\tlet currentZone = \"Unknown\"\n\n\t\tlet lastKey = 1\n\n\t\tlet closeFn = listenToACT((...logSplit) => {\n\t\t\tconst openNewEncounter = () => {\n\t\t\t\tsetEncounterList(encounterList => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tencounterList[0] &&\n\t\t\t\t\t\tencounterList[0].rotation &&\n\t\t\t\t\t\tencounterList[0].rotation.length <= 0\n\t\t\t\t\t) {\n\t\t\t\t\t\tencounterList.shift()\n\t\t\t\t\t}\n\n\t\t\t\t\tencounterList.unshift({\n\t\t\t\t\t\tname: currentZone,\n\t\t\t\t\t\trotation: []\n\t\t\t\t\t})\n\n\t\t\t\t\treturn encounterList.slice(0, 3)\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (logSplit.length === 1 && logSplit[0].charID) {\n\t\t\t\tselfId = logSplit[0].charID\n\t\t\t\topenNewEncounter()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst [\n\t\t\t\tlogCode,\n\t\t\t\tlogTimestamp,\n\t\t\t\tlogParameter1,\n\t\t\t\tlogParameter2,\n\t\t\t\tlogParameter3\n\t\t\t] = logSplit\n\n\t\t\tif (!handleCodes.has(logCode)) return\n\n\t\t\tswitch (logCode) {\n\t\t\t\tcase \"00\":\n\t\t\t\t\tif (logParameter1 === \"0038\" && logParameter3 === \"end\")\n\t\t\t\t\t\topenNewEncounter()\n\t\t\t\t\treturn\n\t\t\t\tcase \"01\":\n\t\t\t\t\tcurrentZone = logParameter2\n\t\t\t\t\treturn\n\t\t\t\tcase \"02\":\n\t\t\t\t\tselfId = parseInt(logParameter1, 16)\n\t\t\t\t\topenNewEncounter()\n\t\t\t\t\treturn\n\t\t\t\tcase \"33\":\n\t\t\t\t\tif (logParameter2 === \"40000012\" || logParameter2 === \"40000010\")\n\t\t\t\t\t\topenNewEncounter()\n\t\t\t\t\treturn\n\t\t\t\tdefault:\n\t\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tif (selfId === undefined) return\n\n\t\t\tif (parseInt(logParameter1, 16) !== selfId) return\n\n\t\t\tconst action = parseInt(logParameter3, 16)\n\n\t\t\tif ( //sanity check the tea sis period wig snapped\n\t\t\t\t((action < 9 || action > 30000) && //is not a combat action\n (action < 100001 || action > 100300)) || //and is not a crafting action\n\t\t\t\t(logTimestamp === lastTimestamp && action === lastAction) //or this action is a bug/duplicate\n\t\t\t)\n\t\t\t\treturn\n\n\t\t\tif (Date.now() - Date.parse(lastTimestamp) > 120000) openNewEncounter() //last action > 120s ago\n\n\t\t\tlastTimestamp = logTimestamp\n\t\t\tlastAction = action\n\n\t\t\tconst key = (lastKey % 256) + 1\n\t\t\tlastKey = key\n\n\t\t\t// This is pretty silly but it's the neatest way to handle the updates going\n\t\t\t// out at the same time, without finding some way to merge the action lists....\n\t\t\tReactDOM.unstable_batchedUpdates(() => {\n\t\t\t\tsetActionList(actionList => actionList.concat({ action, key }))\n\t\t\t\tsetEncounterList(encounterList => {\n\t\t\t\t\tif (!encounterList[0]) {\n\t\t\t\t\t\tencounterList[0] = {\n\t\t\t\t\t\t\tname: currentZone,\n\t\t\t\t\t\t\trotation: []\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tencounterList[0].rotation.push(action)\n\n\t\t\t\t\treturn encounterList\n\t\t\t\t})\n\t\t\t})\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tsetActionList(actionList => actionList.slice(1))\n\t\t\t}, 10000)\n\t\t})\n\n\t\treturn () => {\n\t\t\tcloseFn()\n\t\t}\n\t}, [])\n\n\treturn (\n\t\t<>\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{actionList.map(({ action, key }) => (\n\t\t\t\t\t\t\n\t\t\t\t\t))}\n\t\t\t\t
\n\t\t\t\t{encounterList.map((encounter, i) => (\n\t\t\t\t\t\n\t\t\t\t))}\n\t\t\t
\n\t\t\n\t)\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport App from './App'\n\nReactDOM.render(, document.getElementById('root'))\n"],"sourceRoot":""} \ No newline at end of file