Use a db roster to manage biboumi’s presence with the contacts
This commit is contained in:
@@ -13,6 +13,8 @@ Database::MucLogLineTable Database::muc_log_lines("MucLogLine_");
|
||||
Database::GlobalOptionsTable Database::global_options("GlobalOptions_");
|
||||
Database::IrcServerOptionsTable Database::irc_server_options("IrcServerOptions_");
|
||||
Database::IrcChannelOptionsTable Database::irc_channel_options("IrcChannelOptions_");
|
||||
Database::RosterTable Database::roster("roster");
|
||||
|
||||
|
||||
void Database::open(const std::string& filename)
|
||||
{
|
||||
@@ -36,6 +38,8 @@ void Database::open(const std::string& filename)
|
||||
Database::irc_server_options.upgrade(Database::db);
|
||||
Database::irc_channel_options.create(Database::db);
|
||||
Database::irc_channel_options.upgrade(Database::db);
|
||||
Database::roster.create(Database::db);
|
||||
Database::roster.upgrade(Database::db);
|
||||
}
|
||||
|
||||
|
||||
@@ -177,6 +181,51 @@ std::vector<Database::MucLogLine> Database::get_muc_logs(const std::string& owne
|
||||
return {result.crbegin(), result.crend()};
|
||||
}
|
||||
|
||||
void Database::add_roster_item(const std::string& local, const std::string& remote)
|
||||
{
|
||||
auto roster_item = Database::roster.row();
|
||||
|
||||
roster_item.col<Database::LocalJid>() = local;
|
||||
roster_item.col<Database::RemoteJid>() = remote;
|
||||
|
||||
roster_item.save(Database::db);
|
||||
}
|
||||
|
||||
void Database::delete_roster_item(const std::string& local, const std::string& remote)
|
||||
{
|
||||
Query query("DELETE FROM "s + Database::roster.get_name());
|
||||
query << " WHERE " << Database::RemoteJid{} << "=" << remote << \
|
||||
" AND " << Database::LocalJid{} << "=" << local;
|
||||
|
||||
query.execute(Database::db);
|
||||
}
|
||||
|
||||
bool Database::has_roster_item(const std::string& local, const std::string& remote)
|
||||
{
|
||||
auto query = Database::roster.select();
|
||||
query.where() << Database::LocalJid{} << "=" << local << \
|
||||
" and " << Database::RemoteJid{} << "=" << remote;
|
||||
|
||||
auto res = query.execute(Database::db);
|
||||
|
||||
return !res.empty();
|
||||
}
|
||||
|
||||
std::vector<Database::RosterItem> Database::get_contact_list(const std::string& local)
|
||||
{
|
||||
auto query = Database::roster.select();
|
||||
query.where() << Database::LocalJid{} << "=" << local;
|
||||
|
||||
return query.execute(Database::db);
|
||||
}
|
||||
|
||||
std::vector<Database::RosterItem> Database::get_full_roster()
|
||||
{
|
||||
auto query = Database::roster.select();
|
||||
|
||||
return query.execute(Database::db);
|
||||
}
|
||||
|
||||
void Database::close()
|
||||
{
|
||||
sqlite3_close_v2(Database::db);
|
||||
@@ -192,4 +241,4 @@ std::string Database::gen_uuid()
|
||||
return uuid_str;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -72,6 +72,11 @@ class Database
|
||||
struct Persistent: Column<bool> { static constexpr auto name = "persistent_";
|
||||
Persistent(): Column<bool>(false) {} };
|
||||
|
||||
struct LocalJid: Column<std::string> { static constexpr auto name = "local"; };
|
||||
|
||||
struct RemoteJid: Column<std::string> { static constexpr auto name = "remote"; };
|
||||
|
||||
|
||||
using MucLogLineTable = Table<Id, Uuid, Owner, IrcChanName, IrcServerName, Date, Body, Nick>;
|
||||
using MucLogLine = MucLogLineTable::RowType;
|
||||
|
||||
@@ -84,6 +89,9 @@ class Database
|
||||
using IrcChannelOptionsTable = Table<Id, Owner, Server, Channel, EncodingOut, EncodingIn, MaxHistoryLength, Persistent, RecordHistoryOptional>;
|
||||
using IrcChannelOptions = IrcChannelOptionsTable::RowType;
|
||||
|
||||
using RosterTable = Table<LocalJid, RemoteJid>;
|
||||
using RosterItem = RosterTable::RowType;
|
||||
|
||||
Database() = default;
|
||||
~Database() = default;
|
||||
|
||||
@@ -109,6 +117,12 @@ class Database
|
||||
static std::string store_muc_message(const std::string& owner, const std::string& chan_name, const std::string& server_name,
|
||||
time_point date, const std::string& body, const std::string& nick);
|
||||
|
||||
static void add_roster_item(const std::string& local, const std::string& remote);
|
||||
static bool has_roster_item(const std::string& local, const std::string& remote);
|
||||
static void delete_roster_item(const std::string& local, const std::string& remote);
|
||||
static std::vector<Database::RosterItem> get_contact_list(const std::string& local);
|
||||
static std::vector<Database::RosterItem> get_full_roster();
|
||||
|
||||
static void close();
|
||||
static void open(const std::string& filename);
|
||||
|
||||
@@ -123,6 +137,7 @@ class Database
|
||||
static GlobalOptionsTable global_options;
|
||||
static IrcServerOptionsTable irc_server_options;
|
||||
static IrcChannelOptionsTable irc_channel_options;
|
||||
static RosterTable roster;
|
||||
static sqlite3* db;
|
||||
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user