Ìn
The FISTF Annual General Meeting for 2025 was recently conducted online, with a significant attendance and constructive discussions.
Board participants during the internet meeting:
Steve Dettre (AUS/President)
Eliot Kennedy (AUS/General Secretary)
Nic Tan (SGP/Finance Director, Treasurer)
Chris Angelinas (GRE/ Vice-President, Sports Director)
Andrea Ciccarelli (ITA/Vice-President Media and Communication)
Andy Fitzpatrick (IRE/ Vice-President Inclusivity & Participation)
Daniel Matos (BRA/ Confederation Vice-President America South)
Kenzo Koi (JPN/ Confederation Vice-President Asia)
Frederic Thiel (BEL/ Confederation Vice-President Europe)
Roger Trouillard (FRA/ IT - Administrator)
Board apologies:
Patrick Sheridan (USA/Confederation Vice-President America North)
Sébastien Scheen (BEL/Operational Secretary)
Member Nation participants:
Manfred Joseph (AUT/ Head of Promotion & Marketing, Erster Österreichischer Tischfussball-Verband)
Yves Peremans (BEL/Vice-President, Fédération Belge de Football de Table Subbuteo)
Sam Curtis (ENG/ Secretary, English Subbuteo Association)
John Zammit (MLT/ President, Malta Table Football Sport Association)
Marco de Bruin (NED/ Sports Director, Nederlandse Subbuteo Voetbal Bond)
Simon Stewart (NIR/ Secretary, Northern Ireland Table Football Association)
Thomas Flaaten Fredriksen (NOR/ Norges Bordfotballforbund)
Kow Wee Tan (SGP/ Board Member, Table Football Association of Singapore)
Roman Bernhardsgrütter (SUI/ President, Swiss Sporttischfussball-Verband)
Apologies:
Eric Naszalyi (FRA/President Fédération Française de Football de Table Sport)
Daniela Grünberg (GER/ President Deutscher Sport-Tischfußball Bund )
Steve Bennett (SCO/ Chairman Scottish Subbuteo Association)
Active MNAs represented via FISTF Board
Australian Table Football Association AUS
Confederação Brasileira de Futebol de Mesa BRA
Greek Community of Table Football GRE
Table Football Association of Ireland IRL
Federazione Italiana Sportiva Calcio Tavolo ITA
Japan Table Football Association JPN
MNAs not represented:
Asociación Española de Fútbol de Mesa ESP
Gibraltar Table Soccer Association GIB
Associacao Portuguesa de Subbuteo POR
American Subbuteo Association USA
Welsh Sports Table Football Association WAL
Meeting Agenda
1. Opening and welcome by President
President Steve Dettre shared news about a mass shooting in Australia, expressing relief that friends and family are safe. Steve thanked everyone for joining and mentioning the challenges of organising the meeting. Steve introduced the agenda, starting with Nic's finance report, followed by director's reports, resolutions, and any other business.
2. Presentation of the Finance Report
Finance Director Nic Tan presented the finance report, highlighting the balance of 9,366 Euros at the end of August 2024 and a surplus of 12,648 Euros at the end of August 2025. Nic explained the growth in revenue due in part to increased tournament fees, from 4000 euros last season to 4900 euros this season. Nic discussed the impact of World Cup expenditure, noting a significant increase in expenses last year. Nic suggested considering finances over a two-year period to account for variations in expenses in World Cup years. Looking at the two-year period, the balance has increased by approximately 1,000 Euros.
Discussion on Banking and Financial Management issues
Steve Dettre and Roger Trouillard discussed the challenges of finding a European bank that accepts association accounts. Roger mentioned the difficulty of finding a French bank that accepts association accounts without a physical presence and/or the President appearing in person at the bank. Roger said he would try the HSBC bank next, ar($this->all()); } /** * Get session name * * @return string The session name * * @since 1.0 */ public function getName() { return $this->store->getName(); } /** * Set the session name * * @param string $name The session name * * @return $this * * @since 2.0.0 */ public function setName(string $name) { $this->store->setName($name); return $this; } /** * Get session id * * @return string The session id * * @since 1.0 */ public function getId() { return $this->store->getId(); } /** * Set the session ID * * @param string $id The session ID * * @return $this * * @since 2.0.0 */ public function setId(string $id) { $this->store->setId($id); return $this; } /** * Check if the session is active * * @return boolean * * @since 1.0 */ public function isActive() { if ($this->getState() === SessionState::ACTIVE) { return $this->store->isActive(); } return false; } /** * Check whether this session is currently created * * @return boolean * * @since 1.0 */ public function isNew() { $counter = $this->get('session.counter'); return $counter === 1; } /** * Check if the session is started * * @return boolean * * @since 2.0.0 */ public function isStarted(): bool { return $this->store->isStarted(); } /** * Get data from the session store * * @param string $name Name of a variable * @param mixed $default Default value of a variable if not set * * @return mixed Value of a variable * * @since 1.0 */ public function get($name, $default = null) { if (!$this->isActive()) { $this->start(); } return $this->store->get($name, $default); } /** * Set data into the session store. * * @param string $name Name of a variable. * @param mixed $value Value of a variable. * * @return mixed Old value of a variable. * * @since 1.0 */ public function set($name, $value = null) { if (!$this->isActive()) { $this->start(); } return $this->store->set($name, $value); } /** * Check whether data exists in the session store * * @param string $name Name of variable * * @return boolean True if the variable exists * * @since 1.0 */ public function has($name) { if (!$this->isActive()) { $this->start(); } return $this->store->has($name); } /** * Unset a variable from the session store * * @param string $name Name of variable * * @return mixed The value from session or NULL if not set * * @since 2.0.0 */ public function remove(string $name) { if (!$this->isActive()) { $this->start(); } return $this->store->remove($name); } /** * Clears all variables from the session store * * @return void * * @since 1.0 */ public function clear() { if (!$this->isActive()) { $this->start(); } $this->store->clear(); } /** * Retrieves all variables from the session store * * @return array * * @since 2.0.0 */ public function all(): array { if (!$this->isActive()) { $this->start(); } return $this->store->all(); } /** * Start a session. * * @return void * * @since 1.0 */ public function start() { if ($this->isStarted()) { return; } $this->store->start(); $this->setState(SessionState::ACTIVE); // Initialise the session $this->setCounter(); $this->setTimers(); // Perform security checks if (!$this->validate()) { // If the session isn't valid because it expired try to restart it or destroy it. if ($this->getState() === SessionState::EXPIRED) { $this->restart(); } else { $this->destroy(); } } if ($this->dispatcher) { if (!empty($this->dispatcher->getListeners('onAfterSessionStart'))) { trigger_deprecation( 'joomla/session', '2.0.0', 'The `onAfterSessionStart` event is deprecated and will be removed in 3.0, use the %s::START event instead.', SessionEvents::class ); // Dispatch deprecated event $this->dispatcher->dispatch('onAfterSessionStart', new SessionEvent('onAfterSessionStart', $this)); } // Dispatch new event $this->dispatcher->dispatch(SessionEvents::START, new SessionEvent(SessionEvents::START, $this)); } } /** * Frees all session variables and destroys all data registered to a session * * This method resets the $_SESSION variable and destroys all of the data associated * with the current session in its storage (file or DB). It forces new session to be * started after this method is called. * * @return boolean * * @see session_destroy() * @see session_unset() * @since 1.0 */ public function destroy() { // Session was already destroyed if ($this->getState() === SessionState::DESTROYED) { return true; } $this->clear(); $this->fork(true); $this->setState(SessionState::DESTROYED); return true; } /** * Restart an expired or locked session. * * @return boolean True on success * * @see destroy * @since 1.0 */ public function restart() { // Backup existing session data $data = $this->all(); $this->destroy(); if ($this->getState() !== SessionState::DESTROYED) { // @TODO :: generated error here return false; } // Restart the session $this->store->start(); $this->setState(SessionState::ACTIVE); // Initialise the session $this->setCounter(); $this->setTimers(); // Restore the data foreach ($data as $key => $value) { $this->set($key, $value); } // If the restarted session cannot be validated then it will be destroyed if (!$this->validate(true)) { $this->destroy(); } if ($this->dispatcher) { if (!empty($this->dispatcher->getListeners('onAfterSessionRestart'))) { trigger_deprecation( 'joomla/session', '2.0.0', 'The `onAfterSessionRestart` event is deprecated and will be removed in 3.0, use the %s::RESTART event instead.', SessionEvents::class ); // Dispatch deprecated event $this->dispatcher->dispatch('onAfterSessionRestart', new SessionEvent('onAfterSessionRestart', $this)); } // Dispatch new event $this->dispatcher->dispatch(SessionEvents::RESTART, new SessionEvent(SessionEvents::RESTART, $this)); } return true; } /** * Create a new session and copy variables from the old one * * @param boolean $destroy Whether to delete the old session or leave it to garbage collection. * * @return boolean True on success * * @since 1.0 */ public function fork($destroy = false) { $result = $this->store->regenerate($destroy); if ($result) { $this->setTimers(); } return $result; } /** * Writes session data and ends session * * Session data is usually stored after your script terminated without the need * to call {@link Session::close()}, but as session data is locked to prevent concurrent * writes only one script may operate on a session at any time. When using * framesets together with sessions you will experience the frames loading one * by one due to this locking. You can reduce the time needed to load all the * frames by ending the session as soon as all changes to session variables are * done. * * @return void * * @see session_write_close() * @since 1.0 */ public function close() { $this->store->close(); $this->setState(SessionState::CLOSED); } /** * Perform session data garbage collection * * @return integer|boolean Number of deleted sessions on success or boolean false on failure or if the function is unsupported * * @see session_gc() * @since 2.0.0 */ public function gc() { if (!$this->isActive()) { $this->start(); } return $this->store->gc(); } /** * Aborts the current session * * @return boolean * * @see session_abort() * @since 2.0.0 */ public function abort(): bool { if (!$this->isActive()) { return true; } return $this->store->abort(); } /** * Create a token string * * @return string * * @since 1.3.1 */ protected function createToken(): string { /* * We are returning a 32 character string. * The bin2hex() function will double the length of the hexadecimal value returned by random_bytes(), * so generate the token from a 16 byte random value */ return bin2hex(random_bytes(16)); } /** * Set counter of session usage * * @return boolean True on success * * @since 1.0 */ protected function setCounter() { $counter = $this->get('session.counter', 0); $counter++; $this->set('session.counter', $counter); return true; } /** * Set the session expiration * * @param integer $expire Maximum age of unused session in seconds * * @return $this * * @since 1.3.0 */ protected function setExpire($expire) { $this->expire = $expire; return $this; } /** * Set the session state * * @param string $state Internal state * * @return $this * * @since 1.3.0 */ protected function setState($state) { $this->state = $state; return $this; } /** * Set the session timers * * @return boolean True on success * * @since 1.0 */ protected function setTimers() { if (!$this->has('session.timer.start')) { $start = time(); $this->set('session.timer.start', $start); $this->set('session.timer.last', $start); $this->set('session.timer.now', $start); } $this->set('session.timer.last', $this->get('session.timer.now')); $this->set('session.timer.now', time()); return true; } /** * Set additional session options * * @param array $options List of parameter * * @return boolean True on success * * @since 1.0 */ protected function setOptions(array $options) { // Set name if (isset($options['name'])) { $this->setName($options['name']); } // Set id if (isset($options['id'])) { $this->setId($options['id']); } // Set expire time if (isset($options['expire'])) { $this->setExpire($options['expire']); } // Sync the session maxlifetime if (!headers_sent()) { ini_set('session.gc_maxlifetime', $this->getExpire()); } return true; } /** * Do some checks for security reasons * * If one check fails, session data has to be cleaned. * * @param boolean $restart Reactivate session * * @return boolean True on success * * @see http://shiflett.org/articles/the-truth-about-sessions * @since 1.0 */ protected function validate($restart = false) { // Allow to restart a session if ($restart) { $this->setState(SessionState::ACTIVE); } // Check if session has expired if ($this->expire) { $curTime = $this->get('session.timer.now', 0); $maxTime = $this->get('session.timer.last', 0) + $this->expire; // Empty session variables if ($maxTime < $curTime) { $this->setState(SessionState::EXPIRED); return false; } } try { foreach ($this->sessionValidators as $validator) { $validator->validate($restart); } } catch (Exception\InvalidSessionException $e) { $this->setState(SessionState::ERROR); return false; } return true; } }
/** * Class for managing HTTP sessions * * @since 1.5 */class Session extends BaseSession{ /** * Constructor * * @param StorageInterface $store A StorageInterface implementation. * @return void * @private */function includeFile($file){ include $file;} * @return true|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { includeFile($file); return true; } return null; * * @since 3.4 */ public function loadClass($class) { if ($result = $this->loader->loadClass($class)) { \JLoader::applyAliasFor($class); } return $result; } if (method_exists($app, 'afterSessionStart')) { $dispatcher->addListener(SessionEvents::START, [$app, 'afterSessionStart'], Priority::HIGH); } $session = new \Joomla\CMS\Session\Session($storage, $dispatcher, $options); return $session; } /** if (!$container->has('session.handler')) { $this->registerSessionHandlerAsService($container, $handler); } return $this->buildSession( new JoomlaStorage($app->getInput(), $handler, $options), $app, $container->get(DispatcherInterface::class), $options ); }, if ($this->isShared()) { if ($this->instance === null) { $this->instance = $callable($this->container); } return $this->instance; } } throw new KeyNotFoundException(sprintf("Resource '%s' has not been registered with the container.", $resourceName)); } return $this->resources[$key]->getInstance(); } /** * Check if specified resource exists. * Factory::$application = $app; } $app->setDispatcher($container->get(DispatcherInterface::class)); $app->setLogger($container->get(LoggerInterface::class)); $app->setSession($container->get(SessionInterface::class)); $app->setUserFactory($container->get(UserFactoryInterface::class)); $app->setCacheControllerFactory($container->get(CacheControllerFactoryInterface::class)); $app->setMenuFactory($container->get(MenuFactoryInterface::class)); return $app; if ($this->isShared()) { if ($this->instance === null) { $this->instance = $callable($this->container); } return $this->instance; } } throw new KeyNotFoundException(sprintf("Resource '%s' has not been registered with the container.", $resourceName)); } return $this->resources[$key]->getInstance(); } /** * Check if specified resource exists. * ->alias(\Joomla\CMS\Session\Session::class, 'session.web.site') ->alias(\Joomla\Session\Session::class, 'session.web.site') ->alias(\Joomla\Session\SessionInterface::class, 'session.web.site');// Instantiate the application.$app = $container->get(\Joomla\CMS\Application\SiteApplication::class);// Set the application as global app\Joomla\CMS\Factory::$application = $app;// Execute the application. * define() is used rather than "const" to not error for PHP 5.2 and lower */define('_JEXEC', 1);// Run the application - All executable code should be triggered through this filerequire_once dirname(__FILE__) . '/includes/app.php';|
ClassNotFoundError
|
|---|
Symfony\Component\ErrorHandler\Error\ClassNotFoundError:
Attempted to load class "Session" from namespace "Joomla\Session".
Did you forget a "use" statement for another namespace?
at /datas/yulpa173848/sites/2024.samclap-ufolep.fr/htdocs/libraries/src/Session/Session.php:29
at include()
(/datas/yulpa173848/sites/2024.samclap-ufolep.fr/htdocs/libraries/vendor/composer/ClassLoader.php:571)
at Composer\Autoload\includeFile('/datas/yulpa173848/sites/2024.samclap-ufolep.fr/htdocs/libraries/vendor/composer/../../../libraries/src/Session/Session.php')
(/datas/yulpa173848/sites/2024.samclap-ufolep.fr/htdocs/libraries/vendor/composer/ClassLoader.php:428)
at Composer\Autoload\ClassLoader->loadClass('Joomla\\CMS\\Session\\Session')
(/datas/yulpa173848/sites/2024.samclap-ufolep.fr/htdocs/libraries/src/Autoload/ClassLoader.php:59)
at Joomla\CMS\Autoload\ClassLoader->loadClass('Joomla\\CMS\\Session\\Session')
(/datas/yulpa173848/sites/2024.samclap-ufolep.fr/htdocs/libraries/src/Service/Provider/Session.php:313)
at Joomla\CMS\Service\Provider\Session->buildSession(object(JoomlaStorage), object(SiteApplication), object(Dispatcher), array('name' => 'cfcc1fa6f738cb338fc22c19249ecab3', 'expire' => 900, 'force_ssl' => true))
(/datas/yulpa173848/sites/2024.samclap-ufolep.fr/htdocs/libraries/src/Service/Provider/Session.php:174)
at Joomla\CMS\Service\Provider\Session->Joomla\CMS\Service\Provider\{closure}(object(Container))
(/datas/yulpa173848/sites/2024.samclap-ufolep.fr/htdocs/libraries/vendor/joomla/di/src/ContainerResource.php:176)
at Joomla\DI\ContainerResource->getInstance()
(/datas/yulpa173848/sites/2024.samclap-ufolep.fr/htdocs/libraries/vendor/joomla/di/src/Container.php:96)
at Joomla\DI\Container->get('Joomla\\Session\\SessionInterface')
(/datas/yulpa173848/sites/2024.samclap-ufolep.fr/htdocs/libraries/src/Service/Provider/Application.php:109)
at Joomla\CMS\Service\Provider\Application->Joomla\CMS\Service\Provider\{closure}(object(Container))
(/datas/yulpa173848/sites/2024.samclap-ufolep.fr/htdocs/libraries/vendor/joomla/di/src/ContainerResource.php:176)
at Joomla\DI\ContainerResource->getInstance()
(/datas/yulpa173848/sites/2024.samclap-ufolep.fr/htdocs/libraries/vendor/joomla/di/src/Container.php:96)
at Joomla\DI\Container->get('Joomla\\CMS\\Application\\SiteApplication')
(/datas/yulpa173848/sites/2024.samclap-ufolep.fr/htdocs/includes/app.php:55)
at require_once('/datas/yulpa173848/sites/2024.samclap-ufolep.fr/htdocs/includes/app.php')
(/datas/yulpa173848/sites/2024.samclap-ufolep.fr/htdocs/index.php:32)
|