Libraryless. Click here for Pure Java version (2631L/17K/58K).
1 | !752 |
2 | |
3 | static S dataProgID = "#1002143"; // use data dir of "These Are Bot" v1 (don't use both bots at once...) |
4 | |
5 | // TODO: make a PersistentMultiMap? |
6 | |
7 | static new MultiMap<S, S> lists; |
8 | static new MultiMap<S, S> notLists; |
9 | |
10 | p {
|
11 | load(dataProgID, "lists"); |
12 | load(dataProgID, "notLists"); |
13 | makeBot("These Are Bot.");
|
14 | } |
15 | |
16 | synchronized answer {
|
17 | L<S> tok = javaTok(s); |
18 | if (eqic(get(tok, 1), "these") && eqic(get(tok, 3), "are") && eqic(get(tok, 7), ":")) {
|
19 | S kind = unquote(get(tok, 5)); |
20 | L<S> rest = subList(tok, 8); |
21 | ret addThem(kind, rest, true); |
22 | } |
23 | |
24 | if (eqic(get(tok, 1), "these") && eqic(get(tok, 3), "are") && eqic(get(tok, 5), "not") && eqic(get(tok, 9), ":")) {
|
25 | S kind = unquote(get(tok, 7)); |
26 | L<S> rest = subList(tok, 10); |
27 | ret addThem(kind, rest, false); |
28 | } |
29 | |
30 | if (match("name a *", s, m)) {
|
31 | S kind = singular(simplify(m.unq(0))); |
32 | L<S> items = lists.get(kind); |
33 | if (empty(items)) |
34 | ret null; //"I don't know any " + m.unq(0); |
35 | ret randomOne(items); |
36 | } |
37 | |
38 | if (match("name * *", s, m)) {
|
39 | S n = m.get(0); |
40 | if (isInteger(n)) {
|
41 | int _n = min(100, parseInt(n)); |
42 | S kind = singular(simplify(m.unq(1))); |
43 | L<S> items = cloneList(lists.get(kind)); |
44 | if (l(items) < _n) |
45 | ret "I don't know that many " + m.unq(1); |
46 | new L<S> l; |
47 | for (int i = 0; i < _n; i++) {
|
48 | S x = randomOne(items); |
49 | l.add(x); |
50 | items.remove(x); |
51 | } |
52 | ret join(", ", l);
|
53 | } |
54 | } |
55 | |
56 | S userName = cast callOpt(mainBot, "getUserName"); |
57 | |
58 | if (match("am i a *", s, m)) {
|
59 | if (empty(userName)) |
60 | ret "Well I don't know who you are! Please join slack.com"; |
61 | S kind = m.unq(0); |
62 | boolean result = containsIgnoreCase(lists.get(kind), userName) |
63 | || containsIgnoreCase(lists.get(kind), dropPrefix("@", userName));
|
64 | if (result) |
65 | ret format("Yes, you are a *!", kind);
|
66 | else |
67 | ret format("As far as I know, you are not a *.", kind);
|
68 | } |
69 | |
70 | if (match("is * a *", s, m)) {
|
71 | S instance = m.unq(0); |
72 | S kind = singular(simplify(m.unq(1))); |
73 | boolean result = containsIgnoreCase(lists.get(kind), instance); |
74 | if (result) |
75 | ret format("Yes, * is a *", instance, kind);
|
76 | else |
77 | ret null; |
78 | //ret format("I don't know that * is a *", instance, kind);
|
79 | } |
80 | |
81 | if (match("Are there any * other than *?", s, m)) {
|
82 | S kind = singular(simplify(m.unq(0))); |
83 | S instance = m.unq(1); |
84 | L<S> items = cloneList(lists.get(kind)); |
85 | removeIgnoreCase(items, instance); |
86 | if (empty(items)) |
87 | ret format("No, * is the only *.", instance, kind);
|
88 | else |
89 | ret format("Yes, for example *", randomOne(items));
|
90 | } |
91 | |
92 | if (match("list all *", s, m)) {
|
93 | S kind = singular(simplify(m.unq(0))); |
94 | L<S> items = lists.get(kind); |
95 | if (empty(items)) |
96 | ret null; // format("I don't know any *", kind);
|
97 | else |
98 | ret join(", ", items);
|
99 | } |
100 | |
101 | if (match("list all ex *", s, m)) {
|
102 | S kind = singular(simplify(m.unq(0))); |
103 | L<S> items = notLists.get(kind); |
104 | if (empty(items)) |
105 | ret null; // format("I don't know any ex *", kind);
|
106 | else |
107 | ret join(", ", items);
|
108 | } |
109 | } |
110 | |
111 | static S simplify(S s) {
|
112 | ret toLower(s); |
113 | } |
114 | |
115 | static S singular(S s) {
|
116 | if (s.endsWith("ies"))
|
117 | ret dropSuffix("ies", s) + "y";
|
118 | ret dropSuffix("s", s);
|
119 | } |
120 | |
121 | static S addThem(S kind, L<S> rest, boolean plus) {
|
122 | kind = singular(simplify(kind)); |
123 | boolean comma = rest.contains(",");
|
124 | new L<S> items; |
125 | if (comma) |
126 | for (L<S> item : splitListBy(rest, ",")) |
127 | items.add(trim(join(simpleSpaces(item)))); |
128 | else |
129 | items.addAll(codeTokensOnly(rest)); |
130 | printFormat((plus ? "Adding" : "Removing") + " items * to/from kind *", items, kind); |
131 | (plus ? lists : notLists).addAllIfNotThere(kind, items); |
132 | (plus ? notLists : lists).removeAll(kind, items); |
133 | save(dataProgID, "lists"); |
134 | save(dataProgID, "notLists"); |
135 | ret format("OK, now " + l(lists.get(kind)) + " items in kind *", kind);
|
136 | } |
Began life as a copy of #1002143
download show line numbers debug dex old transpilations
Travelled to 14 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1002240 |
| Snippet name: | These Are Bot 2 (with deleted items) |
| Eternal ID of this version: | #1002240/1 |
| Text MD5: | e1cbd7464c54907733747704d03fa759 |
| Transpilation MD5: | 02215eb903786f5f8960a305cc8c5555 |
| Author: | stefan |
| Category: | |
| Type: | JavaX source code |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2016-03-17 20:17:10 |
| Source code size: | 4051 bytes / 136 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 943 / 2004 |
| Referenced in: | [show references] |