diff --git a/data.sql b/data.sql index 50570be..d8e25d1 100644 --- a/data.sql +++ b/data.sql @@ -12,16 +12,18 @@ INSERT INTO users(name) VALUES ('Plug'), ('Upgrade'); -INSERT INTO bank_account(user_id, resource_id, balance) VALUES +INSERT INTO resource_account(user_id, resource_id, balance) VALUES (1, 1, 200), (1, 2, 175), (1, 3, 0), (1, 4, 25), (1, 5, 10); -INSERT INTO store_item(name, currency, target_resource, price, claim_amount) VALUES - ('Drill 1A', 1, 1, 25, 500), - ('Drill 1B', 1, 2, 25, 500), - ('Drill 1C', 1, 3, 25, 500), - ('Drill 1D', 1, 4, 25, 500), - ('Drill 1E', 1, 5, 25, 500); +INSERT INTO bank_account(user_id, balance) VALUES (1, 500); + +INSERT INTO store_item(name, price, claim_amount) VALUES + ('Drill 1A', 25, 50), + ('Drill 1B', 25, 50), + ('Drill 1C', 25, 50), + ('Drill 1D', 25, 50), + ('Drill 1E', 25, 50); diff --git a/mm.py b/mm.py index fb486fc..6cdbb2d 100644 --- a/mm.py +++ b/mm.py @@ -11,20 +11,20 @@ import datetime def get_bank(): cursor = conn.cursor() cursor.execute(""" - SELECT resource.name,balance FROM bank_account - INNER JOIN resource ON resource.id = bank_account.resource_id + SELECT resource_account.id,resource.name,balance FROM resource_account + INNER JOIN resource ON resource.id = resource_account.resource_id WHERE user_id = ? """, (world.current_user_id,)) - bank = {name: balance for name,balance in cursor.fetchall()} + resources = {id:(name, balance) for id,name,balance in cursor.fetchall()} + cursor.execute("SELECT bank_account.id,balance FROM bank_account WHERE user_id = ?", + (world.current_user_id,)) + bank = cursor.fetchone() cursor.close() - return bank + return (bank, resources) def get_store_items(): cursor = conn.cursor() - cursor.execute(""" - SELECT store_item.id,store_item.name,resource.name,price,claim_amount FROM store_item - INNER JOIN resource ON resource.id = currency - """) + cursor.execute("SELECT store_item.id,store_item.name,price,claim_amount FROM store_item") items = {item[0]:item[1:] for item in cursor.fetchall()} cursor.close() return items @@ -142,16 +142,48 @@ def mint(): def buy_item(item_id): cursor = conn.cursor() - cursor.execute(""" - INSERT INTO inventory_item (user_id, store_item_id) - VALUES (?, ?) - """, (world.current_user_id, item_id)) + cost = world.store[item_id][1] + if cost > world.bank[0][1]: + print(f"Not enough money: Bank {world.bank[0][1]} < Cost {cost}") + return -1 - item_id = cursor.lastrowid - conn.commit() - cursor.close() - world.inventory = get_inventory() - return item_id + cursor.execute('BEGIN') + try: + cursor.execute(""" + INSERT INTO inventory_item (user_id, store_item_id) VALUES (?, ?) + """, (world.current_user_id, item_id)) + cursor.execute(""" + UPDATE bank_account SET balance = balance - ? WHERE bank_account.id = ? + """, (cost, world.bank[0][0])) + except sql.Error as error: + conn.rollback() + finally: + item_id = cursor.lastrowid + conn.commit() + cursor.close() + world.inventory = get_inventory() + world.bank = get_bank() + return item_id + +def sell_item(item_id): + cursor = conn.cursor() + + cost = world.store[world.inventory[item_id][0]][1] + cursor.execute('BEGIN') + try: + # TODO: We have to cascade delete stakes and claims after this + cursor.execute("DELETE FROM inventory_item WHERE user_id = ? AND id = ?", + (world.current_user_id, item_id)) + cursor.execute(""" + UPDATE bank_account SET balance = balance + ? WHERE bank_account.id = ? + """, (cost, world.bank[0][0])) + except sql.Error as error: + conn.rollback() + finally: + conn.commit() + cursor.close() + world.inventory = get_inventory() + world.bank = get_bank() def mine(well_id, item_id): cursor = conn.cursor() @@ -196,16 +228,6 @@ def destroy(source_id): cursor.close() world.staking_sources = get_moons() -def sell(item_id): - cursor = conn.cursor() - - cursor.execute("DELETE FROM inventory_item WHERE user_id = ? AND id = ?", - (world.current_user_id, item_id)) - - conn.commit() - cursor.close() - world.inventory = get_inventory() - def sell_all(): cursor = conn.cursor() @@ -217,24 +239,27 @@ def sell_all(): def draw_dashboard(): im.text(f"Current User: {world.current_user}") + for _ in range(5): + im.spacing() + im.text(f"Moon Bucks: {world.bank[0][1]}") for _ in range(10): im.spacing() - for name,balance in world.bank.items(): + for id,(name,balance) in world.bank[1].items(): im.text(f"{name.capitalize()}: {balance}") def draw_store(): - for id,(name,resource,price,claim) in world.store.items(): + for id,(name,price,claim) in world.store.items(): owned = False for (store_item_id,_) in world.inventory.values(): if id == store_item_id: owned = True - im.text(f"{name}: Mine {claim} {resource.capitalize()}") + im.text(f"{name}: Mine {claim}") if owned: - im.text_disabled(f"Buy {price} {resource[0:3]}") + im.text_disabled(f"Buy {price}") else: im.push_id(f"Buy{id}") - if im.button(f"Buy {price} {resource[0:3]}"): + if im.button(f"Buy {price}"): buy_item(id) im.pop_id() for _ in range(5): @@ -242,7 +267,7 @@ def draw_store(): def draw_inventory(): for id,(sid,tier) in world.inventory.items(): - im.text(f"{id} - {world.store[sid][0]} - Tier {tier+1}") + im.text(f"{world.store[sid][0]} - Tier {tier+1}") im.push_id(f"Upgrade{id}") if im.button("Upgrade"): upgrade(id) @@ -250,7 +275,7 @@ def draw_inventory(): im.same_line() im.push_id(f"Sell{id}") if im.button("Sell"): - sell(id) + sell_item(id) im.pop_id() for _ in range(5): im.spacing() diff --git a/tables.sql b/tables.sql index 072e859..23c465d 100644 --- a/tables.sql +++ b/tables.sql @@ -63,14 +63,8 @@ CREATE TABLE upgrade_event( CREATE TABLE store_item( id integer primary key autoincrement, name varchar(128) not null, - currency int not null, price int not null, - target_resource int not null, - claim_amount int not null, - CONSTRAINT fk_rid FOREIGN KEY(currency) - REFERENCES resource(id) - CONSTRAINT fk_targetid FOREIGN KEY(target_resource) - REFERENCES resource(id) + claim_amount int not null ); CREATE TABLE inventory_item( @@ -85,6 +79,14 @@ CREATE TABLE inventory_item( ); CREATE TABLE bank_account( + id integer primary key autoincrement, + user_id int not null, + balance int not null default 0 CHECK (balance >= 0), + CONSTRAINT fk_user FOREIGN KEY(user_id) + REFERENCES users(id) +); + +CREATE TABLE resource_account( id integer primary key autoincrement, user_id int not null, resource_id int not null,