Save received and sent messages into the database
This commit is contained in:
+12
-3
@@ -39,8 +39,17 @@
|
|||||||
</index>
|
</index>
|
||||||
</object>
|
</object>
|
||||||
|
|
||||||
<object name="LogLine">
|
<object name="MucLogLine">
|
||||||
<field name="date" type="date" />
|
<field name="uuid" type="string" length="36" />
|
||||||
<field name="body" type="string" length="4096"/>
|
<!-- The bare JID of the user for which we stored the line. It's
|
||||||
|
the JID associated with the Bridge -->
|
||||||
|
<field name="owner" type="string" length="4096" />
|
||||||
|
<!-- The room IID -->
|
||||||
|
<field name="ircChanName" type="string" length="4096" />
|
||||||
|
<field name="ircServerName" type="string" length="4096" />
|
||||||
|
|
||||||
|
<field name="date" type="datetime" />
|
||||||
|
<field name="body" type="string" length="65536"/>
|
||||||
|
<field name="nick" type="string" length="4096" />
|
||||||
</object>
|
</object>
|
||||||
</database>
|
</database>
|
||||||
|
|||||||
@@ -224,6 +224,11 @@ void Bridge::send_channel_message(const Iid& iid, const std::string& body)
|
|||||||
irc->send_channel_message(iid.get_local(), action_prefix + line.substr(4) + "\01");
|
irc->send_channel_message(iid.get_local(), action_prefix + line.substr(4) + "\01");
|
||||||
else
|
else
|
||||||
irc->send_channel_message(iid.get_local(), line);
|
irc->send_channel_message(iid.get_local(), line);
|
||||||
|
|
||||||
|
const auto xmpp_body = this->make_xmpp_body(line);
|
||||||
|
Database::store_muc_message(this->get_bare_jid(), iid, std::chrono::system_clock::now(),
|
||||||
|
std::get<0>(xmpp_body), irc->get_own_nick());
|
||||||
|
|
||||||
for (const auto& resource: this->resources_in_chan[iid.to_tuple()])
|
for (const auto& resource: this->resources_in_chan[iid.to_tuple()])
|
||||||
this->xmpp.send_muc_message(std::to_string(iid), irc->get_own_nick(),
|
this->xmpp.send_muc_message(std::to_string(iid), irc->get_own_nick(),
|
||||||
this->make_xmpp_body(line), this->user_jid + "/" + resource);
|
this->make_xmpp_body(line), this->user_jid + "/" + resource);
|
||||||
@@ -578,10 +583,15 @@ void Bridge::send_message(const Iid& iid, const std::string& nick, const std::st
|
|||||||
const auto encoding = in_encoding_for(*this, iid);
|
const auto encoding = in_encoding_for(*this, iid);
|
||||||
if (muc)
|
if (muc)
|
||||||
{
|
{
|
||||||
|
const auto xmpp_body = this->make_xmpp_body(body, encoding);
|
||||||
|
Database::store_muc_message(this->get_bare_jid(), iid, std::chrono::system_clock::now(),
|
||||||
|
std::get<0>(xmpp_body), nick);
|
||||||
|
|
||||||
for (const auto& resource: this->resources_in_chan[iid.to_tuple()])
|
for (const auto& resource: this->resources_in_chan[iid.to_tuple()])
|
||||||
{
|
{
|
||||||
this->xmpp.send_muc_message(std::to_string(iid), nick,
|
this->xmpp.send_muc_message(std::to_string(iid), nick,
|
||||||
this->make_xmpp_body(body, encoding), this->user_jid + "/" + resource);
|
this->make_xmpp_body(body, encoding), this->user_jid + "/" + resource);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -3,7 +3,9 @@
|
|||||||
|
|
||||||
#include <database/database.hpp>
|
#include <database/database.hpp>
|
||||||
#include <logger/logger.hpp>
|
#include <logger/logger.hpp>
|
||||||
|
#include <irc/iid.hpp>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <uuid.h>
|
||||||
|
|
||||||
using namespace std::string_literals;
|
using namespace std::string_literals;
|
||||||
|
|
||||||
@@ -79,9 +81,38 @@ db::IrcChannelOptions Database::get_irc_channel_options_with_server_default(cons
|
|||||||
return coptions;
|
return coptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Database::store_muc_message(const std::string& owner, const Iid& iid,
|
||||||
|
Database::time_point date,
|
||||||
|
const std::string& body,
|
||||||
|
const std::string& nick)
|
||||||
|
{
|
||||||
|
db::MucLogLine line(*Database::db);
|
||||||
|
|
||||||
|
line.uuid = Database::gen_uuid();
|
||||||
|
line.owner = owner;
|
||||||
|
line.ircChanName = iid.get_local();
|
||||||
|
line.ircServerName = iid.get_server();
|
||||||
|
line.date = date.time_since_epoch().count();
|
||||||
|
line.body = body;
|
||||||
|
line.nick = nick;
|
||||||
|
|
||||||
|
line.update();
|
||||||
|
}
|
||||||
|
|
||||||
void Database::close()
|
void Database::close()
|
||||||
{
|
{
|
||||||
Database::db.reset(nullptr);
|
Database::db.reset(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string Database::gen_uuid()
|
||||||
|
{
|
||||||
|
char uuid_str[37];
|
||||||
|
uuid_t uuid;
|
||||||
|
uuid_generate(uuid);
|
||||||
|
uuid_unparse(uuid, uuid_str);
|
||||||
|
return uuid_str;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -9,10 +9,14 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include <litesql.hpp>
|
#include <litesql.hpp>
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
class Iid;
|
||||||
|
|
||||||
class Database
|
class Database
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
using time_point = std::chrono::system_clock::time_point;
|
||||||
Database() = default;
|
Database() = default;
|
||||||
~Database() = default;
|
~Database() = default;
|
||||||
|
|
||||||
@@ -41,11 +45,15 @@ public:
|
|||||||
const std::string& server,
|
const std::string& server,
|
||||||
const std::string& channel);
|
const std::string& channel);
|
||||||
|
|
||||||
|
static void store_muc_message(const std::string& owner, const Iid& iid,
|
||||||
|
time_point date, const std::string& body, const std::string& nick);
|
||||||
|
|
||||||
static void close();
|
static void close();
|
||||||
static void open(const std::string& filename, const std::string& db_type="sqlite3");
|
static void open(const std::string& filename, const std::string& db_type="sqlite3");
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static std::string gen_uuid();
|
||||||
static std::unique_ptr<db::BibouDB> db;
|
static std::unique_ptr<db::BibouDB> db;
|
||||||
};
|
};
|
||||||
#endif /* USE_DATABASE */
|
#endif /* USE_DATABASE */
|
||||||
|
|||||||
Reference in New Issue
Block a user