-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtab_manager.py
More file actions
134 lines (110 loc) · 4.51 KB
/
Copy pathtab_manager.py
File metadata and controls
134 lines (110 loc) · 4.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Менеджер вкладок браузера
"""
import time
from typing import List, Optional
class TabInfo:
"""Информация о вкладке"""
def __init__(self, tab):
self.tab = tab
self.created_at = time.time()
self.last_active = time.time()
self.session_killed = False
def update_activity(self):
"""Обновить время последней активности"""
self.last_active = time.time()
def get_inactive_time(self) -> float:
"""Получить время неактивности в секундах"""
return time.time() - self.last_active
def get_inactive_minutes(self) -> float:
"""Получить время неактивности в минутах"""
return self.get_inactive_time() / 60
def should_kill_session(self, inactive_threshold: int = 1800) -> bool:
"""
Проверить, нужно ли убить сессию
inactive_threshold: порог неактивности в секундах (по умолчанию 1800 = 30 минут)
"""
return (
not self.session_killed and
self.get_inactive_time() > inactive_threshold
)
class TabManager:
"""Менеджер вкладок"""
def __init__(self):
self.tabs: List[TabInfo] = []
def add_tab(self, tab) -> TabInfo:
"""Добавить вкладку"""
tab_info = TabInfo(tab)
self.tabs.append(tab_info)
return tab_info
def remove_tab(self, tab) -> bool:
"""Удалить вкладку"""
for tab_info in self.tabs:
if tab_info.tab == tab:
self.tabs.remove(tab_info)
return True
return False
def get_tab_info(self, tab) -> Optional[TabInfo]:
"""Получить информацию о вкладке"""
for tab_info in self.tabs:
if tab_info.tab == tab:
return tab_info
return None
def update_tab_activity(self, tab):
"""Обновить активность вкладки"""
tab_info = self.get_tab_info(tab)
if tab_info:
tab_info.update_activity()
def get_inactive_tabs(self, inactive_threshold: int = 1800) -> List[TabInfo]:
"""
Получить список неактивных вкладок
inactive_threshold: порог неактивности в секундах (по умолчанию 1800 = 30 минут)
"""
return [
tab_info for tab_info in self.tabs
if tab_info.should_kill_session(inactive_threshold)
]
def kill_inactive_sessions(self, inactive_threshold: int = 1800) -> int:
"""
Убить сессии неактивных вкладок
Возвращает количество убитых сессий
"""
inactive_tabs = self.get_inactive_tabs(inactive_threshold)
killed_count = 0
for tab_info in inactive_tabs:
if not tab_info.session_killed:
tab_info.tab.kill_session()
tab_info.session_killed = True
killed_count += 1
return killed_count
def get_stats(self) -> dict:
"""Получить статистику по вкладкам"""
if not self.tabs:
return {
'total_tabs': 0,
'active_tabs': 0,
'inactive_tabs': 0,
'killed_sessions': 0
}
inactive_count = len(self.get_inactive_tabs())
killed_count = sum(1 for tab_info in self.tabs if tab_info.session_killed)
return {
'total_tabs': len(self.tabs),
'active_tabs': len(self.tabs) - inactive_count,
'inactive_tabs': inactive_count,
'killed_sessions': killed_count
}
def get_all_tabs_info(self) -> List[dict]:
"""Получить информацию обо всех вкладках"""
return [
{
'url': tab_info.tab.get_url(),
'title': tab_info.tab.get_title(),
'inactive_minutes': round(tab_info.get_inactive_minutes(), 2),
'session_killed': tab_info.session_killed,
'created_at': tab_info.created_at
}
for tab_info in self.tabs
]