PDO = new PDO('sqlite:'.BOT_TOPDIR.'/cache/functions.sqlite');
$this->PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->PDO->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_TO_STRING);
return;
}
$functions = array();
$modules = glob(BOT_TOPDIR.'/modules/*', GLOB_ONLYDIR);
foreach($modules as $dir) {
if(!is_file($dir.'/init.php')) {
continue;
}
$class = include_once($dir.'/init.php');
if(!$class || !class_exists($class, FALSE)) {
continue;
}
$init = new $class;
if(!($init instanceof BotModuleInit)) {
continue;
}
$row = $init->register();
if(!is_array($row)) {
$row = array();
}
foreach($row as $name => &$value) {
if(!is_array($value)) {
unset($row[$name]);
continue;
}
foreach($value as &$val) {
$val['dir'] = '/modules/'.basename($dir).'/';
$val['init'] = $class;
$val['file'] = $val['file'];
}
$name2 = funcs::utfToAscii(strtolower($name));
if($name != $name2) {
if(isset($row[$name2])) {
$row[$name2] = array_merge_recursive($row[$name2], $row[$name]);
}
else
{
$row[$name2] = $row[$name];
}
unset($row[$name]);
}
}
$functions = array_merge_recursive($functions, $row);
}
try {
$this->PDO = new PDO('sqlite:'.BOT_TOPDIR.'/cache/functions.sqlite');
$this->PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->PDO->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_TO_STRING);
$this->PDO->query('CREATE TABLE functions (
name VARCHAR(50),
priority INT,
dir VARCHAR(255),
init VARCHAR(255),
file VARCHAR(255),
class VARCHAR(255),
method VARCHAR(255),
params TEXT,
PRIMARY KEY (
name ASC,
priority ASC
)
)');
$this->PDO->query('CREATE INDEX file ON functions (dir, file)');
$st = $this->PDO->prepare('INSERT INTO functions (name, priority, dir, init, file, class, method, params) VALUES (?, ?, ?, ?, ?, ?, ?, ?)');
$this->PDO->beginTransaction();
foreach($functions as $name => $funcs) {
$name = funcs::utfToAscii(strtolower($name));
foreach($funcs as $priority => $func) {
if(!isset($func['params'])) {
$func['params'] = NULL;
}
$st->execute(array($name, $priority, $func['dir'], $func['init'], $func['file'], $func['class'], $func['method'], serialize($func['params'])));
}
}
$this->PDO->commit();
}
catch(Exception $e) {
@unlink(BOT_TOPDIR.'/cache/functions.sqlite');
throw $e;
}
}
/**
* Przetwarza wiadomość do bota
* @param BotMessage $msg Wiadomość
*/
function __construct(BotMessage $msg) {
try {
$this->init();
$st = $this->PDO->prepare('SELECT dir, file, class, method, params FROM functions WHERE name=? ORDER BY priority ASC');
$st->execute(array($msg->command));
$data1 = $st->fetchAll();
$st->execute(array('*'));
$data2 = $st->fetchAll();
$data = array_merge($data1, $data2);
unset($data1, $data2);
$return = NULL;
foreach($data as $func) {
if(!is_file(BOT_TOPDIR.$func['dir'].$func['file'])) {
$st = $this->PDO->prepare('DELETE FROM functions WHERE dir=? AND file=?');
$st->execute(array($func['dir'], $func['file']));
continue;
}
require_once(BOT_TOPDIR.$func['dir'].$func['file']);
$class = new $func['class'];
$return = $class->$func['method']($msg, unserialize($func['params']));
if($return instanceof BotMsg) {
break;
}
}
if(!($return instanceof BotMsg)) {
$return = new BotMsg('Nieznane polecenie. Wpisz help by uzyskać listę komend.');
}
}
catch(Exception $e) {
$return = new BotMsg('Wystąpił błąd podczas przetwarzania poleceń. Komunikat:
'.nl2br($e));
}
try {
$class = substr(get_class($msg), strlen('BotMessage'));
if(!$class) {
throw new Exception('Wiadomość dostarczona za pomocą nieznanego interfejsu.');
}
$class = 'BotMsg'.$class;
try {
$class = new $class($return);
}
catch(Exception $e) {
$class = new $class(new BotMsg('Wystąpił błąd podczas przetwarzania poleceń. Komunikat:
'.nl2br($e)));
}
$class->sendPullResponse();
}
catch(Exception $e) {
echo 'Wystąpił błąd podczas przetwarzania poleceń. Komunikat: '.$e;
}
}
}
?>