!7 sclass BotConversationID { S dbID; long convoID; } concept Customer { S cookie; long lastPing; BotConversationID botConversationID; } concept Message { Customer customer; S text; bool unread; } concept IncomingMessage > Message {} concept OutgoingMessage > Message {} module MultiComm { start { dbIndexing(Customer, 'cookie); dm_vmBus_onMessage_q chatBot_userPolling(voidfunc(O mc, virtual Conversation conv) { S cookie = getString cookie(conv); if (empty(cookie)) ret; Customer c = uniq(Customer, +cookie); cset(c, lastPing := now()); }); dm_vmBus_onMessage_q chatBot_messageAdded(voidfunc(O mc, virtual Conversation conv, virtual Msg msg) { S cookie = getString cookie(conv); if (empty(cookie)) ret; Customer c = uniq(Customer, +cookie); cset(c, lastPing := now()); S text = getString text(msg); bool fromUser = getBool fromUser(msg); if (fromUser) cnew(IncomingMessage, customer := c, +text, unread := true); else cnew(OutgoingMessage, customer := c, +text); }); } visual jhsplit(jCenteredSection("Customers", makeConceptsTable(Customer)), jCenteredSection("Messages", makeConceptsTable(Message))); }