gear-orders/generate.py

83 lines
1.9 KiB
Python
Raw Normal View History

2025-11-14 04:03:20 +00:00
import yaml
import json
import logging
2025-11-14 04:03:20 +00:00
import random
2025-11-14 04:03:20 +00:00
2025-11-14 04:03:20 +00:00
from db import Database
2025-11-14 04:03:20 +00:00
from settings import ORDERS_YML
2025-11-14 04:03:20 +00:00
2025-11-14 04:03:20 +00:00
logger = logging.getLogger(__name__)
2025-11-14 04:03:20 +00:00
def pick_order(orders):
picked = random.choices(orders,
weights=[o['weight'] for o in orders],
k=1)[0]
result = []
repeat = 0.0
if('text' in picked):
result.append(picked['text'])
if('repeat' in picked):
repeat = picked['repeat']
if('add' in picked):
for addition in picked['add']:
if addition['probability'] > random.random():
result.append(addition['text'])
if('pick' in picked):
(new_result, new_repeat) = pick_order(picked['pick'])
result += new_result
if new_repeat > 0.0:
repeat = new_repeat
return (result, repeat)
2025-11-14 04:03:20 +00:00
def read_config():
with open(ORDERS_YML) as stream:
2025-11-14 04:03:20 +00:00
try:
orders = yaml.safe_load(stream)
except yaml.YAMLError as exc:
2025-11-14 04:03:20 +00:00
logger.error(exc)
return orders
2025-11-14 04:03:20 +00:00
2025-11-14 04:03:20 +00:00
def generate_order():
# Do we want to repeat?
db = Database()
repeat = db.repeat_get()
if repeat is not None:
if repeat['probability'] > random.random():
db.repeat_increment()
return {
"orders": json.loads(repeat['orders']),
"count": repeat['count']
}
else:
db.repeat_clear()
orders_config = read_config()
2025-11-14 04:03:20 +00:00
2025-11-14 04:03:20 +00:00
if orders_config['orders_probability'] < random.random():
2025-11-14 04:03:20 +00:00
# No orders today
return { }
# Pick new orders
(result, repeat_p) = pick_order(orders_config['orders'])
# Log the repeat
if repeat_p > 0.0:
db.repeat_put(repeat_p, json.dumps(result))
return {
"orders": result
}
def generate_punishment():
orders_config = read_config()
(result, repeat_p) = pick_order(orders_config['punishments'])
return result