2021-05-17 01:46:04 +00:00
|
|
|
from __future__ import annotations
|
|
|
|
|
|
2021-05-31 12:21:09 +00:00
|
|
|
import logging
|
2021-05-17 01:46:04 +00:00
|
|
|
from typing import *
|
|
|
|
|
|
2021-05-31 12:21:09 +00:00
|
|
|
from hippolyzer.lib.base import llsd
|
2021-05-17 01:46:04 +00:00
|
|
|
from hippolyzer.lib.base.datatypes import UUID
|
2021-06-04 02:50:24 +00:00
|
|
|
from hippolyzer.lib.base.message.message import Message
|
2021-05-31 12:21:09 +00:00
|
|
|
from hippolyzer.lib.base.message.message_handler import MessageHandler
|
2021-06-04 02:50:24 +00:00
|
|
|
from hippolyzer.lib.client.namecache import NameCache
|
2021-05-31 12:21:09 +00:00
|
|
|
from hippolyzer.lib.proxy.viewer_settings import iter_viewer_cache_dirs
|
2021-05-17 01:46:04 +00:00
|
|
|
|
|
|
|
|
if TYPE_CHECKING:
|
2021-05-31 12:21:09 +00:00
|
|
|
from hippolyzer.lib.proxy.http_flow import HippoHTTPFlow
|
2021-05-17 01:46:04 +00:00
|
|
|
|
|
|
|
|
|
2021-06-04 02:50:24 +00:00
|
|
|
class ProxyNameCache(NameCache):
|
2021-05-31 12:21:09 +00:00
|
|
|
def create_subscriptions(
|
|
|
|
|
self,
|
2021-06-12 10:43:16 +00:00
|
|
|
message_handler: MessageHandler[Message, str],
|
|
|
|
|
http_message_handler: Optional[MessageHandler[HippoHTTPFlow, str]] = None,
|
2021-05-31 12:21:09 +00:00
|
|
|
):
|
2021-06-04 02:50:24 +00:00
|
|
|
super().create_subscriptions(message_handler)
|
|
|
|
|
if http_message_handler is not None:
|
|
|
|
|
http_message_handler.subscribe("GetDisplayNames", self._handle_get_display_names)
|
2021-05-31 12:21:09 +00:00
|
|
|
|
|
|
|
|
def load_viewer_caches(self):
|
|
|
|
|
for cache_dir in iter_viewer_cache_dirs():
|
|
|
|
|
try:
|
|
|
|
|
namecache_file = cache_dir / "avatar_name_cache.xml"
|
|
|
|
|
if namecache_file.exists():
|
|
|
|
|
with open(namecache_file, "rb") as f:
|
|
|
|
|
namecache_bytes = f.read()
|
|
|
|
|
agents = llsd.parse_xml(namecache_bytes)["agents"]
|
2021-06-25 18:45:42 +00:00
|
|
|
# Can be `None` if the file was just created
|
|
|
|
|
if not agents:
|
|
|
|
|
continue
|
2021-05-31 12:21:09 +00:00
|
|
|
for agent_id, agent_data in agents.items():
|
|
|
|
|
# Don't set display name if they just have the default
|
|
|
|
|
display_name = None
|
|
|
|
|
if not agent_data["is_display_name_default"]:
|
|
|
|
|
display_name = agent_data["display_name"]
|
|
|
|
|
self.update(UUID(agent_id), {
|
|
|
|
|
"FirstName": agent_data["legacy_first_name"],
|
|
|
|
|
"LastName": agent_data["legacy_last_name"],
|
|
|
|
|
"DisplayName": display_name,
|
|
|
|
|
})
|
|
|
|
|
except:
|
|
|
|
|
logging.exception(f"Failed to load namecache from {cache_dir}")
|
|
|
|
|
|
|
|
|
|
def _handle_get_display_names(self, flow: HippoHTTPFlow):
|
|
|
|
|
if flow.response.status_code != 200:
|
|
|
|
|
return
|
2021-06-04 02:50:24 +00:00
|
|
|
self._process_display_names_response(llsd.parse_xml(flow.response.content))
|