Machine Coding Problem

Discord / Slack (Messaging)

maco60macoAllmessagingsession-managementpub-sub
Commonly Asked By:DiscordSlackMetaMicrosoft

Functional Scope (In-Scope)

  • Real-time Message Broker (Pub-Sub): Publish messages to channels and broadcast them to connected subscribers instantly.
  • Workspace & Channel Trees: Organise groups, public channels, private channels, and direct messages (DMs).
  • Session Management: Map active browser or device socket handles to online users.
  • Read Receipt Tracker: Keep track of the last read message ID per user per channel dynamically.

Explicit Boundaries (Out-of-Scope)

  • No Native Audio/Video WebRTC Media Sockets: Bypasses live video codecs, WebRTC STUN/TURN connection routes, or audio echo cancellation filters.
  • No Automatic Link Previews: Does not scrape external HTML pages to parse Open Graph metadata cards in real time.

Clean reference designs demonstrating pub-sub channels in Java and Python:

// ─── JAVA BLUEPRINT ──────────────────────────────────────────────────────────
import java.util.*;
import java.util.concurrent.*;

enum UserPresence {
    ONLINE, AWAY, DND, OFFLINE
}

class User {
    private final String userId;
    private final String username;

    public User(String userId, String username) {
        this.userId = userId;
        this.username = username;
    }

    public String getUserId() { return userId; }
    public String getUsername() { return username; }
}

class Message {
    private final String id;
    private final String senderId;
    private final String channelId;
    private final String content;
    private final long timestamp;

    public Message(String id, String senderId, String channelId, String content) {
        this.id = id;
        this.senderId = senderId;
        this.channelId = channelId;
        this.content = content;
        this.timestamp = System.currentTimeMillis();
    }

    public String getId() { return id; }
    public String getSenderId() { return senderId; }
    public String getChannelId() { return channelId; }
    public String getContent() { return content; }
    public long getTimestamp() { return timestamp; }
}

interface MessageSubscriber {
    void onMessage(Message msg);
    String getUserId();
}

class UserSession implements MessageSubscriber {
    private final String sessionId;
    private final String userId;

    public UserSession(String sessionId, String userId) {
        this.sessionId = sessionId;
        this.userId = userId;
    }

    @Override
    public void onMessage(Message msg) {
        System.out.println("[Session " + sessionId + " | User " + userId + "] Received Live Message in Channel " 
                           + msg.getChannelId() + " from " + msg.getSenderId() + ": " + msg.getContent());
    }

    @Override
    public String getUserId() { return userId; }
}

class Channel {
    private final String channelId;
    private final String name;
    private final List<Message> history = new CopyOnWriteArrayList<>();
    private final Set<MessageSubscriber> activeSubscribers = ConcurrentHashMap.newKeySet();

    public Channel(String channelId, String name) {
        this.channelId = channelId;
        this.name = name;
    }

    public String getChannelId() { return channelId; }
    public String getName() { return name; }

    public void subscribe(MessageSubscriber sub) {
        activeSubscribers.add(sub);
    }

    public void unsubscribe(MessageSubscriber sub) {
        activeSubscribers.remove(sub);
    }

    public void publish(Message msg) {
        history.add(msg);
        for (MessageSubscriber sub : activeSubscribers) {
            sub.onMessage(msg);
        }
    }

    public List<Message> getHistory() { return new ArrayList<>(history); }
}

class Workspace {
    private final String id;
    private final String name;
    private final Map<String, Channel> channels = new ConcurrentHashMap<>();
    private final Set<String> members = ConcurrentHashMap.newKeySet();

    public Workspace(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() { return id; }
    public void addChannel(Channel ch) { channels.put(ch.getChannelId(), ch); }
    public Channel getChannel(String chId) { return channels.get(chId); }
    public void addMember(String userId) { members.add(userId); }
    public boolean hasMember(String userId) { return members.contains(userId); }
}

class PresenceManager {
    private final Map<String, UserPresence> presenceMap = new ConcurrentHashMap<>();
    private final Map<String, Set<String>> presenceWatchers = new ConcurrentHashMap<>();

    public void setPresence(String userId, UserPresence presence) {
        presenceMap.put(userId, presence);
        System.out.println("Presence alert: User " + userId + " is now " + presence);
        Set<String> watchers = presenceWatchers.get(userId);
        if (watchers != null) {
            for (String watcher : watchers) {
                System.out.println("-> Notified " + watcher + " about User " + userId + "'s presence status: " + presence);
            }
        }
    }

    public UserPresence getPresence(String userId) {
        return presenceMap.getOrDefault(userId, UserPresence.OFFLINE);
    }

