Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local sensor = require("component").motion_sensor
- local redstone = require("component").redstone
- local event = require("event")
- local term = require("term")
- local thread = require("thread")
- local fs = require("filesystem")
- local serialization = require("serialization")
- local shell = require("shell")
- dataPath = fs.concat(shell.getWorkingDirectory() .. "/" .. "data-motion.dat")
- history = {}
- users = {}
- eventThread = nil
- passive = false
- alerted = false
- sensor.setSensitivity(0.2)
- -- Load data
- if (fs.exists(dataPath)) then
- local dataFile = io.open(dataPath, "r")
- users = serialization.unserialize(dataFile:read("*a"))
- dataFile:close()
- end
- function hasName(name)
- for i, v in ipairs(users) do
- if v.name == name then
- return true
- end
- end
- return false
- end
- function indexName(name)
- for i, v in ipairs(users) do
- if v.name == name then
- return i
- end
- end
- end
- function clean(table)
- local result = {}
- for _, v in pairs(table) do
- result[#result + 1] = v
- end
- return result
- end
- function alert()
- term.write("ALERT\n")
- redstone.setOutput({15, 15, 15, 15, 15, 15})
- alerted = true
- end
- function unalert()
- term.write("UNALERT\n")
- redstone.setOutput({0, 0, 0, 0, 0, 0})
- alerted = false
- end
- function getPrompt()
- return "motion> "
- end
- function promptMode()
- term.write("Prompt Mode\n")
- if (eventThread ~= nil) then
- eventThread:kill()
- end
- passive = false
- end
- function passiveMode()
- term.write("Passive Mode\nPress enter to return\nPress space to toggle alert\n")
- eventThread = thread.create(function()
- while true do
- local _, _, x, y, z, name = event.pull("motion")
- if (not hasName(name)) then
- term.write("MOTION: " .. name .. " @ (" .. x .. ", " .. y .. ", " .. z .. ")\n")
- if (not alerted) then
- alert()
- end
- end
- end
- end)
- passive = true
- end
- commands = {
- ["exit"] = {
- description = "Exits the shell.",
- usage = "",
- func = function(args)
- return false
- end
- },
- ["help"] = {
- description = "Shows the help menu.",
- usage = "",
- func = function(args)
- term.write(#commands)
- for k, v in ipairs(commands) do
- term.write(k .. ":\n")
- term.write(" " .. v["description"] .. "\n")
- term.write(" Usage: " .. k .. " " .. v["usage"] .. "\n")
- end
- return true
- end
- },
- ["listuser"] = {
- description = "Lists all registered users.",
- usage = "",
- func = function(args)
- for k, v in ipairs(users) do
- term.write(" " .. v.name .. "\n")
- end
- term.write("Allowed users: " .. #users .. "\n")
- return true
- end
- },
- ["adduser"] = {
- description = "Adds a user.",
- usage = "<username>",
- func = function(args)
- if #args <= 1 then
- term.write("Usage: " .. args[1] .. " <username>\n")
- return true
- end
- local username = args[2]
- if (hasName(username)) then
- term.write("User is already registered\n")
- else
- table.insert(users, { name = username })
- end
- return true
- end
- },
- ["deluser"] = {
- description = "Deletes a user.",
- usage = "<username>",
- func = function(args)
- if #args <= 1 then
- term.write("Usage: " .. args[1] .. " <username>\n")
- return true
- end
- local username = args[2]
- local i = indexName(username)
- if (i) then
- users[i] = nil
- users = clean(users)
- else
- term.write("User is not registered\n")
- end
- return true
- end
- },
- ["alert"] = {
- description = "Activates the alert.",
- usage = "",
- func = function(args)
- alert()
- return true
- end
- },
- ["unalert"] = {
- description = "Deactivates the alert.",
- usage = "",
- func = function(args)
- unalert()
- return true
- end
- },
- ["passive"] = {
- description = "Changes into passive mode.",
- usage = "",
- func = function(args)
- passiveMode()
- return true
- end
- }
- }
- function runCommand(cmd)
- local args = {}
- for arg in cmd:gmatch("%S+") do
- table.insert(args, arg)
- end
- if #args == 0 then
- return true
- end
- local name = args[1]
- local command = commands[name]
- if (command) then
- local func = command.func
- return func(args)
- else
- term.write("Invalid command. Use 'help' to list all commands.\n")
- return true
- end
- end
- promptMode()
- while true do
- if (passive) then
- local _, _, char = event.pull("key_down")
- if (char == 13) then
- promptMode()
- goto continue
- elseif (char == 32) then
- if (alerted) then
- unalert()
- else
- alert()
- end
- end
- else
- term.write(getPrompt())
- local input = term.read(history)
- input = input:sub(1, -2)
- if (not runCommand(input)) then
- break
- end
- end
- ::continue::
- end
- -- Save data
- local dataFile = io.open(dataPath, "w")
- dataFile:write(serialization.serialize(users))
- dataFile:close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement