Skip to main content

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] SendPrivateMessage has 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] NewPrivateMessage with timeDiff = elapsed seconds since the message was originally sent, so the client can display a timestamp.

C→S 2781 - RequestLoadFriends

Nitro: MESSENGER_INIT

Source: RequestInitFriendsEvent, MessengerInitComposer

FieldTypeNotes
(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_FRIENDS

Source: RequestFriendsEvent

Requests the current friends list from the server. No parameters; used to refresh friend data.

Body: (empty)

C→S 3157 - SendFriendRequest

Nitro: REQUEST_FRIEND

Source: FriendRequestEvent, RequestFriendComposer

Sends a friend request to another user by username. The target user receives NewFriendRequest (2219).

Body:

C→S 137 - AcceptFriendRequests

Nitro: ACCEPT_FRIEND

Source: 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_FRIEND

Source: 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_REQUESTS

Source: RequestFriendRequestsEvent, GetFriendRequestsComposer

FieldTypeNotes
(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_FRIEND

Source: 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_IGNORE

Source: IgnoreRoomUserEvent, IgnoreUserComposer

FieldTypeNotes
usernamestringUsername of the user to ignore

Adds a user to the ignore list by username, hiding their chat messages.

C→S 2061 - UnignoreUser

Nitro: USER_UNIGNORE

Source: UnIgnoreRoomUserEvent, UnignoreUserComposer

FieldTypeNotes
usernamestringUsername of the user to un-ignore

Removes a user from the ignore list by username.

C→S 3567 - SendPrivateMessage

Nitro: MESSENGER_CHAT

Source: FriendPrivateMessageEvent, SendMessageComposer

Sends a private instant message to a friend by account ID.

Body:
recipientId: int

C→S 1276 - SendRoomInvite

Nitro: SEND_ROOM_INVITE

Source: InviteFriendsEvent, SendRoomInviteComposer

FieldTypeNotes
countintNumber of user IDs to invite
userIds[]int[]User IDs of friends to invite
messagestringInvitation message text

Sends a room invitation to one or more friends via the messenger.

C→S 2950 - ReportPrivateMessage

Nitro: CALL_FOR_HELP_FROM_IM

Source: ReportFriendPrivateChatEvent, CallForHelpFromIMMessageComposer

FieldTypeNotes
(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_COMPLETE Note: 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_UPDATE Source: 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_ID Note: No Arcturus handler - Nitro only. Source: IgnoreUserIdComposer

FieldTypeNotes
userIdintUser 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_ERROR

Source: FriendRequestErrorComposer

FieldTypeNotes
unknownintAlways 0
errorCodeintError 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_COUNT

Source: MinimailCountComposer, MiniMailUnreadCountEvent

FieldTypeNotes
countintAlways 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_NOTIFICATION

Source: FriendNotification, FriendNotificationEvent

FieldTypeNotes
userIdstringAccount ID of the relevant user (sent as string)
typeintNotification type
datastringNotification payload data

Notes: userId is 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_INVITE

Source: RoomInviteComposer, RoomInviteEvent

FieldTypeNotes
fromUserIdintAccount ID of the user sending the invite
messagestringInvitation message text

Delivers a room invitation from a friend, prompting the user to join.

S→C 462 - RoomInviteError

Nitro: MESSENGER_INVITE_ERROR

Source: RoomInviteErrorComposer, RoomInviteErrorEvent

FieldTypeNotes
errorCodeintError type (e.g. user not found, blocked)
buddyCountintNumber 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_SEARCH

Source: UserSearchResultComposer, HabboSearchResultEvent

FieldTypeNotes
(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_CHANGED Note: No Arcturus composer - Nitro only. Source: UnknownGuildComposer3, ExtendedProfileChangedMessageEvent

FieldTypeNotes
userIdintAccount 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_FRIENDS Note: No Arcturus composer - Nitro only. Source: MessengerErrorComposer, AcceptFriendResultEvent

(no Arcturus composer)

Reports failures when accepting friend requests (e.g. user not found, already friends).

FieldTypeNotes
countintNumber of failure entries
[count × senderId]intAccount ID of the requester that failed
[count × errorCode]intError 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_FRIENDS Note: No Arcturus composer - Nitro only. Source: FriendFindingRoomComposer, FindFriendsProcessResultEvent

(no Arcturus composer)

FieldTypeNotes
successbooleanWhether the Find Friends process completed successfully

Delivers the result of the Find Friends process. Nitro-only.

S→C 1911 - MessengerMinimailNew

Nitro: MESSENGER_MINIMAIL_NEW Note: 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_RELATIONSHIPS Note: No Arcturus composer - Nitro only. Source: ProfileFriendsComposer, RelationshipStatusInfoEvent

FieldTypeNotes
userIdintAccount ID of the user
countintNumber of relationship entries
[count × type]intRelationship type (1=heart, 2=smile, 3=broken_heart)
[count × friendCount]intNumber of friends with this relationship
[count × randomFriendId]intRandom friend account ID to show
[count × randomFriendName]stringRandom friend username
[count × randomFriendFigure]stringRandom 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_ERROR Note: No Arcturus composer - Nitro only. Source: UnknownMessengerErrorComposer, InstantMessageErrorEvent

FieldTypeNotes
errorCodeintError code for the failed instant message
userIdintAccount ID of the recipient
messagestringMessage 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.