You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.0 KiB
97 lines
3.0 KiB
import re
|
|
|
|
from . import (
|
|
db,
|
|
models
|
|
)
|
|
|
|
|
|
def convert_lancre_to_brass(raw_price):
|
|
coins = {
|
|
'penny': 0,
|
|
'shilling': 0,
|
|
'crown': 0,
|
|
'sovereign': 0,
|
|
'hedgehog': 0
|
|
}
|
|
|
|
def noz(num):
|
|
if num and num is not '-':
|
|
return int(num)
|
|
return 0
|
|
|
|
# Figure out which special notation we have
|
|
if "LC" in raw_price:
|
|
pattern = r'^LC (\d+)\|(\d+|-)\|(\d+|-)$'
|
|
match = re.match(pattern, raw_price)
|
|
groups = match.groups()
|
|
|
|
coins['penny'] = noz(groups[2])
|
|
coins['shilling'] = noz(groups[1])
|
|
coins['crown'] = noz(groups[0])
|
|
elif "LSov" in raw_price:
|
|
pattern = r'^LSov (\d+)\|(\d+|-)\|(\d+|-)\|(\d+|-)$'
|
|
match = re.match(pattern, raw_price)
|
|
groups = match.groups()
|
|
|
|
coins['penny'] = noz(groups[3])
|
|
coins['shilling'] = noz(groups[2])
|
|
coins['crown'] = noz(groups[1])
|
|
coins['sovereign'] = noz(groups[0])
|
|
elif "LH" in raw_price:
|
|
pattern = r'^LH (\d+)\|(\d+|-)\|(\d+|-)\|(\d+|-)\|(\d+|-)$'
|
|
match = re.match(pattern, raw_price)
|
|
groups = match.groups()
|
|
|
|
coins['penny'] = noz(groups[4])
|
|
coins['shilling'] = noz(groups[3])
|
|
coins['crown'] = noz(groups[2])
|
|
coins['sovereign'] = noz(groups[1])
|
|
coins['hedgehog'] = noz(groups[0])
|
|
|
|
# Convert to brass
|
|
brass_coins = (
|
|
(coins['hedgehog'] * 248832) +
|
|
(coins['sovereign'] * 20736) +
|
|
(coins['crown'] * 1728) +
|
|
(coins['shilling'] * 144) +
|
|
(coins['penny'] * 12)
|
|
)
|
|
return brass_coins
|
|
|
|
def convert_brass_to_am(brass_price):
|
|
# 12 brass coins to am pennies
|
|
pennies = brass_price / 4
|
|
return (pennies/100)
|
|
|
|
def parse_shop_output(data):
|
|
pattern = r'^\s{3}?\w{2}\)\sAn*\s([\w\s-]+) for (L\w{1,3} [\d\-|]+);\s(\w+)\sleft\.$'
|
|
matches = [m.groups() for m in re.finditer(pattern, data, re.MULTILINE)]
|
|
|
|
if not matches:
|
|
return
|
|
|
|
# Iterate over each product line in the data
|
|
seen_products = []
|
|
for m in matches:
|
|
product = models.ShopProduct.query.filter_by(name=m[0]).first()
|
|
if not product:
|
|
# If we didn't find a product, create it
|
|
product = models.ShopProduct(name=m[0])
|
|
db.session.add(product)
|
|
# Add a ShopEntry for this row only if stock has changed
|
|
if not product.latest_entry or product.latest_entry.raw_stock != m[2]:
|
|
entry = models.ShopEntry(raw_price=m[1], raw_stock=m[2], product=product)
|
|
db.session.add(entry)
|
|
seen_products.append(product)
|
|
|
|
# Check all products against seen, record sellouts
|
|
products = models.ShopProduct.query.all()
|
|
for product in products:
|
|
if product not in seen_products and product.latest_entry.stock != 0:
|
|
entry = models.ShopEntry(
|
|
raw_price=product.latest_entry.raw_price,
|
|
raw_stock='zero', product=product
|
|
)
|
|
db.session.add(entry)
|
|
db.session.commit()
|