#include #include #include #include #include #include #include #include namespace iq = larra::xmpp::iq; auto Coroutine() -> boost::asio::awaitable { SPDLOG_INFO("Connecting client..."); try { auto client = co_await larra::xmpp::client::CreateClient>( larra::xmpp::PlainUserAccount{.jid = {.username = "test1", .server = "localhost"}, .password = "test1"}, {.useTls = larra::xmpp::client::Options::kNever}); // rfc6120 7.1 // After a client authenticates with a server, // it MUST bind a specific resource to the stream so that the server can properly address the client. co_await std::visit( [](auto& client) -> boost::asio::awaitable { co_await client.CreateResourceBind(); }, client); // rfc6120 2.2 // Upon authenticating with a server and binding a resource (thus becoming a connected resource as defined in [XMPP‑CORE]), // a client SHOULD request the roster before sending initial presence co_await std::visit( [](auto& client) -> boost::asio::awaitable { SPDLOG_INFO("Send presence: Available"); co_await client.Send(larra::xmpp::presence::c2s::Available{}); }, client); } catch(const std::exception& err) { SPDLOG_ERROR("{}", err.what()); co_return; } SPDLOG_INFO("Done connecting client!"); } auto main() -> int { spdlog::set_level(spdlog::level::trace); boost::asio::io_context io_context; boost::asio::co_spawn(io_context, Coroutine(), boost::asio::detached); io_context.run(); }