diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm
index 4540867f9fe..d2991112b0f 100644
--- a/code/modules/economy/ATM.dm
+++ b/code/modules/economy/ATM.dm
@@ -155,138 +155,144 @@ log transactions
return data
-/obj/machinery/atm/Topic(href, list/href_list)
- if(href_list["choice"])
- switch(href_list["choice"])
- if("transfer")
- if(authenticated_account && linked_db)
- var/transfer_amount = text2num(href_list["funds_amount"])
- if(transfer_amount <= 0)
- alert("That is not a valid amount.")
- else if(transfer_amount <= authenticated_account.money)
- var/target_account_number = text2num(href_list["target_acc_number"])
- var/transfer_purpose = href_list["purpose"]
- if(linked_db.charge_to_account(target_account_number, authenticated_account, transfer_purpose, machine_id, transfer_amount))
- to_chat(usr, "[bicon(src)]Funds transfer successful.")
- else
- to_chat(usr, "[bicon(src)]Funds transfer failed.")
-
- else
- to_chat(usr, "[bicon(src)]You don't have enough funds to do that!")
- if("view_screen")
- view_screen = text2num(href_list["view_screen"])
- if("change_security_level")
- if(authenticated_account)
- var/new_sec_level = max( min(text2num(href_list["new_security_level"]), 2), 0)
- authenticated_account.security_level = new_sec_level
- if("attempt_auth")
- if(linked_db)
- if(!ticks_left_locked_down)
- var/tried_account_num = text2num(href_list["account_num"])
- if(!tried_account_num && held_card)
- tried_account_num = held_card.associated_account_number
- var/tried_pin = text2num(href_list["account_pin"])
-
- authenticated_account = attempt_account_access(tried_account_num, tried_pin, held_card && held_card.associated_account_number == tried_account_num ? 2 : 1)
- if(!authenticated_account)
- number_incorrect_tries++
- if(previous_account_number == tried_account_num)
- if(number_incorrect_tries > max_pin_attempts)
- //lock down the atm
- ticks_left_locked_down = 30
- playsound(src, 'sound/machines/buzz-two.ogg', 50, 1)
-
- //create an entry in the account transaction log
- var/datum/money_account/failed_account = linked_db.get_account(tried_account_num)
- if(failed_account)
- var/datum/transaction/T = new()
- T.target_name = failed_account.owner_name
- T.purpose = "Unauthorised login attempt"
- T.source_terminal = machine_id
- T.date = GLOB.current_date_string
- T.time = station_time_timestamp()
- failed_account.transaction_log.Add(T)
- else
- to_chat(usr, "[bicon(src)]Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.")
- previous_account_number = tried_account_num
- playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
- else
- to_chat(usr, "[bicon(src)]Incorrect pin/account combination entered.")
- number_incorrect_tries = 0
- else
- playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
- ticks_left_timeout = 120
- view_screen = NO_SCREEN
-
- //create a transaction log entry
- var/datum/transaction/T = new()
- T.target_name = authenticated_account.owner_name
- T.purpose = "Remote terminal access"
- T.source_terminal = machine_id
- T.date = GLOB.current_date_string
- T.time = station_time_timestamp()
- authenticated_account.transaction_log.Add(T)
- to_chat(usr, "[bicon(src)]Access granted. Welcome user '[authenticated_account.owner_name].'")
- previous_account_number = tried_account_num
- if("withdrawal")
- var/amount = max(text2num(href_list["funds_amount"]),0)
- if(amount <= 0)
- alert("That is not a valid amount.")
- else if(authenticated_account && amount > 0)
- if(amount <= authenticated_account.money)
- playsound(src, 'sound/machines/chime.ogg', 50, 1)
-
- //remove the money
- if(amount > 100000) // prevent crashes
- to_chat(usr, "The ATM's screen flashes, 'Maximum single withdrawl limit reached, defaulting to 100,000.'")
- amount = 100000
- withdraw_arbitrary_sum(amount)
- authenticated_account.charge(amount, null, "Credit withdrawal", machine_id, authenticated_account.owner_name)
- else
- to_chat(usr, "[bicon(src)]You don't have enough funds to do that!")
- if("balance_statement")
- if(authenticated_account)
- if(world.timeofday < lastprint + PRINT_DELAY)
- to_chat(usr, "The [name] flashes an error on its display.")
- return
- lastprint = world.timeofday
- playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
- var/obj/item/paper/R = new(loc)
- R.name = "Account balance: [authenticated_account.owner_name]"
- R.info = {"NT Automated Teller Account Statement
- Account holder: [authenticated_account.owner_name]
- Account number: [authenticated_account.account_number]
- Balance: $[authenticated_account.money]
- Date and time: [station_time_timestamp()], [GLOB.current_date_string]
- Service terminal ID: [machine_id]
"}
-
- //stamp the paper
- var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
- stampoverlay.icon_state = "paper_stamp-cent"
- if(!R.stamped)
- R.stamped = new()
- R.stamped += /obj/item/stamp
- R.overlays += stampoverlay
- R.stamps += "
This paper has been stamped by the Automatic Teller Machine."
-
- playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1)
- if("insert_card")
- if(held_card)
- held_card.forceMove(loc)
- authenticated_account = null
- if(ishuman(usr) && !usr.get_active_hand())
- usr.put_in_hands(held_card)
- held_card = null
+/obj/machinery/atm/tgui_act(action, params)
+ switch(action)
+ if("transfer")
+ if(!authenticated_account || !linked_db)
+ return
+ var/transfer_amount = text2num(params["funds_amount"])
+ if(transfer_amount <= 0)
+ alert("That is not a valid amount.")
+ else if(transfer_amount <= authenticated_account.money)
+ var/target_account_number = text2num(params["target_acc_number"])
+ var/transfer_purpose = params["purpose"]
+ if(linked_db.charge_to_account(target_account_number, authenticated_account, transfer_purpose, machine_id, transfer_amount))
+ to_chat(usr, "[bicon(src)]Funds transfer successful.")
else
- var/obj/item/I = usr.get_active_hand()
- if(istype(I, /obj/item/card/id))
- usr.drop_item()
- I.forceMove(src)
- held_card = I
- if("logout")
- authenticated_account = null
+ to_chat(usr, "[bicon(src)]Funds transfer failed.")
+ else
+ to_chat(usr, "[bicon(src)]You don't have enough funds to do that!")
- SSnanoui.update_uis(src)
+ if("view_screen")
+ view_screen = text2num(params("view_screen"))
+
+ if("change_security_level")
+ if(authenticated_account)
+ var/new_sec_level = max(min(text2num(params["new_security_level"]), 2), 0)
+ authenticated_account.security_level = new_sec_level
+
+ if("attempt_auth")
+ if(linked_db)
+ if(!ticks_left_locked_down)
+ var/tried_account_num = text2num(params["account_num"])
+ if(!tried_account_num && held_card)
+ tried_account_num = held_card.associated_account_number
+ var/tried_pin = text2num(params["account_pin"])
+
+ authenticated_account = attempt_account_access(tried_account_num, tried_pin, held_card && held_card.associated_account_number == tried_account_num ? 2 : 1)
+ if(!authenticated_account)
+ number_incorrect_tries++
+ if(previous_account_number == tried_account_num)
+ if(number_incorrect_tries > max_pin_attempts)
+ //lock down the atm
+ ticks_left_locked_down = 30
+ playsound(src, 'sound/machines/buzz-two.ogg', 50, 1)
+
+ //create an entry in the account transaction log
+ var/datum/money_account/failed_account = linked_db.get_account(tried_account_num)
+ if(failed_account)
+ var/datum/transaction/T = new()
+ T.target_name = failed_account.owner_name
+ T.purpose = "Unauthorised login attempt"
+ T.source_terminal = machine_id
+ T.date = GLOB.current_date_string
+ T.time = station_time_timestamp()
+ failed_account.transaction_log.Add(T)
+ else
+ to_chat(usr, "[bicon(src)]Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.")
+ previous_account_number = tried_account_num
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
+ else
+ to_chat(usr, "[bicon(src)]Incorrect pin/account combination entered.")
+ number_incorrect_tries = 0
+ else
+ playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
+ ticks_left_timeout = 120
+ view_screen = NO_SCREEN
+
+ //create a transaction log entry
+ var/datum/transaction/T = new()
+ T.target_name = authenticated_account.owner_name
+ T.purpose = "Remote terminal access"
+ T.source_terminal = machine_id
+ T.date = GLOB.current_date_string
+ T.time = station_time_timestamp()
+ authenticated_account.transaction_log.Add(T)
+ to_chat(usr, "[bicon(src)]Access granted. Welcome user '[authenticated_account.owner_name].'")
+ previous_account_number = tried_account_num
+
+ if("withdrawal")
+ var/amount = max(text2num(params["funds_amount"]),0)
+ if(amount <= 0)
+ alert("That is not a valid amount.")
+ else if(authenticated_account && amount > 0)
+ if(amount <= authenticated_account.money)
+ playsound(src, 'sound/machines/chime.ogg', 50, 1)
+
+ //remove the money
+ if(amount > 100000) // prevent crashes
+ to_chat(usr, "The ATM's screen flashes, 'Maximum single withdrawl limit reached, defaulting to 100,000.'")
+ amount = 100000
+ withdraw_arbitrary_sum(amount)
+ authenticated_account.charge(amount, null, "Credit withdrawal", machine_id, authenticated_account.owner_name)
+ else
+ to_chat(usr, "[bicon(src)]You don't have enough funds to do that!")
+
+ if("balance_statement")
+ if(authenticated_account)
+ if(world.timeofday < lastprint + PRINT_DELAY)
+ to_chat(usr, "The [name] flashes an error on its display.")
+ return
+ lastprint = world.timeofday
+ playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
+ var/obj/item/paper/R = new(loc)
+ R.name = "Account balance: [authenticated_account.owner_name]"
+ R.info = {"NT Automated Teller Account Statement
+ Account holder: [authenticated_account.owner_name]
+ Account number: [authenticated_account.account_number]
+ Balance: $[authenticated_account.money]
+ Date and time: [station_time_timestamp()], [GLOB.current_date_string]
+ Service terminal ID: [machine_id]
"}
+
+ //stamp the paper
+ var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
+ stampoverlay.icon_state = "paper_stamp-cent"
+ if(!R.stamped)
+ R.stamped = new()
+ R.stamped += /obj/item/stamp
+ R.overlays += stampoverlay
+ R.stamps += "
This paper has been stamped by the Automatic Teller Machine."
+
+ playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1)
+
+ if("insert_card")
+ if(held_card)
+ held_card.forceMove(loc)
+ authenticated_account = null
+ if(ishuman(usr) && !usr.get_active_hand())
+ usr.put_in_hands(held_card)
+ held_card = null
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if(istype(I, /obj/item/card/id))
+ usr.drop_item()
+ I.forceMove(src)
+ held_card = I
+
+ if("logout")
+ authenticated_account = null
+
+ . = TRUE
return 1
//create the most effective combination of notes to make up the requested amount
diff --git a/tgui/packages/tgui/interfaces/ATM.js b/tgui/packages/tgui/interfaces/ATM.js
index e69de29bb2d..1b2ea23a183 100644
--- a/tgui/packages/tgui/interfaces/ATM.js
+++ b/tgui/packages/tgui/interfaces/ATM.js
@@ -0,0 +1,4 @@
+import { useBackend } from '../backend';
+import { Button, LabeledList, Section } from '../components';
+import { Window } from '../layouts';
+