mirror of
https://github.com/processone/ejabberd.git
synced 2025-01-03 18:02:28 +01:00
Add mod_conversejs
This commit is contained in:
parent
15d3ebb842
commit
89ad8a5502
148
src/mod_conversejs.erl
Normal file
148
src/mod_conversejs.erl
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
%%%----------------------------------------------------------------------
|
||||||
|
%%% File : mod_conversejs.erl
|
||||||
|
%%% Author : Alexey Shchepin <alexey@process-one.net>
|
||||||
|
%%% Purpose : Implements REST API for ejabberd using JSON data
|
||||||
|
%%% Created : 8 Nov 2021 by Alexey Shchepin <alexey@process-one.net>
|
||||||
|
%%%
|
||||||
|
%%%
|
||||||
|
%%% ejabberd, Copyright (C) 2002-2021 ProcessOne
|
||||||
|
%%%
|
||||||
|
%%% This program is free software; you can redistribute it and/or
|
||||||
|
%%% modify it under the terms of the GNU General Public License as
|
||||||
|
%%% published by the Free Software Foundation; either version 2 of the
|
||||||
|
%%% License, or (at your option) any later version.
|
||||||
|
%%%
|
||||||
|
%%% This program is distributed in the hope that it will be useful,
|
||||||
|
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
%%% General Public License for more details.
|
||||||
|
%%%
|
||||||
|
%%% You should have received a copy of the GNU General Public License along
|
||||||
|
%%% with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
%%%
|
||||||
|
%%%----------------------------------------------------------------------
|
||||||
|
|
||||||
|
-module(mod_conversejs).
|
||||||
|
|
||||||
|
-author('alexey@process-one.net').
|
||||||
|
|
||||||
|
-behaviour(gen_mod).
|
||||||
|
|
||||||
|
-export([start/2, stop/1, reload/3, process/2, depends/2,
|
||||||
|
mod_opt_type/1, mod_options/1, mod_doc/0]).
|
||||||
|
|
||||||
|
-include_lib("xmpp/include/xmpp.hrl").
|
||||||
|
-include("logger.hrl").
|
||||||
|
-include("ejabberd_http.hrl").
|
||||||
|
-include("translate.hrl").
|
||||||
|
-include("ejabberd_web_admin.hrl").
|
||||||
|
|
||||||
|
start(_Host, _Opts) ->
|
||||||
|
ok.
|
||||||
|
|
||||||
|
stop(_Host) ->
|
||||||
|
ok.
|
||||||
|
|
||||||
|
reload(_Host, _NewOpts, _OldOpts) ->
|
||||||
|
ok.
|
||||||
|
|
||||||
|
depends(_Host, _Opts) ->
|
||||||
|
[].
|
||||||
|
|
||||||
|
process([], #request{method = 'GET'}) ->
|
||||||
|
Host = ejabberd_config:get_myname(),
|
||||||
|
Domain = gen_mod:get_module_opt(Host, ?MODULE, default_domain),
|
||||||
|
Script = gen_mod:get_module_opt(Host, ?MODULE, conversejs_script),
|
||||||
|
CSS = gen_mod:get_module_opt(Host, ?MODULE, conversejs_css),
|
||||||
|
Init = [{<<"discover_connection_methods">>, false},
|
||||||
|
{<<"jid">>, Domain},
|
||||||
|
{<<"default_domain">>, Domain},
|
||||||
|
{<<"domain_placeholder">>, Domain},
|
||||||
|
{<<"view_mode">>, <<"fullscreen">>}],
|
||||||
|
Init2 =
|
||||||
|
case gen_mod:get_module_opt(Host, ?MODULE, websocket_url) of
|
||||||
|
undefined -> Init;
|
||||||
|
WSURL -> [{<<"websocket_url">>, WSURL} | Init]
|
||||||
|
end,
|
||||||
|
Init3 =
|
||||||
|
case gen_mod:get_module_opt(Host, ?MODULE, bosh_service_url) of
|
||||||
|
undefined -> Init2;
|
||||||
|
BoshURL -> [{<<"bosh_service_url">>, BoshURL} | Init2]
|
||||||
|
end,
|
||||||
|
{200, [html],
|
||||||
|
[<<"<!DOCTYPE html>">>,
|
||||||
|
<<"<html>">>,
|
||||||
|
<<"<head>">>,
|
||||||
|
<<"<meta charset='utf-8'>">>,
|
||||||
|
<<"<link rel='stylesheet' type='text/css' media='screen' href='">>,
|
||||||
|
fxml:crypt(CSS), <<"'>">>,
|
||||||
|
<<"<script src='">>, fxml:crypt(Script), <<"' charset='utf-8'></script>">>,
|
||||||
|
<<"</head>">>,
|
||||||
|
<<"<body>">>,
|
||||||
|
<<"<script>">>,
|
||||||
|
<<"converse.initialize(">>, jiffy:encode({Init3}), <<");">>,
|
||||||
|
<<"</script>">>,
|
||||||
|
<<"</body>">>,
|
||||||
|
<<"</html>">>]};
|
||||||
|
process(_, _) ->
|
||||||
|
ejabberd_web:error(not_found).
|
||||||
|
|
||||||
|
mod_opt_type(bosh_service_url) ->
|
||||||
|
econf:either(undefined, econf:binary());
|
||||||
|
mod_opt_type(websocket_url) ->
|
||||||
|
econf:either(undefined, econf:binary());
|
||||||
|
mod_opt_type(conversejs_script) ->
|
||||||
|
econf:binary();
|
||||||
|
mod_opt_type(conversejs_css) ->
|
||||||
|
econf:binary();
|
||||||
|
mod_opt_type(default_domain) ->
|
||||||
|
econf:binary().
|
||||||
|
|
||||||
|
mod_options(_) ->
|
||||||
|
[{bosh_service_url, undefined},
|
||||||
|
{websocket_url, undefined},
|
||||||
|
{default_domain, ejabberd_config:get_myname()},
|
||||||
|
{conversejs_script, <<"https://cdn.conversejs.org/8.0.1/dist/converse.min.js">>},
|
||||||
|
{conversejs_css, <<"https://cdn.conversejs.org/8.0.1/dist/converse.min.css">>}].
|
||||||
|
|
||||||
|
mod_doc() ->
|
||||||
|
#{desc =>
|
||||||
|
[?T("This module serves a simple Converse.js page."), "",
|
||||||
|
?T("To use this module, in addition to adding it to the 'modules' "
|
||||||
|
"section, you must also enable it in 'listen' -> 'ejabberd_http' -> "
|
||||||
|
"http://../listen-options/#request-handlers[request_handlers].")],
|
||||||
|
example =>
|
||||||
|
["listen:",
|
||||||
|
" -",
|
||||||
|
" port: 5280",
|
||||||
|
" module: ejabberd_http",
|
||||||
|
" request_handlers:",
|
||||||
|
" \"/websocket\": ejabberd_http_ws"
|
||||||
|
" \"/conversejs\": mod_conversejs",
|
||||||
|
"",
|
||||||
|
"modules:",
|
||||||
|
" mod_conversejs:",
|
||||||
|
" websocket_url: \"ws://example.org:5280/websocket\""],
|
||||||
|
opts =>
|
||||||
|
[{websocket_url,
|
||||||
|
#{value => ?T("WebsocketURL"),
|
||||||
|
desc =>
|
||||||
|
?T("A websocket URL to which Converse.js can connect to.")}},
|
||||||
|
{bosh_service_url,
|
||||||
|
#{value => ?T("BoshURL"),
|
||||||
|
desc =>
|
||||||
|
?T("BOSH service URL to which Converse.js can connect to.")}},
|
||||||
|
{default_domain,
|
||||||
|
#{value => ?T("Domain"),
|
||||||
|
desc =>
|
||||||
|
?T("Specify a domain to act as the default for user JIDs.")}},
|
||||||
|
{conversejs_script,
|
||||||
|
#{value => ?T("URL"),
|
||||||
|
desc =>
|
||||||
|
?T("Converse.js main script URL.")}},
|
||||||
|
{conversejs_css,
|
||||||
|
#{value => ?T("URL"),
|
||||||
|
desc =>
|
||||||
|
?T("Converse.js CSS URL.")}}]
|
||||||
|
}.
|
Loading…
Reference in New Issue
Block a user