Okay. Thank you. Really appreciate what you guys are building. Sincerely, Robin
On Thu, Sep 21, 2017 at 1:10 AM, Andrew Godwin <[email protected]> wrote: > Yes, you can do as you suggest, but you're also right that it will be slow > to send. Groups are more efficient in theory, but right now their send > implementation is also a for loop (though it's a little bit tighter) so not > sure how drastic the difference will be. > > Andrew > > On Sun, Sep 17, 2017 at 10:15 PM, Robin Lery <[email protected]> wrote: > >> Thank you, Andrew. Also, after reading more about channels in SO >> <https://stackoverflow.com/questions/39322241/sending-a-message-to-a-single-user-using-django-channels> >> and channel's GitHub <https://github.com/django/channels/issues/175> and >> also here in Django-users group >> <https://groups.google.com/forum/#!topic/django-users/kNV8hEWWlyA>, it >> seems to create a group per user works as well. >> >> So, like the solution above how you told about adding the users to all >> the groups (threads) on connect: >> >> eg: >> def ws_connect(message): >> for thread in user.thread_set.all(): >> Group("thread-%d" %thread.id).add(message.reply_channel) >> >> >> Can I also do something like this - instead of adding the user to all >> threads group on connect, I will set per user per group, and then whenever >> a message is received, that thread will send to all the users in its user >> list using the user's group: >> >> eg: >> >> def send_msg(message): >> for user in self.user.all(): >> Group("%d" % user.id).send({ >> "text": json.dumps({ >> "foo": 'bar' >> }) >> }) >> >> >> Also to consider here is that suppose a thread has a large number of >> users (say, more than 20,000 users), will the above solution be unwise for >> this type of situation? >> >> Sincerely, >> Robin >> >> On Sun, Sep 17, 2017 at 11:22 PM, Andrew Godwin <[email protected]> >> wrote: >> >>> Hi Robin, >>> >>> The most efficient way to do this is to have one WebSocket connection >>> that all the messages are sent down. Have a Group per group-chat and per >>> single-user chat (I would model those as a special case of the group-chat >>> if I were you for simplicity), and when a user connects, add them to the >>> groups for all the chats they are in. Note that you will need to include >>> chat IDs in any messages you send down to the browsers via groups, and >>> de-tangle them using JavaScript to go to the right places. >>> >>> Note that you can add and remove a connection from groups in the middle >>> of the connection - just have something in the "websocket.message" handler >>> that does this. >>> >>> Also note that you'll need a separate send of endpoints that gets >>> historical chat messages before the WebSocket streaming begins, if that's a >>> desired feature. I'd recommend doing this slightly after the WebSocket is >>> established so you don't miss any messages that might get sent between >>> getting history and opening the socket - you'll risk getting the same >>> message twice, but giving each message an ID will let you de-duplicate on >>> the client side in that case. >>> >>> Channels is a piece of a solution for a full-featured chat, but you're >>> going to have to write a lot of additional logic around it. I have on my >>> backlog a proper event-sourcing solution that would solve many of these, >>> but I am focused on channels 2.0 first and the changes that will bring. >>> >>> Andrew >>> >>> On Sun, Sep 17, 2017 at 8:19 AM, Robin Lery <[email protected]> wrote: >>> >>>> I would like to make a chat application using django and channels. I >>>> have two models to achieve a chat like application. >>>> >>>> 1. >>>> >>>> Thread - A thread can have list of users. So, it can be used for >>>> chat between two users, or groups of user. If it's a group thread, it >>>> can >>>> have a subject for the group (eg. group name). >>>> 2. >>>> >>>> Message - A message is the actual message sent from one user >>>> (sender) to a thread. And any users of thread's user list will have >>>> access >>>> to it. >>>> >>>> class Thread(models.Model): >>>> subject = models.CharField(max_length=255, blank=True) >>>> user = models.ManyToManyField(User) >>>> class Message(models.Model): >>>> thread = models.ForeignKey(Thread) >>>> sender = models.ForeignKey(User) >>>> sent_datetime = models.DateTimeField(default=timezone.now) >>>> body = models.TextField() >>>> >>>> So, the chat app will have the basic features: >>>> >>>> 1. >>>> >>>> Chat with a single user >>>> >>>> When a user sends a message to a user, django will check if a >>>> thread with both sender and recipient exists as the users. If it exist, >>>> then create a new message with that existing thread as the foreign key. >>>> If >>>> it doesn't exits, create a new thread, and create a new message with >>>> newly >>>> created thread as its foreign key to the thread. >>>> 2. >>>> >>>> Chat with a group of users >>>> >>>> When a user creates a new group, a new thread will be created and >>>> that user will be added to the thread's user list. More users can be >>>> added >>>> to group later on. And any message sent will be available to all the >>>> users >>>> in the thread's user list. >>>> >>>> After reading the docs I am not sure how to actually layout the >>>> architecture for the websocket and routing of the channels. I have the >>>> following confusions: >>>> >>>> 1. >>>> >>>> From the docs on models >>>> <https://channels.readthedocs.io/en/stable/getting-started.html#models>, >>>> I will have to specify the room name in the url path, and on connect, >>>> the >>>> consumer will add the client (message.reply_channel) to that group of >>>> room >>>> (here thread), and then any messages sent will be broadcasted to all the >>>> users in the group. However, that is just for one room (thread). How can >>>> the user again chat with other threads (rooms). Will I have to make a >>>> new >>>> Websocket connection for each thread (room)?.. >>>> 2. >>>> >>>> This question is out of context of a chat app, but I need to know >>>> this to better understand how to make the architecture. In the docs, >>>> there's >>>> a section of live blogs >>>> <https://channels.readthedocs.io/en/stable/concepts.html#groups> >>>> where all the clients (message.reply_channel) are added to the >>>> "liveblog" >>>> group. However, in this scenario, we already know that we need to >>>> connect >>>> to "liveblog" groups. Suppose, there's a website where many authors >>>> write >>>> their blogs, and a user is subscribed to many authors (e.g.: "Adam", >>>> "Mary", "Robin", ...). And, if a author starts its blog, a connected >>>> user >>>> will get notified. >>>> >>>> So here, if the user connects to the websocket connection, on >>>> consumer, should we add the user to all blogs listed in his/her >>>> subscription list >>>> >>>> e.g: >>>> >>>> for sub in subscriptions: >>>> Group(sub).add(message.reply_channel) >>>> >>>> Or is there some better way to handle these kinds of architecture? I >>>> really like channels, and if anyone can help me understand and guide >>>> through these concepts I will really appreciate the help. >>>> >>>> >>>> Sincerely, >>>> >>>> Robin >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Django users" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> To post to this group, send email to [email protected]. >>>> Visit this group at https://groups.google.com/group/django-users. >>>> To view this discussion on the web visit https://groups.google.com/d/ms >>>> gid/django-users/CA%2B4-nGrMeAZGzmJAL95BsJAG5q%3D-NWw0_Yb-KN >>>> nyFNnV%2BCCz3w%40mail.gmail.com >>>> <https://groups.google.com/d/msgid/django-users/CA%2B4-nGrMeAZGzmJAL95BsJAG5q%3D-NWw0_Yb-KNnyFNnV%2BCCz3w%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>> . >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Django users" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> To post to this group, send email to [email protected]. >>> Visit this group at https://groups.google.com/group/django-users. >>> To view this discussion on the web visit https://groups.google.com/d/ms >>> gid/django-users/CAFwN1uqidqjrU3uFsUib_hBU7WUiTHyptp%3Ddu1fE >>> td-Nz_en7Q%40mail.gmail.com >>> <https://groups.google.com/d/msgid/django-users/CAFwN1uqidqjrU3uFsUib_hBU7WUiTHyptp%3Ddu1fEtd-Nz_en7Q%40mail.gmail.com?utm_medium=email&utm_source=footer> >>> . >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Django users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To post to this group, send email to [email protected]. >> Visit this group at https://groups.google.com/group/django-users. >> To view this discussion on the web visit https://groups.google.com/d/ms >> gid/django-users/CA%2B4-nGrZG93xTe%2B%2BY28-mbEJA3LGBKpXYXwD >> VWoamzJqVVL06g%40mail.gmail.com >> <https://groups.google.com/d/msgid/django-users/CA%2B4-nGrZG93xTe%2B%2BY28-mbEJA3LGBKpXYXwDVWoamzJqVVL06g%40mail.gmail.com?utm_medium=email&utm_source=footer> >> . >> >> For more options, visit https://groups.google.com/d/optout. >> > > -- > You received this message because you are subscribed to the Google Groups > "Django users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/django-users. > To view this discussion on the web visit https://groups.google.com/d/ > msgid/django-users/CAFwN1upwEZUnWw-uVnP5J1N%2BmpwAWc-prT1Dwe2aiJDkoUx7rA% > 40mail.gmail.com > <https://groups.google.com/d/msgid/django-users/CAFwN1upwEZUnWw-uVnP5J1N%2BmpwAWc-prT1Dwe2aiJDkoUx7rA%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CA%2B4-nGpa1%2Brc6P%2B3waNGKT7C5PRwABGnGU9qK5AtT22EpeUt3A%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.

