Skip to content

lib_achievements.php (новые ачивки)

Alex Chuchunkov edited this page May 14, 2015 · 1 revision

Краткое описание того, что есть в lib_achievements.php и как это работает

Классы, интерфейсы, трейты

class Achievement (abstract)

  • базовые свойства для всех ачивок, типа short_title, css_class;
  • методы push (обновить информацию в БД по свойствам объекта), set (обновить свойства объекта по данным из БД)

class AchievementsManager

  • управляет всеми ачивками - сообщает им о событиях с помощью emit
  • обновляет у всех статус seen
  • достает все ачивки из базы для пользователя
  • считает какую-то статистику для вики

class EventTypes

  • ставит в соответствие типам событий названия интерфейсов

interface ListenerInterface (и TaskDoneListenerInterface, SignedUpListenerInterface, ...)

  • определяют метод dispatch, который принимает событие и реагирует на него

trait AchievementWithLevels

  • добавляет классу Achievement свойства level, progress
  • добавляет метод how_to_get_next
  • переписывает методы set, pull, чтобы они знали о level и progress

trait GivenOnTrigger

  • трейт, в котором dispatch сразу выдает человеку ачивку, если у него её еще нет

Классический пример комбинации из всего этого зоопарка:

class AistAchievement extends Achievement implements SignedUpListenerInterface {
    use GivenOnTrigger;
    public $short_title = "Аист";
    public $caption = "За регистрацию";
    public $css_class = "aist";
}

И использования AchievementManager::emit

$am = new AchievementsManager((int)$_SESSION['user_id']);
$am->emit(EventTypes::TASK_DONE);