chester.lua
by anonymous
        1
        -- touchscreen ender storage configurator with favorites/bookmarks
        2
        -- this one requires sc-peripherals, which is a switchcraft thing (sc3.io)
        3
        local chest = peripheral.find("ender_storage")
        4
        local monitor = peripheral.find("monitor")
        5
        monitor.setTextScale(0.5)
        6
        monitor.clear()
        7
        
        8
        local favorites = {
        9
            ["Lava"] = {colors.orange,colors.orange,colors.orange},
        10
            ["Lava Return"] = {colors.orange,colors.orange,colors.white},
        11
            ["Snow Balls"] = {colors.white,colors.lightBlue,colors.white},
        12
            ["Snow Blocks"] = {colors.white,colors.blue,colors.white},
        13
            ["Waste"] = {colors.red,colors.red,colors.red},
        14
            ["Ender Pearls"] = {colors.white,colors.white,colors.white},
        15
            ["Rocks"] = {colors.gray,colors.gray,colors.gray},
        16
            ["Cooked Cod"] = {colors.yellow,colors.white,colors.yellow}
        17
        }
        18
        local fkeys = {}
        19
        for k,v in pairs(favorites) do
        20
            table.insert(fkeys,k)
        21
        end
        22
        
        23
        local online = {}
        24
        local wkeys = {}
        25
        local ok,err = pcall(function()
        26
            local data = http.get("https://p.sc3.io/THaX6gxqtp").readAll()
        27
            for _,v in pairs(textutils.unserialiseJSON(data)) do
        28
                online[v.label] = v.colors
        29
                table.insert(wkeys,v.label)
        30
            end
        31
        end)
        32
        if not ok then printError("Online database not loaded: "..err) end
        33
        
        34
        local selection = 2
        35
        local channel = {colors.white,colors.white,colors.white}
        36
        local chs = {"l","m","r"}
        37
        local tcol = {
        38
            colors.white,
        39
            colors.orange,
        40
            colors.magenta,
        41
            colors.lightBlue,
        42
            colors.yellow,
        43
            colors.lime,
        44
            colors.pink,
        45
            colors.gray,
        46
            colors.lightGray,
        47
            colors.cyan,
        48
            colors.purple,
        49
            colors.blue,
        50
            colors.brown,
        51
            colors.green,
        52
            colors.red,
        53
            colors.black
        54
        }
        55
        
        56
        local function text(x,y,txt,color,bcolor)
        57
            monitor.setCursorPos(x,y)
        58
            if not color then color = colors.white end
        59
            if not bcolor then bcolor = colors.black end
        60
            monitor.setTextColor(color)
        61
            monitor.setBackgroundColor(bcolor)
        62
            monitor.write(txt)
        63
        end
        64
        local function rect(x,y,w,h,color,highlight)
        65
            local bg = colors.toBlit(color)
        66
            local fg = bg
        67
            if highlight then
        68
                if bg == "0" then
        69
                    fg = "f"
        70
                else
        71
                    fg = "0" -- white
        72
                end
        73
            end
        74
            for i=x,x+w do
        75
                for j=y,y+h do
        76
                    monitor.setCursorPos(i,j)
        77
                    monitor.blit("\127",fg,bg)
        78
                end
        79
            end
        80
        end
        81
        
        82
        local selectionModified = true
        83
        local show = false
        84
        local offset = 0
        85
        parallel.waitForAny(function() while true do
        86
            -- drawing
        87
            if selectionModified then
        88
                selectionModified = false
        89
                -- ok a little updating because stuff
        90
                chest.setFrequency(channel[1],
        91
                                   channel[2],
        92
                                   channel[3])
        93
                monitor.clear()
        94
                if show then
        95
                    text(7,1,"\x1E")
        96
                    for i=1,8 do
        97
                        text(1,i+1,show[i+offset])
        98
                    end
        99
                    text(7,10,"\x1F")
        100
                else
        101
                    for i=1,3 do
        102
                        local basex = (i*5)-4
        103
                        local bcol = channel[i]
        104
                        local col = bcol == colors.black and colors.white or colors.black
        105
                        if selection == i then
        106
                            text(basex,1," >"..chs[i].."< ",col,bcol)
        107
                        else
        108
                            text(basex,1,"  "..chs[i].."  ",col,bcol)
        109
                        end
        110
                    end
        111
                    local opt = channel[selection]
        112
                    for i=1,15 do
        113
                        rect(i,2,1,8,tcol[i],opt==2^(i-1))
        114
                    end
        115
                    text(1,10,"W",colors.white)
        116
                    rect(2,10,12,1,tcol[16],opt==2^15)
        117
                    text(15,10,"F",colors.white)
        118
                end
        119
            else sleep(0) end
        120
        end end, function() while true do
        121
            -- handle input
        122
            local e,s,x,y = os.pullEvent("monitor_touch")
        123
            if show then
        124
                if y == 1 then
        125
                    offset = math.max(offset-1,0)
        126
                elseif y == 10 then
        127
                    offset = math.min(offset+1,#show-8)
        128
                elseif show[y-1+offset] then
        129
                    if show == fkeys then
        130
                        channel = {table.unpack(favorites[show[y-1+offset]])}
        131
                    elseif show == wkeys then
        132
                        channel = {table.unpack(online[show[y-1+offset]])}
        133
                    end
        134
                    show = false
        135
                else
        136
                    show = false
        137
                end
        138
            elseif y > 1 and y < 10 then
        139
                channel[selection] = tcol[x]
        140
            elseif y == 10 then
        141
                if x == 1 then
        142
                    show = wkeys
        143
                    offset = 0
        144
                elseif x == 15 then
        145
                    show = fkeys
        146
                    offset = 0
        147
                else
        148
                    channel[selection] = tcol[16]
        149
                end
        150
            else
        151
                if     x <= 5  then selection = 1
        152
                elseif x <= 10 then selection = 2
        153
                elseif x <= 15 then selection = 3
        154
                end
        155
            end
        156
            selectionModified = true
        157
        end end)