server - Handle cokebank errors when dispensing
[tpg/opendispense2.git] / src / server / dispense.c
index 8375ab6..c994e33 100644 (file)
@@ -45,33 +45,52 @@ int DispenseItem(int ActualUser, int User, tItem *Item)
        // Get username for debugging
        username = Bank_GetAcctName(User);
        
-       // Actually do the dispense
-       if( handler->DoDispense ) {
-               ret = handler->DoDispense( User, Item->ID );
-               if(ret) {
-                       Log_Error("Dispense failed (%s dispensing %s:%i '%s')",
-                               username, Item->Name, Item->Handler->Name, Item->ID);
-                       free( username );
-                       return -1;      // 1: Unknown Error again
-               }
-       }
+       // Ordering: Pay, Drop. Worst case requires a refund, other ordering leads to drops when payment fails.
        
        // Take away money
        if( Item->Price )
        {
                char    *reason;
                reason = mkstr("Dispense - %s:%i %s", handler->Name, Item->ID, Item->Name);
-               _Transfer( User, salesAcct, Item->Price, reason );
+               if( _Transfer( User, salesAcct, Item->Price, reason ) != 0 ) {
+                       Log_Error("Dispense failed (%s dispensing %s:%i '%s') - Cokebank error!",
+                               username, Item->Handler->Name, Item->ID, Item->Name);
+                       free(reason);
+                       free( username );
+                       return -1;      // -1: Unknown error
+               }
                free(reason);
        }
        
+       // Actually do the dispense
+       if( handler->DoDispense ) {
+               ret = handler->DoDispense( User, Item->ID );
+               if(ret) {
+                       Log_Error("Dispense failed (%s dispensing %s:%i '%s')",
+                               username, Item->Handler->Name, Item->ID, Item->Name);
+                       free( username );
+                       return -1;      // -1: Unknown Error
+               }
+       }
+       
        actualUsername = Bank_GetAcctName(ActualUser);
        
        // And log that it happened
-       Log_Info("dispense '%s' (%s:%i) for %s by %s [cost %i, balance %i]",
-               Item->Name, handler->Name, Item->ID,
-               username, actualUsername, Item->Price, Bank_GetBalance(User)
-               );
+       if( gbNoCostMode )
+       {
+               // Special format for zero cost dispenses
+               Log_Info("test dispense '%s' (%s:%i) for %s by %s [no change]",
+                       Item->Name, handler->Name, Item->ID,
+                       username, actualUsername
+                       );
+       }
+       else
+       {
+               Log_Info("dispense '%s' (%s:%i) for %s by %s [cost %i, balance %i]",
+                       Item->Name, handler->Name, Item->ID,
+                       username, actualUsername, Item->Price, Bank_GetBalance(User)
+                       );
+       }
        
        free( username );
        free( actualUsername );
@@ -120,6 +139,10 @@ int DispenseGive(int ActualUser, int SrcUser, int DestUser, int Ammount, const c
        char    *actualUsername;
        char    *srcName, *dstName;
        
+       // HACK: Naming a slot "dead" disables it (catch for snack)
+       if( strcmp(ReasonGiven, "dead") == 0 )
+               return 1;
+       
        if( Ammount < 0 )       return 1;       // Um... negative give? Not on my watch!
        
        ret = _Transfer( SrcUser, DestUser, Ammount, ReasonGiven );
@@ -188,9 +211,9 @@ int DispenseAdd(int ActualUser, int User, int Ammount, const char *ReasonGiven)
        char    *dstName, *byName;
        
 #if DISPENSE_ADD_BELOW_MIN
-       ret = _Transfer( Bank_GetAcctByName(COKEBANK_DEBT_ACCT,1), User, Ammount, ReasonGiven );
+       ret = _Transfer( Bank_GetAcctByName(COKEBANK_ADDSRC_ACCT,1), User, Ammount, ReasonGiven );
 #else
-       ret = Bank_Transfer( Bank_GetAcctByName(COKEBANK_DEBT_ACCT,1), User, Ammount, ReasonGiven );
+       ret = Bank_Transfer( Bank_GetAcctByName(COKEBANK_ADDSRC_ACCT,1), User, Ammount, ReasonGiven );
 #endif
        if(ret) return 2;
        
@@ -207,20 +230,22 @@ int DispenseAdd(int ActualUser, int User, int Ammount, const char *ReasonGiven)
        return 0;
 }
 
-int DispenseSet(int ActualUser, int User, int Balance, const char *ReasonGiven)
+int DispenseSet(int ActualUser, int User, int Balance, const char *ReasonGiven, int *OrigBalance)
 {
         int    curBal = Bank_GetBalance(User);
        char    *byName, *dstName;
        
-       _Transfer( Bank_GetAcctByName(COKEBANK_DEBT_ACCT,1), User, Balance-curBal, ReasonGiven );
+       if( Bank_Transfer( Bank_GetAcctByName(COKEBANK_DEBT_ACCT,1), User, Balance-curBal, ReasonGiven ) )
+               return -1;
        
        byName = Bank_GetAcctName(ActualUser);
        dstName = Bank_GetAcctName(User);
        
-       Log_Info("set balance of %s to %i by %s [balance %i] - %s",
-               dstName, Balance, byName, Bank_GetBalance(User), ReasonGiven
+       Log_Info("set balance of %s to %i by %s [was %i, balance %i] - %s",
+               dstName, Balance, byName, curBal, Bank_GetBalance(User), ReasonGiven
                );
        
+       *OrigBalance = curBal;
        free(byName);
        free(dstName);
        
@@ -315,9 +340,12 @@ int _GetMinBalance(int Account)
 
 /**
  * \brief Check if a transfer is possible
+ * \return Boolean success
  */
 int _CanTransfer(int Source, int Destination, int Ammount)
 {
+//     if( Bank_GetFlags(Source) & USER_FLAG_DISABLED )
+//             return 0;
        if( Ammount > 0 )
        {
                if( Bank_GetBalance(Source) - Ammount < _GetMinBalance(Source) )

UCC git Repository :: git.ucc.asn.au