SHOW:
|
|
- or go back to the newest paste.
1 | --[[ | |
2 | Blu-Bank(server) / ATM(client) code | |
3 | ||
4 | By CreeperGoBoom]] | |
5 | ||
6 | --VARS | |
7 | local version = "V1.0" | |
8 | local range = 2 | |
9 | local newAccAmount = 10000 --How much to start players off with on their first use | |
10 | local currency= { --ensure each item is in it's own table to ensure correct order of dispensing at highest level first (like an ATM giving you $100 or $50 notes for example) | |
11 | --current exchange rates based mostly on projecte rates, tweaked for fairness | |
12 | {["minecraft:emerald_block"] = 147456}, | |
13 | {["minecraft:diamond_block"] = 73728}, | |
14 | {["minecraft:emerald"] = 16384}, | |
15 | {["minecraft:gold_block"] = 18432}, | |
16 | {["minecraft:diamond"] = 8192}, | |
17 | {["minecraft:iron_block"] = 2304}, | |
18 | {["minecraft:gold_ingot"] = 2048}, | |
19 | {["minecraft:iron_ingot"] = 256}, | |
20 | {["minecraft:redstone"] = 64}, | |
21 | } | |
22 | ||
23 | local function currencyLookupSimple() | |
24 | local output = {} | |
25 | for count, t in pairs(currency) do | |
26 | for itemName,cost in pairs(t) do | |
27 | output[itemName] = cost | |
28 | end | |
29 | end | |
30 | return output | |
31 | end | |
32 | ||
33 | local simpleCurrency = currencyLookupSimple() | |
34 | --returns an unordered currency list and allows things like if simpleCurrency[name] == cost then | |
35 | ||
36 | local blacklistNames= { | |
37 | "Creeper", | |
38 | "Skeleton", | |
39 | "Spider", | |
40 | "Enderman", | |
41 | "Chicken", | |
42 | "Cow", | |
43 | "Spider", | |
44 | "Slime", | |
45 | "Villager", | |
46 | "Bee", | |
47 | "Wolf", | |
48 | "Ocelot", | |
49 | "Squid" | |
50 | } | |
51 | ||
52 | local keysraw = { | |
53 | { | |
54 | ["a"] = 30, | |
55 | }, | |
56 | { | |
57 | ["b"] = 48, | |
58 | }, | |
59 | { | |
60 | ["c"] = 46, | |
61 | }, | |
62 | { | |
63 | ["d"] = 32, | |
64 | }, | |
65 | { | |
66 | ["e"] = 18, | |
67 | }, | |
68 | { | |
69 | ["f"] = 33, | |
70 | }, | |
71 | { | |
72 | ["g"] = 34, | |
73 | }, | |
74 | { | |
75 | ["h"] = 35, | |
76 | }, | |
77 | { | |
78 | ["i"] = 23, | |
79 | }, | |
80 | { | |
81 | ["j"] = 36, | |
82 | }, | |
83 | { | |
84 | ["k"] = 37, | |
85 | }, | |
86 | { | |
87 | ["l"] = 38, | |
88 | }, | |
89 | { | |
90 | ["m"] = 50, | |
91 | }, | |
92 | { | |
93 | ["n"] = 49, | |
94 | }, | |
95 | { | |
96 | ["o"] = 24, | |
97 | }, | |
98 | { | |
99 | ["p"] = 25, | |
100 | }, | |
101 | { | |
102 | ["q"] = 16, | |
103 | }, | |
104 | { | |
105 | ["r"] = 19, | |
106 | }, | |
107 | { | |
108 | ["s"] = 31, | |
109 | }, | |
110 | { | |
111 | ["t"] = 20, | |
112 | }, | |
113 | { | |
114 | ["u"] = 22, | |
115 | }, | |
116 | { | |
117 | ["v"] = 47, | |
118 | }, | |
119 | { | |
120 | ["w"] = 17, | |
121 | }, | |
122 | { | |
123 | ["x"] = 45, | |
124 | }, | |
125 | { | |
126 | ["y"] = 21, | |
127 | }, | |
128 | { | |
129 | ["z"] = 44, | |
130 | }, | |
131 | { | |
132 | [ "1" ] = 2, | |
133 | }, | |
134 | { | |
135 | [ "2" ] = 3, | |
136 | }, | |
137 | { | |
138 | [ "3" ] = 4, | |
139 | }, | |
140 | { | |
141 | [ "4" ] = 5, | |
142 | }, | |
143 | { | |
144 | [ "5" ] = 6, | |
145 | }, | |
146 | { | |
147 | [ "6" ] = 7, | |
148 | }, | |
149 | { | |
150 | [ "7" ] = 8, | |
151 | }, | |
152 | { | |
153 | [ "8" ] = 9, | |
154 | }, | |
155 | { | |
156 | [ "9" ] = 10, | |
157 | }, | |
158 | { | |
159 | [ "0" ] = 11, | |
160 | }, | |
161 | } | |
162 | ||
163 | --Creates a list of all alphanumeric chars using the table above | |
164 | local keys = {} | |
165 | for i = 1,#keysraw do | |
166 | for a,_ in pairs(keysraw[i]) do | |
167 | keys[i]=a | |
168 | end | |
169 | end | |
170 | ||
171 | --PRELIMINARY-- | |
172 | ||
173 | local function httpGet(stringURL, stringFileNameToSaveTo) | |
174 | local h, err = http.get(stringURL) | |
175 | if not h then printError(err) return nil end | |
176 | local f = fs.open(stringFileNameToSaveTo, "w") | |
177 | f.write(h.readAll()) | |
178 | f.close() | |
179 | h.close() | |
180 | return true | |
181 | end | |
182 | ||
183 | --Get API if don't already have | |
184 | if not fs.exists("apis/CGBCoreLib.lua") then | |
185 | if not httpGet("https://pastebin.com/raw/xuMVS2GP", "apis/CGBCoreLib.lua") then | |
186 | error("Error: Dependancy 'CGBCoreLib' could not be downloaded. Please connect your internet and restart") | |
187 | end | |
188 | end | |
189 | ||
190 | local cgb = require("apis/CGBCoreLib") --Contains complete function library used accross multiple programs and to minimize code size. | |
191 | ||
192 | cgb.saveConfig("data/keydata.lua",keys) | |
193 | --For API check | |
194 | local requiredAPIFuncs = { | |
195 | "getAnswerWithPrompts", | |
196 | "saveConfig", | |
197 | "fileWrite", | |
198 | "findPeripheralOnSide", | |
199 | "isInList", | |
200 | "stringToTable", | |
201 | } | |
202 | ||
203 | --Check API to ensure not outdated | |
204 | for _ , func in pairs(requiredAPIFuncs) do | |
205 | if not cgb[func] then | |
206 | if not httpGet("https://pastebin.com/raw/xuMVS2GP", "apis/CGBCoreLib.lua") then | |
207 | error("Error: Your version of CGBCoreLib is outdated! Please connect your internet and restart!") | |
208 | else | |
209 | os.reboot() | |
210 | end | |
211 | end | |
212 | end | |
213 | ||
214 | local pcTypes = {"Bank","ATM"} | |
215 | --Now check to see what this is (Bank or ATM) | |
216 | local function pcTypeCheck() | |
217 | local output=nil | |
218 | for key, type in pairs(pcTypes) do | |
219 | if fs.exists("data/blubank/" .. type .. ".type") then | |
220 | output = type | |
221 | return true,output | |
222 | end | |
223 | end | |
224 | if not output then | |
225 | return nil | |
226 | end | |
227 | end | |
228 | ||
229 | local modem = nil | |
230 | --New computer. creates a blank file as a type placeholder | |
231 | --Find modem, make sure it is wireless and open rednet. | |
232 | --using sides first | |
233 | local sides = redstone.getSides() | |
234 | for _,side in pairs(sides) do | |
235 | if peripheral.getType(side) == "modem" and peripheral.call(side,"isWireless") then | |
236 | modem = true --no point with a wrap since we have found a modem to open rednet directly. | |
237 | rednet.open(side) | |
238 | break | |
239 | end | |
240 | end | |
241 | if not modem then --Wireless modem not on sides, must be on network | |
242 | local modemList = cgb.getPeripherals("modem") | |
243 | for _,v in pairs(modemList) do | |
244 | print(v) | |
245 | if peripheral.call(v,"isWireless") then | |
246 | modem = true | |
247 | rednet.open(v) | |
248 | break | |
249 | end | |
250 | end | |
251 | if not modem then | |
252 | error("Error: Wireless modem not found") | |
253 | end | |
254 | end | |
255 | ||
256 | local ok, pcType = pcTypeCheck() | |
257 | if not ok then --For new configurations | |
258 | local nonexisting | |
259 | local event = {} | |
260 | pcType = cgb.getAnswerWithPrompts("What type of computer is this?",pcTypes) | |
261 | cgb.fileWrite("data/blubank/" .. pcType .. ".type") --Don't have to repeat this anywhere now | |
262 | if pcType == "Bank" then | |
263 | --Bank server selected. Ensure no other bank server active by pinging for server. | |
264 | --Start a 3 second timer for if there is no answer to ping. | |
265 | print("Reminder: This chunk must now remain loaded at all times to avoid problems with ATMs working. Press ENTER to continue.") | |
266 | io.read() | |
267 | print("Pinging for existing bank server...") | |
268 | nonexisting = os.startTimer(3) | |
269 | rednet.broadcast("Existing?","Blu-bank-SSL") | |
270 | repeat | |
271 | event = {os.pullEvent()} | |
272 | --Do all checks here. | |
273 | until | |
274 | (event[1] == "rednet_message" and event[3] == "yes") | |
275 | or | |
276 | (event[1] == "timer" and event[2] == nonexisting) | |
277 | --We have already checked for other event args in repeat until so no need to repeat them below. | |
278 | if event[1] == "rednet_message" then | |
279 | --Bank server already exists. Ensure that type remains unset. | |
280 | print("There is already a Bank server active. Restarting!") | |
281 | fs.delete("data/blubank/" .. pcType ..".type") | |
282 | sleep(2) | |
283 | os.reboot() | |
284 | elseif event[1] == "timer" then | |
285 | --No bank server exists or active | |
286 | print("Other bank server not found. Bank server configured!") | |
287 | sleep(2) | |
288 | end | |
289 | end | |
290 | end | |
291 | ||
292 | if pcType == "ATM" then | |
293 | rs.setOutput("bottom",true) | |
294 | end | |
295 | ||
296 | local function resetTerm() | |
297 | term.setBackgroundColor(colors.white) | |
298 | term.clear() | |
299 | if term.isColor() then | |
300 | term.setTextColor(colors.blue) | |
301 | elseif not term.isColor() then | |
302 | term.setTextColor(colors.black) | |
303 | end | |
304 | term.setCursorPos(1,1) | |
305 | if commands ~= nil and pcType == "Bank" then | |
306 | print("Blu-Bank OS " .. version .. " Bank") | |
307 | print("Command Bank server active!") | |
308 | elseif not commands then | |
309 | print("Blu-Bank OS " .. version .. " " .. pcType) | |
310 | if pcType == "Bank" then | |
311 | print("Bank server active!") | |
312 | else | |
313 | print("Accessing bank server...") | |
314 | end | |
315 | end | |
316 | end | |
317 | ||
318 | local sign | |
319 | local chest | |
320 | local trash | |
321 | local sensor=nil | |
322 | local config = {} | |
323 | if pcType == "ATM" then --no point trying to wrap a sensor for bank server. | |
324 | sensor = peripheral.wrap(cgb.findPeripheralOnSide("plethora:sensor")) | |
325 | if not sensor then | |
326 | error("Error: Sensor not found. The ATM requires a sensor turtle with wireless modem to function") | |
327 | elseif sensor then | |
328 | config["sensor"]=cgb.findPeripheralOnSide("plethora:sensor") | |
329 | end | |
330 | if not fs.exists("data/blubank/config.lua") then | |
331 | --Chests | |
332 | repeat | |
333 | print("What is the network name of your input chest?") | |
334 | input = io.read() | |
335 | chest = peripheral.wrap(input) | |
336 | if not chest then | |
337 | print("Chest not found or input network name not a chest or storage. please check network name and try again") | |
338 | end | |
339 | until chest | |
340 | config["chest"]= input | |
341 | --trash for deposits to delete items | |
342 | repeat | |
343 | print("What is the network name of your trash chest?") | |
344 | input = io.read() | |
345 | trash = peripheral.wrap(input) | |
346 | if not trash then | |
347 | print("Chest not found or input network name not a chest or storage. please check network name and try again") | |
348 | end | |
349 | until trash | |
350 | config["trash"] = input | |
351 | --configure screens | |
352 | print("Please right click on the monitor you wish to use as greeting sign") | |
353 | print("OR invoke a redstone signal for network name / side") | |
354 | repeat | |
355 | event,monitorraw,x,y = os.pullEvent() | |
356 | until event == "monitor_touch" or event == "redstone" | |
357 | if event == "monitor_touch" then | |
358 | config["greeting_monitor"]=monitorraw | |
359 | monitor = peripheral.wrap(monitorraw) | |
360 | elseif event == "redstone" then | |
361 | repeat | |
362 | print("What is the network name / side of the screen?") | |
363 | input = io.read() | |
364 | monitor = peripheral.wrap(input) | |
365 | if not monitor then | |
366 | print("Entered network name / side not found. Please try again") | |
367 | end | |
368 | until monitor | |
369 | config["greeting_monitor"]=input | |
370 | end | |
371 | monitor.write("BLU-BANK OS") | |
372 | ||
373 | ||
374 | print("Please right click on the monitor you wish to use as currency sign") | |
375 | print("OR invoke a redstone signal for network name / side") | |
376 | repeat | |
377 | event,monitorraw,x,y = os.pullEvent() | |
378 | until event == "monitor_touch" or event == "redstone" | |
379 | if event == "monitor_touch" then | |
380 | config["currency_monitor"]=monitorraw | |
381 | cmonitor = peripheral.wrap(monitorraw) | |
382 | elseif event == "redstone" then | |
383 | repeat | |
384 | print("What is the network name / side of the screen?") | |
385 | input = io.read() | |
386 | cmonitor = peripheral.wrap(input) | |
387 | if not cmonitor then | |
388 | print("Entered network name / side not found. Please try again") | |
389 | end | |
390 | until cmonitor | |
391 | config["currency_monitor"]=input | |
392 | end | |
393 | cmonitor.write("BLU-BANK OS") | |
394 | ||
395 | print("Please right click on the monitor you wish to use as ATM Building sign") | |
396 | print("OR invoke a redstone signal for network name / side") | |
397 | repeat | |
398 | event,monitorraw,x,y = os.pullEvent() | |
399 | until event == "monitor_touch" or event == "redstone" | |
400 | if event == "monitor_touch" then | |
401 | config["sign_monitor"]=monitorraw | |
402 | sign = peripheral.wrap(monitorraw) | |
403 | elseif event == "redstone" then | |
404 | repeat | |
405 | print("What is the network name / side of the screen?") | |
406 | input = io.read() | |
407 | sign = peripheral.wrap(input) | |
408 | if not sign then | |
409 | print("Entered network name / side not found. Please try again") | |
410 | end | |
411 | until sign | |
412 | config["sign_monitor"]=input | |
413 | end | |
414 | sign.write("BLU-BANK OS") | |
415 | ||
416 | --get and save id of bank server | |
417 | rednet.broadcast("bank id?","Blu-bank-SSL") | |
418 | event, id, message, protocol = os.pullEvent("rednet_message") | |
419 | config.bankId = tonumber(id) | |
420 | cgb.saveConfig("data/blubank/config.lua",config) | |
421 | else | |
422 | --Config exists... load all devices and settings | |
423 | config = cgb.loadConfig("data/blubank/config.lua") | |
424 | ||
425 | --This allows a bank to be moved to a new computer without any ATM config needed. | |
426 | --Will stop ATMs turning on if server is not working | |
427 | rednet.broadcast("bank id?","Blu-bank-SSL") | |
428 | term.clear() | |
429 | term.setCursorPos(1,1) | |
430 | print("BLU-BANK OS") | |
431 | print("Querying bank server...") | |
432 | expired = os.startTimer(1) | |
433 | repeat | |
434 | event, id, message, protocol = os.pullEvent() | |
435 | until (event == "rednet_message" and message == "ok") or (event == "timer" and id == expired) | |
436 | if event == "rednet_message" then | |
437 | config.bankId = tonumber(id) | |
438 | monitor = peripheral.wrap(config.greeting_monitor) | |
439 | monitor.clear() | |
440 | monitor.setCursorPos(1,1) | |
441 | monitor.write("Blu-bank OS") | |
442 | cmonitor = peripheral.wrap(config.currency_monitor) | |
443 | sensor = peripheral.wrap(config.sensor) | |
444 | chest = peripheral.wrap(config.chest) | |
445 | trash = peripheral.wrap(config.trash) | |
446 | sign = peripheral.wrap(config.sign_monitor) | |
447 | elseif id == expired then | |
448 | print("Bank server not responding! auto restarting in:") | |
449 | for i = 5,1,-1 do | |
450 | print(i .. "...") | |
451 | sleep(1) | |
452 | end | |
453 | os.reboot() | |
454 | end | |
455 | end | |
456 | end | |
457 | ||
458 | local function updateCurrencyScreen() | |
459 | cmonitor.setBackgroundColor(colors.white) | |
460 | cmonitor.clear() | |
461 | cmonitor.setTextScale(1) | |
462 | cmonitor.setCursorPos(1,1) | |
463 | if cmonitor.isColor then | |
464 | cmonitor.setTextColor(colors.blue) | |
465 | else | |
466 | cmonitor.setTextColor(colors.black) | |
467 | end | |
468 | local ctxt | |
469 | cmonitor.write("Credit rates:") | |
470 | cmonitor.setCursorPos(1,2) | |
471 | for count, t in pairs(currency) do | |
472 | local line = count + 2 | |
473 | for itemname,cost in pairs(t) do | |
474 | _, simpleName, simpleName2 = cgb.stringToVars(itemname) | |
475 | if simpleName2 then | |
476 | cmonitor.write(simpleName .. " " .. simpleName2 .. ": " ..cost) | |
477 | elseif not simpleName2 then | |
478 | cmonitor.write(simpleName .. ": " ..cost) | |
479 | end | |
480 | end | |
481 | cmonitor.setCursorPos(1,line) | |
482 | end | |
483 | end | |
484 | ||
485 | local function updateMonitor(stringNewMsg,colorName) | |
486 | monitor.setBackgroundColor(colors.white) | |
487 | if colorName then | |
488 | monitor.setTextColor(colorName) | |
489 | else | |
490 | monitor.setTextColor(colors.blue) | |
491 | end | |
492 | if not monitor.isColor() then | |
493 | monitor.setTextColor(colors.black) | |
494 | end | |
495 | monitor.setTextScale(2) | |
496 | monitor.clear() | |
497 | monitor.setCursorPos(13,1) | |
498 | monitor.write("Blu-Bank OS") | |
499 | monitor.setCursorPos(8,2) | |
500 | monitor.write(stringNewMsg) | |
501 | end | |
502 | ||
503 | local function buildingSign() | |
504 | sign.setBackgroundColor(colors.white) | |
505 | sign.clear() | |
506 | sign.setCursorPos(2,1) | |
507 | sign.setTextScale(5) | |
508 | sign.setTextColor(colors.blue) | |
509 | sign.write("BLU-BANK") | |
510 | end | |
511 | ||
512 | ||
513 | if pcType == "Bank" and not commands then | |
514 | print("Warning: This pc is not a command pc, as such only deposits and store purchases are available. Please ensure everyone knows that direct withdrawals are not possible.") | |
515 | end | |
516 | ||
517 | --Prevents a hacker from making any transactions on other players behalf. must be called. | |
518 | local function authenticate(stringAuthType) | |
519 | rednet.send(senderID, "authorization required") | |
520 | event, senderID, message = os.pullEvent() | |
521 | if message == "password?" then | |
522 | local pass = "" | |
523 | for i = 1, 20 do | |
524 | k = math.random(1,#keys) | |
525 | pass = pass .. keys[k] | |
526 | end | |
527 | passExpired = os.startTimer(1) --if ATM received password it should have bounced back within 1 second. | |
528 | rednet.send(senderID,"pass: " .. pass) | |
529 | repeat | |
530 | event, senderID, message = os.pullEvent() | |
531 | until (event == "rednet_message" and message == pass) or (event == "timer" and senderID == passExpired) | |
532 | if event == "rednet_message" then | |
533 | rednet.send(senderID, stringAuthType .. " Authorized") | |
534 | elseif event == "timer" then | |
535 | rednet.send(senderID, "Authorization timed out!") | |
536 | end | |
537 | end | |
538 | end | |
539 | ||
540 | local sensordata={} | |
541 | local function updateSensorData() | |
542 | sensordata=sensor.sense() --this is also stored in upper sensordata so we can still do whatever we want with it | |
543 | end | |
544 | ||
545 | local function getPlayerInRange() | |
546 | local id = nil | |
547 | updateSensorData() | |
548 | for i,_ in pairs(sensordata) do | |
549 | if sensordata[i].x > -range and | |
550 | sensordata[i].x < range and | |
551 | sensordata[i].z > -range and | |
552 | sensordata[i].z < range and | |
553 | sensordata[i].y > -range and | |
554 | sensordata[i].y < range then | |
555 | if not cgb.isInList(sensordata[i].name,blacklistNames) then | |
556 | id = sensordata[i].name | |
557 | return true, id--ensures only one player is found at a time. also allows id to be discarded if not needed at the time. | |
558 | end | |
559 | end | |
560 | end | |
561 | end | |
562 | ||
563 | ||
564 | local cash = {} | |
565 | local event | |
566 | local function secondary() | |
567 | local messagedata = {} | |
568 | local commanddata = {} | |
569 | local funds = {} | |
570 | local bal = 0 | |
571 | while true do | |
572 | event, senderID, message, protocol = os.pullEvent("rednet_message") | |
573 | if protocol == "Blu-bank-SSL" then --hard protocol name for players to guess and take over the server with... especially since they dont know how the commands are even sent or read. (Whatever you do, DO NOT TELL THEM!) | |
574 | if pcType == "Bank" then | |
575 | if message == "Existing?" then | |
576 | rednet.send(senderID,"yes") --makes sure reply is securely sent to enquiring computer. | |
577 | elseif message == "bank id?" then | |
578 | rednet.send(senderID,"ok") | |
579 | end | |
580 | end | |
581 | end | |
582 | -- | |
583 | if pcType == "Bank" then | |
584 | --print(message) | |
585 | if commands ~= nil then --allows give command to be sent using ATMs | |
586 | --limit commands to give only | |
587 | if message:find("command") and message:find("give") then | |
588 | print(message) | |
589 | messagedata = cgb.stringToTable(message) | |
590 | for i = 3,#messagedata do | |
591 | commanddata[i-2]=messagedata[i] | |
592 | end | |
593 | commands[messagedata[2]](table.unpack(commanddata)) | |
594 | commanddata = {} --This is a must otherwise additional arguments are passed to the next command if your last was long. | |
595 | elseif message:find("command") and not message:find("give") then | |
596 | --Command use exceeds limit, alert everyone to a potential hacker. | |
597 | print("Unauthorized command attempt from PC ID: " .. senderID ..". Attempt: '" .. message .."'.") | |
598 | commands.say("Unauthorized access attempt...CC HACKER ALERT!") | |
599 | end | |
600 | end | |
601 | --"purchase playername item cost quantity" | |
602 | if message:find("purchase") then | |
603 | -- authenticate("Purchase") | |
604 | -- event, senderID, message, protocol = os.pullEvent("rednet_message") | |
605 | -- if message == "Purchase Authorized" then | |
606 | print(message) | |
607 | _, player, item, credcost, qty = cgb.stringToVarsAll(message) | |
608 | -- for i in string.gmatch(message, "%S+") do | |
609 | -- print(i) | |
610 | -- end | |
611 | --for some reason item is coming back as nil | |
612 | print(player .. " requested to purchase " .. qty .. " " .. item) | |
613 | local cost = tonumber(credcost) * qty | |
614 | funds = cgb.loadConfig("data/blubank/users/" .. player .. ".lua") | |
615 | if cost <= funds.balance then | |
616 | rednet.send(senderID, "purchase-success") | |
617 | funds.balance = funds.balance - cost | |
618 | cgb.saveConfig("data/blubank/users/" .. player .. ".lua",funds) | |
619 | commands.give(player.." " .. item .. " " .. qty) | |
620 | elseif cost > funds.balance then | |
621 | rednet.send(senderID,"insufficient funds This item costs " .. cost .. " credits and you have " .. funds.balance .. " credits!") | |
622 | end | |
623 | -- end | |
624 | --"withdraw playername amount" | |
625 | elseif message:find("withdraw") then | |
626 | local qty | |
627 | print(message) | |
628 | --authenticate("Withdrawal") | |
629 | --event, senderID, message, protocol = os.pullEvent("rednet_message") | |
630 | --if message == "Withdrawal Authorized" then | |
631 | _, player, amount = cgb.stringToVars(message) | |
632 | funds = cgb.loadConfig("data/blubank/users/" .. player .. ".lua") | |
633 | print("funds: " .. funds.balance) | |
634 | withdrawalRequest = tonumber(amount) | |
635 | if withdrawalRequest <= funds.balance then | |
636 | rednet.send(senderID,"withdrawal-success") | |
637 | commands.say(player .. " requested a withdrawal") | |
638 | if funds.balance == withdrawalRequest then | |
639 | funds.balance = 0 | |
640 | elseif funds.balance > withdrawalRequest then | |
641 | funds.balance = funds.balance - withdrawalRequest | |
642 | end | |
643 | print("Remaining: " .. funds.balance) | |
644 | cgb.saveConfig("data/blubank/users/" .. player .. ".lua",funds) | |
645 | --calculate how many of each item to give | |
646 | for i,tablevar in pairs(currency) do | |
647 | for itemName,cost in pairs(tablevar) do | |
648 | cash[itemName]={} | |
649 | qty,fraction=math.modf(withdrawalRequest / cost) --how many items can be given at this cost? | |
650 | --item has been calculated. give item | |
651 | --This avoids give not happening due to qty higher than 64 bug | |
652 | if qty > 64 then | |
653 | repeat | |
654 | commands.give(player .. " " .. itemName .. " " .. 64) | |
655 | qty = qty - 64 | |
656 | until qty <= 64 | |
657 | commands.give(player .. " " .. itemName .. " " .. qty) | |
658 | elseif qty <= 64 then | |
659 | commands.give(player .. " " .. itemName .. " " .. qty) | |
660 | end | |
661 | withdrawalRequest = fraction * cost --How many credits remain after item count? | |
662 | end | |
663 | end | |
664 | --make sure remaining unwithdrawable credits get refunded | |
665 | funds.balance = funds.balance + withdrawalRequest | |
666 | cgb.saveConfig("data/blubank/users/" .. player .. ".lua",funds) | |
667 | elseif withdrawalRequest > funds.balance then | |
668 | rednet.send(senderID, "insufficient funds Balance " .. funds.balance .. " credits.") | |
669 | end | |
670 | --end | |
671 | --"deposit playername amount" | |
672 | elseif message:find("deposit") then | |
673 | --authenticate("Deposit") | |
674 | -- event, senderID, message, protocol = os.pullEvent("rednet_message") | |
675 | -- if message == "Deposit Authorized" then | |
676 | _,player,amount = cgb.stringToVars(message) | |
677 | print("Depositing " .. amount .. " credits into " .. player .. "s' account") | |
678 | funds = cgb.loadConfig("data/blubank/users/" .. player .. ".lua") | |
679 | funds.balance = funds.balance + tonumber(amount) | |
680 | cgb.saveConfig("data/blubank/users/" .. player .. ".lua",funds) | |
681 | rednet.send(senderID,"deposit-success") | |
682 | --Funds addition code here | |
683 | -- end | |
684 | elseif message == "password?" then | |
685 | --password generator code | |
686 | --generates a one time password which must be bounced back to server for authentication. | |
687 | authenticate() | |
688 | --"balance playername" | |
689 | elseif message:find("balance") then | |
690 | --authenticate("Balance query") | |
691 | -- event, senderID, message, protocol = os.pullEvent("rednet_message") | |
692 | -- if message == "Balance query Authorized" then | |
693 | _, player= cgb.stringToVars(message) | |
694 | if not fs.exists("data/blubank/users/" .. player .. ".lua") then | |
695 | print("Creating new account for: " .. player) | |
696 | if newAccAmount > 0 then | |
697 | print("Adding " .. newAccAmount .. " credits for " .. player) | |
698 | end | |
699 | funds.balance = newAccAmount | |
700 | cgb.saveConfig("data/blubank/users/" .. player .. ".lua",funds) | |
701 | else | |
702 | print("Loading funds of: " .. player) | |
703 | funds = cgb.loadConfig("data/blubank/users/" .. player .. ".lua") | |
704 | end | |
705 | rednet.send(senderID, "bal " .. funds.balance) | |
706 | --end | |
707 | elseif message:find("transfer") then | |
708 | _, fromplayer, toplayer, amount = cgb.stringToVarsAll(message) | |
709 | amount = tonumber(amount) | |
710 | funds = cgb.loadConfig("data/blubank/users/" .. fromplayer .. ".lua") | |
711 | if amount > funds.balance then | |
712 | rednet.send(senderID, "insufficient funds You requested to transfer " .. amount .. " credits but have " .. funds.balance .. " credits!") | |
713 | elseif amount <= funds.balance then | |
714 | rednet.send(senderID, "transfer-success") | |
715 | funds.balance = funds.balance - amount | |
716 | cgb.saveConfig("data/blubank/users/" .. fromplayer .. ".lua",funds) | |
717 | funds = cgb.loadConfig("data/blubank/users/" .. toplayer .. ".lua") | |
718 | funds.balance = funds.balance + amount | |
719 | cgb.saveConfig("data/blubank/users/" .. toplayer .. ".lua",funds) | |
720 | if commands then commands.tell(toplayer .. " " .. fromplayer .. " has just transferred you " .. amount .. " credits!") end | |
721 | end | |
722 | end | |
723 | elseif pcType == "ATM" then | |
724 | if message == "withdraw-success" then | |
725 | print("Success. Dispensing cash... please check your inventory :D") | |
726 | elseif message == "authorization required" then | |
727 | rednet.send(senderID, "password?") | |
728 | event,senderID,message = os.pullEvent("rednet_message") | |
729 | if message:find("pass:") then | |
730 | _, pass = cgb.stringToVars(message) | |
731 | rednet.send(senderID,pass) | |
732 | event,senderID,message = os.pullEvent("rednet_message") | |
733 | if message == "Authorization timed out!" then | |
734 | error("BluBank OS: err_auth_failed. Please contact server admin.") | |
735 | end | |
736 | end | |
737 | end | |
738 | end | |
739 | end | |
740 | end | |
741 | ||
742 | ||
743 | local player = "nil" | |
744 | local playercheck | |
745 | local playermem | |
746 | local function main() | |
747 | while true do | |
748 | if pcType == "ATM" then | |
749 | buildingSign() | |
750 | updateMonitor(" ") | |
751 | resetTerm() | |
752 | ||
753 | repeat | |
754 | ok,player = getPlayerInRange() | |
755 | if not ok then | |
756 | sleep(1) | |
757 | end | |
758 | until ok | |
759 | rs.setOutput("bottom",false) | |
760 | playermem = player | |
761 | updateMonitor("WELCOME " .. player .. "!") | |
762 | updateCurrencyScreen() | |
763 | print("Welcome " .. player .. "!") | |
764 | rednet.send(config.bankId, "balance " .. player) | |
765 | --"bal balance" | |
766 | repeat | |
767 | event,senderID,message = os.pullEvent("rednet_message") | |
768 | until message:find("bal") | |
769 | _, bal= cgb.stringToVars(message) | |
770 | print("Your balance: " ..bal .. " credits.") | |
771 | print("Press W for Withdrawal") | |
772 | print("Press D for Deposit") | |
773 | print("Press T to Transfer credits") | |
774 | print("Press E for the Credit Exchange Store") | |
775 | print("Press L to Logoff") | |
776 | repeat | |
777 | event,c = os.pullEvent("char") | |
778 | until c | |
779 | if c == "l" then --Logoff | |
780 | rs.setOutput("bottom",true) | |
781 | print("Logged off! Thanks for using Blu-Bank! See you soon!") | |
782 | print("Please step away from the ATM.") | |
783 | updateMonitor("Farewell Tenant!") | |
784 | cmonitor.setBackgroundColor(colors.black) | |
785 | cmonitor.clear() | |
786 | ||
787 | repeat | |
788 | ok,player = getPlayerInRange() | |
789 | if ok then | |
790 | sleep(1) | |
791 | end | |
792 | until not ok | |
793 | elseif c == "w" then --Withdraw | |
794 | print("How much would you like to withdraw?") | |
795 | local amount = io.read() | |
796 | rednet.send(config.bankId,"withdraw " .. player .. " " .. amount) | |
797 | event,senderID,message = os.pullEvent("rednet_message") | |
798 | if message == "withdrawal-success" then | |
799 | print("Success. Dispensing cash... please check your inventory :D") | |
800 | sleep(3) | |
801 | elseif message:find("insufficient") then | |
802 | local replyString = "" | |
803 | local insufficientFundsMessage = {} | |
804 | --"insufficent funds message" | |
805 | messagedata = cgb.stringToTable(message) | |
806 | for i = 3, #messagedata do | |
807 | insufficientFundsMessage[i-2]=messagedata[i] | |
808 | end | |
809 | for _, str in pairs(insufficientFundsMessage) do | |
810 | replyString = replyString .. " " .. str | |
811 | end | |
812 | replyString = replyString .. "!" | |
813 | print("Insufficient funds! " .. replyString) | |
814 | sleep(3) | |
815 | end | |
816 | elseif c == "d" then --Deposit | |
817 | local itemvalue | |
818 | local total=0 | |
819 | print("Take a look at the credit rates and place your deposit in the chest.") | |
820 | print("Press any key when you are ready to continue.") | |
821 | os.pullEvent("key") | |
822 | print("Processing, please wait.") | |
823 | for slot,item in pairs(chest.list()) do | |
824 | --if item not listed in currency, do not move | |
825 | if simpleCurrency[item.name] then | |
826 | chest.pushItems(config.trash,slot,item.count) | |
827 | total = total + (item.count * simpleCurrency[item.name]) | |
828 | end | |
829 | end | |
830 | if total == 0 then | |
831 | print("Nothing inserted or items do not match list. please check your deposit items and try again.") | |
832 | sleep(3) | |
833 | else | |
834 | print("You have inserted " .. total .. " credits") | |
835 | print("Are you happy to finalize your deposit? Y or N") | |
836 | repeat | |
837 | event,c = os.pullEvent("char") | |
838 | until c == "y" or c == "n" | |
839 | if c == "n" then | |
840 | print("Returning your deposit") | |
841 | for slot,item in pairs(trash.list()) do | |
842 | trash.pushItems(config.chest,slot,item.count) | |
843 | end | |
844 | sleep(2) | |
845 | elseif c == "y" then | |
846 | print("Sending deposit request...") | |
847 | rednet.send(config.bankId, "deposit " .. player .. " " .. total) | |
848 | event,senderID,message = os.pullEvent("rednet_message") | |
849 | if message == "deposit-success" then | |
850 | for slot,_ in pairs(trash.list()) do | |
851 | trash.drop(slot) | |
852 | end | |
853 | print("Deposit of " .. total .. " credits success!") | |
854 | sleep(3) | |
855 | end | |
856 | --deposit code | |
857 | end | |
858 | end | |
859 | -- elseif message == "deposit-success" then | |
860 | -- print("Deposit Successful!") | |
861 | -- sleep(3) | |
862 | elseif c == "t" then --Transfer | |
863 | print("Transfers are performed as following:") | |
864 | print("toPlayerName amount") | |
865 | print("Please ensure you have spelled the playername correctly E.g: 'playername' is not 'PlayerName'") | |
866 | repeat | |
867 | input = io.read() | |
868 | toplayer, amount = cgb.stringToVarsAll(input) | |
869 | print("You have requested: " .. amount .. " credits to be transferred to: '" .. toplayer .."'.") | |
870 | print("Is this correct? Press Y or N. N will cancel the operation") | |
871 | event,c = os.pullEvent("char") | |
872 | until c=="y" or c=="n" | |
873 | if c=="y" then | |
874 | rednet.send(config.bankId, "transfer " .. player .. " " .. toplayer .. " " .. amount) | |
875 | event,senderID,message = os.pullEvent("rednet_message") | |
876 | if message == "transfer-success" then | |
877 | print("Transfer successful!") | |
878 | elseif message:find("insufficient") then | |
879 | local replyString = "" | |
880 | local insufficientFundsMessage = {} | |
881 | --"insufficent funds message" | |
882 | messagedata = cgb.stringToTable(message) | |
883 | for i = 3, #messagedata do | |
884 | insufficientFundsMessage[i-2]=messagedata[i] | |
885 | end | |
886 | for _, str in pairs(insufficientFundsMessage) do | |
887 | replyString = replyString .. " " .. str | |
888 | end | |
889 | replyString = replyString .. "!" | |
890 | print("Insufficient funds! " .. replyString) | |
891 | sleep(5) | |
892 | end | |
893 | sleep(3) | |
894 | end | |
895 | elseif c == "e" then --Credit Exchange Store | |
896 | term.clear() | |
897 | term.setCursorPos(1,1) | |
898 | print("Credit Exchange Store") | |
899 | print("Your Balance: " .. bal .. " credits.") | |
900 | for count, t in pairs(currency) do | |
901 | for itemName,cost in pairs(t) do | |
902 | -- _, simpleName, simpleName2 = cgb.stringToVars(itemname) | |
903 | -- if simpleName2 then | |
904 | -- print(simpleName .. " " .. simpleName2 .. ": " ..cost) | |
905 | -- elseif not simpleName2 then | |
906 | -- print(simpleName .. ": " ..cost) | |
907 | -- end | |
908 | print("'" .. itemName .. "' = " .. cost) | |
909 | end | |
910 | end | |
911 | repeat | |
912 | print("Please enter as: item qty") | |
913 | input = io.read() | |
914 | item, qty = cgb.stringToVarsAll(input) | |
915 | if not simpleCurrency[item] then | |
916 | print("Please ensure you include the full name including minecraft: and your spelling is correct.") | |
917 | end | |
918 | until simpleCurrency[item] | |
919 | rednet.send(config.bankId, "purchase " .. player .. " " .. item .. " " .. simpleCurrency[item] .. " " ..qty) | |
920 | event,senderID,message = os.pullEvent("rednet_message") | |
921 | if message == "purchase-success" then | |
922 | print("Purchase successful, please check your inventory.") | |
923 | sleep(3) | |
924 | elseif message:find("insufficient") then | |
925 | local replyString = "" | |
926 | local insufficientFundsMessage = {} | |
927 | --"insufficent funds message" | |
928 | messagedata = cgb.stringToTable(message) | |
929 | for i = 3, #messagedata do | |
930 | insufficientFundsMessage[i-2]=messagedata[i] | |
931 | end | |
932 | for _, str in pairs(insufficientFundsMessage) do | |
933 | replyString = replyString .. " " .. str | |
934 | end | |
935 | replyString = replyString .. "!" | |
936 | print("Insufficient funds! " .. replyString) | |
937 | sleep(5) | |
938 | end | |
939 | end | |
940 | --term.clear() | |
941 | --term.setCursorPos(1,1) | |
942 | elseif pcType == "Bank" then | |
943 | resetTerm() | |
944 | while true do | |
945 | os.pullEvent() | |
946 | end | |
947 | end | |
948 | --while not logged in by anyone, monitor reads 'Blu-bank ATM'. white background, blue writing if colors supported | |
949 | --when someone approaches, they are logged in and the screen changes to 'WELCOME playername' | |
950 | --When someone is logged in a redstone signal is output at bottom for door | |
951 | --When player leaves the detection range, a message is displayed 'Thankyou for using Blu-Bank. See you soon!' before going back to not logged in screen | |
952 | end | |
953 | end | |
954 | ||
955 | while true do | |
956 | parallel.waitForAny(main, secondary) | |
957 | --secondary() | |
958 | end |