zeek/auxil/broker/caf/examples/qtsupport/qt_group_chat.cpp
Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

79 lines
2.5 KiB
C++

/******************************************************************************\
* This example program represents a minimal GUI chat program *
* based on group communication. This chat program is compatible to the *
* terminal version in remote_actors/group_chat.cpp. *
* *
* Setup for a minimal chat between "alice" and "bob": *
* - group_server -p 4242 *
* - qt_group_chat -g remote:chatroom@localhost:4242 -n alice *
* - qt_group_chat -g remote:chatroom@localhost:4242 -n bob *
\******************************************************************************/
#include <cstdlib>
#include <iostream>
#include <map>
#include <set>
#include <sstream>
#include <time.h>
#include <vector>
#include "caf/all.hpp"
#include "caf/io/all.hpp"
CAF_PUSH_WARNINGS
#include "ui_chatwindow.h" // auto generated from chatwindow.ui
#include <QApplication>
#include <QMainWindow>
CAF_POP_WARNINGS
#include "chatwidget.hpp"
using namespace caf;
class config : public actor_system_config {
public:
config() {
opt_group{custom_options_, "global"}
.add<std::string>("name,n", "set name")
.add<std::string>("group,g", "join group");
}
};
int caf_main(actor_system& sys, const config& cfg) {
std::string name;
if (auto config_name = get_if<std::string>(&cfg, "name"))
name = std::move(*config_name);
while (name.empty()) {
std::cout << "please enter your name: " << std::flush;
if (!std::getline(std::cin, name)) {
std::cerr << "*** no name given... terminating" << std::endl;
return EXIT_FAILURE;
}
}
group grp;
// evaluate group parameters
if (auto locator = get_if<std::string>(&cfg, "group")) {
if (auto maybe_grp = sys.groups().get(*locator)) {
grp = std::move(*maybe_grp);
} else {
std::cerr << R"(*** failed to parse ")" << *locator
<< R"(" as group locator: )" << to_string(maybe_grp.error())
<< std::endl;
}
}
auto [argc, argv] = cfg.c_args_remainder();
QApplication app{argc, argv};
app.setQuitOnLastWindowClosed(true);
QMainWindow mw;
Ui::ChatWindow helper;
helper.setupUi(&mw);
helper.chatwidget->init(sys);
auto client = helper.chatwidget->as_actor();
anon_send(client, set_name_atom_v, move(name));
anon_send(client, join_atom_v, std::move(grp));
mw.show();
return app.exec();
}
CAF_MAIN(id_block::qtsupport, io::middleman)