User enumeration implemented
[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(COKEBANK_SALES_ACCT), 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(COKEBANK_SALES_ACCT), 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("dispense %s (%s:%i) by %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 }
58
59 /**
60  * \brief Give money from one user to another
61  */
62 int DispenseGive(int SrcUser, int DestUser, int Ammount, const char *ReasonGiven)
63 {
64          int    ret;
65         if( Ammount < 0 )       return 1;       // Um... negative give? Not on my watch!
66         
67         ret = Transfer( SrcUser, DestUser, Ammount, ReasonGiven );
68         if(ret) return 2;       // No Balance
69         
70         Log_Info("give %i to %s from %s (%s)",
71                 Ammount, GetUserName(DestUser), GetUserName(SrcUser), ReasonGiven
72                 );
73         
74         return 0;
75 }
76
77 int DispenseAdd(int User, int ByUser, int Ammount, const char *ReasonGiven)
78 {
79          int    ret;
80         
81         ret = Transfer( GetUserID(COKEBANK_DEBT_ACCT), User, Ammount, ReasonGiven );
82         
83         if(ret) return 2;
84         
85         Log_Info("add %i to %s by %s (%s)",
86                 Ammount, GetUserName(User), GetUserName(ByUser), ReasonGiven
87                 );
88         
89         return 0;
90 }

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