@startuml sequence_deposit

title Sequence: Deposit XP

collections McSteve
collections McXpBankDepositApprover
collections DiscordAPI
collections GameServer
queue McXpBankDepositApproved
collections McXpBankDepositExecutor
database XpAccounts

McSteve -> McXpBankDepositApprover: POST /bank/deposit (userId, amount)
alt non-positive amount
    McSteve <-- McXpBankDepositApprover: HTTP 400
end
McSteve <-- McXpBankDepositApprover: HTTP 202

' Deposit Approver App
McXpBankDepositApprover -> GameServer: rcon(queryXpInLevels(userId))
alt command success
    McXpBankDepositApprover <-- GameServer: currentLevels
    McXpBankDepositApprover -> McXpBankDepositApprover: convertToPoints(currentLevels)
    alt player has enough XP
        McXpBankDepositApprover -> McXpBankDepositApproved: sendMessage(userId, amount, msgGroupID)
        McXpBankDepositApprover -> DiscordAPI: POST to Webhook: Txn Approved
    else player has insufficient XP
        McXpBankDepositApprover -> DiscordAPI: POST to Webhook: Insufficient Funds
    end
else command failure
    McXpBankDepositApprover -> DiscordAPI: POST to Webhook: Error querying player XP
end

' Deposit Executor App
McXpBankDepositApproved --> McXpBankDepositExecutor: receiveEvent(userId, amount)
McXpBankDepositExecutor -> GameServer: rcon(removeXpInPoints(userId, amount))

alt command success
    McXpBankDepositExecutor <-- GameServer: Success Response
    McXpBankDepositExecutor -> XpAccounts: update(userId, incrment(amount))
    McXpBankDepositExecutor -> McXpBankDepositApproved: deleteMessage(ReceiptHandle)
    McXpBankDepositExecutor -> DiscordAPI: POST to Webhook: Txn Complete
else command failure
    McXpBankDepositExecutor <-- GameServer: ERROR
    McXpBankDepositExecutor -> McXpBankDepositExecutor: Log Error
end

@enduml
