2015-11-05 12 views
12

Na mojej stronie głównej mam listę użytkowników i chciałbym wybrać i otworzyć kanał, aby porozmawiać z jednym z nich.Najlepszy sposób na zarządzanie kanałami czatu w Firebase

Zastanawiam się, czy użycie identyfikatora jest najlepszym sposobem kontrolowania dostępu do kanału takiego jak USERID1-USERID2.

Ale oczywiście użytkownik 2 może otworzyć ten sam kanał, więc chciałbym znaleźć coś łatwiejszego do kontrolowania.

Proszę, jeśli chcesz mi pomóc, daj mi przykład w javascript używając adresu/tablicy firebase.

Dziękujemy!

Odpowiedz

30

Typowym sposobem obsługi takich pokojów rozmów jest generowanie adresu URL pomieszczenia na podstawie identyfikatorów użytkowników. Jak już wspomniałeś, problem polega na tym, że albo użytkownik może zainicjować czat, aw obu przypadkach powinien skończyć w tym samym pokoju.

Możesz rozwiązać ten problem, zamawiając kody identyfikacyjne użytkowników leksykograficznie w kluczu złożonym. Na przykład z nazwami użytkowników, zamiast identyfikatorów:

var user1 = "Frank"; 
 
var user2 = "Eusthace"; 
 

 
var roomName = 'chat_'+(user1<user2 ? user1+'_'+user2 : user2+'_'+user1); 
 

 
console.log(user1+', '+user2+' => '+ roomName); 
 
      
 
user1 = "Eusthace"; 
 
user2 = "Frank"; 
 

 
var roomName = 'chat_'+(user1<user2 ? user1+'_'+user2 : user2+'_'+user1); 
 

 
console.log(user1+', '+user2+' => '+ roomName);
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

wspólnej pytania follow-up wydaje się być jak pokazać listę czatów dla bieżącego użytkownika. Powyższy kod nie uwzględnia tego. Jak to często bywa w bazach danych NoSQL, musisz rozszerzyć swój model danych, aby umożliwić korzystanie z tego przypadku. Jeśli chcesz wyświetlić listę pokojów rozmów dla bieżącego użytkownika, powinieneś modelować dane, aby to umożliwić. Najprostszym sposobem na to jest dodanie listy czatów dla każdego użytkownika do modelu danych:

"userChatrooms" : { 
    "Frank" : { 
    "Eusthace_Frank": true 
    }, 
    "Eusthace" : { 
    "Eusthace_Frank": true 
    } 
} 
+1

Wiem, że jest stary, ale po prostu szukał pomysłów. Możesz uczynić to elastycznym, umieszczając użytkowników w tablicy i sortując je. Następnie, po prostu dla łatwości użycia i aby uniemożliwić innym odgadywanie nazw pokoju, po prostu wytnij z niego MD5 lub w jakiś sposób go skopiuj. W ten sposób możesz zwiększyć liczbę użytkowników w pokoju. Używam tego przez jakiś czas i jest całkiem niezły. – Eduard

+0

Dziękuję za twoje punkty. Hashing z modułem js-sha256 działał dla mnie. 'let chatHash = SHA256 (' agent: '+ agentId +' _user: '+ userId)' –

+0

To jest doskonała odpowiedź, dziękuję. Ale zastanawiam się, jak się upewnić, że nazwa tego pokoju rozmów jest wyjątkowa. Zwłaszcza w przypadku bardziej popularnych nazw. Nawet jeśli przechowuję czat w węźle dla obu użytkowników, mógłbym porozmawiać z 2 Frankami. Teraz myślę o używaniu klawisza FB do czatu, zapisując go w każdym z użytkowników/rozmowach, które ma z użytkownikiem: recipientUid, a następnie, gdy jeden z użytkowników zainicjuje czat, po prostu sprawdzając, czy jeszcze nie jest. istnieje z drugim użytkownikiem. Wygląda jednak na to, że nie jest to najlepszy projekt. jakieś pomysły? Dzięki! –

1

Wymieszanie z modułem js-SHA256 pracował dla mnie z kierunkami Frank van Puffelen Eduard.

import SHA256 from 'crypto-js/sha256' 
let agentId = 312 
let userId = 567 
let chatHash = SHA256('agent:' + agentId + '_user:' + userId) 
+0

Czy możesz podać więcej informacji na temat tego, jak to robisz? Próbowałem różnych rzeczy i nie potrafiłem tego objąć. – texas697

+0

Głównym punktem tutaj jest utworzenie łańcucha nadawcy i odbiorcy z identyfikatorami ids. Tak więc w moim przykładzie tworzymy ciąg jako: "agent: 142_użytkownik: 5346", co oznacza, że ​​identyfikator agenta to 142, a identyfikator użytkownika to 5346. Możesz również użyć dwóch użytkowników w łańcuchu typu "user: 123_user: 312". Następnie, aby utrudnić czytanie, używamy algorytmu mieszania. I konwertuje coś takiego jak "e769925f0d2068d6280e3a61b6". Używam tutaj SHA256, ale możesz użyć innego algorytmu, takiego jak MD5, itd. –

1

W typowym schemacie bazy danych każdy kanał/grupa czatu ma własny węzeł z unikalnym kluczem $ (utworzonym przez Firebase). Nie powinno mieć znaczenia, który użytkownik otworzył kanał pierwszy, ale po utworzeniu węzła (& odpowiadający kluczowi $) można go użyć jako identyfikatora kanału.

Strategia Hashing/MD5 oczywiście jest inna, ale musisz również zapisać informacje o "trasie", a także klucz $ w tym samym węźle - czyli IMO (chyba że Im coś pominąłem).

+0

Sądzę, że robią to, aby zachować informacje, które użytkownik rozpoczął na czacie. –

+1

To prawda, że ​​tworzysz hash, który sortujesz nazwy użytkownika, więc ostatecznie nie wiesz, kto rozpoczął ten kanał. Jeśli naprawdę potrzebujesz tych informacji, możesz po prostu utworzyć własność pod swoim kanałem-węzłem-czatem. Zazwyczaj, jeśli kanał ma wielu użytkowników, powinieneś uczynić kogoś "administratorem" tego kanału i dać kilka specjalnych "mocy", ale tak, zależy to od potrzeb Twojej aplikacji. –

Powiązane problemy