in_array( 'administrator', $old, true ), 'administrator_after' => 'administrator' === $role ) ); } } public static function addedRole( int $id, string $role ): void { if ( 'administrator' === $role ) { self::record( 'administrator_role_added', $id ); } } public static function removedRole( int $id, string $role ): void { if ( 'administrator' === $role ) { self::record( 'administrator_role_removed', $id ); } } public static function created( int $id ): void { if ( self::administrator( $id ) ) { self::record( 'administrator_created', $id ); } } public static function deleted( int $id ): void { if ( self::administrator( $id ) ) { self::record( 'administrator_deleted', $id ); } } private static function administrator( int $id ): bool { $user = get_userdata( $id ); return $user && in_array( 'administrator', (array) $user->roles, true ); } public static function profile( int $id, $old ): void { if ( ! self::administrator( $id ) ) { return; } $new = get_userdata( $id ); $fields = array(); foreach ( array( 'user_pass' => 'password', 'user_email' => 'email', 'user_login' => 'login' ) as $key => $label ) { if ( (string) $old->$key !== (string) $new->$key ) { $fields[] = $label; } } if ( $fields ) { self::record( 'administrator_profile_changed', $id, array( 'changed_fields' => $fields ) ); } } private static function record( string $event, int $id, array $details = array() ): void { try { $data = $details + array( 'account_id' => $id, 'actor_id' => get_current_user_id(), 'observed_at' => gmdate( 'c' ), 'meaning' => 'Observed through WordPress hooks; direct database edits may only be detected by a subsequent scan.' ); ( new Store() )->activity( $event, $data ); Notifications::accountEvent( $event, $id ); } catch ( \Throwable $error ) { update_option( 'antivirus_ai_account_monitor_warning', array( 'at' => time(), 'message' => 'An administrator-change event could not be fully recorded. Review account access and notification delivery.' ), false ); } } }