Files
prosody-nodejs/examples/simple-client.js
2025-12-27 03:39:14 +01:00

129 líneas
3.0 KiB
JavaScript

/**
* Example: Simple XMPP Client
* Demonstrates basic XMPP client functionality
*/
const { Client } = require('@xmpp/client');
const { xml } = require('@xmpp/client');
const readline = require('readline');
// Configuration
const config = {
service: 'xmpp://localhost:5222',
domain: 'localhost',
username: 'user1',
password: 'password'
};
// Create client
const client = new Client(config);
// Setup readline for input
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: '> '
});
// Connection established
client.on('online', async (address) => {
console.log(`Connected as ${address.toString()}`);
// Send presence
await client.send(xml('presence'));
console.log('\nCommands:');
console.log(' /send <jid> <message> - Send a message');
console.log(' /presence [status] - Set presence');
console.log(' /quit - Disconnect');
console.log('');
rl.prompt();
});
// Handle incoming stanzas
client.on('stanza', (stanza) => {
if (stanza.is('message')) {
const from = stanza.attrs.from;
const body = stanza.getChildText('body');
if (body) {
console.log(`\n[${from}]: ${body}`);
rl.prompt();
}
} else if (stanza.is('presence')) {
const from = stanza.attrs.from;
const type = stanza.attrs.type;
const show = stanza.getChildText('show');
const status = stanza.getChildText('status');
if (type === 'unavailable') {
console.log(`\n${from} is now offline`);
} else {
const state = show || 'available';
const statusText = status ? ` (${status})` : '';
console.log(`\n${from} is now ${state}${statusText}`);
}
rl.prompt();
}
});
// Handle user input
rl.on('line', async (line) => {
const parts = line.trim().split(' ');
const command = parts[0];
try {
if (command === '/send' && parts.length >= 3) {
const to = parts[1];
const message = parts.slice(2).join(' ');
await client.send(
xml('message', { type: 'chat', to },
xml('body', {}, message)
)
);
console.log(`Sent to ${to}: ${message}`);
} else if (command === '/presence') {
const status = parts.slice(1).join(' ');
const presence = xml('presence');
if (status) {
presence.append(xml('status', {}, status));
}
await client.send(presence);
console.log('Presence updated');
} else if (command === '/quit') {
await client.stop();
process.exit(0);
} else if (command.startsWith('/')) {
console.log('Unknown command');
}
} catch (error) {
console.error('Error:', error.message);
}
rl.prompt();
});
// Handle errors
client.on('error', (err) => {
console.error('Error:', err.message);
});
// Start client
console.log('Connecting to XMPP server...');
client.start().catch(console.error);
// Handle process termination
process.on('SIGINT', async () => {
console.log('\nDisconnecting...');
await client.stop();
process.exit(0);
});