Page MenuHomePhorge

D363.1774890380.diff
No OneTemporary

Authored By
Unknown
Size
3 KB
Referenced Files
None
Subscribers
None

D363.1774890380.diff

diff --git a/web/channels/system_channel.ex b/web/channels/system_channel.ex
--- a/web/channels/system_channel.ex
+++ b/web/channels/system_channel.ex
@@ -3,34 +3,29 @@
alias KolabChat.Presence
- def join("system", _, socket) do
- Process.flag(:trap_exit, true)
- :timer.send_interval(10000, :ping)
+ def join("system", %{"context" => context}, socket) do
+ socket = assign(socket, :context, context)
send self(), :after_join
{:ok, socket}
end
def handle_info(:after_join, socket) do
- Presence.track(socket, socket.assigns.user.username, %{
- status: "online"
- })
-
- push socket, "info", %{user: socket.assigns.user.username}
push socket, "presence_state", Presence.list(socket)
+ push socket, "info", %{user: socket.assigns.user.username}
- {:noreply, socket}
- end
-
- def handle_info(:ping, socket) do
- push socket, "new:msg", %{user: "SYSTEM", body: "ping"}
+ Presence.track(socket, socket.assigns.user.username, %{
+ status: "online",
+ context: socket.assigns.context
+ })
{:noreply, socket}
end
def handle_in("set-status", %{"status" => status}, socket) do
{:ok, _} = Presence.update(socket, socket.assigns.user.username, %{
- status: status
+ status: status,
+ context: socket.assigns.context
})
{:noreply, socket}
diff --git a/web/static/js/api.js b/web/static/js/api.js
--- a/web/static/js/api.js
+++ b/web/static/js/api.js
@@ -10,6 +10,7 @@
/**
* Configuration parameters:
* - token: User session token
+ * - context: KolabChat instance identifier
* - roomId: Chat room Id to join in
* - userListElement: Id of HTML element where to put userslist widget
* - userStatusElement: Id of HTML element where to put users status widget
@@ -19,6 +20,9 @@
constructor(config)
{
this.config = config || {}
+
+ if (!this.config.context)
+ this.config.context = location.hostname;
}
/**
@@ -34,7 +38,7 @@
// TODO: for integration with external systems we'll use configurable full wss:// url
this.socket = new Socket("/socket", {
- params: {token: this.config.token},
+ params: {token: this.config.token, context: this.config.context},
logger: ((kind, msg, data) => { console.log(`${kind}: ${msg}`, data) }),
})
@@ -91,7 +95,7 @@
*/
initPresence()
{
- this.system = this.socket.channel("system")
+ this.system = this.socket.channel("system", {context: this.config.context})
this.system.on("info", info => {
this.username = info.user
@@ -146,7 +150,7 @@
let userPresence
if (this.userStatusWidget && (userPresence = presences[this.username])) {
- userPresence = this.listBy(this.username, userPresence)
+ userPresence = this.listBy(this.username, userPresence, this.config.context)
this.userStatusWidget.render(userPresence)
}
@@ -156,11 +160,27 @@
}
}
- listBy(user, {metas: metas})
+ listBy(user, {metas: metas}, context)
{
+ let statusWeights = {
+ offline: 0,
+ busy: 10,
+ away: 20,
+ online: 30
+ }
+
+ // Find "best" availability status for the user
+ // If set, narrow the result to the current session context
+ let mostAvailableStatus = metas.reduce((best, meta) => {
+ if (context && context != meta.context)
+ return best
+ return statusWeights[best] > statusWeights[meta.status] ? best : meta.status
+ },
+ "offline")
+
return {
user: user,
- status: metas[0].status
+ status: mostAvailableStatus
}
}

File Metadata

Mime Type
text/plain
Expires
Mon, Mar 30, 5:06 PM (3 d, 19 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18817824
Default Alt Text
D363.1774890380.diff (3 KB)

Event Timeline