local component = require("component") local event = require("event") local term = require("term") local fs = require("filesystem") local gsm = require("gsm") local ini = require("ini") local addresses = {"АДРЕС ПК ДЛЯ ПИЧАТИ КАРТ", "АДРЕС БАНКОМАТА"} local DATA_RAID = "f45" local LISTEN_PORT = 812 local PAYMENT_IDENT = "4" local BANK_IDENT = "27630" term.clear() print("Банк-сервер запущен.") function check_luhn(number) local final_amount = 0 for i = 1, #number do if (i % 2) == 0 then final_amount = final_amount + number:sub(i, i) else if (number:sub(i, i) * 2) > 9 then final_amount = final_amount + (number:sub(i, i) * 2 - 9) else final_amount = final_amount + (number:sub(i, i) * 2) end end end if (final_amount % 10) == 0 then return true else return false end end function contains(array, element) for _, value in pairs(array) do if value == element then return true end end return false end function split(s, delimiter) result = {}; for match in (s..delimiter):gmatch("(.-)"..delimiter) do table.insert(result, match); end return result; end function handler() local request = gsm.listen(LISTEN_PORT) local data = split(request[5], ":") if data[1] == "new_card" then print("Запрос на регистрацию новой карты.") if contains(addresses, request[3]) then if #data == 2 then local number_card = PAYMENT_IDENT .. BANK_IDENT while true do for i = 1, 9 do number_card = number_card .. math.random(0, 9) end for i = 0, 9 do if check_luhn(number_card .. i) then number_card = number_card .. i break end end if not fs.exists("/mnt/" .. DATA_RAID .. "/cards/" .. number_card .. ".card") then break end end local CVC = math.random(100, 999) local PIN = math.random(1000, 9999) ini.saveFile("/mnt/" .. DATA_RAID .. "/cards/" .. number_card .. ".card", {number = number_card, owner = data[2], cvc = CVC, pin = PIN, balance = 0}) gsm.send(request[3], request[4], "success:" .. number_card .. ":" .. data[2] .. ":" .. CVC .. ":" .. PIN) else gsm.send(request[3], request[4], "invalid_structure") end end end if data[1] == "get_card" then print("Запрос на получение информации о карте.") if contains(addresses, request[3]) then if #data == 2 then if fs.exists("/mnt/" .. DATA_RAID .. "/cards/" .. data[2] .. ".card") then local card = ini.loadFile("/mnt/" .. DATA_RAID .. "/cards/" .. data[2] .. ".card") gsm.send(request[3], request[4], "success:" .. card["number"] .. ":" .. card["owner"] .. ":" .. card["cvc"] .. ":" .. card["balance"] .. ":" .. card["pin"]) else gsm.send(request[3], request[4], "card_not_found") end else gsm.send(request[3], request[4], "invalid_structure") end end end if data[1] == "deposit" then print("Запрос на депозит карты [ATM].") if contains(addresses, request[3]) then if #data == 3 then if fs.exists("/mnt/" .. DATA_RAID .. "/cards/" .. data[2] .. ".card") then local card = ini.loadFile("/mnt/" .. DATA_RAID .. "/cards/" .. data[2] .. ".card") card["balance"] = card["balance"] + data[3] ini.saveFile("/mnt/" .. DATA_RAID .. "/cards/" .. data[2] .. ".card", card) gsm.send(request[3], request[4], "success") else gsm.send(request[3], request[4], "card_not_found") end else gsm.send(request[3], request[4], "invalid_structure") end end end end while true do pcall(handler) end