mirror of https://github.com/bqv/weechat-xmpp
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
5.4 KiB
C++
151 lines
5.4 KiB
C++
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, version 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
#pragma once
|
|
|
|
#include <ctime>
|
|
#include <cstdint>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <string_view>
|
|
#include <unordered_map>
|
|
#include <optional>
|
|
|
|
#include "fmt/core.h"
|
|
#include "strophe.h"
|
|
#include "pgp.hh"
|
|
#include "omemo.hh"
|
|
#include "config.hh"
|
|
#include "channel.hh"
|
|
#include "connection.hh"
|
|
#include "user.hh"
|
|
|
|
namespace weechat
|
|
{
|
|
class channel;
|
|
class user;
|
|
|
|
void log_emit(void *const userdata, const xmpp_log_level_t level,
|
|
const char *const area, const char *const msg);
|
|
|
|
class account : public config_account
|
|
{
|
|
public:
|
|
struct device
|
|
{
|
|
std::uint32_t id;
|
|
std::string name;
|
|
std::string label;
|
|
};
|
|
|
|
struct mam_query
|
|
{
|
|
std::string id;
|
|
std::string with;
|
|
std::optional<time_t> start;
|
|
std::optional<time_t> end;
|
|
};
|
|
|
|
public:
|
|
bool disconnected = false;
|
|
|
|
std::unordered_map<std::uint32_t, device> devices;
|
|
std::unordered_map<std::string, mam_query> mam_queries;
|
|
|
|
private:
|
|
bool is_connected = false;
|
|
|
|
int current_retry = 0;
|
|
int reconnect_delay = 0;
|
|
int reconnect_start = 0;
|
|
|
|
xmpp_mem_t memory = { nullptr };
|
|
xmpp_log_t logger = { nullptr };
|
|
|
|
std::string buffer_as_string;
|
|
|
|
friend void log_emit(void *const userdata, const xmpp_log_level_t level,
|
|
const char *const area, const char *const msg);
|
|
|
|
public:
|
|
std::string name;
|
|
weechat::xmpp::pgp pgp;
|
|
weechat::xmpp::omemo omemo;
|
|
libstrophe::context context;
|
|
weechat::connection connection;
|
|
struct t_gui_buffer *buffer = nullptr;
|
|
std::unordered_map<std::string, weechat::channel> channels;
|
|
std::unordered_map<std::string, weechat::user> users;
|
|
|
|
std::unordered_map<std::string, struct t_config_option *> options;
|
|
|
|
int reloading_from_config = 0;
|
|
|
|
public:
|
|
account(config_file& config_file, const std::string name);
|
|
~account();
|
|
|
|
static bool search(account* &out,
|
|
const std::string name, bool casesensitive = false);
|
|
static int timer_cb(const void *pointer, void *data, int remaining_calls);
|
|
static void disconnect_all();
|
|
|
|
bool connected() { return is_connected; }
|
|
|
|
bool search_device(device* out, std::uint32_t id);
|
|
void add_device(device *device);
|
|
void device_free_all();
|
|
xmpp_stanza_t *get_devicelist();
|
|
|
|
void add_mam_query(const std::string id, const std::string with,
|
|
std::optional<time_t> start, std::optional<time_t> end);
|
|
bool mam_query_search(mam_query* out, const std::string id);
|
|
void mam_query_remove(const std::string id);
|
|
void mam_query_free_all();
|
|
|
|
struct t_gui_buffer* create_buffer();
|
|
|
|
void disconnect(int reconnect);
|
|
void reset();
|
|
int connect();
|
|
|
|
std::string_view jid() {
|
|
if (connection && xmpp_conn_is_connected(connection))
|
|
return xmpp_jid_bare(context, xmpp_conn_get_bound_jid(connection));
|
|
else
|
|
return this->option_jid.string();
|
|
}
|
|
void jid(std::string jid) { this->option_jid = jid; }
|
|
std::string_view jid_device() {
|
|
if (connection && xmpp_conn_is_connected(connection))
|
|
return xmpp_conn_get_bound_jid(connection);
|
|
else
|
|
return xmpp_jid_new(context,
|
|
xmpp_jid_node(context, this->option_jid.string().data()),
|
|
xmpp_jid_domain(context, this->option_jid.string().data()),
|
|
"weechat");
|
|
}
|
|
std::string_view password() { return this->option_password.string(); }
|
|
void password(std::string password) { this->option_password = password; }
|
|
tls_policy tls() { return static_cast<tls_policy>(this->option_tls.integer()); }
|
|
void tls(tls_policy tls) { this->option_tls = fmt::format("%d", static_cast<int>(tls)); }
|
|
void tls(std::string tls) { this->option_tls = tls; }
|
|
std::string_view nickname() { return this->option_nickname.string(); }
|
|
void nickname(std::string nickname) { this->option_nickname = nickname; }
|
|
bool autoconnect() { return this->option_autoconnect.boolean(); }
|
|
void autoconnect(bool autoconnect) { this->option_autoconnect = autoconnect ? "on" : "off"; }
|
|
void autoconnect(std::string autoconnect) { this->option_autoconnect = autoconnect; }
|
|
std::string_view resource() { return this->option_resource.string(); }
|
|
void resource(std::string resource) { this->option_resource = resource; }
|
|
std::string_view status() { return this->option_status.string(); }
|
|
void status(std::string status) { this->option_status = status; }
|
|
std::string_view pgp_path() { return this->option_pgp_path.string(); }
|
|
void pgp_path(std::string pgp_path) { this->option_pgp_path = pgp_path; }
|
|
std::string_view pgp_keyid() { return this->option_pgp_keyid.string(); }
|
|
void pgp_keyid(std::string pgp_keyid) { this->option_pgp_keyid = pgp_keyid; }
|
|
};
|
|
|
|
extern std::unordered_map<std::string, account> accounts;
|
|
}
|