为 Jitsi 实现自己的 Prosody 插件

Prosody 是一款面向商业消息和聊天提供商的开源 XMPP 通信服务器。有了 Prosody,开发人员就可以利用 Prosody 提供的可扩展性和灵活性,轻松快速地开发附加功能或新协议原型。开发人员可以将 Prosody 服务器与其他 Prosody 服务器或任何其他兼容 XMPP 的实现方式连接起来。

Prosody 在 Jitsi 系统中起什么作用?

Jitsi 主要使用 Prosody 来发出信号并管理连接用户之间的存在。作为 Jitsi 的用户,你看不到 Prosody 在你与其他用户之间管理的存在,但它就是这样做的。Prosody 管理你在 Jitsi 中的在线状态、信息内容、显示属性等。

下面的架构图显示了 Prosody 组件在 Jitsi 架构中的位置,以及 Prosody 组件连接的其他组件。

为 Jitsi 实现自己的 Prosody 插件
Jitsi 组件架构

尽管 Jitsi 使用了 Prosody,但 Prosody 组件与 Jitsi 组件是完全独立的,因此我们可以针对不同用途对组件进行修改。这为 Jitsi 开发人员提供了高水平的可配置性,可以实现许多自定义功能。就像我们在本文中要做的一样。

Prosody 插件

Prosody 有一个插件目录,其中包含所有可选模块。插件只有启用后才能使用。在 jitsi-meet 项目中可以找到许多默认插件。

这意味着,如果在服务器上安装了 Jitsi,那么 Jitsi 实例中也会有这些内容。安装 Jitsi 实例时必须安装 Prosody。你会在/etc/prosody/conf.d/meet.domain.cfg.lua中获得一个prosody配置。可以在其中定义启用的模块。

modules_enabled = {
	"bosh";
	"http";
	"pubsub";
	...
}

每次 Prosody 服务启动时,都会加载这个模块数组(如果更改了配置文件,则必须重启服务才能应用更改)。这就是为 Prosody 启用可选模块的方法。

请注意,有些插件需要额外更改配置。

插件路径

在配置中,你可以看到一个名为 plugin_paths = { “/usr/share/jitsi-meet/prosody-plugins/” } 的选项。这是 Jitsi 的默认 Prosody 插件所在的位置。你可以添加包含你的插件的新路径,或者将你的新插件放在默认路径中。

Lua 编程语言

Prosody 插件是用 Lua 语言编写的,这就是为什么我们可以看到以 .lua 为扩展名的插件文件。这种语言被认为是一种强大、高效、轻量级、可嵌入的脚本语言。由于使用了 Lua 语言,Prosody 插件的行数较少,语法也比较简单。

如何激活现有的 Prosody 插件?

我们将激活 Prosody 插件 mod_muc_size.lua,并尝试在这里使用该插件。

1. 首先,我们需要在 Prosody 配置中启用该模块。

modules_enabled = {
	"bosh";
	"http";
	"pubsub";
	...
	"muc_size";
}

这里不使用mod_前缀。

2. 重新启动 Prosody 服务以使更改生效。

service prosody restart

3. 根据插件定义,我们可以调用 /room API 端点来获取数据。我们可以通过以下方式访问 API 端点。

https://meet.domain.com/room?room=room_name

但最终会返回 404 Not Found 代码。这个代码来自服务器上的nginx服务。出现此代码的原因是,我们要查找的 Prosody 服务是在服务器本地运行的,因此无法在服务器的公共域中发现它。

4. 我们必须在 nginx 层面引入一条规则,以便在任何请求指向 /room URL 时,将请求指向 Prosody 服务。

location = /room {
	proxy_pass http://127.0.0.1:5280/room?$args&domain=meet.domain.com;
	proxy_set_header X-Forwarded-For $remote_addr;
	proxy_set_header Host meet.domain.com;
	add_header Content-Type "application/json; charset=UTF-8";
	add_header 'Access-Control-Allow-Origin' '*';
}

5. 重新启动 nginx 服务以使反向代理更改生效。

