updated federation + templates
This commit is contained in:
parent
7cd6df24c7
commit
920d695720
25 changed files with 250 additions and 142 deletions
|
|
@ -39,6 +39,7 @@ app = require("soakbean") {
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
app.set('app.opts', app.opts)
|
||||||
return p
|
return p
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
|
|
@ -53,6 +54,7 @@ app.init = function() end
|
||||||
app.opts = require('config')(app)
|
app.opts = require('config')(app)
|
||||||
|
|
||||||
-- load system plugins (in specific order for admin panel)
|
-- load system plugins (in specific order for admin panel)
|
||||||
|
app.plugin.global = app.addPlugin('plugin/global')
|
||||||
app.plugin.diskscan = app.addPlugin('plugin/diskscan')
|
app.plugin.diskscan = app.addPlugin('plugin/diskscan')
|
||||||
app.plugin.moderation = app.addPlugin('plugin/moderation')
|
app.plugin.moderation = app.addPlugin('plugin/moderation')
|
||||||
app.plugin.xrfragments = app.addPlugin('plugin/xrfragments')
|
app.plugin.xrfragments = app.addPlugin('plugin/xrfragments')
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,6 @@ return function(app)
|
||||||
local config = { -- default
|
local config = { -- default
|
||||||
name = "XRForge",
|
name = "XRForge",
|
||||||
baseurl="/",
|
baseurl="/",
|
||||||
title="your.xr.forge",
|
|
||||||
subtitle="Portable XR experiences for Phone, VRheadset & desktop.",
|
|
||||||
admin_title = "xrforge admin panel",
|
admin_title = "xrforge admin panel",
|
||||||
admin_subtitle = "Manage your XR experiences here",
|
admin_subtitle = "Manage your XR experiences here",
|
||||||
}
|
}
|
||||||
|
|
@ -30,25 +28,12 @@ return function(app)
|
||||||
app.opts = v
|
app.opts = v
|
||||||
app.opts.updated = os.time()
|
app.opts.updated = os.time()
|
||||||
local newconfig = [[
|
local newconfig = [[
|
||||||
|
|
||||||
-- TIP: run 'xrforge.com createplugin' to start writing plugins
|
-- TIP: run 'xrforge.com createplugin' to start writing plugins
|
||||||
|
|
||||||
app.on('init', function()
|
|
||||||
print('config loaded')
|
|
||||||
|
|
||||||
local scan = app.scan
|
|
||||||
app.scan = function()
|
|
||||||
os.execute("echo scan before-hook")
|
|
||||||
scan()
|
|
||||||
os.execute("echo scan after-hook")
|
|
||||||
end
|
|
||||||
|
|
||||||
end)
|
|
||||||
|
|
||||||
]] .. "\n\nreturn " .. util.dump(app.opts)
|
]] .. "\n\nreturn " .. util.dump(app.opts)
|
||||||
newconfig = newconfig:gsub("^}$"," init = function() print('xrforge.lua config loaded') end\n}")
|
newconfig = newconfig:gsub("^}$"," init = function() print('xrforge.lua config loaded') end\n}")
|
||||||
util.writefile( app.bindir .. configfile, newconfig )
|
util.writefile( app.bindir .. configfile, newconfig )
|
||||||
print("stored xrforge.lua")
|
trace("stored xrforge.lua")
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -97,8 +97,8 @@ util.template = function(content,data)
|
||||||
mdata.title = mdata.title or app.opts.subtitle
|
mdata.title = mdata.title or app.opts.subtitle
|
||||||
mdata.header_include = mdata.header_include or ''
|
mdata.header_include = mdata.header_include or ''
|
||||||
mdata.header = app.tpl( LoadAsset('page/header.html'), mdata )
|
mdata.header = app.tpl( LoadAsset('page/header.html'), mdata )
|
||||||
if not mdata.footer_janusxr then
|
if not mdata.janusxr then
|
||||||
mdata.footer_janusxr = app.tpl( LoadAsset('page/footer.janusxr.html'), mdata )
|
mdata.janusxr = app.tpl( LoadAsset('page/janusxr.html'), mdata )
|
||||||
end
|
end
|
||||||
mdata.footer = app.tpl( LoadAsset('page/footer.html'), mdata )
|
mdata.footer = app.tpl( LoadAsset('page/footer.html'), mdata )
|
||||||
return app.tpl( content, mdata )
|
return app.tpl( content, mdata )
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,7 @@ td,div,p{
|
||||||
/* form elements */
|
/* form elements */
|
||||||
|
|
||||||
input,
|
input,
|
||||||
|
textarea,
|
||||||
select{
|
select{
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
margin: 0px 0px 10px 0px;
|
margin: 0px 0px 10px 0px;
|
||||||
|
|
@ -69,6 +70,9 @@ input,select,textarea{
|
||||||
input[type=checkbox]{
|
input[type=checkbox]{
|
||||||
transform:scale(1.7) translate(3px,4px)
|
transform:scale(1.7) translate(3px,4px)
|
||||||
}
|
}
|
||||||
|
textarea{
|
||||||
|
min-height:150px;
|
||||||
|
}
|
||||||
|
|
||||||
/* buttons */
|
/* buttons */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -54,10 +54,10 @@ body{
|
||||||
font-size:14px;
|
font-size:14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.grid .tile img.icon.list-tree{
|
img.icon.list-tree{
|
||||||
filter: invert(1);
|
filter: invert(1);
|
||||||
}
|
}
|
||||||
.grid .tile img.icon.play{
|
img.icon.play{
|
||||||
filter: invert(1);
|
filter: invert(1);
|
||||||
transform: translate(0,-1px);
|
transform: translate(0,-1px);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
[
|
|
||||||
{"url":"https://xrforge.isvery.ninja", "name":"XRForge", "thumbnail":""},
|
|
||||||
{"url":"https://www.janusxr.org", "name":"JanusXR", "thumbnail":""}
|
|
||||||
]
|
|
||||||
|
|
@ -94,7 +94,7 @@ div#xrecosystem{
|
||||||
<h3>What is it</h3>
|
<h3>What is it</h3>
|
||||||
An open, seamless XR web built from simple URLs and directories, without gatekeepers.<br>
|
An open, seamless XR web built from simple URLs and directories, without gatekeepers.<br>
|
||||||
|
|
||||||
XRForge transforms standard local or remote file directories into interconnected 3D spaces. Users can seamlessly "surf" the spatial web, turning everyday directories into 3D portals.
|
XRForge transforms standard local or remote file directories into interconnected 3D spaces. Users can seamlessly "surf" spatial webs (plural!), turning everyday directories into 3D portals.
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
|
@ -132,8 +132,8 @@ div#xrecosystem{
|
||||||
<h3>Why people want XRForge</h3>
|
<h3>Why people want XRForge</h3>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
In short: scalable <b>spatial wiki's</b> (it uses web URLs) interconnected via <b>3D portals</b>; bringing <b>existing 2D ecosystems into XR.</b><br>
|
In short: scalable <b>spatial blog/wiki's</b> (using plain web URLs) interconnected via <b>3D portals</b>; bringing <b>existing 2D ecosystems into XR.</b><br>
|
||||||
XRForge interconnects XR experiences via portals, thanks to <a href="https://coderofsalvation.github.io/janus-guide/" target="_blank">JanusXR</a> and <a href="https://xrfragment.org" target="_blank">XR Fragments standards</a>.<br>
|
How? Well it's backed by <a href="https://coderofsalvation.github.io/janus-guide/" target="_blank">JanusXR-</a> and <a href="https://xrfragment.org" target="_blank">XR Fragment- URLs</a>.<br>
|
||||||
The metaverse has shown: people <b>like 3D</b> but certain <b>existing</b> 2D ecosystems are king.<br>
|
The metaverse has shown: people <b>like 3D</b> but certain <b>existing</b> 2D ecosystems are king.<br>
|
||||||
They're just more cost-efficient to use.<br>
|
They're just more cost-efficient to use.<br>
|
||||||
Hence, XRForge incorporates the opensource <a href="https://coderofsalvation.github.io/janus-guide/" target="_blank">JanusXR</a>-client called <a href="https://github.com/jbaicoianu/janusweb" target="_blank">JanusWeb</a>, which promotes <b>projecting these ecosystems</b> as virtual <b>hyperlinked</b> worlds (via XR translators).<br>
|
Hence, XRForge incorporates the opensource <a href="https://coderofsalvation.github.io/janus-guide/" target="_blank">JanusXR</a>-client called <a href="https://github.com/jbaicoianu/janusweb" target="_blank">JanusWeb</a>, which promotes <b>projecting these ecosystems</b> as virtual <b>hyperlinked</b> worlds (via XR translators).<br>
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,8 @@ ${notification}
|
||||||
<form method="POST">
|
<form method="POST">
|
||||||
<div class="tab-frame">
|
<div class="tab-frame">
|
||||||
{for i,tab in pairs(tabs) do
|
{for i,tab in pairs(tabs) do
|
||||||
print('<input type="radio" checked name="tab" id="tab' .. i .. '">')
|
if i == 1 then checked='checked' else checked='' end
|
||||||
|
print('<input type="radio" ' .. checked .. ' name="tab" id="tab' .. i .. '">')
|
||||||
print('<label for="tab' .. i .. '">' .. tab .. '</label>')
|
print('<label for="tab' .. i .. '">' .. tab .. '</label>')
|
||||||
end}
|
end}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ function pluginInput(opt)
|
||||||
<td>
|
<td>
|
||||||
]]
|
]]
|
||||||
local key = opt.key:gsub("^app.opts.","")
|
local key = opt.key:gsub("^app.opts.","")
|
||||||
local value = app.opts[ key ]
|
local value = EscapeHtml( app.opts[ key ] )
|
||||||
if type(opt.values) == 'table' then
|
if type(opt.values) == 'table' then
|
||||||
html = html .. util.template('<select name="${key}" value="${value}">\n', {
|
html = html .. util.template('<select name="${key}" value="${value}">\n', {
|
||||||
key = opt.key,
|
key = opt.key,
|
||||||
|
|
@ -29,6 +29,13 @@ function pluginInput(opt)
|
||||||
})
|
})
|
||||||
end)
|
end)
|
||||||
html = html .. "</select>\n"
|
html = html .. "</select>\n"
|
||||||
|
else
|
||||||
|
if opt.control and opt.control == 'textarea' then
|
||||||
|
html = html .. util.template('<textarea name="${key}">${value}</textarea>',{
|
||||||
|
key = opt.key,
|
||||||
|
value = value,
|
||||||
|
placeholder= opt.placeholder or ''
|
||||||
|
})
|
||||||
else
|
else
|
||||||
html = html .. util.template('<input type="text" name="${key}" value="${value}" placeholder="${placeholder}"></input>',{
|
html = html .. util.template('<input type="text" name="${key}" value="${value}" placeholder="${placeholder}"></input>',{
|
||||||
key = opt.key,
|
key = opt.key,
|
||||||
|
|
@ -36,6 +43,7 @@ function pluginInput(opt)
|
||||||
placeholder= opt.placeholder or ''
|
placeholder= opt.placeholder or ''
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
end
|
||||||
html = html .. util.template([[
|
html = html .. util.template([[
|
||||||
</td>
|
</td>
|
||||||
<td class="col3">${info}</td>
|
<td class="col3">${info}</td>
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ ${header}
|
||||||
<div style="height:90px;" class="jumbotron">
|
<div style="height:90px;" class="jumbotron">
|
||||||
<h1 style="display:none">${opts.title}</h1>
|
<h1 style="display:none">${opts.title}</h1>
|
||||||
<br>
|
<br>
|
||||||
<center class="col3">${opts.subtitle}</center>
|
<center class="col3">${opts.plugin_global_subtitle}</center>
|
||||||
</div>
|
</div>
|
||||||
<hr style="margin-top:0"/>
|
<hr style="margin-top:0"/>
|
||||||
]])
|
]])
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ return {
|
||||||
data.url = GetScheme() .. '://' .. GetHost() .. port .. v.url
|
data.url = GetScheme() .. '://' .. GetHost() .. port .. v.url
|
||||||
if v.janusxr then
|
if v.janusxr then
|
||||||
-- what to do here? no generated portals?
|
-- what to do here? no generated portals?
|
||||||
data.footer_janusxr = app.tpl( util.readfile(v.path), data )
|
data.janusxr = app.tpl( util.readfile(v.path), data )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
<!-- JanusXR portalroom, see https://janusxr.org for markup -->
|
<!-- JanusXR portalroom, see https://janusxr.org for markup -->
|
||||||
${footer_janusxr}
|
${janusxr}
|
||||||
|
|
||||||
<!-- C-code
|
<!-- C-code
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
<fireboxroom>
|
|
||||||
<assets>
|
|
||||||
<assetshader id="xrforgeportal" src="${opts.baseurl}shader/xrforgeportal.shadertoy.frag" shadertype="shadertoy"></assetshader>
|
|
||||||
{if items and #items > 0 then
|
|
||||||
for i,v in pairs(items) do
|
|
||||||
print('\t<assetimage src="' .. v.thumbnail .. '" id="img' .. i .. '"/>')
|
|
||||||
end
|
|
||||||
end}
|
|
||||||
</assets>
|
|
||||||
<room pos="0 0 4" skybox="true" showavatar="false" use_local_asset="room_plane" zdir="0 0 -1">
|
|
||||||
<light js_id="dan9-janus:light/light_cone_angle=0-6" pos="0 3 2" collision_trigger="false" />
|
|
||||||
<text js_id="location" pos="0 6 -5" billboard="y" col="#BBFFFF" scale="10 10 1" text="${url}" emissive="0 0 0" roughness="0.3" metalness="0" />
|
|
||||||
{if item then
|
|
||||||
print('\t<object id="${url}"/>')
|
|
||||||
end}
|
|
||||||
{if items and #items > 0 then
|
|
||||||
local portals = {}
|
|
||||||
for i,v in pairs(items) do table.insert(portals, v) end
|
|
||||||
if parent then table.insert(portals, p) end
|
|
||||||
for i,v in pairs(items) do
|
|
||||||
local width = 3.2
|
|
||||||
local center = -((#items*width)/1.3) + (i*width)
|
|
||||||
local url = v.url
|
|
||||||
if v.dir then url = url .. "/" end
|
|
||||||
print('\t\t<object js_id="portal_' .. i .. '" pos="' .. center .. ' 0 0">')
|
|
||||||
print('\t\t <link url="' .. url .. '" thumb_id="img' .. i .. '" title_col="0.4 0.37 0.4" pos="0 0 0.001" draw_glow="true" scale="3 3 0.1" />')
|
|
||||||
print('\t\t <link url="' .. url .. '" shader_id="xrforgeportal" pos="0 0 0.003" draw_glow="false" scale="3 3 0.1" />')
|
|
||||||
print('\t\t <text text="' .. v.title .. '" pos="0 3.4 0" col="1 1 1" font_scale="false" scale="0.2 0.2 0.2" />')
|
|
||||||
print('\t\t</object>')
|
|
||||||
end
|
|
||||||
end}
|
|
||||||
</room>
|
|
||||||
</fireboxroom>
|
|
||||||
|
|
@ -4,9 +4,9 @@
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<base href="${opts.baseurl}" />
|
<base href="${opts.baseurl}" />
|
||||||
<title>${title}</title>
|
<title>${opts.plugin_global_title}</title>
|
||||||
<link rel="stylesheet" href="/css/xrforge.css"></link>
|
<link rel="stylesheet" href="/css/xrforge.css"></link>
|
||||||
${header_include}
|
${opts.plugin_global_headertags}
|
||||||
<noscript>
|
<noscript>
|
||||||
{if urlpath == '/' or urlpath == '/index.html' then
|
{if urlpath == '/' or urlpath == '/index.html' then
|
||||||
print('<meta http-equiv="refresh" content="0;url=${opts.plugin_diskscan_dirname}">')
|
print('<meta http-equiv="refresh" content="0;url=${opts.plugin_diskscan_dirname}">')
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
<a href="${opts.baseurl}">
|
<a href="${opts.baseurl}">
|
||||||
<div class="logo max">
|
<div class="logo max">
|
||||||
<span class="col1">[</span><span class="col2"><></span><span class="col1">]</span>
|
<span class="col1">[</span><span class="col2"><></span><span class="col1">]</span>
|
||||||
<span class="col3">${opts.title}
|
<span class="col3">${opts.plugin_global_title}
|
||||||
{if url:match("admin") then
|
{if url:match("admin") then
|
||||||
print('<span class="col1">//<span>')
|
print('<span class="col1">//<span>')
|
||||||
print('<span class="col0">${opts.admin_title}</span>')
|
print('<span class="col0">${opts.admin_title}</span>')
|
||||||
|
|
@ -34,8 +34,10 @@
|
||||||
<td class="menu">
|
<td class="menu">
|
||||||
<div class="margin1L">
|
<div class="margin1L">
|
||||||
<!-- important: no spaces between anchor tags for older browsers without flexbox -->
|
<!-- important: no spaces between anchor tags for older browsers without flexbox -->
|
||||||
<a href="/${opts.plugin_diskscan_dirname}"><img class="icon" src="/img/list-tree.svg">${opts.plugin_diskscan_dirname}</a> <a href="/about">about</a>
|
<a href="/${opts.plugin_diskscan_dirname}"><img class="icon" src="/img/list-tree.svg">${opts.plugin_global_topmenu_mapname}</a>
|
||||||
<!--<a class="xl" href="/howto">Howto</a></div>-->
|
{if true then
|
||||||
|
print( app.opts.plugin_global_topmenu_html:gsub("\n"," ") )
|
||||||
|
end}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
|
||||||
72
src/page/janusxr.html
Normal file
72
src/page/janusxr.html
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
<fireboxroom>
|
||||||
|
<assets>
|
||||||
|
<assetshader id="xrforgeportal" src="${opts.baseurl}shader/xrforgeportal.shadertoy.frag" shadertype="shadertoy"></assetshader>
|
||||||
|
{if items and #items > 0 then
|
||||||
|
for i,v in pairs(items) do
|
||||||
|
print('\t<assetimage src="' .. v.thumbnail .. '" id="img' .. i .. '"/>')
|
||||||
|
end
|
||||||
|
end}
|
||||||
|
{for i=1,5 do
|
||||||
|
local urls = app.opts[ 'plugin_federation_url_' .. i]
|
||||||
|
if #urls > 0 then
|
||||||
|
local fediurl = urls:gsub(' .*','')
|
||||||
|
local thumburl = urls:gsub('.* ','')
|
||||||
|
print('\t<assetimage src="' .. thumburl .. '" id="federated' .. i .. '"/>')
|
||||||
|
end
|
||||||
|
end}
|
||||||
|
</assets>
|
||||||
|
{if item then
|
||||||
|
print([[
|
||||||
|
<room pos="0 0 0" skybox="true" showavatar="false">
|
||||||
|
<object id="${url}"/>
|
||||||
|
]])
|
||||||
|
else
|
||||||
|
local room = app.opts.plugin_janusxr_portalroom
|
||||||
|
if room == 'random' then room = app.plugin.janusxr.getRandomRoom() end
|
||||||
|
print('<room skybox="true" showavatar="false" use_local_asset="' .. room .. '">')
|
||||||
|
end}
|
||||||
|
<light js_id="dan9-janus:light/light_cone_angle=0-6" pos="0 3 2" collision_trigger="false" />
|
||||||
|
{if true then
|
||||||
|
function addPortal(id,x,v,url,i,z,thumbprefix,rotation,scale)
|
||||||
|
print('\t\t<object js_id="' .. id .. '_' .. i .. '" pos="' .. x .. ' 0 ' .. z .. '" rotation="' .. rotation .. '">')
|
||||||
|
print('\t\t <link url="' .. url .. '" thumb_id="' .. thumbprefix .. i .. '" title_col="0.4 0.37 0.4" pos="0 0 0.001" draw_glow="true" scale="3 3 0.1" />')
|
||||||
|
print('\t\t <link url="' .. url .. '" shader_id="xrforgeportal" pos="0 0 0.003" draw_glow="false" scale="3 3 0.1" />')
|
||||||
|
print('\t\t <text text="' .. v.title .. '" pos="0 3.4 0" col="1 1 1" font_scale="false" scale="' .. scale .. '" />')
|
||||||
|
print('\t\t</object>')
|
||||||
|
end
|
||||||
|
end}
|
||||||
|
<text js_id="location" pos="0 6 -5" billboard="y" col="#BBFFFF" scale="10 10 1" text="${url}" emissive="0 0 0" roughness="0.3" metalness="0" />
|
||||||
|
{if items and #items > 0 then
|
||||||
|
local portals = {}
|
||||||
|
for i,v in pairs(items) do table.insert(portals, v) end
|
||||||
|
if parent then table.insert(portals, p) end
|
||||||
|
for i,v in pairs(items) do
|
||||||
|
local width = 3.2
|
||||||
|
local center = -((#items*width)/1.3) + (i*width)
|
||||||
|
local url = v.url
|
||||||
|
if v.dir then url = url .. "/" end
|
||||||
|
addPortal('dir',center, v, url,i, -4, 'img', '0 0 0', '0.2 0.2 0.2')
|
||||||
|
end
|
||||||
|
end}
|
||||||
|
{if true then
|
||||||
|
local portals = {}
|
||||||
|
for i=1,5 do
|
||||||
|
local urls = app.opts[ 'plugin_federation_url_' .. i]
|
||||||
|
if #urls > 0 then
|
||||||
|
local fediurl = urls:gsub(' .*','')
|
||||||
|
table.insert(portals, fediurl )
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if #portals > 0 then
|
||||||
|
print([[
|
||||||
|
<text js_id="location" pos="0 6 5" billboard="y" col="#BBFFFF" scale="10 10 1" text="${opts.plugin_federation_title}" emissive="0 0 0" roughness="0.3" metalness="0" />
|
||||||
|
]])
|
||||||
|
end
|
||||||
|
for i,fediurl in pairs(portals) do
|
||||||
|
local width = 3.2
|
||||||
|
local center = -((#portals*width)/1.3) + (i*width)
|
||||||
|
addPortal('federated',center, {title=fediurl}, fediurl,i, 4, 'federated', '0 180 0', '0.1 0.1 0.1')
|
||||||
|
end
|
||||||
|
end}
|
||||||
|
</room>
|
||||||
|
</fireboxroom>
|
||||||
|
|
@ -9,7 +9,6 @@ app.on('scan_experience_file', function(exp)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
app.on('set', function(k,v)
|
app.on('set', function(k,v)
|
||||||
print("content was updated")
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- this registers the plugin UI
|
-- this registers the plugin UI
|
||||||
|
|
|
||||||
|
|
@ -8,83 +8,78 @@ app.on('scan_experience_file', function(exp)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
app.on('set', function(k,v)
|
app.on('set', function(k,v)
|
||||||
print("content was updated")
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
--app.on('dir', function(opts)
|
app.on('dir', function(opts)
|
||||||
-- local me = app.plugin.federation
|
local me = app.plugin.federation
|
||||||
-- if opts.urlpath == '/' then
|
if opts.urlpath == '/' then
|
||||||
-- foreach( me.portals, function(k,portal)
|
print_r(me.portals)
|
||||||
-- print("JAAA")
|
--foreach( me.portals, function(k,portal)
|
||||||
-- table.insert( opts.data.items,{
|
-- print("JAAA")
|
||||||
-- url = portal.url,
|
-- table.insert( opts.data.items,{
|
||||||
-- name = portal.name,
|
-- url = portal.url,
|
||||||
-- thumbnail = portal.thumbnail
|
-- name = portal.name,
|
||||||
-- })
|
-- thumbnail = portal.thumbnail
|
||||||
-- end)
|
-- })
|
||||||
-- end
|
--end)
|
||||||
--end)
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
local plugin = {
|
local plugin = {
|
||||||
name = 'Federation <b class="tag">disabled</b>',
|
name = 'Federation',
|
||||||
info = 'updating values requires a xrforge restart',
|
info = 'Add links to other (janus)XR(forges), and have them show up as extra portals in portalrooms',
|
||||||
opts = { -- TODO populate this based on xrforge-federation.json
|
opts = { -- TODO populate this based on xrforge-federation.json
|
||||||
|
{
|
||||||
|
key='app.opts.plugin_federation_title',
|
||||||
|
title='Title',
|
||||||
|
info="Displayed above federated portals",
|
||||||
|
default="Federated neighbourhoods",
|
||||||
|
values=''
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key='app.opts.plugin_federation_strategy',
|
||||||
|
title='Display portals',
|
||||||
|
info="When to show federated portals?",
|
||||||
|
default="always",
|
||||||
|
values={always='always',homepage='only homepage'}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
key='app.opts.plugin_federation_url_1',
|
key='app.opts.plugin_federation_url_1',
|
||||||
title='Federation URL 1',
|
title='Federated URL 1',
|
||||||
info="a json with (janus)xr(forge) URLs",
|
info="URL + Thumbnail URL (space separated)",
|
||||||
default="./federation.json",
|
default="https://xrforge.isvery.ninja https://i.imgur.com/x7fzn9v.png",
|
||||||
values=''
|
values=''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key='app.opts.plugin_federation_url_2',
|
key='app.opts.plugin_federation_url_2',
|
||||||
title='Federation URL 1',
|
title='Federated URL 2',
|
||||||
info="a json with (janus)xr(forge) URLs",
|
info="URL + Thumbnail URL (space separated)",
|
||||||
default="",
|
default="https://www.janusxr.org/new/ https://archive.org/download/janusxr-1/janusxr.png",
|
||||||
values=''
|
values=''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key='app.opts.plugin_federation_url_3',
|
key='app.opts.plugin_federation_url_3',
|
||||||
title='Federation URL 1',
|
title='Federated URL 3',
|
||||||
info="a json with (janus)xr(forge) URLs",
|
info="URL + Thumbnail URL (space separated)",
|
||||||
|
default="",
|
||||||
|
values=''
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key='app.opts.plugin_federation_url_4',
|
||||||
|
title='Federated URL 4',
|
||||||
|
info="URL + Thumbnail URL (space separated)",
|
||||||
|
default="",
|
||||||
|
values=''
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key='app.opts.plugin_federation_url_5',
|
||||||
|
title='Federated URL 5',
|
||||||
|
info="URL + Thumbnail URL (space separated)",
|
||||||
default="",
|
default="",
|
||||||
values=''
|
values=''
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
--
|
|
||||||
-- PROBLEM: every request has its own app context
|
|
||||||
-- so the util.fetch() didn't help here
|
|
||||||
-- sqlite is needed to share state
|
|
||||||
|
|
||||||
app.on('init', function()
|
|
||||||
local me = app.plugin.federation
|
|
||||||
me.portals = {}
|
|
||||||
local federations = {}
|
|
||||||
-- load previous federations if any
|
|
||||||
for k=1,3 do
|
|
||||||
if app.opts['plugin_federation_url_'..k] and #app.opts['plugin_federation_url_'..k] > 0 then
|
|
||||||
table.insert(federations, app.opts['plugin_federation_url_'..k])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
foreach(federations, function(k,url)
|
|
||||||
if url:match('^[./]') then
|
|
||||||
url = util.getURL( url:gsub('^[./]',''), {server=true} )
|
|
||||||
end
|
|
||||||
util.fetch(url, nil, function(req,res,next)
|
|
||||||
if req.body then
|
|
||||||
local t = DecodeJson(req.body)
|
|
||||||
if t then
|
|
||||||
foreach( t, function(k,opt)
|
|
||||||
table.insert( me.portals, opts )
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end)
|
|
||||||
end)
|
|
||||||
|
|
||||||
-- this registers the plugin UI
|
-- this registers the plugin UI
|
||||||
return plugin
|
return plugin
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ app.on('scan_experience_file', function(exp)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
app.on('set', function(k,v)
|
app.on('set', function(k,v)
|
||||||
print("content was updated")
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- this registers the plugin UI
|
-- this registers the plugin UI
|
||||||
|
|
|
||||||
62
src/plugin/global.lua
Normal file
62
src/plugin/global.lua
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
local util = require('util')
|
||||||
|
|
||||||
|
app.on('scan_experience', function(exp)
|
||||||
|
--print_r(exp)
|
||||||
|
end)
|
||||||
|
|
||||||
|
app.on('scan_experience_file', function(exp)
|
||||||
|
end)
|
||||||
|
|
||||||
|
app.on('set', function(k,v)
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- this registers the plugin UI
|
||||||
|
local plugin = {
|
||||||
|
name = "Global settings",
|
||||||
|
info = '',
|
||||||
|
opts = {
|
||||||
|
{
|
||||||
|
key='app.opts.plugin_global_title',
|
||||||
|
title='Title',
|
||||||
|
info='Preferably dot-style domain-notation for easy recollection',
|
||||||
|
default = "your.xr.forge",
|
||||||
|
values=''
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key='app.opts.plugin_global_subtitle',
|
||||||
|
title='Subtitle',
|
||||||
|
info='Slogan here',
|
||||||
|
default = "Portable XR experiences for Phone, VRheadset & desktop.",
|
||||||
|
values=''
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key='app.opts.plugin_global_topmenu_mapname',
|
||||||
|
title='Overview link',
|
||||||
|
info='Top-right link <img class="icon list-tree" src="/img/list-tree.svg"> (overview page)',
|
||||||
|
default = "map",
|
||||||
|
values=''
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key='app.opts.plugin_global_topmenu_html',
|
||||||
|
title='Menu html',
|
||||||
|
info='Add extra menu items here',
|
||||||
|
default = '<a href="/about">about</a>',
|
||||||
|
control='textarea',
|
||||||
|
values=''
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key='app.opts.plugin_global_headertags',
|
||||||
|
title='Header html',
|
||||||
|
info='Add extra header tags here',
|
||||||
|
default = [[
|
||||||
|
<!--
|
||||||
|
<link rel="stylesheet" type="text/css" href="https://my.org/foo.css" media="all" />
|
||||||
|
-->
|
||||||
|
]],
|
||||||
|
control='textarea',
|
||||||
|
values=''
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return plugin
|
||||||
|
|
@ -31,7 +31,6 @@ app.on('scan_experience_file', function(exp)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
app.on('set', function(k,v)
|
app.on('set', function(k,v)
|
||||||
print("content was updated")
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- this registers the plugin UI
|
-- this registers the plugin UI
|
||||||
|
|
@ -76,11 +75,18 @@ local plugin = {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key='app.opts.plugin_janusxr_wrap_template',
|
key='app.opts.plugin_janusxr_wrap_template',
|
||||||
title='template',
|
title='Media room',
|
||||||
info='What kind of space should images/videos be rendered into?',
|
info='What kind of space should images/videos be rendered into?',
|
||||||
default="random",
|
default="random",
|
||||||
values={random="random room",plane="wirefloor",room1="room1",room2="room2",room3="room3",room4="room4",room5="room5",room6="room6",room7="room7"}
|
values={random="random room",plane="wirefloor",room1="room1",room2="room2",room3="room3",room4="room4",room5="room5",room6="room6",room7="room7"}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
key='app.opts.plugin_janusxr_portalroom',
|
||||||
|
title='Directory room',
|
||||||
|
info='What kind of space should directories be rendered into?',
|
||||||
|
default="room_plane",
|
||||||
|
values={random="random room",room_plane="wirefloor",room1="room1",room2="room2",room3="room3",room4="room4",room5="room5",room6="room6",room7="room7"}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
key='app.opts.plugin_janusxr_scraper',
|
key='app.opts.plugin_janusxr_scraper',
|
||||||
title='Scraper',
|
title='Scraper',
|
||||||
|
|
@ -95,7 +101,21 @@ local plugin = {
|
||||||
default='https://xrforge.isvery.ninja https://www.janusxr.org',
|
default='https://xrforge.isvery.ninja https://www.janusxr.org',
|
||||||
values=''
|
values=''
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
|
getRandomRoom = function()
|
||||||
|
local me = app.plugin.janusxr
|
||||||
|
local room= ''
|
||||||
|
foreach( me.opts, function(k,v)
|
||||||
|
print(v.key)
|
||||||
|
if v.key == 'app.opts.plugin_janusxr_portalroom' then
|
||||||
|
local ordered = {}
|
||||||
|
foreach( v.values, function(k,v) table.insert(ordered,v) end)
|
||||||
|
room = ordered[ math.random( #ordered ) ]
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
print("ROOM = " .. room)
|
||||||
|
return room
|
||||||
|
end
|
||||||
}
|
}
|
||||||
|
|
||||||
return plugin
|
return plugin
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ app.on('scan_experience_file', function(exp)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
app.on('set', function(k,v)
|
app.on('set', function(k,v)
|
||||||
print("content was updated")
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- this registers the plugin UI
|
-- this registers the plugin UI
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@ app.on('scan_experience_file', function(exp)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
app.on('set', function(k,v)
|
app.on('set', function(k,v)
|
||||||
print("content was updated")
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- this registers the plugin UI
|
-- this registers the plugin UI
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ app.on('scan_experience_file', function(exp)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
app.on('set', function(k,v)
|
app.on('set', function(k,v)
|
||||||
print("content was updated")
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- this registers the plugin UI
|
-- this registers the plugin UI
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ app.on('scan_experience_file', function(exp)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
app.on('set', function(k,v)
|
app.on('set', function(k,v)
|
||||||
print("content was updated")
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- this registers the plugin UI
|
-- this registers the plugin UI
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@ end)
|
||||||
-- this registers the plugin UI /funcs
|
-- this registers the plugin UI /funcs
|
||||||
return {
|
return {
|
||||||
name = "XR Fragments",
|
name = "XR Fragments",
|
||||||
info = 'XR Fragments treats 3D files with <a href="https://xrfragment.org/#sidecar%20files" target="_blank">sidecar file(s)</a> (foo.glb+foo.png e.g.) as experience and/or detect <a href="https://xrfragment.org" target="_blank">deeplinking of 3D files</a> via <a href="https://xrfragment.org#href" target="_blank">href-metadata</a>',
|
info = 'XR Fragments treats 3D files with <a href="https://xrfragment.org/#sidecar%20files" target="_blank">sidecar file(s)</a> (foo.glb+foo.png e.g.) as experience and/or detects <a href="https://xrfragment.org" target="_blank">deeplinking of 3D files</a> via <a href="https://xrfragment.org#href" target="_blank">href-metadata</a>',
|
||||||
opts = {
|
opts = {
|
||||||
{
|
{
|
||||||
key='app.opts.plugin_xrfragments_filetypes',
|
key='app.opts.plugin_xrfragments_filetypes',
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue