mirror of
https://github.com/matrix-construct/construct
synced 2024-11-29 10:12:39 +01:00
ircd:Ⓜ️ Preliminary reorg around experimental presence interface.
This commit is contained in:
parent
d3d58d8ee9
commit
69b0acde63
5 changed files with 152 additions and 70 deletions
|
@ -13,7 +13,7 @@
|
|||
|
||||
namespace ircd::m
|
||||
{
|
||||
|
||||
struct presence;
|
||||
}
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
|
@ -23,6 +23,7 @@ struct ircd::m::edu::m_presence
|
|||
<
|
||||
json::property<name::user_id, 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::currently_active, bool>
|
||||
>
|
||||
|
@ -31,3 +32,16 @@ struct ircd::m::edu::m_presence
|
|||
using super_type::operator=;
|
||||
};
|
||||
#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;
|
||||
};
|
||||
|
|
|
@ -39,8 +39,6 @@ struct ircd::m::user
|
|||
bool is_active() const;
|
||||
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 deactivate(const json::members &contents = {});
|
||||
event::id::buf activate(const json::members &contents = {});
|
||||
|
|
65
ircd/m/m.cc
65
ircd/m/m.cc
|
@ -259,7 +259,7 @@ try
|
|||
{ "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);
|
||||
}
|
||||
catch(const m::ALREADY_MEMBER &e)
|
||||
|
@ -277,25 +277,74 @@ ircd::m::leave_ircd_room()
|
|||
};
|
||||
|
||||
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::user::activate(const json::members &contents)
|
||||
ircd::m::presence::presence(const user &user,
|
||||
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
|
||||
{
|
||||
"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
|
||||
|
|
|
@ -30,20 +30,6 @@ presence_resource
|
|||
// 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
|
||||
put__presence_status(client &client,
|
||||
const resource::request &request,
|
||||
|
@ -115,61 +101,23 @@ put__presence_status(client &client,
|
|||
unquote(request.at("presence"))
|
||||
};
|
||||
|
||||
const string_view &status_msg
|
||||
{
|
||||
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))
|
||||
if(!m::presence::valid_state(presence))
|
||||
throw m::UNSUPPORTED
|
||||
{
|
||||
"That presence state is not supported"
|
||||
};
|
||||
|
||||
json::iov content;
|
||||
const json::iov::push _presence[]
|
||||
const string_view &status_msg
|
||||
{
|
||||
{ content, { "presence", presence } },
|
||||
{ content, { "user_id", user_id } },
|
||||
trunc(unquote(request["status_msg"]), 390)
|
||||
};
|
||||
|
||||
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),
|
||||
{
|
||||
"status_msg", status_msg
|
||||
}
|
||||
client, http::OK
|
||||
};
|
||||
|
||||
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
73
modules/m_presence.cc
Normal 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;
|
||||
}
|
Loading…
Reference in a new issue