Add new functions for player bank accounts

git-svn-id: svn://svn.code.sf.net/p/crossfire/code/maps/trunk@19794 282e977c-c81d-0410-88c4-b93c2d0d6712
master
partmedia 2015-02-23 02:15:27 +00:00
parent 5ff3ac1d4b
commit 87a2390eaf
1 changed files with 50 additions and 10 deletions

View File

@ -1,14 +1,13 @@
# CFBank.py -- CFBank class """
# Created by: Joris Bontje <jbontje@suespammers.org> Created by: Joris Bontje <jbontje@suespammers.org>
# CFBank uses the 'shelve' Python library to store persistent data. The This module stores bank account information. Player accounts are stored in
# shelved dictionary cannot be read and written to concurrently (so no '+=' or the player file using the 'balance' key. Other accounts (for guilds) are
# 'append' operations). stored in the original bank file using the 'shelve' library.
#
# The original implementation opened the database with 'writeback' set and Since the original implementation stored player accounts using the 'shelve'
# called 'sync()' after each write operation. The current implementation does library as well, this module also converts old bank accounts to new ones.
# not set 'writeback' and instead requires 'close()' to be called before data """
# is saved. This is the method recommended by the Python reference manual.
import os.path import os.path
import shelve import shelve
@ -53,3 +52,44 @@ class CFBank:
def close(self): def close(self):
self.bankdb.close() self.bankdb.close()
def convert_bank(player):
"""Move a player's balance from the bank file to the player file."""
bank = CFBank('ImperialBank_DB')
old_balance = bank.getbalance(player.Name)
if old_balance > 0:
Crossfire.Log(Crossfire.LogInfo,
"Converting bank account for %s with %d silver" \
% (player.Name, old_balance))
player.WriteKey("balance", str(old_balance), 1)
bank.remove_account(player.Name)
bank.close()
return old_balance
def balance(player):
"""Return the balance of the given player's bank account."""
try:
balance_str = player.ReadKey("balance")
return int(balance_str)
except ValueError:
# If 'balance' key does not exist, try to convert from bank file.
return convert_bank(player)
def deposit(player, amount):
"""Deposit the given amount to the player's bank account."""
if amount < 0:
raise ValueError("Deposits must be positive")
new_balance = balance(player) + int(amount)
player.WriteKey("balance", str(new_balance), 1)
def withdraw(player, amount):
"""Withdraw the given amount from the player's bank account."""
if amount < 0:
raise ValueError("Withdrawals must be positive")
new_balance = balance(player) - int(amount)
if new_balance < 0:
return False
else:
player.WriteKey("balance", str(new_balance), 1)
return True