|
@@ -1,3 +1,4 @@
|
|
|
+import random
|
|
|
import re
|
|
|
import sqlite3 as db
|
|
|
import sys
|
|
@@ -5,7 +6,7 @@ import uuid
|
|
|
|
|
|
import db_setup
|
|
|
from game import CURRENCY_NAME
|
|
|
-from util import debug
|
|
|
+from util import debug, chars
|
|
|
|
|
|
connection = None
|
|
|
cursor = None
|
|
@@ -102,15 +103,15 @@ def register(username, password, game_key):
|
|
|
|
|
|
def own(user_id, ownable_name):
|
|
|
cursor.execute('''
|
|
|
- WITH ownableid AS (SELECT rowid FROM ownables WHERE name = ?),
|
|
|
- userid AS (SELECT ?)
|
|
|
+ WITH one_ownable_id AS (SELECT rowid FROM ownables WHERE name = ?),
|
|
|
+ one_user_id AS (SELECT ?)
|
|
|
INSERT INTO ownership (user_id, ownable_id)
|
|
|
SELECT *
|
|
|
- FROM userid, ownableid
|
|
|
+ FROM one_user_id, one_ownable_id
|
|
|
WHERE NOT EXISTS (
|
|
|
SELECT * FROM ownership
|
|
|
- WHERE ownership.user_id IN userid
|
|
|
- AND ownership.ownable_id IN ownableid
|
|
|
+ WHERE ownership.user_id IN one_user_id
|
|
|
+ AND ownership.ownable_id IN one_ownable_id
|
|
|
)
|
|
|
''', (ownable_name, user_id,))
|
|
|
|
|
@@ -328,7 +329,7 @@ def get_user_orders(user_id):
|
|
|
def sell_ordered_amount(user_id, ownable_id):
|
|
|
connect()
|
|
|
|
|
|
- # if ownable_id == kollar_id():
|
|
|
+ # if ownable_id == currency_id():
|
|
|
# return 0
|
|
|
|
|
|
cursor.execute('''
|
|
@@ -347,11 +348,11 @@ def user_owns_at_least(amount, user_id, ownable_id):
|
|
|
connect()
|
|
|
|
|
|
cursor.execute('''
|
|
|
- SELECT users.rowid
|
|
|
+ SELECT rowid
|
|
|
FROM ownership
|
|
|
- AND ownership.user_id = ?
|
|
|
- AND ownership.ownable_id = ?
|
|
|
- AND ownership.amount - ? >= ?
|
|
|
+ WHERE user_id = ?
|
|
|
+ AND ownable_id = ?
|
|
|
+ AND amount - ? >= ?
|
|
|
''', (user_id, ownable_id, sell_ordered_amount(user_id, ownable_id), amount))
|
|
|
|
|
|
if cursor.fetchone():
|
|
@@ -371,3 +372,100 @@ def news():
|
|
|
''')
|
|
|
|
|
|
return cursor.fetchall()
|
|
|
+
|
|
|
+
|
|
|
+def ownable_name_exists(name):
|
|
|
+ connect()
|
|
|
+
|
|
|
+ cursor.execute('''
|
|
|
+ SELECT rowid
|
|
|
+ FROM ownables
|
|
|
+ WHERE name = ?
|
|
|
+ ''', (name,))
|
|
|
+
|
|
|
+ if cursor.fetchone():
|
|
|
+ return True
|
|
|
+ else:
|
|
|
+ return False
|
|
|
+
|
|
|
+
|
|
|
+def new_stock(name=None):
|
|
|
+ connect()
|
|
|
+
|
|
|
+ while name is None:
|
|
|
+ name = ''.join(random.choice(chars) for _ in range(6))
|
|
|
+ if ownable_name_exists(name):
|
|
|
+ name = None
|
|
|
+
|
|
|
+ cursor.execute('''
|
|
|
+ INSERT INTO ownables(name)
|
|
|
+ VALUES (?)
|
|
|
+ ''', (name,))
|
|
|
+ return name
|
|
|
+
|
|
|
+
|
|
|
+def new_stocks(count=1):
|
|
|
+ return [new_stock() for _ in range(count)]
|
|
|
+
|
|
|
+
|
|
|
+def ownable_id_by_name(ownable_name):
|
|
|
+ connect()
|
|
|
+
|
|
|
+ cursor.execute('''
|
|
|
+ SELECT rowid
|
|
|
+ FROM ownables
|
|
|
+ WHERE name = ?
|
|
|
+ ''', (ownable_name,))
|
|
|
+
|
|
|
+ return cursor.fetchone()[0]
|
|
|
+
|
|
|
+
|
|
|
+def get_ownership_id(ownable_id, user_id):
|
|
|
+ connect()
|
|
|
+
|
|
|
+ cursor.execute('''
|
|
|
+ SELECT rowid
|
|
|
+ FROM ownership
|
|
|
+ WHERE ownable_id = ?
|
|
|
+ AND user_id = ?
|
|
|
+ ''', (ownable_id, user_id,))
|
|
|
+
|
|
|
+ return cursor.fetchone()[0]
|
|
|
+
|
|
|
+
|
|
|
+def currency_id():
|
|
|
+ connect()
|
|
|
+
|
|
|
+ cursor.execute('''
|
|
|
+ SELECT rowid
|
|
|
+ FROM ownables
|
|
|
+ WHERE name = ?
|
|
|
+ ''', (CURRENCY_NAME,))
|
|
|
+
|
|
|
+ return cursor.fetchone()[0]
|
|
|
+
|
|
|
+
|
|
|
+def execute_orders():
|
|
|
+ connect()
|
|
|
+ while True:
|
|
|
+ executed_any = False
|
|
|
+
|
|
|
+ # TODO execute one orders
|
|
|
+
|
|
|
+ # TODO trigger stop loss orders
|
|
|
+
|
|
|
+ if not executed_any:
|
|
|
+ return
|
|
|
+
|
|
|
+
|
|
|
+def place_order(buy, ownership_id, limit, stop_loss, amount):
|
|
|
+ connect()
|
|
|
+
|
|
|
+ cursor.execute('''
|
|
|
+ INSERT INTO orders
|
|
|
+ (buy, ownership_id, "limit", stop_loss, ordered_amount)
|
|
|
+ VALUES (?, ?, ?, ?, ?)
|
|
|
+ ''', (buy, ownership_id, limit, stop_loss, amount))
|
|
|
+
|
|
|
+ execute_orders()
|
|
|
+ return True
|