Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local force_modem_side = nil
- local whitelist_file_name = "whitelist"
- local blacklist_file_name = "blacklist"
- ------------------------------------------
- local args = { ... }
- -- Error searching and args sorting
- local numbers = { }
- local fileName = false
- do
- check_number = function(str)
- return tonumber(str) ~= nil
- end
- local usage = function(bool)
- if not bool then
- printError("spy <Port>")
- printError("spy <Port> <Filename>")
- printError("spy <Port> <Port2> ...")
- printError("spy <Port> <Port2> ... <Filename>")
- printError("spy <Portstart> - <Portend>")
- printError("spy <Portstart> - <Portend> <Filename>")
- print("")
- error("Create a blacklist or whitelist file to filter messages", 0)
- end
- end
- if #args == 1 then
- usage(check_number(args[1]))
- table.insert(numbers, tonumber(args[1]))
- elseif #args == 2 then
- usage(check_number(args[1]))
- table.insert(numbers, tonumber(args[1]))
- if check_number(args[2]) then
- table.insert(numbers, tonumber(args[2]))
- else
- fileName = args[2]
- end
- elseif #args == 3 then
- if args[2] == "-" then
- usage(check_number(args[1]))
- usage(check_number(args[3]))
- usage(args[1] <= args[3])
- for i=tonumber(args[1]), tonumber(args[3]) do
- table.insert(numbers, i)
- end
- else
- if check_number(args[3]) then
- table.insert(numbers, tonumber(args[3]))
- else
- fileName = args[3]
- end
- usage(check_number(args[1]))
- usage(check_number(args[2]))
- table.insert(numbers, tonumber(args[1]))
- table.insert(numbers, tonumber(args[2]))
- end
- elseif #args == 4 then
- if args[2] == "-" then
- usage(check_number(args[1]))
- usage(check_number(args[3]))
- usage(not check_number(args[4]))
- usage(args[1] <= args[3])
- for i=tonumber(args[1]), tonumber(args[3]) do
- table.insert(numbers, i)
- end
- fileName = args[4]
- else
- if check_number(args[4]) then
- table.insert(numbers, tonumber(args[4]))
- else
- fileName = args[4]
- end
- usage(check_number(args[1]))
- usage(check_number(args[2]))
- usage(check_number(args[3]))
- table.insert(numbers, tonumber(args[1]))
- table.insert(numbers, tonumber(args[2]))
- table.insert(numbers, tonumber(args[3]))
- end
- elseif #args > 4 then
- if check_number(args[#args]) then
- for i, v in pairs(args) do
- usage(check_number(v))
- table.insert(numbers, tonumber(v))
- end
- else
- for i, v in pairs(args) do
- if i ~= #args then
- usage(check_number(v))
- table.insert(numbers, tonumber(v))
- else
- fileName = v
- end
- end
- end
- else -- 0
- usage()
- end
- if #numbers > 128 then
- printError("Max 128 Ports can be opened at the same time")
- print("")
- usage()
- end
- end
- -- Loading Filter
- local filter = {
- blacklist = { },
- whitelist = { }
- }
- local bblacklist = false
- local bwhitelist = false
- do
- if fs.exists(blacklist_file_name) then
- bblacklist = true
- local file = fs.open(blacklist_file_name, "r")
- local blacklist_raw = file.readAll()
- file.close()
- for i in blacklist_raw:gmatch("[%a%c%d]+") do
- table.insert(filter.blacklist, i)
- end
- end
- if fs.exists(whitelist_file_name) then
- bwhitelist = true
- local file = fs.open(whitelist_file_name, "r")
- local whitelist_raw = file.readAll()
- file.close()
- for i in whitelist_raw:gmatch("[%a%c%d]+") do
- table.insert(filter.whitelist, i)
- end
- end
- end
- -- Checking for Modem
- local modem = false
- do
- if force_modem_side then
- if peripheral.getType(force_modem_side) == "modem" then
- modem = peripheral.wrap(force_modem_side)
- else
- error("Forced modem doesnt exist", 0)
- end
- else
- local side = peripheral.getNames()
- for i, v in pairs(side) do
- if peripheral.getType(v) == "modem" then
- modem = peripheral.wrap(v)
- end
- end
- if not modem then
- error("Modem expected", 0)
- end
- end
- end
- -- Closing ports and open new
- modem.closeAll()
- for i, v in pairs(numbers) do
- modem.open(v)
- end
- -- Creating new pullEvent for parallel running
- DONT_CHANGE = function(t)
- local _str = ""
- for i, v in pairs(t) do
- if type(v) == "string" or type(v) == "number" then
- _str = _str..i..": "..v.." | "
- elseif type(v) == "table" then
- _str = _str..DONT_CHANGE(v)
- end
- end
- return _str
- end
- local create_string = function(tEvent)
- local str = ""
- str = tEvent[4] and str.."SENDER: "..tEvent[4].." | " or str
- str = tEvent[3] and str.."RECEIVER: "..tEvent[3].." | " or str
- str = tEvent[6] and str.."Range: "..tEvent[6].." | " or str
- if type(tEvent[5]) == "table" then
- tev = tEvent
- str = str..DONT_CHANGE(tEvent[5])
- if tEvent[5]["nMessageID"] then oldMessageID = tEvent[5].nMessageID end
- end
- return str
- end
- local native_pullEvent = os.pullEventRaw
- oldMessageID = 0
- os.pullEventRaw = function(...)
- local tEvent = { native_pullEvent(...) }
- if tEvent[1] == "modem_message" then
- if type(tEvent[5]) == "table" then
- if oldMessageID == tEvent[5].nMessageID then
- return table.unpack(tEvent)
- end
- end
- local str = create_string(tEvent)
- if bblacklist then
- for i, v in pairs(filter.blacklist) do
- if str:find(v) then
- return table.unpack(tEvent)
- end
- end
- end
- if bwhitelist then
- local bExit = true
- for i, v in pairs(filter.whitelist) do
- if str:find(v) then
- bExit = false
- end
- end
- if bExit then
- return table.unpack(tEvent)
- end
- end
- tev = tEvent
- if fileName then
- local file = fs.open(fileName, "a")
- file.writeLine(str)
- file.close()
- else
- print(str)
- end
- end
- return table.unpack(tEvent)
- end
Add Comment
Please, Sign In to add comment