aboutsummaryrefslogtreecommitdiff
path: root/src/lib/stores/insults.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/stores/insults.js')
-rw-r--r--src/lib/stores/insults.js50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/lib/stores/insults.js b/src/lib/stores/insults.js
new file mode 100644
index 0000000..d8bd340
--- /dev/null
+++ b/src/lib/stores/insults.js
@@ -0,0 +1,50 @@
+import { readable } from 'svelte/store';
+import { browser } from '$app/env';
+import { conjugate, pluralize } from '$lib/grammar';
+
+const internals = {
+ kVersion: '1:', // in case we need to force a re-fetch
+ kHost: import.meta.env.VITE_PUBLIC_BASE_PATH || 'http://localhost:3000',
+ kDataPrefix: '/data/',
+ kVerbsPath: '/verbs.json',
+ kNounsPath: '/nouns.json',
+
+ async get(path) {
+
+ const targetFile = internals.kHost + internals.kDataPrefix + path;
+ const data = browser && localStorage.getItem(internals.kVersion + targetFile);
+
+ if (data) {
+ return JSON.parse(data);
+ }
+
+ let newData = await (await fetch(targetFile)).json();
+ browser && localStorage.setItem(internals.kVersion + targetFile, JSON.stringify(newData));
+
+ return newData;
+ },
+
+ random(list) {
+
+ return list[Math.floor(Math.random() * list.length)];
+ }
+};
+
+export const getInsult = function () {
+
+ return readable(null, function (set) {
+
+ (async function() {
+
+ const verbs = await internals.get(internals.kVerbsPath);
+ const nouns = await internals.get(internals.kNounsPath);
+
+ const verb = await conjugate(internals.random(verbs));
+ const noun = pluralize(internals.random(nouns));
+
+ set(`${verb} ${noun}`.toLowerCase());
+ })();
+
+ return function stop() {};
+ });
+};