Skip to content

Outgoing friend messages not delivered despite successful protocol implementation #1

@keithah

Description

@keithah

Problem Description

Incoming messages work perfectly, but outgoing friend messages are not delivered to recipients despite implementing both modern unified messaging and legacy protocols with comprehensive debugging.

What Works ✅

  • Authentication: Complete Steam Guard login flow
  • Incoming messages: Successfully receive messages via ClientFriendMsgIncoming packets
  • Friend management: List, add, accept, remove friends all working
  • Persona state: Can set and maintain Online status (with PersonaSetByUser=true)
  • Client initialization: Full SteamKit-compatible setup with ClientSessionStart handshake

What Doesn't Work ❌

  • Outgoing messages: Neither unified messaging nor legacy protocols deliver messages to recipients
  • Messages are "sent" without errors but never received by the target user
  • Tested with multiple service method names and protobuf encodings

Technical Implementation

Protocols Tested

  1. Unified Messaging (FriendMessages.SendMessage#1)

    • Manual protobuf encoding with all required fields
    • Tried multiple service method variations
    • Added client_message_id field matching SteamKit
    • Gets no responses from Steam (tested Job IDs 2-6)
  2. Legacy Protocol (ClientFriendMsg)

    • Direct protobuf message with EMsg_ClientFriendMsg
    • Byte-encoded message content (not string)
    • Same approach as SteamKit's SendChatMessage
    • Sends without errors but messages not delivered

Key Enhancements Made

  • ClientSessionStart: Added missing critical handshake from SteamKit analysis
  • Enhanced login: OS type, machine ID, chat mode, UI mode, package version
  • PersonaSetByUser=true: Proper user-initiated persona state changes
  • Offline message request: Initialize message delivery system
  • Comprehensive debugging: Packet monitoring, job ID tracking, raw data analysis

Debug Evidence

Successful Incoming Message

[DAEMON] 📨 Message from 76561198025077538: test20
🔍 CLIENT DEBUG: Received packet - EMsg: EMsg_ClientFSOfflineMessageNotification (7523)

Outgoing Message Attempts

🐛 DEBUG: Sending unified message - Service: FriendMessages.SendMessage#1, Job ID: 2, Data length: 50
✅ SUCCESS: FriendMessages.SendMessage#1 sent with Job ID: 2
🐛 DEBUG: Using legacy ClientFriendMsg protocol (EMsg_ClientFriendMsg)...
✅ Message sent to Steam servers\!

No responses received for any outgoing message attempts despite comprehensive logging.

Questions

  1. Service Authentication: Do unified messaging services require additional authentication that we're missing?

  2. Protocol Evolution: Has Steam deprecated certain outgoing message protocols for third-party clients?

  3. Client State: Are we missing critical client state initialization that enables outgoing message delivery?

  4. Rate Limiting: Could Steam be silently dropping messages due to rate limiting or anti-spam measures?

Environment

  • Go Version: 1.24.5
  • Platform: macOS (Darwin 24.6.0)
  • go-steam Version: Latest (commit a4cfc61)
  • Steam Account: Not restricted, can send/receive via official Steam client

Request

Looking for insights on:

  • What enables outgoing message delivery in Steam's protocol
  • Whether there are additional handshakes or authentication steps required
  • If modern Steam has different requirements for third-party clients
  • Protocol analysis tools or approaches that could help identify the missing piece

The comprehensive debugging infrastructure is now in place to quickly test any suggested solutions.

References

  • Commit: a4cfc61 - Complete implementation with extensive debugging
  • All protocols implemented following SteamKit patterns
  • Incoming message delivery works perfectly, proving client setup is largely correct

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions