View difference between Paste ID: eGH2QWTS and rChVHKss
SHOW: | | - or go back to the newest paste.
1
--- Turret Control
2
-- Helps manage OpenModularTurrets turret blocks that have serial IO
3
-- @Author: Brodur
4
-- @Version: 2.3
5
-- @Requires:
6
-- https://pastebin.com/WvF00A71 : JSON Utility functions
7
-- https://pastebin.com/pLpe4zPb : Menu functions
8
-- https://pastebin.com/SKwM2UZH : Lua JSON Library
9
10
local term = require("term")
11
local component = require("component")
12
local event = require("event")
13
local json = require("json")
14
local menu = require("menu")
15
local jsonutil = require("jsonutil")
16
local fs = require("filesystem")
17
18
local m = {}
19
local tb = "turret_base"
20
local lb = "-------------------------------"
21
22
local mmopts = {
23
  "Summary",
24
  "Targeting",
25
  "User Admin",
26
  "Push Config",
27
  "Exit"
28
}
29
30
local db = {}
31
local toRemove = {}
32
local jsondir = "/home/settings.json"
33
34
--- Trims strings
35
-- Gets rid of trailing white space or special characters.
36
-- @param s The string to trim.
37
-- @return The trimmed string.
38
function trim(s)
39
   return (s:gsub("^%s*(.-)%s*$", "%1"))
40
end
41
42
--- Summary output
43
-- Outputs the summary of a selected turret.
44
function m.summary()
45
  term.setCursor(1,1)
46
  print(mmopts[1] .. "\n")
47
  print("Trusted players")
48
  print(lb)
49
50
  for k,v in pairs(db.users) do
51
    print(" - " .. k, v and "[Admin]" or "[Trusted]")
52
  end
53
  print("\nAttacks")
54
  print(lb)
55
  print("Mobs:\t\t" .. tostring(db.targets.setAttacksMobs))
56
  print("Neutrals:\t" .. tostring(db.targets.setAttacksNeutrals))
57
  print("Players:\t" .. tostring(db.targets.setAttacksPlayers))
58
59
  print("\n\nPress enter to continue...")
60
  term.read()
61
end
62
63
--- Set Attack
64
-- Sets the attack setting for all turrets.
65
-- @param flag   	1 or 2, corresponds to true or false, toggles the attack mode.
66
-- @param option	Which option was chosen in the target function
67
function m.setAttack(flag, option)
68
local methods = {"setAttacksMobs", "setAttacksNeutrals", "setAttacksPlayers"}
69
  local arguments = {true, false}
70
  db.targets[methods[option]] = arguments[flag]
71
  db.hasChanges = true
72
end
73
74
---Target
75
-- Selects the targeting parameter
76
function m.target()
77
  local options = {"Attack Mobs", "Attack Neutrals", "Attack Players", "Exit"}
78
  local opt = -1
79
  while opt ~= #options do  
80
    opt = menu.list(options, mmopts[2])
81
    if opt ~= #options then 
82
      local flag = menu.dialog(options[opt], "True", "False")
83
      m.setAttack(flag, opt)
84
    else break end
85
  end
86
end
87
88
--- Add Trusted Player
89
-- Adds a trusted player to all turrets, either with or without admin privileges.
90
-- @param player	The player to add.
91
-- @param usrType	1 for trusted, 2 for admin.
92
function m.addTrustedPlayer(player, usrType)
93
  local args = {false, true}
94
  for k,_ in pairs(db.users) do
95
    if player == k then error("Cannot add a user that already exists!") end
96
  end
97
  db.users[player] = args[usrType] 
98
  db.hasChanges = true
