1
0
Fork 0
mirror of https://github.com/FrankerFaceZ/FrankerFaceZ.git synced 2025-06-27 21:05:53 +00:00
FrankerFaceZ/socketserver/server/types.go
SirStendec 7e6a08ad1d 4.0.0-rc8.2
* Fixed: Appearance of Twitch emotes in locally displayed `/me` messages in chat.
* Fixed: Rendering of international usernames in Clips Chat.
* Changed: Tag error reports with the current site.

Fix the implementation of rate-limiting in the socket server to use data from the sealed request. Load a list of acceptable origins from the config file.
2018-07-21 16:26:10 -04:00

178 lines
4.2 KiB
Go

package server
import (
"fmt"
"net"
"sync"
"github.com/satori/go.uuid"
)
const NegativeOne = ^uint64(0)
var AnonymousClientID = uuid.FromStringOrNil("683b45e4-f853-4c45-bf96-7d799cc93e34")
type ConfigFile struct {
// Numeric server id known to the backend
ServerID int
// Address to bind the HTTP server to on startup.
ListenAddr string
// Address to bind the TLS server to on startup.
SSLListenAddr string
// URL to the backend server
BackendURL string
// Minimum memory to accept a new connection
MinMemoryKBytes uint64
// Maximum # of clients that can be connected. 0 to disable.
MaxClientCount uint64
// SSL/TLS
// Enable the use of SSL.
UseSSL bool
// Path to certificate file.
SSLCertificateFile string
// Path to key file.
SSLKeyFile string
// Origin Checking
UseOriginChecks bool
// Allowed Origins
AllowedOrigins []string
// Nacl keys
OurPrivateKey []byte
OurPublicKey []byte
BackendPublicKey []byte
// Request username validation from all new clients.
SendAuthToNewClients bool
// Proxy Routes
ProxyRoutes []ProxyRoute
}
type ProxyRoute struct {
Route string
Server string
}
type ClientMessage struct {
// Message ID. Increments by 1 for each message sent from the client.
// When replying to a command, the message ID must be echoed.
// When sending a server-initiated message, this is -1.
MessageID int `json:"m"`
// The command that the client wants from the server.
// When sent from the server, the literal string 'True' indicates success.
// Before sending, a blank Command will be converted into SuccessCommand.
Command Command `json:"c"`
// Result of json.Unmarshal on the third field send from the client
Arguments interface{} `json:"a"`
origArguments string
}
func (cm ClientMessage) Reply(cmd Command, args interface{}) ClientMessage {
return ClientMessage{
MessageID: cm.MessageID,
Command: cmd,
Arguments: args,
}
}
func (cm ClientMessage) ReplyJSON(cmd Command, argsJSON string) ClientMessage {
n := ClientMessage{
MessageID: cm.MessageID,
Command: cmd,
origArguments: argsJSON,
}
return n
}
type AuthInfo struct {
// The client's claimed username on Twitch.
TwitchUsername string
// Whether or not the server has validated the client's claimed username.
UsernameValidated bool
}
type ClientInfo struct {
// The client ID.
// This must be written once by the owning goroutine before the struct is passed off to any other goroutines.
ClientID uuid.UUID
// The client's literal version string.
// This must be written once by the owning goroutine before the struct is passed off to any other goroutines.
VersionString string
Version ClientVersion
// Set after a successful hello message.
HelloOK bool
// This mutex protects writable data in this struct.
// If it seems to be a performance problem, we can split this.
Mutex sync.Mutex
// Info about the client's username and whether or not we have verified it.
AuthInfo
RemoteAddr net.Addr
// Username validation nonce.
ValidationNonce string
// The list of chats this client is currently in.
// Protected by Mutex.
CurrentChannels []string
// True if the client has already sent the 'ready' command
ReadyComplete bool
// Server-initiated messages should be sent via the Send() method.
messageChannel chan<- ClientMessage
// Closed when the client is shutting down.
MsgChannelIsDone <-chan struct{}
// Take out an Add() on this during a command if you need to call Send() later.
MsgChannelKeepalive sync.WaitGroup
}
type ClientVersion struct {
Major int
Minor int
Revision int
}
func VersionFromString(v string) ClientVersion {
var cv ClientVersion
fmt.Sscanf(v, "ffz_%d.%d.%d", &cv.Major, &cv.Minor, &cv.Revision)
return cv
}
func (cv *ClientVersion) After(cv2 *ClientVersion) bool {
if cv.Major > cv2.Major {
return true
} else if cv.Major < cv2.Major {
return false
}
if cv.Minor > cv2.Minor {
return true
} else if cv.Minor < cv2.Minor {
return false
}
if cv.Revision > cv2.Revision {
return true
} else if cv.Revision < cv2.Revision {
return false
}
return false // equal
}
func (cv *ClientVersion) Equal(cv2 *ClientVersion) bool {
return cv.Major == cv2.Major && cv.Minor == cv2.Minor && cv.Revision == cv2.Revision
}