问题标签 [ejabberd-hooks]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
251 浏览

erlang - 如何解决函数调用之间的竞争条件

我已经使用 erlang 的消息传递构造构建了一个多人游戏(准确地说是 4 个玩家)。我以以下链接上的 tictactoe 游戏为例,但真正相似的是游戏中显示的消息传递构造:link

然后我选择在 ejabberd Multi user Chatroom 上运行这个游戏,我确实为此编写了一个 ejabberd 钩子。但是,如果您查看上述链接中文件 tictactoe.erl 中的 NewGameState,您会发现无法在变量中检索它。

所以我使用了 mnesia 并将每个生成的新游戏状态写入这个 mnesia 表。现在在我的 ejabberd 钩子中,我调用我的游戏函数(即在每次调用时执行一系列模块->“gen_server,game_modules,mnesia_modules”)并在游戏函数调用下方的钩子中,我正在从 mnesia 表中读取游戏状态如下(这里的函数myMessage是ejabberd钩子里面的函数):

现在我的问题是,当执行顺序为时,读取操作给了我一个空表

当我在这两行之间插入延迟时,timer:sleep/1如下所示(经过一些不同值的试验后随机选择值 200):

我得到了正确的 GameState 值,因此建议我进行读取操作

在行some_other_module:game_func(Args)(这是一系列模块->“gen_server,game_modules,mnesia_modules”)能够执行 mnesia 模块并将 GameState 写入 mnesia 表之前执行/执行。

如何解决此问题,因为我不想使用timer:sleep/1它,因为它不是可靠的解决方案。

谁能建议我在这里解决一下。我的意思是,任何人都可以建议我一种方法来通过除 mnesia 以外的任何其他方式来检索钩子内的 GameState,所以我根本没有竞争条件。

或者,ejabberd 是否以某种方式提供了一些我可以在这里使用的功能?

提前致谢。

0 投票
1 回答
141 浏览

ejabberd - When does the user_receive_packet hook gets started/triggered

I am using hooks in ejabberd to create a custom module and have used user_send_packet hook till now.I wanted to implement a custom functionality on ejabberd server as soon as (and after) the packet is sent to the client from the server. I am thinking about using user_receive_packet hook but I am a bit confused regarding the time when it gets triggered or started.

Does it start or gets triggered just before the packet is sent to client or does it starts after the packet is sent to the client.

And in case if it starts or gets triggered before the the packet is sent, then in that case what happens to the packet being sent to the client, I mean does the packet wait for the module implementing user_receive_packet to finish and then goes to the client or it simple is not affected?

Can anyone help me out here?

0 投票
1 回答
69 浏览

xmpp - ejabberd: mom_mam 抛出错误

我刚刚从支持 MySQL 的源代码(18.04)安装了 ejabberd,并分别更改了配置文件。基本上一切正常:ejabberd 启动,我可以注册用户,用户可以连接和发送消息。我还看到数据库中的所有用户,所以我认为设置到目前为止是正确的。

现在我想使用 modmod_mam来存档所有消息。为此,我在ejabberd.yaml文件中添加了以下几行:

但是,当我发送脱机消息时,我收到以下错误 - 实际上,两个函数同时使用脱机消息挂钩的两个类似错误:

使用较旧的安装(17.01)一切正常。但我不知道是否需要额外的 MySQL 表。当我查看当前数据库时,实际上所有消息(包括离线消息)都存储在 table 中archive

0 投票
1 回答
319 浏览

ejabberd - Ejabberd 18.04 - 自定义模块 - 从数据包中读取自定义消息字段

我正在尝试实现一个自定义模块来将所有消息记录到 webhook。我找到了一个很好的参考,https://github.com/PH-F/mod_offline_http_post/blob/master/src/mod_offline_http_post.erl

我在消息节中有一些自定义标签,我也想将它传递给 webhook。

但我不知道如何读取自定义字段。请帮助并告诉我应该使用哪个 API 来读取“额外”标签中的文本,如下所示。

提前致谢。

Ejabber 服务器是最新的v18.04

消息的 Xml 格式:

我从 Ejabberd 日志中得到的数据包格式:

0 投票
1 回答
234 浏览

ejabberd - Ejabberd 17:如何创建一个调用离线消息的钩子?

我想创建一个挂钩,每当创建离线消息时都会调用它。示例:user-a(online) 向 user-b(offline) 发送消息。然后根据 ejabberd,消息在用户 b 上线时被存储和发送。但在这种情况下,我想用数据调用本地服务器 POST URL。如何创建这样的钩子?

