Download Jar. Libraryless. Click here for Pure Java version (16833L/122K).
1 | !7 |
2 | |
3 | static Map<S, Web> theoryForLineMap; |
4 | static L<S> globalIDList; // msg index to global ID |
5 | sbool listen = true; |
6 | static O onUpdate; |
7 | |
8 | static L<Web> peepHoleWebs; |
9 | |
10 | p { |
11 | if (isMain()) autoRestart(); |
12 | theoryForLineMap = persistentHashMap('theoryForLineMap); |
13 | globalIDList = persistentList('globalIDList); |
14 | if (empty(globalIDList)) loadFullHistory(); |
15 | if (listen) { |
16 | print("Listening to chat."); |
17 | stefansChat_onLine(100, voidfunc(S line) { |
18 | ChatMsg msg = mapToObject(stefansChat_onLine_fullParams!, ChatMsg); |
19 | handleChatMsg(msg); |
20 | pcallF(onUpdate); |
21 | }); |
22 | } |
23 | bot("Chat Theory."); |
24 | |
25 | onFileChangeAndNow(1, ai_chatAnalysis_peepHoleFile(), r { |
26 | peepHoleWebs = ai_chatAnalysis_peepHoleWebs(); |
27 | }); |
28 | } |
29 | |
30 | svoid loadFullHistory() { |
31 | int max = 10000; |
32 | L<ChatMsg> l = stefansChat_readArchive(max); |
33 | print("Got " + l(l) + "/" + max); |
34 | for (ChatMsg msg : l) pcall { handleChatMsg(msg); } |
35 | } |
36 | |
37 | svoid handleChatMsg(ChatMsg msg) { |
38 | lock dbLock(); |
39 | //print("Handling " + msg.globalID); |
40 | listPut(globalIDList, msg.nr, msg.globalID); |
41 | |
42 | Web web = theoryForLineMap.get(msg.globalID); |
43 | if (web != null) ret; // No overwrite for now |
44 | |
45 | WebNode n = simpleWeb().newNode(); |
46 | n.addLabel(/*"Text " +*/ quote(msg.text)); |
47 | web_addString(n, msg.botMark ? "by bot" : "by user"); |
48 | web_addStrings(n, ai_categoriesForChatLine(msg.text)); |
49 | web_addString(n, "Time " + msg.time); |
50 | web_addString(n, "Should I react?"); |
51 | n.addLabel("Msg " + msg.globalID); |
52 | |
53 | transformers(n); |
54 | |
55 | if (web_contentsDifferent(web, n.web)) { |
56 | if (web != null) print("Overwriting " + msg.globalID); |
57 | else print("Storing " + msg.globalID); |
58 | theoryForLineMap.put(msg.globalID, n.web); |
59 | } |
60 | } |
61 | |
62 | svoid transformers(WebNode n) { |
63 | for (S text : web_texts(n)) { |
64 | for (WebNode a : indexedNodes(quote(text))) { |
65 | WebNode b = web_operand(a, "with"); |
66 | if (b == null || !web_hasLabel(n, web_unquote(b))) continue; |
67 | WebNode c = web_operand(b, "transforms to"); |
68 | if (c != null) |
69 | web_replaceLabel(n, text, web_unquote(c)); |
70 | } |
71 | } |
72 | } |
73 | |
74 | answer { |
75 | if "show *" |
76 | ret showWeb(theoryForLineMap.get($1)) != null ? "OK" : "Not found"; |
77 | if "load full history" |
78 | ret "OK" with loadFullHistory(); |
79 | |
80 | if "size" ret lstr(theoryForLineMap); |
81 | } |
82 | |
83 | static Web lastWeb() { |
84 | ret theoryForLineMap.get(last(globalIDList)); |
85 | } |
86 | |
87 | static WebNode lastNode() { |
88 | ret web_firstNode(lastWeb()); |
89 | } |
90 | |
91 | sS html_thoughts() { |
92 | lock dbLock(); |
93 | Web web = lastWeb(); |
94 | if (web == null) ret ""; |
95 | WebNode node = web_firstNode(web); |
96 | L<S> texts = web_texts(node); |
97 | S html = ul_htmlencode(texts); |
98 | |
99 | //new LinkedHashSet<S> expect; |
100 | final new Map<S, Int> expect; |
101 | for (Web pw : unnull(peepHoleWebs)) { |
102 | for (WebNode a : web_allNodesNamed(pw, texts)) { |
103 | WebNode b = web_operand(a, "then"); |
104 | if (b != null) |
105 | for (S s : web_texts(b)) |
106 | putHigherInt(expect, s, 100); |
107 | |
108 | b = web_operand(a, "then maybe"); |
109 | if (b != null) { |
110 | int percent = 50; |
111 | pcall { |
112 | S ratio = web_string(web_getRelation(a, b), 1); |
113 | percent = ratioToIntPercent(parseFirstInt(ratio), parseSecondInt(ratio)); |
114 | } |
115 | for (S s : web_texts(b)) |
116 | putHigherInt(expect, s, percent); |
117 | } |
118 | } |
119 | } |
120 | |
121 | expect.remove("Should I react?"); |
122 | if (nempty(expect)) |
123 | html += "Expecting:" + ul_htmlencode( |
124 | map(keys(expect), func(S key) { |
125 | int percent = expect.get(key); |
126 | ret key + (percent >= 100 ? "" : " (" + percent + "%)"); |
127 | })); |
128 | |
129 | ret html; |
130 | } |
131 | |
132 | svoid react { pcall { |
133 | lock dbLock(); |
134 | WebNode n = lastNode(); |
135 | if (n == null) ret; |
136 | if (web_hasLabel(n, "I should react") && web_hasLabel(n, "greeting")) { |
137 | web_replaceLabel(n, "I should react", "I reacted"); |
138 | change(); |
139 | postToStefansChat("Hello Bozo"); |
140 | } |
141 | }} |
download show line numbers debug dex old transpilations
Travelled to 16 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, imzmzdywqqli, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pwiztjibzslt, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
Snippet ID: | #1010963 |
Snippet name: | Chat Theory Module |
Eternal ID of this version: | #1010963/40 |
Text MD5: | b17c038fd944f0c27d207971cc159b75 |
Transpilation MD5: | 82af1a3860ed83f24d8cac16fdf3aa44 |
Author: | stefan |
Category: | javax / chat |
Type: | JavaX source code (desktop) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2017-10-25 20:31:29 |
Source code size: | 3929 bytes / 141 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 592 / 3853 |
Version history: | 39 change(s) |
Referenced in: | [show references] |