Restructured code into src/<module>
[tpg/opendispense2.git] / server / src / 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, int Item)
13 {
14          int    ret;
15         tItem   *item;
16         tHandler        *handler;
17         char    *username;
18         
19         // Sanity check please?
20         if(Item < 0 || Item >= giNumItems)
21                 return -1;
22         
23         // Get item pointers
24         item = &gaItems[Item];
25         handler = &gaHandlers[ item->Type ];
26         
27         // Check if the dispense is possible
28         ret = handler->CanDispense( User, item->ID );
29         if(!ret)        return ret;
30         
31         // Subtract the balance
32         ret = AlterBalance( User, -item->Price );
33         // What value should I use for this error?
34         // AlterBalance should return the final user balance
35         if(ret == 0)    return 1;
36         
37         // Get username for debugging
38         username = GetUserName(User);
39         
40         // Actually do the dispense
41         ret = handler->DoDispense( User, item->ID );
42         if(ret) {
43                 Log_Error("Dispense failed after deducting cost (%s dispensing %s - %ic)",
44                         username, item->Name, item->Price);
45                 AlterBalance( User, item->Price );
46                 free( username );
47                 return 1;
48         }
49         
50         // And log that it happened
51         Log_Info("Dispensed %s (%i:%i) for %s [cost %i, balance %i cents]",
52                 item->Name, item->Type, item->ID,
53                 username, item->Price, GetBalance(User)
54                 );
55         
56         free( username );
57         return 0;
58 }

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