Skip to main content

Join Endless Room

Join an existing endless room using an invitation code. This allows players to drop into ongoing game sessions and participate with other players who are already in the room.

Method​

MoitribeSDK('game-id', 'joinendlessroominvcode', params, callback)

Parameters​

ParameterTypeRequiredDescription
invitationIDstringYesRoom invitation code to join
onJoinedRoomfunctionYesCalled when successfully joined
onMessageReceivedfunctionYesCalled when message is received
onPeerJoinedfunctionYesCalled when player joins
onPeerLeftfunctionYesCalled when player leaves
onConnectedToRoomfunctionYesCalled when connected to room

Response Format​

{
success: boolean;
room?: Room;
msg?: string;
}

Examples​

JavaScript Example​

MoitribeSDK('my-game', 'joinendlessroominvcode', {
invitationID: 'ABC123XYZ789',
onJoinedRoom: (status, room) => {
if (status) {
console.log('Successfully joined room:', room.roomID);
console.log('Current players:', room.participants.length);
console.log('Room variant:', room.variant);
} else {
console.error('Failed to join room');
}
},
onMessageReceived: (messageData, senderParticipantID, isReliable) => {
console.log('Message received from:', senderParticipantID);
// Process incoming game data
},
onPeerJoined: (room, participantList) => {
console.log('New player joined. Total:', participantList.length);
// Update player list UI
},
onPeerLeft: (room, participantList) => {
console.log('Player left. Total:', participantList.length);
// Update player list UI
},
onConnectedToRoom: (room) => {
console.log('Connected to room, ready to play');
// Enable game controls
}
}, (result) => {
console.log('Join room request sent:', result);
});

TypeScript Example​

import MoitribeSDK from '@veniso/moitribe-js';

MoitribeSDK('my-game', 'joinendlessroominvcode', {
invitationID: 'ABC123XYZ789',
onJoinedRoom: (status: boolean, room: Room) => {
if (status) {
console.log('Successfully joined room:', room.roomID);
console.log('Current players:', room.participants.length);
console.log('Room variant:', room.variant);
} else {
console.error('Failed to join room');
}
},
onMessageReceived: (messageData: ArrayBuffer, senderParticipantID: string, isReliable: boolean) => {
console.log('Message received from:', senderParticipantID);
// Process incoming game data
},
onPeerJoined: (room: Room, participantList: string[]) => {
console.log('New player joined. Total:', participantList.length);
// Update player list UI
},
onPeerLeft: (room: Room, participantList: string[]) => {
console.log('Player left. Total:', participantList.length);
// Update player list UI
},
onConnectedToRoom: (room: Room) => {
console.log('Connected to room, ready to play');
// Enable game controls
}
}, (result: any) => {
console.log('Join room request sent:', result);
});

Invitation Code Format​

Invitation codes are typically the room ID itself. They can be:

  • Alphanumeric: ABC123XYZ789
  • Short codes: XYZ789
  • URL-friendly: Can be used in shareable links
// Example of creating a shareable link
function createShareableLink(invitationCode) {
return `https://mygame.com/join/${invitationCode}`;
}

// Usage
const link = createShareableLink('ABC123XYZ789');
console.log('Share this link:', link);

Join Flow​

1. Validation​

The SDK validates the invitation code before attempting to join:

// Invalid invitation code handling
MoitribeSDK('my-game', 'joinendlessroominvcode', {
invitationID: '', // Empty or invalid
onJoinedRoom: (status, room) => {
if (!status) {
console.error('Invalid invitation code');
showErrorMessage('Please check the invitation code');
}
}
});

2. Connection Process​

onJoinedRoom: (status, room) => {
if (status) {
console.log('Join successful!');
console.log('Room details:', {
id: room.roomID,
creator: room.creatorID,
players: room.participants.length,
variant: room.variant
});

// Load current game state
syncWithRoomState(room);
}
}

3. Player Integration​

onConnectedToRoom: (room) => {
console.log('Fully connected to room');

// Announce player arrival
sendMessageToAll({
type: 'player_joined',
player: getCurrentPlayerInfo()
});

// Request current game state
sendMessageToServer({
type: 'request_state'
});
}

Error Handling​

Common Join Errors​

onJoinedRoom: (status, room) => {
if (!status) {
// Handle different failure scenarios
if (room?.msg?.includes('not found')) {
showError('Room not found or expired');
} else if (room?.msg?.includes('full')) {
showError('Room is full');
} else {
showError('Failed to join room');
}
}
}

Retry Logic​

function joinRoomWithRetry(invitationCode, maxRetries = 3) {
let attempts = 0;

function attemptJoin() {
attempts++;

MoitribeSDK('my-game', 'joinendlessroominvcode', {
invitationID: invitationCode,
onJoinedRoom: (status, room) => {
if (status) {
console.log('Successfully joined!');
return;
}

if (attempts < maxRetries) {
console.log(`Retrying... (${attempts}/${maxRetries})`);
setTimeout(attemptJoin, 2000);
} else {
console.error('Failed to join after max retries');
}
}
});
}

attemptJoin();
}

Best Practices​

Pre-Join Validation​

function validateInvitationCode(code) {
// Basic validation
if (!code || code.length < 6) {
return false;
}

// Format validation (adjust based on your code format)
return /^[A-Z0-9]{6,12}$/.test(code);
}

// Usage
const invitationCode = getUserInput();
if (validateInvitationCode(invitationCode)) {
joinRoom(invitationCode);
} else {
showError('Invalid invitation code format');
}

Loading States​

function joinRoomWithLoading(invitationCode) {
showLoadingIndicator('Joining room...');

MoitribeSDK('my-game', 'joinendlessroominvcode', {
invitationID: invitationCode,
onJoinedRoom: (status, room) => {
hideLoadingIndicator();

if (status) {
showSuccessMessage('Joined room successfully!');
} else {
showErrorMessage('Failed to join room');
}
}
});
}

Next Steps​

Pro Tip

Store the invitation code locally to allow quick reconnection if the player disconnects accidentally.