Location: PHPKode > projects > SteelBot > steelbot/include/classes/steelbotcore.class.php
<?php

/**
 * SteelBotCore class for SteelBot
 * 
 * http://steelbot.net
 * 
 * @author N3x^0r
 *
 */

class SteelBotCore {

static $next_timer,
       $timers,
       $events = array(),
       $cfg;    

private static $maxeventcode = 1,
               $maxtimerid = 1,
               $timer_ids = array();

/**
 * Инициализация бота.
 */
static function Init() {
    if (self::$cfg['save_actual_timers']) {
        self::LoadTimers();
    }
    self::$next_timer = time() * 2;
    return true;
}

// event functions

/**
 * Добавление обработчика события в бота.
 *
 * @param int $event_type  код события.
 * @param string $func, array $func  функция-обработчик
 */
static function RegisterEventHandler($event_type, $func) {    
    self::$events[$event_type][] = $func;
    return true;
}

/**
 * Удаление обработчика события.
 *
 * @param int $event_type код события
 * @param string $func, array $func функция-обработчик
 * @return bool
 */
static function UnregisterEventHandler($event_type, $func) {
    if (array_key_exists($event_type, self::$events)) {
        foreach (self::$events[$event_type] as $k=> $v) {
            if ($v == $func) {
                unset(self::$events[$event_type][$k]);
                return true;
            }
        }
    }
    return false;
}

/**
 * Возвращает массив всех обработчиков заданного события.
 *
 * @param int $event_type код события
 * @return array 
 */
static function GetEventHandlers($event_type) {
    if (array_key_exists($event_type, self::$events)) {
        return array_values(self::$events[$event_type]);
    } else {
        return false;
    }
}

/**
 * Создает новый тип события в системе.
 *
 * @param string $name имя константы, идентифицирующей событие.
 */
static function AddEventType($name) {
    if (!defined($name)) {
        define($name, self::$maxeventcode);
        self::$maxeventcode++;
        return (self::$maxeventcode-1);
    } else {
        slog::add('core',"Event type $name has already defined", LOG_CORE);
        return false;
    }
}

/**
 * Генерация события.
 *
 * @param Event $event
 * @return Event
 */
static function EventRun(Event $event) {
    $code = $event->GetCode();
    $good_calls = 0;
    if (array_key_exists($code, self::$events)) {
        foreach (self::$events[$code] as $func) {
            if ( call_user_func($func, $event) ) {
                $good_calls++;
            }
        }
    }
    return $good_calls;
}




// timer functions

/**
 * @desc Записывает вызов заданной через заданное время
 * 
 * @param int $time - время в секундах, по прохождении которого будет вызвана
 * функция
 * @param string $func - имя функции
 * @return int - идентификатор таймера.
 */
static function TimerAdd($time,$func) {
    $time = time()+$time;
    self::$timer_ids[ self::$maxtimerid ] = array($time, $func);
    self::$timers[$time][] = array($func, self::$maxtimerid);
    self::$next_timer = min(array_keys(self::$timers));        
    return self::$maxtimerid++;
}

/**
 * @desc Вызывает все функции, время вызова которых меньше чем заданное (т.е.
 * вызывает все функции, которые к моменту времени $time должны были выполнится,
 * но не выполнились
 *
 * @param int $time - время в формате UNIX
 */
static function TimerRun($time) {
    $called_handlers = 0;
    foreach ( array_keys(self::$timers) as $timer_time) {
        if ($timer_time <= $time) {
            foreach (self::$timers[$timer_time] as $vv) {
                if ( call_user_func($vv[0]) ){
                    $called_handlers++;
                }
                unset( self::$timer_ids[$vv[1]] );
            }
            unset(self::$timers[$timer_time]);
        }
    }
    return $called_handlers;
}

/**
 * Удаляет таймер по его идентификатору.
 * 
 * @param int $timer_id
 * @return bool
 */
static function TimerDeleteById($timer_id) {
    if (array_key_exists($timer_id, self::$timer_ids)) {
        $timer_record = self::$timer_ids[ $timer_id ];
        unset( self::$timer_ids[$timer_id] );
        foreach ( self::$timers[$timer_record[0]] as $k=>$v ) {
            if ($v[1] == $timer_id) {
                unset( self::$timers[$timer_record[0]][$k] );
                break;
            }
        }        
        return true;
    } else {
        return false;
    }
}

/**
 * Синхронизация таймеров
 */
static function SyncTimers() {
    foreach (self::$timers as $k=>$v) {
        if (count($v) < 1) {
            unset(self::$timers[$k]);
        }
    }
    self::$next_timer = min(array_keys(self::$timers));
    return self::$next_timer;
}

/**
 * Записать таймеры на диск
 *
 */
static function SaveTimers() {
    slog::add('core',"Saving timers ... ", LOG_CORE);
    $timers_file = STEELBOT_DIR.DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR.
            Proto::BotID().'.timers';
    if ( file_put_contents( $timers_file, serialize(self::$timers)) ) {
        slog::result("OK");
        return true;
    } else {
        slog::result("ERROR");
        return false;
    }
}

/**
 * Загрузить таймеры из файла.
 * @param string $filename - имя файла, из которого загружаются таймеры (необязательный параметр)
 */
static function LoadTimers($filename = false) {
    
    if (!$filename) {
        $filename = STEELBOT_DIR.DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR.
            Proto::BotID().'.timers';
    }
    slog::add('core', 'Loading timers '.$filename."... ", LOG_CORE);
    $count = 0;

    if ( is_readable($filename) ) {
        $timers = @unserialize( file_get_contents($filename) );

        if ( is_array($timers) ) {
            foreach ($timers as $time=>$funcs) {
                $now = time();
                if ($now < $time) {
                    foreach ($funcs as $func_record) {
                        self::TimerAdd($time-$now, $func_record[0]);
                        $count++;
                    }
                } else {
                    slog::add('core', "   timer skipped: ($time) ", LOG_CORE);
                }
            }
            slog::result(" OK");
        } else {
            slog::result(" no timers");
        }
        unlink($filename);
    } else {
        slog::result("OK");
    }
    return $count;
            
}

/**
 * @desc Последовательно вызывает все выходные функции, а затем завершает работу
 * скрипта.
 *
 */
static function DoExit() {
    slog::add('core', "Exit requested");
    if (self::$cfg['save_actual_timers']) {
        self::SaveTimers();
    }
    self::EventRun( new Event(EVENT_EXIT) );
    exit;
}


}
Return current item: SteelBot