# Path: lib/Utility.py
# RE_COMPILED_TYPE = type(re.compile(''))
# POE_NINJA_API = 'http://api.poe.ninja/api/Data/'
#     CONFIG_FNAME = "cfg\\app.ini"
# class MsgType(IntEnum):
# class Messenger:
# class AppException(Exception):
# class CompileException(AppException):
# class AppConfiguration:
# class NoIndent(object):
# class NoIndentEncoder(json.JSONEncoder):
# class ConfidenceLevel(IntEnum):
#     def __init__(self):
#     def send_tmsg(self, msg, log_level=logging.NOTSET, tag=None):
#     def send_msg(self, msg, log_level=logging.NOTSET, timed=False, tag=None):
#     def send_stopped(self):
#     def send_update_id(self, id):
#     def send_object(self, obj):
#     def __init__(self):
#     def load(self):
#     def load_default(self):
#     def _load_settings(self, settings=None):
#     def update(self, cfg):
#     def save(self):
# def getBytesFromURL(url, handle=None, max_attempts=1, connect_timeout=None, timeout=None, gzip=True):
# def getJsonFromURL(url, handle=None, max_attempts=1, gzip=True):
# def getDataFromUrl(url, callback, max_attempts=1):
# def str2bool(val):
# def round_up(num):
# def round_down(num):
# def dround(num, ndigits=2):
# def tmsg(msg):
# def getBaseUrl(url):
# def isAbsoluteUrl(url):
# def logexception():
# def get_verror_msg(verror, data=None):
#     def __init__(self, value):
#     def __init__(self, *args, **kwargs):
#     def default(self, o):
#     def encode(self, o):
# def utc_to_local(utc_dt):
# def namify(text):
# def normalize_id(text):


import os
from datetime import datetime, timedelta
from lib.Utility import config
        return datetime.strptime(datestr, '%Y-%m-%dT%H:%M:%S.%f')
    except ValueError:
        return datetime.utcnow()

class StateManager:
    STATE_ID_FNAME = "tmp\\stateid.dat"
    STATE_FNAME = "tmp\\state.dat"

    def __init__(self):
        self.items = {}
        self.delta = {}
        self.changeid = ""
        self.fState = None
        self.fStateId = None

        # self.loadState()

    def itemExists(self, id):
        item = self.items.get(id)
        return item and \
               ((config.history_retention > 0 and datetime.utcnow() - item[0] <= timedelta(days=config.history_retention))
                or not config.history_retention)

    def addItem(self, id, price, acc):
        if id not in self.items:
            b_update = True
        else:
            timestamp, curprice, curacc = self.items[id]

            b_update = curprice != price or curacc != acc or \

# Path: lib/Utility.py
# RE_COMPILED_TYPE = type(re.compile(''))
# POE_NINJA_API = 'http://api.poe.ninja/api/Data/'
#     CONFIG_FNAME = "cfg\\app.ini"
# class MsgType(IntEnum):
# class Messenger:
# class AppException(Exception):
# class CompileException(AppException):
# class AppConfiguration:
# class NoIndent(object):
# class NoIndentEncoder(json.JSONEncoder):
# class ConfidenceLevel(IntEnum):
#     def __init__(self):
#     def send_tmsg(self, msg, log_level=logging.NOTSET, tag=None):
#     def send_msg(self, msg, log_level=logging.NOTSET, timed=False, tag=None):
#     def send_stopped(self):
#     def send_update_id(self, id):
#     def send_object(self, obj):
#     def __init__(self):
#     def load(self):
#     def load_default(self):
#     def _load_settings(self, settings=None):
#     def update(self, cfg):
#     def save(self):
# def getBytesFromURL(url, handle=None, max_attempts=1, connect_timeout=None, timeout=None, gzip=True):
# def getJsonFromURL(url, handle=None, max_attempts=1, gzip=True):
# def getDataFromUrl(url, callback, max_attempts=1):
# def str2bool(val):
# def round_up(num):
# def round_down(num):
# def dround(num, ndigits=2):
# def tmsg(msg):
# def getBaseUrl(url):
# def isAbsoluteUrl(url):
# def logexception():
# def get_verror_msg(verror, data=None):
#     def __init__(self, value):
#     def __init__(self, *args, **kwargs):
#     def default(self, o):
#     def encode(self, o):
# def utc_to_local(utc_dt):
# def namify(text):
# def normalize_id(text):


# Path: lib/StateManager.py
import os
from datetime import datetime, timedelta
from lib.Utility import config

        return datetime.strptime(datestr, '%Y-%m-%dT%H:%M:%S.%f')
    except ValueError:
        return datetime.utcnow()

class StateManager:
    STATE_ID_FNAME = "tmp\\stateid.dat"
    STATE_FNAME = "tmp\\state.dat"

    def __init__(self):
        self.items = {}
        self.delta = {}
        self.changeid = ""
        self.fState = None
        self.fStateId = None

        # self.loadState()

    def itemExists(self, id):
        item = self.items.get(id)
        return item and \
               ((config.history_retention > 0 and datetime.utcnow() - item[0] <= timedelta(days=config.history_retention))
                or not config.history_retention)

    def addItem(self, id, price, acc):
        if id not in self.items:
            b_update = True
        else:
            timestamp, curprice, curacc = self.items[id]

            b_update = curprice != price or curacc != acc or \

                       (config.history_retention > 0 and datetime.utcnow() - timestamp > timedelta(days=config.history_retention))