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

240
LINES

< > BotCompany Repo | #1003678 // "Random" v4 (with table instead of list & actions)

JavaX source code [tags: use-pretranspiled] - run with: x30.jar

Libraryless. Click here for Pure Java version (4119L/29K/99K).

1  
!759
2  
3  
static JTable table;
4  
static JTextArea chat;
5  
static JTextField input;
6  
static File logFile;
7  
static new L<S> log;
8  
static L<S> recommendations;
9  
10  
static int listDelay = 2000, listMakingTimeout = 2000;
11  
static int maxListLength = 100;
12  
13  
static Bool thinking;
14  
static bool updateOnce = true;
15  
static new Thinker thinker;
16  
17  
static S systemPrefix = "[system]";
18  
19  
p-awt {
20  
  //substanceLAF("EmeraldDusk"); // Too dark!
21  
  substanceLAF("ChallengerDeep");
22  
  loadLog();
23  
24  
  thinker.startUp(log);
25  
  
26  
  table = new JTable;
27  
  chat = autoScroll(wordWrapTextArea());
28  
  chat.setText(joinLines(log));
29  
  input = new JTextField;
30  
  JFrame frame = showFrame(vgrid(centerAndSouth(chat, input), table));
31  
  //setFrameIconLater(frame, "#1003593");
32  
  
33  
  onEnter(input, r {
34  
    post();
35  
  });
36  
  
37  
  onDoubleClick(table, voidfunc(int row) {
38  
    S s = getSelectedLine(table).get(0);
39  
    if (empty(s)) ret;
40  
    input.setText(s);
41  
    post();
42  
  });
43  
  
44  
  fillList();
45  
  
46  
  input.requestFocus();
47  
}
48  
49  
static S getInput() {
50  
  ret joinLines(" # ", input.getText().trim());
51  
}
52  
53  
static void post() {
54  
  S i = getInput();
55  
  if (inputAllowedByUser(i))
56  
    post(i);
57  
}
58  
59  
static bool inputAllowedByUser(S i) {
60  
  ret !swic(i, systemPrefix);
61  
}
62  
63  
static void postSystemMessage(S msg) {
64  
  post(systemPrefix + " " + msg);
65  
}
66  
67  
static void post(S i) {
68  
  S s = i + "\n";
69  
  chat.append(s);
70  
  appendToFile(logFile, "[" + chatTime() + "] " + s);
71  
  log.add(i);
72  
  input.selectAll();
73  
  updateOnce = true;
74  
  action(i);
75  
}
76  
77  
static void action(S s) {
78  
  if (!s.startsWith("!")) ret;
79  
  s = dropPrefix("!", s);
80  
  new Matches m;
81  
  if "start program *" {
82  
    S progID = m.fsi(0);
83  
    S title = getSnippetTitle(progID);
84  
    // TODO: Show author!
85  
    S msg = "Run program " + progID + " - " + title + "?";
86  
    if (confirmOKCancel(chat, msg)) {
87  
      postSystemMessage("Starting program " + progID + " - " + quote(title));
88  
      nohupJavax(progID);
89  
    } else
90  
      postSystemMessage("Program start cancelled by user (was: " + progID + ")");
91  
  }
92  
}
93  
94  
static void fillList() {
95  
  bool t = shouldUpdateList() || updateOnce;
96  
  updateOnce = false;
97  
  if (neq(t, thinking)) {
98  
    thinking = t;
99  
    setFrameIcon(table, t ? "#1003603" : "#1003593");
100  
  }
101  
  
102  
  if (!t)
103  
    againl8r();
104  
  else thread "Fill List" {
105  
    final new L<S> data;
106  
    thinker.makeListData(data);
107  
    
108  
    dataToTable_uneditable(table, data);
109  
    againl8r();
110  
  }
111  
}
112  
113  
static void againl8r() {
114  
  swingAfter(table, listDelay, r { fillList(); });
115  
}
116  
117  
static bool shouldUpdateList() {
118  
  ret getFrame(table).isFocused()
119  
    && !mouseInComponent(table);
120  
}
121  
122  
// also called from outside
123  
static L<S> loadLog() {
124  
  if (logFile == null)
125  
    logFile = getProgramFile("log.txt");
126  
  for (S s : toLines(loadTextFile(logFile))) pcall {
127  
    log.add(substring(s, s.indexOf(']')+1).trim());
128  
  }
129  
  ret log;
130  
}
131  
132  
!include #1003606 // GenTesting
133  
134  
sclass Thinker {
135  
  new MultiSet<S> scores;
136  
  
137  
  void startUp(L<S> log) {
138  
    final L<S> _log = cloneList(log); // Clone to be safe
139  
    
140  
    thread "Scoring!" {
141  
      GenTesting gt = new GenTesting(voidfunc(L<Gen> gens, L<S> log) { makeGenerators(gens, log); });
142  
      scores = gt.scoreGenerators(_log);
143  
    }
144  
  }
145  
146  
  // also called from outside
147  
  void recommendSolver(S solverID) {
148  
    if (!isRecommendedSolver(solverID = fsi(solverID))) {
149  
      print("Adding recommended solver: " + solverID);
150  
      logQuoted("recommendations.txt", solverID);
151  
    } else
152  
      print("Solver already recommended: " + solverID);
153  
  }
154  
  
155  
  bool isRecommendedSolver(S solverID) {
156  
    ret contains(scanLog("recommendations.txt"), fsI(solverID));
157  
  }
158  
  
159  
  L<Gen> sortGenerators(L<Gen> gens, final MultiSet<S> scores) {
160  
    ret sortedList(gens, func(Gen a, Gen b) {
161  
      scores.get(b.name)-scores.get(a.name)
162  
    });
163  
  }
164  
165  
  void makeListData(L l) {
166  
    try {
167  
      new L<Gen> gens;
168  
      makeGenerators(gens, log);
169  
      gens = sortGenerators(gens, scores);
170  
      if (empty(gens)) {
171  
        l.add(ll("No generators"));
172  
        ret;
173  
      }
174  
      
175  
      long timeout = now() + listMakingTimeout;
176  
      int i = -1;
177  
      new HashSet<S> seen;
178  
      while (now() < timeout && l(l) < maxListLength && nempty(gens)) {
179  
        i = (i+1) % l(gens);
180  
        Gen gen = gens.get(i);
181  
        try {
182  
          S s = cast callF(gen.func);
183  
          if (empty(s) || seen.contains(s))
184  
            gens.remove(i);
185  
          else {
186  
            seen.add(s);
187  
            l.add(litorderedmap("Suggestion", s, "Suggester", gen.name));
188  
          }
189  
        } catch {
190  
          gens.remove(i);
191  
        }
192  
      }
193  
    } catch e {
194  
      printStackTrace(e);
195  
      l.add(e.toString());
196  
    }
197  
  }
198  
}
199  
200  
// CREATIVE PART!
201  
202  
// put func {}'s returning a string in there
203  
static void makeGenerators(L<Gen> l, final L<S> log) {
204  
  gen(l, "hello random", func { "Hello " + randomID(10) });
205  
  gen(l, quine(func { last(log) }));
206  
  gen(l, quine(func { oneOf(log) }));
207  
  gen(l, "1 assoc", oneAssoc(log));
208  
  gen(l, "most popular", mostPopular(log));
209  
  addLoadedSolvers(l);
210  
}
211  
212  
svoid addLoadedSolvers(L<Gen> l) {
213  
  if (recommendations == null) { 
214  
    recommendations = new L;
215  
    for (S s : scanLog("recommendations.txt"))
216  
      if (isSnippetID(s))
217  
        recommendations.add(s);
218  
  }
219  
    
220  
  for (final S solverID : recommendations)
221  
    gen(l, solverID, func {
222  
      O c = hotwireCached(solverID);
223  
      ret call(c, "calc", log);
224  
    });
225  
}
226  
227  
static O oneAssoc(final L<S> log) {
228  
  ret func {
229  
    for (int i = l(log)-2; i >= 0; i--)
230  
      if (eqic(log.get(i), last(log)))
231  
        ret log.get(i+1);
232  
    null;
233  
  };
234  
}
235  
236  
static O mostPopular(final L<S> log) {
237  
  ret func {
238  
    ret new MultiHashSet<S>(log).getMostPopularEntry();
239  
  };
240  
}

Author comment

Began life as a copy of #1003669

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: #1003678
Snippet name: "Random" v4 (with table instead of list & actions)
Eternal ID of this version: #1003678/1
Text MD5: 870354b43e48434af2b19e7e8c8e6e21
Transpilation MD5: ee0966e090a74d20a6319fe620a235b5
Author: stefan
Category: javax / talking robots
Type: JavaX source code
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2016-07-25 17:54:00
Source code size: 5788 bytes / 240 lines
Pitched / IR pitched: No / No
Views / Downloads: 598 / 850
Referenced in: [show references]