1
0
Fork 0
mirror of https://github.com/FrankerFaceZ/FrankerFaceZ.git synced 2025-07-12 14:08:30 +00:00

Fix bunching commands and enable

This commit is contained in:
Kane York 2015-11-01 13:17:35 -08:00
parent 7c89ed98e3
commit f9323413aa
4 changed files with 43 additions and 16 deletions

View file

@ -61,11 +61,18 @@ func commandLineConsole() {
if val.Mallocs == 0 {
continue
}
shell.Print(fmt.Sprintf("%5d: %6d outstanding (%d total)\n", val.Size, val.Mallocs - val.Frees, val.Mallocs))
shell.Print(fmt.Sprintf("%5d: %6d outstanding (%d total)\n", val.Size, val.Mallocs-val.Frees, val.Mallocs))
}
shell.Println(m.NumGC, "collections occurred")
return "", nil
})
shell.Register("panic", func(args ...string) (string, error) {
go func() {
panic("requested panic")
}()
return "", nil
})
shell.Start()
}

View file

@ -320,9 +320,11 @@ type BunchedRequest struct {
Command Command
Param string
}
func BunchedRequestFromCM(msg *ClientMessage) BunchedRequest {
return BunchedRequest{Command: msg.Command, Param: msg.origArguments}
}
type BunchedResponse struct {
Response string
Timestamp time.Time
@ -337,17 +339,31 @@ type BunchSubscriberList struct {
Members []BunchSubscriber
}
var PendingBunchedRequests map[BunchedRequest]BunchSubscriberList = make(map[BunchedRequest]BunchSubscriberList)
var PendingBunchedRequests map[BunchedRequest]*BunchSubscriberList = make(map[BunchedRequest]*BunchSubscriberList)
var PendingBunchLock sync.RWMutex
var CompletedBunchedRequests map[BunchedRequest]BunchedResponse
var CompletedBunchedRequests map[BunchedRequest]BunchedResponse = make(map[BunchedRequest]BunchedResponse)
var CompletedBunchLock sync.RWMutex
func bunchingJanitor() {
for {
time.Sleep(5 * time.Minute)
keepIfAfter := time.Now().Add(-5 * time.Minute)
CompletedBunchLock.Lock()
for req, resp := range CompletedBunchedRequests {
if !resp.Timestamp.After(keepIfAfter) {
delete(CompletedBunchedRequests, req)
}
}
CompletedBunchLock.Unlock()
}
}
func HandleBunchedRemotecommand(conn *websocket.Conn, client *ClientInfo, msg ClientMessage) (rmsg ClientMessage, err error) {
br := BunchedRequestFromCM(&msg)
CompletedBunchLock.RLock()
resp, ok := CompletedBunchedRequests[br]
if ok && !resp.Timestamp.After(time.Now().Add(5 * time.Minute)) {
if ok && resp.Timestamp.After(time.Now().Add(-5*time.Minute)) {
CompletedBunchLock.RUnlock()
return SuccessMessageFromString(resp.Response), nil
} else if ok {
@ -357,7 +373,7 @@ func HandleBunchedRemotecommand(conn *websocket.Conn, client *ClientInfo, msg Cl
CompletedBunchLock.Lock()
// recheck condition
resp, ok = CompletedBunchedRequests[br]
if ok && resp.Timestamp.After(time.Now().Add(5 * time.Minute)) {
if ok && !resp.Timestamp.After(time.Now().Add(-5*time.Minute)) {
delete(CompletedBunchedRequests, br)
}
CompletedBunchLock.Unlock()
@ -390,7 +406,7 @@ func HandleBunchedRemotecommand(conn *websocket.Conn, client *ClientInfo, msg Cl
PendingBunchLock.Unlock()
return ClientMessage{Command: AsyncResponseCommand}, nil
} else {
PendingBunchedRequests[br] = BunchSubscriberList{Members: []BunchSubscriber{{Client: client, MessageID: msg.MessageID}}}
PendingBunchedRequests[br] = &BunchSubscriberList{Members: []BunchSubscriber{{Client: client, MessageID: msg.MessageID}}}
needToStart = true
PendingBunchLock.Unlock()
}
@ -402,7 +418,7 @@ func HandleBunchedRemotecommand(conn *websocket.Conn, client *ClientInfo, msg Cl
PendingBunchLock.Lock() // Prevent new signups
var msg ClientMessage
if err != nil {
if err == nil {
CompletedBunchLock.Lock() // mutex on map
CompletedBunchedRequests[request] = BunchedResponse{Response: resp, Timestamp: time.Now()}
CompletedBunchLock.Unlock()

View file

@ -36,8 +36,8 @@ var CommandHandlers = map[Command]CommandHandler{
"survey": HandleSurvey,
"twitch_emote": HandleRemoteCommand,
"get_link": HandleRemoteCommand,
"get_display_name": HandleRemoteCommand,
"get_link": HandleBunchedRemotecommand,
"get_display_name": HandleBunchedRemotecommand,
"update_follow_buttons": HandleRemoteCommand,
"chat_history": HandleRemoteCommand,
}
@ -151,6 +151,7 @@ func HandleSocketConnection(conn *websocket.Conn) {
var client ClientInfo
client.MessageChannel = _serverMessageChan
client.RemoteAddr = conn.RemoteAddr()
// Launch receiver goroutine
go func(errorChan chan<- error, clientChan chan<- ClientMessage, stoppedChan <-chan struct{}) {
@ -232,7 +233,7 @@ RunLoop:
case smsg := <-serverMessageChan:
SendMessage(conn, smsg)
case <- time.After(1 * time.Minute):
case <-time.After(1 * time.Minute):
client.pingCount++
if client.pingCount == 5 {
CloseConnection(conn, &CloseTimedOut)

View file

@ -3,6 +3,7 @@ package server
import (
"encoding/json"
"github.com/satori/go.uuid"
"net"
"sync"
"time"
)
@ -68,6 +69,8 @@ type ClientInfo struct {
// TODO(riking) - does this need to be protected cross-thread?
AuthInfo
RemoteAddr net.Addr
// Username validation nonce.
ValidationNonce string