!747 m { p { makeAndroid3("Text Bot."); } static synchronized S answer(S s) { new Matches m; if (match3("get text for md5 *", s, m)) { S text = getTextForMd5(unquote(m.m[0])); ret text == null ? "Sorry." : format3("text: *", text); } if (match3("do you have md5 *?", s, m)) { File file = getTextFile(unquote(m.m[0])); boolean yes = file.exists(); ret yes ? "Yes (" + file.length() + " bytes)." : "No."; } if (match3("store text *", s, m)) { S text = unquote(m.m[0]); S md5 = storeText(text); ret format3("OK, stored. md5: *", md5); } if (match3("delete md5 *", s, m)) { S md5 = unquote(m.m[0]); getTextFile(md5).delete(); return "OK."; } if (match3("n", s)) { return "" + length(getProgramDir().listFiles()); } if (match3("list md5s", s)) { File[] files = getProgramDir().listFiles(); new L md5s; if (files != null) for (File f : files) { if (f.getName().endsWith(".txt")) md5s.add(f.getName().substring(0, 32).toLowerCase()); } return structure(md5s); } ret null; } static S storeText(S text) { S md5 = md5(text); saveTextFile(getTextFile(md5), text); return md5; } static File getTextFile(S md5) { verifyMD5(md5); return new File(programDir(), md5 + ".txt"); } static S getTextForMd5(S md5) { return loadTextFile(getTextFile(md5)); } }