service nginx restart

6. 现在我们可以看到 Prosody 服务发送的所需输出。

[
	{"display_name":"Michael","email":"michael@gmail.com","jid":"room_name@conference.meet.domain.com/f9a6340f"},
	{"display_name":"Lyon","email":"lyon@gmail.com","jid":"room_name@conference.meet.domain.com/eb20392d"}
]

这样您就可以使用 Jitsi 提供的所有 Prosody 模块。

使用 http 模块编写你自己的 Prosody 插件

现在我们将更新插件逻辑并部署为新插件。假设我们需要一些有关房间的额外信息并位于不同的 URL 中。为此,我们需要稍微更改输出格式。

1. 我们首先从路由部分更改 API URL。

function module.load()
    module:depends("http");
	module:provides("http", {
		default_path = "/";
		route = {
			["GET api/room_data"] = function (event) return async_handler_wrapper(event, handle_get_room_data) end;
		};
	});
end

2. 我们需要更改 API 处理程序的内容,以满足我们的需求。

if room then
    local occupants = room._occupants;
        if occupants then
	    participant_count = iterators.count(room:each_occupant());
	        for _, occupant in room:each_occupant() do
		    if string.sub(occupant.nick,-string.len("/focus"))~="/focus" then
		        for _, pr in occupant:each_session() do
			    local nick = pr:get_child_text("nick", "http://jabber.org/protocol/nick") or "";
			    local email = pr:get_child_text("email") or "";
			    occupants_json:push({
			        jid = tostring(occupant.nick),
		                email = tostring(email),
			        display_name = tostring(nick)});
			    end
	                end
		     end
		 end
        
                 if participant_count > 1 then
                     participant_count = participant_count - 1;
                 end

                 response = {
                     success = true;
                     room = {
                     room_name = room_name;
                     room_address = room_address;
                     participants_count = participant_count;
                     participants = occupants_json;
                 }
              };
              
          else
              response = {
                  success = false;
                  message = "No room found"
              };
          end
      return { status_code = 200; body = json.encode(response); };

我们可以使用 mod_muc_size.lua 插件中的相同函数,并将其修改为符合我们的输出要求。

3. 由于我们必须将其添加为一个新插件,因此请在 Prosody plugin_paths 目录下创建一个新的 .lua 文件。为此,我们将创建一个名为 mod_muc_room_data.lua 的新文件。

4. 要加载这个插件文件,我们需要在 Prosody 配置文件下加载它。

modules_enabled = {
	"bosh";
	"http";
	"pubsub";
	...
	"muc_size";
	"muc_room_data";
}

5. 我们必须重启 Prosody 才能使更改生效。重启后,新模块也将加载。如果在模块中使用了其他模块,也需要在此处加入这些模块。

6. 在域外访问时,仍无法发现该 API 端点。我们可以在nginx配置中添加另一个反向代理条目,使外部可以访问API。

location = /api/room_data {
	proxy_pass http://127.0.0.1:5280/api/room_data?$args&domain=meet.domain.com;
	proxy_set_header X-Forwarded-For $remote_addr;
	proxy_set_header Host meet.domain.com;
	add_header Content-Type "application/json; charset=UTF-8";
	add_header 'Access-Control-Allow-Origin' '*';
}

只有在我们添加基于 “http “模块的插件时才需要这样做。不同的使用情况可能不需要完成这一步。

7. 重启 nginx 服务以应用更改。

8. 以下列方式访问新创建的 Prosody 插件的 API

https://meet.domain.com/api/room_data?room=room_name

通过进一步了解 Jitsi 生态系统,你可以更多地使用 Prosody 和 Jitsi,还可以为社区做出贡献。

还可以学习 .lua 来编写出色的脚本。通过揭开 Prosody 数据层的神秘面纱,你不仅可以创建 API 端点,还可以修改数据、附加监听器等。甚至可以找到社区开发者编写的优秀 Prosody 插件。

作者:Buddhi Vikasitha
编译自medium.

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/33405.html

(0)

相关推荐

发表回复

登录后才能评论