Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

212
LINES

< > BotCompany Repo | #1003813 // Random Main v7 (include)

JavaX fragment (include)

1  
static JTable table;
2  
static JTextArea chat;
3  
static JTextField input;
4  
static new L<S> log;
5  
static L<S> recommendations;
6  
7  
static int listDelay = 2000;
8  
9  
static Bool thinking;
10  
static new Thinker thinker;
11  
12  
static S systemPrefix = "[system]";
13  
14  
static S dialog = "new";
15  
16  
svoid randomMain {
17  
  //substanceLAF("EmeraldDusk"); // Too dark!
18  
  substanceLAF("ChallengerDeep");
19  
  loadLog();
20  
  
21  
  logEvent("Starting");
22  
23  
  thinker.startUp(log);
24  
  
25  
  table = tableWithTooltips();
26  
  chat = autoScroll(wordWrapTextArea());
27  
  chat.setText(joinLines(log));
28  
  input = new JTextField;
29  
  JFrame frame = showFrame(vgrid(centerAndSouth(chat, input), table));
30  
  //setFrameIconLater(frame, "#1003593");
31  
  
32  
  onEnter(input, r {
33  
    post();
34  
  });
35  
  
36  
  onDoubleClick(table, voidfunc(int row) {
37  
    chooseSuggestion(row);
38  
  });
39  
  
40  
  for (int i = 1; i <= 12; i++) {
41  
    final int _i = i;
42  
    registerFunctionKey(frame, i, r {
43  
      chooseSuggestion(_i-1);
44  
    });
45  
  }
46  
  
47  
  onUpdate(input, r { updateOnce(); });
48  
 
49  
  updateOnce();
50  
  
51  
  input.requestFocus();
52  
  
53  
  if (isAction(last(log)) && confirmYesNo(input, "Run action? " + last(log)))
54  
    action(last(log));
55  
}
56  
57  
static S getInput() {
58  
  ret joinLines(" # ", input.getText().trim());
59  
}
60  
61  
static void post() {
62  
  S i = getInput();
63  
  if (inputAllowedByUser(i))
64  
    post(i);
65  
}
66  
67  
svoid chooseSuggestion(int row) {
68  
  L<S> line = getTableLine(table, row);
69  
  if (line == null) ret;
70  
  Map<S, S> map = getTableLineAsMap(table, row);
71  
  S s = line.get(0);
72  
  if (empty(s)) ret;
73  
  
74  
  new L topSuggesters;
75  
  for (int i = 0; i < row; i++)
76  
    topSuggesters.add(getTableLineAsMap(table, i));
77  
  if (empty(topSuggesters)) topSuggesters = null;
78  
79  
  logEvent("Suggestion chosen", mapPlus(map, "Row", row+1, "Input", getInput(), "Top Suggesters", topSuggesters));
80  
  input.setText(s);
81  
  post();
82  
}
83  
84  
svoid logEvent(S type) {
85  
  logEvent(type, litmap());
86  
}
87  
88  
svoid logEvent(S type, Map map) {
89  
  logStructure(new File(dialogDir(), "event.log"),
90  
    ll(type, chatTime(), map));
91  
}
92  
93  
static bool inputAllowedByUser(S i) {
94  
  ret !swic(i, systemPrefix);
95  
}
96  
97  
// may be called from other thread
98  
static void postSystemMessage(final S msg) {
99  
  if (nempty(msg)) awtIfNecessary {
100  
    post(systemPrefix + " " + msg);
101  
  }
102  
}
103  
104  
static void post(S i) {
105  
  S s = i + "\n";
106  
  chat.append(s);
107  
  appendToFile(logFile(), "[" + chatTime() + "] " + s);
108  
  logEvent("Posting", litmap("Text", s));
109  
  synchronized(mc()) {
110  
    log.add(i);
111  
  }
112  
  input.selectAll();
113  
  updateOnce();
114  
  try {
115  
    action(i);
116  
  } catch e {
117  
    printStackTrace(e);
118  
    postSystemMessage(exceptionToStringShort(e));
119  
  }
120  
}
121  
122  
static bool isAction(S s) {
123  
  if (s == null) false;
124  
  s = dropBracketPrefix(s); // e.g. "[bot]"
125  
  ret s.startsWith("!");
126  
}
127  
128  
static void action(S s) {
129  
  s = dropBracketPrefix(s); // e.g. "[bot]"
130  
  if (!s.startsWith("!")) ret;
131  
  s = dropPrefix("!", s);
132  
  
133  
  final S _s = s;
134  
  thread "Action" {
135  
    loading {
136  
      try {
137  
        randomCmds(_s);
138  
        actionImpl(_s); // user must provide this
139  
      } catch e {
140  
        printStackTrace(e);
141  
        postSystemMessage("Error - " + exceptionToStringShort(e));
142  
      }
143  
    }
144  
  }
145  
}
146  
147  
static void fillList(bool force) {
148  
  bool t = force || shouldUpdateList();
149  
  if (neq(t, thinking)) {
150  
    thinking = t;
151  
    setFrameIcon(table, t ? "#1003603" : "#1003593");
152  
  }
153  
  
154  
  if (!t)
155  
    againl8r();
156  
  else thread "Fill List" {
157  
    final new L<S> data;
158  
    thinker.makeListData(cloneList(log), getInput(), data);
159  
    
160  
    dataToTable_uneditable(table, data);
161  
    againl8r();
162  
  }
163  
}
164  
165  
static void updateOnce() { fillList(true); }
166  
167  
static void againl8r() {
168  
  swingAfter(table, listDelay, r { fillList(false); });
169  
}
170  
171  
static bool shouldUpdateList() {
172  
  ret getFrame(table).isFocused() && !mouseInComponent(table);
173  
}
174  
175  
// also called from outside
176  
static L<S> loadLog() {
177  
  log.clear();
178  
  for (S s : toLines(loadTextFile(logFile()))) pcall {
179  
    log.add(substring(s, s.indexOf(']')+1).trim());
180  
  }
181  
  ret log;
182  
}
183  
184  
synchronized static L<S> getLastFromLog(int n) {
185  
  ret cloneList(getLast(log, n));
186  
}
187  
188  
static File dialogDir() {
189  
  ret prepareProgramFile(dialog);
190  
}
191  
192  
static File logFile() {
193  
  ret new File(dialogDir(), "log.txt");
194  
}
195  
196  
static void switchDialog(final S name) {
197  
  swingAndWait(r {
198  
    dialog = name;
199  
    loadLog();
200  
    thinker = new Thinker;
201  
    thinker.startUp(log);
202  
    chat.setText(joinLines(log));
203  
  });
204  
}
205  
206  
static void randomCmds(S s) {
207  
  new Matches m;
208  
  if "dialog *" {
209  
    switchDialog(m.unq(0));
210  
    postSystemMessage("OK, dialog switched to " + quote(dialog));
211  
  }
212  
}

Author comment

Began life as a copy of #1003695

download  show line numbers  debug dex  old transpilations   

Travelled to 15 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, ddnzoavkxhuk, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt

No comments. add comment

Snippet ID: #1003813
Snippet name: Random Main v7 (include)
Eternal ID of this version: #1003813/1
Text MD5: 08784d65196411302e1bc77102b5d2a9
Author: stefan
Category: javax / talking robots
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2016-07-30 17:56:44
Source code size: 4665 bytes / 212 lines
Pitched / IR pitched: No / No
Views / Downloads: 589 / 823
Referenced in: [show references]