ejabberd模块开发
参考:
https://docs.ejabberd.im/developer/modules/
运行
ejabberdctl modules_update_specs
会创建 C:.ejabberd-modulessource, 其中下载了
https://github.com/processone/ejabberd-contrib
可以同样在sources目录下创建自己的模块代码,如:
$HOME/.ejabberd-modules/sources/mod_mysupermodule/
运行
ejabberdctl module_check mod_mysupermodule
可检查该目录是否符合模块规定(policy), 如:
C:Program Filesejabberd-16.08bin>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 Filesejabberd-16.08bin>ejabberdctl modules_available
...
mod_mysupermodule My super m
...
即使没有任何源文件,也可以module_install.
C:Program Filesejabberd-16.08bin>ejabberdctl module_install mod_mysupermodule
ok
更改 srcmod_mysupermodule.erl 后,无法再次安装:
C:Program Filesejabberd-16.08bin>ejabberdctl module_install mod_mysupermodule
Error: conflict
好像可以用 module_upgrade:
C:Program Filesejabberd-16.08bin>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 Filesejabberd-16.08bin>
按文档说明,需要手工修改
C:UsersjinqingAppDataRoamingejabberdconfejabberd.yml
实际测试配置不需要手工修改,只需要创建
C:.ejabberd-modulessourcesmod_mysupermoduleconfmod_mysupermodule.yml
modules:
mod_mysupermodule: {}
按文件说明,需要手工复制编译生成的
C:.ejabberd-modulesmod_mysupermodule
到
C:Program Filesejabberd-16.08libmod_mysupermodule
查看代码,应该是会自动添加代码目录
C:.ejabberd-modulesmod_mysupermoduleebin
实际发现
2016-08-24 16:27:54.016 [critical] @gen_mod:start_module:162 Problem starting the module mod_mysupermodule for host >
options: []
error: undef
[{mod_mysupermodule,start,[>,[]],[]},
{gen_mod,start_module,3,[{file,"src/gen_mod.erl"},{line,154}]},
{lists,foreach,2,[{file,"lists.erl"},{line,1337}]},
{ejabberd_app,start,2,[{file,"src/ejabberd_app.erl"},{line,76}]},
{application_master,start_it_old,4,
[{file,"application_master.erl"},{line,273}]}]
2016-08-24 16:27:54.016 [critical] @gen_mod:maybe_halt_ejabberd:170 ejabberd initialization was aborted because a module start failed.
是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 Filesejabberd-16.08bin>ejabberdctl restart
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
在android中camera捕捉相片后 相片的存放是手机程序执行的他会自己捕捉与存取并放到一个权限比较低的地方,当你想把这个存放到你这个应用程序中时他是没有权限的,因此必须通过复制自带程序存放的图片到自己的应用程序中。 private void saveFu…