Friends
Friend Private Message flow:
User A Server User B
│ │ │
│── [3567] FriendPM ────>│ │
│ (recipientId_B, │ check friendship │
│ "hey") │ apply rate limit │
│ │ (750ms min gap) │
│ │ │
│ │ [if B is online] │
│ │── [1587] PrivateMsg>│ (fromId=A, "hey", timeDiff=0)
│ │ │ timeDiff = seconds since sent,
│ │ │ 0 for real-time delivery
│ │ │
│ │ [if B is offline] │
│ │ store message in │
│ │ DB for later │
│ │ (no immediate │
│ │ S→C response) │
No confirmation to sender:
[3567] SendPrivateMessagehas no server response back to User A. The sender gets no receipt. If B is offline the message is silently stored.Offline delivery: When B next logs in, stored messages are loaded from DB and sent as
[1587] NewPrivateMessagewithtimeDiff= elapsed seconds since the message was originally sent, so the client can display a timestamp.
C→S 2781 - RequestLoadFriends
Nitro:
MESSENGER_INITSource:
RequestInitFriendsEvent,MessengerInitComposer
| Field | Type | Notes |
|---|---|---|
| (empty) | - | No body fields read |
Notes: Triggers the full messenger initialisation sequence: sends
LoadFriends(S→C 1605) +Friends(S→C 3130). Already noted in §13; this is the explicit C→S counterpart.
Requests the initial full friends list load for the messenger.
C→S 1523 - RequestFriends
Nitro:
MESSENGER_FRIENDSSource:
RequestFriendsEvent
Requests the current friends list from the server. No parameters; used to refresh friend data.
Body: (empty)
C→S 3157 - SendFriendRequest
Nitro:
REQUEST_FRIENDSource:
FriendRequestEvent,RequestFriendComposer
Sends a friend request to another user by username. The target user receives NewFriendRequest (2219).
Body:
C→S 137 - AcceptFriendRequests
Nitro:
ACCEPT_FRIENDSource:
AcceptFriendRequestEvent,AcceptFriendMessageComposer
Accepts one or more pending incoming friend requests by account ID. Sends a count followed by the list of requester IDs to accept.
Body:
count: int
[count]:
C→S 2890 - DeclineFriendRequests
Nitro:
DECLINE_FRIENDSource:
DeclineFriendRequestEvent,DeclineFriendMessageComposer
Declines one or more pending friend requests. Setting the all flag to true declines every pending request at once without listing individual IDs.
Body:
all: boolean true = decline all
count: int (ignored if all=true)
[count]:
C→S 2448 - RequestFriendRequests
Nitro:
GET_FRIEND_REQUESTSSource:
RequestFriendRequestsEvent,GetFriendRequestsComposer
| Field | Type | Notes |
|---|---|---|
| (empty) | - | No body fields read |
Notes: Requests the pending friend request list. Response:
LOAD_FRIEND_REQUESTS(S→C 280, already documented in §13).
Requests the current list of pending incoming friend requests.
C→S 1689 - RemoveFriends
Nitro:
REMOVE_FRIENDSource:
RemoveFriendEvent,RemoveFriendComposer
Removes one or more users from the friend list by account ID. Sends a count followed by the list of user IDs to unfriend.
Body:
count: int
[count]:
C→S 1117 - IgnoreUser
Nitro:
USER_IGNORESource:
IgnoreRoomUserEvent,IgnoreUserComposer
| Field | Type | Notes |
|---|---|---|
| username | string | Username of the user to ignore |
Adds a user to the ignore list by username, hiding their chat messages.
C→S 2061 - UnignoreUser
Nitro:
USER_UNIGNORESource:
UnIgnoreRoomUserEvent,UnignoreUserComposer
| Field | Type | Notes |
|---|---|---|
| username | string | Username of the user to un-ignore |
Removes a user from the ignore list by username.
C→S 3567 - SendPrivateMessage
Nitro:
MESSENGER_CHATSource:
FriendPrivateMessageEvent,SendMessageComposer
Sends a private instant message to a friend by account ID.
Body:
recipientId: int
C→S 1276 - SendRoomInvite
Nitro:
SEND_ROOM_INVITESource:
InviteFriendsEvent,SendRoomInviteComposer
| Field | Type | Notes |
|---|---|---|
| count | int | Number of user IDs to invite |
| userIds[] | int[] | User IDs of friends to invite |
| message | string | Invitation message text |
Sends a room invitation to one or more friends via the messenger.
C→S 2950 - ReportPrivateMessage
Nitro:
CALL_FOR_HELP_FROM_IMSource:
ReportFriendPrivateChatEvent,CallForHelpFromIMMessageComposer
| Field | Type | Notes |
|---|---|---|
| (body not confirmed) | - | Reports a private message conversation to CFH |
Notes: Lives in the modtool package. Body fields not confirmed from source.
Reports a private (instant) message from another user as inappropriate.
C→S 3997 - FollowFriend
Nitro:
FOLLOW_FRIEND- Stalk is Arcturus's internal term. Nitro uses the player-facing Follow. Source:StalkFriendEvent,FollowFriendMessageComposer
Body:
userId: int
Follow a friend to the room they are visiting.
C→S 3768 - ChangeRelationshipStatus
Nitro:
SET_RELATIONSHIP_STATUS- Change→SET; Relation→RELATIONSHIP_STATUS. Source:ChangeRelationEvent,SetRelationshipStatusComposer
Sets the relationship emoji (none, heart, smile, or bobba) displayed on a friend's profile entry.
Body:
userId: int
C→S 1148 - FriendRequestQuestComplete
Nitro:
FRIEND_REQUEST_QUEST_COMPLETENote: No Arcturus handler - Nitro only. Source:FriendRequestQuestCompleteMessageComposer
Marks the friend-request quest objective as completed. Nitro-only.
Body: (empty)
Marks the friend-request quest as complete on the client side. No parameters.
C→S 1419 - RequestRefreshFriends
Nitro:
FRIEND_LIST_UPDATESource:FriendListUpdateComposer
Requests a full refresh of the friend list from the server.
Body: (empty)
Requests a full friend list refresh from the server. No parameters.
C→S 3314 - UserIgnoreId
Nitro:
USER_IGNORE_IDNote: No Arcturus handler - Nitro only. Source:IgnoreUserIdComposer
| Field | Type | Notes |
|---|---|---|
| userId | int | User ID to add to the ignore list |
Adds a user to the ignore list by account ID (rather than username).
Adds a user to the ignore list by account ID rather than username. Nitro-only.
S→C 1605 - LoadFriends
Source:
MessengerInitComposer,MessengerInitEvent
Delivers the messenger initialisation data - the maximum friend count (with and without HC) and the user's friend list categories. Sent at the start of the messenger init sequence.
Body:
maxFriends: int Maximum friends allowed
unknown: int Always 1337
maxFriendsHC: int Maximum friends with Habbo Club
categoryCount: int
[categoryCount]:
friendCategoryId: int
S→C 3130 - Friends
Source:
FriendsComposer,FriendListFragmentEvent
Body:
totalPages: int
pageIndex: int
count: int
[count]:
userId: int
username: string
gender: int 0=male, 1=female
online: boolean
inRoom: boolean
look: string (empty if offline)
friendCategoryId: int Friend list category
motto: string
realName: string
lastSeen: string
offlineMessageing: boolean
vipMember: boolean
pocketHabboUser: boolean
relationship: short 0=none, 1=heart, 2=smile, 3=bobba
The friends list for this user.
S→C 2800 - UpdateFriends
Source:
UpdateFriendComposer,FriendListUpdateEvent
Body:
categoryCount: int
[categoryCount]:
id: int
name: string
updateCount: int
[updateCount]:
action: int -1=removed, 0=updated, 1=added
userId: int
*[if action != -1]:
username: string
gender: int 0=male, 1=female
online: boolean
inRoom: boolean
look: string
categoryId: int
motto: string
lastSeen: string (empty)
realName: string (empty)
offlineMsg: boolean
unknown1: boolean
unknown2: boolean
relation: short
Pushes incremental friend list updates: added friends, status changes, and removals, along with any updated friend category names.
S→C 280 - PendingFriendRequests
Source:
LoadFriendRequestsComposer,FriendRequestsEvent
Note: LoadFriendRequests writes appendInt(size) twice in sequence before
the list. There is no fromId field - only the request ID, username, and look.
Body:
totalCount: int Total pending requests (repeated twice in the wire)
count: int Same value again (always equals totalCount)
[count]:
requestId: int
fromName: string
look: string
A list of all pending friend's requests.
S→C 2219 - NewFriendRequest
Source:
FriendRequestComposer,NewFriendRequestEvent
Note: FriendRequest sends 3 fields - no requestId. The doc previously
listed a requestId first, which is wrong.
Body:
fromId: int Account ID of the user who sent the request
fromName: string Username of requester
look: string Figure string of requester
Notifies the user in real time that another user has sent them a friend request, delivering the requester's account ID, username, and figure string.
S→C 892 - FriendRequestRejected
Nitro:
MESSENGER_MESSAGE_ERROR/MESSENGER_REQUEST_ERRORSource:
FriendRequestErrorComposer
| Field | Type | Notes |
|---|---|---|
| unknown | int | Always 0 |
| errorCode | int | Error code for the failed friend request |
Notifies that an outgoing friend request was declined by the recipient.
S→C 1587 - NewPrivateMessage
Source:
FriendChatMessageComposer,NewConsoleMessageEvent
Delivers a new private messenger message, including sender ID, text, and time offset.
Body:
fromUserId: int (negative = group chat)
message: string
timeDiff: int Seconds since message was sent
*[if fromUserId < 0 (group chat)]:
S→C 2803 - MinimailCount
Nitro:
MESSENGER_MINIMAIL_COUNTSource:
MinimailCountComposer,MiniMailUnreadCountEvent
| Field | Type | Notes |
|---|---|---|
| count | int | Always 0 in Arcturus (minimail feature not implemented) |
Notes: Arcturus hardcodes 0 - minimail (inbox) is not implemented. Nitro expects this during post-login burst.
Delivers the count of unread mini-mail messages in the user's inbox.
S→C 3082 - FriendNotification
Nitro:
MESSENGER_FRIEND_NOTIFICATIONSource:
FriendNotification,FriendNotificationEvent
| Field | Type | Notes |
|---|---|---|
| userId | string | Account ID of the relevant user (sent as string) |
| type | int | Notification type |
| data | string | Notification payload data |
Notes:
userIdis sent as a string despite being a numeric ID - discrepancy with other friend message formats.
Delivers a friendship-related notification (e.g. a friend came online, entered a room).
S→C 3870 - RoomInvite
Nitro:
MESSENGER_INVITESource:
RoomInviteComposer,RoomInviteEvent
| Field | Type | Notes |
|---|---|---|
| fromUserId | int | Account ID of the user sending the invite |
| message | string | Invitation message text |
Delivers a room invitation from a friend, prompting the user to join.
S→C 462 - RoomInviteError
Nitro:
MESSENGER_INVITE_ERRORSource:
RoomInviteErrorComposer,RoomInviteErrorEvent
| Field | Type | Notes |
|---|---|---|
| errorCode | int | Error type (e.g. user not found, blocked) |
| buddyCount | int | Number of affected buddy IDs |
| buddyIds[] | int[] | Account IDs of buddies that failed |
Reports that a room invitation failed for one or more recipients.
S→C 3048 - FollowFriendError
Source:
StalkErrorComposer,FollowFriendFailedEvent
Reports a failed follow-friend attempt with a reason code (1=not in room, 2=room invisible, 3=same room).
Body: (empty)
S→C 973 - UserSearchResult
Nitro:
MESSENGER_SEARCHSource:
UserSearchResultComposer,HabboSearchResultEvent
| Field | Type | Notes |
|---|---|---|
| (see existing §13 SearchUser section) | - | Same composer, same format |
Notes: This ID is the search result response - already documented as part of the friends section flow. Body matches
UserSearchResult.
Delivers the results of a user search query for the messenger's search UI.
S→C 876 - ExtendedProfileChanged
Nitro:
EXTENDED_PROFILE_CHANGEDNote: No Arcturus composer - Nitro only. Source:UnknownGuildComposer3,ExtendedProfileChangedMessageEvent
| Field | Type | Notes |
|---|---|---|
| userId | int | Account ID of the user whose extended profile changed |
Notifies that a user's extended profile has changed. Nitro-only.
S→C 896 - MessengerAcceptFriends
Nitro:
MESSENGER_ACCEPT_FRIENDSNote: No Arcturus composer - Nitro only. Source:MessengerErrorComposer,AcceptFriendResultEvent
(no Arcturus composer)
Reports failures when accepting friend requests (e.g. user not found, already friends).
| Field | Type | Notes |
|---|---|---|
| count | int | Number of failure entries |
| [count × senderId] | int | Account ID of the requester that failed |
| [count × errorCode] | int | Error code for this failure |
Reports failures when bulk-accepting friend requests (e.g. user not found). Nitro-only.
S→C 1210 - MessengerFindFriends
Nitro:
MESSENGER_FIND_FRIENDSNote: No Arcturus composer - Nitro only. Source:FriendFindingRoomComposer,FindFriendsProcessResultEvent
(no Arcturus composer)
| Field | Type | Notes |
|---|---|---|
| success | boolean | Whether the Find Friends process completed successfully |
Delivers the result of the Find Friends process. Nitro-only.
S→C 1911 - MessengerMinimailNew
Nitro:
MESSENGER_MINIMAIL_NEWNote: No Arcturus composer - Nitro only. Source:MinimailNewMessageComposer,MiniMailNewMessageEvent
(no Arcturus composer)
Notification that a new mini-mail (private message summary) has arrived.
Notifies the client that a new mini-mail has arrived. Nitro-only.
Body: (empty)
S→C 2016 - MessengerRelationships
Nitro:
MESSENGER_RELATIONSHIPSNote: No Arcturus composer - Nitro only. Source:ProfileFriendsComposer,RelationshipStatusInfoEvent
| Field | Type | Notes |
|---|---|---|
| userId | int | Account ID of the user |
| count | int | Number of relationship entries |
| [count × type] | int | Relationship type (1=heart, 2=smile, 3=broken_heart) |
| [count × friendCount] | int | Number of friends with this relationship |
| [count × randomFriendId] | int | Random friend account ID to show |
| [count × randomFriendName] | string | Random friend username |
| [count × randomFriendFigure] | string | Random friend figure string |
Delivers the relationship status breakdown (hearts, smiles, broken hearts) for a user's profile. Nitro-only.
S→C 3359 - MessengerInstanceMessageError
Nitro:
MESSENGER_INSTANCE_MESSAGE_ERRORNote: No Arcturus composer - Nitro only. Source:UnknownMessengerErrorComposer,InstantMessageErrorEvent
| Field | Type | Notes |
|---|---|---|
| errorCode | int | Error code for the failed instant message |
| userId | int | Account ID of the recipient |
| message | string | Message text that failed to send |
Notifies the client that an instant message failed to deliver, including the error code, recipient ID, and the original message text. Nitro-only.