mirror of
https://github.com/ShadowKatStudios/OC-Minitel.git
synced 2024-09-07 20:08:48 +10:00
206 lines
4.7 KiB
Lua
206 lines
4.7 KiB
Lua
local event = require("event")(neo)
|
|
local neoux = require("neoux")(event, neo)
|
|
local minitel = neo.requireAccess("x.svc.minitel","minitel daemon access")
|
|
local computer = neo.requireAccess("k.computer","pushing packets")
|
|
local net = require("net")(event,computer,minitel)
|
|
|
|
local tb = {}
|
|
|
|
local rtext = "FRequest Browser v2\nAlt-hjkl to resize\n^J and ^K to scroll"
|
|
local url = ""
|
|
local blines, dlines = {}, {}
|
|
local bbuttons, dbuttons = {}, {}
|
|
local wwidth, wheight = 30,10
|
|
local hheight = 2
|
|
local cscroll = 1
|
|
local minwidth, minheight = 16, 8
|
|
local ctrl, alt = false, false
|
|
|
|
function tb.fget(host,port,path)
|
|
local socket = net.open(host,port)
|
|
socket:write("t"..path.."\n")
|
|
local c
|
|
repeat
|
|
c = socket:read(1)
|
|
event.pull()
|
|
until c ~= ""
|
|
local buffer = ""
|
|
repeat
|
|
l = socket:read(1024)
|
|
buffer=buffer..l
|
|
event.sleepTo(os.uptime()+1)
|
|
until socket.state == "closed" and l == ""
|
|
if c == "n" then
|
|
return path..": Not found."
|
|
elseif c == "f" then
|
|
return "Failure: "..buffer
|
|
elseif c == "d" then
|
|
local t = {}
|
|
for s in buffer:gmatch("[^\r?\n]+") do
|
|
t[#t+1] = s
|
|
end
|
|
return t
|
|
end
|
|
return buffer
|
|
end
|
|
|
|
function tb.parseURL(url)
|
|
local hp, path = url:match("(.-)(/.+)")
|
|
hp, path = hp or url, path or "/"
|
|
local host, port = hp:match("(.+):(.+)")
|
|
host, port = host or hp, port or 70
|
|
return host, port, path
|
|
end
|
|
|
|
function tb.loadpage()
|
|
if url:sub(-1) == "/" then
|
|
url = url:sub(1,-2)
|
|
end
|
|
local host, port, path = tb.parseURL(url)
|
|
local page = tb.fget(host, port, path)
|
|
if type(page) == "string" then
|
|
rtext = page
|
|
bbuttons = {}
|
|
elseif type(page) == "table" then
|
|
rtext = "Index of "..path
|
|
bbuttons = page
|
|
end
|
|
cscroll = 1
|
|
tb.format()
|
|
tb.redraw()
|
|
end
|
|
|
|
-- UI stuff
|
|
|
|
function tb.mkbutton(name,x,y)
|
|
x = x or 1
|
|
return neoux.tcbutton(x,y,name,function(w)
|
|
if name:sub(-1) == "/" then
|
|
name = name:sub(1,-2)
|
|
end
|
|
url = url .."/".. name
|
|
tb.loadpage()
|
|
end)
|
|
end
|
|
|
|
function tb.format()
|
|
blines = neoux.fmtText(rtext, wwidth)
|
|
dlines = {}
|
|
for i = cscroll, cscroll + wheight do
|
|
dlines[#dlines+1] = blines[i]
|
|
end
|
|
dbuttons = {}
|
|
for i = cscroll, cscroll + wheight do
|
|
dbuttons[#dbuttons+1] = bbuttons[i]
|
|
end
|
|
end
|
|
|
|
function tb.genwindow()
|
|
local r1,r2,r2o,r2l = 1,2,1,wwidth
|
|
fillh = 0
|
|
hheight = 2
|
|
if wwidth > 25 then
|
|
r2 = 1
|
|
r2o = 7
|
|
r2l = wwidth - 6
|
|
hheight = 1
|
|
end
|
|
tb.format()
|
|
local wtab = {
|
|
neoux.tcbutton(1,r1,unicode.char(8593),tb.bup),
|
|
neoux.tcbutton(4,r1,unicode.char(9661),tb.bsave),
|
|
--neoux.tcbutton(wwidth-2,r1,unicode.char(9711),tb.breload)
|
|
neoux.tcfield(r2o,r2,r2l-3,tb.furl),
|
|
neoux.tcbutton(r2o+r2l-3,r2,unicode.char(9655),tb.loadpage),
|
|
neoux.tcrawview(1,hheight+1,dlines,wwidth)
|
|
}
|
|
for k,v in pairs(dbuttons) do
|
|
wtab[#wtab+1] = tb.mkbutton(v,1,hheight+1+k)
|
|
end
|
|
return wtab
|
|
end
|
|
|
|
-- button callbacks
|
|
|
|
function tb.bup(w)
|
|
local tURL = {}
|
|
for s in url:gmatch("[^/]+") do
|
|
tURL[#tURL+1] = s
|
|
end
|
|
if #tURL > 1 then
|
|
tURL[#tURL] = nil
|
|
end
|
|
url = ""
|
|
for k,v in ipairs(tURL) do
|
|
url = url .. "/" .. v
|
|
end
|
|
url=url:sub(2)
|
|
tb.breload()
|
|
end
|
|
|
|
function tb.breload(w)
|
|
tb.loadpage()
|
|
tb.redraw()
|
|
end
|
|
|
|
function tb.bsave()
|
|
local f = neoux.fileDialog(true)
|
|
if f then
|
|
f.write(rtext.."\n")
|
|
for k,v in pairs(bbuttons) do
|
|
f.write(v.."\n")
|
|
end
|
|
f.close()
|
|
end
|
|
end
|
|
|
|
function tb.furl(nv)
|
|
if not nv then return url end
|
|
url = nv
|
|
end
|
|
|
|
tb.window = neoux.create(wwidth, wheight, "FGet", neoux.tcwindow(wwidth,wheight,tb.genwindow(),function (w) w.close() done = true end, 0xFFFFFF, 0))
|
|
|
|
function tb.redraw()
|
|
for i = 1, 2 do -- I'm a bad person.
|
|
tb.window.reset(wwidth, wheight, "FGet", neoux.tcwindow(wwidth,wheight,tb.genwindow(),function (w) w.close() done = true end, 0xFFFFFF, 0))
|
|
end
|
|
end
|
|
|
|
while not done do
|
|
local et, _, et2, k1, k2 = event.pull()
|
|
if et == "x.neo.pub.window" and et2 == "key" then
|
|
if k1 == 0 and k2 == 56 then -- alt pressed
|
|
alt = not alt
|
|
elseif k1 == 0 and k2 == 157 then -- ctrl pressed
|
|
ctrl = not ctrl
|
|
elseif alt and k1 == 104 and k2 == 35 then -- alt-h, reduce width
|
|
wwidth = wwidth - 1
|
|
if wwidth < minwidth then
|
|
wwidth = minwidth
|
|
end
|
|
tb.redraw()
|
|
elseif alt and k1 == 106 and k2 == 36 then -- alt-j, increase height
|
|
wheight = wheight + 1
|
|
tb.redraw()
|
|
elseif alt and k1 == 107 and k2 == 37 then -- alt-k, decrease height
|
|
wheight = wheight - 1
|
|
if wheight < minheight then
|
|
wheight = minheight
|
|
end
|
|
tb.redraw()
|
|
elseif alt and k1 == 108 and k2 == 38 then -- alt-l, increase width
|
|
wwidth = wwidth + 1
|
|
tb.redraw()
|
|
elseif k1 == 10 and k2 == 36 then -- ctrl-j, scroll down
|
|
cscroll = cscroll + 1
|
|
if cscroll > #blines+#bbuttons then cscroll = #tlines end
|
|
tb.redraw()
|
|
elseif k1 == 11 and k2 == 37 then -- ctrl-k scroll up
|
|
cscroll = cscroll - 1
|
|
if cscroll < 1 then cscroll = 1 end
|
|
tb.redraw()
|
|
end
|
|
end
|
|
end
|