Warning: session_start(): open(/var/lib/php/sessions/sess_hvjof0ee25nr1pbmh57manf6c1, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!7
concept AToken { S token; long lastSeen; }
concept ALine { S token; S line; }
concept ALineToSend > ALine {}
concept AIncomingLine > ALine { bool typed; }
concept AAction > ALine { bool verified; }
cmodule AssistantWebServer > DynPrintLog {
int httpPort = 8083, interval = 200, longPollTimeout = 60000;
S token, line;
start-thread {
importantDB();
print("Tokens:");
printIndentLines(collect token(sortByFieldDesc lastSeen(list(AToken))));
dm_serveHttpFromFunction(httpPort, func(S uri, SS params) enter {
if (eq(uri, "/register"))
ret serveText((S) dm_call(dm_assistant_usersCRUD(), 'registerUser, params.get('email), params.get('pwHash)));
if (eq(uri, "/checkPW")) {
S mail = params.get('email);
if (!isValidEmailAddress(mail)) ret serveText("Not a valid email address");
S userID = cast dm_call(dm_assistant_usersCRUD(), 'userIDForEmail, mail);
if (userID == null) ret serveText("User not found");
bool ok = cast dm_call(dm_assistant_passwordsCRUD(), 'checkPassword, userID, params.get('pwHash));
ret serveText(ok ? "OK" : "Wrong password");
}
// token-based
S token = params.get('token);
if (l(token) == 24) {
bumpToken(token);
if (eq(uri, "/poll")) {
ret serveLongPoll(longPollTimeout, interval, func {
temp enter();
S text = withDBLock(func -> S {
L l = conceptsWhere(ALineToSend, +token);
if (empty(l)) null;
deleteConcepts(l);
S text = lines_rtrim(collect line(sortConceptsByID(l)));
ret text;
});
if (text != null)
printWithTime("Served output to " + token + ": " + text);
ret text;
});
}
if (eq(uri, "/heard")) {
S line = params.get('line);
bool typed = eq("1", params.get('typed));
if (nempty(line)) {
cnew(AIncomingLine, +token, +line, +typed);
print("Heard from " + token + ": " + line);
vmBus_send phoneCatHeard(litmap(module := dm_moduleID(), +token, +line, +typed));
}
ret "OK";
}
}
ret serveText("hä");
});
}
void bumpToken(S token) { cset(uniq_sync(AToken, +token), lastSeen := now()); }
visual centerAndSouth(super, westCenterAndEastWithMargins(
withLabel("Token:", jMinWidth(150, dm_textField('token))),
withLabel("Text:", dm_textField('line)),
jbutton("Send", rThread guiSendLine)));
void guiSendLine enter {
dm_trimFields('line, 'token);
if (l(token) < 24) {
L tokens = filter(list(AToken), t -> startsWithIC(t.token, token));
if (l(tokens) > 1) ret with infoBox("Multiple tokens found, please give more chars");
if (l(tokens) == 1) setField(token := first(tokens).token);
}
if (l(token) != 24) ret with infoBox("Bad token");
if (empty(line)) ret;
cnew(ALineToSend, +token, +line);
print("Line sent");
}
// API
void sendToUser(S token, S line) { cnew(ALineToSend, +token, +line); }
}