|
2 | 2 |
|
3 | 3 | """Provides listener based functionality.""" |
4 | 4 |
|
| 5 | +# TODO: Fix name conflict with _ListenerManager |
| 6 | + |
5 | 7 | # ============================================================================= |
6 | 8 | # >> IMPORTS |
7 | 9 | # ============================================================================= |
| 10 | +# Python Imports |
| 11 | +import socket |
| 12 | +from urllib.error import URLError |
8 | 13 | # Source.Python Imports |
| 14 | +# Cvars |
| 15 | +from cvars import ConVar |
9 | 16 | # Core |
10 | 17 | from core import AutoUnload |
| 18 | +from core.settings import _core_settings |
| 19 | +from core.version import is_newer_version_available |
| 20 | +from core.version import is_unversioned |
11 | 21 | # Loggers |
12 | 22 | from loggers import _sp_logger |
13 | 23 |
|
|
17 | 27 | # ============================================================================= |
18 | 28 | # Source.Python Imports |
19 | 29 | # Listeners |
| 30 | +from _listeners import _ListenerManager |
20 | 31 | from _listeners import client_active_listener_manager |
21 | 32 | from _listeners import client_connect_listener_manager |
22 | 33 | from _listeners import client_disconnect_listener_manager |
|
67 | 78 | 'OnQueryCvarValueFinished', |
68 | 79 | 'ServerActivate', |
69 | 80 | 'Tick', |
| 81 | + 'VersionUpdate', |
70 | 82 | 'client_active_listener_manager', |
71 | 83 | 'client_connect_listener_manager', |
72 | 84 | 'client_disconnect_listener_manager', |
|
89 | 101 | 'on_query_cvar_value_finished_listener_manager', |
90 | 102 | 'server_activate_listener_manager', |
91 | 103 | 'tick_listener_manager', |
| 104 | + 'version_update_listener_manager', |
92 | 105 | ) |
93 | 106 |
|
94 | 107 |
|
|
97 | 110 | # ============================================================================= |
98 | 111 | # Get the sp.listeners logger |
99 | 112 | listeners_logger = _sp_logger.listeners |
| 113 | +version_update_listener_manager = _ListenerManager() |
| 114 | + |
| 115 | +_check_for_update = ConVar('sp_check_for_update', |
| 116 | + _core_settings['VERSION_SETTINGS']['check_for_update'], |
| 117 | + description='Enable/disable checking for version updates.', |
| 118 | + min_value=0, max_value=1) |
| 119 | + |
| 120 | +_notify_on_update = ConVar('sp_notify_on_update', |
| 121 | + _core_settings['VERSION_SETTINGS']['notify_on_update'], |
| 122 | + description=('Log a warning when a Source.Python update is available. Req' |
| 123 | + 'uires sp_check_for_update to be set to 1.'), |
| 124 | + min_value=0, max_value=1) |
100 | 125 |
|
101 | 126 |
|
102 | 127 | # ============================================================================= |
@@ -143,6 +168,11 @@ def name(self): |
143 | 168 | """Return the class name of the instance.""" |
144 | 169 | return self.__class__.__name__ |
145 | 170 |
|
| 171 | + @property |
| 172 | + def manager(self): |
| 173 | + """Return a _ListenerManager object.""" |
| 174 | + raise NotImplementedError('Must be implemented by a subclass.') |
| 175 | + |
146 | 176 | def _unload_instance(self): |
147 | 177 | """Unregister the listener.""" |
148 | 178 | # Log the unregistering |
@@ -306,3 +336,36 @@ class Tick(_ListenerManager): |
306 | 336 | """Register/unregister a Tick listener.""" |
307 | 337 |
|
308 | 338 | manager = tick_listener_manager |
| 339 | + |
| 340 | + |
| 341 | +class VersionUpdate(_ListenerManager): |
| 342 | + |
| 343 | + """Register/unregister a version update listener.""" |
| 344 | + |
| 345 | + manager = version_update_listener_manager |
| 346 | + |
| 347 | + |
| 348 | +# ============================================================================= |
| 349 | +# >> CALLBACKS |
| 350 | +# ============================================================================= |
| 351 | +@LevelInit |
| 352 | +def _on_level_init(map_name): |
| 353 | + """Called when a new map gets initialized.""" |
| 354 | + if not _check_for_update.get_int(): |
| 355 | + return |
| 356 | + |
| 357 | + try: |
| 358 | + update_available, version = is_newer_version_available() |
| 359 | + except (URLError, socket.timeout): |
| 360 | + return |
| 361 | + |
| 362 | + if not update_available: |
| 363 | + return |
| 364 | + |
| 365 | + if _notify_on_update.get_int(): |
| 366 | + # TODO: Add translations |
| 367 | + listeners_logger.log_warning( |
| 368 | + 'A new Source.Python version is available!') |
| 369 | + |
| 370 | + version_update_listener_manager.notify( |
| 371 | + update_available, version, is_unversioned()) |
0 commit comments