    public void watchPresence(String watcherUserId, String targetUserId) {
        presenceWatchers.computeIfAbsent(targetUserId, k -> ConcurrentHashMap.newKeySet()).add(watcherUserId);
    }
}

class ReadReceiptTracker {
    // Map of UserID -> (ChannelID -> LastReadMessageID)
    private final Map<String, Map<String, String>> readReceipts = new ConcurrentHashMap<>();

    public void markAsRead(String userId, String channelId, String messageId) {
        readReceipts.computeIfAbsent(userId, k -> new ConcurrentHashMap<>()).put(channelId, messageId);
        System.out.println("User " + userId + " read up to message: " + messageId + " in channel " + channelId);
    }

    public String getLastReadMessage(String userId, String channelId) {
        Map<String, String> userReceipts = readReceipts.get(userId);
        return userReceipts != null ? userReceipts.get(channelId) : null;
    }
}

class MessagingService {
    private final Map<String, Workspace> workspaceRegistry = new ConcurrentHashMap<>();
    private final Map<String, UserSession> activeSessions = new ConcurrentHashMap<>();
    private final PresenceManager presenceManager = new PresenceManager();
    private final ReadReceiptTracker readReceiptTracker = new ReadReceiptTracker();

    public void registerWorkspace(Workspace ws) {
        workspaceRegistry.put(ws.getId(), ws);
    }

    public Workspace getWorkspace(String wsId) { return workspaceRegistry.get(wsId); }

    public void userLogin(String userId, String sessionId) {
        UserSession session = new UserSession(sessionId, userId);
        activeSessions.put(userId, session);
        presenceManager.setPresence(userId, UserPresence.ONLINE);

        // Auto-subscribe to all workspace channels the user belongs to
        for (Workspace ws : workspaceRegistry.values()) {
            if (ws.hasMember(userId)) {
                for (Channel ch : ws.channels.values()) {
                    ch.subscribe(session);
                }
            }
        }
    }

    public void userLogout(String userId) {
        UserSession session = activeSessions.remove(userId);
        presenceManager.setPresence(userId, UserPresence.OFFLINE);
        if (session != null) {
            for (Workspace ws : workspaceRegistry.values()) {
                for (Channel ch : ws.channels.values()) {
                    ch.unsubscribe(session);
                }
            }
        }
    }

    public void postMessage(String wsId, String chId, String senderId, String text) {
        Workspace ws = getWorkspace(wsId);
        if (ws == null || !ws.hasMember(senderId)) {
            System.out.println("Sender " + senderId + " is not a member of Workspace " + wsId);
            return;
        }

        Channel channel = ws.getChannel(chId);
        if (channel == null) {
            System.out.println("Channel " + chId + " does not exist in workspace.");
            return;
        }

        String msgId = UUID.randomUUID().toString().substring(0, 8);
        Message message = new Message(msgId, senderId, chId, text);
        channel.publish(message);

        // Auto-mark as read for sender
        readReceiptTracker.markAsRead(senderId, chId, msgId);
    }

    public PresenceManager getPresenceManager() { return presenceManager; }
    public ReadReceiptTracker getReadReceiptTracker() { return readReceiptTracker; }
}

public class Main {
    public static void main(String[] args) {
        MessagingService service = new MessagingService();

        // 1. Create Workspace & Channels
        Workspace ws = new Workspace("W-TECH", "TechCorp");
        Channel devChannel = new Channel("C-DEV", "development");
        Channel randomChannel = new Channel("C-RANDOM", "random");
        ws.addChannel(devChannel);
        ws.addChannel(randomChannel);

        ws.addMember("U-Alice");
        ws.addMember("U-Bob");
        service.registerWorkspace(ws);

        // 2. Setup Presence Monitoring
        service.getPresenceManager().watchPresence("U-Alice", "U-Bob");

        // 3. User Login & Auto Subscriptions
        System.out.println("--- Users logging in ---");
        service.userLogin("U-Alice", "S-ALICE-101");
        service.userLogin("U-Bob", "S-BOB-202");

        // 4. Send Message & Verify Fanout
        System.out.println("\n--- Sending channel message ---");
        service.postMessage("W-TECH", "C-DEV", "U-Alice", "Hey Bob, did you review the PR?");

        // 5. Check Presence Changes
        System.out.println("\n--- Simulating status update ---");
        service.getPresenceManager().setPresence("U-Bob", UserPresence.AWAY);

        // 6. User logout and verify unsubscribe
        System.out.println("\n--- Bob logging out ---");
        service.userLogout("U-Bob");

        System.out.println("\n--- Alice posting after Bob logged out ---");
        service.postMessage("W-TECH", "C-DEV", "U-Alice", "I'll merge it then!");
    }
}