-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathroom.go
105 lines (94 loc) · 2.48 KB
/
room.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package main
import (
"fmt"
"net/http"
"sync"
"time"
"github.com/google/uuid"
"github.com/gorilla/websocket"
)
type Room struct {
Name string
MessageLimit int
ID string
Messages []WSMessage
Connections map[*websocket.Conn]bool
Memory *sync.RWMutex
// Gateway *http.ServeMux
}
type EnhanchedRequest struct {
User *User
*http.Request
}
func NewRoom(name string, mLimit int) *Room {
uid := uuid.New().String()
mem := &sync.RWMutex{}
conns := make(map[*websocket.Conn]bool)
r := &Room{
Connections: conns,
Name: name,
MessageLimit: mLimit,
ID: uid,
// Gateway: http.NewServeMux(),
Memory: mem,
}
// r.Gateway.HandleFunc("/send-message", r.MessageHandler)
// r.Gateway.HandleFunc("/messages", r.PrintMessageHandler)
// r.Gateway.Handle("/room/", http.StripPrefix("/room", http.HandlerFunc(r.ChatView)))
// r.Gateway.Handle("/", http.HandlerFunc(r.ChatView))
return r
}
func (rm *Room) GetRoomStats() string {
var div = `<div class="content" id="roomstats">
%v
</div>`
var c int
rm.Memory.RLock()
defer rm.Memory.RUnlock()
for conn := range rm.Connections {
if conn != nil {
c++
}
}
out := `<strong>%v</strong>: %v users, %v messages`
out = fmt.Sprintf(out, rm.Name, c, len(rm.Messages))
div = fmt.Sprintf(div, out)
return div
}
func (rm *Room) AddMessage(msg WSMessage) {
rm.Memory.Lock()
defer rm.Memory.Unlock()
if len(rm.Messages) >= rm.MessageLimit {
rm.Messages = rm.Messages[1:]
}
rm.Messages = append(rm.Messages, msg)
}
func (rm *Room) GetMesssages() string {
out := `<div class="box has-background-black mydisplay" id="chat-box">
%v
</div>`
rm.Memory.RLock()
defer rm.Memory.RUnlock()
messages := ""
for _, msg := range rm.Messages {
t := msg.Time.Format(time.TimeOnly)
messages += fmt.Sprintf(`<div class="content has-background-black">
<span class="has-text-dark">(%v) </span> <a href="/user/%v">%v</a> <p class="has-text-primary">%v</p>
</div>`, t, msg.UserID, msg.Email, msg.Message)
}
if messages == "" {
messages = `<div class="content has-background-black"><em class="has-text-white">server bot:</em> <p class="has-text-primary">you're the first one here! (maybe)</p></div>`
}
out = fmt.Sprintf(out, messages)
return out
}
func (rm *Room) AddConnection(conn *WSHandler) {
rm.Memory.Lock()
defer rm.Memory.Unlock()
rm.Connections[conn.Conn] = true
}
func (rm *Room) ClearMessages() {
rm.Memory.Lock()
defer rm.Memory.Unlock()
rm.Messages = []WSMessage{}
}