149 lines
4.1 KiB
Python
149 lines
4.1 KiB
Python
import sys
|
|
|
|
def human_readable_time(timestamp):
|
|
import datetime
|
|
|
|
now = datetime.datetime.now()
|
|
dt_object = datetime.datetime.fromtimestamp(timestamp)
|
|
diff = now - dt_object
|
|
if diff.days > 0:
|
|
return f"{diff.days} days ago"
|
|
elif diff.seconds < 60:
|
|
return f"{diff.seconds} seconds ago"
|
|
elif diff.seconds < 3600:
|
|
return f"{diff.seconds // 60} minutes ago"
|
|
else:
|
|
return f"{diff.seconds // 3600} hours ago"
|
|
|
|
|
|
def timestamp_to_human_readable(timestamp):
|
|
import datetime
|
|
|
|
try:
|
|
dt_object = datetime.datetime.fromtimestamp(timestamp)
|
|
return dt_object.strftime("%Y-%m-%d %H:%M:%S")
|
|
except:
|
|
return ""
|
|
|
|
|
|
def get_active_app_name_osx():
|
|
from AppKit import NSWorkspace
|
|
|
|
try:
|
|
active_app = NSWorkspace.sharedWorkspace().activeApplication()
|
|
return active_app["NSApplicationName"]
|
|
except:
|
|
return ""
|
|
|
|
def get_active_window_title_osx():
|
|
from Quartz import (
|
|
CGWindowListCopyWindowInfo,
|
|
kCGNullWindowID,
|
|
kCGWindowListOptionOnScreenOnly,
|
|
)
|
|
|
|
try:
|
|
app_name = get_active_app_name_osx()
|
|
windows = CGWindowListCopyWindowInfo(
|
|
kCGWindowListOptionOnScreenOnly, kCGNullWindowID
|
|
)
|
|
for window in windows:
|
|
if window["kCGWindowOwnerName"] == app_name:
|
|
return window.get("kCGWindowName", "Unknown")
|
|
except:
|
|
return ""
|
|
return ""
|
|
|
|
|
|
def get_active_app_name_windows():
|
|
import psutil
|
|
import win32gui
|
|
import win32process
|
|
|
|
try:
|
|
hwnd = win32gui.GetForegroundWindow()
|
|
_, pid = win32process.GetWindowThreadProcessId(hwnd)
|
|
exe = psutil.Process(pid).name()
|
|
return exe
|
|
except:
|
|
return ""
|
|
|
|
|
|
def get_active_window_title_windows():
|
|
import win32gui
|
|
|
|
try:
|
|
hwnd = win32gui.GetForegroundWindow()
|
|
return win32gui.GetWindowText(hwnd)
|
|
except:
|
|
return ""
|
|
|
|
|
|
def get_active_app_name_linux():
|
|
return ''
|
|
|
|
|
|
def get_active_window_title_linux():
|
|
return ''
|
|
|
|
def get_active_app_name():
|
|
if sys.platform == "win32":
|
|
return get_active_app_name_windows()
|
|
elif sys.platform == "darwin":
|
|
return get_active_app_name_osx()
|
|
elif sys.platform.startswith("linux"):
|
|
return get_active_app_name_linux()
|
|
else:
|
|
raise NotImplementedError("This platform is not supported")
|
|
|
|
|
|
def get_active_window_title():
|
|
if sys.platform == "win32":
|
|
return get_active_window_title_windows()
|
|
elif sys.platform == "darwin":
|
|
return get_active_window_title_osx()
|
|
elif sys.platform.startswith("linux"):
|
|
return get_active_window_title_linux()
|
|
else:
|
|
raise NotImplementedError("This platform is not supported")
|
|
|
|
def is_user_active_osx():
|
|
import subprocess
|
|
|
|
try:
|
|
# Run the 'ioreg' command to get idle time information
|
|
output = subprocess.check_output(["ioreg", "-c", "IOHIDSystem"]).decode()
|
|
|
|
# Find the line containing "HIDIdleTime"
|
|
for line in output.split('\n'):
|
|
if "HIDIdleTime" in line:
|
|
# Extract the idle time value
|
|
idle_time = int(line.split('=')[-1].strip())
|
|
|
|
# Convert idle time from nanoseconds to seconds
|
|
idle_seconds = idle_time / 1000000000
|
|
|
|
# If idle time is less than 5 seconds, consider the user not idle
|
|
return idle_seconds < 5
|
|
|
|
# If "HIDIdleTime" is not found, assume the user is not idle
|
|
return True
|
|
|
|
except subprocess.CalledProcessError:
|
|
# If there's an error running the command, assume the user is not idle
|
|
return True
|
|
except Exception as e:
|
|
print(f"An error occurred: {e}")
|
|
# If there's any other error, assume the user is not idle
|
|
return True
|
|
|
|
def is_user_active():
|
|
if sys.platform == "win32":
|
|
return True
|
|
elif sys.platform == "darwin":
|
|
return is_user_active_osx()
|
|
elif sys.platform.startswith("linux"):
|
|
return True
|
|
else:
|
|
raise NotImplementedError("This platform is not supported")
|
|
|