Compare commits

...
5 Commits
Author SHA1 Message Date
minecartchris 8641697b4a Add wirelessCode/ccryptolib.md 2026-02-07 16:56:13 -06:00
minecartchris 7a5cca28b1 Add wirelessCode/wireless.lua 2026-02-07 16:55:07 -06:00
minecartchris eaedfdf5b9 Add wirelessCode/Slot.lua 2026-02-07 16:53:36 -06:00
minecartchris 4aee1a174c Update prog2/slotV2.lua 2026-02-02 15:54:41 -06:00
Herr Katze b9db35ec9c Fix crash with nil messages 2026-02-01 16:32:03 -08:00
6 changed files with 287 additions and 35 deletions
+5
View File
@@ -24,6 +24,11 @@ local function interactWithCard(userUUID, mode, money)
sleep(30) sleep(30)
--shell.run("reboot") --shell.run("reboot")
end end
if not message then
print("WTF!? I got a rednet message with no data!?")
print("Rebooting...")
sleep(5)
end
if message.type == "account_data" and message.cardId == cardUUID then if message.type == "account_data" and message.cardId == cardUUID then
local money = message.balance local money = message.balance
local playerUUID = message.uuid local playerUUID = message.uuid
+13 -7
View File
@@ -3,12 +3,12 @@
rednet.open("back") rednet.open("back")
local function interactWithCard(userUUID, mode, money) local function interactWithCard(userUUID, mode, money)
if mode == "updateBalance" then if mode == "updateBalance" then
rednet.broadcast({ rednet.broadcast({
uuid = userUUID, uuid = userUUID,
amount = money, amount = money,
type = "set" type = "set"
}, "machineBalanceModifier") }, "machineBalanceModifier")
end end
if mode == "getBalance" then if mode == "getBalance" then
@@ -25,6 +25,11 @@ local function interactWithCard(userUUID, mode, money)
sleep(30) sleep(30)
--shell.run("reboot") --shell.run("reboot")
end end
if not message then
print("WTF!? I got a rednet message with no data!?")
print("Rebooting...")
sleep(5)
end
if message.type == "account_data" and message.cardId == cardUUID then if message.type == "account_data" and message.cardId == cardUUID then
local money = message.balance local money = message.balance
local playerUUID = message.uuid local playerUUID = message.uuid
@@ -37,6 +42,7 @@ local function interactWithCard(userUUID, mode, money)
end end
sleep(0.25) sleep(0.25)
nfc = peripheral.wrap("bottom") nfc = peripheral.wrap("bottom")
@@ -120,4 +126,4 @@ h.write(house)
h.close() h.close()
--print("If removing your card do it now") --print("If removing your card do it now")
sleep(2) sleep(2)
os.reboot() os.reboot()
+36 -28
View File
@@ -1,40 +1,47 @@
--slot2 --slot2
rednet.open("back") rednet.open("back")
local function interactWithCard(userUUID, mode, money) local function interactWithCard(userUUID, mode, money)
if mode == "updateBalance" then if mode == "updateBalance" then
rednet.broadcast({ rednet.broadcast({
uuid = userUUID, uuid = userUUID,
amount = money, amount = money,
type = "set" type = "set"
}, "machineBalanceModifier") }, "machineBalanceModifier")
end end
if mode == "getBalance" then if mode == "getBalance" then
local _, _, cardUUID = os.pullEvent("nfc_data") local _, _, cardUUID = os.pullEvent("nfc_data")
rednet.broadcast({ rednet.broadcast({
card = cardUUID card = cardUUID
}, "getAccountData") }, "getAccountData")
while true do while true do
local id, message = rednet.receive("server_response", 10) local id, message = rednet.receive("server_response", 10)
if not id then if not id then
print("the server is down") print("the server is down")
print("please ping @minecartchris") print("please ping @minecartchris")
sleep(30) sleep(30)
--shell.run("reboot") --shell.run("reboot")
end end
if message.type == "account_data" and message.cardId == cardUUID then if not message then
local money = message.balance print("WTF!? I got a rednet message with no data!?")
local playerUUID = message.uuid print("Rebooting...")
local username = message.username sleep(5)
return money, playerUUID, username end
end if message.type == "account_data" and message.cardId == cardUUID then
local money = message.balance
local playerUUID = message.uuid
local username = message.username
return money, playerUUID, username
end
end
end end
end
end end
os.pullEvent= function(...) os.pullEvent= function(...)
while true do while true do
local t = table.pack(os.pullEventRaw(...)) local t = table.pack(os.pullEventRaw(...))
@@ -132,6 +139,7 @@ local function run()
local bet_input = tonumber(input("Bet: ")) local bet_input = tonumber(input("Bet: "))
if money < bet_input then if money < bet_input then
print("please get more money or bet less as you can't bet more then you have") print("please get more money or bet less as you can't bet more then you have")
return
end end
local final = draw() local final = draw()
local current = {nil, nil, nil} local current = {nil, nil, nil}
@@ -163,4 +171,4 @@ end
shell.execute("clear") shell.execute("clear")
while true do while true do
run() run()
end end
+114
View File
@@ -0,0 +1,114 @@
local wireless = require("wireless")
os.pullEvent= function(...)
while true do
local t = table.pack(os.pullEventRaw(...))
if t[1] ~= "terminate" then
return table.unpack(t,1,t.n)
end
end
end
local function interactWithCard(userUUID, mode, money)
if mode == "updateBalance" then
wireless.broadcast({
uuid = userUUID,
amount = money,
type = "set"
}, "machineBalanceModifier")
end
if mode == "getBalance" then
local _, _, cardUUID = os.pullEvent("nfc_data")
wireless.broadcast({
card = cardUUID
}, "getAccountData")
while true do
local id, message = wireless.receive("server_response", 10)
if not id then
print("the server is down")
print("please ping @minecartchris")
sleep(30)
--shell.run("reboot")
end
if not message then
print("WTF!? I got a rednet message with no data!?")
print("Rebooting...")
sleep(5)
end
if message.type == "account_data" and message.cardId == cardUUID then
local money = message.balance
local playerUUID = message.uuid
local username = message.username
return money, playerUUID, username
end
end
end
end
sleep(0.25)
nfc = peripheral.wrap("bottom")
if fs.exists("/disk/terminate") then
error("Service mode active",2)
end
modem = peripheral.wrap("back")
shell.run("clear all")
--while not fs.exists("/disk2/money.lua") do
--sleep(0.75)
--print("You do not have a card inserted")
--sleep(2)
--shell.run("clear all")
--end
--print("Please do not remove your card from the drive during games")
local money = " "
local winner = false
local randnum = 0
local bet = 0
--local money2 = fs.open("/disk2/money.lua", "r")
print("Welcome to the Slot Machine!")
print("Please swipe your card to begin")
--local _, _, userUUID = os.pullEvent("nfc_data")
money, playerUUID, username = interactWithCard(nil, "getBalance", nil)
--money2.close()
print("Welcome "..tostring(username))
print("$",money)
money = tonumber(money)
print("what is your bet?")
bet = tonumber(io.read())
print("what is your guess 1 to 15?")
userGess = tonumber(io.read())
if not bet or bet > money or bet < 0 then
print("You do not have enough funds or did not enter a bet.")
sleep(3)
shell.run("reboot")
end
randnum = tonumber(math.random(0, 14) + 1)
if userGess == randnum then
winner = true
end
if not winner then
print("you lost ;(")
print("The correct number was", randnum)
money = money - bet
print("you have $",money, "left over")
interactWithCard(playerUUID, "updateBalance", money)
end
if winner then
bet = bet * 2
money = bet + money
print("You win!!!!!")
print("You now have $", money)
interactWithCard(playerUUID, "updateBalance", money)
end
sleep(2)
os.reboot()
+1
View File
@@ -0,0 +1 @@
https://github.com/migeyel/ccryptolib/tree/main/ccryptolib
+118
View File
@@ -0,0 +1,118 @@
local key = ""
local wirelessChannel = 44385
local wirelessModem = assert(peripheral.wrap("top"))
wirelessModem.open(wirelessChannel)
local random = require("ccryptolib.random")
local aead = require("ccryptolib.aead")
local seed = ""
-- this isnt exactly secure, but its fine, probably..
for i=1,64 do
seed = seed .. string.char(math.random(0, 255))
end
random.init(seed)
local function encrypt(message)
local nonce = random.random(12)
local ciphertext, tag = aead.encrypt(key, nonce, message, "")
return nonce..tag..ciphertext
end
local function decrypt(message)
local ciphertextLength = #message-12-16
if ciphertextLength < 0 then
printError("message too short, this may be caused by other traffic on the same port")
return
end
if ciphertextLength >= 32768 then
printError("message too large, this may be caused by other traffic on the same port")
return
end
local nonce, tag, endPos = string.unpack("c12c16", message)
local ciphertext = message:sub(endPos)
local decryptedMessage = aead.decrypt(key, nonce, tag, ciphertext, "") -- this is nil if auth failed
if not decryptedMessage then
printError("message auth invalid")
return
end
return decryptedMessage
end
local function sendWireless(tbl)
local str = textutils.serialize(tbl)
if not str then
printError("failed to serialize message")
return
end
local enc = encrypt(str)
if not enc then
printError("failed to encrypt serialized message")
return
end
wirelessModem.transmit(wirelessChannel, wirelessChannel, enc)
end
local function recvWireless()
while true do
local event, side, channel, replyChannel, message, distance = os.pullEvent("modem_message")
if side == peripheral.getName(wirelessModem) and channel == wirelessChannel then
local dec = decrypt(message)
if dec then
local unser = textutils.unserialize(dec)
if unser then
return unser
else
printError("failed to unserialize")
end
end
end
end
end
return {
broadcast = function(data, protocol)
local message_wrapper = {
nMessageID = math.random(1, 2147483647), -- we dont store messageid here because we shouldnt get our messages back
nRecipient = rednet.CHANNEL_BROADCAST,
nSender = os.getComputerID(),
message = data,
sProtocol = protocol,
}
sendWireless(message_wrapper)
end,
receive = function(protocol, timeout) -- computer ids not implemented
local ret = {}
parallel.waitForAny(function()
while true do
local msg = recvWireless()
if type(msg) == "table" then
ret = {msg.nMessageID, msg.message, msg.sProtocol}
return
end
end
end, function() -- this sucks as well
while not timeout do sleep(1) end
sleep(timeout)
ret = {}
end)
return table.unpack(ret)
end
}