0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-29 18:22:50 +01:00

ircd:Ⓜ️ Preliminary reorg around experimental presence interface.

This commit is contained in:
Jason Volk 2018-03-04 07:15:50 -08:00
parent d3d58d8ee9
commit 69b0acde63
5 changed files with 152 additions and 70 deletions

View file

@ -13,7 +13,7 @@
namespace ircd::m namespace ircd::m
{ {
struct presence;
} }
#pragma GCC diagnostic push #pragma GCC diagnostic push
@ -23,6 +23,7 @@ struct ircd::m::edu::m_presence
< <
json::property<name::user_id, json::string>, json::property<name::user_id, json::string>,
json::property<name::presence, json::string>, json::property<name::presence, json::string>,
json::property<name::status_msg, json::string>,
json::property<name::last_active_ago, time_t>, json::property<name::last_active_ago, time_t>,
json::property<name::currently_active, bool> json::property<name::currently_active, bool>
> >
@ -31,3 +32,16 @@ struct ircd::m::edu::m_presence
using super_type::operator=; using super_type::operator=;
}; };
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
struct ircd::m::presence
:edu::m_presence
{
static bool valid_state(const string_view &state);
static json::object get(const user &, const mutable_buffer &);
static event::id::buf set(const presence &);
static event::id::buf set(const user &, const string_view &, const string_view &status = {});
presence(const user &, const mutable_buffer &);
using edu::m_presence::m_presence;
};

View file

@ -39,8 +39,6 @@ struct ircd::m::user
bool is_active() const; bool is_active() const;
bool is_password(const string_view &password) const noexcept; bool is_password(const string_view &password) const noexcept;
event::id::buf presence(const string_view &, const string_view &status = {});
void password(const string_view &password); void password(const string_view &password);
void deactivate(const json::members &contents = {}); void deactivate(const json::members &contents = {});
event::id::buf activate(const json::members &contents = {}); event::id::buf activate(const json::members &contents = {});

View file

@ -259,7 +259,7 @@ try
{ "default", "Wanna chat? IRCd at your service!" } { "default", "Wanna chat? IRCd at your service!" }
}; };
me.presence("online", online_status_msg); presence::set(me, "online", online_status_msg);
join(my_room, me.user_id); join(my_room, me.user_id);
} }
catch(const m::ALREADY_MEMBER &e) catch(const m::ALREADY_MEMBER &e)
@ -277,25 +277,74 @@ ircd::m::leave_ircd_room()
}; };
leave(my_room, me.user_id); leave(my_room, me.user_id);
me.presence("offline", offline_status_msg); presence::set(me, "offline", offline_status_msg);
} }
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// //
// m/user.h // m/presence.h
// //
ircd::m::event::id::buf ircd::m::presence::presence(const user &user,
ircd::m::user::activate(const json::members &contents) const mutable_buffer &buf)
:presence
{ {
using prototype = event::id::buf (const m::user &, const json::members &); get(user, buf)
}
{
}
ircd::m::event::id::buf
ircd::m::presence::set(const user &user,
const string_view &presence,
const string_view &status_msg)
{
return set(m::presence
{
{ "user_id", user.user_id },
{ "presence", presence },
{ "status_msg", status_msg },
});
}
ircd::m::event::id::buf
ircd::m::presence::set(const presence &object)
{
using prototype = event::id::buf (const presence &);
static import<prototype> function static import<prototype> function
{ {
"client_register", "register__user" "m_presence", "presence_set"
}; };
return function(*this, contents); return function(object);
}
ircd::json::object
ircd::m::presence::get(const user &user,
const mutable_buffer &buffer)
{
using prototype = json::object (const m::user &, const mutable_buffer &);
static import<prototype> function
{
"m_presence", "presence_get"
};
return function(user, buffer);
}
bool
ircd::m::presence::valid_state(const string_view &state)
{
using prototype = bool (const string_view &);
static import<prototype> function
{
"m_presence", "presence_valid_state"
};
return function(state);
} }
ircd::m::event::id::buf ircd::m::event::id::buf

View file

@ -30,20 +30,6 @@ presence_resource
// put // put
// //
const string_view
valid_states[]
{
"online", "offline", "unavailable"
};
static bool
valid_state(const string_view &state);
extern "C" m::event::id::buf
set__user_presence_status(const m::user::id &user_id,
const string_view &presence,
const string_view &status_msg);
static resource::response static resource::response
put__presence_status(client &client, put__presence_status(client &client,
const resource::request &request, const resource::request &request,
@ -115,61 +101,23 @@ put__presence_status(client &client,
unquote(request.at("presence")) unquote(request.at("presence"))
}; };
const string_view &status_msg if(!m::presence::valid_state(presence))
{
trunc(unquote(request["status_msg"]), 390)
};
set__user_presence_status(request.user_id, presence, status_msg);
return resource::response
{
client, http::OK
};
}
m::event::id::buf
set__user_presence_status(const m::user::id &user_id,
const string_view &presence,
const string_view &status_msg)
{
if(!valid_state(presence))
throw m::UNSUPPORTED throw m::UNSUPPORTED
{ {
"That presence state is not supported" "That presence state is not supported"
}; };
json::iov content; const string_view &status_msg
const json::iov::push _presence[]
{ {
{ content, { "presence", presence } }, trunc(unquote(request["status_msg"]), 390)
{ content, { "user_id", user_id } },
}; };
const json::iov::set_if _status_msg const m::user user{request.user_id};
m::presence::set(user, presence, status_msg);
return resource::response
{ {
content, !empty(status_msg), client, http::OK
{
"status_msg", status_msg
}
}; };
const m::user::room user_room
{
user_id
};
return send(user_room, user_id, "m.presence", content);
}
bool
valid_state(const string_view &state)
{
return std::any_of(begin(valid_states), end(valid_states), [&state]
(const string_view &valid)
{
return state == valid;
});
} }
// //

73
modules/m_presence.cc Normal file
View file

@ -0,0 +1,73 @@
// 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.
using namespace ircd;
mapi::header
IRCD_MODULE
{
"Matrix Presence"
};
const string_view
valid_states[]
{
"online", "offline", "unavailable",
};
extern "C" bool
presence_valid_state(const string_view &state)
{
return std::any_of(begin(valid_states), end(valid_states), [&state]
(const string_view &valid)
{
return state == valid;
});
}
extern "C" m::event::id::buf
presence_set(const m::presence &content)
{
const m::user user
{
at<"user_id"_>(content)
};
const m::user::room user_room
{
user
};
return send(user_room, user.user_id, "m.presence", json::strung{content});
}
extern "C" json::object
presence_get(const m::user &user,
const mutable_buffer &buffer)
{
const m::user::room user_room
{
user
};
json::object ret;
user_room.get(std::nothrow, "m.presence", [&ret, &buffer]
(const m::event &event)
{
const string_view &content
{
at<"content"_>(event)
};
ret = { data(buffer), copy(buffer, content) };
});
return ret;
}