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\Modules;
  4: 
  5: use Budabot\Core\PrivateMessageCommandReply;
  6: 
  7: /**
  8:  * Authors: 
  9:  *  - Sebuda (RK2)
 10:  *  - Tyrence (RK2)
 11:  *
 12:  * @Instance
 13:  *
 14:  * Commands this controller contains:
 15:  *  @DefineCommand(
 16:  *      command       = 'checkaccess',
 17:  *      accessLevel   = 'all',
 18:  *      description   = 'Check effective access level of a character',
 19:  *      help          = 'checkaccess.txt'
 20:  *  )
 21:  *  @DefineCommand(
 22:  *      command       = 'clearqueue',
 23:  *      accessLevel   = 'mod',
 24:  *      description   = 'Clear outgoing chatqueue from all pending messages',
 25:  *      help          = 'clearqueue.txt'
 26:  *  )
 27:  *  @DefineCommand(
 28:  *      command       = 'macro',
 29:  *      accessLevel   = 'all',
 30:  *      description   = 'Execute multiple commands at once',
 31:  *      help          = 'macro.txt'
 32:  *  )
 33:  *  @DefineCommand(
 34:  *      command       = 'showcommand',
 35:  *      accessLevel   = 'mod',
 36:  *      description   = 'Execute a command and have output sent to another player',
 37:  *      help          = 'showcommand.txt'
 38:  *  )
 39:  *  @DefineCommand(
 40:  *      command       = 'system',
 41:  *      accessLevel   = 'mod',
 42:  *      description   = 'Show detailed information about the bot',
 43:  *      help          = 'system.txt'
 44:  *  )
 45:  *  @DefineCommand(
 46:  *      command       = 'restart',
 47:  *      accessLevel   = 'admin',
 48:  *      description   = 'Restart the bot',
 49:  *      help          = 'system.txt',
 50:  *      defaultStatus = '1'
 51:  *  )
 52:  *  @DefineCommand(
 53:  *      command       = 'shutdown',
 54:  *      accessLevel   = 'admin',
 55:  *      description   = 'Shutdown the bot',
 56:  *      help          = 'system.txt',
 57:  *      defaultStatus = '1'
 58:  *  )
 59:  */
 60: class SystemController {
 61: 
 62:     /**
 63:      * Name of the module.
 64:      * Set automatically by module loader.
 65:      */
 66:     public $moduleName;
 67: 
 68:     /** @Inject */
 69:     public $accessManager;
 70: 
 71:     /** @Inject */
 72:     public $adminManager;
 73: 
 74:     /** @Inject */
 75:     public $chatBot;
 76:     
 77:     /** @Inject */
 78:     public $db;
 79: 
 80:     /** @Inject */
 81:     public $commandManager;
 82:     
 83:     /** @Inject */
 84:     public $eventManager;
 85: 
 86:     /** @Inject */
 87:     public $commandAlias;
 88: 
 89:     /** @Inject */
 90:     public $subcommandManager;
 91: 
 92:     /** @Inject */
 93:     public $helpManager;
 94:     
 95:     /** @Inject */
 96:     public $buddylistManager;
 97: 
 98:     /** @Inject */
 99:     public $settingManager;
100: 
101:     /** @Inject */
102:     public $text;
103: 
104:     /** @Inject */
105:     public $util;
106: 
107:     /** @Logger */
108:     public $logger;
109: 
110:     /**
111:      * @Setting("symbol")
112:      * @Description("Command prefix symbol")
113:      * @Visibility("edit")
114:      * @Type("text")
115:      * @Options("!;#;*;@;$;+;-")
116:      * @AccessLevel("mod")
117:      */
118:     public $defaultSymbol = "!";
119: 
120:     /**
121:      * @Setting("max_blob_size")
122:      * @Description("Max chars for a window")
123:      * @Visibility("edit")
124:      * @Type("number")
125:      * @Options("4500;6000;7500;9000;10500;12000")
126:      * @AccessLevel("mod")
127:      * @Help("max_blob_size.txt")
128:      */
129:     public $defaultMaxBlobSize = "7500";
130: 
131:     /**
132:      * @Setting("http_timeout")
133:      * @Description("Max time to wait for response from making http queries")
134:      * @Visibility("edit")
135:      * @Type("time")
136:      * @Options("1s;2s;5s;10s;30s")
137:      * @AccessLevel("mod")
138:      */
139:     public $defaultHttpTimeout = "10s";
140: 
141:     /**
142:      * @Setting("guild_channel_status")
143:      * @Description("Enable the guild channel")
144:      * @Visibility("edit")
145:      * @Type("options")
146:      * @Options("true;false")
147:      * @Intoptions("1;0")
148:      * @AccessLevel("mod")
149:      */
150:     public $defaultGuildChannelStatus = "1";
151: 
152:     /**
153:      * @Setting("guild_channel_cmd_feedback")
154:      * @Description("Show message on invalid command in guild channel")
155:      * @Visibility("edit")
156:      * @Type("options")
157:      * @Options("true;false")
158:      * @Intoptions("1;0")
159:      * @AccessLevel("mod")
160:      */
161:     public $defaultGuildChannelCmdFeedback = "1";
162: 
163:     /**
164:      * @Setting("private_channel_cmd_feedback")
165:      * @Description("Show message on invalid command in private channel")
166:      * @Visibility("edit")
167:      * @Type("options")
168:      * @Options("true;false")
169:      * @Intoptions("1;0")
170:      * @AccessLevel("mod")
171:      */
172:     public $defaultPrivateChannelCmdFeedback = "1";
173: 
174:     /**
175:      * @Setting("version")
176:      * @Description("Database version")
177:      * @Visibility("noedit")
178:      * @Type("text")
179:      * @AccessLevel("mod")
180:      */
181:     public $defaultVersion = "0";
182:     
183:     /**
184:      * @Setting("access_denied_notify_guild")
185:      * @Description("Notify guild channel when a player is denied access to a command in tell")
186:      * @Visibility("edit")
187:      * @Type("options")
188:      * @Options("true;false")
189:      * @Intoptions("1;0")
190:      * @AccessLevel("mod")
191:      */
192:     public $defaultAccessDeniedNotifyGuild = "1";
193:     
194:     /**
195:      * @Setting("access_denied_notify_priv")
196:      * @Description("Notify private channel when a player is denied access to a command in tell")
197:      * @Visibility("edit")
198:      * @Type("options")
199:      * @Options("true;false")
200:      * @Intoptions("1;0")
201:      * @AccessLevel("mod")
202:      */
203:     public $defaultAccessDeniedNotifyPriv = "1";
204: 
205:     /**
206:      * @Setup
207:      * This handler is called on bot startup.
208:      */
209:     public function setup() {
210:         global $version;
211:         $this->settingManager->save('version', $version);
212: 
213:         $this->helpManager->register($this->moduleName, "budatime", "budatime.txt", "all", "Format for budatime");
214:         
215:         $name = $this->chatBot->vars['name'];
216:         $this->settingManager->add($this->moduleName, "default_private_channel", "Private channel to process commands from", "edit", "text", $name, $name);
217:     }
218:     
219:     /**
220:      * @HandlesCommand("restart")
221:      * @Matches("/^restart$/i")
222:      */
223:     public function restartCommand($message, $channel, $sender, $sendto, $args) {
224:         $msg = "Bot is restarting.";
225:         $this->chatBot->sendTell($msg, $sender);
226:         $this->chatBot->sendPrivate($msg, true);
227:         $this->chatBot->sendGuild($msg, true);
228: 
229:         $this->chatBot->disconnect();
230:         $this->logger->log('INFO', "The Bot is restarting.");
231:         exit(-1);
232:     }
233: 
234:     /**
235:      * @HandlesCommand("shutdown")
236:      * @Matches("/^shutdown$/i")
237:      */
238:     public function shutdownCommand($message, $channel, $sender, $sendto, $args) {
239:         $msg = "The Bot is shutting down.";
240:         $this->chatBot->sendTell($msg, $sender);
241:         $this->chatBot->sendPrivate($msg, true);
242:         $this->chatBot->sendGuild($msg, true);
243: 
244:         $this->chatBot->disconnect();
245:         $this->logger->log('INFO', "The Bot is shutting down.");
246:         exit(10);
247:     }
248: 
249:     /**
250:      * @HandlesCommand("system")
251:      * @Matches("/^system$/i")
252:      */
253:     public function systemCommand($message, $channel, $sender, $sendto, $args) {
254:         global $version;
255: 
256:         $sql = "SELECT count(*) AS count FROM players";
257:         $row = $this->db->queryRow($sql);
258:         $num_player_cache = $row->count;
259: 
260:         $num_buddylist = 0;
261:         forEach ($this->buddylistManager->buddyList as $key => $value) {
262:             if (!isset($value['name'])) {
263:                 // skip the buddies that have been added but the server hasn't sent back an update yet
264:                 continue;
265:             }
266: 
267:             $num_buddylist++;
268:         }
269: 
270:         $blob = "Name: <highlight><myname><end>\n";
271:         $blob .= "SuperAdmin: <highlight>'{$this->chatBot->vars['SuperAdmin']}'<end>\n";
272:         $blob .= "Guild: <highlight>'<myguild>' (" . $this->chatBot->vars['my_guild_id'] . ")<end>\n\n";
273: 
274:         $blob .= "Budabot: <highlight>$version<end>\n";
275:         $blob .= "PHP: <highlight>" . phpversion() . "<end>\n";
276:         $blob .= "OS: <highlight>" . php_uname('s') . ' ' . php_uname('r') . ' ' . php_uname('m') . "<end>\n";
277:         $blob .= "Database: <highlight>" . $this->db->getType() . "<end>\n\n";
278: 
279:         $blob .= "Current Memory Usage: <highlight>" . $this->util->bytesConvert(memory_get_usage()) . "<end>\n";
280:         $blob .= "Current Memory Usage (Real): <highlight>" . $this->util->bytesConvert(memory_get_usage(1)) . "<end>\n";
281:         if (version_compare(PHP_VERSION, '5.2.0', '>=')) {
282:             $blob .= "Peak Memory Usage: <highlight>" . $this->util->bytesConvert(memory_get_peak_usage()) . "<end>\n";
283:             $blob .= "Peak Memory Usage (Real): <highlight>" . $this->util->bytesConvert(memory_get_peak_usage(1)) . "<end>\n\n";
284:         }
285:         
286:         $blob .= "Using Chat Proxy: <highlight>" . ($this->chatBot->vars['use_proxy'] == 1 ? "enabled" : "disabled") . "<end>\n";
287: 
288:         $date_string = $this->util->unixtimeToReadable(time() - $this->chatBot->vars['startup']);
289:         $blob .= "Uptime: <highlight>$date_string<end>\n\n";
290: 
291:         $eventnum = 0;
292:         forEach ($this->eventManager->events as $type => $events) {
293:             $eventnum += count($events);
294:         }
295: 
296:         $numAliases = count($this->commandAlias->getEnabledAliases());
297: 
298:         $blob .= "Active tell commands: <highlight>" . (count($this->commandManager->commands['msg']) - $numAliases) . "<end>\n";
299:         $blob .= "Active private channel commands: <highlight>" . (count($this->commandManager->commands['priv']) - $numAliases) . "<end>\n";
300:         $blob .= "Active guild channel commands: <highlight>" . (count($this->commandManager->commands['guild']) - $numAliases) . "<end>\n";
301:         $blob .= "Active subcommands: <highlight>" . count($this->subcommandManager->subcommands) . "<end>\n";
302:         $blob .= "Active command aliases: <highlight>" . $numAliases . "<end>\n";
303:         $blob .= "Active events: <highlight>" . $eventnum . "<end>\n";
304:         $blob .= "Active help commands: <highlight>" . count($this->helpManager->getAllHelpTopics(null)) . "<end>\n\n";
305: 
306:         $blob .= "Characters on the buddy list: <highlight>$num_buddylist / " . count($this->buddylistManager->buddyList) . "<end>\n";
307:         $blob .= "Maximum buddy list size: <highlight>" . $this->chatBot->getBuddyListSize() . "<end>\n";
308:         $blob .= "Characters in the private channel: <highlight>" . count($this->chatBot->chatlist) . "<end>\n";
309:         $blob .= "Guild members: <highlight>" . count($this->chatBot->guildmembers) . "<end>\n";
310:         $blob .= "Character infos in cache: <highlight>" . $num_player_cache . "<end>\n";
311:         $blob .= "Messages in the chat queue: <highlight>" . count($this->chatBot->chatqueue->queue) . "<end>\n\n";
312: 
313:         $blob .= "Public Channels:\n";
314:         forEach ($this->chatBot->grp as $gid => $status) {
315:             $string = unpack("N", substr($gid, 1));
316:             $blob .= "<tab><highlight>'{$this->chatBot->gid[$gid]}'<end> (" . ord(substr($gid, 0, 1)) . " " . $string[1] . ")\n";
317:         }
318: 
319:         $msg = $this->text->makeBlob('System Info', $blob);
320:         $sendto->reply($msg);
321:     }
322: 
323:     /**
324:      * @HandlesCommand("checkaccess")
325:      * @Matches("/^checkaccess$/i")
326:      * @Matches("/^checkaccess (.+)$/i")
327:      */
328:     public function checkaccessCommand($message, $channel, $sender, $sendto, $args) {
329:         if (isset($args[1])) {
330:             $name = ucfirst(strtolower($args[1]));
331:             if (!$this->chatBot->get_uid($name)) {
332:                 $sendto->reply("Character <highlight>{$name}<end> does not exist.");
333:                 return;
334:             }
335:         } else {
336:             $name = $sender;
337:         }
338:     
339:         $accessLevel = $this->accessManager->getDisplayName($this->accessManager->getAccessLevelForCharacter($name));
340:     
341:         $msg = "Access level for $name is <highlight>$accessLevel<end>.";
342:         $sendto->reply($msg);
343:     }
344: 
345:     /**
346:      * This command handler clear outgoing chatqueue from all pending messages.
347:      *
348:      * @HandlesCommand("clearqueue")
349:      */
350:     public function clearqueueCommand($message, $channel, $sender, $sendto, $args) {
351:         $num = 0;
352:         forEach ($this->chatBot->chatqueue->queue as $priority) {
353:             $num += count($priority);
354:         }
355:         $this->chatBot->chatqueue->queue = array();
356:     
357:         $sendto->reply("Chat queue has been cleared of $num messages.");
358:     }
359: 
360:     /**
361:      * This command handler execute multiple commands at once.
362:      *
363:      * @HandlesCommand("macro")
364:      * @Matches("/^macro (.+)$/si")
365:      */
366:     public function macroCommand($message, $channel, $sender, $sendto, $args) {
367:         $commands = explode("|", $args[1]);
368:         forEach ($commands as $commandString) {
369:             $this->commandManager->process($channel, $commandString, $sender, $sendto);
370:         }
371:     }
372: 
373:     /**
374:      * @Event("timer(1hr)")
375:      * @Description("This event handler is called every hour to keep MySQL connection active")
376:      * @DefaultStatus("1")
377:      */
378:     public function refreshMySQLConnectionEvent($eventObj) {
379:         // if the bot doesn't query the mysql database for 8 hours the db connection is closed
380:         $this->logger->log('DEBUG', "Pinging database");
381:         $sql = "SELECT * FROM settings_<myname>";
382:         $this->db->query($sql);
383:     }
384: 
385:     /**
386:      * @Event("connect")
387:      * @Description("Notify private channel, guild channel, and admins that bot is online")
388:      * @DefaultStatus("1")
389:      */
390:     public function onConnectEvent($eventObj) {
391:         // send Admin(s) a tell that the bot is online
392:         forEach ($this->adminManager->admins as $name => $info) {
393:             if ($info["level"] == 4 && $this->buddylistManager->isOnline($name) == 1) {
394:                 $this->chatBot->sendTell("<myname> is <green>online<end>. For updates or help use the Budabot Forums <highlight>http://budabot.com<end>", $name);
395:             }
396:         }
397:         
398:         global $version;
399:         $msg = "Budabot <highlight>$version<end> now <green>online<end>.";
400: 
401:         // send a message to guild channel
402:         $this->chatBot->sendGuild($msg, true);
403:         $this->chatBot->sendPrivate($msg, true);
404:     }
405:     
406:     /**
407:      * @HandlesCommand("showcommand")
408:      * @Matches("/^showcommand ([^ ]+) (.+)$/i")
409:      */
410:     public function showCommandCommand($message, $channel, $sender, $sendto, $args) {
411:         $name = ucfirst(strtolower($args[1]));
412:         $cmd = $args[2];
413:         $type = "msg";
414:     
415:         $showSendto = new PrivateMessageCommandReply($this->chatBot, $name);
416:         $this->commandManager->process($type, $cmd, $sender, $showSendto);
417:         
418:         $sendto->reply("Command <highlight>$cmd<end> has been sent to <highlight>$name<end>.");
419:     }
420: }
421: 
Budabot 4 Docs API documentation generated by ApiGen