1
0
Fork 0
mirror of https://github.com/Syping/dtranslatebot.git synced 2025-08-26 03:38:15 +02:00
dtranslatebot/src/webhook_push.cpp
2024-02-04 10:12:19 +01:00

86 lines
4 KiB
C++

/*****************************************************************************
* dtranslatebot Discord Translate Bot
* Copyright (C) 2024 Syping
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* This software is provided as-is, no warranties are given to you, we are not
* responsible for anything with use of the software, you are self responsible.
*****************************************************************************/
#include <future>
#include <regex>
#include "webhook_push.h"
using namespace std::string_literals;
using namespace std::string_view_literals;
void bot::webhook_push::run(const bot::translated_message &message, dpp::cluster *bot)
{
dpp::json json_body = {
{"username"s, message.author},
{"avatar_url"s, message.avatar}
};
// We will split too long messages into multiple messages
if (message.message.length() > 2000) {
std::string_view message_v = message.message;
while (!message_v.empty()) {
const std::string_view message_eov = message_v.substr(1333, 666);
const std::string_view::size_type pos = message_eov.rfind('\n');
if (pos != std::string_view::npos) {
json_body["content"] = message_v.substr(0, 1333 + pos);
message_v = message_v.substr(1333 + pos);
}
else {
std::cmatch match;
if (std::regex_match(message_eov.begin(), message_eov.end(), match, std::regex("^.*(\\.|\\?|\\!|\\。)\\s.*$"s))) {
json_body["content"] = message_v.substr(0, 1334 + match.position(1));
message_v = message_v.substr(1334 + match.position(1));
}
else if (std::regex_match(message_eov.begin(), message_eov.end(), match, std::regex("^.*(\\,)\\s.*$"s))) {
json_body["content"] = message_v.substr(0, 1334 + match.position(1));
message_v = message_v.substr(1334 + match.position(1));
}
else if (std::regex_match(message_eov.begin(), message_eov.end(), match, std::regex("^.*()\\s.*$"s))) {
json_body["content"] = message_v.substr(0, 1334 + match.position(1));
message_v = message_v.substr(1334 + match.position(1));
}
else {
json_body["content"] = message_v.substr(0, 1333);
message_v = message_v.substr(1333);
}
}
push_request(message.webhook.id, message.webhook.token, json_body.dump(), bot);
if (message_v.length() <= 2000) {
json_body["content"] = message_v;
message_v = {};
push_request(message.webhook.id, message.webhook.token, json_body.dump(), bot);
}
}
}
else {
json_body["content"] = message.message;
push_request(message.webhook.id, message.webhook.token, json_body.dump(), bot);
}
}
void bot::webhook_push::push_request(dpp::snowflake webhook_id, const std::string &webhook_token, const std::string &json, dpp::cluster *bot)
{
std::promise<dpp::http_request_completion_t> _p;
std::future<dpp::http_request_completion_t> _f = _p.get_future();
bot->post_rest(API_PATH "/webhooks", std::to_string(webhook_id), dpp::utility::url_encode(webhook_token), dpp::m_post, json, [bot, &_p](dpp::json &json, const dpp::http_request_completion_t &event) {
if (event.status != 204)
std::cerr << "[Warning] Webhook push returned unexpected code " << event.status << std::endl;
_p.set_value(event);
});
_f.wait();
}