View difference between Paste ID: QFukngSR and ykcGc16C
SHOW: | | - or go back to the newest paste.
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-
if _G.isRunning then return false end
24+
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 connect(address) local e,err= pcall(peripheral.call,stargate,"connect",address:upper()) if e then displayExtra("Connected succesfully.") else displayExtra("Could not connect: "..tostring(err)) end return e end
98+
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 getName(address) local l=address:upper() for k,v in pairs(registered) do if v==address then l=k:upper() break end end return l end
101+
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-
    return connect(registered[address:upper()] or address:upper())
125+
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-
  whitelist[opt:upper()]=true
134+
135
  elseif cmd=="remove" and opt then
136
  whitelist[opt]=false
137-
  whitelist[opt:upper()]=false
137+
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-
    registered[name]=address:upper()
147+
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-
_G.isRunning=true
243+
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