dispatch/server/index_data.go

182 lines
3.4 KiB
Go
Raw Permalink Normal View History

package server
import (
"net/http"
"net/url"
"strings"
2018-12-11 09:51:20 +00:00
"github.com/khlieng/dispatch/config"
"github.com/khlieng/dispatch/storage"
2018-11-22 11:00:18 +00:00
"github.com/khlieng/dispatch/version"
)
type connectDefaults struct {
*config.Defaults
2020-05-23 06:05:37 +00:00
ServerPassword bool
}
2018-11-22 11:00:18 +00:00
type dispatchVersion struct {
Tag string
Commit string
Date string
}
type indexData struct {
Defaults connectDefaults
2020-06-15 08:58:51 +00:00
Networks []*storage.Network
Channels []*storage.Channel
OpenDMs []storage.Tab
HexIP bool
2018-11-22 11:00:18 +00:00
Version dispatchVersion
2018-10-15 06:56:17 +00:00
Settings *storage.ClientSettings
// Users in the selected channel
Users *Userlist
// Last messages in the selected channel
Messages *Messages
}
func (d *Dispatch) getIndexData(r *http.Request, state *State) *indexData {
2018-12-11 09:51:20 +00:00
cfg := d.Config()
data := indexData{
2020-06-15 08:58:51 +00:00
Defaults: connectDefaults{
Defaults: &cfg.Defaults,
ServerPassword: cfg.Defaults.ServerPassword != "",
},
HexIP: cfg.HexIP,
2018-11-22 11:00:18 +00:00
Version: dispatchVersion{
Tag: version.Tag,
Commit: version.Commit,
Date: version.Date,
},
}
if state == nil {
data.Settings = storage.DefaultClientSettings()
return &data
}
2020-06-15 08:58:51 +00:00
data.Settings = state.user.ClientSettings()
2019-01-27 07:53:07 +00:00
2020-06-15 08:58:51 +00:00
state.lock.Lock()
for _, network := range state.networks {
network = network.Copy()
network.Password = ""
network.Username = ""
network.Realname = ""
2020-06-15 08:58:51 +00:00
data.Networks = append(data.Networks, network)
data.Channels = append(data.Channels, network.Channels()...)
}
2020-06-15 08:58:51 +00:00
state.lock.Unlock()
2020-06-15 08:58:51 +00:00
openDMs, err := state.user.OpenDMs()
if err == nil {
data.OpenDMs = openDMs
}
tab, err := tabFromRequest(r)
2020-06-15 08:58:51 +00:00
if err == nil && hasTab(data.Channels, openDMs, tab.Network, tab.Name) {
data.addUsersAndMessages(tab.Network, tab.Name, state)
}
return &data
}
2020-06-15 08:58:51 +00:00
func (d *indexData) addUsersAndMessages(network, name string, state *State) {
if i, ok := state.client(network); ok && isChannel(name) {
if users := i.ChannelUsers(name); len(users) > 0 {
d.Users = &Userlist{
2020-06-15 08:58:51 +00:00
Network: network,
Channel: name,
Users: users,
}
}
}
2020-06-15 08:58:51 +00:00
messages, hasMore, err := state.user.LastMessages(network, name, 50)
if err == nil && len(messages) > 0 {
m := Messages{
2020-06-15 08:58:51 +00:00
Network: network,
To: name,
Messages: messages,
}
if hasMore {
m.Next = messages[0].ID
}
d.Messages = &m
}
}
2020-06-15 08:58:51 +00:00
func hasTab(channels []*storage.Channel, openDMs []storage.Tab, network, name string) bool {
if name != "" {
for _, ch := range channels {
2020-06-15 08:58:51 +00:00
if network == ch.Network && name == ch.Name {
return true
}
}
for _, tab := range openDMs {
2020-06-15 08:58:51 +00:00
if network == tab.Network && name == tab.Name {
return true
}
}
}
return false
}
2017-05-02 21:21:25 +00:00
func tabFromRequest(r *http.Request) (Tab, error) {
tab := Tab{}
var path string
if strings.HasPrefix(r.URL.Path, "/ws") {
path = r.URL.EscapedPath()[3:]
} else {
referer, err := url.Parse(r.Referer())
if err != nil {
return tab, err
}
path = referer.EscapedPath()
}
if path == "/" {
cookie, err := r.Cookie("tab")
if err != nil {
return tab, err
}
v, err := url.PathUnescape(cookie.Value)
if err != nil {
return tab, err
}
2017-05-02 21:21:25 +00:00
parts := strings.SplitN(v, ";", 2)
if len(parts) == 2 {
2020-06-15 08:58:51 +00:00
tab.Network = parts[0]
tab.Name = parts[1]
}
} else {
parts := strings.Split(strings.Trim(path, "/"), "/")
if len(parts) > 0 && len(parts) < 3 {
if len(parts) == 2 {
name, err := url.PathUnescape(parts[1])
if err != nil {
return tab, err
2017-06-21 07:45:47 +00:00
}
tab.Name = name
}
2020-06-15 08:58:51 +00:00
tab.Network = parts[0]
}
}
return tab, nil
}