Transpiled version (2412L) is out of date.
1 | !752 |
2 | |
3 | static class Line { |
4 | S id; |
5 | S text; |
6 | S type; |
7 | new L<S> on; |
8 | |
9 | Source source; |
10 | } |
11 | |
12 | static PersistentLog<Line> data; |
13 | static new Map<S, Line> byID; |
14 | static long nextID; |
15 | |
16 | p { |
17 | data = new PersistentLog("data"); |
18 | for (Line line : data) index(line); |
19 | load("nextID"); |
20 | } |
21 | |
22 | synchronized answer { |
23 | if "dn size" |
24 | ret "Dialog network: " + n(data.size(), "line"); |
25 | |
26 | if "dn add *" exceptionToUser{ |
27 | new Line line; |
28 | line.text = m.unq(0); |
29 | line.type = "user-added"; |
30 | add(line, new Source(s)); |
31 | ret "Yo! Your ID: " + line.id; |
32 | } |
33 | |
34 | if (matchAny(litlist("dn add * on *", "dn add * to *"), s, m)) exceptionToUser { |
35 | S ids = m.unq(1); |
36 | new Line line; |
37 | line.text = m.unq(0); |
38 | line.type = "user-added"; |
39 | line.on.addAll(splitIDs(ids)); |
40 | add(line, new Source(s)); |
41 | ret "Yo! Your ID: " + line.id; |
42 | } |
43 | |
44 | if "dn show *" exceptionToUser { |
45 | S id = clearID(m.unq(0)); |
46 | Line line = byID.get(id); |
47 | ret line == null ? format("Line * not found", id) : structure(line); |
48 | } |
49 | |
50 | if "dn refs *" exceptionToUser { |
51 | S id = clearID(m.unq(0)); |
52 | L<Line> refs = findRefsTo(id); |
53 | ret empty(refs) ? "No references found" : formatList(refs); |
54 | } |
55 | |
56 | if "dn search *" exceptionToUser { |
57 | S query = m.unq(0); |
58 | L<Line> refs = search(query); |
59 | ret empty(refs) ? "No results" : formatList(refs); |
60 | } |
61 | |
62 | if "dn clear yes i am sure" { |
63 | if (master()) { |
64 | clear(); |
65 | ret "OK"; |
66 | } |
67 | } |
68 | |
69 | if "dn dump" |
70 | ret "OK " + structure(data); |
71 | |
72 | if "dn copy from sister" exceptionToUser { |
73 | O sisterBot = getBot("#1002626"); |
74 | if (sisterBot == null) ret "No sister bot (install #1002626!)"; |
75 | S url = getString(get(sisterBot, "sister"), "robotURL"); |
76 | S q = "dn dump"; |
77 | S a = loadPage(url + "?" + makePostData("q", q)); |
78 | a = htmldecode(a); |
79 | a = dropPrefixMandatory("OK ", a); |
80 | L<Line> newData = cast unstructure(a); // we're trusting the other server here as its URL was given to us by master |
81 | if (empty(newData)) |
82 | ret "Empty data, did nothing"; |
83 | int l = l(data); |
84 | clear(); |
85 | data.addAll(newData); |
86 | for (Line line : newData) index(line); |
87 | fixNextID(); |
88 | ret "OK, cleared " + l + " entries, added " + l(newData) + " entries."; |
89 | } |
90 | } |
91 | |
92 | static S formatList(L<Line> lines) { |
93 | new L<S> l; |
94 | for (Line line : lines) { |
95 | S text = line.text; |
96 | l.add(line.id + ": " + (text.contains("\n") ? quote(text) : text)); |
97 | } |
98 | ret slackSnippet(fromLines(l)); |
99 | } |
100 | |
101 | static synchronized Line add(S s) { |
102 | new Line line; |
103 | line.text = s; |
104 | add(line, new Source("")); |
105 | ret line; |
106 | } |
107 | |
108 | |
109 | static void add(Line line, Source source) { |
110 | line.source = source; |
111 | line.id = newID(); |
112 | data.add(line); |
113 | index(line); |
114 | } |
115 | |
116 | static void index(Line line) { |
117 | byID.put(line.id, line); |
118 | } |
119 | |
120 | static S newID() { |
121 | S id = "_" + ++nextID; |
122 | save("nextID"); |
123 | ret id; |
124 | } |
125 | |
126 | static L<Line> findRefsTo(S id) { |
127 | new L<Line> l; |
128 | for (Line line : data) |
129 | if (line.on.contains(id)) |
130 | l.add(line); |
131 | ret l; |
132 | } |
133 | |
134 | static L<Line> search(S query) { |
135 | new L<Line> l; |
136 | for (Line line : data) |
137 | if (indexOfIgnoreCase(line.text, query) >= 0) |
138 | l.add(line); |
139 | ret l; |
140 | } |
141 | |
142 | static S clearID(S _id) { |
143 | S id = dropPrefix("_", _id); |
144 | if (!isInteger(id)) fail("woot bad id: " + quote(_id)); |
145 | ret "_" + id; |
146 | } |
147 | |
148 | static L<S> splitIDs(S s) { |
149 | new L<S> l; |
150 | for (S id : s.split("[ ,]+")) |
151 | l.add(clearID(id)); |
152 | ret l; |
153 | } |
154 | |
155 | static void clear() { |
156 | pcall { logQuoted("data.clear", loadTextFile(data.file)); } |
157 | data.clear(); |
158 | byID.clear(); |
159 | } |
160 | |
161 | static synchronized L<Line> findStarters() { |
162 | new L<Line> l; |
163 | for (Line line : data) |
164 | if (empty(line.on)) |
165 | l.add(line); |
166 | ret l; |
167 | } |
168 | |
169 | static void fixNextID() { |
170 | long id = 0; |
171 | for (Line line : data) |
172 | id = max(id, parseLong(dropPrefix("_", line.id))); |
173 | nextID = id+1; |
174 | save("nextID"); |
175 | } |
176 | |
177 | static L<Line> getReferences(Line line) { |
178 | ret findRefsTo(line.id); |
179 | } |
180 | |
181 | // here's the magic! might as well match loosely |
182 | static Line findStarter(S s) { |
183 | for (Line line : findStarters()) |
184 | if (match(s, line.text)) |
185 | ret line; |
186 | ret null; |
187 | } |
download show line numbers debug dex old transpilations
Travelled to 14 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, irmadwmeruwu, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
Snippet ID: | #1002666 |
Snippet name: | The Dialog Network (dev.) |
Eternal ID of this version: | #1002666/2 |
Text MD5: | c7cc9a6a364b61a30ffc24ba51ebc712 |
Author: | stefan |
Category: | eleu / javax |
Type: | JavaX source code |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2018-06-23 14:45:05 |
Source code size: | 4206 bytes / 187 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 622 / 1242 |
Version history: | 1 change(s) |
Referenced in: | [show references] |