(译) Ejabberd加入了Elixir的变革

Ejabberd加入了Elixir的变革

原文:

https://blog.process-one.net/ejabberd-joins-the-elixir-revolution/

前提条件

安装Erlang R17

克隆Ejabberd源码添加Elixir支持.

1
git clone git@github.com:processone/ejabberd.git
cd ejabberd
chmod +x autogen.sh
./autogen.sh
./configure --prefix=$HOME/my-ejabberd --enable-elixir
make && make install
1
cd $HOME/my-ejabberd/
./sbin/ejabberdctl live

(ejabberd@localhost)1> m('Elixir.Enum').
Module 'Elixir.Enum' compiled: Date: January 24 2015, Time: 16.27
Compiler options:  [debug_info]
Object file: /Users/mremond/my-ejabberd/lib/ejabberd/ebin/Elixir.Enum.beam
...

用Elixir编写ejabberd插件

现在可以用Elixir来编写插件, 并注册钩子扩展ejabberd的功能.

*.ex插件文件放到ejabberd的lib目录中, 让编译链知道如何编译它们.

在ejabberd的lib/目录中,添加如下文件mod_presence_demo.ex:

1
2
3
4
5
6
7
8
9
defmodule ModPresenceDemo do
@behaviour :gen_mod
def start(_host, _opts) do
:ok
end
def stop(_host) do
:ok
end
end

这是一个最小的ejabberd模块, 为了演示, 我们现在忽略hostoptions.

当你在Shell中敲入make, 模块应该能够正确的构建. 当执行make install时, 它会被安装到正确的位置.

现在可以在ejabberd配置文件ejabberd.yml中添加模块配置了, 向下面这样:

1
modules:
...
  ModPresenceDemo: {}

你可以直接使用模块的名称, Ejabberd会检测到这是一个Elixir模块,并能够正确的使用它.

下面来扩展一下这个模块的功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
defmodule ModPresenceDemo do
import Ejabberd.Logger # this allow using info, error, etc for logging
@behaviour :gen_mod
def start(host, _opts) do
info('Starting ejabberd module Presence Demo')
Ejabberd.Hooks.add(:set_presence_hook, host, __ENV__.module, :on_presence, 50)
:ok
end
def stop(host) do
info('Stopping ejabberd module Presence Demo')
Ejabberd.Hooks.delete(:set_presence_hook, host, __ENV__.module, :on_presence, 50)
:ok
end
def on_presence(user, _server, _resource, _packet) do
info('Receive presence for #{user}')
:none
end
end

当启动ejabberd的时候, 应该能够在日志中看到如下输出:

1
15:17:58.913 [info] Starting ejabberd module Presence Demo test

And anytime an XMPP client changes its presence, you should see the following in the log file:

任何时候, 如果客户端改变其在线状态(presence), 你可以看到如下输出:

1
15:30:01.266 [info] Receive presence for test

参考资料

  1. https://blog.process-one.net/elixir-sips-ejabberd-with-elixir-part-1

修订

  • 2015-03-18
    • 添加参考Elixir Sips的视频讲解连接