View difference between Paste ID: 3qmAmxRZ and Fi5C1HhG
SHOW: | | - or go back to the newest paste.
1
-- make a clients.txt, "whitelist.txt", log.txt, and "items.txt" file
2
myusername = "username"
3
mypassword = "password"
4
5
function messageWhitelistItems(whitelist, itemlist)
6
	rednet.open("top")
7
    computers = getDatabase(whitelist)
8
	if #computers ~= 0 then
9
    	for _, line in pairs(computers) do
10
			if tonumber(line) ~= nil then
11
				rednet.send(tonumber(line), "itemlist please")
12
				rednet.send(tonumber(line), getAllItems(itemlist))
13
			end
14
    	end
15
	end
16
end
17
18
function displayLog(filename, scrollPosition, maxLines)
19
    local instruction = "Press Backspace to Leave"
20
    local database = getDatabase(filename)  -- Retrieve the database using your existing function
21
    table.insert(database, 1, instruction)
22
    local startIndex = math.max(1, scrollPosition)
23
    local endIndex = math.min(#database, scrollPosition + maxLines - 1)
24
    
25
    while true do
26
        term.clear()
27
        -- Display the instruction
28
        print(instruction)
29
30
        -- Display the database content after the instruction
31
        for i = startIndex, endIndex do
32
            print(database[i])
33
        end
34
        
35
        local event, key = os.pullEvent("key")
36
        if key == keys.up then
37
            scrollPosition = math.max(1, scrollPosition - 1)
38
        elseif key == keys.down then
39
            scrollPosition = math.min(#database - maxLines + 1, scrollPosition + 1)
40
        elseif key == keys.backspace then
41
            break  -- Exit loop on backspace key press
42
        end
43
44
        startIndex = math.max(1, scrollPosition)
45
        endIndex = math.min(#database, scrollPosition + maxLines - 1)
46
    end
47
end
48
49
50
function dateTime()
51
    time = os.epoch("local") / 1000
52
	time_table = os.date("*t", time)
53
    return os.date("%Y-%m-%d %H:%M:%S", currentTime)
54
end
55
56
function log(id, line, success)
57
	local file = fs.open("log.txt", "a")
58
	file.writeLine(dateTime() .. " | Computer " .. tostring(id) .. " - " .. line .. " | Success = " .. tostring(success))
59
    file.close()
60
end
61
62
function addItem(item, value, filename, whitelist)
63
	local file = fs.open(filename, "a") -- Open file in append mode
64
    
65
    if not file then
66
        print("Error: Unable to open file for appending.")
67
        return
68
    end
69
70
	file.writeLine(item .. " " .. value)
71
	file.close()
72
	messageWhitelistItems(whitelist, filename)
73
end
74
75
function getItem(item, filename)
76
	-- Open the file for reading
77
    local file = fs.open(filename, "r")
78
    
79
    -- Read and process each line of the file
80
    local line = file.readLine()
81
	while line do
82
		if twoInputStrip(line) == item then
83
			return line
84
		end
85
		line = file.readLine()
86
	end
87
	file.close()
88
	return nil
89
end
90
91
function getAllItems(filename)
92
	-- Open the file for reading
93
    local file = fs.open(filename, "r")
94
    
95
    -- Read and process each line of the file
96
    local line = file.readLine()
97
	local itemdatabase = {}
98
	while line do
99
		table.insert(itemdatabase, line)
100
		line = file.readLine()
101
	end
102
	file.close()
103
	return itemdatabase
104
end
105
106
function deleteItem(item, filename, whitelist)
107
	ditem = getItem(item, filename)
108
	if ditem ~= nil then
109
		database = getAllItems(filename)
110
		local file = fs.open(filename, "w")
111
		for _, line in pairs(database) do
112
			if line ~= ditem then
113
				file.write(line .. "\n")
114
			end
115
		end
116
		file.close()
117
		messageWhitelistItems(whitelist, filename)
118
	else
119
		print(number, " not found in database")
120
	end
121
end
122
123
function addComputer(number, filename)
124
    local file = fs.open(filename, "a") -- Open file in append mode
125
    
126
    if not file then
127
        print("Error: Unable to open file for appending.")
128
        return
129
    end
130
    
131
    -- Write the number to the file
132
    file.writeLine(tostring(number))
133
    file.close()
134
    
135
    print("Computer " .. number .. " added to the whitelist.")
136
end
137
138
139
function getComputer(number, filename)
140
	local file = fs.open(filename, "r")
141
	local line = file.readLine()
142
	while line do
143
        if tonumber(number) == tonumber(line) then
144
			-- Print the separated components
145
			file.close()
146
			return true
147
		end
148
        line = file.readLine()
149
    end
150
	file.close()
151
	return false
152
end
153
154
function deleteComputer(number, filename)
155
	if getComputer(number, filename) then
156
		database = getDatabase(filename)
157
		local file = fs.open(filename, "w")
158
		for _, line in pairs(database) do
159
			if tonumber(line) ~= tonumber(number) then
160
				file.write(line .. "\n")
161
			end
162
		end
163
		file.close()
164
	else
165
		print(number, " not found in database")
166
	end
167
end
168
169
function stripLine(line)
170
	username, password, value, address = line:match("([^|]+)|([^|]+)|([^|]+)|([^|]+)")
171
	return username, password, value, address
172
end
173
174
function twoInputStrip(str)
175
	first, second = str:match("(%S+)%s+(%S+)")
176
	return first, second
177
end
178
179
function threeInputStrip(str)
180
	first, second, third = str:match("(%S+)%s+(%S+)%s+(%S+)")
181
	return first, second, third
182
end
183
184
function fourInputStrip(str)
185
	first, second, third, fourth = str:match("(%S+)%s+(%S+)%s+(%S+)%s+(%S+)")
186
	return first, second, third, fourth
187
end
188
189
function fiveInputStrip(str)
190
	first, second, third, fourth, five = str:match("(%S+)%s+(%S+)%s+(%S+)%s+(%S+)%s+(%S+)")
191
	return first, second, third, fourth, five
192
end
193
194
function searchDatabase(u, filename)
195
	local file = fs.open(filename, "r")
196
	local line = file.readLine()
197
	while line do
198
        -- Split the line into string and double components
199
        local username, password, value = stripLine(line)
200
        if u == username and string.len(u) == string.len(username) then
201
			file.close()
202
			return username, password
203
		end
204
        
205
        -- Read the next line
206
        line = file.readLine()
207
    end
208
	file.close()
209
end
210
211
function getDatabase(filename)
212
	 -- Open the file for reading
213
    local file = fs.open(filename, "r")
214
    
215
    -- Read and process each line of the file
216
    local line = file.readLine()
217
	local database = {}
218
	while line do
219
		table.insert(database, line)
220
		line = file.readLine()
221
	end
222
	file.close()
223
	return database
224
end
225
226
227
function getValue(u, filename)
228
    -- Open the file for reading
229
    local file = fs.open(filename, "r")
230
    
231
    -- Read and process each line of the file
232
    local line = file.readLine()
233
    while line do
234
        -- Split the line into string and double components
235
        local username, password, value = stripLine(line)
236
        
237
        if u == username then
238
			-- Print the separated components
239
			file.close()
240
			return value
241
		end
242
        
243
        -- Read the next line
244
        line = file.readLine()
245
    end
246
	file.close()
247
end
248
249
function getAddress(u, filename)
250
    -- Open the file for reading
251
    local file = fs.open(filename, "r")
252
    
253
    -- Read and process each line of the file
254
    local line = file.readLine()
255
    while line do
256
        -- Split the line into string and double components
257
        local username, password, value, address = stripLine(line)
258
        
259
        if u == username then
260
			-- Print the separated components
261
			file.close()
262
			return address
263
		end
264
        
265
        -- Read the next line
266
        line = file.readLine()
267
    end
268
	file.close()
269
end
270
271
function addUser(u, p, v, a, filename)
272
    -- Open the file for reading
273
    local file = fs.open(filename, "a")
274
	if searchDatabase(u, filename) == nil then
275
		file.write(u .. "|" .. p .. "|" .. v .. "|" .. a .. "\n")
276
		file.close()
277
		print("Client Added")
278
		return true
279
	else
280
		print("Client Already in Database")
281
	end
282
    file.close()
283
end
284
285
function deleteUser(u, filename)
286
	if searchDatabase(u, filename) ~= nil then
287
		database = getDatabase(filename)
288
		local file = fs.open(filename, "w")
289
		for _, line in pairs(database) do
290
			username, password, value = stripLine(line)
291
			if username ~= u then
292
				file.write(line .. "\n")
293
			end
294
		end
295
		file.close()
296
	else
297
		print(u, " not found in database")
298
	end
299
end
300
301
function changeUsername(u, nu, filename)
302
	if searchDatabase(u, filename) ~= nil then
303
		database = getDatabase(filename)
304
		local file = fs.open(filename, "w")
305
		for _, line in pairs(database) do
306
			username, password, value, address = stripLine(line)
307
			if username ~= u then
308
				file.write(line .. "\n")
309
			else
310
				file.write(nu .. "|" .. password .. "|" .. value .. "|" .. address .. "\n")
311
			end
312
		end
313
		file.close()
314
	else
315
		print(u, " not found in database")
316
	end
317
end
318
319
function changePassword(u, np, filename)
320
	if searchDatabase(u, filename) ~= nil then
321
		database = getDatabase(filename)
322
		local file = fs.open(filename, "w")
323
		for _, line in pairs(database) do
324
			username, password, value = stripLine(line)
325
			if username ~= u then
326
				file.write(line .. "\n")
327
			else
328
				file.write(username .. "|" .. np .. "|" .. value .. "|" .. address .. "\n")
329
			end
330
		end
331
		file.close()
332
	else
333
		print(u, " not found in database")
334
	end
335
end
336
337
function changeValue(u, nv, filename)
338
	if searchDatabase(u, filename) ~= nil then
339
		database = getDatabase(filename)
340
		local file = fs.open(filename, "w")
341
		for _, line in pairs(database) do
342
			username, password, value = stripLine(line)
343
			if username ~= u then
344
				file.write(line .. "\n")
345
			else
346
				file.write(username .. "|" .. password .. "|" .. nv .. "|" .. address .. "\n")
347
			end
348
		end
349
		file.close()
350
	end
351
end
352
353
function changeAddress(u, na, filename)
354
	if searchDatabase(u, filename) ~= nil then
355
		database = getDatabase(filename)
356
		local file = fs.open(filename, "w")
357
		for _, line in pairs(database) do
358
			username, password, value = stripLine(line)
359
			if username ~= u then
360
				file.write(line .. "\n")
361
			else
362
				file.write(username .. "|" .. password .. "|" .. value .. "|" .. na .. "\n")
363
			end
364
		end
365
		file.close()
366
	end
367
end
368
369
local function displayClientMenu()
370
	print("User Menu")
371
    print("1. Add user")
372
    print("2. Delete user")
373
    print("3. Change username")
374
    print("4. Change password")
375
    print("5. Change balance")
376
	print("6. Change address")
377
    print("7. Display database")
378
	print("8. Display user")
379
    print("0. Exit")
380
end
381
382
local function displayWhitelistMenu()
383
	print("ATM Item Menu")
384
	print("1. Add a Computer")
385
    print("2. Display Whitelist")
386
	print("3. Delete Computer")
387
	print("4. Display Log")
388
    print("0. Exit")
389
end
390
391
local function displayVMWhitelistMenu()
392
	print("VM Item Menu")
393
	print("1. Add a Computer")
394
    print("2. Display Whitelist")
395
	print("3. Delete Computer")
396
	print("4. Display Log")
397
    print("0. Exit")
398
end
399
400
local function ATMItemMenu()
401
	print("ATM Item Menu")
402
	print("1. Add an Item")
403
    print("2. Display Items")
404
	print("3. Remove an Item")
405
    print("0. Exit")
406
end
407
408
local function VMItemMenu()
409
	print("Vending Machine Item Menu")
410
	print("1. Add an Item")
411
    print("2. Display Items")
412
	print("3. Remove an Item")
413
    print("0. Exit")
414
end
415
416
-- Function to display the menu
417
local function displayMenu()
418
    print("User Menu")
419
    print("1. clientMenu")
420
    print("2. whitelistMenu")
421
	print("3. ATMItemMenu")
422
	print("4. VMwhitelistMenu")
423
	print("5. VMItemMenu")
424
	print("6. Turn Off Server")
425
    print("0. Exit")
426
end
427
428
-- Main function to handle user input
429
local function main(filename, whitelist, vmwhitelist, itemlist, vmitemlist)
430
    while true do
431
		shell.run("clear")
432
        displayMenu()
433
        io.write("Enter your choice: ")
434
        local gchoice = tonumber(io.read())
435
		if gchoice == 1 then
436
			shell.run("clear")
437
		    while true do
438
                displayClientMenu()
439
                io.write("Enter your choice: ")
440
                local choice = tonumber(io.read())
441
                if choice == 1 then
442
                    print("Adding a new user")
443
                    print("Enter username:")
444
                    local username = io.read()
445
                    print("Enter password:")
446
                    local password = io.read()
447
                    print("Enter value:")
448
                    local value = tonumber(io.read())
449
 					print("Enter address (format: x,y,z):")
450
                    local address = io.read()
451
                    -- Add user to the database
452
                    addUser(username, password, value, address, filename)
453
					io.write("Press Anything to Continue: ")
454
        			io.read()
455
					shell.run("clear")
456
                elseif choice == 2 then
457
                    print("Deleting a user")
458
                    print("Enter username to delete:")
459
                    local username = io.read()
460
                    -- Delete user from the database
461
                    deleteUser(username, filename)
462
					io.write("Press Anything to Continue: ")
463
        			io.read()
464
					shell.run("clear")
465
                elseif choice == 3 then
466
                    print("Changing username")
467
                    print("Enter username to change:")
468
                    local oldUsername = io.read()
469
                    print("Enter new username:")
470
                    local newUsername = io.read()
471
                    -- Change username in the database
472
                    changeUsername(oldUsername, newUsername, filename)
473
					io.write("Press Anything to Continue: ")
474
        			io.read()
475
					shell.run("clear")
476
                elseif choice == 4 then
477
                    print("Changing password")
478
                    print("Enter username:")
479
                    local username = io.read()
480
                    print("Enter new password:")
481
                    local newPassword = io.read()
482
                    -- Change password in the database
483
                    changePassword(username, newPassword, filename)
484
					io.write("Press Anything to Continue: ")
485
        			io.read()
486
					shell.run("clear")
487
                elseif choice == 5 then
488
                    print("Changing balance")
489
                    print("Enter username:")
490
                    local username = io.read()
491
                    print("Enter new value:")
492
                    local newValue = tonumber(io.read())
493
                    -- Change value in the database
494
                    changeValue(username, newValue, filename)
495
					io.write("Press Anything to Continue: ")
496
        			io.read()
497
					shell.run("clear")
498
				elseif choice == 6 then
499
					print("Changing address")
500
                    print("Enter username:")
501
                    local username = io.read()
502
                    print("Enter new address:")
503
                    local newAddress = io.read()
504
					changeAddress(username, newAddress, filename)
505
					io.write("Press Anything to Continue: ")
506
        			io.read()
507
					shell.run("clear")
508
                elseif choice == 7 then
509
                    print("Displaying database")
510
                    -- Display the database
511
                    database = getDatabase(filename)
512
                    print("\n")
513
                    for _, line in pairs(database) do
514
                        username, password, value, address = stripLine(line)
515
                        print(username, " ", password, " ", value, " ",  address, "\n")
516
                    end
517
					io.write("Press Anything to Continue: ")
518
        			io.read()
519
					shell.run("clear")
520
                elseif choice == 8 then
521
                    print("Enter username:")
522
                    local username = io.read()
523
                    username, password = searchDatabase(username, filename)
524
                    if username == nil then
525
                        print("User not Found")
526
                    else
527
                        print(username, " ", password, " ", getValue(username, filename), "\n")
528
                    end
529
					io.write("Press Anything to Continue: ")
530
        			io.read()
531
					shell.run("clear")
532
                elseif choice == 0 then
533
                    print("Exiting...")
534
					shell.run("clear")
535
                    break
536
                else
537
                    print("Invalid choice. Please try again.")
538
                end
539
            end
540
		elseif gchoice == 2 then
541
			shell.run("clear")
542
			while true do
543
                displayWhitelistMenu()
544
                io.write("Enter your choice: ")
545
                local choice = tonumber(io.read())
546
                if choice == 1 then
547
    				print("Enter the Computers ID:")
548
                    local id = io.read()
549
					addComputer(id, whitelist)
550
					io.write("Press Anything to Continue: ")
551
        			io.read()
552
					shell.run("clear")
553
                elseif choice == 2 then
554
    				print("Displaying database")
555
                    -- Display the database
556
                    computers = getDatabase(whitelist)
557
                    print("\n")
558
                    for _, line in pairs(computers) do
559
                        print(line, "\n")
560
                    end
561
					io.write("Press Anything to Continue: ")
562
        			io.read()
563
					shell.run("clear")
564
                elseif choice == 3 then
565
    				print("Enter the Computers ID:")
566
                    local id = io.read()
567
					deleteComputer(id, whitelist)
568
					io.write("Press Anything to Continue: ")
569
        			io.read()
570
					shell.run("clear")
571
				elseif choice == 4 then
572
					shell.run("clear")
573
					displayLog("log.txt", 1, 10)
574
					shell.run("clear")
575
                elseif choice == 0 then
576
                    print("Exiting...")
577
					shell.run("clear")
578
                    break
579
                else
580
                    print("Invalid choice. Please try again.")
581
                end
582
			end
583
		elseif gchoice == 3 then
584
			while true do
585
				ATMItemMenu()
586
				io.write("Enter your choice: ")
587
                local choice = tonumber(io.read())
588
                if choice == 1 then
589
					print("Adding a new item")
590
                    print("Enter item minecraft name:")
591
                    local iname = io.read()
592
                    print("Enter item value:")
593
                    local ivalue = io.read()
594
                    -- Add user to the database
595
                    addItem(iname, ivalue, itemlist, whitelist)
596
					io.write("Press Anything to Continue: ")
597
        			io.read()
598
					shell.run("clear")
599
				elseif choice == 2 then
600
					print("Displaying items")
601
                    -- Display the database
602
                    database = getAllItems(itemlist)
603
                    print("\n")
604
                    for _, line in pairs(database) do
605
                        print(line, "\n")
606
                    end
607
					io.write("Press Anything to Continue: ")
608
        			io.read()
609
					shell.run("clear")
610
				elseif choice == 3 then
611
					print("Deleting an item")
612
                    print("Enter item minecraft name:")
613
                    local iname = io.read()
614
                    deleteItem(iname, itemlist, whitelist)
615
					io.write("Press Anything to Continue: ")
616
        			io.read()
617
					shell.run("clear")
618
				elseif choice == 0 then
619
					print("Exiting...")
620
					shell.run("clear")
621
            			break
622
				else
623
					print("Invalid choice. Please try again.")
624
				end
625
			end
626
		elseif gchoice == 4 then
627
			shell.run("clear")
628
			while true do
629
                displayVMWhitelistMenu()
630
                io.write("Enter your choice: ")
631
                local choice = tonumber(io.read())
632
                if choice == 1 then
633
    				print("Enter the Computers ID:")
634
                    local id = io.read()
635
					addComputer(id, vmwhitelist)
636
					io.write("Press Anything to Continue: ")
637
        			io.read()
638
					shell.run("clear")
639
                elseif choice == 2 then
640
    				print("Displaying database")
641
                    -- Display the database
642
                    computers = getDatabase(vmwhitelist)
643
                    print("\n")
644
                    for _, line in pairs(computers) do
645
                        print(line, "\n")
646
                    end
647
					io.write("Press Anything to Continue: ")
648
        			io.read()
649
					shell.run("clear")
650
                elseif choice == 3 then
651
    				print("Enter the Computers ID:")
652
                    local id = io.read()
653
					deleteComputer(id, vmwhitelist)
654
					io.write("Press Anything to Continue: ")
655
        			io.read()
656
					shell.run("clear")
657
				elseif choice == 4 then
658
					shell.run("clear")
659
					displayLog("log.txt", 1, 10)
660
					shell.run("clear")
661
                elseif choice == 0 then
662
                    print("Exiting...")
663
					shell.run("clear")
664
                    break
665
                else
666
                    print("Invalid choice. Please try again.")
667
                end
668
			end
669
		elseif gchoice == 5 then
670
			while true do
671
				VMItemMenu()
672
				io.write("Enter your choice: ")
673
                local choice = tonumber(io.read())
674
                if choice == 1 then
675
					print("Adding a new item")
676
                    print("Enter item minecraft name:")
677
                    local iname = io.read()
678
                    print("Enter item value:")
679
                    local ivalue = io.read()
680
                    -- Add user to the database
681
                    addItem(iname, ivalue, vmitemlist, vmwhitelist)
682
					io.write("Press Anything to Continue: ")
683
        			io.read()
684
					shell.run("clear")
685
				elseif choice == 2 then
686
					print("Displaying items")
687
                    -- Display the database
688
                    database = getAllItems(vmitemlist)
689
                    print("\n")
690
                    for _, line in pairs(database) do
691
                        print(line, "\n")
692
                    end
693
					io.write("Press Anything to Continue: ")
694
        			io.read()
695
					shell.run("clear")
696
				elseif choice == 3 then
697
					print("Deleting an item")
698
                    print("Enter item minecraft name:")
699
                    local iname = io.read()
700
                    deleteItem(iname, vmitemlist, vmwhitelist)
701
					io.write("Press Anything to Continue: ")
702
        			io.read()
703
					shell.run("clear")
704
				elseif choice == 0 then
705
					print("Exiting...")
706
					shell.run("clear")
707
            			break
708
				else
709
					print("Invalid choice. Please try again.")
710
				end
711
			end
712
		elseif gchoice == 6 then
713
			return true
714
		elseif gchoice == 0 then
715
            print("Exiting...")
716
			shell.run("clear")
717
            break
718
		else
719
        	print("Invalid choice. Please try again.")
720
		end
721
    end
722
end
723
724
local function serverCoroutine(filename, whitelist, vmwhitelist, itemlist, vmitemlist)
725
    orders = {}
726
	while true do
727
        gsuccess = false
728
		-- Listen for incoming messages
729
        local senderId, message = rednet.receive()
730
        if getComputer(senderId, whitelist) then
731
            success, command, line = pcall(twoInputStrip, message)
732
            if success and line ~= nil then
733
                if command == "balance" then
734
                    success, command, nusername, npassword, balancechange = pcall(fourInputStrip, message)
735
                    if success and nusername ~= nil and npassword ~= nil and balancechange ~= nil then
736
						dusername, dpassword = searchDatabase(nusername, filename)
737
                        if tostring(dusername) ~= nil and tostring(dpassword) ~= nil then
738
                            if npassword == dpassword then
739
                        		nv = tonumber(getValue(nusername, filename)) + tonumber(balancechange)
740
                        		changeValue(nusername, nv, filename)
741
								rednet.send(senderId, getValue(nusername, filename))
742
								gsuccess = true
743
							end
744
						end
745
                    end
746
                elseif command == "address" then
747
					success, command, nusername, npassword, balancechange = pcall(fourInputStrip, message)
748
                    if success and nusername ~= nil then
749
						dusername, dpassword = searchDatabase(nusername, filename)
750
                        daddress = getAddress(dusername, filename)
751
						if tostring(dusername) ~= nil and daddress ~= nil then
752
							rednet.send(senderId, daddress)
753
							gsuccess = true
754
						end
755
					end
756
				end
757
            end
758
		end
759
		success, command, line = pcall(twoInputStrip, message)
760
        if success and line ~= nil then
761
            if command == "buy" then
762
                success, command, nusername, npassword, balancechange = pcall(fourInputStrip, message)
763
                if success and nusername ~= nil and npassword ~= nil and balancechange ~= nil then
764
                    dusername, dpassword = searchDatabase(nusername, filename)
765
                    if tostring(dusername) ~= nil and tostring(dpassword) ~= nil then
766
                        if npassword == dpassword then
767
                            if tonumber(balancechange) >= 0 and tonumber(getValue(nusername, filename)) >= tonumber(balancechange) then
768
                                nv = tonumber(getValue(nusername, filename)) - tonumber(balancechange)
769
                                changeValue(nusername, nv, filename)
770
                                rednet.send(senderId, getValue(nusername, filename))
771
                                gsuccess = true
772
								if orders ~= nil then
773
									for i, order in ipairs(orders) do
774
										print(order)
775
										print(tonumber(order[2]) == tonumber(balancechange))
776
										print(tonumber(order[3]) == tonumber(id))
777
										print(tonumber(order[3]))
778
										print(tonumber(senderId))
779
										if tonumber(order[2]) == tonumber(balancechange) and tonumber(order[3]) == tonumber(senderId) then
780
											cashierId = tonumber(order[1])
781
											print(cashierId)
782
											rednet.send(cashierId, "true")
783
											table.remove(orders, i)
784
											break
785
										end
786
									end
787
								end
788
                            end
789
                        end
790
                    end
791
                end
792
            elseif command == "search" then
793
                success, command, nusername, npassword = pcall(threeInputStrip, message)
794
                if success and nusername ~= nil and npassword ~= nil then
795
                    dusername, dpassword = searchDatabase(nusername, filename)
796
                    if tostring(dusername) ~= nil and tostring(dpassword) ~= nil then
797
                        if npassword == dpassword then
798
                            rednet.send(senderId, getValue(nusername, filename))
799
                            gsuccess = true
800
                        end
801
                    end
802
                end
803
            elseif command == "transfer" then
804
                success, command, nusername, npassword, balancechange, nusername2 = pcall(fiveInputStrip, message)
805
                if success and nusername ~= nil and npassword ~= nil and balancechange ~= nil and nusername2 ~= nil and nusername ~= nusername2 then
806
                    dusername, dpassword = searchDatabase(nusername, filename)
807
                    nusername2 = searchDatabase(nusername2, filename)
808
                    if tostring(dusername) ~= nil and tostring(dpassword) ~= nil then
809
                        if npassword == dpassword then
810
                            if nusername2 ~= nil then
811
                                if tonumber(balancechange) > 0 and tonumber(balancechange) <= tonumber(getValue(nusername, filename)) then
812
                                    nv = tonumber(getValue(nusername, filename) - tonumber(balancechange))
813
                                    nv2 = tonumber(getValue(nusername2, filename) + tonumber(balancechange))
814
                                    changeValue(nusername, nv, filename)
815
                                    changeValue(nusername2, nv2, filename)
816
                                    rednet.send(senderId, tonumber(getValue(nusername, filename)))
817
                                    gsuccess = true
818
                                end
819
                            end
820
                        end
821
                    end
822
                end
823
            elseif command == "items" then
824
            	rednet.send(senderId, getAllItems(itemlist))
825
				gsuccess = true
826
			elseif command == "vmitems" then
827
            	rednet.send(senderId, getAllItems(vmitemlist))
828
				gsuccess = true
829
			elseif command == "serverbuyrequest" then
830
				command, balance, phoneID = threeInputStrip(message)
831
				if balance ~= nil and phoneID ~= nil then
832
					table.insert(orders, {senderId, balance, phoneID})
833
					gsuccess = true
834
				end
835
			elseif command == "removebuyrequest" then
836
				command, balance, phoneID = threeInputStrip(message)
837
				if orders ~= nil then
838
					for i, order in ipairs(orders) do
839
						if tonumber(id) == tonumber(order[1]) and tonumber(balance) == tonumber(order[2]) and tonumber(phoneID) == tonumber(order[3]) then
840
							table.remove(orders, i)
841
							gsuccess = true
842
						end
843
					end
844
				end
845
			end
846
		log(senderId, message, gsuccess)
847
		if gsuccess == false then
848
			rednet.send(senderId, "false")
849
		end
850
		end
851
    end
852
end
853
854
-- Main coroutine for the login screen
855
local function loginCoroutine(filename, whitelist, vmwhitelist, itemlist, vmitemlist)
856
    while true do
857
		-- Display login screen
858
    	print("Login Screen")
859
    	print("Enter username:")
860
    	local username = read()
861
    	print("Enter password:")
862
    	local password = read("*")
863
864
    	-- If login is successful, unlock the screen
865
    	if username == myusername and password == mypassword then
866
        	print("Login successful")
867
        	if main(filename, whitelist, vmwhitelist, itemlist, vmitemlist) then
868
				break
869
			end
870
			shell.run("clear")
871
    	else
872
       		print("Login failed")
873
    	end
874
	end
875
end
876
877
os.pullEvent = os.pullEventRaw
878
whitelist = "whitelist.txt"
879
vmwhitelist = "vmwhitelist.txt"
880
filename = "clients.txt"
881
itemlist = "items.txt"
882
vmitemlist = "vmitems.txt"
883
if fs.exists(filename) then
884
	rednet.open("top")
885
	parallel.waitForAny(
886
    	function() loginCoroutine(filename, whitelist, vmwhitelist, itemlist, vmitemlist) end,
887
    	function() serverCoroutine(filename, whitelist, vmwhitelist, itemlist, vmitemlist) end
888
	)
889
else
890
	print("No File to Protect")
891
end