99
end
100
101
--- Remove Trusted Player
102
-- Removes a user from the trusted players list.
103
-- @param player  The user to remove.
104
function m.removeTrustedPlayer(player)
105
  toRemove[#toRemove+1] = player
106
  db.users[player] = nil
107
  db.hasChanges = true
108
end
109
110
--- Users
111
-- Launches the add or remove user dialog
112
function m.users()
113
  local options = {"Add a trusted user", "Remove a trused user","Exit"}
114
  local opt = -1
115
  while opt ~= #options do
116
    opt = menu.list(options, mmopts[3])
117
    if opt == 1 then 
118
      local userTypes = {"Trusted", "Admin"}
119
      term.write("Add a trusted player: ")
120
      local player  = trim(term.read())
121
      local usrType = menu.dialog("User or Admin?", "User", "Admin")
122
      local opt = menu.dialog("Add \'" .. player .. "\' as " .. userTypes[usrType] .." type user?", "Confirm", "Cancel")
123
      if opt == 1 then
124
        m.addTrustedPlayer(player, usrType)
125
      end
126
    end
127
    if opt == 2 then
128
      local users = {"Cancel"}
129
      for k,v in pairs(db.users) do users[#users+1] = k end
130
      local user = -1
131
      while user ~= 1 do
132
        user = menu.list(users, "Select a user")
133
        if user ~= 1 then
134
          local player = users[user]
135
          local confirm = menu.dialog("Remove \'" .. player .. "\' from trusted users?", "Confirm", "Cancel")
136
          if confirm == 1 then 
137
            m.removeTrustedPlayer(player)
138
            table.remove(users, user)
139
          end
140
        end
141
      end
142
    end
143
  end
144
end
145
146
--- Distribute Json
147
-- Disseminates the settings from the database to all turrets.
148
function m.distribJson()
149
  for _,v in pairs(db.turrets) do
150
    for _,player in pairs(toRemove) do
151
      component.invoke(v, "removeTrustedPlayer", player)
152
    end
153
154
  	for user,priv in pairs(db.users) do
155
      component.invoke(v, "addTrustedPlayer", user, priv)
156
  	end
157
    for meth,bool in pairs(db.targets) do
158
      component.invoke(v, meth, bool)
159
    end
160
  end
161
  toRemove= {}
162
end
163
164
--- Sub menu
165
-- Determines which menu function to call.
166
-- @param index The selected index in the main menu options table.
167
function m.subMenu(index)
168
  local turrets = {}
169
  for k in pairs(component.list(tb)) do turrets[#turrets+1] = k end 
170
  db.turrets = turrets
171
172
  if index == mmopts[1] then m.summary() end
173
  if index == mmopts[2] then m.target() end
174
  if index == mmopts[3] then m.users() end
175
  if index == mmopts[4] then m.distribJson() end
176
end     
177
178
--- On Load
179
-- Initializes the database and grabs the initial turrets.
180
function m.onLoad()
181
  if not fs.exists(jsondir) then 
182
    db = {
183
		hasChanges=false,
184
		targets={setAttacksMobs=false,
185
				 setAttacksNeutrals=false,
186
				 setAttacksPlayers=false
187
				},
188
		turrets = {},
189
		users = {}
190
	}
191
	jsonutil.save(db, jsondir)
192
  end
193
					
194
  db = jsonutil.load(jsondir)
195
  for k in pairs(component.list(tb)) do db.turrets[#db.turrets+1] = k end
196
  m.main()
197
end
198
199
--- Main
200
-- Launches the main logic and displays the top level menu.
201
function m.main()
202
  local mmoptTitle = "Main Menu"
203
  local mmopt = -1 
204
205
  while mmopt ~= #mmopts do
206
    if db.hasChanges then
207
      jsonutil.save(db, jsondir)
208
      db.hasChanges = false
209
      m.distribJson()
210
    end
211
    if mmopt ~= #mmopts then
212
      mmopt = menu.list(mmopts, mmoptTitle)
213
      m.subMenu(mmopts[mmopt])
214
    end
215
  end
216
end
217
218
--- On Component Added
219
-- Push the stored config when a new turret is detected.
220
-- @param eventType	The type of event, passed by event listener.
221
-- @param address	The hardware address of the new component.
222
-- @param componentType 	The type of the new component.
223
-- @todo figure out why the event listener is not firing all of the time, until that is figured disregard this function
224
-- function onComponentAdded(eventType, address, componentType)
225
--   if componentType == "turret_base" then
226
--     distribJson()
227
--   end
228
-- end
229
230
-- event.listen("component_added", onComponentAdded)
231
m.onLoad()
232
return m