diff --git a/FRequest/KittenOS/apps/app-frequest.lua b/FRequest/KittenOS/apps/app-frequest.lua new file mode 100644 index 0000000..47e7791 --- /dev/null +++ b/FRequest/KittenOS/apps/app-frequest.lua @@ -0,0 +1,205 @@ +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