feat(activity): foco de peer, badges contados vs indicador
PeerActivityFocus suprime notificações no canal visível; screencast só prepara IP e signal; chat sem eco na sala. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
1 parent
f6b2cf3ecd
commit
1414f59a20
16 files changed
+497
-56
No files matched your search
@@ -4,6 +4,7 @@ import pitiupi.application.messaging.MessageDispatcher;
|
||||
import pitiupi.application.messaging.PluginTransportCatalog;
|
||||
import pitiupi.application.messaging.SendTarget;
|
||||
import pitiupi.application.messaging.TransportMode;
|
||||
import pitiupi.api.plugin.PeerActivityFocusTokens;
|
||||
import pitiupi.application.presence.UserPeerView;
|
||||
import pitiupi.chat.control.PrivateChatController;
|
||||
import pitiupi.chat.control.PrivateChatUiSink;
|
||||
@@ -68,6 +69,7 @@ public class ChatPanel extends JPanel implements PrivateChatUiSink {
|
||||
private PrivateChatController privateChatController;
|
||||
private PeerDraftPanel draftPanel;
|
||||
private Runnable pendingTranscriptFlush;
|
||||
private String pluginId;
|
||||
|
||||
public ChatPanel(ConnectionManager connectionManager) {
|
||||
this.connectionManager = connectionManager;
|
||||
@@ -100,6 +102,10 @@ public class ChatPanel extends JPanel implements PrivateChatUiSink {
|
||||
selectRoomSession();
|
||||
}
|
||||
|
||||
public void setPluginId(String pluginId) {
|
||||
this.pluginId = pluginId;
|
||||
}
|
||||
|
||||
private void initSessionTabs() {
|
||||
sessionTabs.addOrSelectTab(
|
||||
PluginSessionKeys.ROOM,
|
||||
@@ -146,6 +152,7 @@ public class ChatPanel extends JPanel implements PrivateChatUiSink {
|
||||
if (PluginSessionKeys.ROOM.equals(key)) {
|
||||
routingPanel.bindRoomSession();
|
||||
switchActiveConversation(ROOM_KEY);
|
||||
reportActivityFocusForRoom();
|
||||
return;
|
||||
}
|
||||
if (key.startsWith("peer:") && !PluginSessionKeys.PEER_DRAFT.equals(key)) {
|
||||
@@ -153,9 +160,40 @@ public class ChatPanel extends JPanel implements PrivateChatUiSink {
|
||||
String name = peerDisplayNames.getOrDefault(ip, ip);
|
||||
routingPanel.bindPeerSession(ip, name);
|
||||
switchActiveConversation(resolveConversationKey());
|
||||
reportActivityFocusForPeerIp(ip);
|
||||
}
|
||||
}
|
||||
|
||||
private void reportActivityFocusForRoom() {
|
||||
if (pluginId == null) {
|
||||
return;
|
||||
}
|
||||
connectionManager.getPeerActivityFocus()
|
||||
.setFocusedChannel(pluginId, PeerActivityFocusTokens.broadcast());
|
||||
}
|
||||
|
||||
private void reportActivityFocusForPeerIp(String ip) {
|
||||
if (pluginId == null) {
|
||||
return;
|
||||
}
|
||||
connectionManager.getPeerActivityFocus()
|
||||
.setFocusedChannel(pluginId, resolvePeerFocusToken(ip));
|
||||
}
|
||||
|
||||
private String resolvePeerFocusToken(String ip) {
|
||||
String canonical = canonicalPeerIp(ip);
|
||||
for (UserPeerView view : connectionManager.getPresenceService().listPeerViews()) {
|
||||
if (view.isBroadcastTarget() || view.isSelf()) {
|
||||
continue;
|
||||
}
|
||||
if (view.getInstanceId() != null
|
||||
&& view.getInetAddress().map(PeerIpv4::fromInetAddress).orElse("").equals(canonical)) {
|
||||
return PeerActivityFocusTokens.peerInstance(view.getInstanceId());
|
||||
}
|
||||
}
|
||||
return PeerActivityFocusTokens.peerIp(canonical);
|
||||
}
|
||||
|
||||
private void openDraftPeerTab() {
|
||||
String previous = sessionTabs.selectedKey();
|
||||
if (previous != null && !PluginSessionKeys.PEER_DRAFT.equals(previous)) {
|
||||
@@ -260,6 +298,7 @@ public class ChatPanel extends JPanel implements PrivateChatUiSink {
|
||||
}
|
||||
|
||||
public void focusGeneralRoom() {
|
||||
reportActivityFocusForRoom();
|
||||
sessionTabs.selectTab(PluginSessionKeys.ROOM);
|
||||
}
|
||||
|
||||
@@ -420,7 +459,7 @@ public class ChatPanel extends JPanel implements PrivateChatUiSink {
|
||||
appendSystemLine(activeConversationKey, "Informe um IP válido para enviar a um peer.");
|
||||
return;
|
||||
}
|
||||
String ip = LocalNetworkInfo.bestLocalIpv4();
|
||||
String ip = PeerIpv4.normalize(LocalNetworkInfo.bestLocalIpv4());
|
||||
ChatMessage message = new ChatMessage(
|
||||
connectionManager.getUserName(),
|
||||
text,
|
||||
|
||||
@@ -2,6 +2,7 @@ package pitiupi.chat.plugin;
|
||||
|
||||
import pitiupi.api.plugin.PeerActionsRegistrar;
|
||||
import pitiupi.api.plugin.PluginWorkspace;
|
||||
import pitiupi.api.plugin.PeerActivityFocusTokens;
|
||||
import pitiupi.application.activity.PeerActivityInbox;
|
||||
import pitiupi.application.peeractions.PeerAction;
|
||||
import pitiupi.application.peeractions.PeerActionTarget;
|
||||
@@ -41,6 +42,7 @@ public class ChatPlugin extends Plugin implements PrivateChatHost {
|
||||
this.workspace = workspace;
|
||||
this.privateChatController = new PrivateChatController(connectionManager, this);
|
||||
this.chatPanel = new ChatPanel(connectionManager);
|
||||
chatPanel.setPluginId(getIdentifier());
|
||||
chatPanel.setPrivateChatController(privateChatController);
|
||||
privateChatController.setUiSink(chatPanel);
|
||||
bindShellWorkspaceContent(chatPanel);
|
||||
@@ -119,6 +121,10 @@ public class ChatPlugin extends Plugin implements PrivateChatHost {
|
||||
}
|
||||
|
||||
private void recordChatActivity(ChatMessage msg) {
|
||||
String localName = connectionManager.getUserName();
|
||||
if (localName != null && msg.getName() != null && localName.equals(msg.getName().trim())) {
|
||||
return;
|
||||
}
|
||||
if (LocalUserIdentity.isLocalSender(connectionManager, msg.getName(), msg.getSenderIp())) {
|
||||
return;
|
||||
}
|
||||
@@ -126,12 +132,17 @@ public class ChatPlugin extends Plugin implements PrivateChatHost {
|
||||
String tag = msg.getTransportLabel();
|
||||
boolean multicast = tag != null && tag.toLowerCase().contains("multicast");
|
||||
if (multicast) {
|
||||
inbox.recordBroadcast(getIdentifier(), "chat.focus");
|
||||
inbox.recordBroadcastCounted(getIdentifier(), "chat.focus", PeerActivityFocusTokens.broadcast());
|
||||
return;
|
||||
}
|
||||
String instanceId = peerInstanceIdForActivity(msg.getSenderIp());
|
||||
if (instanceId != null) {
|
||||
inbox.record(instanceId, getIdentifier(), "chat.peer");
|
||||
inbox.recordCounted(
|
||||
instanceId,
|
||||
getIdentifier(),
|
||||
"chat.peer",
|
||||
PeerActivityFocusTokens.peerInstance(instanceId)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,7 +180,12 @@ public class ChatPlugin extends Plugin implements PrivateChatHost {
|
||||
privateChatController.receiveMessage(connection, legacy);
|
||||
String instanceId = peerInstanceIdForActivity(PeerIpv4.fromInetAddress(connection.getAddress()));
|
||||
if (instanceId != null) {
|
||||
connectionManager.getPeerActivityInbox().record(instanceId, getIdentifier(), "chat.private.tcp");
|
||||
connectionManager.getPeerActivityInbox().recordCounted(
|
||||
instanceId,
|
||||
getIdentifier(),
|
||||
"chat.private.tcp",
|
||||
PeerActivityFocusTokens.peerInstance(instanceId)
|
||||
);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user