创建这个钩子是为了让我可以从本地服务器发送推送通知。因此,每当用户上线时,他/她都会收到离线消息作为推送通知。

对此没有分步实施。如果有人知道这将是很大的帮助。

0 投票
1 回答
286 浏览

ejabberd - Is there any way to delete single message from ejabberd archive

I am using ejabberd for my chat app, I want to add delete single message feature. Is there any way in ejabberd 18.03

0 投票
1 回答
30 浏览

ejabberd - 禁止帐户的 Ejabberd 钩子

当用户被禁止并被迫离开聊天室时,我们对 muc_filter_presence 的钩子不会收到呼叫。这是预期的吗?如果是这样,我们可以使用其他钩子来“禁止用户”回调吗?我们正在使用 ejabberd 18.04。

0 投票
2 回答
115 浏览

android - Timer:apply_interval/4 当用户离线并在 ejabberd 中再次返回时停止

我在 linux 机器上使用源代码中的 ejabberd-17.03。

我使用用户 A 的 jid 从服务器以编程方式创建了一个临时聊天室,并向用户 B 发送直接邀请,他接受并加入聊天室。

我的用例是两个用户 A 和 B 在聊天室交换消息。如果在 30 秒内没有用户向其他用户发送任何消息,则房间会向这两个用户发送随机选择的消息。

我已经实现了如下:

现在一切正常,除了以下情况:

1.Chatroom 已创建,A 和 B 之间开始交换消息,此时计时器也开始。

  1. 如果创建聊天室的用户在时间 T 下线(通过最小化应用程序并从 android 设备中杀死它)并重新上线,则计时器停止,如计划在 30 秒结束时调用的函数一样't 被调用。(此处重新联机突出显示,因为如果用户未联机,则计时器按预期工作,只有当用户再次联机时,计时器停止并且不生成日志)。

    但是,如果在线用户现在在 T 点发送任何消息,那么随机选择消息并将它们发送给客户端的整个周期性操作会再次很好地开始并很好地结束。

    但是如果在线用户在这个时间点 T 没有发送任何消息,那么调度的计时器永远不会被调用,用户将继续等待。

  2. 如果被邀请加入聊天室的用户在时间 T2 下线(比如 2 中的方式)并再次上线,则计时器保持活动状态并按预期工作。

因此,我将 ejabberd 的日志记录级别更改为 5,并看到离线消息未传递给离线和再次在线用户。即使在 ejabberd.yml 中启用了 mod_offline。

日志 :

ejabberd.yml

虽然我不需要完美地传递这些离线消息,但我倾向于认为这是否可能是停止我的计时器的原因(但我不明白为什么它只在创建的用户时停止房间下线然后又回来了,当其他用户这样做时为什么不呢?)。

为什么这个计时器会停止,我怎样才能让它定期运行?

0 投票
1 回答
333 浏览

erlang - 用erlang解析ejabberd数据包

我正在使用 ejabberd18.09 进行 IM 应用程序。该应用程序几乎没有需要向 ejabberd(xmpp) 消息添加扩展的功能。

我在 offline_message_hook 上创建了一个自定义模块来捕获离线消息并将它们发送到我自己的 url 以进行进一步处理。

发送到 ejabberd 的消息有不同的情况,具体取决于消息的类型,如下所示

如果我要发送照片,消息将如下所示

发送文本时

发送位置时

我使用 .erl 代码读取正文和消息 ID,如下所示

我想要的是如何(在 erlang 中)读取mtype标记的属性,在(媒体、位置、测试)值上创建一个 switch 语句,以便我可以分别处理每条消息?

0 投票
0 回答
282 浏览

erlang - 处理自定义 iq 节的模块不适用于 ejabberd-18.09

我正在尝试从 ejabberd-17.03 迁移到 ejabberd-18.09。我有这个模块,以便我可以将自定义 iq 节发送到 ejabberd。

该模块适用于ejabberd-17.03。但是当我将它与 ejabberd-18.09 一起使用时,我收到以下错误:

我已按照这些步骤注册自定义 iq https://github.com/processone/xmpp/issues/9但仍然没有运气。这是我在 xmpp/specs/xmpp_codec.spec 文件中添加的元素

我是否遗漏了什么,或者在 ejabberd-18.09 中应该做的方式有什么变化?