matrix_thing/src/matrix/fat_strings.cpp
2020-01-02 15:24:38 -08:00

231 lines
8.8 KiB
C++

/**
This file is a part of rexy's matrix client
Copyright (C) 2019 rexy712
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "matrix/fat_strings.hpp"
#include "matrix/upload_info.hpp"
#include "raii/string_base.hpp"
#include "matrix/json_targets.hpp"
#include "raii/util.hpp"
namespace matrix::json{
static constexpr auto quote(const raii::string_base& str){
return "\"" + str + "\"";
}
static constexpr auto key(const raii::string_base& str){
return "\"" + str + "\":";
}
static constexpr raii::static_string open_brace(void){
return "{"_ss;
}
static constexpr raii::static_string close_brace(void){
return "}"_ss;
}
static constexpr raii::static_string comma(void){
return ","_ss;
}
template<class Arg, class... Args>
static constexpr auto object_impl(Arg&& arg, Args&&... args){
if constexpr(sizeof...(args) > 0){
return arg + comma() + object_impl(std::forward<Args>(args)...);
}else{
return std::forward<Arg>(arg);
}
}
template<class... Args>
static constexpr auto object(Args&&... args){
return open_brace() + object_impl(std::forward<Args>(args)...) + close_brace();
}
template<class Str1, class Str2>
static constexpr auto member(Str1&& k, Str2&& value){
return key(k) + value;
}
raii::static_string _empty(void){
return "{}"_ss;
}
raii::string _image_body(const uploaded_image& image){
raii::string url = raii::json_escape(image.url());
const raii::string_base* thumburl;
if(image.thumb_url())
thumburl = &image.thumb_url();
else
thumburl = &url;
return raii::string(
object(
member(json::keys::message::body(), quote(raii::json_escape(image.name()))),
member(json::keys::message::info(), object(
member(json::keys::message::infobody::height(), raii::itostr(image.height())),
member(json::keys::message::infobody::mimetype(), quote(image.mimetype())),
member(json::keys::message::infobody::size(), raii::itostr(image.size())),
member(json::keys::message::infobody::thumbinfo(), object(
member(json::keys::message::infobody::thumbnail::height(), raii::itostr(image.thumb_height())),
member(json::keys::message::infobody::thumbnail::mimetype(), quote(image.thumb_mimetype())),
member(json::keys::message::infobody::thumbnail::size(), raii::itostr(image.thumb_size())),
member(json::keys::message::infobody::thumbnail::width(), raii::itostr(image.thumb_width()))
)),
member(json::keys::message::infobody::thumburl(), quote(raii::json_escape(*thumburl))),
member(json::keys::message::infobody::width(), raii::itostr(image.width()))
)),
member(json::keys::message::msgtype(), quote("m.image"_ss)),
member(json::keys::message::url(), quote(raii::json_escape(url)))
));
}
raii::string _video_body(const uploaded_video& video){
return raii::string(
object(
member(json::keys::message::body(), quote(raii::json_escape(video.name()))),
member(json::keys::message::info(), object(
member(json::keys::message::infobody::height(), raii::itostr(video.height())),
member(json::keys::message::infobody::mimetype(), quote(video.mimetype())),
member(json::keys::message::infobody::size(), raii::itostr(video.size())),
member(json::keys::message::infobody::thumbinfo(), object(
member(json::keys::message::infobody::thumbnail::height(), raii::itostr(video.thumb_height())),
member(json::keys::message::infobody::thumbnail::mimetype(), quote(video.thumb_mimetype())),
member(json::keys::message::infobody::thumbnail::size(), raii::itostr(video.thumb_size())),
member(json::keys::message::infobody::thumbnail::width(), raii::itostr(video.thumb_width()))
)),
member(json::keys::message::infobody::thumburl(), quote(raii::json_escape(video.thumb_url()))),
member(json::keys::message::infobody::width(), raii::itostr(video.width()))
)),
member(json::keys::message::msgtype(), quote("m.video"_ss)),
member(json::keys::message::url(), quote(raii::json_escape(video.url())))
));
}
raii::string _file_body(const uploaded_file& file){
return raii::string(
object(
member(json::keys::message::body(), quote(raii::json_escape(file.name()))),
member(json::keys::message::info(), object(
member(json::keys::message::infobody::size(), raii::itostr(file.size()))
)),
member(json::keys::message::msgtype(), quote("m.file"_ss)),
member(json::keys::message::url(), quote(raii::json_escape(file.url())))
));
}
raii::string _audio_body(const uploaded_audio& audio){
return raii::string(
object(
member(json::keys::message::body(), quote(raii::json_escape(audio.name()))),
member(json::keys::message::info(), object(
member(json::keys::message::infobody::mimetype(), quote(audio.mimetype())),
member(json::keys::message::infobody::size(), raii::itostr(audio.size()))
)),
member(json::keys::message::msgtype(), quote("m.audio"_ss)),
member(json::keys::message::url(), quote(raii::json_escape(audio.url())))
));
}
raii::string _message_body(const raii::string_base& msg){
return raii::string(
object(
member(json::keys::message::body(), quote(raii::json_escape(msg))),
member(json::keys::message::msgtype(), quote("m.text"_ss))
));
}
raii::string _login_password(const raii::string_base& username, const raii::string_base& password){
return raii::string(
object(
member(json::keys::auth::type(), quote("m.login.password"_ss)),
member(json::keys::auth::identifier(), object(
member(json::keys::auth::identifierbody::type(), quote("m.id.user"_ss)),
member(json::keys::auth::identifierbody::user(), quote(raii::json_escape(username)))
)),
member(json::keys::auth::password(), quote(raii::json_escape(password)))
));
}
raii::string _change_psk_password(const raii::string_base& userid, const raii::string_base& newpass, const raii::string_base& oldpass, const raii::string_base& session){
return raii::string(
object(
member(json::keys::auth::newpassword(), quote(raii::json_escape(newpass))),
member(json::keys::auth::auth(), object(
member(json::keys::auth::authbody::type(), quote("m.login.password"_ss)),
member(json::keys::auth::authbody::session(), quote(session)),
member(json::keys::auth::authbody::user(), quote(raii::json_escape(userid))),
member(json::keys::auth::authbody::password(), quote(raii::json_escape(oldpass)))
))
));
}
raii::string _displayname_set(const raii::string_base& newname){
return raii::string(
object(
member(json::keys::client::displayname(), quote(raii::json_escape(newname)))
));
}
raii::string _avatar_set(const raii::string_base& mediaurl){
return raii::string(
object(
member(json::keys::client::avatarurl(), quote(raii::json_escape(mediaurl)))
));
}
raii::string _presence_set(const raii::string_base& status){
return raii::string(
object(
member(json::keys::client::presence(), quote(status))
));
}
raii::string _create_room(const raii::string_base& name, const raii::string_base& alias){
if(alias){
return raii::string(
object(
member(json::keys::client::name(), quote(raii::json_escape(name))),
member(json::keys::client::roomaliasname(), quote(raii::json_escape(alias)))
));
}else{
return raii::string(
object(
member(json::keys::client::name(), quote(raii::json_escape(name)))
));
}
}
raii::string _userid(const raii::string_base& id){
return raii::string(
object(
member(json::keys::auth::userid(), quote(raii::json_escape(id)))
));
}
raii::string _userid_reason(const raii::string_base& id, const raii::string_base& reason){
return raii::string(
object(
member(json::keys::auth::userid(), quote(raii::json_escape(id))),
member(json::reason(), quote(raii::json_escape(reason)))
));
}
raii::string _typing(bool active, int timeout){
return raii::string(
object(
member(json::keys::client::typing(), active ? json::True() : json::False()),
member(json::keys::client::timeout(), raii::itostr(timeout))
));
}
raii::string _redact(const raii::string_base& reason){
return raii::string(
object(
member(json::reason(), quote(raii::json_escape(reason)))
));
}
raii::string _room_upgrade(int version){
return raii::string(
object(
member(json::keys::rooms::newversion(), raii::itostr(version))
));
}
}