Rules and State#
RuleSet#
Campaign rules are defined by Infocyph\Draw\Rules\RuleSet:
perUserCap (default 1, minimum 1)
perItemCap (map: itemId => non-negative int)
groupQuota (map: group => non-negative int)
cooldownSeconds (default 0, non-negative)
Example:
<?php
'rules' => [
'perUserCap' => 1,
'perItemCap' => ['gold' => 1],
'groupQuota' => ['premium' => 1, 'basic' => 2],
'cooldownSeconds' => 60,
]
Rule Engine Decisions#
Campaign eligibility can be rejected by reasons such as:
per_user_cap_reached
per_item_cap_reached
group_quota_reached
cooldown_active
PSR-6 State Contract#
Campaign rule tracking uses Psr\Cache\CacheItemPoolInterface.
Provide a pool through options.cachePool.
Built-in Pool#
Infocyph\Draw\State\MemoryCachePool is provided for in-process usage.
<?php
use Infocyph\Draw\State\MemoryCachePool;
'options' => [
'cachePool' => new MemoryCachePool(),
]
State Key Patterns#
Current rule engine stores counters/values under keys like:
rules.user_wins.{userId}
rules.item_wins.{itemId}
rules.group_wins.{group}
rules.user_last_win.{userId}
Persistence Guidance#
Use in-memory pool for single-process local/testing use.
Use distributed/shared PSR-6 pools when campaign state must be shared across workers.
For high-concurrency counters, choose a backend and deployment pattern that preserves expected counter behavior.