mirror of
https://github.com/FrankerFaceZ/FrankerFaceZ.git
synced 2025-06-27 21:05:53 +00:00
135 lines
3.8 KiB
Go
135 lines
3.8 KiB
Go
|
package server
|
||
|
|
||
|
import (
|
||
|
"golang.org/x/net/websocket"
|
||
|
"github.com/satori/go.uuid"
|
||
|
"log"
|
||
|
)
|
||
|
|
||
|
var ResponseSuccess = ClientMessage{Command: SuccessCommand}
|
||
|
var ResponseFailure = ClientMessage{Command: "False"}
|
||
|
|
||
|
func HandleCommand(conn *websocket.Conn, client *ClientInfo, msg ClientMessage) {
|
||
|
handler, ok := CommandHandlers[msg.Command]
|
||
|
if !ok {
|
||
|
log.Print("[!] Unknown command", msg.Command, "- sent by client", client.ClientID, "@", conn.RemoteAddr())
|
||
|
// uncomment after commands are implemented
|
||
|
// closer()
|
||
|
return
|
||
|
}
|
||
|
|
||
|
log.Println(conn.RemoteAddr(), msg.MessageID, msg.Command, msg.Arguments)
|
||
|
|
||
|
client.Mutex.Lock()
|
||
|
response, err := CallHandler(handler, conn, client, msg)
|
||
|
client.Mutex.Unlock()
|
||
|
|
||
|
if err == nil {
|
||
|
response.MessageID = msg.MessageID
|
||
|
FFZCodec.Send(conn, response)
|
||
|
} else if response.Command == AsyncResponseCommand {
|
||
|
// Don't send anything
|
||
|
// The response will be delivered over client.MessageChannel / serverMessageChan
|
||
|
} else {
|
||
|
FFZCodec.Send(conn, ClientMessage{
|
||
|
MessageID: msg.MessageID,
|
||
|
Command: "error",
|
||
|
Arguments: err.Error(),
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func HandleHello(conn *websocket.Conn, client *ClientInfo, msg ClientMessage) (rmsg ClientMessage, err error) {
|
||
|
version, clientId, err := msg.ArgumentsAsTwoStrings()
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
client.Version = version
|
||
|
client.ClientID = uuid.FromStringOrNil(clientId)
|
||
|
if client.ClientID == uuid.Nil {
|
||
|
client.ClientID = uuid.NewV4()
|
||
|
}
|
||
|
|
||
|
return ClientMessage{
|
||
|
Arguments: client.ClientID.String(),
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
func HandleSetUser(conn *websocket.Conn, client *ClientInfo, msg ClientMessage) (rmsg ClientMessage, err error) {
|
||
|
username, err := msg.ArgumentsAsString()
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
client.TwitchUsername = username
|
||
|
client.UsernameValidated = false
|
||
|
|
||
|
return ResponseSuccess, nil
|
||
|
}
|
||
|
|
||
|
func HandleSub(conn *websocket.Conn, client *ClientInfo, msg ClientMessage) (rmsg ClientMessage, err error) {
|
||
|
channel, err := msg.ArgumentsAsString()
|
||
|
|
||
|
AddToSliceS(&client.CurrentChannels, channel)
|
||
|
|
||
|
// TODO - get backlog
|
||
|
|
||
|
return ResponseSuccess, nil
|
||
|
}
|
||
|
|
||
|
func HandleUnsub(conn *websocket.Conn, client *ClientInfo, msg ClientMessage) (rmsg ClientMessage, err error) {
|
||
|
channel, err := msg.ArgumentsAsString()
|
||
|
|
||
|
RemoveFromSliceS(&client.CurrentChannels, channel)
|
||
|
|
||
|
return ResponseSuccess, nil
|
||
|
}
|
||
|
|
||
|
func HandleSubChannel(conn *websocket.Conn, client *ClientInfo, msg ClientMessage) (rmsg ClientMessage, err error) {
|
||
|
channel, err := msg.ArgumentsAsString()
|
||
|
|
||
|
AddToSliceS(&client.WatchingChannels, channel)
|
||
|
|
||
|
// TODO - get backlog
|
||
|
|
||
|
return ResponseSuccess, nil
|
||
|
}
|
||
|
|
||
|
func HandleUnsubChannel(conn *websocket.Conn, client *ClientInfo, msg ClientMessage) (rmsg ClientMessage, err error) {
|
||
|
channel, err := msg.ArgumentsAsString()
|
||
|
|
||
|
RemoveFromSliceS(&client.WatchingChannels, channel)
|
||
|
|
||
|
return ResponseSuccess, nil
|
||
|
}
|
||
|
|
||
|
func HandleSurvey(conn *websocket.Conn, client *ClientInfo, msg ClientMessage) (rmsg ClientMessage, err error) {
|
||
|
log.Println("Ignoring survey response from", client.ClientID)
|
||
|
return ResponseSuccess, nil
|
||
|
}
|
||
|
|
||
|
func HandleTrackFollow(conn *websocket.Conn, client *ClientInfo, msg ClientMessage) (rmsg ClientMessage, err error) {
|
||
|
|
||
|
return ResponseSuccess, nil
|
||
|
}
|
||
|
|
||
|
func HandleEmoticonUses(conn *websocket.Conn, client *ClientInfo, msg ClientMessage) (rmsg ClientMessage, err error) {
|
||
|
|
||
|
return ResponseSuccess, nil
|
||
|
}
|
||
|
|
||
|
func HandleRemoteCommand(conn *websocket.Conn, client *ClientInfo, msg ClientMessage) (rmsg ClientMessage, err error) {
|
||
|
go func(conn *websocket.Conn, msg ClientMessage, authInfo AuthInfo) {
|
||
|
resp, err := RequestRemoteDataCached(string(msg.Command), msg.origArguments, authInfo)
|
||
|
|
||
|
if err != nil {
|
||
|
FFZCodec.Send(conn, ClientMessage{MessageID: msg.MessageID, Command: ErrorCommand, Arguments: err.Error()})
|
||
|
} else {
|
||
|
FFZCodec.Send(conn, ClientMessage{MessageID: msg.MessageID, Command: SuccessCommand, origArguments: resp})
|
||
|
}
|
||
|
}(conn, msg, client.AuthInfo)
|
||
|
|
||
|
return ClientMessage{Command: AsyncResponseCommand}, nil
|
||
|
}
|