-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathserver_logger.cpp
More file actions
92 lines (73 loc) · 3.38 KB
/
server_logger.cpp
File metadata and controls
92 lines (73 loc) · 3.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "server_logger.h"
#include "database/operations/moderation/logging_operations.h"
#include "log.h"
#include <iostream>
namespace bronx {
namespace logger {
ServerLogger& ServerLogger::get() {
static ServerLogger instance;
return instance;
}
void ServerLogger::init(dpp::cluster* bot, db::Database* db) {
bot_ = bot;
db_ = db;
}
void ServerLogger::log_to_guild(uint64_t guild_id, const std::string& log_type, const dpp::message& msg) {
if (!bot_ || !db_) return;
// Fetch the stored webhook config for this log type
auto config = db::logging_operations::get_log_config(db_, guild_id, log_type);
if (!config || !config->enabled) {
return; // Logging not configured or disabled for this type
}
dpp::webhook wh(config->webhook_id, config->webhook_token);
bot_->execute_webhook(wh, msg, false, 0, "", [guild_id, log_type](const dpp::confirmation_callback_t& ev) {
if (ev.is_error()) {
std::cerr << "[WRN] Failed to dispatch webhook log for guild " << guild_id
<< " type: " << log_type << " (" << ev.get_error().message << ")" << std::endl;
// Additional logic to disable broken webhooks can be placed here if desirable.
}
});
}
void ServerLogger::log_to_guild(uint64_t guild_id, const std::string& log_type, const dpp::message& msg, std::function<void(const dpp::message&)> callback) {
if (!bot_ || !db_) return;
auto config = db::logging_operations::get_log_config(db_, guild_id, log_type);
if (!config || !config->enabled) {
return;
}
dpp::webhook wh(config->webhook_id, config->webhook_token);
// Set wait=true so that Discord returns the message object!
bot_->execute_webhook(wh, msg, true, 0, "", [guild_id, log_type, callback](const dpp::confirmation_callback_t& ev) {
if (ev.is_error()) {
std::cerr << "[WRN] Failed to dispatch webhook log for guild " << guild_id
<< " type: " << log_type << " (" << ev.get_error().message << ")" << std::endl;
} else {
dpp::message returned_msg = std::get<dpp::message>(ev.value);
callback(returned_msg);
}
});
}
void ServerLogger::edit_webhook_message(uint64_t guild_id, const std::string& log_type, uint64_t webhook_msg_id, const dpp::message& msg) {
if (!bot_ || !db_) return;
auto config = db::logging_operations::get_log_config(db_, guild_id, log_type);
if (!config || !config->enabled) {
return;
}
dpp::webhook wh(config->webhook_id, config->webhook_token);
dpp::message edit_msg = msg;
edit_msg.id = webhook_msg_id;
bot_->edit_webhook_message(wh, edit_msg, 0, [guild_id, log_type, webhook_msg_id](const dpp::confirmation_callback_t& ev) {
if (ev.is_error()) {
std::cerr << "[WRN] Failed to edit webhook log " << webhook_msg_id << " for guild " << guild_id
<< " type: " << log_type << " (" << ev.get_error().message << ")" << std::endl;
}
});
}
void ServerLogger::log_embed(uint64_t guild_id, const std::string& log_type, const dpp::embed& embed) {
dpp::message msg;
msg.add_embed(embed);
// Set a generic fallback display name/avatar for the webhook message if you want,
// or let it use the bot's default webhook profile.
log_to_guild(guild_id, log_type, msg);
}
} // namespace logger
} // namespace bronx