首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何注册自定义实现的Ejabberd公共子节点?

如何注册自定义实现的Ejabberd公共子节点?
EN

Stack Overflow用户
提问于 2020-01-14 14:20:58
回答 1查看 200关注 0票数 1

我想使用公共节点(gen_pubsub_node)的自定义实现。我在灵丹妙药中创建了虚拟实现(将一切委托给node_flat_sql):

代码语言:javascript
复制
defmodule CustomNodePlugin do
  @behaviour :gen_pubsub_node

  defdelegate init(host, server_host, opts), to: :node_flat_sql
  defdelegate terminate(host, server_host), to: :node_flat_sql
  defdelegate options(), to: :node_flat_sql
  defdelegate features(), to: :node_flat_sql
  defdelegate create_node_permission(host, server_host, node, parent_node, owner), to: :node_flat_sql
  defdelegate create_node(node_idx, owner), to: :node_flat_sql
  defdelegate delete_node(nodes), to: :node_flat_sql
  defdelegate purge_node(node_idx), to: :node_flat_sql
  defdelegate subscribe_node(
    node_idx,
    sender,
    subscriber,
    access_model,
    send_last,
    pesesnce_subscription,
    roster_group, options
  ), to: :node_flat_sql
  defdelegate unsubscribe_node(
    node_idx,
    sender,
    subscriber,
    sub_id
  ), to: :node_flat_sql
  defdelegate publish_item(
    node_idx,
    publisher,
    publish_model,
    max_items,
    item_id,
    payload,
    options
  ), to: :node_flat_sql
  defdelegate delete_item(
    node_idx,
    publisher,
    publish_model,
    item_id
  ), to: :node_flat_sql
  defdelegate remove_extra_items(
    node_idx,
    max_items,
    item_ids
  ), to: :node_flat_sql
  defdelegate get_node_affiliations(node_idx), to: :node_flat_sql
  defdelegate get_entity_affiliations(
    host,
    owner
  ), to: :node_flat_sql
  defdelegate get_affiliation(node_idx, owner), to: :node_flat_sql
  defdelegate set_affiliation(node_idx, owner, affiliation), to: :node_flat_sql

  # needs to be implemented
  defdelegate get_node_subscriptions(node_idx), to: :node_flat_sql
  defdelegate get_entity_subscriptions(host, key), to: :node_flat_sql
  defdelegate get_subscriptions(node_idx, owner), to: :node_flat_sql
  defdelegate get_pending_nodes(host, owner), to: :node_flat_sql
  defdelegate get_states(node_idx), to: :node_flat_sql
  defdelegate get_state(node_idx, key), to: :node_flat_sql
  defdelegate set_state(state), to: :node_flat_sql
  defdelegate get_items(
    node_idx,
    jid,
    access_model,
    param1,
    param2,
    param3,
    param4
  ), to: :node_flat_sql
  defdelegate get_items(
    node_idx,
    jid,
    access_model
  ), to: :node_flat_sql
  defdelegate get_last_items(node_idx, jid, rsm_set), to: :node_flat_sql
  defdelegate get_only_item(node_idx, jid), to: :node_flat_sql
  defdelegate get_item(
    node_idx,
    jid,
    access_model,
    presence_subscription,
    roster_group,
    sub_id
  ), to: :node_flat_sql
  defdelegate get_item(
    node_idx,
    item_id
  ), to: :node_flat_sql
  defdelegate set_item(), to: :node_flat_sql
  defdelegate get_item_name(host, server_host, node_idx), to: :node_flat_sql
  defdelegate node_to_path(node_idx), to: :node_flat_sql
  defdelegate path_to_node(node_idx), to: :node_flat_sql
end

我想不出如何将它集成到ejabberd中,我尝试在ejabberd.yml中注册它:

代码语言:javascript
复制
...
  mod_pubsub:
    access_createnode: pubsub_createnode
    db_type: sql
    plugins:
      - "flat"
      - "pep"
      - "CustomNodePlugin"
    force_node_config:
      ## Change from "whitelist" to "open" to enable OMEMO support
      ## See https://github.com/processone/ejabberd/issues/2425
      "eu.siacs.conversations.axolotl.*":
        access_model: open
      ## Avoid buggy clients to make their bookmarks public
      "storage:bookmarks":
        access_model: open
...

但我得到以下错误:启动ejabberd应用程序失败:选项模块的无效值->mod_pubsub->plugins->3:意外值: CustomNodePlugin。你是说平庸吗?可能的值是:平面,激励

试着查看文档(https://docs.ejabberd.im/developer/extending-ejabberd/pubsub/#pubsub-overview)和https://github.com/processone/ejabberd/blob/master/src/mod_pubsub.erl#L257,但是找不到我可以将新实现挂在哪里。是否有办法通过配置文件注册新节点?多么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-26 17:29:29

我设法弄清楚了,包子只给酒吧吃。配置文档说明PEP节点可以通过pep_mapping (https://docs.ejabberd.im/admin/configuration/#mod-pubsub search for pep_mapping)使用cutom实现,这里可以通过添加pep_mapping项强制节点使用自定义实现。

代码语言:javascript
复制
mod_pubsub:
  pep_mapping:
    "custom:node": custom

在运行时(默认配置),Ejabberd将查找名为node_custom的模块。如果将SQL配置为后端,Ejabberd将查找名为node_custom_sql的模块。灵丹妙药模块可以以原子作为名称,因此您应该将模块定义为:

代码语言:javascript
复制
defmodule :node_custom_sql do
...

使:

  1. Register在配置
  2. 中定义模块,其名称为"node_“++ "_sql”(如果配置为node_后端的话)。模块名为atom
  3. 实现gen_pubsub_node behaviour
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59735654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档