Send the 25 last messages for each channel to the client on load

This commit is contained in:
Ken-Håvard Lieng 2017-04-20 01:51:55 +02:00
parent c840d51e16
commit eedc687f18
26 changed files with 300 additions and 268 deletions

View file

@ -26,7 +26,7 @@ type indexData struct {
Users *Userlist `json:"users,omitempty"`
// Last messages in the selected channel
Messages []storage.Message `json:"messages,omitempty"`
Messages *Messages `json:"messages,omitempty"`
}
func getIndexData(r *http.Request, session *Session) *indexData {
@ -68,6 +68,15 @@ func getIndexData(r *http.Request, session *Session) *indexData {
Users: users,
}
}
messages, err := session.user.GetLastMessages(params[0], params[1], 25)
if err == nil && len(messages) > 0 {
data.Messages = &Messages{
Server: params[0],
To: params[1],
Messages: messages,
}
}
}
return &data

View file

@ -67,6 +67,12 @@ type Message struct {
Content string `json:"content"`
}
type Messages struct {
Server string `json:"server"`
To string `json:"to"`
Messages []storage.Message `json:"messages"`
}
type Topic struct {
Server string `json:"server"`
Channel string `json:"channel"`

View file

@ -119,7 +119,7 @@ func upgradeWS(w http.ResponseWriter, r *http.Request, session *Session) {
return
}
newWSHandler(conn, session).run()
newWSHandler(conn, session, r).run()
}
func createHTTPSRedirect(portHTTPS string) http.HandlerFunc {

View file

@ -5,6 +5,8 @@ import (
"encoding/json"
"log"
"net"
"net/http"
"strings"
"github.com/gorilla/websocket"
"github.com/spf13/viper"
@ -20,13 +22,13 @@ type wsHandler struct {
handlers map[string]func([]byte)
}
func newWSHandler(conn *websocket.Conn, session *Session) *wsHandler {
func newWSHandler(conn *websocket.Conn, session *Session, r *http.Request) *wsHandler {
h := &wsHandler{
ws: newWSConn(conn),
session: session,
addr: conn.RemoteAddr().String(),
}
h.init()
h.init(r)
h.initHandlers()
return h
}
@ -55,7 +57,7 @@ func (h *wsHandler) dispatchRequest(req WSRequest) {
}
}
func (h *wsHandler) init() {
func (h *wsHandler) init(r *http.Request) {
h.session.setWS(h.addr, h.ws)
log.Println(h.addr, "[Session] User ID:", h.session.user.ID, "|",
@ -63,13 +65,27 @@ func (h *wsHandler) init() {
h.session.numWS(), "WebSocket connections")
channels := h.session.user.GetChannels()
params := strings.Split(strings.Trim(r.URL.Query().Get("path"), "/"), "/")
for _, channel := range channels {
if len(params) > 1 && channel.Server == params[0] && channel.Name == params[1] {
continue
}
h.session.sendJSON("users", Userlist{
Server: channel.Server,
Channel: channel.Name,
Users: channelStore.GetUsers(channel.Server, channel.Name),
})
messages, err := h.session.user.GetLastMessages(channel.Server, channel.Name, 25)
if err == nil && len(messages) > 0 {
h.session.sendJSON("messages", Messages{
Server: channel.Server,
To: channel.Name,
Messages: messages,
})
}
}
}