{"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","isValidAction","logSplit","charID","logCode","logTimestamp","logParameter1","logParameter2","logParameter3","parseInt","Date","now","key","ReactDOM","unstable_batchedUpdates","concat","push","encounter","render","getElementById"],"mappings":"4OAAMA,EAAU,iBAAM,kCAAkCC,KAAKC,OAAOC,SAASC,SAE9D,SAASC,EAAYC,GACnC,OAAKN,IACEO,EAAmBD,GA2B3B,SAA6BA,GAC5B,IAAME,EAAW,SAAAC,GAChBH,EAAQ,WAAR,cAAYG,EAAEC,UAKf,OAFAC,SAASC,iBAAiB,YAAaJ,GAEhC,WACNG,SAASE,oBAAoB,YAAaL,IApCpBM,CAAoBR,GAI5C,SAASC,EAAmBD,GAC3B,IAAMS,EAAQ,UAAGf,IAAU,GAAb,wBAAuCgB,EAC/CC,EAAK,IAAIC,UAAUH,GAiBzB,OAhBAE,EAAGE,QAAU,kBAAMF,EAAGG,SACtBH,EAAGI,QAAU,kBACZC,YAAW,WACVf,EAAmBD,KACjB,MACJW,EAAGM,UAAY,SAASd,EAAGe,GAC1B,GAAe,MAAXf,EAAEgB,KAAc,OAAOR,EAAGS,KAAK,KAEnC,IAAMC,EAAMC,KAAKC,MAAMpB,EAAEgB,MACzB,MAAoB,iBAAhBE,EAAIG,QACAxB,EAASqB,EAAII,KACM,SAAhBJ,EAAIG,QACPxB,EAAQ,WAAR,cAAYqB,EAAII,IAAIC,MAAM,YAD3B,GAKD,WACNf,EAAGG,S,iCCxBCa,G,MAAe,IAAIC,IAAI,CAC5B,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,MACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,MACA,MACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,QAGKC,EAAgB,IAAID,IAAI,CAC7B,KACA,IACA,MAGKE,EAAY,IAAIC,IAEP,SAASC,EAAT,GAAkD,IAAhCC,EAA+B,EAA/BA,SAAUC,EAAqB,EAArBA,kBAAqB,EACjCC,IAAMC,WAD2B,mBACxDC,EADwD,KAC/CC,EAD+C,KA0B/D,OAvBAH,IAAMI,WAAU,WACf,IAAMC,EAAUV,EAAUW,IAAIR,GAC9B,GAAe,MAAXO,EAAJ,CAKA,IAAIE,GAAU,EAWd,OAVK,sBAAC,4BAAAC,EAAA,sEACqBC,MAAM,6BAAD,OAA8BX,EAA9B,6CAAmF,CACjHY,KAAM,SAFF,8BAGDC,OAHC,OACC3B,EADD,OAIDuB,IACHZ,EAAUiB,IAAId,EAAUd,GACxBmB,EAAWnB,IANP,0CAAD,GAUE,WACNuB,GAAU,GAhBVJ,EAAWE,KAkBV,CAACP,SAEYvB,IAAZ2B,GAA0BA,EAAQW,KAKrC,qBACCC,UACCtB,EAAauB,IAAIjB,KACfJ,EAAcqB,IAAIjB,IAAgD,IAAnCI,EAAQc,uBADzC,cAEUjB,GAFV,eAGWA,GAEZkB,IAAG,6BAAwBf,EAAQW,MACnCK,IAAKhB,EAAQiB,MAAQ,KAZf,K,MCjFM,SAASC,EAAT,GAA+D,IAAlCC,EAAiC,EAAjCA,YAAaC,EAAoB,EAApBA,KAAMC,EAAc,EAAdA,WAAc,EACpDvB,IAAMC,UAAS,GADqC,mBACrEuB,EADqE,KAC/DC,EAD+D,KAG5E,OACC,qCACC,wBACCX,UAAWU,EAAO,2BAA6B,kBAC/CE,QAAS,WACRD,GAAQ,SAAAD,GAAI,OAAKA,MAHnB,SAMkB,IAAhBH,EAAoB,mBAAqBC,IAE3C,cAACK,EAAD,CAAkBC,SAAUJ,EAAMD,WAAYA,OAKjD,SAASI,EAAT,GAAqD,IAAzBC,EAAwB,EAAxBA,SAAUL,EAAc,EAAdA,WACrC,OAAKK,EAGJ,qBAAKd,UAAU,gBAAf,SACES,EAAWM,KAAI,SAACC,EAAQC,GAAT,OACf,cAAC,EAAD,CAAgBjC,SAAUgC,EAAQ/B,kBAAkB,mBAAvCgC,QALM,KChBvB,IAAMC,EAAc,IAAIvC,IAAI,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,OAE5C,SAASwC,IAAO,IAAD,EACOjC,IAAMC,SAAS,IADtB,mBACtBsB,EADsB,KACVW,EADU,OAEalC,IAAMC,SAAS,IAF5B,mBAEtBkC,EAFsB,KAEPC,EAFO,KAwH7B,OApHApC,IAAMI,WAAU,WACf,IAAIiC,EACAC,EAAgB,GAChBC,GAAc,EACdC,EAAc,UAEdC,EAAU,EAEVC,EAAU9E,GAAY,WAAiB,IAC1C,IAAM+E,EAAmB,WACxBP,GAAiB,SAAAD,GAchB,OAZCA,EAAc,IACdA,EAAc,GAAGS,UACjBT,EAAc,GAAGS,SAASC,QAAU,GAEpCV,EAAcW,QAGfX,EAAcY,QAAQ,CACrBzB,KAAMkB,EACNI,SAAU,KAGJT,EAAca,MAAM,EAAG,OAIjBC,EAAgB,SAACnB,GACnB,OAAS,GAAKA,GAAU,KAAW,QAAUA,GAAU,QArB1B,mBAAboB,EAAa,yBAAbA,EAAa,gBAwB1C,GAAwB,IAApBA,EAASL,QAAgBK,EAAS,GAAGC,OAGxC,OAFAd,EAASa,EAAS,GAAGC,YACrBR,IA1ByC,IA+BzCS,EAKGF,EApCsC,GAgCzCG,EAIGH,EApCsC,GAiCzCI,EAGGJ,EApCsC,GAkCzCK,EAEGL,EApCsC,GAmCzCM,EACGN,EApCsC,GAsC1C,GAAKlB,EAAYjB,IAAIqC,GAArB,CAEA,OAAQA,GACP,IAAK,KAGJ,YAFsB,SAAlBE,GAA8C,QAAlBE,GAC/Bb,KAEF,IAAK,KAEJ,YADAH,EAAce,GAEf,IAAK,KAGJ,OAFAlB,EAASoB,SAASH,EAAe,SACjCX,IAED,IAAK,KAGJ,YAFsB,aAAlBY,GAAkD,aAAlBA,GACnCZ,KAMH,QAAepE,IAAX8D,GAEAoB,SAASH,EAAe,MAAQjB,EAApC,CAEA,IAAMP,EAAS2B,SAASD,EAAe,IAEvC,KACCP,EAAcnB,IACbuB,IAAiBf,GAAiBR,IAAWS,GAF/C,CAMImB,KAAKC,MAAQD,KAAKtE,MAAMkD,GAAiB,MAAQK,IAErDL,EAAgBe,EAChBd,EAAaT,EAEb,IAAM8B,EAAOnB,EAAU,IAAO,EAC9BA,EAAUmB,EAIVC,IAASC,yBAAwB,WAChC5B,GAAc,SAAAX,GAAU,OAAIA,EAAWwC,OAAO,CAAEjC,SAAQ8B,WACxDxB,GAAiB,SAAAD,GAUhB,OATKA,EAAc,KAClBA,EAAc,GAAK,CAClBb,KAAMkB,EACNI,SAAU,KAIZT,EAAc,GAAGS,SAASoB,KAAKlC,GAExBK,QAITtD,YAAW,WACVqD,GAAc,SAAAX,GAAU,OAAIA,EAAWyB,MAAM,QAC3C,WAGJ,OAAO,WACNN,OAEC,IAGF,mCACC,sBAAK5B,UAAU,YAAf,UACC,qBAAKA,UAAU,UAAf,SACES,EAAWM,KAAI,gBAAGC,EAAH,EAAGA,OAAQ8B,EAAX,EAAWA,IAAX,OACf,cAAC,EAAD,CAEC9D,SAAUgC,EACV/B,kBAAkB,eAFb6D,QAMPzB,EAAcN,KAAI,SAACoC,EAAWlC,GAAZ,OAClB,cAACX,EAAD,CAECC,YAAaU,EACbT,KAAM2C,EAAU3C,KAChBC,WAAY0C,EAAUrB,UAHjBb,WC3IX8B,IAASK,OAAO,cAAC,EAAD,IAAShG,SAASiG,eAAe,W","file":"static/js/main.5dc21a1f.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 wsUri = `${getHost()[1]}/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\t16484, //kaeshi higanbana\r\n\t16485, //kaeshi goken\r\n\t16486, //kaeshi setsugekka\r\n\t2259, //ten\r\n\t18805, \r\n\t2261, //chi\r\n\t18806,\r\n\t2263, //jin\r\n\t18807,\r\n\t2265, //fuma shurikan\r\n\t18873,\r\n\t18874,\r\n\t18875,\r\n\t2267, //raiton\r\n\t18877,\r\n\t2266, //katon\r\n\t18876,\r\n\t2268, //hyoton\r\n\t18878,\r\n\t16492, //hyosho ranryu\r\n\t16471, //goka meykakku\r\n\t16491, //goka meykakku (16471 is the PvP version, 16491 is the PvE version)\r\n\t2270, //doton\r\n\t18880,\r\n\t2269, //huton\r\n\t18879,\r\n\t2271, //suiton\r\n\t18881,\r\n\t2272, //rabbit medium\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\nconst actionMap = new Map()\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\tconst mapData = actionMap.get(actionId)\r\n\t\tif (mapData != null) {\r\n\t\t\tsetApiData(mapData)\r\n\t\t\treturn\r\n\t\t}\r\n\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}?columns=Icon,Name,ActionCategoryTargetID`, {\r\n\t\t\t\tmode: \"cors\"\r\n\t\t\t})).json()\r\n\t\t\tif (current) {\r\n\t\t\t\tactionMap.set(actionId, data)\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 const isValidAction = (action) => { //seperate this out to make the condition readable later\r\n return ((9 <= action <= 20000) || (100001 <= action <= 100300))\r\n }\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\tisValidAction(action) ||\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":""}