diff --git a/asset-manifest.json b/asset-manifest.json index dec9473..42ccfd9 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,14 +1,14 @@ { "files": { "main.css": "/SkillDisplay/static/css/main.8bf682fd.chunk.css", - "main.js": "/SkillDisplay/static/js/main.3f178d92.chunk.js", - "main.js.map": "/SkillDisplay/static/js/main.3f178d92.chunk.js.map", + "main.js": "/SkillDisplay/static/js/main.5fe728b2.chunk.js", + "main.js.map": "/SkillDisplay/static/js/main.5fe728b2.chunk.js.map", "runtime~main.js": "/SkillDisplay/static/js/runtime~main.6fa6fa5b.js", "runtime~main.js.map": "/SkillDisplay/static/js/runtime~main.6fa6fa5b.js.map", "static/js/2.f5e5b090.chunk.js": "/SkillDisplay/static/js/2.f5e5b090.chunk.js", "static/js/2.f5e5b090.chunk.js.map": "/SkillDisplay/static/js/2.f5e5b090.chunk.js.map", "index.html": "/SkillDisplay/index.html", - "precache-manifest.b501b4f68c4338228de45595126c673e.js": "/SkillDisplay/precache-manifest.b501b4f68c4338228de45595126c673e.js", + "precache-manifest.9b1ce4d3b7302825bfceb1fd20fd5dba.js": "/SkillDisplay/precache-manifest.9b1ce4d3b7302825bfceb1fd20fd5dba.js", "service-worker.js": "/SkillDisplay/service-worker.js", "static/css/main.8bf682fd.chunk.css.map": "/SkillDisplay/static/css/main.8bf682fd.chunk.css.map" } diff --git a/index.html b/index.html index 8a850c9..01d6d1f 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/precache-manifest.b501b4f68c4338228de45595126c673e.js b/precache-manifest.9b1ce4d3b7302825bfceb1fd20fd5dba.js similarity index 67% rename from precache-manifest.b501b4f68c4338228de45595126c673e.js rename to precache-manifest.9b1ce4d3b7302825bfceb1fd20fd5dba.js index 50055fb..42ab7e0 100644 --- a/precache-manifest.b501b4f68c4338228de45595126c673e.js +++ b/precache-manifest.9b1ce4d3b7302825bfceb1fd20fd5dba.js @@ -1,10 +1,10 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ { - "revision": "115d0b9c631589773d57b90dcde8e47f", + "revision": "f47c1c267cc68db0708f584ef50cc097", "url": "/SkillDisplay/index.html" }, { - "revision": "a3a17935306de4b779a1", + "revision": "3f880bc8272e24ea684a", "url": "/SkillDisplay/static/css/main.8bf682fd.chunk.css" }, { @@ -12,8 +12,8 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ "url": "/SkillDisplay/static/js/2.f5e5b090.chunk.js" }, { - "revision": "a3a17935306de4b779a1", - "url": "/SkillDisplay/static/js/main.3f178d92.chunk.js" + "revision": "3f880bc8272e24ea684a", + "url": "/SkillDisplay/static/js/main.5fe728b2.chunk.js" }, { "revision": "07d6cdaf79d2bef9e0e6", diff --git a/service-worker.js b/service-worker.js index 308398e..b117f59 100644 --- a/service-worker.js +++ b/service-worker.js @@ -14,7 +14,7 @@ importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); importScripts( - "/SkillDisplay/precache-manifest.b501b4f68c4338228de45595126c673e.js" + "/SkillDisplay/precache-manifest.9b1ce4d3b7302825bfceb1fd20fd5dba.js" ); self.addEventListener('message', (event) => { diff --git a/static/js/main.3f178d92.chunk.js b/static/js/main.3f178d92.chunk.js deleted file mode 100644 index 8b05c14..0000000 --- a/static/js/main.3f178d92.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonpskilldisplay=window.webpackJsonpskilldisplay||[]).push([[0],[,,,,,,,function(n,t,e){n.exports=e(16)},,,,,function(n,t,e){},,function(n,t,e){},function(n,t,e){},function(n,t,e){"use strict";e.r(t);var a=e(0),o=e.n(a),r=e(2),c=e.n(r),i=e(1),u=e(4),s=function(){return/HOST_PORT=(wss?:\/\/.+)/.exec(window.location.search)};function l(n){return s()?function n(t){var e=new URLSearchParams(window.location.search);var a="".concat(e.get("HOST_PORT"),"BeforeLogLineRead")||!1;var o=new WebSocket(a);o.onerror=function(){return o.close()};o.onclose=function(){return setTimeout(function(){n(t)},1e3)};o.onmessage=function(n,e){if("."===n.data)return o.send(".");var a=JSON.parse(n.data);return"SendCharName"===a.msgtype?t(a.msg):"Chat"===a.msgtype?t.apply(void 0,Object(u.a)(a.msg.split("|"))):void 0};return function(){o.close()}}(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)}e(12);var d=e(3),f=e.n(d),m=e(6),v=(e(14),new Set([15997,15998,15999,16e3,16001,16002,16003,16004,16191,16192,16193,16194,16195,16196,7418,16483])),p=new Set([3559,116,114]);function h(n){var t=n.actionId,e=n.additionalClasses,a=o.a.useState(),r=Object(i.a)(a,2),c=r[0],u=r[1];return o.a.useEffect(function(){var n=!0;return Object(m.a)(f.a.mark(function e(){var a;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch("https://xivapi.com/Action/".concat(t),{mode:"cors"});case 2:return e.next=4,e.sent.json();case 4:a=e.sent,n&&u(a);case 6:case"end":return e.stop()}},e)}))(),function(){n=!1}},[t]),void 0!==c&&c.Icon?o.a.createElement("img",{className:v.has(t)||!p.has(t)&&4!==c.ActionCategory.ID?"gcd ".concat(e):"ogcd ".concat(e),src:"https://xivapi.com/".concat(c.Icon),alt:c.Name||""}):null}e(15);function w(n){var t=n.encounterId,e=n.name,a=n.actionList,r=o.a.useState(!1),c=Object(i.a)(r,2),u=c[0],s=c[1];return o.a.createElement(o.a.Fragment,null,o.a.createElement("button",{className:u?"rotation-button expanded":"rotation-button",onClick:function(){s(function(n){return!n})}},0===t?"Current Rotation":e),o.a.createElement(g,{expanded:u,actionList:a}))}function g(n){var t=n.expanded,e=n.actionList;return t?o.a.createElement("div",{className:"rotation-list"},e.map(function(n,t){return o.a.createElement(h,{key:t,actionId:n,additionalClasses:"action-rotation"})})):null}var E=new Set(["00","01","02","21","22","33"]);c.a.render(o.a.createElement(function(){var n=o.a.useState([]),t=Object(i.a)(n,2),e=t[0],a=t[1],r=o.a.useState([]),u=Object(i.a)(r,2),s=u[0],d=u[1];return o.a.useEffect(function(){var n,t="",e=-1,o="Unknown",r=1,i=l(function(){for(var i=function(){d(function(n){return n[0]&&n[0].rotation&&n[0].rotation.length<=0&&n.shift(),n.unshift({name:o,rotation:[]}),n.slice(0,3)})},u=arguments.length,s=new Array(u),l=0;l12e4&&i(),t=m,e=w;var g=r%256+1;r=g,c.a.unstable_batchedUpdates(function(){a(function(n){return n.concat({action:w,key:g})}),d(function(n){return n[0]||(n[0]={name:o,rotation:[]}),n[0].rotation.push(w),n})}),setTimeout(function(){a(function(n){return n.slice(1)})},1e4)}}}});return function(){i()}},[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"container"},o.a.createElement("div",{className:"actions"},e.map(function(n){var t=n.action,e=n.key;return o.a.createElement(h,{key:e,actionId:t,additionalClasses:"action-move"})})),s.map(function(n,t){return o.a.createElement(w,{key:t,encounterId:t,name:n.name,actionList:n.rotation})})))},null),document.getElementById("root"))}],[[7,1,2]]]); -//# sourceMappingURL=main.3f178d92.chunk.js.map \ No newline at end of file diff --git a/static/js/main.3f178d92.chunk.js.map b/static/js/main.3f178d92.chunk.js.map deleted file mode 100644 index 2ea7b0f..0000000 --- a/static/js/main.3f178d92.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["ACTListener.js","Action.js","Rotation.js","App.js","index.js"],"names":["getHost","exec","window","location","search","listenToACT","callback","listenActWebSocket","url","URLSearchParams","wsUri","get","undefined","ws","WebSocket","onerror","close","onclose","setTimeout","onmessage","e","m","data","send","obj","JSON","parse","msgtype","msg","split","listener","detail","document","addEventListener","removeEventListener","listenOverlayPlugin","gcdOverrides","Set","ogcdOverrides","Action","actionId","additionalClasses","React","useState","apiData","setApiData","useEffect","current","a","fetch","mode","json","Icon","className","has","ActionCategory","ID","src","alt","Name","RotationContainer","encounterId","name","actionList","open","setOpen","onClick","RotationContents","expanded","map","action","i","key","handleCodes","ReactDOM","render","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","unstable_batchedUpdates","concat","push","encounter","getElementById"],"mappings":"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","file":"static/js/main.3f178d92.chunk.js","sourcesContent":["const getHost = () => /HOST_PORT=(wss?:\\/\\/.+)/.exec(window.location.search)\r\n\r\nexport default function listenToACT(callback) {\r\n\tif (!getHost()) return listenOverlayPlugin(callback)\r\n\treturn listenActWebSocket(callback)\r\n}\r\n\r\nfunction listenActWebSocket(callback) {\r\n\tconst url = new URLSearchParams(window.location.search)\r\n\tconst wsUri = `${url.get(\"HOST_PORT\")}BeforeLogLineRead` || undefined\r\n\tconst ws = new WebSocket(wsUri)\r\n\tws.onerror = () => ws.close()\r\n\tws.onclose = () =>\r\n\t\tsetTimeout(() => {\r\n\t\t\tlistenActWebSocket(callback)\r\n\t\t}, 1000)\r\n\tws.onmessage = function(e, m) {\r\n\t\tif (e.data === \".\") return ws.send(\".\")\r\n\r\n\t\tconst obj = JSON.parse(e.data)\r\n\t\tif (obj.msgtype === \"SendCharName\") {\r\n\t\t\treturn callback(obj.msg)\r\n\t\t} else if (obj.msgtype === \"Chat\") {\r\n\t\t\treturn callback(...obj.msg.split(\"|\"))\r\n\t\t}\r\n\t}\r\n\r\n\treturn () => {\r\n\t\tws.close()\r\n\t}\r\n}\r\n\r\nfunction listenOverlayPlugin(callback) {\r\n\tconst listener = e => {\r\n\t\tcallback(...e.detail)\r\n\t}\r\n\r\n\tdocument.addEventListener(\"onLogLine\", listener)\r\n\r\n\treturn () => {\r\n\t\tdocument.removeEventListener(\"onLogLine\", listener)\r\n\t}\r\n}\r\n","import React from \"react\"\r\nimport \"./css/Action.css\"\r\n\r\nconst gcdOverrides = new Set([\r\n\t15997, //standard step\r\n\t15998, //technical step\r\n\t15999,\r\n\t16000,\r\n\t16001,\r\n\t16002, //step actions\r\n\t16003, //standard finish\r\n\t16004, //technical finish\r\n\t16191, //single standard finish\r\n\t16192, //double standard finish (WHY IS IT LIKE THIS)\r\n\t16193, //single technical finish\r\n\t16194, //double technical finish\r\n\t16195, //triple technical finish\r\n\t16196, //quadruple technical finish\r\n\t7418, //flamethrower\r\n\t16483 //tsubame-gaeshi\r\n])\r\n\r\nconst ogcdOverrides = new Set([\r\n\t3559, //bard WM\r\n\t116, //bard AP\r\n\t114 //bard MB\r\n])\r\n\r\nexport default function Action({ actionId, additionalClasses }) {\r\n\tconst [apiData, setApiData] = React.useState()\r\n\r\n\tReact.useEffect(() => {\r\n\t\tlet current = true\r\n\t\tvoid (async () => {\r\n\t\t\tconst data = await (await fetch(`https://xivapi.com/Action/${actionId}`, {\r\n\t\t\t\tmode: \"cors\"\r\n\t\t\t})).json()\r\n\t\t\tif (current) {\r\n\t\t\t\tsetApiData(data)\r\n\t\t\t}\r\n\t\t})()\r\n\r\n\t\treturn () => {\r\n\t\t\tcurrent = false\r\n\t\t}\r\n\t}, [actionId])\r\n\r\n\tif (apiData === undefined || !apiData.Icon) {\r\n\t\treturn null\r\n\t}\r\n\r\n\treturn (\r\n\t\t\r\n\t)\r\n}\r\n","import React from \"react\"\r\nimport \"./css/Rotation.css\"\r\nimport Action from \"./Action\"\r\n\r\nexport default function RotationContainer({ encounterId, name, actionList }) {\r\n\tconst [open, setOpen] = React.useState(false)\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t {\r\n\t\t\t\t\tsetOpen(open => !open)\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t{encounterId === 0 ? \"Current Rotation\" : name}\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t)\r\n}\r\n\r\nfunction RotationContents({ expanded, actionList }) {\r\n\tif (!expanded) return null\r\n\r\n\treturn (\r\n\t\t
\r\n\t\t\t{actionList.map((action, i) => (\r\n\t\t\t\t\r\n\t\t\t))}\r\n\t\t
\r\n\t)\r\n}\r\n","import React from \"react\"\r\nimport listenToACT from \"./ACTListener\"\r\nimport \"./css/App.css\"\r\nimport Action from \"./Action\"\r\nimport RotationContainer from \"./Rotation\"\r\nimport ReactDOM from \"react-dom\"\r\n\r\nconst handleCodes = new Set([\"00\", \"01\", \"02\", \"21\", \"22\", \"33\"])\r\n\r\nexport default function App() {\r\n\tconst [actionList, setActionList] = React.useState([])\r\n\tconst [encounterList, setEncounterList] = React.useState([])\r\n\r\n\tReact.useEffect(() => {\r\n\t\tlet selfId\r\n\t\tlet lastTimestamp = \"\"\r\n\t\tlet lastAction = -1\r\n\t\tlet currentZone = \"Unknown\"\r\n\r\n\t\tlet lastKey = 1\r\n\r\n\t\tlet closeFn = listenToACT((...logSplit) => {\r\n\t\t\tconst openNewEncounter = () => {\r\n\t\t\t\tsetEncounterList(encounterList => {\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tencounterList[0] &&\r\n\t\t\t\t\t\tencounterList[0].rotation &&\r\n\t\t\t\t\t\tencounterList[0].rotation.length <= 0\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tencounterList.shift()\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tencounterList.unshift({\r\n\t\t\t\t\t\tname: currentZone,\r\n\t\t\t\t\t\trotation: []\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\treturn encounterList.slice(0, 3)\r\n\t\t\t\t})\r\n\t\t\t}\r\n\r\n\t\t\tif (logSplit.length === 1 && logSplit[0].charID) {\r\n\t\t\t\tselfId = logSplit[0].charID\r\n\t\t\t\topenNewEncounter()\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tconst [\r\n\t\t\t\tlogCode,\r\n\t\t\t\tlogTimestamp,\r\n\t\t\t\tlogParameter1,\r\n\t\t\t\tlogParameter2,\r\n\t\t\t\tlogParameter3\r\n\t\t\t] = logSplit\r\n\r\n\t\t\tif (!handleCodes.has(logCode)) return\r\n\r\n\t\t\tswitch (logCode) {\r\n\t\t\t\tcase \"00\":\r\n\t\t\t\t\tif (logParameter1 === \"0038\" && logParameter3 === \"end\")\r\n\t\t\t\t\t\topenNewEncounter()\r\n\t\t\t\t\treturn\r\n\t\t\t\tcase \"01\":\r\n\t\t\t\t\tcurrentZone = logParameter2\r\n\t\t\t\t\treturn\r\n\t\t\t\tcase \"02\":\r\n\t\t\t\t\tselfId = parseInt(logParameter1, 16)\r\n\t\t\t\t\topenNewEncounter()\r\n\t\t\t\t\treturn\r\n\t\t\t\tcase \"33\":\r\n\t\t\t\t\tif (logParameter2 === \"40000012\" || logParameter2 === \"40000010\")\r\n\t\t\t\t\t\topenNewEncounter()\r\n\t\t\t\t\treturn\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak\r\n\t\t\t}\r\n\r\n\t\t\tif (selfId === undefined) return\r\n\r\n\t\t\tif (parseInt(logParameter1, 16) !== selfId) return\r\n\r\n\t\t\tconst action = parseInt(logParameter3, 16)\r\n\r\n\t\t\tif (\r\n\t\t\t\taction <= 8 ||\r\n\t\t\t\t(logTimestamp === lastTimestamp && action === lastAction)\r\n\t\t\t)\r\n\t\t\t\treturn\r\n\r\n\t\t\tif (Date.now() - Date.parse(lastTimestamp) > 120000) openNewEncounter() //last action > 120s ago\r\n\r\n\t\t\tlastTimestamp = logTimestamp\r\n\t\t\tlastAction = action\r\n\r\n\t\t\tconst key = (lastKey % 256) + 1\r\n\t\t\tlastKey = key\r\n\r\n\t\t\t// This is pretty silly but it's the neatest way to handle the updates going\r\n\t\t\t// out at the same time, without finding some way to merge the action lists....\r\n\t\t\tReactDOM.unstable_batchedUpdates(() => {\r\n\t\t\t\tsetActionList(actionList => actionList.concat({ action, key }))\r\n\t\t\t\tsetEncounterList(encounterList => {\r\n\t\t\t\t\tif (!encounterList[0]) {\r\n\t\t\t\t\t\tencounterList[0] = {\r\n\t\t\t\t\t\t\tname: currentZone,\r\n\t\t\t\t\t\t\trotation: []\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tencounterList[0].rotation.push(action)\r\n\r\n\t\t\t\t\treturn encounterList\r\n\t\t\t\t})\r\n\t\t\t})\r\n\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tsetActionList(actionList => actionList.slice(1))\r\n\t\t\t}, 10000)\r\n\t\t})\r\n\r\n\t\treturn () => {\r\n\t\t\tcloseFn()\r\n\t\t}\r\n\t}, [])\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t{actionList.map(({ action, key }) => (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t))}\r\n\t\t\t\t
\r\n\t\t\t\t{encounterList.map((encounter, i) => (\r\n\t\t\t\t\t\r\n\t\t\t\t))}\r\n\t\t\t
\r\n\t\t\r\n\t)\r\n}\r\n","import React from 'react'\r\nimport ReactDOM from 'react-dom'\r\nimport App from './App'\r\n\r\nReactDOM.render(, document.getElementById('root'))\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/main.5fe728b2.chunk.js b/static/js/main.5fe728b2.chunk.js new file mode 100644 index 0000000..8b7cf85 --- /dev/null +++ b/static/js/main.5fe728b2.chunk.js @@ -0,0 +1,2 @@ +(window.webpackJsonpskilldisplay=window.webpackJsonpskilldisplay||[]).push([[0],[,,,,,,,function(n,e,t){n.exports=t(16)},,,,,function(n,e,t){},,function(n,e,t){},function(n,e,t){},function(n,e,t){"use strict";t.r(e);var a=t(0),o=t.n(a),r=t(2),c=t.n(r),i=t(1),s=t(4),u=function(){return/HOST_PORT=(wss?:\/\/.+)/.exec(window.location.search)};function l(n){return u()?function n(e){var t=new URLSearchParams(window.location.search);var a="".concat(t.get("HOST_PORT"),"BeforeLogLineRead")||!1;var o=new WebSocket(a);o.onerror=function(){return o.close()};o.onclose=function(){return setTimeout(function(){n(e)},1e3)};o.onmessage=function(n,t){if("."===n.data)return o.send(".");var a=JSON.parse(n.data);return"SendCharName"===a.msgtype?e(a.msg):"Chat"===a.msgtype?e.apply(void 0,Object(s.a)(a.msg.split("|"))):void 0};return function(){o.close()}}(n):function(n){var e=function(e){var t=e.detail.message;n.apply(void 0,Object(s.a)(t))};return document.addEventListener("onLogLine",e),function(){document.removeEventListener("onLogLine",e)}}(n)}t(12);var d=t(3),f=t.n(d),m=t(6),v=(t(14),new Set([15997,15998,15999,16e3,16001,16002,16003,16004,16191,16192,16193,16194,16195,16196,7418,16483])),p=new Set([3559,116,114]);function h(n){var e=n.actionId,t=n.additionalClasses,a=o.a.useState(),r=Object(i.a)(a,2),c=r[0],s=r[1];return o.a.useEffect(function(){var n=!0;return Object(m.a)(f.a.mark(function t(){var a;return f.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,fetch("https://xivapi.com/Action/".concat(e),{mode:"cors"});case 2:return t.next=4,t.sent.json();case 4:a=t.sent,n&&s(a);case 6:case"end":return t.stop()}},t)}))(),function(){n=!1}},[e]),void 0!==c&&c.Icon?o.a.createElement("img",{className:v.has(e)||!p.has(e)&&4!==c.ActionCategory.ID?"gcd ".concat(t):"ogcd ".concat(t),src:"https://xivapi.com/".concat(c.Icon),alt:c.Name||""}):null}t(15);function w(n){var e=n.encounterId,t=n.name,a=n.actionList,r=o.a.useState(!1),c=Object(i.a)(r,2),s=c[0],u=c[1];return o.a.createElement(o.a.Fragment,null,o.a.createElement("button",{className:s?"rotation-button expanded":"rotation-button",onClick:function(){u(function(n){return!n})}},0===e?"Current Rotation":t),o.a.createElement(g,{expanded:s,actionList:a}))}function g(n){var e=n.expanded,t=n.actionList;return e?o.a.createElement("div",{className:"rotation-list"},t.map(function(n,e){return o.a.createElement(h,{key:e,actionId:n,additionalClasses:"action-rotation"})})):null}var E=new Set(["00","01","02","21","22","33"]);c.a.render(o.a.createElement(function(){var n=o.a.useState([]),e=Object(i.a)(n,2),t=e[0],a=e[1],r=o.a.useState([]),s=Object(i.a)(r,2),u=s[0],d=s[1];return o.a.useEffect(function(){var n,e="",t=-1,o="Unknown",r=1,i=l(function(){for(var i=function(){d(function(n){return n[0]&&n[0].rotation&&n[0].rotation.length<=0&&n.shift(),n.unshift({name:o,rotation:[]}),n.slice(0,3)})},s=arguments.length,u=new Array(s),l=0;l12e4&&i(),e=m,t=w;var g=r%256+1;r=g,c.a.unstable_batchedUpdates(function(){a(function(n){return n.concat({action:w,key:g})}),d(function(n){return n[0]||(n[0]={name:o,rotation:[]}),n[0].rotation.push(w),n})}),setTimeout(function(){a(function(n){return n.slice(1)})},1e4)}}}});return function(){i()}},[]),o.a.createElement(o.a.Fragment,null,o.a.createElement("div",{className:"container"},o.a.createElement("div",{className:"actions"},t.map(function(n){var e=n.action,t=n.key;return o.a.createElement(h,{key:t,actionId:e,additionalClasses:"action-move"})})),u.map(function(n,e){return o.a.createElement(w,{key:e,encounterId:e,name:n.name,actionList:n.rotation})})))},null),document.getElementById("root"))}],[[7,1,2]]]); +//# sourceMappingURL=main.5fe728b2.chunk.js.map \ No newline at end of file diff --git a/static/js/main.5fe728b2.chunk.js.map b/static/js/main.5fe728b2.chunk.js.map new file mode 100644 index 0000000..efc42ef --- /dev/null +++ b/static/js/main.5fe728b2.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["ACTListener.js","Action.js","Rotation.js","App.js","index.js"],"names":["getHost","exec","window","location","search","listenToACT","callback","listenActWebSocket","url","URLSearchParams","wsUri","get","undefined","ws","WebSocket","onerror","close","onclose","setTimeout","onmessage","e","m","data","send","obj","JSON","parse","msgtype","msg","split","listener","message","detail","document","addEventListener","removeEventListener","listenOverlayPlugin","gcdOverrides","Set","ogcdOverrides","Action","actionId","additionalClasses","React","useState","apiData","setApiData","useEffect","current","a","fetch","mode","json","Icon","className","has","ActionCategory","ID","src","alt","Name","RotationContainer","encounterId","name","actionList","open","setOpen","onClick","RotationContents","expanded","map","action","i","key","handleCodes","ReactDOM","render","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","unstable_batchedUpdates","concat","push","encounter","getElementById"],"mappings":"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","file":"static/js/main.5fe728b2.chunk.js","sourcesContent":["const getHost = () => /HOST_PORT=(wss?:\\/\\/.+)/.exec(window.location.search)\r\n\r\nexport default function listenToACT(callback) {\r\n\tif (!getHost()) return listenOverlayPlugin(callback)\r\n\treturn listenActWebSocket(callback)\r\n}\r\n\r\nfunction listenActWebSocket(callback) {\r\n\tconst url = new URLSearchParams(window.location.search)\r\n\tconst wsUri = `${url.get(\"HOST_PORT\")}BeforeLogLineRead` || undefined\r\n\tconst ws = new WebSocket(wsUri)\r\n\tws.onerror = () => ws.close()\r\n\tws.onclose = () =>\r\n\t\tsetTimeout(() => {\r\n\t\t\tlistenActWebSocket(callback)\r\n\t\t}, 1000)\r\n\tws.onmessage = function(e, m) {\r\n\t\tif (e.data === \".\") return ws.send(\".\")\r\n\r\n\t\tconst obj = JSON.parse(e.data)\r\n\t\tif (obj.msgtype === \"SendCharName\") {\r\n\t\t\treturn callback(obj.msg)\r\n\t\t} else if (obj.msgtype === \"Chat\") {\r\n\t\t\treturn callback(...obj.msg.split(\"|\"))\r\n\t\t}\r\n\t}\r\n\r\n\treturn () => {\r\n\t\tws.close()\r\n\t}\r\n}\r\n\r\nfunction listenOverlayPlugin(callback) {\r\n\tconst listener = e => {\r\n\t\tconst {message} = e.detail\r\n\t\tcallback(...message)\r\n\t}\r\n\r\n\tdocument.addEventListener(\"onLogLine\", listener)\r\n\r\n\treturn () => {\r\n\t\tdocument.removeEventListener(\"onLogLine\", listener)\r\n\t}\r\n}\r\n","import React from \"react\"\r\nimport \"./css/Action.css\"\r\n\r\nconst gcdOverrides = new Set([\r\n\t15997, //standard step\r\n\t15998, //technical step\r\n\t15999,\r\n\t16000,\r\n\t16001,\r\n\t16002, //step actions\r\n\t16003, //standard finish\r\n\t16004, //technical finish\r\n\t16191, //single standard finish\r\n\t16192, //double standard finish (WHY IS IT LIKE THIS)\r\n\t16193, //single technical finish\r\n\t16194, //double technical finish\r\n\t16195, //triple technical finish\r\n\t16196, //quadruple technical finish\r\n\t7418, //flamethrower\r\n\t16483 //tsubame-gaeshi\r\n])\r\n\r\nconst ogcdOverrides = new Set([\r\n\t3559, //bard WM\r\n\t116, //bard AP\r\n\t114 //bard MB\r\n])\r\n\r\nexport default function Action({ actionId, additionalClasses }) {\r\n\tconst [apiData, setApiData] = React.useState()\r\n\r\n\tReact.useEffect(() => {\r\n\t\tlet current = true\r\n\t\tvoid (async () => {\r\n\t\t\tconst data = await (await fetch(`https://xivapi.com/Action/${actionId}`, {\r\n\t\t\t\tmode: \"cors\"\r\n\t\t\t})).json()\r\n\t\t\tif (current) {\r\n\t\t\t\tsetApiData(data)\r\n\t\t\t}\r\n\t\t})()\r\n\r\n\t\treturn () => {\r\n\t\t\tcurrent = false\r\n\t\t}\r\n\t}, [actionId])\r\n\r\n\tif (apiData === undefined || !apiData.Icon) {\r\n\t\treturn null\r\n\t}\r\n\r\n\treturn (\r\n\t\t\r\n\t)\r\n}\r\n","import React from \"react\"\r\nimport \"./css/Rotation.css\"\r\nimport Action from \"./Action\"\r\n\r\nexport default function RotationContainer({ encounterId, name, actionList }) {\r\n\tconst [open, setOpen] = React.useState(false)\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t {\r\n\t\t\t\t\tsetOpen(open => !open)\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t{encounterId === 0 ? \"Current Rotation\" : name}\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t)\r\n}\r\n\r\nfunction RotationContents({ expanded, actionList }) {\r\n\tif (!expanded) return null\r\n\r\n\treturn (\r\n\t\t
\r\n\t\t\t{actionList.map((action, i) => (\r\n\t\t\t\t\r\n\t\t\t))}\r\n\t\t
\r\n\t)\r\n}\r\n","import React from \"react\"\r\nimport listenToACT from \"./ACTListener\"\r\nimport \"./css/App.css\"\r\nimport Action from \"./Action\"\r\nimport RotationContainer from \"./Rotation\"\r\nimport ReactDOM from \"react-dom\"\r\n\r\nconst handleCodes = new Set([\"00\", \"01\", \"02\", \"21\", \"22\", \"33\"])\r\n\r\nexport default function App() {\r\n\tconst [actionList, setActionList] = React.useState([])\r\n\tconst [encounterList, setEncounterList] = React.useState([])\r\n\r\n\tReact.useEffect(() => {\r\n\t\tlet selfId\r\n\t\tlet lastTimestamp = \"\"\r\n\t\tlet lastAction = -1\r\n\t\tlet currentZone = \"Unknown\"\r\n\r\n\t\tlet lastKey = 1\r\n\r\n\t\tlet closeFn = listenToACT((...logSplit) => {\r\n\t\t\tconst openNewEncounter = () => {\r\n\t\t\t\tsetEncounterList(encounterList => {\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tencounterList[0] &&\r\n\t\t\t\t\t\tencounterList[0].rotation &&\r\n\t\t\t\t\t\tencounterList[0].rotation.length <= 0\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tencounterList.shift()\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tencounterList.unshift({\r\n\t\t\t\t\t\tname: currentZone,\r\n\t\t\t\t\t\trotation: []\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\treturn encounterList.slice(0, 3)\r\n\t\t\t\t})\r\n\t\t\t}\r\n\r\n\t\t\tif (logSplit.length === 1 && logSplit[0].charID) {\r\n\t\t\t\tselfId = logSplit[0].charID\r\n\t\t\t\topenNewEncounter()\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tconst [\r\n\t\t\t\tlogCode,\r\n\t\t\t\tlogTimestamp,\r\n\t\t\t\tlogParameter1,\r\n\t\t\t\tlogParameter2,\r\n\t\t\t\tlogParameter3\r\n\t\t\t] = logSplit\r\n\r\n\t\t\tif (!handleCodes.has(logCode)) return\r\n\r\n\t\t\tswitch (logCode) {\r\n\t\t\t\tcase \"00\":\r\n\t\t\t\t\tif (logParameter1 === \"0038\" && logParameter3 === \"end\")\r\n\t\t\t\t\t\topenNewEncounter()\r\n\t\t\t\t\treturn\r\n\t\t\t\tcase \"01\":\r\n\t\t\t\t\tcurrentZone = logParameter2\r\n\t\t\t\t\treturn\r\n\t\t\t\tcase \"02\":\r\n\t\t\t\t\tselfId = parseInt(logParameter1, 16)\r\n\t\t\t\t\topenNewEncounter()\r\n\t\t\t\t\treturn\r\n\t\t\t\tcase \"33\":\r\n\t\t\t\t\tif (logParameter2 === \"40000012\" || logParameter2 === \"40000010\")\r\n\t\t\t\t\t\topenNewEncounter()\r\n\t\t\t\t\treturn\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak\r\n\t\t\t}\r\n\r\n\t\t\tif (selfId === undefined) return\r\n\r\n\t\t\tif (parseInt(logParameter1, 16) !== selfId) return\r\n\r\n\t\t\tconst action = parseInt(logParameter3, 16)\r\n\r\n\t\t\tif (\r\n\t\t\t\taction <= 8 ||\r\n\t\t\t\t(logTimestamp === lastTimestamp && action === lastAction)\r\n\t\t\t)\r\n\t\t\t\treturn\r\n\r\n\t\t\tif (Date.now() - Date.parse(lastTimestamp) > 120000) openNewEncounter() //last action > 120s ago\r\n\r\n\t\t\tlastTimestamp = logTimestamp\r\n\t\t\tlastAction = action\r\n\r\n\t\t\tconst key = (lastKey % 256) + 1\r\n\t\t\tlastKey = key\r\n\r\n\t\t\t// This is pretty silly but it's the neatest way to handle the updates going\r\n\t\t\t// out at the same time, without finding some way to merge the action lists....\r\n\t\t\tReactDOM.unstable_batchedUpdates(() => {\r\n\t\t\t\tsetActionList(actionList => actionList.concat({ action, key }))\r\n\t\t\t\tsetEncounterList(encounterList => {\r\n\t\t\t\t\tif (!encounterList[0]) {\r\n\t\t\t\t\t\tencounterList[0] = {\r\n\t\t\t\t\t\t\tname: currentZone,\r\n\t\t\t\t\t\t\trotation: []\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tencounterList[0].rotation.push(action)\r\n\r\n\t\t\t\t\treturn encounterList\r\n\t\t\t\t})\r\n\t\t\t})\r\n\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tsetActionList(actionList => actionList.slice(1))\r\n\t\t\t}, 10000)\r\n\t\t})\r\n\r\n\t\treturn () => {\r\n\t\t\tcloseFn()\r\n\t\t}\r\n\t}, [])\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t{actionList.map(({ action, key }) => (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t))}\r\n\t\t\t\t
\r\n\t\t\t\t{encounterList.map((encounter, i) => (\r\n\t\t\t\t\t\r\n\t\t\t\t))}\r\n\t\t\t
\r\n\t\t\r\n\t)\r\n}\r\n","import React from 'react'\r\nimport ReactDOM from 'react-dom'\r\nimport App from './App'\r\n\r\nReactDOM.render(, document.getElementById('root'))\r\n"],"sourceRoot":""} \ No newline at end of file