Removing explicit mentions to users in the cokebank
[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 ActualUser, int User, tItem *Item)
13 {
14          int    ret;
15         tHandler        *handler;
16         char    *username, *actualUsername;
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 = Bank_Transfer( User, Bank_GetAcctByName(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 = Bank_GetAcctName(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                         Bank_Transfer( Bank_GetAcctByName(COKEBANK_SALES_ACCT), User, Item->Price, "rollback" );
44                         free( username );
45                         return -1;      // 1: Unkown Error again
46                 }
47         }
48         
49         actualUsername = Bank_GetAcctName(ActualUser);
50         
51         // And log that it happened
52         Log_Info("dispense '%s' (%s:%i) for %s by %s [cost %i, balance %i cents]",
53                 Item->Name, handler->Name, Item->ID,
54                 username, actualUsername, Item->Price, Bank_GetBalance(User)
55                 );
56         
57         free( username );
58         free( actualUsername );
59         return 0;       // 0: EOK
60 }
61
62 /**
63  * \brief Give money from one user to another
64  */
65 int DispenseGive(int ActualUser, int SrcUser, int DestUser, int Ammount, const char *ReasonGiven)
66 {
67          int    ret;
68         char    *actualUsername;
69         char    *srcName, *dstName;
70         
71         if( Ammount < 0 )       return 1;       // Um... negative give? Not on my watch!
72         
73         ret = Bank_Transfer( SrcUser, DestUser, Ammount, ReasonGiven );
74         if(ret) return 2;       // No Balance
75         
76         
77         srcName = Bank_GetAcctName(SrcUser);
78         dstName = Bank_GetAcctName(DestUser);
79         actualUsername = Bank_GetAcctName(ActualUser);
80         
81         Log_Info("give %i to %s from %s by %s (%s) [balances %i, %i]",
82                 Ammount, dstName, srcName, actualUsername, ReasonGiven,
83                 Bank_GetBalance(SrcUser), Bank_GetBalance(DestUser)
84                 );
85         
86         free(srcName);
87         free(dstName);
88         free(actualUsername);
89         
90         return 0;
91 }
92
93 /**
94  * \brief Add money to an account
95  */
96 int DispenseAdd(int User, int ByUser, int Ammount, const char *ReasonGiven)
97 {
98          int    ret;
99         char    *dstName, *byName;
100         
101         ret = Bank_Transfer( Bank_GetAcctByName(COKEBANK_DEBT_ACCT), User, Ammount, ReasonGiven );
102         if(ret) return 2;
103         
104         byName = Bank_GetAcctName(ByUser);
105         dstName = Bank_GetAcctName(User);
106         
107         Log_Info("add %i to %s by %s (%s) [balance %i]",
108                 Ammount, dstName, byName, ReasonGiven, Bank_GetBalance(User)
109                 );
110         
111         free(byName);
112         free(dstName);
113         
114         return 0;
115 }

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