socketInit method

dynamic socketInit()

Implementation

socketInit() {
  updateuseraccount();

  // Socket.IO'ya bağlanma
  socket = socketio.io('http://socket.armoyu.com:2020', <String, dynamic>{
    // socket = IO.io('http://10.0.2.2:2020', <String, dynamic>{
    'transports': ['websocket'],
    'autoConnect': true,
  });

  startPing(const Duration(seconds: 2));
  // Ping değerini güncelle

  socket.on('ping', (data) {
    // Burada data yerine ping zamanı verilmez.
    pingValue.value = data; // Bu satırda hata var
    log('${socketPREFIX}Ping: ${pingValue.value} ms'); // Log ile göster
  });

  // Pong mesajını dinle
  socket.on('pong', (data) {
    // data içinde ping ID'sini al

    String pingId = data['id'];
    if (pingId != pingID.value) {
      log("PING ID eşleşmedi: Beklenen ${pingID.value}, gelen $pingId");
      return;
    }

    DateTime pongReceivedTime = DateTime.now(); // Pong zamanı
    if (lastPingTime != null) {
      // Ping süresini hesapla
      pingValue.value =
          pongReceivedTime.difference(lastPingTime!).inMilliseconds;
      // log('Pong yanıtı alındı: $pingId');
      log('Ping süresi: ${pingValue.value} ms');
    }
  });

  //WEBRTC

  // 'offer' olayını dinle
  socket.on('offer', (data) async {
    if (kDebugMode) {
      print('Received offer');
    }

    WidgetsBinding.instance.addPostFrameCallback((_) {
      // Burada arama popup'ı açılabilir
      PopupWidget.showIncomingCallDialog(
        callerName: data['calling']['name'],
        callerAvatarUrl: data['calling']['image'],
        onAccept: () async {
          triggerCallingAccept(
            data['calling']['id'],
            data['calling']['name'],
            data['calling']['image'],
          );

          if (data is Map<String, dynamic>) {
            var offer = webrtc.RTCSessionDescription(
              data['offer']['sdp'], // SDP verisini al
              data['offer']['type'], // Offer veya Answer tipi
            );

            //teklif geliyor ve kabul ediyoruz peerConnection oluşturuyoruz
            await webRTCinit(restoresystem: true);
            // Peer connection'ı remote description olarak ayarlıyoruz
            peerConnection!.setRemoteDescription(offer).then((_) {
              // Remote description ayarlandıktan sonra cevabı oluştur

              createAnswer(offer);
            }).catchError((e) {
              if (kDebugMode) {
                print("Error setting remote description: $e");
              }
            });
          }
        },
        onDecline: () {
          if (kDebugMode) {
            print("Arama reddedildi");
          }
        },
      );
    });
  });

  // 'answer' olayını dinle
  socket.on('answer', (data) async {
    if (kDebugMode) {
      print('Received answer');
    }

    var answer = webrtc.RTCSessionDescription(
      data['sdp'], // SDP verisini al
      data['type'], // Offer veya Answer tipi
    );

    // Gelen "answer"ı remote description olarak ayarlıyoruz
    try {
      await peerConnection!.setRemoteDescription(answer);
    } catch (e) {
      if (kDebugMode) {
        print("Error setting remote description for answer: $e");
      }
    }
  });

  socket.on('candidate', (data) async {
    if (kDebugMode) {
      print('Received candidate: $data');
    }
    var candidate = webrtc.RTCIceCandidate(
      data['candidate'],
      data['sdpMid'],
      data['sdpMLineIndex'],
    );
    // Gelen candidate'ı peer connection'a ekliyoruz

    try {
      await peerConnection!.addCandidate(candidate);
    } catch (e) {
      if (kDebugMode) {
        print("Error adding candidate: $e");
      }
    }
  });

  //WEBRTC

  socket.on('signaling', (data) {
    // Signaling verilerini dinleme
    log('Signaling verisi alındı: $data');
  });

  socket.on('INCOMING_CALL', (data) {
    // Signaling verilerini dinleme

    log('Kullanıcı Seni Arıyor: ${data['callerId']}');

    isCallingMe.value = true;
    whichuserisCallingMe.value = data['callerId'];
  });

  socket.on('CALL_ACCEPTED', (data) {
    // Signaling verilerini dinleme
    log('Çağrı kabul edildi: $data');
  });

  socket.on('CALL_CLOSED', (data) {
    // Signaling verilerini dinleme
    log('Çağrı reddedildi: $data');
  });

  // Başka biri bağlandığında bildiri al
  socket.on('userConnected', (data) {
    if (data != null) {
      log(socketPREFIX + data.toString());
    }
    log(socketPREFIX + data.toString());
  });
  // Bağlantı başarılı olduğunda
  socket.on('connect', (data) {
    log('${socketPREFIX}Bağlandı');

    if (data != null) {
      log(socketPREFIX + data.toString());
    }
    socketChatStatus.value = true;

    // Kullanıcıyı kaydet
    registerUser(currentUserAccounts.value.user.value);
  });

  // Bağlantı kesildiğinde
  socket.on('disconnect', (data) {
    try {
      log('$socketPREFIX$data');
    } catch (e) {
      log('${socketPREFIX}Hata (disconnect): $e');
    }
    log('${socketPREFIX}Bağlantı kesildi');
    socketChatStatus.value = false;
  });

  // Sunucudan gelen mesajları dinleme
  socket.on('chat', (data) {
    ChatMessage chatData = ChatMessage.fromJson(data);

    log("$socketPREFIX${chatData.user.displayName} - ${chatData.messageContext}");

    ChatMessage chat = ChatMessage(
      messageID: 0,
      messageContext: chatData.messageContext,
      user: User(
        displayName: chatData.user.displayName,
        avatar: chatData.user.avatar,
      ),
      isMe: false,
    );

    Chat chatINFO = Chat(
      user: chatData.user,
      chatNotification: true.obs,
      lastmessage: chat.obs,
      messages: Rxn([chat]),
      chatType: APIChat.ozel,
    );

    triggerChatUpdated(chatINFO); // Güncellenmiş sohbeti tetikle
  });

  // Otomatik olarak bağlanma
  socket.connect();

  return this;
}