xiaomusic/xiaomusic/analytics.py
2024-12-02 11:08:19 +08:00

85 lines
2.8 KiB
Python

import asyncio
from datetime import datetime
from ga4mp import GtagMP
from xiaomusic import __version__
class Analytics:
def __init__(self, log):
self.gtag = None
self.current_date = None
self.log = log
self.init()
def init(self):
if self.gtag is not None:
return
gtag = GtagMP(
api_secret="sVRsf3T9StuWc-ZiWZxDVA",
measurement_id="G-Z09NC1K7ZW",
client_id="",
)
gtag.client_id = gtag.random_client_id()
gtag.store.set_user_property(name="version", value=__version__)
self.gtag = gtag
self.log.info("analytics init ok")
async def run_with_cancel(self, func, *args, **kwargs):
try:
asyncio.ensure_future(asyncio.to_thread(func, *args, **kwargs))
self.log.info("analytics run_with_cancel success")
except Exception as e:
self.log.warning(f"analytics run_with_cancel failed {e}")
return None
async def send_startup_event(self):
try:
await self.run_with_cancel(self._send_startup_event)
except Exception as e:
self.log.warning(f"analytics send_startup_event failed {e}")
self.init()
def _send_startup_event(self):
event = self.gtag.create_new_event(name="startup")
event.set_event_param(name="version", value=__version__)
event_list = [event]
self.gtag.send(events=event_list)
async def send_daily_event(self):
try:
await self.run_with_cancel(self._send_daily_event)
except Exception as e:
self.log.warning(f"analytics send_daily_event failed {e}")
self.init()
def _send_daily_event(self):
current_date = datetime.now().strftime("%Y-%m-%d")
if self.current_date == current_date:
return
event = self.gtag.create_new_event(name="daily_active_user")
event.set_event_param(name="version", value=__version__)
event.set_event_param(name="date", value=current_date)
event_list = [event]
self.gtag.send(events=event_list)
self.current_date = current_date
async def send_play_event(self, name, sec, hardware):
try:
await self.run_with_cancel(self._send_play_event, name, sec, hardware)
except Exception as e:
self.log.warning(f"analytics send_play_event failed {e}")
self.init()
def _send_play_event(self, name, sec, hardware):
event = self.gtag.create_new_event(name="play")
event.set_event_param(name="version", value=__version__)
event.set_event_param(name="music", value=name)
event.set_event_param(name="sec", value=sec)
event.set_event_param(name="hardware", value=hardware)
event_list = [event]
self.gtag.send(events=event_list)