{ "version": 3, "sources": ["../l.ts", "../app.ts"], "sourcesContent": ["/** Our library module */\r\nexport module L {\r\n\r\n export interface ILiteEvent {\r\n on(handler: { (data?: T): void }) : void;\r\n off(handler: { (data?: T): void }) : void;\r\n }\r\n export class Ev implements ILiteEvent {\r\n private handlers: { (data?: T): void; }[] = [];\r\n \r\n public on(handler: { (data?: T): void }) : void {\r\n this.handlers.push(handler);\r\n }\r\n \r\n public off(handler: { (data?: T): void }) : void {\r\n this.handlers = this.handlers.filter(h => h !== handler);\r\n }\r\n \r\n public trigger(data?: T) {\r\n this.handlers.slice(0).forEach(h => h(data));\r\n }\r\n \r\n public expose() : ILiteEvent {\r\n return this;\r\n }\r\n }\r\n\r\n export function isLocalNetwork(hostname = window.location.hostname) {\r\n return (\r\n (['localhost', '127.0.0.1', '', '::1'].includes(hostname))\r\n || (hostname.startsWith('192.168.'))\r\n || (hostname.startsWith('10.0.'))\r\n || (hostname.endsWith('.local'))\r\n )\r\n }\r\n\r\n export function isMobile(): boolean {\r\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\r\n }\r\n\r\n export function dqs(str:string){\r\n return document.querySelector(str);\r\n }\r\n\r\n export function enumKeys(e: E): (keyof E)[] {\r\n return Object.keys(e) as (keyof E)[];\r\n }\r\n\r\n\r\n /** document.querySelectorAll syntactical sugar, returns casted iterator*/\r\n export function* dqsa(sel: string): Generator {\r\n var elems = document.querySelectorAll(sel);\r\n for (var i = 0; i < elems.length; i++)\r\n yield elems[i];\r\n }\r\n\r\n /** converts, eg: ['joey', 'doug', 'harry'] into 'joey, doug, and harry'*/\r\n export function convertToCommaSeperatedString(vals: string[]) {\r\n if (vals.length == 0)\r\n return \"\";\r\n if (vals.length == 1)\r\n return vals[0];\r\n if (vals.length == 2)\r\n return vals[0] + \" and \" + vals[1];\r\n return vals.slice(0, vals.length - 1).join(', ') + \", and \" + vals[vals.length - 1];\r\n }\r\n\r\n export function stringIsValidString(obj: any): obj is string {\r\n return (typeof obj === 'string' || obj instanceof String);\r\n }\r\n\r\n /** eg: \"xxx\",\"y\"=> \"yxx\", just overlays the second string onto the first */\r\n export function stringOverlay(originalString: string, stringToOverlay: string, overlayPos: number = 0) {\r\n var startPart = originalString.substr(0, overlayPos);\r\n var endPart = originalString.substr(stringToOverlay.length + overlayPos);\r\n return startPart + stringToOverlay + endPart;\r\n }\r\n\r\n /** e.g. [1,2,3] -> [1,2], [2,3] */\r\n export function arrayToNeighbors(arr: Array): Array> {\r\n var toReturn: Array> = [];\r\n for (var i = 0; i < arr.length; ++i)\r\n if (i > 0)\r\n toReturn.push([arr[i - 1], arr[i]]);\r\n return toReturn;\r\n }\r\n\r\n export function arraySpliceMultiple(arr: T[], indeces: number[]): T[] {\r\n var toReturn: T[] = [];\r\n for (let i = indeces.length - 1; i >= 0; i--) { \r\n toReturn.push(arr.splice(indeces[i], 1)[0]);\r\n }\r\n return toReturn;\r\n }\r\n\r\n /** Checks with == if the two arrays are the same, must be ordered the same */\r\n export function arrayEquals(a: T[], b: T[]): boolean {\r\n if (a.length != b.length)\r\n return false;\r\n for (var i = 0; i < a.length; ++i) {\r\n if (a[i] !== b[i])\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n export function addHours(start: Date, h: number): Date {\r\n var newTime = new Date(start);\r\n return new Date(newTime.getTime() + (h * 60 * 60 * 1000));\r\n }\r\n\r\n export function msToDisplayString(ms:number):string{\r\n var totalS = ms / 1000;\r\n var totalM = Math.floor(totalS / 60);\r\n var totalH = Math.round(totalS / (60 * 60));\r\n if (totalH > 0)\r\n return `${totalH}h`\r\n if (totalM > 0)\r\n return `${totalM}m`;\r\n return `${Math.ceil(totalS)}s`;\r\n }\r\n\r\n /** starts an exponential falloff at some offset */\r\n export function expFalloff(x: number, xOffset: number, expBase: number) {\r\n return Math.pow(expBase, (1 - Math.max(x, xOffset) / xOffset));\r\n }\r\n\r\n function randn_bm() {\r\n var u = 0, v = 0;\r\n while (u === 0) u = Math.random(); //Converting [0,1) to (0,1)\r\n while (v === 0) v = Math.random();\r\n return Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);\r\n }\r\n\r\n export function bellcurve(mid: number, std: number) {\r\n return randn_bm() * std + mid;\r\n }\r\n\r\n export var DEGREE_TO_RAD = 0.0174532925;\r\n export var RAD_TO_DEGREE = 57.2957795;\r\n /** inclusive clamp. Clamp(100,0,5)=5, Clamp(-100,0,5)=0, Clamp(2,0,5)=2 */\r\n export function Clamp(x: number, a: number, b: number): number {\r\n if (x < a)\r\n return a;\r\n if (x > b)\r\n return b;\r\n return x;\r\n }\r\n\r\n\r\n export function ArraySelectRandom(array: T[]): T {\r\n return array[Math.floor(Math.random() * array.length)];\r\n }\r\n\r\n /** Select the element of the array closest to val (absolute distance) */\r\n export function ArraySelectMax(array: T[], func: (val: T) => number): T {\r\n var max = Number.MIN_SAFE_INTEGER;\r\n var elem!: T;\r\n for (var i = 0; i < array.length; ++i) {\r\n if (func(array[i]) >= max) {\r\n max = func(array[i]);\r\n elem = array[i];\r\n }\r\n }\r\n return elem;\r\n }\r\n\r\n /** Select the element of the array closest to val (absolute distance) */\r\n export function ArraySelectMin(array: T[], func: (val: T) => number): T {\r\n var min = Number.MAX_SAFE_INTEGER;\r\n var elem!: T;\r\n for (var i = 0; i < array.length; ++i) {\r\n if (func(array[i]) <= min) {\r\n min = func(array[i]);\r\n elem = array[i];\r\n }\r\n }\r\n return elem;\r\n }\r\n\r\n /** Return evenly spaced numbers over a specified interval. */\r\n export function ArrayLinspace(start: number, end: number, num: number) {\r\n var toReturn = [];\r\n for (var i = 0; i < num; ++i) {\r\n toReturn.push((i / (num - 1)) * (end - start))\r\n }\r\n return toReturn;\r\n }\r\n\r\n\r\n export function ArrayShuffleInPlace(array: any[]) {\r\n var currentIndex = array.length, temporaryValue, randomIndex;\r\n \r\n // While there remain elements to shuffle...\r\n while (0 !== currentIndex) {\r\n \r\n // Pick a remaining element...\r\n randomIndex = Math.floor(Math.random() * currentIndex);\r\n currentIndex -= 1;\r\n \r\n // And swap it with the current element.\r\n temporaryValue = array[currentIndex];\r\n array[currentIndex] = array[randomIndex];\r\n array[randomIndex] = temporaryValue;\r\n }\r\n \r\n return array;\r\n }\r\n\r\n /** flatten would be ([[1,2,3],[4,5,6]], a=>a), essentially it performs some operation over the elements and then combines everything flat */\r\n export function arraySelectMany(x: T[], lambda: (a: T) => U[]): U[] {\r\n var toReturn: U[] = [];\r\n for (var i = 0; i < x.length; ++i) {\r\n toReturn.push(...lambda(x[i]));\r\n }\r\n return toReturn;\r\n }\r\n\r\n /** Returns true if any element satisfies a condition. L.ArrayAny([1,2,3],n=>n==3) would return true */\r\n export function arrayAny(x: T[], lambda: (a: T) => boolean): boolean {\r\n for (var i = 0; i < x.length; ++i) {\r\n if (lambda(x[i]))\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /** returns the min based off some function*/\r\n export function arrayMin(x: Array, lambda: (x: T) => number): number {\r\n var min = Number.MAX_SAFE_INTEGER;\r\n for (var i = 0; i < x.length; ++i) {\r\n var val = lambda(x[i]);\r\n if (val < min) {\r\n min = val;\r\n }\r\n }\r\n return min;\r\n }\r\n\r\n /** returns the max based off some function*/\r\n export function ArrayMax(x: Array, lambda: (x:T) => number): T {\r\n var max = Number.MIN_SAFE_INTEGER;\r\n var toReturn = x[0];\r\n for (var i = 0; i < x.length; ++i) {\r\n var val = lambda(x[i]);\r\n if (val > max) {\r\n toReturn = x[i];\r\n max = val;\r\n }\r\n }\r\n return toReturn;\r\n }\r\n\r\n /** returns the max based off some function*/\r\n export function ArraySum(x: Array, lambda: (x: T) => number): number {\r\n var sum = 0;\r\n for (var i = 0; i < x.length; ++i) {\r\n sum += lambda(x[i]);\r\n }\r\n return sum;\r\n }\r\n\r\n /** returns the max based off some function*/\r\n export function ArrayAvg(x: Array, lambda: (x: T) => number): number {\r\n var sum = 0;\r\n for (var i = 0; i < x.length; ++i) {\r\n sum += lambda(x[i]);\r\n }\r\n return sum / x.length;\r\n }\r\n\r\n /** clamps an index to the bounds of the array */\r\n export function ArrayClamp(x: Array, i: number): T {\r\n return x[L.Clamp(i, 0, x.length - 1)];\r\n }\r\n\r\n export function Quartic(start: number, end: number, t: number): number {\r\n t = Math.max(0, Math.min(1, t));\r\n let output = start + (end - start) * (1 - (--t) * t * t * t);\r\n return output;\r\n }\r\n\r\n export function Sigmoid(t: number) {\r\n let output = 1 / (1 + Math.exp(-t));\r\n return output;\r\n }\r\n\r\n export function Mean(array: Array) {\r\n return array.reduce((a, b) => a + b, 0) / array.length;\r\n }\r\n\r\n export function Std(array: number[]) {\r\n const n = array.length\r\n const mean = array.reduce((a, b) => a + b) / n\r\n return Math.sqrt(array.map(x => Math.pow(x - mean, 2)).reduce((a, b) => a + b) / n)\r\n }\r\n\r\n export function Lerp(a: number, b: number, t: number) {\r\n return L.Clamp(a + (b - a) * t, a, b);\r\n }\r\n\r\n export function EasingLinear(t: number) {\r\n return t;\r\n }\r\n export function EasingQuartic(t:number){\r\n return L.Quartic(0, 1, t);\r\n }\r\n\r\n export function EasingExp(t:number){\r\n t = L.Clamp(t,0, 1);\r\n return L.Clamp(1 - Math.pow(20, (1 - Math.max(t, .5) / .5)), 0, 1);\r\n }\r\n\r\n /** find the % a number is along */\r\n export function TNorm(t:number, from:number, to:number){\r\n return L.Clamp((t - from) / (to - from), 0, 1);\r\n }\r\n\r\n /** This listener lets you listen for buttons asynchronously, it queues button presses so no user hotkey is missed, it also allows you to inject keypress for debugging purposes */\r\n export class ButtonListener {\r\n queue: U[] = [];\r\n public defaultHapticDurMS = 0;\r\n public TriggerButtons(...buttons: string[]) {\r\n this.queue.push(...buttons);\r\n this.processQueue();\r\n }\r\n public SendHotkeys(...hotkeys: string[]) {\r\n for (var key of hotkeys)\r\n if (this.hotkeys[key] !== undefined){\r\n var items = this.hotkeys[key];\r\n this.queue.push(...items);\r\n }\r\n this.processQueue(true);\r\n }\r\n private readonly ids: T;\r\n constructor(...ids: T) {\r\n this.ids = ids;\r\n }\r\n /**You must bind to the on click events, this is needed because you don't want to have to pass around the long and complicated type associated with this guy into other methods (e.g. this class is meant to be global, thus you need to declare it before onload and bind after onload) */\r\n public Bind(){\r\n for (let id of this.ids) {\r\n dqs(id).onclick = ev => {\r\n this.upd(id);\r\n };\r\n }\r\n document.addEventListener('keydown', (e: KeyboardEvent) => this.SendHotkeys(e.key), false);\r\n }\r\n\r\n private upd = (id: U) => {\r\n this.queue.push(id);\r\n this.processQueue();\r\n }\r\n private hotkeys: { [k: string]: U[] } = {};\r\n public SetHotkeys(dict: { [k: string]: U[] }) {\r\n this.hotkeys = dict;\r\n }\r\n private durations: { [k: string]: number } = {};\r\n public SetHapticDur(dur:number, ...ids: U[]) {\r\n for (var id of ids) {\r\n this.durations[id] = dur;\r\n }\r\n }\r\n private processQueue(wasKeyboard: boolean = false) {\r\n if (this.promise_accept != null) {\r\n //find the first click of what we are waiting for\r\n var lowestIndex = Number.MAX_SAFE_INTEGER;\r\n var bestKey = null;\r\n for (var i = 0; i < this.waiting_for.length; ++i) {\r\n var waitingFor = this.waiting_for[i];\r\n var idx = this.queue.findIndex(a => a == waitingFor);\r\n if (idx != -1 && idx < lowestIndex) {\r\n lowestIndex = idx;\r\n bestKey = waitingFor;\r\n }\r\n }\r\n\r\n //discard unused inputs and invoke the promise\r\n if (bestKey != null) {\r\n this.queue.splice(0, lowestIndex + 1);\r\n if (wasKeyboard) {\r\n if ((dqs(bestKey)).checked !== undefined) //force check the checkboxes\r\n (dqs(bestKey)).checked = !(dqs(bestKey)).checked;\r\n }\r\n if (!wasKeyboard && L.isMobile()) {\r\n if(this.durations[bestKey])\r\n TryHapticMs(this.durations[bestKey]);\r\n else\r\n TryHapticMs(this.defaultHapticDurMS);\r\n }\r\n this.promise_accept(bestKey);\r\n }\r\n }\r\n }\r\n\r\n promise_accept: (string) => void = null;\r\n waiting_for: U[] = [];\r\n /** Clicks are queued up, If you click on X and then Y while X is still processing they both happen. */\r\n Click(...ids: U[]): Promise {\r\n if (this.promise_accept != null)\r\n throw new Error(\"Can't listen for multiple clicks at the same time\");\r\n return new Promise((accept, reject) => {\r\n this.waiting_for = ids;\r\n this.promise_accept = (clickedId) => {\r\n accept(clickedId);\r\n this.promise_accept = null;\r\n this.waiting_for = [];\r\n }\r\n this.processQueue();\r\n });\r\n }\r\n }\r\n const canVibrate = window.navigator.vibrate;\r\n /** Try to shake the phone for the specified number of MS, does nothing if it fails */\r\n export function TryHapticMs(ms: number) {\r\n try{\r\n if (canVibrate){\r\n if (ms == 0) {\r\n return;\r\n }\r\n window.navigator.vibrate(ms);\r\n }\r\n }catch{\r\n //do nothing, we are just trying to shake here\r\n }\r\n }\r\n\r\n\texport class Header {\r\n\t\t\tname: string;\r\n\t\t\tvalue: string;\r\n\t\t\tconstructor(header: string, data: string) {\r\n\t\t\t\t\tthis.name = header;\r\n\t\t\t\t\tthis.value = data;\r\n\t\t\t}\r\n\t}\r\n\r\nexport interface Data {\r\n\tHeaders: string;\r\n\tText: string;\r\n\tType: string;\r\n\tStatus: number;\r\n\tStatusText: string;\r\n\tErrorMessage?: string;\r\n}\r\nexport function isData(obj: any): obj is Data {\r\n\tif (obj !== undefined &&\r\n\t\t(obj).Headers !== undefined &&\r\n\t\t(obj).Text !== undefined &&\r\n\t\t(obj).Type !== undefined &&\r\n\t\t(obj).Status !== undefined &&\r\n\t\t(obj).StatusText !== undefined)\r\n\t\t\treturn true;\r\n\treturn false\r\n}\r\nexport function XhrErrorMessage(obj:any){\r\n\tif (!isData(obj))\r\n\t\treturn null;\r\n\treturn `${obj.Status}: ${obj.Text}`;\r\n}\r\n\r\nfunction DataFromJSXHR(jsXHR: XMLHttpRequest): Data {\r\n\tvar data: Data = {\r\n\t\tHeaders: jsXHR.getAllResponseHeaders(),\r\n\t\tText: jsXHR.responseText,\r\n\t\tType: jsXHR.responseType,\r\n\t\tStatus: jsXHR.status,\r\n\t\tStatusText: jsXHR.statusText\r\n\t};\r\n\treturn data;\r\n}\r\n\r\nfunction SendCommandInternal(\r\n\tfinish: (data: Data) => void,\r\n\tmethod: string,\r\n\turl: string,\r\n\theaders: Array
,\r\n\tdata: string = \"\"): void {\r\n\t\tvar jsXHR = new XMLHttpRequest();\r\n\t\tjsXHR.open(method, url);\r\n\r\n\t\theaders.forEach(header =>\r\n\t\t\tjsXHR.setRequestHeader(header.name, header.value));\r\n\r\n\t\tjsXHR.onload = (ev) => {\r\n\t\t\tif (jsXHR.status < 200 || jsXHR.status >= 300) {\r\n\t\t\t\tvar data = DataFromJSXHR(jsXHR);\r\n\t\t\t\tdata.ErrorMessage = `${jsXHR.responseText} (#${jsXHR.status})`;\r\n\t\t\t\tfinish(data);\r\n\t\t\t}else{\r\n\t\t\t\tfinish(DataFromJSXHR(jsXHR));\r\n\t\t\t}\r\n\t\t}\r\n\t\tjsXHR.onerror = (ev) => {\r\n\t\t\tvar data = DataFromJSXHR(jsXHR);\r\n\t\t\t//the error info isn't included here for whatever reason lol...\r\n\t\t\tdata.ErrorMessage = 'Unspecified Error ' + method.toUpperCase() + 'ing to url \\'' + url + '\\', check the browser js console for more info';\r\n\t\t\tfinish(data);\r\n\t\t};\r\n\r\n\t\tif (method == 'POST')\r\n\t\t\tjsXHR.send(data);\r\n\t\telse\r\n\t\t\tjsXHR.send();\r\n}\r\nfunction SendCommand(\r\n\tmethod: string,\r\n\turl: string,\r\n\theaders: Array
,\r\n\tdata: string = \"\",\r\n\tretries = 0): Promise {\r\n\treturn new Promise(function (resolve, reject) {\r\n\t\tvar tryToSend = (triesLeft) => {\r\n\t\t\tSendCommandInternal((data) => {\r\n\t\t\t\tif (data.ErrorMessage) {\r\n\t\t\t\t\tif (triesLeft > 1)\r\n\t\t\t\t\t\tsetTimeout(() => tryToSend(triesLeft - 1), 2500);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\treject(data.ErrorMessage);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tresolve(data);\r\n\t\t\t\t}\r\n\t\t\t}, method, url, headers, data);\r\n\t\t}\r\n\t\ttryToSend(retries);\r\n\t});\r\n}\r\n\r\n/** Performs GET on `url` returning the deserialized object of type `T`. Retries `retries` # of times before throwing. Internally done via json.\r\n * \r\n * `var time:{time:string} = await Get('api/serverTime');`\r\n * \r\n * `time = await Get('https://blah.com/api/serverTime');`\r\n * */\r\nexport async function Get(\r\n\turl: string,\r\n\tretries: number = 0,\r\n\theaders: Array
= []): Promise {\r\n\r\n\treturn new Promise((resolve, reject) => {\r\n\t\tif (!headers.some(a => a.name.toLowerCase() == \"Content-Type\".toLowerCase()))\r\n\t\t\theaders.push({ name: 'Content-Type', value: 'application/json;charset=UTF-8' });\r\n\t\tSendCommand('GET', url, headers, \"\", retries).then(data => {\r\n\t\t\ttry{\r\n\t\t\t\t(>data).obj = JSON.parse(data.Text);\r\n\t\t\t\tresolve((>data).obj);\r\n\t\t\t} catch (er) {\r\n\t\t\t\treject(\"error deserializing web request to \" + url);\r\n\t\t\t}\r\n\t\t}, er => {\r\n\t\t\treject(er);\r\n\t\t})\r\n\t});\r\n\r\n}\r\n\r\n/** posts string to url */\r\nexport async function PostString(url: string, data: string, headers: Array
= []): Promise {\r\n\treturn SendCommand('POST', url, headers, data);\r\n}\r\n\r\n/** posts object to url, returns the web request */\r\nexport async function PostJson(url: string, data: object = null, headers: Array
= [], retries = 0): Promise {\r\n\tvar jsonData = JSON.stringify(data);\r\n\tif (!headers.some(a => a.name.toLowerCase() == \"Content-Type\".toLowerCase()))\r\n\t\theaders.push({ name: 'Content-Type', value: 'application/json;charset=UTF-8' });\r\n\treturn SendCommand('POST', url, headers, jsonData, retries);\r\n}\r\n\r\nexport interface DataWithObj extends Data {\r\n\tobj: T\r\n}\r\n/** posts `data` to `url` via JSON (you don't need to serialize). Returns deserialized object, fails with reject (after `retries` are exhauted)\r\n * \r\n * `(await Post({url:'api/sqrt',data:{val:4}})).r; //2`*/\r\nexport async function Post({ url, data = null, retries = 0, headers = [] }: { url: string, data?: object, retries?: number, headers?: Header[] }): Promise {\r\n return new Promise((resolve, reject) => {\r\n var jsonData = JSON.stringify(data);\r\n if (!headers.some(a => a.name.toLowerCase() == \"Content-Type\".toLowerCase()))\r\n headers.push({ name: 'Content-Type', value: 'application/json;charset=UTF-8' });\r\n SendCommand('POST', url, headers, jsonData, retries).then(data => {\r\n try {\r\n (>data).obj = JSON.parse(data.Text);\r\n resolve((>data).obj);\r\n } catch (er) {\r\n reject(\"error deserializing web request to \" + url);\r\n }\r\n }, er => {\r\n reject(er);\r\n })\r\n });\r\n\r\n}\r\n\r\n}", "\uFEFFimport { Ask, GameInfo, Respond } from \"./interface/Client\";\r\nimport { L } from \"./l\";\r\ninterface GameState{\r\n wordList: string[];\r\n guessed: number[];\r\n good: { word: string; el: HTMLDivElement }[];\r\n bad: { word: string; el: HTMLDivElement }[];\r\n numPlays: number;\r\n plays: Respond[];\r\n}\r\nmodule GameState{\r\n\r\n}\r\n\r\nvar redraw = (gs: GameState) => {\r\n if (gs.numPlays > 0) {\r\n var h2 = L.dqs(\"#h2\") as HTMLImageElement;\r\n h2.src = \"res/heart_empty.svg\"\r\n }\r\n if (gs.numPlays > 1) {\r\n var h1 = L.dqs(\"#h1\") as HTMLImageElement;\r\n h1.src = \"res/heart_empty.svg\"\r\n }\r\n for(var g of gs.good){\r\n g.el.innerText = g.word;\r\n }\r\n for (var b of gs.bad) {\r\n b.el.innerText = b.word;\r\n }\r\n var goodWordsSet = new Set(gs.good.map(w => w.word));\r\n var badWordsSet = new Set(gs.bad.map(w => w.word));\r\n\r\n for (var z = 0; z < gs.plays.length; ++z) {\r\n if (!gs.plays[z].word)\r\n continue;\r\n var play = gs.plays[z].word.toUpperCase();\r\n if (goodWordsSet.has(play)) {\r\n goodWordsSet.delete(play);\r\n }\r\n if (badWordsSet.has(play)) {\r\n badWordsSet.delete(play);\r\n }\r\n }\r\n\r\n for(var g of gs.good){\r\n if (goodWordsSet.has(g.el.innerText)) {\r\n g.el.style.visibility = \"visible\";\r\n }else{\r\n g.el.style.visibility = \"hidden\";\r\n }\r\n }\r\n for (var b of gs.bad) {\r\n if (badWordsSet.has(b.el.innerText)) {\r\n b.el.style.visibility = \"visible\";\r\n }else{\r\n b.el.style.visibility = \"hidden\";\r\n }\r\n }\r\n}\r\nfunction sleep(ms) {\r\n return new Promise(resolve => setTimeout(resolve, ms))\r\n }\r\n\r\n function sanitize(str) {\r\n if (!str)\r\n return str\r\n const map = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n '\"': '"',\r\n \"'\": ''',\r\n \"/\": '/'\r\n };\r\n const reg = /[&<>\"'/]/ig;\r\n return str.replace(reg, (match)=>(map[match]));\r\n }\r\n\r\nvar btn = new L.ButtonListener(\"#invisBtn\");\r\nbtn.SetHotkeys({ \"Enter\": [\"#invisBtn\"] })\r\nwindow.onload = async () => {\r\n btn.Bind();\r\n var gameState: GameState = { wordList: [], guessed: [], good: [], bad: [], numPlays: 0, plays: [] };\r\n var gi = await L.Get(`${url()}/api/daily`,3);\r\n\r\n gameState.wordList = gi.wordList.map(w => w);\r\n\r\n var goodSquares:HTMLDivElement[] = [];\r\n for (var i = 0; i < gi.goodWords.length; ++i){\r\n goodSquares.push(L.dqs(`#sqG${i}`));\r\n gameState.good.push({ el: goodSquares[i], word: gi.goodWords[i] });\r\n }\r\n var badSquares:HTMLDivElement[] = [];\r\n for (var i = 0; i < gi.badWords.length; ++i){\r\n badSquares.push(L.dqs(`#sqB${i}`));\r\n gameState.bad.push({ el: badSquares[i], word: gi.badWords[i] });\r\n }\r\n \r\n redraw(gameState);\r\n var cb = L.dqs(\"#chatboxTextbox\") as HTMLTextAreaElement;\r\n\r\n var gameOver = false;\r\n while(true){\r\n\r\n // wait until the user clicks the button\r\n await btn.Click(\"#invisBtn\");\r\n\r\n // pull data from textbox\r\n var userQ = cb.value ?? \"\";\r\n if (userQ == \"\")\r\n continue;\r\n cb.value = \"\";\r\n\r\n if (gameOver)\r\n continue;\r\n\r\n var thisTurn:string[] = [];\r\n // send data to server asking for a response\r\n while (true) {\r\n var ask: Ask = { q: userQ, id: gi.id, guessed: gameState.guessed };\r\n var msg = await L.Post({\r\n url: `${url()}/api/ask`,\r\n data: ask,\r\n retries: 3\r\n });\r\n if (msg.error) {\r\n L.dqs(\"#robotBox\").style.opacity = \"1\";\r\n L.dqs(\"#robotText\").style.opacity = \"0\";\r\n L.dqs(\"#robotTextPre\").innerHTML = ``;\r\n L.dqs(\"#robotText\").innerText = \" Error, \" + msg.error + \"! \";\r\n L.dqs(\"#robotTextPost\").innerHTML = ``;\r\n L.dqs(\"#robotText\").style.opacity = \"1\";\r\n break;\r\n }\r\n L.dqs(\"#robotBox\").style.opacity = \"1\";\r\n L.dqs(\"#robotText\").style.opacity = \"0\";\r\n\r\n var top3 = msg.top3.map(w => sanitize(w).toLowerCase());\r\n var wToHtml = (w: string) => {\r\n var wU = sanitize(w.toUpperCase());\r\n if (gi.goodWords.findIndex(a => a.toUpperCase() == wU) != -1)\r\n return `
${wU}
`;\r\n return `
${wU}
`;\r\n };\r\n\r\n var wordsToAndList = (ws: string[]) => {\r\n return L.convertToCommaSeperatedString(ws.map(w => wToHtml(w)));\r\n };\r\n\r\n var cHtml = `
${sanitize(ask.q).toUpperCase()}
`;\r\n L.dqs(\"#robotTextPre\").innerHTML = `For ${cHtml} I like ${wordsToAndList(top3)}.`;\r\n L.dqs(\"#robotText\").innerText = msg.whyRelated;\r\n L.dqs(\"#robotTextPost\").innerHTML = `I choose...`;\r\n L.dqs(\"#robotText\").style.opacity = \"1\";\r\n thisTurn.push(msg.word);\r\n gameState.plays.push(msg);\r\n gameState.guessed.push(msg.idxWord)\r\n var estWords = msg.whyRelated.length/4.5 +4;\r\n var avgReadSpeedSeconds = estWords / (250.0 / 60.0);\r\n await sleep(1000+avgReadSpeedSeconds * 1000);\r\n L.dqs(\"#robotTextPost\").innerHTML = `I choose... ${wToHtml(msg.word)}.`;\r\n await sleep(2000);\r\n redraw(gameState);\r\n\r\n //count the number of words left\r\n var guesses = new Set(gameState.guessed.map(idx => gameState.wordList[idx].toUpperCase()));\r\n var goodWordsPicked = gi.goodWords.filter(gw => guesses.has(gw.toUpperCase())).length;\r\n var goodWordsLeft = gi.goodWords.filter(gw => !guesses.has(gw.toUpperCase())).length;\r\n console.log(\"\");\r\n if (goodWordsLeft == 0) {\r\n L.dqs(\"#robotTextPost\").innerHTML = ``;\r\n L.dqs(\"#robotTextPre\").innerHTML = ``;\r\n L.dqs(\"#robotText\").innerHTML = `YOU WIN!`;\r\n }\r\n\r\n if (gi.goodWords.findIndex(a => a.toUpperCase() == msg.word.toUpperCase()) == -1) {\r\n gameState.numPlays++;\r\n var guessWas = \"guesses were\";\r\n if (thisTurn.length <= 1)\r\n guessWas = \"guess was\";\r\n L.dqs(\"#robotTextPre\").innerHTML = `Ok, for ${cHtml} my ${guessWas} ${wordsToAndList(thisTurn)}.`;\r\n if (gameState.numPlays == 1)\r\n L.dqs(\"#robotText\").innerHTML = ``;\r\n else if (gameState.numPlays == 2)\r\n L.dqs(\"#robotText\").innerHTML = `You have 1 more try left.`;\r\n L.dqs(\"#robotTextPost\").innerHTML = ``;\r\n if (gameState.numPlays == 3){\r\n L.dqs(\"#robotText\").innerHTML = `Your score was ${goodWordsPicked}!`;\r\n L.dqs(\"#robotTextPost\").innerHTML = `GG`;\r\n gameOver = true;\r\n }\r\n redraw(gameState);\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction url() {\r\n if (L.isLocalNetwork())\r\n return \"http://127.0.0.1:5287\";\r\n // return https://.isotropic.us;\r\n return `${window.location.origin}`;\r\n}"], "mappings": "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", "names": [] }