0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-16 08:58:20 +02:00

ircd:Ⓜ️ Add central event append() to compose elaborated json::stack::object for clients.

This commit is contained in:
Jason Volk 2019-03-11 15:43:07 -07:00
parent f61059a400
commit c4c95916c2
4 changed files with 138 additions and 0 deletions

View file

@ -74,4 +74,5 @@ namespace ircd::m
#include "event/cached.h"
#include "event/prefetch.h"
#include "event/conforms.h"
#include "event/append.h"
#include "event/pretty.h"

View file

@ -0,0 +1,26 @@
// Matrix Construct
//
// Copyright (C) Matrix Construct Developers, Authors & Contributors
// Copyright (C) 2016-2018 Jason Volk <jason@zemos.net>
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice is present in all copies. The
// full license for this software is available in the LICENSE file.
#pragma once
#define HAVE_IRCD_M_EVENT_APPEND
namespace ircd::m
{
struct event_append_opts
{
const event::idx *event_idx {nullptr};
const string_view *client_txnid {nullptr};
const id::user *user_id {nullptr};
const room *user_room {nullptr};
};
void append(json::stack::object &, const event &, const event_append_opts & = {});
void append(json::stack::array &, const event &, const event_append_opts & = {});
}

View file

@ -143,6 +143,39 @@ ircd::m::pretty_oneline(std::ostream &s,
return s;
}
///////////////////////////////////////////////////////////////////////////////
//
// event/append.h
//
void
ircd::m::append(json::stack::array &array,
const event &event_,
const event_append_opts &opts)
{
json::stack::object object
{
array
};
append(object, event_, opts);
}
void
ircd::m::append(json::stack::object &object,
const event &event_,
const event_append_opts &opts)
{
using prototype = void (json::stack::object &, const event &, const event_append_opts &);
static mods::import<prototype> call
{
"m_event", "ircd::m::append"
};
call(object, event_, opts);
}
///////////////////////////////////////////////////////////////////////////////
//
// event/conforms.h

View file

@ -450,6 +450,84 @@ ircd::m::pretty_oneline(std::ostream &s,
return s;
}
void
IRCD_MODULE_EXPORT
ircd::m::append(json::stack::object &object,
const event &event,
const event_append_opts &opts)
{
const bool has_event_idx
{
opts.event_idx && *opts.event_idx
};
const bool has_client_txnid
{
opts.client_txnid && *opts.client_txnid
};
const bool has_user
{
opts.user_id && opts.user_room
};
const bool sender_is_user
{
has_user && json::get<"sender"_>(event) == *opts.user_id
};
const auto txnid_idx
{
!has_client_txnid && sender_is_user?
opts.user_room->get(std::nothrow, "ircd.client.txnid", at<"event_id"_>(event)):
0UL
};
if(!has_client_txnid && !txnid_idx && sender_is_user)
log::dwarning
{
log, "Could not find transaction_id for %s from %s in %s",
json::get<"event_id"_>(event),
json::get<"sender"_>(event),
json::get<"room_id"_>(event)
};
object.append(event);
if(!has_event_idx && !txnid_idx)
return;
json::stack::object unsigned_
{
object, "unsigned"
};
if(has_client_txnid)
json::stack::member
{
unsigned_, "transaction_id", *opts.client_txnid
};
if(has_event_idx)
json::stack::member
{
unsigned_, "age", json::value
{
long(vm::current_sequence - *opts.event_idx)
}
};
if(txnid_idx)
m::get(std::nothrow, txnid_idx, "content", [&unsigned_]
(const json::object &content)
{
json::stack::member
{
unsigned_, "transaction_id", unquote(content.get("transaction_id"))
};
});
}
bool
IRCD_MODULE_EXPORT
ircd::m::event::auth::chain::for_each(const auth::chain &c,