!7 sclass MachineChat extends DynPrintLog { S receiver, msg; bool sign; transient StefansOS_ConnectToServer connector; visualize { ret centerAndSouthWithMargins( super.visualize(), westCenterAndEastWithMargin( jLine( jLabel("Send to"), jMinWidth(100, jLiveValueTextField_bothWays(dm_fieldLiveValue('receiver))), jLabel(":")), onEnterAndCtrlEnter(jLiveValueTextField_bothWays(dm_fieldLiveValue('msg)), rThread sendMsg), jLine( jLiveValueCheckBox("Sign", dm_fieldLiveValue('sign)), jbutton("Send", rThread sendMsg)))); } void sendMsg { postMsg(receiver, msg, sign); setField(msg := ""); } void postSigned(S receiver, S msg) { postMsg(receiver, msg, true); } void postMsg(S receiver, S msg, bool sign) { if (empty(receiver = trim(receiver))) ret; if (!possibleComputerID(receiver)) ret with infoBox("Not a computer ID: " + receiver); if (empty(msg = trim(msg))) ret; if (sign) msg = signWithComputerIDAndDate(msg); vmBus_send('sendingToPrivateMachineChat, receiver, msg); //logQuotedWithDate(javaxDataDir("OS Chat/sent.log"), msg); print("Sending to " + receiver + ": " + shorten(msg, 200)); connector.sendLine("privateMachineChat:" + receiver + " " + quote(msg)); } void cleanMeUp { cleanUp(connector); } start { thread { exportComputerPublicKeyToServerMechList(); } connector = new StefansOS_ConnectToServer; connector.onLine = voidfunc(S line) { new Matches m; if (startsWith(line, "privateMachineChat:privately from ", m)) { S s = m.rest(); int i = indexOf(s, ':'); S sender = takeFirst(s, i); S msg = unquote(substring(s, i+2)); printWithIndent(sender + " >> ", shorten(msg, 1000)); vmBus_send('gotFromPrivateMachineChat, sender, msg); //logQuotedWithDate(stefansOS_chat_receivedLogFile(), msg); } }; connector.startWithSubs("privateMachineChat"); } }