setLog($this->log); $groups = []; foreach ($this->log as $entry) { if (preg_match(ItemPattern::FIELDS, (string) $entry, $m) !== 1) { continue; } if (!str_starts_with($m['delta'], '+')) { continue; } $key = $m['steamid'] . '|' . $m['item']; $groups[$key][] = [ 'time' => $entry->getTime() ?? 0, 'steamid' => $m['steamid'], 'item' => $m['item'], 'player' => $m['player'], ]; } foreach ($groups as $events) { usort($events, static fn($a, $b) => $a['time'] <=> $b['time']); $left = 0; $eventCount = count($events); for ($right = 0; $right < $eventCount; $right++) { while ($events[$right]['time'] - $events[$left]['time'] > self::THRESHOLD_WINDOW_SECONDS) { $left++; } if (($right - $left + 1) >= self::THRESHOLD_COUNT) { $sample = $events[0]; $analysis->addInsight((new ItemDuplicationProblem()) ->setSteamId($sample['steamid']) ->setPlayer($sample['player']) ->setItem($sample['item']) ->setEventCount($eventCount)); break; } } } return $analysis; } }