Overview

Namespaces

  • Budabot
    • Core
      • Modules
    • User
      • Modules
  • None
  • Tyrence
    • Modules

Classes

  • AccessLevel
  • Budabot\Core\AccessManager
  • Budabot\Core\AdminManager
  • Budabot\Core\AOChat
  • Budabot\Core\AOChatPacket
  • Budabot\Core\AOChatQueue
  • Budabot\Core\AOExtMsg
  • Budabot\Core\AsyncHttp
  • Budabot\Core\AutoInject
  • Budabot\Core\BotRunner
  • Budabot\Core\Budabot
  • Budabot\Core\BuddylistManager
  • Budabot\Core\CacheManager
  • Budabot\Core\CacheResult
  • Budabot\Core\ClassLoader
  • Budabot\Core\ColorSettingHandler
  • Budabot\Core\CommandAlias
  • Budabot\Core\CommandManager
  • Budabot\Core\ConfigFile
  • Budabot\Core\DB
  • Budabot\Core\DBRow
  • Budabot\Core\EventLoop
  • Budabot\Core\EventManager
  • Budabot\Core\GuildChannelCommandReply
  • Budabot\Core\GuildManager
  • Budabot\Core\HelpManager
  • Budabot\Core\Http
  • Budabot\Core\HttpRequest
  • Budabot\Core\LegacyLogger
  • Budabot\Core\LimitsController
  • Budabot\Core\LoggerWrapper
  • Budabot\Core\MMDBParser
  • Budabot\Core\Modules\AdminController
  • Budabot\Core\Modules\AliasController
  • Budabot\Core\Modules\AltInfo
  • Budabot\Core\Modules\AltsController
  • Budabot\Core\Modules\BanController
  • Budabot\Core\Modules\BuddylistController
  • Budabot\Core\Modules\ColorsController
  • Budabot\Core\Modules\CommandlistController
  • Budabot\Core\Modules\CommandSearchController
  • Budabot\Core\Modules\ConfigController
  • Budabot\Core\Modules\EventlistController
  • Budabot\Core\Modules\HelpController
  • Budabot\Core\Modules\LogsController
  • Budabot\Core\Modules\PlayerLookupController
  • Budabot\Core\Modules\ProfileCommandReply
  • Budabot\Core\Modules\ProfileController
  • Budabot\Core\Modules\SettingsController
  • Budabot\Core\Modules\SQLController
  • Budabot\Core\Modules\SystemController
  • Budabot\Core\Modules\UsageController
  • Budabot\Core\Modules\WhitelistController
  • Budabot\Core\NumberSettingHandler
  • Budabot\Core\OptionsSettingHandler
  • Budabot\Core\PlayerHistory
  • Budabot\Core\PlayerHistoryManager
  • Budabot\Core\PlayerManager
  • Budabot\Core\Preferences
  • Budabot\Core\PrivateChannelCommandReply
  • Budabot\Core\PrivateMessageCommandReply
  • Budabot\Core\Registry
  • Budabot\Core\SettingHandler
  • Budabot\Core\SettingManager
  • Budabot\Core\SettingObject
  • Budabot\Core\SocketManager
  • Budabot\Core\SocketNotifier
  • Budabot\Core\SubcommandManager
  • Budabot\Core\Text
  • Budabot\Core\TextSettingHandler
  • Budabot\Core\Timer
  • Budabot\Core\TimerEvent
  • Budabot\Core\TimeSettingHandler
  • Budabot\Core\Util
  • Budabot\Core\xml
  • Budabot\User\Modules\AlienArmorController
  • Budabot\User\Modules\AlienBioController
  • Budabot\User\Modules\AlienMiscController
  • Budabot\User\Modules\AOSpeakController
  • Budabot\User\Modules\AOUController
  • Budabot\User\Modules\AXPController
  • Budabot\User\Modules\BankController
  • Budabot\User\Modules\BosslootController
  • Budabot\User\Modules\BroadcastController
  • Budabot\User\Modules\BuffPerksController
  • Budabot\User\Modules\CacheController
  • Budabot\User\Modules\ChatAssistController
  • Budabot\User\Modules\ChatCheckController
  • Budabot\User\Modules\ChatLeaderController
  • Budabot\User\Modules\ChatRallyController
  • Budabot\User\Modules\ChatSayController
  • Budabot\User\Modules\ChatTopicController
  • Budabot\User\Modules\CityWaveController
  • Budabot\User\Modules\CloakController
  • Budabot\User\Modules\ClusterController
  • Budabot\User\Modules\CountdownController
  • Budabot\User\Modules\DevController
  • Budabot\User\Modules\DingController
  • Budabot\User\Modules\EventsController
  • Budabot\User\Modules\FightController
  • Budabot\User\Modules\FindOrgController
  • Budabot\User\Modules\FindPlayerController
  • Budabot\User\Modules\FunController
  • Budabot\User\Modules\GitController
  • Budabot\User\Modules\GuideController
  • Budabot\User\Modules\GuildController
  • Budabot\User\Modules\HelpbotController
  • Budabot\User\Modules\HtmlDecodeController
  • Budabot\User\Modules\ImplantController
  • Budabot\User\Modules\ImplantDesignerController
  • Budabot\User\Modules\InactiveMemberController
  • Budabot\User\Modules\ItemsController
  • Budabot\User\Modules\KillOnSightController
  • Budabot\User\Modules\LevelController
  • Budabot\User\Modules\LinksController
  • Budabot\User\Modules\LootListsController
  • Budabot\User\Modules\MdbController
  • Budabot\User\Modules\MessageInfoCommandReply
  • Budabot\User\Modules\MockCommandReply
  • Budabot\User\Modules\NanoController
  • Budabot\User\Modules\NewsController
  • Budabot\User\Modules\NotesController
  • Budabot\User\Modules\OnlineController
  • Budabot\User\Modules\OrgHistoryController
  • Budabot\User\Modules\OrglistController
  • Budabot\User\Modules\OrgMembersController
  • Budabot\User\Modules\OSController
  • Budabot\User\Modules\PlayerHistoryController
  • Budabot\User\Modules\PlayfieldController
  • Budabot\User\Modules\PocketbossController
  • Budabot\User\Modules\PremadeImplantController
  • Budabot\User\Modules\PrivateChannelController
  • Budabot\User\Modules\QuoteController
  • Budabot\User\Modules\RaffleController
  • Budabot\User\Modules\RaidController
  • Budabot\User\Modules\RandomController
  • Budabot\User\Modules\RecipeController
  • Budabot\User\Modules\RelayController
  • Budabot\User\Modules\ReputationController
  • Budabot\User\Modules\ResearchController
  • Budabot\User\Modules\RunAsController
  • Budabot\User\Modules\SendTellController
  • Budabot\User\Modules\ShoppingController
  • Budabot\User\Modules\SilenceController
  • Budabot\User\Modules\SkillsController
  • Budabot\User\Modules\SpiritsController
  • Budabot\User\Modules\StopwatchController
  • Budabot\User\Modules\Teamspeak3
  • Budabot\User\Modules\TeamspeakController
  • Budabot\User\Modules\TestController
  • Budabot\User\Modules\TimeController
  • Budabot\User\Modules\TimerController
  • Budabot\User\Modules\TimezoneController
  • Budabot\User\Modules\TowerController
  • Budabot\User\Modules\TrackerController
  • Budabot\User\Modules\TrickleController
  • Budabot\User\Modules\UnixtimeController
  • Budabot\User\Modules\VoteController
  • Budabot\User\Modules\WeatherController
  • Budabot\User\Modules\WhatBuffsController
  • Budabot\User\Modules\WhereisController
  • Budabot\User\Modules\WhoisController
  • Budabot\User\Modules\WhoisOrgController
  • Budabot\User\Modules\WhompahController
  • Command
  • DefaultStatus
  • DefineCommand
  • Description
  • Event
  • HandlesCommand
  • Help
  • Inject
  • Instance
  • Intoptions
  • Matches
  • Options
  • Setting
  • Setup
  • Type
  • Tyrence\Modules\DemoResponseCommandReply
  • Tyrence\Modules\SameChannelResponseController
  • Visibility

