added audio functionality to matrix bot
This commit is contained in:
@@ -29,12 +29,14 @@
|
||||
struct image_info;
|
||||
struct video_info;
|
||||
struct file_info;
|
||||
struct audio_info;
|
||||
|
||||
namespace matrix::detail{
|
||||
|
||||
raii::string _image_body(const image_info& image);
|
||||
raii::string _video_body(const video_info& video);
|
||||
raii::string _file_body(const file_info& video);
|
||||
raii::string _audio_body(const audio_info& audio);
|
||||
raii::string _message_body(const raii::string_base& text);
|
||||
|
||||
}
|
||||
|
||||
@@ -57,7 +57,8 @@ namespace matrix{
|
||||
size_t thumb_height;
|
||||
size_t thumbsize;
|
||||
};
|
||||
using video_info = image_info;
|
||||
struct video_info : public image_info{};
|
||||
struct audio_info : public file_info{};
|
||||
|
||||
class bot
|
||||
{
|
||||
@@ -133,11 +134,14 @@ namespace matrix{
|
||||
image_info upload_image(const raii::string_base& filename, const raii::string_base& alias);
|
||||
video_info upload_video(const raii::string_base& filename);
|
||||
video_info upload_video(const raii::string_base& filename, const raii::string_base& alias);
|
||||
audio_info upload_audio(const raii::string_base& filename);
|
||||
audio_info upload_audio(const raii::string_base& filename, const raii::string_base& alias);
|
||||
|
||||
//send messages
|
||||
raii::rjp_string send_image(const raii::string_base& room, const image_info& image);
|
||||
raii::rjp_string send_video(const raii::string_base& room, const video_info& video);
|
||||
raii::rjp_string send_message(const raii::string_base& room, const raii::string_base& text);
|
||||
raii::rjp_string send_audio(const raii::string_base& room, const audio_info& audio);
|
||||
raii::rjp_string send_file(const raii::string_base& room, const file_info& file);
|
||||
|
||||
void sync(void);
|
||||
|
||||
@@ -57,7 +57,7 @@ namespace reddit{
|
||||
}
|
||||
|
||||
enum class post_type{
|
||||
image, link, text, video, unrecognized
|
||||
image, link, text, video, audio, unrecognized
|
||||
};
|
||||
|
||||
class post
|
||||
|
||||
@@ -124,6 +124,20 @@ namespace matrix::detail{
|
||||
"}");
|
||||
}
|
||||
|
||||
raii::string _audio_body(const audio_info& audio){
|
||||
return raii::string(
|
||||
"{"
|
||||
"\"body\":\"" + raii::json_escape(audio.filename) + "\","
|
||||
"\"info\":{"
|
||||
"\"mimetype\":\"audio/" + raii::json_escape(audio.filetype) + "\","
|
||||
"\"size\":" + itostr(audio.filesize) +
|
||||
"},"
|
||||
"\"msgtype\":\"m.audio\","
|
||||
"\"body\":\"" + audio.filename + "\","
|
||||
"\"url\":\"" + raii::json_escape(audio.fileurl) + "\""
|
||||
"}");
|
||||
}
|
||||
|
||||
raii::string _message_body(const raii::string_base& msg){
|
||||
return raii::string("{\"body\":\""_ss + raii::json_escape(msg) + "\",\"msgtype\":\"m.text\"}"_ss);
|
||||
}
|
||||
|
||||
@@ -228,6 +228,9 @@ namespace matrix{
|
||||
video_info bot::upload_video(const raii::string_base& filename){
|
||||
return upload_video(filename, raii::static_string());
|
||||
}
|
||||
audio_info bot::upload_audio(const raii::string_base& filename){
|
||||
return upload_audio(filename, raii::static_string());
|
||||
}
|
||||
#ifdef HAS_FFMPEG
|
||||
video_info bot::upload_video(const raii::string_base& filename, const raii::string_base& alias){
|
||||
video_info ret = {};
|
||||
@@ -242,27 +245,48 @@ namespace matrix{
|
||||
ret.thumb_height = context.height();
|
||||
ret.width = context.width();
|
||||
ret.height = context.height();
|
||||
raii::string mimetype = context.get_mimetype();
|
||||
ret.filetype = context.get_mimetype();
|
||||
context.reset(); //early cleanup to save memory
|
||||
ret.thumbsize = packet->size;
|
||||
ret.thumburl = _post_and_find(raii::static_string((char*)packet->data, packet->size), m_urls.file_upload, header, "content_uri"_ss);
|
||||
packet.reset();
|
||||
|
||||
header = raii::curl_llist(raii::string("Content-Type: video/" + mimetype));
|
||||
header = raii::curl_llist(raii::string("Content-Type: video/" + ret.filetype));
|
||||
raii::filerd fd(filename);
|
||||
if(!fd) return {};
|
||||
ret.filesize = fd.length();
|
||||
ret.filetype = std::move(mimetype);
|
||||
ret.fileurl = _upload_file(fd, header);
|
||||
ret.filename = alias ? alias : filename;
|
||||
return ret;
|
||||
}
|
||||
audio_info bot::upload_audio(const raii::string_base& filename, const raii::string_base& alias){
|
||||
audio_info ret = {};
|
||||
|
||||
raii::video_man context(filename);
|
||||
if(!context)
|
||||
return {};
|
||||
ret.filetype = context.get_mimetype();
|
||||
context.reset();
|
||||
raii::curl_llist header(raii::string("Content-Type: audio/" + ret.filetype));
|
||||
raii::filerd fd(filename);
|
||||
if(!fd) return {};
|
||||
ret.filesize = fd.length();
|
||||
ret.fileurl = _upload_file(fd, header);
|
||||
ret.filename = alias ? alias : filename;
|
||||
|
||||
return ret;
|
||||
}
|
||||
#else //HAS_FFMPEG
|
||||
video_info bot::upload_video(const raii::string_base& filename, const raii::string_base& alias){
|
||||
video_info ret = {};
|
||||
ret = upload_file(filename, alias);
|
||||
return ret;
|
||||
}
|
||||
audio_info bot::upload_audio(const raii::string_base& filename, const raii::string_base& alias){
|
||||
audio_info ret = {};
|
||||
ret = upload_file(filename, alias);
|
||||
return ret;
|
||||
}
|
||||
#endif //HAS_FFMPEG
|
||||
|
||||
raii::rjp_string bot::send_file(const raii::string_base& room, const file_info& file){
|
||||
@@ -274,6 +298,9 @@ namespace matrix{
|
||||
raii::rjp_string bot::send_video(const raii::string_base& room, const video_info& video){
|
||||
return _send_message(room, detail::_video_body(video));
|
||||
}
|
||||
raii::rjp_string bot::send_audio(const raii::string_base& room, const audio_info& audio){
|
||||
return _send_message(room, detail::_audio_body(audio));
|
||||
}
|
||||
raii::rjp_string bot::send_message(const raii::string_base& room, const raii::string_base& text){
|
||||
return _send_message(room, detail::_message_body(text));
|
||||
}
|
||||
|
||||
@@ -41,7 +41,9 @@ namespace raii{
|
||||
}
|
||||
raii::string video_man::get_mimetype(void)const{
|
||||
const char* first = strstr(m_vid->iformat->name, ",");
|
||||
return raii::string(raii::static_string(m_vid->iformat->name, first - m_vid->iformat->name));
|
||||
if(first)
|
||||
return raii::string(raii::static_string(m_vid->iformat->name, first - m_vid->iformat->name));
|
||||
return raii::string(raii::static_string(m_vid->iformat->name));
|
||||
}
|
||||
auto video_man::create_jpg_thumbnail(void) -> packet_type{
|
||||
context_type jpg_context = _get_jpeg_context(m_context);
|
||||
|
||||
10
src/test.cpp
10
src/test.cpp
@@ -362,6 +362,14 @@ int main(){
|
||||
val = matbot.send_message(roomid, raii::string(reply.title() + "\n" + reply.posturl()));
|
||||
DEBUG_PRINT("text event: %s\n", val.get());
|
||||
}
|
||||
else if(reply.type() == reddit::post_type::audio){
|
||||
DEBUG_PRINT("Got an audio file\n");
|
||||
auto audio_data = matbot.upload_audio(reply.name());
|
||||
auto val = matbot.send_audio(roomid, audio_data);
|
||||
DEBUG_PRINT("audio event: %s\n", val.get());
|
||||
val = matbot.send_message(roomid, raii::string(reply.title() + "\n" + reply.posturl()));
|
||||
DEBUG_PRINT("text event: %s\n", val.get());
|
||||
}
|
||||
else if(reply.type() == reddit::post_type::link)
|
||||
{
|
||||
DEBUG_PRINT("Got a link\n");
|
||||
@@ -373,6 +381,4 @@ int main(){
|
||||
DEBUG_PRINT("TODO HANDLE THIS TYPE OF POST\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user