xmpp_client_web 0.5.1-dev.1 copy "xmpp_client_web: ^0.5.1-dev.1" to clipboard
xmpp_client_web: ^0.5.1-dev.1 copied to clipboard

Xmpp Stone is lightweight XMPP client library written completely in Dart.

example/example.dart

import 'dart:async';
import 'dart:convert';

import 'package:console/console.dart';
import 'package:image/image.dart' as image;
import 'package:universal_io/io.dart';
import 'package:xmpp_client_web/src/logger/Log.dart';
import 'package:xmpp_client_web/xmpp_stone.dart' as xmpp;

final String TAG = 'example';

void main(List<String> arguments) async {
  Log.logLevel = LogLevel.DEBUG;
  Log.logXmpp = false;

  Log.d(TAG, 'Setting up XMPP connection...');
  var userAtDomain = 'nemanja@127.0.0.1';
  var password = '1';
  var jid = xmpp.Jid.fromFullJid(userAtDomain);
  var account = xmpp.XmppAccountSettings(
      userAtDomain, jid.local, jid.domain, password, 5222,
      resource: 'xmppstone');

  var connection = xmpp.Connection(account);

  // Регистрация слушателей
  connection.connectionStateStream.listen((state) {
    Log.d(TAG, 'Connection state: $state');
    if (state == xmpp.XmppConnectionState.ForcefullyClosed) {
      Log.d(TAG, 'Connection lost. Attempting to reconnect...');
      reconnect(connection);
    }
  });

  var messagesListener = ExampleMessagesListener();
  ExampleConnectionStateChangedListener(connection, messagesListener);

  var presenceManager = xmpp.PresenceManager.getInstance(connection);
  presenceManager.subscriptionStream.listen((streamEvent) {
    if (streamEvent.type == xmpp.SubscriptionEventType.REQUEST) {
      Log.d(TAG, 'Accepting presence request');
      presenceManager.acceptSubscription(streamEvent.jid);
    }
  });

  var receiver = 'nemanja2@test';
  var receiverJid = xmpp.Jid.fromFullJid(receiver);
  var messageHandler = xmpp.MessageHandler.getInstance(connection);

  // Ожидание подключения
  await waitForConnectionReady(connection);

  // Отправка сообщения
  sendMessageSafely(messageHandler, receiverJid, 'Hello from xmpp_stone!');

  // Чтение ввода из консоли
  getConsoleStream().listen((String str) {
    sendMessageSafely(messageHandler, receiverJid, str);
  });

  // Подключение
  connection.connect();
}

// Ожидание готовности подключения
Future<void> waitForConnectionReady(xmpp.Connection connection) async {
  while (connection.state != xmpp.XmppConnectionState.Ready) {
    await Future.delayed(const Duration(milliseconds: 500));
  }
}

// Переподключение
void reconnect(xmpp.Connection connection) async {
  Log.d(TAG, 'Attempting to reconnect...');
  await Future.delayed(const Duration(seconds: 2));
  connection.connect();
}

// Безопасная отправка сообщений
void sendMessageSafely(xmpp.MessageHandler handler, xmpp.Jid receiverJid, String message) {
  try {
    handler.sendMessage(receiverJid, message);
    Log.d(TAG, 'Message sent: $message');
  } catch (e) {
    Log.d(TAG, 'Failed to send message: $e');
  }
}

class ExampleConnectionStateChangedListener
    implements xmpp.ConnectionStateChangedListener {
  late xmpp.Connection _connection;
  late xmpp.MessagesListener _messagesListener;

  ExampleConnectionStateChangedListener(
      xmpp.Connection connection, xmpp.MessagesListener messagesListener) {
    _connection = connection;
    _messagesListener = messagesListener;
    _connection.connectionStateStream.listen(onConnectionStateChanged);
  }

  @override
  void onConnectionStateChanged(xmpp.XmppConnectionState state) {
    if (state == xmpp.XmppConnectionState.Ready) {
      Log.d(TAG, 'Connected');
      setupXMPPFeatures();
    }
  }

  Future<void> setupXMPPFeatures() async {
    var vCardManager = xmpp.VCardManager(_connection);
    var messageHandler = xmpp.MessageHandler.getInstance(_connection);
    var rosterManager = xmpp.RosterManager.getInstance(_connection);

    // Получение собственной VCard
    var vCard = await vCardManager.getSelfVCard();
    Log.d(TAG, 'Your info: ${vCard.buildXmlString()}');

    // Добавление контакта в ростер
    var receiver = 'nemanja2@test';
    var receiverJid = xmpp.Jid.fromFullJid(receiver);
    var addResult = await rosterManager.addRosterItem(xmpp.Buddy(receiverJid));
    if (addResult.description != null) {
      Log.d(TAG, 'Roster added: ${addResult.description}');
    }

    // Получение VCard контакта
    var receiverVCard = await vCardManager.getVCardFor(receiverJid);
    Log.d(TAG, 'Receiver info: ${receiverVCard.buildXmlString()}');
    if (receiverVCard.image != null) {
      saveImage(receiverVCard.image!, 'receiver_avatar.jpg');
    }

    // Подключение слушателя присутствия
    var presenceManager = xmpp.PresenceManager.getInstance(_connection);
    presenceManager.presenceStream.listen(onPresence);

    // Слушатель сообщений
    messageHandler.messagesStream.listen(_messagesListener.onNewMessage);
  }

  void onPresence(xmpp.PresenceData event) {
    Log.d(TAG, 'Presence event from ${event.jid!.fullJid!}: ${event.showElement}');
  }

  void saveImage(image.Image img, String fileName) {
    var file = File(fileName)..writeAsBytesSync(image.encodeJpg(img));
    Log.d(TAG, 'Image saved to: ${file.path}');
  }
}

Stream<String> getConsoleStream() {
  return Console.adapter.byteStream().map((bytes) {
    var str = ascii.decode(bytes);
    return str.trim();
  });
}

class ExampleMessagesListener implements xmpp.MessagesListener {
  @override
  void onNewMessage(xmpp.MessageStanza? message) {
    if (message?.body != null) {
      Log.d(TAG, 'New Message from ${message!.fromJid!.userAtDomain}: ${message.body}');
    }
  }
}
4
likes
0
points
92
downloads

Publisher

unverified uploader

Weekly Downloads

Xmpp Stone is lightweight XMPP client library written completely in Dart.

Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

collection, console, crypto, cryptoutils, image, intl, quiver, synchronized, tuple, universal_io, unorm_dart, web_socket_channel, xml

More

Packages that depend on xmpp_client_web