IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    ejabberd模块开发

    金庆发表于 2016-08-25 04:17:00
    love 0
    ejabberd模块开发

    (金庆的专栏 2016.8)

    参考:
    https://docs.ejabberd.im/developer/modules/

    运行
    ejabberdctl modules_update_specs
    会创建 C:\.ejabberd-modules\source\, 其中下载了
    https://github.com/processone/ejabberd-contrib

    可以同样在sources目录下创建自己的模块代码,如:
    $HOME/.ejabberd-modules/sources/mod_mysupermodule/

    运行
    ejabberdctl module_check mod_mysupermodule
    可检查该目录是否符合模块规定(policy), 如:
    C:\Program Files\ejabberd-16.08\bin>ejabberdctl module_check mod_mysupermodule
    Error: [{missing,"COPYING"},
            {missing,"README.txt"},
            {missing,"src (Erlang) or lib (Elixir) sources directory"},
            {missing_meta,url},
            {missing_meta,home},
            {missing_meta,summary},
            {missing_meta,author}]


    需要COPYING和README.txt文件,src目录。
    还有 mod_mysupermodule.spec 文件,仿照其他模块的例子写就行了,例如:
    url: "http://localhost"
    summary: "My super m"
    home: "http://localhost"
    author: "Jin Qing"


    可以查看到可用模块:
    C:\Program Files\ejabberd-16.08\bin>ejabberdctl modules_available
    ...
    mod_mysupermodule       My super m
    ...


    即使没有任何源文件,也可以module_install.
    C:\Program Files\ejabberd-16.08\bin>ejabberdctl module_install mod_mysupermodule

    ok


    更改 src\mod_mysupermodule.erl 后,无法再次安装:
    C:\Program Files\ejabberd-16.08\bin>ejabberdctl module_install mod_mysupermodule

    Error: conflict


    好像可以用 module_upgrade:
    C:\Program Files\ejabberd-16.08\bin>ejabberdctl module_upgrade mod_mysupermodule

    src/mod_mysupermodule.erl:4: Warning: undefined callback function depends/2 (beh
    aviour 'gen_mod')
    src/mod_mysupermodule.erl:4: Warning: undefined callback function mod_opt_type/1
     (behaviour 'gen_mod')
    ok

    C:\Program Files\ejabberd-16.08\bin>


    按文档说明,需要手工修改
    C:\Users\jinqing\AppData\Roaming\ejabberd\conf\ejabberd.yml
    实际测试配置不需要手工修改,只需要创建
    C:\.ejabberd-modules\sources\mod_mysupermodule\conf\mod_mysupermodule.yml

    modules:
      mod_mysupermodule: {}

    按文件说明,需要手工复制编译生成的
    C:\.ejabberd-modules\mod_mysupermodule
    到
    C:\Program Files\ejabberd-16.08\lib\mod_mysupermodule
     
    查看代码,应该是会自动添加代码目录
    C:\.ejabberd-modules\mod_mysupermodule\ebin

    实际发现
    [critical] <0.550.0>@gen_mod:start_module:162 Problem starting the module mod_mysupermodule for host <<"zt-2203857">>
     options: []
     error: undef
    [{mod_mysupermodule,start,[<<"zt-2203857">>,[]],[]},

    是Windows下还有问题。

    需如下更改ext_mod.erl:
    modules_dir() ->
        DefaultDir = filename:join(getenv("HOME"), ".ejabberd-modules"),
    -   getenv("CONTRIB_MODULES_PATH", DefaultDir).
    +   getenv("CONTRIB_MODULES_PATH", filename:absname(DefaultDir)).


    不然add_patha/1会失败:
    code:add_patha("/.ejabberd-modules/mod_mysupermodule/ebin").

    然后重启(可能不需要):
    C:\Program Files\ejabberd-16.08\bin>ejabberdctl restart


    金庆 2016-08-25 12:17 发表评论


沪ICP备19023445号-2号
友情链接