Advertisement
Kodos

StarDial

Oct 5th, 2013
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --[[
  2. StarDial+ 1.0
  3. Made by: MudkipTheEpic and the helpful people on
  4. MudServ.
  5.  
  6. Commands:
  7. (all are prefixed with "$$")
  8. dial address OR registeredname (Connects the stargate to that address.)
  9. disconnect (Disconnects the stargate)
  10. register name address (Makes you be able yo use commands with that name instead of the address.)
  11. lockdown (Turns on the ability to disconnect all connections you didn't create.)
  12. unlock (Undoes lockdown)
  13. deregister name (Unregisters name)
  14. whitelist on (Only allows people you select to connect to you.)
  15. (NOTE: YOU can still dial to anyone.)
  16. whitelist off (Disables whitelist)
  17. whitelist add address OR name (Adds them to the whitelist)
  18. whitelist remove address OR name (Removes them from the whitelist)
  19.  
  20. Suggest more to add! Enjoy the program!
  21. -Mudkip
  22. --]]
  23.  
  24. local runShellInBackground=true --Set to false to have less lag, but no shell prompt.
  25. local disconnectSelf=false
  26. local function wrap(typ)
  27. for k,v in pairs(peripheral.getNames()) do
  28. if peripheral.getType(v)==typ then
  29.  return v
  30. end
  31. end
  32. return nil
  33. end
  34. local glasses=wrap("terminal_glasses_bridge")
  35. local stargate=wrap("stargate_base")
  36. if not (glasses and stargate) then
  37. error("StarDial+ needs a stargate and terminal glasses bridge to function.",0)
  38. end
  39.  
  40.  
  41.  
  42.  
  43.  
  44. local sg=peripheral.wrap(stargate)
  45. sg.isConnected=function() return not sg.getDialledAddress()=="" end
  46. sg.getDialedAddress=sg.getDialedAddress or sg.getDialledAddress
  47. sg.isInitiator=function() return peripheral.call(stargate,"isInitiator")=="true" end
  48. local displayExtra
  49. local _,address=pcall(peripheral.call,stargate,"getHomeAddress")
  50. local bridge=peripheral.wrap(glasses)
  51. bridge.clear()
  52. local l=bridge.addText(12,12,"Say $$dial (address) to dial.",0x000000)
  53. l.setScale(1.75)
  54. l.setColor(0x3366FF)
  55. --print()
  56. --print(l.getHeight)
  57. local h=bridge.addBox(1,1,45*6,36,0x999999,0.5)
  58. h.setZIndex(4)
  59. l.setZIndex(1)
  60. local registered={}
  61. if fs.exists(".register") then
  62. local l=fs.open(".register","r")
  63. registered=textutils.unserialize(l.readAll())
  64. l.close()
  65. end
  66. if not registered then fs.delete(".register") registered={} end
  67. local whitelist={enabled=false}
  68. if fs.exists(".whitelist") then
  69. local l=fs.open(".whitelist","r")
  70. whitelist=textutils.unserialize(l.readAll())
  71. l.close()
  72. end
  73. if not whitelist then fs.delete(".whitelist") whitelist={enabled=false} end
  74. --local function split(str,pat)
  75. --  local fpat="(.+)"..pat
  76. --  if not str:find(pat) then
  77. --    return {str}
  78. --  end
  79. --  local t={}
  80. --  for c in str:gmatch(fpat) do
  81. --    table.insert(t,c)
  82. --  end
  83. --  return t
  84. --end
  85. -- This might be easier
  86. local function split(str,pat)
  87. --  local fpat="(.+)"..pat -- lol we seem to have arrived at the exact same function :3 Meh ill leave it
  88.   local tArgs = {}
  89.   for _arg in str:gmatch("%S+") do -- Hmm, well try diff patterns, %w+ I'm sure has worked for me before though, although you can't change the deliminator. Thats easy then
  90.     table.insert(tArgs, _arg)
  91.   end
  92.   return tArgs
  93. end
  94.  
  95. local displayT={}
  96. local function disconnect(t) t=t or 2 local ok = pcall(peripheral.call,stargate,"disconnect") and t~=0 and displayExtra("Disconnected from gate.",t) end
  97. local function connect(address) local e= pcall(peripheral.call,stargate,"connect",address) if e then displayExtra("Connected succesfully.") else displayExtra("Could not connect.") end return e end
  98. local function startsWith(str,pre) return str:sub(1,#pre)==pre end
  99. local function saveRegister() local l=fs.open(".register","w") l.write(textutils.serialize(registered)) l.close() return true end
  100. local function getName(address) local l=nil for k,v in pairs(registered) do if v==address then l=k break end end return l end
  101. local function saveWhitelist() local l=fs.open(".whitelist","w") l.write(textutils.serialize(whitelist)) l.close() return true end
  102. function displayExtra(text,time)
  103. table.insert(displayT,{text,time})
  104. os.queueEvent("display")
  105. end
  106. local updateDisplay=displayExtra
  107.  
  108. function display(text,time)
  109.   if time and time<0.05 then return end
  110.   time=time or 2
  111.   for i=1,16 do h.setHeight(36+i) sleep(0.05) end
  112.   local extra=bridge.addText(1,42,text,0x00CCFF)
  113.   extra.setScale(1)
  114.   sleep(time)
  115.   extra.delete()
  116.   for i=1,16 do h.setHeight(52-i) sleep(0.05) end
  117.   return true
  118. end
  119.  
  120. local commandTable={
  121.   dial=function(address)
  122.   disconnect(0)
  123.   sleep(1)
  124.     return connect(registered[address] or address)
  125.   end,
  126.   whitelist=function(cmd,opt)
  127.   if opt then opt=registered[opt] or opt end
  128.   if cmd=="on" then
  129.   if whitelist["enabled"] then displayExtra("Already whitelisted.") else displayExtra("Whitelist on.") whitelist.enabled=true end
  130.   elseif cmd=="off" then
  131.   if not whitelist.enabled then displayExtra("Already disabled.") else displayExtra("Unwhitelisting...") whitelist.enabled=false end
  132.   elseif cmd=="add" and opt then
  133.   whitelist[opt]=true
  134.   displayExtra("Added "..opt.." to whitelist.")
  135.   elseif cmd=="remove" and opt then
  136.   whitelist[opt]=false
  137.   displayExtra("Removed "..opt.."from the whitelist.")
  138.   end
  139.   end,
  140.   disconnect=function()
  141.     if sg.getDialledAddress()=="" and not sg.isInitiator() then disconnected=true
  142.     elseif sg.getDialledAddress()=="" then displayExtra("Already disconnected.") return false end
  143.     disconnect(0)
  144.   end,
  145.   register=function(name,address)
  146.     registered[name]=address
  147.     saveRegister()
  148.     displayExtra("Registered "..name.." as "..address..".")
  149.     return name
  150.   end,
  151.   lockdown=function()
  152.   if not locked then
  153.     displayExtra("Locked down.")
  154.     locked=true
  155.   else
  156.     displayExtra("Already locked.")
  157.   end
  158.   end,  
  159.   unlock=function()
  160.   if locked then
  161.     displayExtra("Unlocking...")
  162.     locked=false
  163.   else
  164.     displayExtra("Already unlocked.")
  165.   end
  166.   end,
  167.   deregister=function(name)
  168.     registered[name]=nil
  169.     saveRegister()
  170.     displayExtra("Deregistered "..name..".")
  171.     return name
  172.   end,
  173.   address=function(name)
  174.     if not name then return displayExtra(address)
  175.     else
  176.     return displayExtra("Address for "..name.." is "..(registered[name] or "[NONE]"))
  177.   end
  178.   end
  179. }
  180.  
  181. local function doRequests()
  182. while true do
  183. local e,command=os.pullEvent("chat_command")
  184. local rCom
  185. for k,v in pairs(commandTable) do if k==command or startsWith(command,k.." ") then rCom=v break end end
  186. if not rCom then displayExtra("Unknown command: "..command)
  187. else
  188. --this is what im doing now, dont be scared
  189. --print(table.concat(split(command),":"))
  190. --print(rCom)
  191. local test,err=pcall(rCom,select(2,unpack(split(command," "))))
  192. if not test then pcall(displayExtra,"Error: "..err) end
  193. saveRegister()
  194. saveWhitelist()
  195. end
  196. end
  197. end
  198.  
  199. local function doConnections()
  200.   local enabled = "enabled"
  201.   local connected = nil
  202.   while true do
  203.  
  204.     --//is the dialed address an empty string
  205.     --print("Dialled Address: "..tostring(sg.getDialedAddress() ~= ""))
  206.    
  207.     --//if you dialed them
  208.    -- print("Initiator: "..tostring(sg.isInitiator()))
  209.     --[[Hope this helps you]]--
  210.    
  211.     if sg.getDialledAddress() ~= "" and not sg.isInitiator() and connected ~= sg.getDialedAddress() then
  212.       --print("HAI")
  213.       local address = sg.getDialedAddress()
  214.       if locked and not sg.isInitiator() then
  215.         sg.disconnect()
  216.       elseif whitelist[enabled] and not whitelist[sg.getDialedAddress()] and not sg.isInitiator() then
  217.         updateDisplay("Disconnecting unwhitelisted address: "..(getName(address) or sg.getDialedAddress()))
  218.         sg.disconnect()
  219.       elseif whitelist[enabled] and whitelist[sg.getDialedAddress()] and not sg.isInitiator() then
  220.         updateDisplay("Whitelisted address connected: "..(getName(address) or address))
  221.       elseif not sg.isInitiator() then
  222.         updateDisplay("Connected: "..(getName(address) or address))
  223.       end
  224.       connected = address
  225.     elseif  sg.getDialledAddress()=="" and connected~="" and not disconnected then if connected then updateDisplay("Disconnected from "..(getName(connected) or connected)) end connected=""
  226.     elseif disconnected then connected="" disconnected=false
  227.     end
  228.     sleep(0.2)
  229.   end
  230. end
  231.  
  232. local function update()
  233. while true do
  234. sleep(0.5)
  235. if #displayT>0 then
  236. local msg,time=unpack(table.remove(displayT,1))
  237. display(msg,tme)
  238. end
  239. end
  240. end
  241. if runShellInBackground then
  242. shell.exit()
  243. term.clear()
  244. term.setCursorPos(1,1)
  245. print("StarDial+ running.")
  246. xpcall(function() return parallel.waitForAny(doRequests,doConnections,update,loadfile("rom/programs/shell")) end,printError)
  247. else
  248. xpcall(function() return parallel.waitForAny(doRequests,doConnections,update) end,printError)
  249. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement