Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [ASP - AJAX] Chat di supporto con operatore

    Ciao. Sto creando una chat di supporto agli utenti, usando ASP e javascript (AJAX).
    Vorrei avere un parere su come l'ho strutturata e consigli su come fare di meglio. Posto in questo forum perchè mi sembra che sia più una problematica lato server (altrimento prego gli admin di spostarlo nella sezione corretta, grazie).

    Premessa.
    Per ora la chat limita il dialogo tra un solo operatore, con un solo utente. Se l'operatore sta parlando con uno, nessun altor utente potrà fare richiesta di supporto online.

    Ci sono due variabili di applicazione a fondamento di tutto:
    - status: indica se l'operatore è disponibile a rispondere in chat
    - logged: indica se l'utente è loggato

    Vado per punti:

    - Accesso lato USER:
    Si visualizza un link "PARLA CON NOI" se l'operatore è online o se non sta già parlando con un altro utente; un link "CONTATTACI" se non è loggato o se è occupato.

    Implementazione:
    Per ora l'ho implementato usando un javascript che ogni tot secondi carica con l'XMLHttpRequest di AJAX una pagina asp: questa restituisce allo script il valore di status e, a seconda di questo, abilita o meno l'entrata in chat.
    Se l'admin è loggato, l'utente entra nella chat e si logga (setta logged = true).

    - Accesso lato ADMIN:
    Quando un utente entra in chat, nella pagina admin compare un avviso di richiesta conversazione (con tanto di segnale sonoro) . L'operatore clicca sul link e si apre la chat.

    Implementazione:
    Se l'admin non è loggato, status = "occupato". Appena si logga, status = "libero".
    Anche qui è neccessario un "polling", una continua chiamata ogni tot secondi (2? 5?) tramite AJAX a una pagina che restituisce il valore di logged. Appena la variabile è true, manda l'avviso all'admin.
    Quando l'admin accetta la conversazione con un utente, un javascript richiama in background la solita pagina asp che setta status = "occupato": gli altri utenti non possono più entrare. Inoltre resetta a false il valore di logged.

    - La chat vera e propria:
    All'apertura della chat, con AJAX chiamo un file asp, il quale:
    1) crea un file xml (o sovrascrive uno già esistente), se è la prima volta che viene richiamato (quando l'utente è appena entrato);
    2) apre il file xml stesso con XMLHTTP di ASP
    3) lo stampa in output
    Richiamando questo file asp, dunque, ottengo un file xml che viene "parsato" da js e stampato e formattato in un div con scrollbars.
    Cosa contiene questo file xml? Inizialmente niente.
    Però, quando l'utente scrive un testo e lo invia, javascript richiama ancora questa pagina asp, questa volta passandogli tale testo. Mediante XMLDOM di ASP, creo i vari nodi (nome, ora, testo...) e li salvo nel file xml. Quindi ripete i passi 2 e 3. Il file viene così ricaricato (il bello è che non ricarica mai la pagina!) e il testo della chat aggiornato.
    Inoltre, ogni due secondi, javascript ricarica il file xml.

    - Uscita dalla chat lato USER:
    Grazie all'intercettazione dell'evento onUnload, appena l'utente chiude la popup con la chat, viene inviato il testo "/quit" (come se l'avesse scritto l'utente), in modo che all'admin compaia la notifica che l'user ha abbandonato la conversazione. 500 ms dopo, fa un redirect ad una pagina asp che esegue il logout. Tutto ciò (incredibilmente) riesce ad avvenire prima che la finestra venga effettivamente chiusa e l'user non se ne accorge proprio.

    - Uscita lato ADMIN:
    Quando l'admin chiude la sua finestra (presumibilmente dopo che gli è stato notificato che l'user è uscito), al verificarsi dell'evento onUnload, viene caricata con AJAX una pagina che setta lo status su "libero", in modo che l'admin potrà nuovamente essere contattato.

    Questo è tutto il funzionamento. Ecco i problemi.
    Sembrerebbe funzionare tutto, ma, dopo un po' di volte che la pagina di admin verifica la variabile logged, si blocca e non notifica più niente. La stessa cosa accade alla pagina di accesso PARLA/CONTATTACI. Evidentemente il problema starà nel fatto che, continuando a richiamare una pagina asp, il server si impalla e mi manda a quel paese. Per quanto riguarda il continuo caricamento del file xml, sembra non avere di questi problemi, ma devo ancora finire di testarlo: magari dopo un po' di tempo si impalla anche lui.
    L'altro problema fondamentale sta nel fatto che sembra che FireFox non rilevi l'evento onUnload e così mi si incasina tutto, perchè le variabili non vengono resettate! Così quando un utente esce e l'admin chiude la finestra, il suo stato rimane occupato.

    In genere nelle chat come si risolvono questi problemi? In particolare quello dell'aggiornamento del testo?
    Se avete consigli, suggerimenti, critiche... sono più che ben accetti!
    Grazie a tutti (soprattutto quelli che hanno avuto la pazienza di leggersi tutto sto malloppone!) :quote:

  2. #2
    proprio un pippone


    Questo è tutto il funzionamento. Ecco i problemi.
    Sembrerebbe funzionare tutto, ma, dopo un po' di volte che la pagina di admin verifica la variabile logged, si blocca e non notifica più niente. La stessa cosa accade alla pagina di accesso PARLA/CONTATTACI. Evidentemente il problema starà nel fatto che, continuando a richiamare una pagina asp, il server si impalla e mi manda a quel paese. Per quanto riguarda il continuo caricamento del file xml, sembra non avere di questi problemi, ma devo ancora finire di testarlo: magari dopo un po' di tempo si impalla anche lui.
    L'altro problema fondamentale sta nel fatto che sembra che FireFox non rilevi l'evento onUnload e così mi si incasina tutto, perchè le variabili non vengono resettate! Così quando un utente esce e l'admin chiude la finestra, il suo stato rimane occupato.
    ma alla pagina di admin che gli frega della variabile logged? ogni 5 secondi (ma anche 10) controlla da un database se l'utente tal de tali ha chiesto l'accesso, se si rediretta sulla chat no? potresti anche evitare di far leggere da un db e creare XML statici sul server che vengono aggiornati ogni volta che l'utente o l'admin cambia lo stato delle cose (o addirittura usare variabili application visto che sono condivise tra tutti gli user)

    per l'onUnload chiedi ai javascriptisti

    per firefox, scaricati estensioni per controllare lo stato delle richieste ajax, magari hai qualche errore di javascrip e non te ne accorgi


    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    Di solito le chat usano applet JAVA le quali sono in grado di mantenere lo stato tra client e server.
    Secondo me potresti provare a togliere la costruzione del file xml e a restituire una pagina già formattata con semplice html, così non hai bisogno di usare l'oggetto XMLDOM sul server e nemmeno sul client.
    Per l'onunload, io preferirei fare così: lato server, se per quella sessione di chat per i prossimi 30 secondi (ad esempio) non arrivano richieste XMLHttpRequest, allora la chat s'intende terminata.
    In pratica ad ogni chiamata aggiorni un valore data/ora.

  4. #4
    Originariamente inviato da Santino83_02
    ma alla pagina di admin che gli frega della variabile logged? ogni 5 secondi (ma anche 10) controlla da un database se l'utente tal de tali ha chiesto l'accesso, se si rediretta sulla chat no?
    Quindi l'idea sarebbe quella di tenere nel database un campo con un valore true/false, al posto di una variabile di applicazione? Ma così non sarebbe ancora peggio? Cioè... il js deve comunque caricare la pagina asp e questa, invece che restituire il valore di una variabile, deve fare una query al database. Non è più dispendioso e lento?

    potresti anche evitare di far leggere da un db e creare XML statici sul server che vengono aggiornati ogni volta che l'utente o l'admin cambia lo stato delle cose (o addirittura usare variabili application visto che sono condivise tra tutti gli user)
    Originariamente inviato da Mems
    Secondo me potresti provare a togliere la costruzione del file xml e a restituire una pagina già formattata con semplice html, così non hai bisogno di usare l'oggetto XMLDOM sul server e nemmeno sul client.
    Uhm, in effetti forse il file xml è abbastanza inutile... quindi creo e modifico un semplice file di testo col FileSystemObject? E se invece mettessi tutti i testi in variabili application? Si incasinerebbe il server o può essere una buona soluzione?

    per firefox, scaricati estensioni per controllare lo stato delle richieste ajax, magari hai qualche errore di javascrip e non te ne accorgi
    Qualche errore js? Bè, su IE va però... Secondo me FF rileva l'evento di onUnload, ma, mentre IE riesce a fare tutte le operazioni prima che la finestra si chiuda, FireFox non fa in tempo...

    Per l'onunload, io preferirei fare così: lato server, se per quella sessione di chat per i prossimi 30 secondi (ad esempio) non arrivano richieste XMLHttpRequest, allora la chat s'intende terminata.
    In pratica ad ogni chiamata aggiorni un valore data/ora.
    Uhm... quindi bastarebbe mettere un Session.Timeout = 30s all'user? Oppure ogni volta che scrive salvo l'ora nella session e ad ogni caricamento della chat la confronto con l'ora attuale?

    Che casino fare una chat in ASP! In effetti sarebbe stato meglio farla in Java, però non ho idea di come creare connessioni o cose del genere... boh.. (non ho ancora studiato java applicato al web, niente applet per ora)

    Grazie mille a entrambi per le risposte! Se qualcuno ha ancora qualche idea... se no inizierò a modificarla seguendo i vostri consigli (sicuramente via xml!).


    P.S.: certo che scrivo dei post interminabili

  5. #5
    Usa una variabile application per memorizzare l'array delle discussioni.
    Fai un array a 3 dimensioni dove salvi, id oppure nome utente, testo del messaggio, data ed ora del messaggio.
    Meglio l'application che il file di testo con file system object.
    Poi fai un'altra application con la data di lock dell'ultimo messaggio e imposti un tempo massimo oltre il quale la chat viene ritenuta ultimata, ad esempio 1 minuti.
    Ad ogni refresh della chat, ovvero ad ogni chiamata con XMLHttpRequest, sia da parte dell'utente che da parte di chi da il supporto, aggiorni la data nella variabile application.
    Spero di non essere stato troppo complesso.

  6. #6
    No, chiarissimo. Ti ringazio. Proverò così e vediamo se il server mi dà ancora problemi (ammesso fosse lui a incasinarsi e non javascript!).
    Morale: no xml, no file, no db... solo application!

  7. #7
    Originariamente inviato da Mems
    Usa una variabile application per memorizzare l'array delle discussioni.
    Fai un array a 3 dimensioni dove salvi, id oppure nome utente, testo del messaggio, data ed ora del messaggio.
    Un array tridimensionale? Non basta a 2 dimensioni? Una cosa come:
    codice:
    arr[0] = {user0, msg0, ora0}
    arr[1] = {user1, msg1, ora1}
    arr[2] = {user2, msg2, ora2}
    ....
    Però c'è un problema... Quando dichiaro l'array devo dare la sua lunghezza... Io non so ovviamente quanti messaggi conterrà! Devo usare il trucco di impostarlo di lunghezza molto grande? tipo arr[1000]? O si può usare un redim o cose del genere?

  8. #8
    redim preserve NomeArray(novoIndice)

  9. #9
    Quel "preserve" non lo conoscevo! Quindi ogni volta che viene mandato un testo, devo aumentare di uno l'array?

    Una cosa così?

    codice:
    dim length
    if isEmpty(application("msg")) then  
         dim arrMsg(1)   
         arrMsg(0) = array(utente, msg, ora)
         application("msg") = arrMsg
    else
         arrMsg = application("msg")
         length = UBound(application("msg"))
         redim preserve arrMsg(length + 1)
         arrMsg(length) = array(utente, msg, ora)
         application("msg") = arrMsg
    end if
    Ma se dichiaro l'array nella prima parte dell'if, quel "dim" vale anche per il secondo blocco dell'else o mi dirà che arrMsg non è dichiarato? (Uff... non mi ricordo se lo scope di una variabile è come in Java...)

  10. #10
    Il dim lo metti fuori dall'IF

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.