Skip to content

Add data updater #212

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Jul 29, 2017
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Changed setup routines to load data files later
  • Loading branch information
Ayuto committed Jul 3, 2017
commit 0ef2bf2b6cf167c62c8cf38400b757ac06d7d8de
47 changes: 33 additions & 14 deletions addons/source-python/packages/source-python/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,10 @@ def load():
setup_stdout_redirect()
setup_core_settings()
setup_logging()
setup_exception_hooks()
setup_data_updater()
setup_hooks()
setup_translations()
setup_data()
setup_global_pointers()
setup_sp_command()
setup_auth()
Expand Down Expand Up @@ -135,6 +136,35 @@ def setup_data_updater():
_sp_logger.log_exception(
'An error occured during the data update.', exc_info=True)

def setup_data():
"""Setup data."""
_sp_logger.log_debug('Setting up data...')

from core import GameConfigObj
from memory.manager import manager
from paths import SP_DATA_PATH

import players
players.BaseClient = manager.create_type_from_dict(
'BaseClient',
GameConfigObj(SP_DATA_PATH / 'client' / 'CBaseClient.ini'))

import listeners
listeners.BaseEntityOutput = manager.create_type_from_dict(
'BaseEntityOutput',
GameConfigObj(SP_DATA_PATH / 'entity_output' / 'CBaseEntityOutput.ini'))

try:
_fire_output = listeners.BaseEntityOutput.fire_output
except ValueError:
from warnings import warn
warn(
'BaseEntityOutput.fire_output not found. '
'OnEntityOutput listener will not fire.'
)
else:
_fire_output.add_pre_hook(listeners._pre_fire_output)


# =============================================================================
# >> CORE SETTINGS
Expand Down Expand Up @@ -192,24 +222,13 @@ def setup_logging():
# =============================================================================
# >> HOOKS
# =============================================================================
def setup_hooks():
def setup_exception_hooks():
"""Set up hooks."""
_sp_logger.log_debug('Setting up hooks...')
_sp_logger.log_debug('Setting up exception hooks...')

from hooks.exceptions import except_hooks
from hooks.warnings import warning_hooks

# This is added to warn about BaseEntityOutput.fire_output.
# Sending the warning on its initial import will happen prior
# to these hooks being setup.
from listeners._entity_output import _fire_output
if _fire_output is None:
from warnings import warn
warn(
'BaseEntityOutput.fire_output not found. '
'OnEntityOutput listener will not fire.'
)


# =============================================================================
# >> TRANSLATIONS
Expand Down
3 changes: 0 additions & 3 deletions addons/source-python/packages/source-python/auth/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,6 @@
import re
# Importlib
from importlib.machinery import SourceFileLoader
# Site-Package Imports
# Configobj
from configobj import ConfigObj
# Source.Python Imports
# Auth
from auth.base import Backend
Expand Down
47 changes: 45 additions & 2 deletions addons/source-python/packages/source-python/listeners/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
# Core
from core import AutoUnload
from core import SOURCE_ENGINE
from core import PLATFORM
from core.settings import _core_settings
from core.version import get_last_successful_build_number
from core.version import is_unversioned
Expand All @@ -23,6 +24,8 @@
from cvars import cvar
# Engines
from engines.server import server_game_dll
from entities.datamaps import Variant
from entities.helpers import find_output_name
# Memory
from memory import get_virtual_function
# Players
Expand Down Expand Up @@ -63,8 +66,6 @@
from _listeners import on_server_activate_listener_manager
from _listeners import on_tick_listener_manager
from _listeners import on_server_output_listener_manager
# Entity output
from listeners._entity_output import on_entity_output_listener_manager


# =============================================================================
Expand Down Expand Up @@ -154,6 +155,7 @@
on_level_end_listener_manager = ListenerManager()
on_player_run_command_listener_manager = ListenerManager()
on_button_state_changed_listener_manager = ListenerManager()
on_entity_output_listener_manager = ListenerManager()

_check_for_update = ConVar(
'sp_check_for_update',
Expand Down Expand Up @@ -536,6 +538,47 @@ def _pre_call_global_change_callbacks(args):
on_convar_changed_listener_manager.notify(convar, old_value)


def _pre_fire_output(args):
"""Called when an output is about to be fired."""
if not on_entity_output_listener_manager:
return

# Windows is a bit weird: the function takes 4 additional arguments...
if PLATFORM == 'windows':
args = (args[0],) + tuple(args)[5:]

caller_ptr = args[3]
if not caller_ptr:
# If we don't know the caller, we won't be able to retrieve the
# output name
return

# Done here to fix cyclic import...
from entities.entity import BaseEntity
caller = make_object(BaseEntity, caller_ptr)
output_name = find_output_name(caller, args[0])
if output_name is None:
return None

# Done here to fix cyclic import...
from entities.entity import Entity
if caller.is_networked():
caller = make_object(Entity, caller_ptr)

value_ptr = args[1]
value = (value_ptr or None) and make_object(Variant, value_ptr)

activator_ptr = args[2]
activator = ((activator_ptr or None) and make_object(
BaseEntity, activator_ptr))
if activator is not None and activator.is_networked():
activator = make_object(Entity, activator_ptr)

delay = args[4]
on_entity_output_listener_manager.notify(
output_name, activator, caller, value, delay)


# ============================================================================
# >> Fix for issue #181.
# ============================================================================
Expand Down

This file was deleted.

10 changes: 2 additions & 8 deletions addons/source-python/packages/source-python/players/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,6 @@
# >> FORWARD IMPORTS
# =============================================================================
# Source.Python Imports
# Core
from core import GameConfigObj
# Memory
from memory.manager import manager
# Paths
from paths import SP_DATA_PATH
# Players
from _players import Client
from _players import PlayerGenerator
Expand All @@ -44,5 +38,5 @@
# Get the sp.players logger
players_logger = _sp_logger.players

BaseClient = manager.create_type_from_dict(
'BaseClient', GameConfigObj(SP_DATA_PATH / 'client' / 'CBaseClient.ini'))
# Will be loaded by a setup routine
BaseClient = None
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@
from memory import get_object_pointer
from memory import make_object
# Players
from players import BaseClient
from players.constants import PlayerStates
from players.helpers import address_from_playerinfo
from players.helpers import get_client_language
Expand Down Expand Up @@ -145,6 +144,7 @@ def client(self):
@property
def base_client(self):
"""Return the player's :class:`players.BaseClient` object."""
from players import BaseClient
return make_object(BaseClient, get_object_pointer(self.client) - 4)

@property
Expand Down