Files
Hippolyzer/hippolyzer/lib/proxy/viewer_settings.py
2021-05-31 10:25:12 +00:00

71 lines
2.4 KiB
Python

import itertools
import sys
from pathlib import Path
from hippolyzer.lib.base import llsd
def iter_viewer_data_dirs():
if sys.platform.startswith("linux"):
paths = (x for x in Path.home().iterdir() if x.name.startswith("."))
elif sys.platform == "darwin":
paths = (Path.home() / "Library" / "Application Support").iterdir()
elif sys.platform in ("win32", "msys", "cygwin"):
app_data = Path.home() / "AppData"
# On Windows the cache directory is in Local, the settings are in Roaming. I think.
paths = itertools.chain((app_data / "Local").iterdir(), (app_data / "Roaming").iterdir())
else:
raise Exception("Unknown OS, can't locate viewer config dirs!")
for path in paths:
if not path.is_dir():
continue
if not has_settings_file(path) and not has_cache_file(path):
continue
yield path
def has_cache_file(path: Path):
try:
return (path / "avatar_name_cache.xml").exists()
except PermissionError:
return False
def has_settings_file(path: Path):
try:
return (path / "user_settings" / "settings.xml").exists()
except PermissionError:
return False
def iter_viewer_config_dirs():
for viewer_dir in iter_viewer_data_dirs():
if has_settings_file(viewer_dir):
yield viewer_dir
def iter_viewer_cache_dirs():
for viewer_dir in iter_viewer_data_dirs():
# Is this a settings dir
if has_settings_file(viewer_dir):
# Users can choose custom locations for the cache directory, we need to parse
# their settings to see if they've done so.
with open(viewer_dir / "user_settings" / "settings.xml", "rb") as fh:
config: dict = llsd.parse_xml(fh.read())
# TODO: is this the case on all platforms?
cache_location = None
cache_elem = config.get("CacheLocation")
if cache_elem:
cache_location = cache_elem.get("Value")
if cache_location:
cache_location = Path(cache_location)
if has_cache_file(cache_location):
yield cache_location
# Cache may be in the base dir on Windows
if has_cache_file(viewer_dir):
yield viewer_dir
# but it might also be in a subfolder
if has_cache_file(viewer_dir / "cache"):
yield viewer_dir / "cache"