added audio functionality to matrix bot

This commit is contained in:
rexy712
2019-03-07 17:56:47 -08:00
parent 9a98022770
commit c985a05952
7 changed files with 63 additions and 8 deletions

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -57,7 +57,7 @@ namespace reddit{
}
enum class post_type{
image, link, text, video, unrecognized
image, link, text, video, audio, unrecognized
};
class post

View File

@@ -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);
}

View File

@@ -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));
}

View File

@@ -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);

View File

@@ -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;
}
}