forked from cory/tildefriends
Cory McWilliams
d293637741
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3530 ed5197a5-7fde-0310-b194-c3ffbd925b24
260 lines
6.5 KiB
JavaScript
260 lines
6.5 KiB
JavaScript
"use strict";
|
|
|
|
terminal.setEcho(false);
|
|
terminal.setPrompt("🍔");
|
|
|
|
terminal.split([
|
|
{
|
|
type: "horizontal",
|
|
children: [
|
|
{
|
|
name: "form",
|
|
},
|
|
{
|
|
type: "vertical",
|
|
basis: "240px",
|
|
grow: "0",
|
|
shrink: "0",
|
|
children: [
|
|
{
|
|
name: "image",
|
|
basis: "8em",
|
|
shrink: "0",
|
|
},
|
|
{
|
|
name: "fizzbuzz",
|
|
grow: "1",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
]);
|
|
|
|
database.getAll().then(function(data) {
|
|
for (var i = 0; i < data.length; i++) {
|
|
database.remove(data[i]);
|
|
}
|
|
});
|
|
|
|
let kBurger = ` ......
|
|
/'.'.'.\\
|
|
&%@%@%@&
|
|
(######)
|
|
\\,,,,,,/`;
|
|
|
|
terminal.select("image");
|
|
terminal.print(kBurger);
|
|
terminal.select("form");
|
|
|
|
function countUp() {
|
|
var current = 0;
|
|
function countUpNext() {
|
|
terminal.select("fizzbuzz");
|
|
++current;
|
|
var result = "";
|
|
if (current % 3 == 0) {
|
|
result += "Fizz";
|
|
}
|
|
if (current % 5 == 0) {
|
|
result += "Buzz";
|
|
}
|
|
if (current % 150 == 0) {
|
|
result += "Grumble";
|
|
}
|
|
if (result == "") {
|
|
result = current.toString();
|
|
}
|
|
terminal.print(result);
|
|
terminal.select("form");
|
|
setTimeout(countUpNext, 1000);
|
|
};
|
|
setTimeout(countUpNext, 1000);
|
|
}
|
|
countUp();
|
|
|
|
var user = core.user.name;
|
|
|
|
let kIntroduction = [
|
|
{style: "font-size: xx-large; font-family: sans", value: "Summer of Cory"},
|
|
"Hi, it is warm outside again, and as is tradition, I want you to join me "+
|
|
"after work for some burgers on my deck. There are some quick questions "+
|
|
"below to gauge interest and availability. Please answer as best you can "+
|
|
"by clicking the options below, and I will get back to you with a plan.",
|
|
[],
|
|
];
|
|
|
|
let kBottom = [
|
|
{
|
|
iframe: `<html style="width: 100%; height: 100%; margin: 0; padding: 0">
|
|
<body style="width: 100%; height: 100%; margin: 0; padding: 0">
|
|
<textarea id="text" style="left: 0; top: 0; width: 100vw; height: 100vh; resize: none; margin: 0; padding: 0"></textarea>
|
|
</body>
|
|
</html>
|
|
`,
|
|
style: "border: 0; width: 640px; height: 240px; margin: 0; padding: 0",
|
|
},
|
|
];
|
|
|
|
let kQuestions = [
|
|
{text: "Do you want to be a part of the Summer of Cory?", options: ["yes", "no"]},
|
|
{text: "Tuesday after work works best for me. Does that work for you?", options: ["yes", "no"]},
|
|
{text: "How often would you expect to join us?", options: ["weekly", "fortnightly", "monthly", "impossible to predict"]},
|
|
|
|
//{text: "Pick numbers", options: ["1", "2", "3"], allowMultiple: true},
|
|
//{text: "Pick a letter", options: ["a", "b", "c", "d"]},
|
|
//{text: "Pick whatever", options: ["1", "2", "3", "a", "b", "c", "d"], writeIn: true},
|
|
];
|
|
|
|
let choices = [];
|
|
let writeIn = [];
|
|
let writingIn = undefined;
|
|
|
|
function getOptions(index) {
|
|
return kQuestions[index].options.concat(writeIn[index] || []);
|
|
}
|
|
|
|
function isChosen(question, choice) {
|
|
let selected = false;
|
|
if (kQuestions[question].allowMultiple) {
|
|
selected = choices[question] && choices[question].indexOf(choice) != -1;
|
|
} else {
|
|
selected = choices[question] == choice;
|
|
}
|
|
return selected;
|
|
}
|
|
|
|
function readData() {
|
|
return database.getAll().then(function(keys) {
|
|
var promises = [];
|
|
for (var i = 0; i < keys.length; i++) {
|
|
promises.push(database.get(keys[i]));
|
|
}
|
|
return Promise.all(promises);
|
|
}).then(function(allData) {
|
|
writeIn = [];
|
|
for (var i = 0; i < allData.length; i++) {
|
|
if (allData[i]) {
|
|
var entry = JSON.parse(allData[i]);
|
|
if (entry && entry.writeIn) {
|
|
for (var j = 0; j < entry.writeIn.length; j++) {
|
|
if (writeIn.indexOf(entry.writeIn[j]) == -1) {
|
|
writeIn.push(entry.writeIn[j]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return database.get("data_" + user);
|
|
}).then(function(data) {
|
|
if (data) {
|
|
choices = JSON.parse(data).choices;
|
|
}
|
|
}).catch(function(error) {
|
|
terminal.select("image");
|
|
terminal.print(error);
|
|
terminal.select("form");
|
|
});
|
|
}
|
|
|
|
function writeData() {
|
|
return database.set("data_" + user, JSON.stringify({choices: choices, writeIn: writeIn})).catch(function(error) {
|
|
terminal.select("image");
|
|
terminal.print(error);
|
|
terminal.select("form");
|
|
});
|
|
}
|
|
|
|
function render() {
|
|
return readData().then(function() {
|
|
terminal.cork();
|
|
try {
|
|
terminal.clear();
|
|
for (let line in kIntroduction) {
|
|
terminal.print(kIntroduction[line]);
|
|
}
|
|
let allowFill = writingIn === undefined;
|
|
for (let i in kQuestions) {
|
|
let availableOptions = getOptions(i);
|
|
let options = [];
|
|
for (let j in availableOptions) {
|
|
options.push(" ");
|
|
|
|
let value = (isChosen(i, availableOptions[j]) ? "☒" : "☐") + availableOptions[j];
|
|
if (allowFill) {
|
|
options.push({
|
|
command: JSON.stringify({action: "toggle", question: i, option: availableOptions[j]}),
|
|
value: value,
|
|
});
|
|
} else {
|
|
options.push(value);
|
|
}
|
|
}
|
|
if (kQuestions[i].writeIn) {
|
|
options.push(" or ");
|
|
if (writingIn !== undefined) {
|
|
options.push("write in another option below")
|
|
options.push(" ");
|
|
options.push({command: JSON.stringify({action: "endWriteIn"}), value: "cancel"});
|
|
} else {
|
|
options.push({command: JSON.stringify({action: "beginWriteIn", question: i}), value: "write in another option"});
|
|
}
|
|
}
|
|
terminal.print(kQuestions[i].text, ":", options);
|
|
terminal.print();
|
|
}
|
|
} finally {
|
|
for (let line in kBottom) {
|
|
terminal.print(kBottom[line]);
|
|
}
|
|
terminal.uncork();
|
|
}
|
|
});
|
|
}
|
|
|
|
core.register("onInput", function(input) {
|
|
if (writingIn !== undefined && input != "cancel") {
|
|
readData().then(function() {
|
|
if (!writeIn[writingIn]) {
|
|
writeIn[writingIn] = [];
|
|
}
|
|
if (input && writeIn[writingIn].indexOf(input) == -1) {
|
|
writeIn[writingIn].push(input);
|
|
}
|
|
writingIn = undefined;
|
|
terminal.setPrompt("> ");
|
|
return writeData();
|
|
}).then(render);
|
|
} else {
|
|
let command = JSON.parse(input);
|
|
if (command.action == "toggle") {
|
|
readData().then(function() {
|
|
if (kQuestions[command.question].allowMultiple) {
|
|
if (choices[command.question] && choices[command.question].indexOf(command.option) != -1) {
|
|
choices[command.question].splice(choices[command.question].indexOf(command.option), 1);
|
|
} else {
|
|
if (!choices[command.question]) {
|
|
choices[command.question] = [];
|
|
}
|
|
choices[command.question].push(command.option);
|
|
}
|
|
} else {
|
|
choices[command.question] = command.option;
|
|
}
|
|
return writeData();
|
|
}).then(render);
|
|
} else if (command.action == "beginWriteIn") {
|
|
writingIn = command.question;
|
|
terminal.setPrompt('Enter new option for "' + kQuestions[command.question].text + '": ');
|
|
render();
|
|
} else if (command.action == "endWriteIn") {
|
|
writingIn = undefined;
|
|
terminal.setPrompt("> ");
|
|
render();
|
|
}
|
|
}
|
|
});
|
|
|
|
render().catch(function(error) {
|
|
terminal.print(error);
|
|
}); |