Interfaces

  • Budabot\Core\CommandReply

Exceptions

  • Budabot\Core\InvalidHttpRequest
  • Budabot\Core\SQLException
  • Budabot\Core\StopExecutionException

Functions

  • Budabot\Core\isWindows
  • Budabot\Core\Modules\read_input
  • Overview
  • Namespace
  • Class
  1: <?php
  2: 
  3: namespace Budabot\Core;
  4: 
  5: use ReflectionAnnotatedClass;
  6: 
  7: class ClassLoader {
  8:     /** @Logger */
  9:     public $logger;
 10:     
 11:     private $moduleLoadPaths;
 12:     
 13:     public function __construct($moduleLoadPaths) {
 14:         $this->moduleLoadPaths = $moduleLoadPaths;
 15:     }
 16: 
 17:     public function loadInstances() {
 18:         $newInstances = $this->getNewInstancesInDir("./core");
 19:         forEach ($newInstances as $name => $className) {
 20:             Registry::setInstance($name, new $className);
 21:         }
 22:         
 23:         $this->loadCoreModules();
 24:         $this->loadUserModules();
 25:         
 26:         $this->logger->log('DEBUG', "Inject dependencies for all instances");
 27:         forEach (Registry::getAllInstances() as $instance) {
 28:             Registry::injectDependencies($instance);
 29:         }
 30:     }
 31:     
 32:     private function loadCoreModules() {
 33:         // load the core modules, hard-code to ensure they are loaded in the correct order
 34:         $this->logger->log('INFO', "Loading CORE modules...");
 35:         $core_modules = array('CONFIG', 'SYSTEM', 'ADMIN', 'BAN', 'HELP', 'LIMITS', 'PLAYER_LOOKUP', 'BUDDYLIST', 'ALTS', 'USAGE', 'PREFERENCES', 'PROFILE', 'COLORS');
 36:         forEach ($core_modules as $MODULE_NAME) {
 37:             $this->registerModule("./core", $MODULE_NAME);
 38:         }
 39:     }
 40:     
 41:     /**
 42:      * @name: loadUserModules
 43:      * @description: load all user modules
 44:      */
 45:     private function loadUserModules() {
 46:         $this->logger->log('INFO', "Loading USER modules...");
 47:         forEach ($this->moduleLoadPaths as $path) {
 48:             $this->logger->log('DEBUG', "Loading modules in path '$path'");
 49:             if (file_exists($path) && $d = dir($path)) {
 50:                 while (false !== ($MODULE_NAME = $d->read())) {
 51:                     if ($this->isModuleDir($path, $MODULE_NAME)) {
 52:                         $this->registerModule($path, $MODULE_NAME);
 53:                     }
 54:                 }
 55:                 $d->close();
 56:             }
 57:         }
 58:     }
 59: 
 60:     private function isModuleDir($path, $moduleName) {
 61:         return $this->isValidModuleName($moduleName)
 62:             && is_dir("$path/$moduleName");
 63:     }
 64: 
 65:     private function isValidModuleName($name) {
 66:         return $name != '.' && $name != '..';
 67:     }
 68:     
 69:     public function registerModule($baseDir, $MODULE_NAME) {
 70:         // read module.ini file (if it exists) from module's directory
 71:         if (file_exists("{$baseDir}/{$MODULE_NAME}/module.ini")) {
 72:             $entries = parse_ini_file("{$baseDir}/{$MODULE_NAME}/module.ini");
 73:             // check that current PHP version is greater or equal than module's
 74:             // minimum required PHP version
 75:             if (isset($entries["minimum_php_version"])) {
 76:                 $minimum = $entries["minimum_php_version"];
 77:                 $current = phpversion();
 78:                 if (strnatcmp($minimum, $current) > 0) {
 79:                     $this->logger->log('WARN', "Could not load module"
 80:                     ." {$MODULE_NAME} as it requires at least PHP version '$minimum',"
 81:                     ." but current PHP version is '$current'");
 82:                     return;
 83:                 }
 84:             }
 85:         }
 86: 
 87:         $newInstances = $this->getNewInstancesInDir("{$baseDir}/{$MODULE_NAME}");
 88:         forEach ($newInstances as $name => $className) {
 89:             $obj = new $className;
 90:             $obj->moduleName = $MODULE_NAME;
 91:             if (Registry::instanceExists($name)) {
 92:                 $this->logger->log('WARN', "Instance with name '$name' already registered--replaced with new instance");
 93:             }
 94:             Registry::setInstance($name, $obj);
 95:         }
 96: 
 97:         if (count($newInstances) == 0) {
 98:             $this->logger->log('ERROR', "Could not load module {$MODULE_NAME}. No classes found with @Instance annotation!");
 99:             return;
100:         }
101:     }
102:     
103:     public static function getNewInstancesInDir($path) {
104:         $original = get_declared_classes();
105:         if ($dir = dir($path)) {
106:             while (false !== ($file = $dir->read())) {
107:                 if (!is_dir($path . '/' . $file) && preg_match("/\\.php$/i", $file)) {
108:                     require_once "{$path}/{$file}";
109:                 }
110:             }
111:             $dir->close();
112:         }
113:         $new = array_diff(get_declared_classes(), $original);
114: 
115:         $newInstances = array();
116:         forEach ($new as $className) {
117:             $reflection = new ReflectionAnnotatedClass($className);
118:             if ($reflection->hasAnnotation('Instance')) {
119:                 if ($reflection->getAnnotation('Instance')->value != '') {
120:                     $name = $reflection->getAnnotation('Instance')->value;
121:                 } else {
122:                     $name = Registry::formatName($className);
123:                 }
124:                 $newInstances[$name] = $className;
125:             }
126:         }
127:         return $newInstances;
128:     }
129: }
130: 
Budabot 4 Docs API documentation generated by ApiGen