qwertz19281

SGctl for CC (main=1.1,sgcc=0.1(beta),lntc=1pre1)

Aug 26th, 2015
461
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.         local args = {...}
  2.              local MAIN_VERSION = "1.1"
  3.    local SGC_CONTROLLER_VERSION = "0.1(beta)"
  4. local LANTEA_CONTROLLER_VERSION = "1pre1"
  5.         term.clear()
  6.         term.setCursorPos(1,1)
  7.         term.write("define config")
  8.        
  9. -- CONFIGURATION START
  10. term.write(" (Edit script to change config)") --Comment out this line
  11.  
  12. local SGCRAFT_REFRESHRATE=0.5
  13. local LANTEA_REFRESHRATE=1
  14.  
  15. -- CONFIGURATION END
  16. -- Menu API provided by cyanisaac and ProjectB, licensed under the MIT license.
  17.  
  18.         print()
  19.         local sg=nil
  20.         local running = false
  21.         local rd_timeout=nil
  22.  
  23. print("define bridge")
  24.  
  25. local gmsg=nil
  26.  
  27. function gloop() --SGCraft loop
  28.     local gdat = {os.pullEvent()}
  29.     if sg.energyAvailable ~= nil then
  30.         gpwr=sg.energyAvailable()
  31.     end
  32.     gir=sg.irisState()
  33.     --tclear()
  34.     if gdat[1]=="key" then
  35.         if gdat[2]==keys.d then
  36.             local h, j = term.getCursorPos()
  37.             print("Enter Address: ")
  38.             term.setCursorPos(1,j+2)
  39.             gtxt=slrd()
  40.             ok, gdp=pcall(sg.energyToDial, gtxt)
  41.             if ok then
  42.                 if gpwr==0 then
  43.                     print("WARNING: Energy buffer is empty!")
  44.                     ok, result = pcall(sg.dial, gtxt)
  45.                     if ok then
  46.                         print("dial "..gtxt.." now!")
  47.                     else
  48.                         print("Dialling failed: "..result)
  49.                         sleep(3)
  50.                     end
  51.                 elseif gdp > gpwr then
  52.                     print("Not enough energy: "..gtxt.." needs "..tostring(gdp).."SU but only "..tostring(gpwr).."SU are available!")
  53.                     sleep(5)
  54.                 else    
  55.                     ok, result = pcall(sg.dial, gtxt)
  56.                     if ok then
  57.                         print("dial "..gtxt.." now!")
  58.                     else
  59.                         print("Dialling failed: "..result)
  60.                         sleep(3)
  61.                     end
  62.                 end
  63.             else
  64.                 print("Address error: "..gdp)
  65.                 sleep(4)
  66.             end
  67.         elseif gdat[2]==keys.b then
  68.             gtxt=selAddr()
  69.             if gtxt ~= nil then
  70.             ok, gdp=pcall(sg.energyToDial, gtxt)
  71.             if ok then
  72.                 if gpwr==0 then
  73.                     print("WARNING: Energy buffer is empty!")
  74.                     ok, result = pcall(sg.dial, gtxt)
  75.                     if ok then
  76.                         print("dial "..gtxt.." now!")
  77.                     else
  78.                         print("Dialling failed: "..result)
  79.                         sleep(3)
  80.                     end
  81.                 elseif gdp == nil then
  82.                     print("invalid address?")
  83.                     sleep(1)
  84.                 elseif gdp > gpwr then
  85.                     print("Not enough energy: "..gtxt.." needs "..tostring(gdp).."SU but only "..tostring(gpwr).."SU are available!")
  86.                     sleep(5)
  87.                 else    
  88.                     ok, result = pcall(sg.dial, gtxt)
  89.                     if ok then
  90.                         print("dial "..gtxt.." now!")
  91.                     else
  92.                         print("Dialling failed: "..result)
  93.                         sleep(3)
  94.                     end
  95.                 end
  96.             else
  97.                 print("Address error: "..gdp)
  98.                 sleep(4)
  99.             end
  100.             else
  101.                 print("DialBook FAILED")
  102.                 sleep(0.4)
  103.             end
  104.         elseif gdat[2]==keys.c then
  105.             sg.disconnect()
  106.         elseif gdat[2]==keys.i then
  107.             if gir=="Opening" or gir=="Open" then
  108.                 sg.closeIris()
  109.             elseif gir=="Closed" or gir=="Closing" then
  110.                 sg.openIris()
  111.             end
  112.         elseif gdat[2]==keys.m then
  113.             local h, j = term.getCursorPos()
  114.             print("Enter Message: ")
  115.             term.setCursorPos(1,j+2)
  116.             local ok, reta = pcall(sg.sendMessage, slrd())
  117.             if ok then
  118.                 print("Sent message")
  119.             else
  120.                 print("ERROR: "..reta)
  121.                 sleep(3)
  122.             end
  123.         elseif gdat[2]==keys.x then
  124.             running=false
  125.         end
  126.     elseif gdat[1]=="sgMessageReceived" then
  127.        gmsg=string.gsub(textutils.serialize(gdat),"\n","")
  128.        
  129.     elseif gdat[1]=="timer" and gdat[2]==rd_timeout then
  130.        rd_timeout = os.startTimer(SGCRAFT_REFRESHRATE)
  131.     end
  132.     gst, gchr, gdir = sg.stargateState()
  133.     gla=sg.localAddress()
  134.     grm=sg.remoteAddress()
  135.    
  136.     tclear()
  137.     --print("State: "..gst)
  138.     prclstate(gst)
  139.     --print("Direction: "..gdir)
  140.     prclwormhole(gdir)
  141.     --print("Iris: "..gir)
  142.     prcliris(gir)
  143.     print()
  144.     print("Local Address: "..gla.."\nRemote Address: "..tostring(grm))
  145.     print()
  146.     print("SGCraft Controller "..SGC_CONTROLLER_VERSION.." - SU Available: "..tostring(gpwr))
  147.    
  148.     if gmsg ~= nil then
  149.        print("last message: "..gmsg)
  150.     end
  151.     if gchr ~= nil then
  152.        print("engaged chevron "..tostring(gchr))
  153.     end
  154.    
  155.     print("\nKeys: Dial (D), DialBook (B), Disconnect (C), Toggle Iris(I), Send Message (M), Exit (X)")
  156. end
  157.  
  158. local gcs = {Idle=colors.green, Offline=colors.white, Connected=colors.blue, Opening=colors.red, Closing=colors.yellow, Dialling=colors.orange}
  159. function prclstate(mesg)
  160.     if mesg~=nil and mesg~="" then
  161.         term.write("State: ")
  162.         coltex(gcs[mesg])
  163.         print(mesg)
  164.         coltex(colors.white)
  165.     else
  166.         print("State: Idle")
  167.     end
  168. end
  169.  
  170. local gwh={Outgoing=colors.blue, Incoming=colors.red}
  171. function prclwormhole(mesg)
  172.     if mesg~=nil and mesg~="" then
  173.         term.write("Direction: ")
  174.         coltex(gwh[mesg])
  175.         print(mesg)
  176.         coltex(colors.white)
  177.     else
  178.         term.write("Direction: ")
  179.         coltex(colors.green)
  180.         print("Closed")
  181.         coltex(colors.white)
  182.     end
  183. end
  184.  
  185. local giirriiss={Closed=colors.green, Closing=colors.lightBlue, Open=colors.blue, Opening=colors.lime, Offline=colors.yellow}
  186. function prcliris(mesg)
  187.     if mesg~=nil and mesg~="" then
  188.         term.write("Iris: ")
  189.         coltex(giirriiss[mesg])
  190.         print(mesg)
  191.         coltex(colors.white)
  192.     else
  193.         print("Iris: "..tostring(mesg))
  194.     end
  195. end
  196.  
  197. --local lincoming=nil
  198. --local loutgoing=nil
  199. --local lidle=true
  200. --local lwop=false
  201. --local lwos=false
  202. --local lwoc=false
  203. local lstate="idle"
  204. local lcs=colors.green
  205. local lwh="closed"
  206. local lcw=colors.green
  207. local lencoded=nil
  208. local liv=nil
  209. local loa=nil
  210.  
  211. function lloop() --LanteaCraft loop
  212.     local evt, earg = os.pullEvent()
  213.     if not sg.isDialing() then
  214.         lencoded=nil
  215.     end
  216.     if evt=="key" then
  217.         if earg==keys.d then
  218.             local h, j = term.getCursorPos()
  219.             print("Enter Address: ")
  220.             term.setCursorPos(1,j+2)
  221.             ltxt=slrd()
  222.             ok, result = pcall(sg.dial, ltxt)
  223.             if ok then
  224.                 print("dial "..ltxt.." now!")
  225.             else
  226.                 print("Dialling failed: "..result)
  227.                 sleep(3)
  228.             end
  229.         elseif earg==keys.b then
  230.             ltxt=selAddr()
  231.             if ltxt ~= nil then --Able to do?
  232.             ok, result = pcall(sg.dial, ltxt)
  233.             if ok then
  234.                 print("dial "..ltxt.." now!")
  235.             else
  236.                 print("Dialling failed: "..result)
  237.                 sleep(4)
  238.             end
  239.             else
  240.                 print("DialBook FAILED")
  241.                 sleep(0.4)
  242.             end
  243.         elseif earg==keys.c then
  244.             sg.disconnect()
  245.         elseif earg==keys.x then
  246.             running=false
  247.         end
  248.     elseif evt=="sgIncoming" then
  249.        lcs=colors.red
  250.        lstate="incoming from - "..earg
  251.     elseif evt=="sgOutgoing" then
  252.        lcs=colors.blue
  253.        lstate="outgoing to - "..earg
  254.     elseif evt=="sgChevronEncode" then
  255.        lencoded=earg
  256.     elseif evt=="sgIdle" then
  257.         if earg then
  258.             lcs=colors.green
  259.             lstate="idle"
  260.            
  261.             lcw=colors.green
  262.             lwh="closed"
  263.         end
  264.     elseif evt=="sgWormholeOpening" then
  265.         if earg then
  266.             lcw=colors.red
  267.             lwh="opening"
  268.         end
  269.     elseif evt=="sgWormholeClosing" then
  270.         if earg then
  271.             lcw=colors.yellow
  272.             lwh="closing"
  273.         end
  274.     elseif evt=="sgWormholeStable" then
  275.         if earg then
  276.             lcw=colors.blue
  277.             lwh="open"
  278.         end
  279.     elseif evt=="timer" and earg==rd_timeout then
  280.        rd_timeout = os.startTimer(LANTEA_REFRESHRATE)
  281.     end
  282.     lhf=sg.hasFuel()
  283.    
  284.     tclear()
  285.     coltex(colors.white)
  286.     term.write("State: ")
  287.     coltex(lcs)
  288.     print(lstate)
  289.     coltex(colors.white)
  290.     term.write("Wormhole: ")
  291.     coltex(lcw)
  292.     print(lwh)
  293.    
  294.     coltex(colors.white)
  295.     print()
  296.     print("LanteaCraft controller "..LANTEA_CONTROLLER_VERSION.." - address="..loa)
  297.     term.write("    ModVersion="..liv)
  298.     if lhf then
  299.        coltex(colors.green)
  300.        print(" (hasFuel=true)")
  301.        coltex(colors.white)
  302.     else
  303.        coltex(colors.red)
  304.        print(" (hasFuel=false)")
  305.        coltex(colors.white)
  306.     end
  307.    
  308.     if lencoded ~= nil then
  309.        print("encoded chevron "..tostring(lencoded))
  310.     end
  311.    
  312.     print("\nKeys: Dial (D), DialBook (B), Disconnect (C), Exit (X)")
  313. end
  314.  
  315. local gsc=nil
  316.  
  317. function checkmod(stbl) --write SGCraft boolean to gsc
  318.    gsc=(stbl.stargateState ~= nil)
  319. end
  320.  
  321. print("define utils")
  322.  
  323. local colsup=term.isColor()
  324. function coltex(col)
  325.     if colsup then
  326.         term.setTextColor(col)
  327.     end
  328. end
  329.  
  330. function PREflushX(inp)
  331.    if inp=="X" or inp=="x" then
  332.        error()
  333.    else
  334.        return inp
  335.    end
  336. end
  337.  
  338. function flushX(inp)
  339.    if inp=="X" or inp=="x" then
  340.        running=false
  341.    else
  342.        return inp
  343.    end
  344. end
  345.  
  346. function curpos(x,y)
  347.    term.setCursorPos(x, y+2)
  348. end
  349.  
  350. function slrd()
  351.     to_sluk=os.startTimer(0.1)
  352.     while true do
  353.         evrt = {os.pullEvent()}
  354.         --print(string.sub(evrt[1], 1, 2))
  355.         if evrt[1]=="timer" and evrt[2]==to_sluk then
  356.             return read()
  357.         --elseif evrt[1]=="key" then
  358.         --    evrt=nil --Ignore key
  359.         elseif string.sub(evrt[1], 1, 2)=="sg" then
  360.             --sleep(0.1)
  361.             os.queueEvent(unpack(evrt))
  362.         end
  363.     end
  364. end
  365.  
  366. function tclear()
  367.    term.clear()
  368.    term.setCursorPos(1,1)
  369.    print("SGctl ("..MAIN_VERSION..") -- by qwertz19281")
  370.    print("")
  371. end
  372.  
  373.  
  374.  
  375. -- Address Book
  376. -- Menu API provided by cyanisaac and ProjectB, licensed under the MIT license.
  377. -- Menu API provided by cyanisaac and ProjectB, licensed under the MIT license.
  378. -- Menu API provided by cyanisaac and ProjectB, licensed under the MIT license.
  379. local menuloaded=false
  380.  
  381. function forceLibLoaded()
  382.     if(not menuloaded) then
  383.         if(not fs.exists("sgctl_menu")) then--UK4ATXvH
  384.             shell.run("pastebin","get","UK4ATXvH","sgctl_menu")
  385.             if(not fs.exists("sgctl_menu")) then
  386.                 print("cyanisaac's basic menu API Download failed")
  387.                 print("Do you have the HTTP API enabled?")
  388.                 sleep(4)
  389.                 return
  390.             end
  391.         end
  392.         if((sgctl_menu ~= nil)) then
  393.             if((sgctl_menu.doMenu ~=nil)) then
  394.                 menuloaded=true
  395.                 return
  396.             else
  397.                 print("Something wrong with the menu api?")
  398.                 sleep(4)
  399.                 os.unloadAPI("sgctl_menu")
  400.                 os.loadAPI("sgctl_menu")
  401.             end
  402.         elseif((menuloaded)) then
  403.             print("Something wrong with the menu api?")
  404.             sleep(4)
  405.             os.unloadAPI("sgctl_menu")
  406.             os.loadAPI("sgctl_menu")
  407.         end
  408.        
  409.         os.loadAPI("sgctl_menu")
  410.     end
  411. end
  412.  
  413. local addrs=nil
  414.  
  415. function forceListLoaded()
  416.     if(addrN==nil) then
  417.         --Not loaded
  418.         if(fs.exists("sgctl_addr")) then
  419.             h=fs.open("sgctl_addr","r")
  420.             addrs=textutils.unserialize(h.readAll())
  421.             h.close()
  422.         else
  423.             addrs={{},{}}
  424.         end
  425.     end
  426. end
  427.  
  428. function writeList()
  429.     h=fs.open("sgctl_addr","w")
  430.     h.write(textutils.serialize(addrs))
  431.     h.close()
  432. end
  433.  
  434. function addAddr()
  435.     tclear()
  436.     print("Enter name: ")
  437.     name=read()
  438.     if(name=="Add" or name=="Delete" or name=="Cancel") then
  439.         print("Invalid name")
  440.         sleep(3)
  441.         return
  442.     end
  443.     print("Enter Address: ")
  444.     addr=read()
  445.     addrs[1][(#addrs[1])+1]=name
  446.     addrs[2][(#addrs[2])+1]=addr
  447.     writeList()
  448. end
  449.  
  450. function delete()
  451.     name=sgctl_menu.doMenu("Select address to DELETE",{"Cancel",unpack(addrs[1])})
  452.     if(name==1) then
  453.         return
  454.     end
  455.     tclear()
  456.     print("Do you really want to delete "..addrs[1][name-1].." ? write \"y\" to delete")
  457.     ans=read()
  458.     if(ans=="y") then
  459.         --OK. Now delete entry
  460.         table.remove(addrs[1], name-1)
  461.         table.remove(addrs[2], name-1)
  462.         writeList()
  463.     end
  464. end
  465.  
  466. function selAddr()
  467.     --Begin Selection Loop
  468.     forceLibLoaded()
  469.     forceListLoaded()
  470.     while true do
  471.         selid=sgctl_menu.doMenu("SGCtl Dial Book",{"Cancel","Add","Delete",unpack(addrs[1])})
  472.         if(selid==1) then
  473.             return nil
  474.         elseif(selid==2) then
  475.             addAddr()
  476.         elseif(selid==3) then
  477.             delete()
  478.         else
  479.             return addrs[2][selid-3]
  480.         end
  481.     end
  482. end
  483.  
  484.  
  485.  
  486. -- Main loop
  487.  
  488.  
  489. print("execute")
  490. print("search stargate")
  491. local sc = {peripheral.find("stargate")}
  492. local scn=1
  493. if sc==nil or #sc<1 then
  494.     print("ERROR: No stargate peripheral found!")
  495.     error()
  496. end
  497. if #sc > 1 then
  498.     selsolved=false
  499.     if args~=nil and #args>0 then
  500.         scn=tonumber(args[1])
  501.         if not (scn==nil or scn>#sc or scn<1) then
  502.             selsolved=true
  503.         end
  504.     end
  505.     if not selsolved then
  506.         tclear()
  507.         curpos(1, 1)
  508.         for i=1,#sc do
  509.             term.write("stargate_"..tostring(i)..": ")
  510.             if(sc[i].stargateState ~= nil) then
  511.                 print("SGCraft "..tostring(sc[i].localAddress()))
  512.             else
  513.                 print("LanteaCraft "..tostring(sc[i].getAddress()))
  514.             end
  515.         end
  516.         print("Please select one from "..tostring(#sc).." stargates! (X for exit)")
  517.         term.write("Enter Number: ")
  518.         scn=tonumber(PREflushX(slrd()))
  519.         while scn==nil or scn>#sc or scn<1 do
  520.             tclear()
  521.             print("NUMBER MALFORMED OR OUT OF BOUNDS!")
  522.             curpos(1, 2)
  523.             for i=1,#sc do
  524.                 term.write("stargate_"..tostring(i)..": ")
  525.                 if(sc[i].stargateState ~= nil) then
  526.                     print("SGCraft "..tostring(sc[i].localAddress()))
  527.                 else
  528.                     print("LanteaCraft "..tostring(sc[i].getAddress()))
  529.                 end
  530.             end
  531.             print("Please select one from "..tostring(#sc).." stargates! (type X for exit)")
  532.             term.write("Enter Number: ")
  533.             scn=tonumber(PREflushX(slrd()))
  534.         end
  535.     end
  536. end
  537. sg=sc[scn]
  538. checkmod(sg)
  539. running = true
  540. if not gsc then
  541.    loa=sg.getAddress()
  542.    liv=sg.getInterfaceVersion()
  543. end
  544. rd_timeout = os.startTimer(LANTEA_REFRESHRATE)
  545. while running do
  546.     if gsc then
  547.         gloop()
  548.     else
  549.         lloop()
  550.     end
  551. end
  552. term.clear()
  553. term.setCursorPos(1,1)
  554. print("SGctl exited")
RAW Paste Data