Builtin ConverseJS:
* Building with webpack. TODO: include assets. * Page template
This commit is contained in:
parent
fbfb38392d
commit
d9e461f984
@ -27,7 +27,10 @@ function register ({ registerHook, peertubeHelpers }) {
|
|||||||
|
|
||||||
function getBaseRoute () {
|
function getBaseRoute () {
|
||||||
// FIXME: should be provided by PeertubeHelpers (does not exists for now)
|
// FIXME: should be provided by PeertubeHelpers (does not exists for now)
|
||||||
return '/plugins/livechat/router'
|
// We are guessing the route with the correct plugin version with this trick:
|
||||||
|
const staticBase = peertubeHelpers.getBaseStaticRoute()
|
||||||
|
// we can't use '/plugins/livechat/router', because the loaded html page needs correct relative paths.
|
||||||
|
return staticBase.replace(/\/static.*$/, '/router')
|
||||||
}
|
}
|
||||||
|
|
||||||
function getIframeUri (uuid) {
|
function getIframeUri (uuid) {
|
||||||
@ -38,7 +41,7 @@ function register ({ registerHook, peertubeHelpers }) {
|
|||||||
let iframeUri = ''
|
let iframeUri = ''
|
||||||
if (!settings['chat-use-builtin']) {
|
if (!settings['chat-use-builtin']) {
|
||||||
iframeUri = settings['chat-uri'] || ''
|
iframeUri = settings['chat-uri'] || ''
|
||||||
iframeUri = iframeUri.replace('{{VIDEO_UUID}}', uuid)
|
iframeUri = iframeUri.replace(/{{VIDEO_UUID}}/g, uuid)
|
||||||
if (!/^https?:\/\//.test(iframeUri)) {
|
if (!/^https?:\/\//.test(iframeUri)) {
|
||||||
logger.error('The webchaturi must begin with https://')
|
logger.error('The webchaturi must begin with https://')
|
||||||
return null
|
return null
|
||||||
|
41
conversejs/conversejs.js
Normal file
41
conversejs/conversejs.js
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
require('converse.js')
|
||||||
|
|
||||||
|
window.initConverse = function initConverse ({
|
||||||
|
baseStaticUrl,
|
||||||
|
room,
|
||||||
|
boshServiceUrl
|
||||||
|
}) {
|
||||||
|
window.converse.initialize({
|
||||||
|
assets_path: baseStaticUrl,
|
||||||
|
|
||||||
|
authentication: 'anonymous',
|
||||||
|
auto_login: true,
|
||||||
|
auto_join_rooms: [
|
||||||
|
room
|
||||||
|
],
|
||||||
|
bosh_service_url: boshServiceUrl,
|
||||||
|
jid: 'peertube.im.your_domain',
|
||||||
|
notify_all_room_messages: [
|
||||||
|
room
|
||||||
|
],
|
||||||
|
singleton: true,
|
||||||
|
auto_focus: false,
|
||||||
|
hide_muc_participants: false,
|
||||||
|
keepalive: true,
|
||||||
|
play_sounds: false,
|
||||||
|
muc_mention_autocomplete_min_chars: 3,
|
||||||
|
muc_mention_autocomplete_filter: 'contains',
|
||||||
|
modtools_disable_assign: true,
|
||||||
|
muc_disable_slash_commands: [
|
||||||
|
'admin', 'ban', 'clear', 'deop', 'destroy', 'kick',
|
||||||
|
'member', 'modtools', 'mute', 'op', 'owner', 'register',
|
||||||
|
'revoke', 'subject', 'topic', 'voice'
|
||||||
|
],
|
||||||
|
muc_instant_rooms: true,
|
||||||
|
show_client_info: false,
|
||||||
|
allow_adhoc_commands: false,
|
||||||
|
allow_contact_requests: false,
|
||||||
|
show_controlbox_by_default: false,
|
||||||
|
view_mode: 'fullscreen'
|
||||||
|
})
|
||||||
|
}
|
26
conversejs/index.html
Normal file
26
conversejs/index.html
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="no-js">
|
||||||
|
<head>
|
||||||
|
<title>Converse</title>
|
||||||
|
<meta charset="utf-8"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||||
|
<meta name="description" content="Converse XMPP/Jabber Chat"/>
|
||||||
|
<script src="{{BASE_STATIC_URL}}/conversejs.js"></script>
|
||||||
|
<style type="text/css">
|
||||||
|
#conversejs .chat-head {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body class="converse-fullscreen">
|
||||||
|
<noscript>You need to enable JavaScript to run the Converse.js chat app.</noscript>
|
||||||
|
<div id="conversejs-bg"></div>
|
||||||
|
<script>
|
||||||
|
initConverse({
|
||||||
|
baseStaticUrl : '{{BASE_STATIC_URL}}',
|
||||||
|
room: '{{ROOM}}',
|
||||||
|
boshServiceUrl: '{{BOSH_SERVICE_URL}}'
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
40
main.js
40
main.js
@ -1,7 +1,10 @@
|
|||||||
|
const path = require('path')
|
||||||
|
const fs = require('fs').promises
|
||||||
|
|
||||||
async function register ({
|
async function register ({
|
||||||
_registerHook,
|
_registerHook,
|
||||||
registerSetting,
|
registerSetting,
|
||||||
_settingsManager,
|
settingsManager,
|
||||||
_storageManager,
|
_storageManager,
|
||||||
_videoCategoryManager,
|
_videoCategoryManager,
|
||||||
_videoLicenceManager,
|
_videoLicenceManager,
|
||||||
@ -53,11 +56,20 @@ async function register ({
|
|||||||
descriptionHTML: 'If checked, use a builtin ConverseJS iframe.<br>' +
|
descriptionHTML: 'If checked, use a builtin ConverseJS iframe.<br>' +
|
||||||
'You still have to configure an external XMPP service. Please see the documentation.'
|
'You still have to configure an external XMPP service. Please see the documentation.'
|
||||||
})
|
})
|
||||||
|
registerSetting({
|
||||||
|
name: 'chat-room-server',
|
||||||
|
label: 'Builtin webchat: XMPP room service server',
|
||||||
|
type: 'input',
|
||||||
|
default: '',
|
||||||
|
descriptionHTML: 'When using the built-in converseJS webchat:<br>' +
|
||||||
|
'Your XMPP room server. Example : room.peertube.im.your_domain.',
|
||||||
|
private: true
|
||||||
|
})
|
||||||
registerSetting({
|
registerSetting({
|
||||||
name: 'chat-bosh-uri',
|
name: 'chat-bosh-uri',
|
||||||
label: 'Builtin webchat: BOSH uri',
|
label: 'Builtin webchat: BOSH uri',
|
||||||
type: 'input',
|
type: 'input',
|
||||||
default: true,
|
default: '',
|
||||||
descriptionHTML: 'When using the built-in converseJS webchat:<br>' +
|
descriptionHTML: 'When using the built-in converseJS webchat:<br>' +
|
||||||
'URI of the external BOSH server. Please make sure it accept cross origin request from your domain.',
|
'URI of the external BOSH server. Please make sure it accept cross origin request from your domain.',
|
||||||
private: true
|
private: true
|
||||||
@ -86,10 +98,23 @@ async function register ({
|
|||||||
private: false
|
private: false
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const converseJSIndex = await fs.readFile(path.resolve(__dirname, './conversejs/index.html'))
|
||||||
|
|
||||||
const router = getRouter()
|
const router = getRouter()
|
||||||
router.get('/ping', (req, res) => res.json({ message: 'pong' }))
|
router.get('/ping', (req, res) => res.json({ message: 'pong' }))
|
||||||
router.get('/webchat', async (req, res, next) => {
|
router.get('/webchat', async (req, res, next) => {
|
||||||
try {
|
try {
|
||||||
|
const settings = await settingsManager.getSettings([
|
||||||
|
'chat-use-builtin', 'chat-room-server', 'chat-bosh-uri'
|
||||||
|
])
|
||||||
|
|
||||||
|
if (!settings['chat-use-builtin']) {
|
||||||
|
throw new Error('Builtin chat disabled.')
|
||||||
|
}
|
||||||
|
if (!settings['chat-room-server']) {
|
||||||
|
throw new Error('Missing chat-room-server settings.')
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME: with Peertube 3.0.1 the following method is not available...
|
// FIXME: with Peertube 3.0.1 the following method is not available...
|
||||||
// When loadByIdOrUUID is available, change the entry point to
|
// When loadByIdOrUUID is available, change the entry point to
|
||||||
// be /webchat/:videoId
|
// be /webchat/:videoId
|
||||||
@ -109,7 +134,16 @@ async function register ({
|
|||||||
if (!video) {
|
if (!video) {
|
||||||
throw new Error('Video not found')
|
throw new Error('Video not found')
|
||||||
}
|
}
|
||||||
res.send('ok')
|
|
||||||
|
let page = '' + converseJSIndex
|
||||||
|
// FIXME: Peertube should provide the static folder path. For now:
|
||||||
|
const staticRelative = '../static/conversejs'
|
||||||
|
page = page.replace(/{{BASE_STATIC_URL}}/g, staticRelative)
|
||||||
|
page = page.replace(/{{ROOM}}/g, 'public_' + video.uuid + '@' + settings['chat-room-server'])
|
||||||
|
page = page.replace(/{{BOSH_SERVICE_URL}}/g, settings['chat-bosh-uri'])
|
||||||
|
|
||||||
|
res.status(200)
|
||||||
|
res.send(page)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return next(error)
|
return next(error)
|
||||||
}
|
}
|
||||||
|
8
package-lock.json
generated
8
package-lock.json
generated
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "peertube-plugin-livechat",
|
"name": "peertube-plugin-livechat",
|
||||||
"version": "0.0.5",
|
"version": "0.0.8",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -995,6 +995,12 @@
|
|||||||
"integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
|
"integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"converse.js": {
|
||||||
|
"version": "7.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/converse.js/-/converse.js-7.0.4.tgz",
|
||||||
|
"integrity": "sha512-U07RJB71nG88IRlfhlcxOlJAnH4pVNH1H8jF39OANxZbqSikOX3qJO3e3fV0Tem0I9oNgDqkRW60pI22zjeP0w==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"copy-concurrently": {
|
"copy-concurrently": {
|
||||||
"version": "1.0.5",
|
"version": "1.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "peertube-plugin-livechat",
|
"name": "peertube-plugin-livechat",
|
||||||
"description": "PeerTube plugin livechat",
|
"description": "PeerTube plugin livechat",
|
||||||
"version": "0.0.8",
|
"version": "0.1.0",
|
||||||
"author": "John Livingston",
|
"author": "John Livingston",
|
||||||
"bugs": "https://github.com/JohnXLivingston/peertube-plugin-livechat/issues",
|
"bugs": "https://github.com/JohnXLivingston/peertube-plugin-livechat/issues",
|
||||||
"clientScripts": [
|
"clientScripts": [
|
||||||
@ -23,6 +23,7 @@
|
|||||||
],
|
],
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@purtuga/esm-webpack-plugin": "^1.1.1",
|
"@purtuga/esm-webpack-plugin": "^1.1.1",
|
||||||
|
"converse.js": "^7.0.4",
|
||||||
"eslint": "^7.20.0",
|
"eslint": "^7.20.0",
|
||||||
"eslint-config-standard": "^16.0.2",
|
"eslint-config-standard": "^16.0.2",
|
||||||
"eslint-plugin-import": "^2.22.1",
|
"eslint-plugin-import": "^2.22.1",
|
||||||
@ -45,7 +46,9 @@
|
|||||||
"build": "webpack --mode=production",
|
"build": "webpack --mode=production",
|
||||||
"lint": "npx eslint --ext .js ."
|
"lint": "npx eslint --ext .js ."
|
||||||
},
|
},
|
||||||
"staticDirs": {},
|
"staticDirs": {
|
||||||
|
"conversejs": "dist/conversejs"
|
||||||
|
},
|
||||||
"translations": {
|
"translations": {
|
||||||
"fr-FR": "./languages/fr.json"
|
"fr-FR": "./languages/fr.json"
|
||||||
}
|
}
|
||||||
|
@ -18,4 +18,12 @@ let config = clientFiles.map(f => ({
|
|||||||
plugins: [ new EsmWebpackPlugin() ]
|
plugins: [ new EsmWebpackPlugin() ]
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
config.push({
|
||||||
|
entry: "./conversejs/conversejs.js",
|
||||||
|
output: {
|
||||||
|
path: path.resolve(__dirname, "./dist/conversejs"),
|
||||||
|
filename: "./conversejs.js"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
module.exports = config
|
module.exports = config
|
||||||
|
Loading…
Reference in New Issue
Block a user