import 'dart:async'; // Log seviyeleri class LogLevel { final String name; const LogLevel._(this.name); static const DEBUG = LogLevel._('DEBUG'); static const INFO = LogLevel._('INFO'); static const WARNING = LogLevel._('WARNING'); static const ERROR = LogLevel._('ERROR'); @override String toString() => name; } // Global Event Sistemi class FikoYTEventSystem { static final FikoYTEventSystem _instance = FikoYTEventSystem._internal(); factory FikoYTEventSystem() { return _instance; } FikoYTEventSystem._internal(); final _eventController = StreamController.broadcast(); final Map> _subscriptions = {}; final Map _events = {}; // Loglama fonksiyonu void _log(String message, {LogLevel level = LogLevel.INFO}) { final timestamp = DateTime.now().toIso8601String(); print('[$timestamp] [${level.name}] $message'); } // Event sınıfını ekler void addEvent(FikoYTEvent event) { final eventName = event.name; if (_events.containsKey(eventName)) { _log("Event '$eventName' mevcut, argümanlar birleştirildi.", level: LogLevel.DEBUG); _events[eventName]?.mergeArguments(event.arguments); } else { _events[eventName] = event; _log("Yeni event eklendi: $eventName", level: LogLevel.INFO); } } // Event gönderme void sendEvent({ required String eventName, dynamic argument, String? category, }) { if (!_events.containsKey(eventName)) { _log("Event '$eventName' tanımlı değil!", level: LogLevel.ERROR); throw Exception("Event '$eventName' tanımlı değil!"); } final event = _events[eventName]; if (category != null && event?.category != category) { _log("Event '$eventName' kategorisi '$category' ile uyuşmuyor!", level: LogLevel.ERROR); throw Exception("Event '$eventName' kategorisi '$category' ile uyuşmuyor!"); } event?.send(argument); } // Event dinleme StreamSubscription onEvent({ required String eventName, required void Function(FikoYTEvent) onData, dynamic customArgs, }) { if (!_events.containsKey(eventName)) { _log("Event '$eventName' tanımlı değil!", level: LogLevel.ERROR); throw Exception("Event '$eventName' tanımlı değil!"); } final subscription = _eventController.stream.where((e) => e.name == eventName).listen((event) { _log("Event tetiklendi: ${event.name}, Argüman: ${event.arguments}", level: LogLevel.DEBUG); // customArgs yalnızca bu dinleyici için geçerli olacak if (customArgs != null) { event.mergeArguments(customArgs); } // onData fonksiyonunu çağırıyoruz onData(event); }); _subscriptions[eventName] = subscription; _log("Event dinleniyor: $eventName", level: LogLevel.INFO); return subscription; } // Event duraklatma void pauseEvent({required String eventName}) { if (_subscriptions[eventName]?.isPaused == true) { _log("Event '$eventName' zaten duraklatılmış.", level: LogLevel.WARNING); return; } _subscriptions[eventName]?.pause(); _log("Event '$eventName' duraklatıldı.", level: LogLevel.INFO); } // Event'e devam ettirme void resumeEvent({required String eventName}) { if (_subscriptions[eventName]?.isPaused == false) { _log("Event '$eventName' zaten aktif.", level: LogLevel.WARNING); return; } _subscriptions[eventName]?.resume(); _log("Event '$eventName' devam ettirildi.", level: LogLevel.INFO); } // Event'i iptal etme void cancelEvent({required String eventName}) { if (!_subscriptions.containsKey(eventName)) { _log("Event '$eventName' zaten iptal edilmiş veya bulunmuyor.", level: LogLevel.WARNING); return; } _subscriptions[eventName]?.cancel(); _subscriptions.remove(eventName); _events.remove(eventName); _log("Event '$eventName' iptal edildi ve sistemden kaldırıldı.", level: LogLevel.INFO); } // Tüm event'leri iptal etme void cancelAllEvents() { for (final subscription in _subscriptions.values) { subscription.cancel(); } _subscriptions.clear(); _events.clear(); _log("Tüm event'ler iptal edildi ve sistem sıfırlandı.", level: LogLevel.WARNING); } void dispose() { _eventController.close(); cancelAllEvents(); _log("Global Event System tamamen kapatıldı.", level: LogLevel.ERROR); } } // Event veri sınıfı class FikoYTEvent { final String name; dynamic _arguments; // private variable for arguments final dynamic defaultArguments; // Varsayılan argümanlar String? category; // Event için kategori FikoYTEvent( this.name, { this.category, dynamic arguments = const {}, this.defaultArguments = const {}, }) : _arguments = arguments; // Getter dynamic get arguments => _arguments ?? defaultArguments; // Setter (Kopyalama işlemi ile) void mergeArguments(dynamic newArguments) { if (_arguments is Map && newArguments is Map) { _arguments = {..._arguments, ...newArguments}; } else { _arguments = newArguments; } } // Event gönderme void send(dynamic argument) { dynamic finalArguments; // Eğer o anlık bir argüman verilmişse, sadece o anlık işlemde geçerli olacak şekilde birleştirilecek if (argument != null) { finalArguments = argument is Map && _arguments is Map ? {..._arguments, ...argument} : argument; } else { finalArguments = _arguments ?? defaultArguments; } // O anlık argümanları gönderme işlemi FikoYTEventSystem()._eventController.add(FikoYTEvent(name, arguments: finalArguments, category: category)); } }