forked from xomf/slabOS
		
	Add libcredit_mobile.lua
This commit is contained in:
		
							parent
							
								
									a6cbf28251
								
							
						
					
					
						commit
						723e2167c3
					
				
							
								
								
									
										102
									
								
								libcredit_mobile.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								libcredit_mobile.lua
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,102 @@
 | 
			
		|||
local M = {}
 | 
			
		||||
 | 
			
		||||
local modem = peripheral.wrap("back")
 | 
			
		||||
local SERVER_CHANNEL = 43
 | 
			
		||||
 | 
			
		||||
local function sendRequestAndWaitForReply(messageTable, replyHandler, timeout)
 | 
			
		||||
    timeout = timeout or 5
 | 
			
		||||
 | 
			
		||||
    local replyChannel = math.random(1000, 9999)
 | 
			
		||||
    modem.open(replyChannel) 
 | 
			
		||||
    messageTable.replyChannel = replyChannel
 | 
			
		||||
 | 
			
		||||
    local jsonMessage = textutils.serialiseJSON(messageTable)
 | 
			
		||||
    modem.transmit(SERVER_CHANNEL, replyChannel, jsonMessage)
 | 
			
		||||
 | 
			
		||||
    local startTime = os.clock()
 | 
			
		||||
    local replyReceived = false
 | 
			
		||||
    while os.clock() - startTime < timeout do
 | 
			
		||||
        local event, side, channel, receivedReplyChannel, message, distance = os.pullEvent("modem_message")
 | 
			
		||||
        if event == "modem_message" and channel == replyChannel then
 | 
			
		||||
            local success, parsedReply = pcall(textutils.unserialiseJSON, message)
 | 
			
		||||
            if success and type(parsedReply) == "table" then
 | 
			
		||||
                replyHandler(parsedReply)
 | 
			
		||||
                replyReceived = true
 | 
			
		||||
                break 
 | 
			
		||||
            end
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
    modem.close(replyChannel) 
 | 
			
		||||
 | 
			
		||||
    return replyReceived
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function M.getCredit(username, callback)
 | 
			
		||||
    local message = {
 | 
			
		||||
        type = "getCredit",
 | 
			
		||||
        user = username
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return sendRequestAndWaitForReply(message, function(reply)
 | 
			
		||||
        if reply.type == "creditResponse" and reply.user == username then
 | 
			
		||||
            callback(reply.credit)
 | 
			
		||||
        else
 | 
			
		||||
 | 
			
		||||
            callback(nil)
 | 
			
		||||
        end
 | 
			
		||||
    end)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function M.addTransaction(username, amount, vendor, vendor_account, callback, timeout)
 | 
			
		||||
 | 
			
		||||
    if type(amount) ~= "number" or amount <= 0 then
 | 
			
		||||
        error("Amount must be a positive number.", 2)
 | 
			
		||||
    end
 | 
			
		||||
    if type(username) ~= "string" or #username == 0 then
 | 
			
		||||
        error("Username must be a non-empty string.", 2)
 | 
			
		||||
    end
 | 
			
		||||
    if type(vendor) ~= "string" or #vendor == 0 then
 | 
			
		||||
        error("Vendor must be a non-empty string.", 2)
 | 
			
		||||
    end
 | 
			
		||||
    if type(vendor_account) ~= "string" or #vendor_account == 0 then
 | 
			
		||||
        error("Vendor account must be a non-empty string.", 2)
 | 
			
		||||
    end
 | 
			
		||||
    if type(callback) ~= "function" then
 | 
			
		||||
        error("Callback must be a function.", 2)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if timeout and (type(timeout) ~= "number" or timeout <= 0) then
 | 
			
		||||
        error("Timeout must be a positive number if provided.", 2)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    local message = {
 | 
			
		||||
        type = "addTransaction",
 | 
			
		||||
        user = username,
 | 
			
		||||
        amount = amount,
 | 
			
		||||
        vendor = vendor,
 | 
			
		||||
        vendor_account = vendor_account
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return sendRequestAndWaitForReply(message, function(reply)
 | 
			
		||||
 | 
			
		||||
        if reply.type == "transactionCompleted" and reply.transaction_id then
 | 
			
		||||
            if reply.status == "success" then
 | 
			
		||||
                callback(true, reply.newCredit) 
 | 
			
		||||
            elseif reply.status == "failed" then
 | 
			
		||||
 | 
			
		||||
                callback(false, reply.reason) 
 | 
			
		||||
            elseif reply.status == "cancelled" then
 | 
			
		||||
 | 
			
		||||
                callback(false, "cancelled") 
 | 
			
		||||
            else
 | 
			
		||||
 | 
			
		||||
                callback(false, "unknown_status")
 | 
			
		||||
            end
 | 
			
		||||
        else
 | 
			
		||||
 | 
			
		||||
            callback(false, "unexpected_reply") 
 | 
			
		||||
        end
 | 
			
		||||
    end, timeout) 
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
return M
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user