Store the last tab in a cookie so the server can use it for embedding state
This commit is contained in:
parent
4cad5a0b33
commit
8684e2dea2
8 changed files with 95 additions and 49 deletions
|
@ -29,6 +29,32 @@ type indexData struct {
|
|||
Messages *Messages `json:"messages,omitempty"`
|
||||
}
|
||||
|
||||
func (d *indexData) addUsersAndMessages(server, channel string, session *Session) {
|
||||
users := channelStore.GetUsers(server, channel)
|
||||
if len(users) > 0 {
|
||||
d.Users = &Userlist{
|
||||
Server: server,
|
||||
Channel: channel,
|
||||
Users: users,
|
||||
}
|
||||
}
|
||||
|
||||
messages, hasMore, err := session.user.GetLastMessages(server, channel, 50)
|
||||
if err == nil && len(messages) > 0 {
|
||||
m := Messages{
|
||||
Server: server,
|
||||
To: channel,
|
||||
Messages: messages,
|
||||
}
|
||||
|
||||
if hasMore {
|
||||
m.Next = messages[0].ID
|
||||
}
|
||||
|
||||
d.Messages = &m
|
||||
}
|
||||
}
|
||||
|
||||
func getIndexData(r *http.Request, session *Session) *indexData {
|
||||
servers := session.user.GetServers()
|
||||
connections := session.getConnectionStates()
|
||||
|
@ -60,30 +86,32 @@ func getIndexData(r *http.Request, session *Session) *indexData {
|
|||
|
||||
params := strings.Split(strings.Trim(r.URL.Path, "/"), "/")
|
||||
if len(params) == 2 && isChannel(params[1]) {
|
||||
users := channelStore.GetUsers(params[0], params[1])
|
||||
if len(users) > 0 {
|
||||
data.Users = &Userlist{
|
||||
Server: params[0],
|
||||
Channel: params[1],
|
||||
Users: users,
|
||||
data.addUsersAndMessages(params[0], params[1], session)
|
||||
} else {
|
||||
server, channel := parseTabCookie(r, r.URL.Path)
|
||||
if channel != "" {
|
||||
for _, ch := range channels {
|
||||
if server == ch.Server && channel == ch.Name {
|
||||
data.addUsersAndMessages(server, channel, session)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
messages, hasMore, err := session.user.GetLastMessages(params[0], params[1], 50)
|
||||
if err == nil && len(messages) > 0 {
|
||||
m := Messages{
|
||||
Server: params[0],
|
||||
To: params[1],
|
||||
Messages: messages,
|
||||
}
|
||||
|
||||
if hasMore {
|
||||
m.Next = messages[0].ID
|
||||
}
|
||||
|
||||
data.Messages = &m
|
||||
}
|
||||
}
|
||||
|
||||
return &data
|
||||
}
|
||||
|
||||
func parseTabCookie(r *http.Request, path string) (string, string) {
|
||||
if path == "/" {
|
||||
cookie, err := r.Cookie("tab")
|
||||
if err == nil {
|
||||
tab := strings.Split(cookie.Value, ":")
|
||||
|
||||
if len(tab) == 2 && isChannel(tab[1]) {
|
||||
return tab[0], tab[1]
|
||||
}
|
||||
}
|
||||
}
|
||||
return "", ""
|
||||
}
|
||||
|
|
|
@ -66,10 +66,13 @@ func (h *wsHandler) init(r *http.Request) {
|
|||
h.session.numWS(), "WebSocket connections")
|
||||
|
||||
channels := h.session.user.GetChannels()
|
||||
params := strings.Split(strings.Trim(r.URL.Query().Get("path"), "/"), "/")
|
||||
path := r.URL.Query().Get("path")
|
||||
params := strings.Split(strings.Trim(path, "/"), "/")
|
||||
tabServer, tabChannel := parseTabCookie(r, path)
|
||||
|
||||
for _, channel := range channels {
|
||||
if len(params) > 1 && channel.Server == params[0] && channel.Name == params[1] {
|
||||
if (len(params) == 2 && channel.Server == params[0] && channel.Name == params[1]) ||
|
||||
(channel.Server == tabServer && channel.Name == tabChannel) {
|
||||
continue
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue