Cleanup work (much needed)
[tpg/opendispense2.git] / src / server / dispense.c
1 /**
2  */
3 #include "common.h"
4 #include <stdlib.h>
5
6 // === CODE ===
7 /**
8  * \brief Dispense an item for a user
9  * 
10  * The core of the dispense system, I kinda like it :)
11  */
12 int DispenseItem(int User, tItem *Item)
13 {
14          int    ret;
15         tHandler        *handler;
16         char    *username;
17         char    *reason;
18         
19         handler = Item->Handler;
20         
21         // Check if the dispense is possible
22         if( handler->CanDispense ) {
23                 ret = handler->CanDispense( User, Item->ID );
24                 if(ret) return 1;       // 1: Unable to dispense
25         }
26
27         // Subtract the balance
28         reason = mkstr("Dispense - %s:%i %s", handler->Name, Item->ID, Item->Name);
29         if( !reason )   reason = Item->Name;    // TODO: Should I instead return an error?
30         ret = Transfer( User, GetUserID(">sales"), Item->Price, reason);
31         free(reason);
32         if(ret) return 2;       // 2: No balance
33         
34         // Get username for debugging
35         username = GetUserName(User);
36         
37         // Actually do the dispense
38         if( handler->DoDispense ) {
39                 ret = handler->DoDispense( User, Item->ID );
40                 if(ret) {
41                         Log_Error("Dispense failed after deducting cost (%s dispensing %s - %ic)",
42                                 username, Item->Name, Item->Price);
43                         Transfer( GetUserID(">sales"), User, Item->Price, "rollback" );
44                         free( username );
45                         return -1;      // 1: Unkown Error again
46                 }
47         }
48         
49         // And log that it happened
50         Log_Info("Dispensed %s (%s:%i) for %s [cost %i, balance %i cents]",
51                 Item->Name, handler->Name, Item->ID,
52                 username, Item->Price, GetBalance(User)
53                 );
54         
55         free( username );
56         return 0;       // 0: EOK
57 }

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