Last updated on February 19, 2020
Length of String | String |
---|---|
4 Byte | String |
Number |
---|
4 Byte |
Number |
---|
8 Byte |
Character |
---|
1 Byte |
Type | Connection |
---|---|
P | Peer To Peer |
F | File Transfer |
D | Distributed Network |
Code | Status |
---|---|
-1 | Unknown |
0 | Offline |
1 | Away |
2 | Online |
Code | Type |
---|---|
0 | Download |
1 | Upload |
Send | Receive |
---|---|
Send to Server | Receive from Server |
These messages are used by clients to interface with the server. Internal Server messages are spooky and not understood, since the OSS crowd doesn’t have access to its source code. If you want a Soulseek server, check out Soulfind. Soulfind is obviously not the exact same the official Soulseek server, but it handles the protocol well enough (and can be modified).
In museekd 0.1.13, these messages are sent and received in Museek/ServerConnection.cc and defined in Museek/ServerMessages.hh. Since museekd 0.2, they are defined in museekd/servermessages.h.
In Nicotine, these messages are matched to their message number in slskproto.py in the SlskProtoThread function, defined in slskmessages.py and callbacks for the messages are set in pynicotine.py.
Message Length | Code | Message Contents |
---|---|---|
4 Bytes | 4 Bytes | … |
Login
Museekd: SLogin
Nicotine: Login
Send your username, password, and client version.
Description | Message Length | Message Code | Username Length | Username | Password Length | Password |
---|---|---|---|---|---|---|
Human | 72 | 1 | 8 | username | 8 | password |
Hex | 48 00 00 00 | 01 00 00 00 | 08 00 00 00 | 75 73 65 72 6e 61 6d 65 | 08 00 00 00 | 70 61 73 73 77 6f 72 64 |
Message, continued
Description | Version | Length | Hash | Minor Version |
---|---|---|---|---|
Human | 160 | 32 | d51c9a7e9353746a6020f9602d452929 | 1 |
Hex | a0 00 00 00 | 20 00 00 00 | 64 35 31 63 39 61 37 65 39 33 35 33 37 34 36 61 36 30 32 30 66 39 36 30 32 64 34 35 32 39 32 39 | 01 00 00 00 |
Message as a Hex Stream 48 00 00 00 01 00 00 00 08 00 00 00 75 73 65 72 6e 61 6d 65 08 00 00 00 70 61 73 73 77 6f 72 64 a0 00 00 00 20 00 00 00 64 35 31 63 39 61 37 65 39 33 35 33 37 34 36 61 36 30 32 30 66 39 36 30 32 64 34 35 32 39 32 39 01 00 00 00
Set Listen Port
Museekd: SSetListenPort
Nicotine: SetWaitPort
We send this to the server to indicate the port number that we listen on (2234 by default).
Get Peer Address
Museekd: SGetPeerAddress
Nicotine: GetPeerAddress
We send this to the server to ask for a peer’s address (IP address and port), given the peer’s username.
Add User
Museekd: SAddUser
Nicotine: AddUser
Used to be kept updated about a user’s stats. When a user’s stats have changed, the server sends a GetUserStats response message with the new user stats.
Remove User
Museekd: Unimplemented
Nicotine: RemoveUser
Used when we no longer want to be kept updated about a user’s stats.
Get Status
Museekd: SGetStatus
Nicotine: GetUserStatus
The server tells us if a user has gone away or has returned.
Say in Chat Room
Museekd: SSayChatroom
Nicotine: SayChatroom
Either we want to say something in the chatroom, or someone else did.
Join a Room
Museekd: SJoinRoom
Nicotine: JoinRoom
We send this message to the server when we want to join a room. If the room doesn’t exist, it is created.
Server responds with this message when we join a room. Contains users list with data on everyone.
Leave Room
Museekd: SLeaveRoom
Nicotine: LeaveRoom
We send this to the server when we want to leave a room.
A User Joined a Room
Museekd: SUserJoinedRoom
Nicotine: UserJoinedRoom
The server tells us someone has just joined a room we’re in.
A User Left a Room
Museekd: SUserLeftRoom
Nicotine: UserLeftRoom
The server tells us someone has just left a room we’re in.
Connect To Peer
Museekd: SConnectToPeer
Nicotine: ConnectToPeer
Either we ask server to tell someone else we want to establish a connection with them, or server tells us someone wants to connect with us. Used when the side that wants a connection can’t establish it, and tries to go the other way around (direct connection has failed).
See also: Peer Connection Message Order
Private Messages
Museekd: SPrivateMessage
Nicotine: MessageUser
Chat phrase sent to someone or received by us in private.
Acknowledge Private Message
Museekd: SAckPrivateMessage
Nicotine: MessageAcked
We send this to the server to confirm that we received a private message. If we don’t send it, the server will keep sending the chat phrase to us.
Museekd also resets timestamps to account for server-time bugginess.
File Search
Museekd: SFileSearch
Nicotine: FileSearch
We send this to the server when we search for something. Alternatively, the server sends this message to tell us that someone is searching for something.
The ticket/search id is a random number generated by the client and is used to track the search results.
Set Online Status
Museekd: SSetStatus
Nicotine: SetStatus
We send our new status to the server. Status is a way to define whether you’re available or busy.
-1 = Unknown
0 = Offline
1 = Away
2 = Online
Ping
Museekd: SPing
Nicotine: ServerPing
DEPRECATED
We test if the server responds.
Send Connect Token
Museekd: Unimplemented
Nicotine: SendConnectToken
DEPRECATED
Send Download Speed
Museekd: SSendSpeed
Nicotine: SendDownloadSpeed
DEPRECATED
We used to send this after a finished download to let the server update the speed statistics for a user.
Shared Folders & Files
Museekd: SSharedFoldersFiles
Nicotine: SharedFoldersFiles
We send this to server to indicate the number of folder and files that we share.
Get User Stats
Museekd: SGetUserStats
Nicotine: GetUserStats
The server sends this to indicate a change in a user’s statistics, if we’ve requested to watch the user in AddUser previously. A user’s stats can also be requested by sending a GetUserStats message to the server, but AddUser should be used instead.
Queued Downloads
Museekd: Unimplemented
Nicotine: QueuedDownloads
DEPRECATED
The server sends this to indicate if someone has download slots available or not.
Kicked from Server
Museekd: SKicked
Nicotine: Relogged
The server sends this if someone else logged in under our nickname, and then disconnects us.
User Search
Museekd: SUserSearch
Nicotine: UserSearch
We send this to the server when we search a specific user’s shares. The ticket/search id is a random number generated by the client and is used to track the search results.
Add Liked Interest
Museekd: SInterestAdd
Nicotine: AddThingILike
We send this to the server when we add an item to our likes list.
Remove Liked Interest
Museekd: SInterestRemove
Nicotine: RemoveThingILike
We send this to the server when we remove an item from our likes list.
Get Recommendations
Museekd: SGetRecommendations
Nicotine: Recommendations
The server sends us a list of personal recommendations and a number for each.
Get Global Recommendations
Museekd: SGetGlobalRecommendations
Nicotine: GlobalRecommendations
The server sends us a list of global recommendations and a number for each.
Get User Interests
Museekd: SUserInterests
Nicotine: UserInterests
We ask the server for a user’s liked and hated interests. The server responds with a list of interests.
Admin Command
Museekd: Unimplemented
Nicotine: AdminCommand
Place In Line Response
DEPRECATED
The server tells us a new room has been added.
Museekd: Unimplemented
Nicotine: PlaceInLineResponse
Room Added
DEPRECATED
The server tells us a new room has been added.
Museekd: Unimplemented
Nicotine: RoomAdded
Room Removed
DEPRECATED
The server tells us a room has been removed.
Museekd: Unimplemented
Nicotine: RoomRemoved
Room List
Museekd: SRoomList
Nicotine: RoomList
The server tells us a list of rooms and the number of users in them. When connecting to the server, the server only sends us rooms with at least 5 users. A few select rooms are also excluded, such as nicotine and The Lobby. Requesting the room list yields a response containing the missing rooms.
Exact File Search
Museekd: SExactFileSearch
Nicotine: ExactFileSearch
DEPRECATED (no results even with official client)
We send this to search for an exact file name and folder, to find other sources.
Global / Admin Message
Museekd: SGlobalMessage
Nicotine: AdminMessage
A global message from the server admin has arrived.
Global User List
Museekd: Unimplemented
Nicotine: GlobalUserList
DEPRECATED
We send this to get a global list of all users online.
Tunneled Message
Museekd: Unimplemented
Nicotine: TunneledMessage
DEPRECATED
Server message for tunneling a chat message.
Privileged Users
Museekd: SPrivilegedUsers
Nicotine: PrivilegedUsers
The server sends us a list of privileged users, a.k.a. users who have donated.
Have No Parents
Museekd: SHaveNoParents
Nicotine: HaveNoParent
We inform the server if we have a distributed parent or not. If not, the server eventually sends us a PossibleParents message with a list of 10 possible parents to connect to.
Parent’s IP
Museekd: SParentIP
Nicotine: SearchParent
We send the IP address of our parent to the server.
Parent Min Speed
Unknown purpose
Museekd: SParentMinSpeed
Nicotine: ParentMinSpeed (unused)
Parent Speed Ratio
Unknown purpose
Museekd: SParentSpeedRatio
Nicotine: ParentSpeedRatio (unused)
Parent Inactivity Timeout
DEPRECATED
Museekd: SParentInactivityTimeout
Nicotine: ParentInactivityTimeout
Search Inactivity Timeout
DEPRECATED
Museekd: SSearchInactivityTimeout
Nicotine: SearchInactivityTimeout
Minimum Parents In Cache
DEPRECATED
Museekd: SMinParentsInCache
Nicotine: MinParentsInCache
Distributed Alive Interval
DEPRECATED
Museekd: SDistribAliveInterval
Nicotine: DistribAliveInterval
Add Privileged User
Museekd: SAddPrivileged
Nicotine: AddToPrivileged
The server sends us the username of a new privileged user, which we add to our list of global privileged users.
Check Privileges
Museekd: SCheckPrivileges
Nicotine: CheckPrivileges
We ask the server how much time we have left of our privileges. The server responds with the remaining time, in seconds.
Search Request
The server sends us search requests from other users.
Museekd: SSearchRequest
Nicotine: SearchRequest
Accept Children
We tell the server if we want to accept child nodes.
Museekd: SAcceptChildren
Nicotine: AcceptChildren (not yet used)
Possible Parents
The server send us a list of 10 possible distributed parents to connect to. Messages of this type are sent to us at regular intervals, until we tell the server we don’t need more possible parents with a HaveNoParent message.
Museekd: SNetInfo
Nicotine: PossibleParents
Wishlist Search
Museekd: SWishlistSearch
Nicotine: WishlistSearch
Wishlist Interval
Museekd: SWishlistInterval
Nicotine: WishlistInterval
Get Similar Users
Museekd: SGetSimilarUsers
Nicotine: SimilarUsers
The server sends us a list of similar users related to our interests.
Get Item Recommendations
Museekd: SGetItemRecommendations
Nicotine: ItemRecommendations
The server sends us a list of recommendations related to a specific item, which is usually present in the like/dislike list or an existing recommendation list.
Get Item Similar Users
Museekd: SGetItemSimilarUsers
Nicotine: ItemSimilarUsers
The server sends us a list of similar users related to a specific item, which is usually present in the like/dislike list or recommendation list.
Room Tickers
Museekd: SRoomTickers
Nicotine: RoomTickerState
The server returns a list of tickers in a chat room.
Tickers are customizable, user-specific messages that appear in a banner at the top of a chat room.
Room Ticker Add
Museekd: SRoomTickerAdd
Nicotine: RoomTickerAdd
The server sends us a new ticker that was added to a chat room.
Tickers are customizable, user-specific messages that appear in a banner at the top of a chat room.
Room Ticker Remove
Museekd: SRoomTickerRemove
Nicotine: RoomTickerRemove
The server informs us that a ticker was removed from a chat room.
Tickers are customizable, user-specific messages that appear in a banner at the top of a chat room.
Set Room Ticker
Museekd: SSetRoomTicker
Nicotine: RoomTickerSet
We send this to the server when we change our own ticker in a chat room.
Tickers are customizable, user-specific messages that appear in a banner at the top of a chat room.
Add Hated Interest
Museekd: SInterestHatedAdd
Nicotine: AddThingIHate
We send this to the server when we add an item to our hate list.
Remove Hated Interest
Museekd: SInterestHatedRemove
Nicotine: RemoveThingIHate
We send this to the server when we remove an item from our hate list.
Room Search
Museekd: SRoomSearch
Nicotine: RoomSearch
Send Upload Speed
Museekd: SSendUploadSpeed
Nicotine: SendUploadSpeed
We send this after a finished upload to let the server update the speed statistics for ourselves.
User Privileges
Museekd: SUserPrivileges
Nicotine: UserPrivileged
We ask the server whether a user is privileged or not.
Give Privileges
Museekd: SGivePrivileges
Nicotine: GivePrivileges
We give (part of) our privileges, specified in days, to another user on the network.
Notify Privileges
Nicotine: NotifyPrivileges
The server sends us a notification about our privileges.
Acknowledge Privilege Notification
Nicotine: AckNotifyPrivileges
Branch Level
Tell the server what is our position in our branch (xth generation)
Museekd: SBranchLevel
Nicotine: Unimplemented
Branch Root
Tell the server the username of the root of the branch we’re in
Museekd: SBranchRoot
Nicotine: Unimplemented
Child depth
Tell the server the maximum number of generation of children we have.
Museekd: SChildDepth
Nicotine: Unimplemented
Private Room Users
The server sends us a list of room users that we can alter (add operator abilities / dismember).
Museekd: SPrivRoomAlterableMembers
Nicotine: PrivateRoomUsers
Private Room Add User
We send this to inform the server that we’ve added a user to a private room.
Museekd: SPrivRoomAddUser
Nicotine: PrivateRoomAddUser
Private Room Remove User
We send this to inform the server that we’ve removed a user from a private room.
Museekd: SPrivRoomRemoveUser
Nicotine: PrivateRoomRemoveUser
Private Room Drop Membership
We send this to the server to remove our own membership of a private room.
Museekd: SPrivRoomDismember
Nicotine: PrivateRoomDismember
Private Room Drop Ownership
We send this to the server to stop owning a private room.
Museekd: SPrivRoomDisown
Nicotine: PrivateRoomDisown
Private Room Unknown
Unknown purporse
Museekd: SPrivRoomUnknown138
Nicotine: PrivateRoomSomething
Private Room Added
The server sends us this message when we are added to a private room.
Museekd: SPrivRoomAdded
Nicotine: PrivateRoomAdded
Private Room Removed
The server sends us this message when we are removed from a private room.
Museekd: SPrivRoomRemoved
Nicotine: PrivateRoomRemoved
Private Room Toggle
We send this when we want to enable or disable invitations to private rooms.
Museekd: SPrivRoomToggle
Nicotine: PrivateRoomToggle
New Password
We send this to the server to change our password. We receive a response if our password changes.
Museekd: SNewPassword
Nicotine: ChangePassword
Private Room Add Operator
We send this to the server to add private room operator abilities to a user.
Museekd: SPrivRoomAddOperator
Nicotine: PrivateRoomAddOperator
Private Room Remove Operator
We send this to the server to remove private room operator abilities from a user.
Museekd: SPrivRoomRemoveOperator
Nicotine: PrivateRoomRemoveOperator
Private Room Operator Added
The server send us this message when we’re given operator abilities in a private room.
Museekd: SPrivRoomOperatorAdded
Nicotine: PrivateRoomOperatorAdded
Private Room Operator Removed
The server send us this message when our operator abilities are removed in a private room.
Museekd: SPrivRoomOperatorRemoved
Nicotine: PrivateRoomOperatorRemoved
Private Room Operators
The server sends us a list of operators in a specific room, that we can remove operator abilities from.
Museekd: SPrivRoomAlterableOperators
Nicotine: PrivateRoomOwned
Message Users
Sends a broadcast private message to the given list of users.
Museekd: SMessageUsers
Nicotine: Unimplemented
Ask Public Chat
We ask the server to send us messages from all public rooms, also known as public chat.
Museekd: SAskPublicChat
Nicotine: JoinPublicRoom
Stop Public Chat
We ask the server to stop sending us messages from all public rooms, also known as public chat.
Museekd: SStopPublicChat
Nicotine: LeavePublicRoom
Public Chat Message
The server sends this when a new message has been written in a public room (every single line written in every public room).
Museekd: SPublicChat
Nicotine: PublicRoomMessage
Related Searches
DEPRECATED ? (empty list from server as of 2018)
The server returns a list of related search terms for a search query.
Museekd: SRelatedSearch
Nicotine: RelatedSearch
Can’t Connect To Peer
Museekd: SCannotConnect
Nicotine: CantConnectToPeer
DEPRECATED. Since direct and indirect connection attempts are made simultaneously by the official client nowadays, it’s not safe to send this message, as we can’t be certain that both connection methods have been fully attempted. The order of the attempts is also unpredictable.
We send this to say we can’t connect to peer after it has asked us to connect. We receive this if we asked peer to connect and it can’t do this. This message means a connection can’t be established either way.
See also: Peer Connection Message Order
Can’t Create Room
Museekd: Unimplemented
Nicotine: CantCreateRoom
Server tells us a new room cannot be created. This message only seems to be sent if you try to create a room with the same name as an existing private room. In other cases, such as using a room name with leading or trailing spaces, only a private message containing an error message is sent.
Send | Receive |
---|---|
Send to Peer | Receive from Peer |
In museekd 0.1.13, these messages are sent and received in Museek/PeerConnection.cc and defined in Museek/PeerMessages.hh. Since museekd 0.2, they are defined in museekd/peermessages.h.
In Nicotine, these messages are matched to their message number in slskproto.py in the SlskProtoThread function, defined in slskmessages.py and callbacks for the messages are set in pynicotine.py.
Message Length | Code | Message Contents |
---|---|---|
4 Bytes | 1 Byte | … |
Code | Message |
---|---|
0 | Pierce Firewall |
1 | Peer Init |
Pierce Firewall
Nicotine: PierceFireWall
This is the very first message sent by the peer that established a connection, if it has been asked by the other peer to do so. The token is taken from the ConnectToPeer server message.
See also: Peer Connection Message Order
Peer Init
Nicotine: PeerInit
This message is sent by the peer that initiated a connection, not necessarily a peer that actually established it. Token apparently can be anything. Type is ‘P’ if it’s anything but filetransfer, ‘F’ otherwise.
See also: Peer Connection Message Order
Message Length | Code | Message Contents |
---|---|---|
4 Bytes | 4 Bytes | … |
Code | Message |
---|---|
4 | Shares Request |
5 | Shares Reply |
8 | Search Request |
9 | Search Reply |
15 | User Info Request |
16 | User Info Reply |
36 | Folder Contents Request |
37 | Folder Contents Reply |
40 | Transfer Request |
41 | Upload Reply |
41 | Download Reply |
41 | Transfer Reply |
42 | Upload Placehold |
43 | Queue Download |
44 | Upload Queue Notification |
46 | Upload Failed |
50 | Queue Failed |
51 | Place In Queue Request |
52 | Upload Queue Notification |
Shares Request
Museekd: PSharesRequest
Nicotine: GetShareFileList
We send this to a peer to ask for a list of shared files.
Shares Reply
Museekd: PSharesReply
Nicotine: SharedFileList
A peer responds with a list of shared files when we’ve sent a GetSharedFileList.
Search Request
Museekd: PSearchRequest
Nicotine: FileSearchRequest
We send this to the peer when we search for a file. Alternatively, the peer sends this to tell us it is searching for a file.
Search Reply
Museekd: PSearchReply
Nicotine: FileSearchResult
The peer sends this when it has a file search match. The token/ticket is taken from original FileSearchRequest message.
User Info Request
Museekd: PInfoRequest
Nicotine: UserInfoRequest
We ask the other peer to send us their user information, picture and all.
User Info Reply
Museekd: PInfoReply
Nicotine: UserInfoReply
A peer responds with this when we’ve sent a UserInfoRequest.
Folder Contents Request
Museekd: PFolderContentsRequest
Nicotine: FolderContentsRequest
We ask the peer to send us the contents of a single folder.
Folder Contents Reply
Museekd: PFolderContentsReply
Nicotine: FolderContentsResponse
A peer responds with the contents of a particular folder (with all subfolders) when we’ve sent a FolderContentsRequest.
Transfer Request
Museekd: PTransferRequest
Nicotine: TransferRequest
We request a file from a peer, or tell a peer that we want to send a file to them.
Upload Reply
Museekd: PUploadReply
Nicotine: TransferResponse
Response to TransferRequest - either we (or the other peer) agrees, or tells the reason for rejecting the file transfer.
Download Reply
Museekd: PDownloadReply
Nicotine: TransferResponse
Response to TransferRequest - either we (or the other peer) agrees, or tells the reason for rejecting the file transfer.
Transfer Reply
Museekd: PTransferReply
Nicotine: TransferResponse
Response to TransferRequest - either we (or the other peer) agrees, or tells the reason for rejecting the file transfer.
Upload Placehold
Museekd: PUploadPlacehold
Nicotine: PlaceholdUpload
DEPRECATED
Queue Upload or Download
Museekd: PQueueDownload
Nicotine: QueueUpload
Place In Queue Reply
Museekd: PPlaceInQueueReply
Nicotine: PlaceInQueue
Upload Failed
Museekd: PUploadFailed
Nicotine: UploadFailed
Queue Failed
Museekd: PQueueFailed
Nicotine: QueueFailed
Place In Queue Request
Museekd: PPlaceInQueueRequest
Nicotine: PlaceInQueueRequest
Upload Queue Notification
Museekd: PUploadQueueNotification
Nicotine: UploadQueueNotification
Send | Send to Node |
---|---|
Receive | Receive from Node |
In museekd 0.1.13, these messages are sent and received in Museek/DistribConnection.cc and defined in Museek/DistribMessages.hh. Since museekd 0.2, they are defined in museekd/distributedmessages.h.
In Nicotine, these messages are matched to their message number in slskproto.py in the SlskProtoThread function, defined in slskmessages.py and callbacks for the messages are set in pynicotine.py.
Message Length | Code | Message Contents |
---|---|---|
4 Bytes | 1 Byte | … |
Code | Message |
---|---|
0 | Ping |
3 | Search Request |
4 | Branch Level |
5 | Branch Root |
7 | Child Depth |
93 | Server Search Request |
Ping
Send it every 60 sec.
Museekd: DPing
Nicotine: DistribAlive
Search Request
Search request that arrives through the distributed network. We transmit the search request to our children.
Search requests are sent to us by the server using SearchRequest if we’re a branch root, or by our parent using DistribSearch.
Museekd: DSearchRequest
Nicotine: DistribSearch
Branch Level
See SBranchLevel
Museekd: DBranchLevel
Nicotine: Unimplemented
Branch Root
See SBranchRoot
Museekd: DBranchRoot
Nicotine: Unimplemented
Branch Level
See SChildDepth
Museekd: DChildDepth
Nicotine: Unimplemented
Server Search Request
Search request that arrives through the distributed network. We transmit the search request to our children.
Search requests are sent to us by the server using SearchRequest if we’re a branch root, or by our parent using DistribSearch.
Museekd: Unimplemented
Nicotine: DistribServerSearch