Create a premium currency that all money exchanges operate with

This commit is contained in:
Joseph Ferano 2023-02-24 14:52:20 +07:00
parent d8ade16b96
commit 5d05ee372a
3 changed files with 77 additions and 48 deletions

View File

@ -12,16 +12,18 @@ INSERT INTO users(name) VALUES
('Plug'), ('Plug'),
('Upgrade'); ('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, 1, 200),
(1, 2, 175), (1, 2, 175),
(1, 3, 0), (1, 3, 0),
(1, 4, 25), (1, 4, 25),
(1, 5, 10); (1, 5, 10);
INSERT INTO store_item(name, currency, target_resource, price, claim_amount) VALUES INSERT INTO bank_account(user_id, balance) VALUES (1, 500);
('Drill 1A', 1, 1, 25, 500),
('Drill 1B', 1, 2, 25, 500), INSERT INTO store_item(name, price, claim_amount) VALUES
('Drill 1C', 1, 3, 25, 500), ('Drill 1A', 25, 50),
('Drill 1D', 1, 4, 25, 500), ('Drill 1B', 25, 50),
('Drill 1E', 1, 5, 25, 500); ('Drill 1C', 25, 50),
('Drill 1D', 25, 50),
('Drill 1E', 25, 50);

93
mm.py
View File

@ -11,20 +11,20 @@ import datetime
def get_bank(): def get_bank():
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute(""" cursor.execute("""
SELECT resource.name,balance FROM bank_account SELECT resource_account.id,resource.name,balance FROM resource_account
INNER JOIN resource ON resource.id = bank_account.resource_id INNER JOIN resource ON resource.id = resource_account.resource_id
WHERE user_id = ? WHERE user_id = ?
""", (world.current_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() cursor.close()
return bank return (bank, resources)
def get_store_items(): def get_store_items():
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute(""" cursor.execute("SELECT store_item.id,store_item.name,price,claim_amount FROM store_item")
SELECT store_item.id,store_item.name,resource.name,price,claim_amount FROM store_item
INNER JOIN resource ON resource.id = currency
""")
items = {item[0]:item[1:] for item in cursor.fetchall()} items = {item[0]:item[1:] for item in cursor.fetchall()}
cursor.close() cursor.close()
return items return items
@ -142,16 +142,48 @@ def mint():
def buy_item(item_id): def buy_item(item_id):
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute(""" cost = world.store[item_id][1]
INSERT INTO inventory_item (user_id, store_item_id) if cost > world.bank[0][1]:
VALUES (?, ?) print(f"Not enough money: Bank {world.bank[0][1]} < Cost {cost}")
""", (world.current_user_id, item_id)) return -1
item_id = cursor.lastrowid cursor.execute('BEGIN')
conn.commit() try:
cursor.close() cursor.execute("""
world.inventory = get_inventory() INSERT INTO inventory_item (user_id, store_item_id) VALUES (?, ?)
return item_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:
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): def mine(well_id, item_id):
cursor = conn.cursor() cursor = conn.cursor()
@ -196,16 +228,6 @@ def destroy(source_id):
cursor.close() cursor.close()
world.staking_sources = get_moons() 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(): def sell_all():
cursor = conn.cursor() cursor = conn.cursor()
@ -217,24 +239,27 @@ def sell_all():
def draw_dashboard(): def draw_dashboard():
im.text(f"Current User: {world.current_user}") 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): for _ in range(10):
im.spacing() im.spacing()
for name,balance in world.bank.items(): for id,(name,balance) in world.bank[1].items():
im.text(f"{name.capitalize()}: {balance}") im.text(f"{name.capitalize()}: {balance}")
def draw_store(): def draw_store():
for id,(name,resource,price,claim) in world.store.items(): for id,(name,price,claim) in world.store.items():
owned = False owned = False
for (store_item_id,_) in world.inventory.values(): for (store_item_id,_) in world.inventory.values():
if id == store_item_id: if id == store_item_id:
owned = True owned = True
im.text(f"{name}: Mine {claim} {resource.capitalize()}") im.text(f"{name}: Mine {claim}")
if owned: if owned:
im.text_disabled(f"Buy {price} {resource[0:3]}") im.text_disabled(f"Buy {price}")
else: else:
im.push_id(f"Buy{id}") im.push_id(f"Buy{id}")
if im.button(f"Buy {price} {resource[0:3]}"): if im.button(f"Buy {price}"):
buy_item(id) buy_item(id)
im.pop_id() im.pop_id()
for _ in range(5): for _ in range(5):
@ -242,7 +267,7 @@ def draw_store():
def draw_inventory(): def draw_inventory():
for id,(sid,tier) in world.inventory.items(): 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}") im.push_id(f"Upgrade{id}")
if im.button("Upgrade"): if im.button("Upgrade"):
upgrade(id) upgrade(id)
@ -250,7 +275,7 @@ def draw_inventory():
im.same_line() im.same_line()
im.push_id(f"Sell{id}") im.push_id(f"Sell{id}")
if im.button("Sell"): if im.button("Sell"):
sell(id) sell_item(id)
im.pop_id() im.pop_id()
for _ in range(5): for _ in range(5):
im.spacing() im.spacing()

View File

@ -63,14 +63,8 @@ CREATE TABLE upgrade_event(
CREATE TABLE store_item( CREATE TABLE store_item(
id integer primary key autoincrement, id integer primary key autoincrement,
name varchar(128) not null, name varchar(128) not null,
currency int not null,
price int not null, price int not null,
target_resource int not null, claim_amount 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)
); );
CREATE TABLE inventory_item( CREATE TABLE inventory_item(
@ -85,6 +79,14 @@ CREATE TABLE inventory_item(
); );
CREATE TABLE bank_account( 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, id integer primary key autoincrement,
user_id int not null, user_id int not null,
resource_id int not null, resource_id int not null,