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-
>> KNnyFNnV%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/
> msgid/django-users/CAFwN1uqidqjrU3uFsUib_hBU7WUiTHyptp%3Ddu1fEtd-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/msgid/django-users/CA%2B4-nGrZG93xTe%2B%2BY28-mbEJA3LGBKpXYXwDVWoamzJqVVL06g%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to