X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=src%2Fserver%2Fdispense.c;h=ae937937da528e4e1ccd2703d5e07509931e3c86;hb=41eba5abceaa60bac8b33025f765d798f26e2062;hp=f851731d22e2de8c0f4758b03bf8cc934271843c;hpb=650ed689f2d8c30fe9c448fbec0e58037cc2ce25;p=tpg%2Fopendispense2.git diff --git a/src/server/dispense.c b/src/server/dispense.c index f851731..ae93793 100644 --- a/src/server/dispense.c +++ b/src/server/dispense.c @@ -9,50 +9,82 @@ * * The core of the dispense system, I kinda like it :) */ -int DispenseItem(int User, int Item) +int DispenseItem(int User, tItem *Item) { int ret; - tItem *item; tHandler *handler; char *username; + char *reason; - // Sanity check please? - if(Item < 0 || Item >= giNumItems) - return -1; - - // Get item pointers - item = &gaItems[Item]; - handler = item->Handler; + handler = Item->Handler; // Check if the dispense is possible - ret = handler->CanDispense( User, item->ID ); - if(!ret) return ret; - + if( handler->CanDispense ) { + ret = handler->CanDispense( User, Item->ID ); + if(ret) return 1; // 1: Unable to dispense + } + // Subtract the balance - ret = Transfer( User, GetUserID(">sales"), item->Price, "" ); - // What value should I use for this error? - // AlterBalance should return the final user balance - if(ret == 0) return 1; + reason = mkstr("Dispense - %s:%i %s", handler->Name, Item->ID, Item->Name); + if( !reason ) reason = Item->Name; // TODO: Should I instead return an error? + ret = Transfer( User, GetUserID(">sales"), Item->Price, reason); + free(reason); + if(ret) return 2; // 2: No balance // Get username for debugging username = GetUserName(User); // Actually do the dispense - ret = handler->DoDispense( User, item->ID ); - if(ret) { - Log_Error("Dispense failed after deducting cost (%s dispensing %s - %ic)", - username, item->Name, item->Price); - Transfer( GetUserID(">sales"), User, item->Price, "rollback" ); - free( username ); - return 1; + if( handler->DoDispense ) { + ret = handler->DoDispense( User, Item->ID ); + if(ret) { + Log_Error("Dispense failed after deducting cost (%s dispensing %s - %ic)", + username, Item->Name, Item->Price); + Transfer( GetUserID(">sales"), User, Item->Price, "rollback" ); + free( username ); + return -1; // 1: Unkown Error again + } } // And log that it happened - Log_Info("Dispensed %s (%i:%i) for %s [cost %i, balance %i cents]", - item->Name, handler->Name, item->ID, - username, item->Price, GetBalance(User) + Log_Info("dispense %s (%s:%i) by %s [cost %i, balance %i cents]", + Item->Name, handler->Name, Item->ID, + username, Item->Price, GetBalance(User) ); free( username ); + return 0; // 0: EOK +} + +/** + * \brief Give money from one user to another + */ +int DispenseGive(int SrcUser, int DestUser, int Ammount, const char *ReasonGiven) +{ + int ret; + if( Ammount < 0 ) return 1; // Um... negative give? Not on my watch! + + ret = Transfer( SrcUser, DestUser, Ammount, ReasonGiven ); + if(ret) return 2; // No Balance + + Log_Info("give %i to %s from %s (%s)", + Ammount, GetUserName(DestUser), GetUserName(SrcUser), ReasonGiven + ); + + return 0; +} + +int DispenseAdd(int User, int ByUser, int Ammount, const char *ReasonGiven) +{ + int ret; + + ret = Transfer( GetUserID(">liability"), User, Ammount, ReasonGiven ); + + if(ret) return 2; + + Log_Info("add %i to %s by %s (%s)", + Ammount, GetUserName(User), GetUserName(ByUser), ReasonGiven + ); + return 0; }