1
0
Fork 0
mirror of https://github.com/FrankerFaceZ/FrankerFaceZ.git synced 2025-06-28 05:15:54 +00:00
FrankerFaceZ/socketserver/cmd/ffzsocketserver/console.go
2017-09-15 12:21:41 -07:00

135 lines
3.6 KiB
Go

package main
import (
"fmt"
"runtime"
"strconv"
"strings"
"github.com/FrankerFaceZ/FrankerFaceZ/socketserver/server"
"github.com/FrankerFaceZ/FrankerFaceZ/socketserver/server/rate"
"github.com/gorilla/websocket"
"gopkg.in/abiosoft/ishell.v1"
)
func commandLineConsole() {
shell := ishell.New()
shell.Register("help", func(args ...string) (string, error) {
shell.PrintCommands()
return "", nil
})
shell.Register("clientcount", func(args ...string) (string, error) {
server.GlobalSubscriptionLock.RLock()
count := len(server.GlobalSubscriptionInfo)
server.GlobalSubscriptionLock.RUnlock()
return fmt.Sprintln(count, "clients connected"), nil
})
shell.Register("globalnotice", func(args ...string) (string, error) {
msg := server.ClientMessage{
MessageID: -1,
Command: "message",
Arguments: args[0],
}
server.PublishToAll(msg, rate.Unlimited())
return "Message sent.", nil
})
shell.Register("publish", func(args ...string) (string, error) {
if len(args) < 4 {
return "Usage: publish [room.sirstendec | _ALL] -1 reload_ff 23", nil
}
target := args[0]
line := strings.Join(args[1:], " ")
msg := server.ClientMessage{}
err := server.UnmarshalClientMessage([]byte(line), websocket.TextMessage, &msg)
if err != nil {
return "", err
}
var count int
if target == "_ALL" {
count = server.PublishToAll(msg, rate.Unlimited())
} else {
count = server.PublishToChannel(target, msg, rate.Unlimited())
}
return fmt.Sprintf("Published to %d clients", count), nil
})
shell.Register("memstatsbysize", func(args ...string) (string, error) {
runtime.GC()
m := runtime.MemStats{}
runtime.ReadMemStats(&m)
for _, val := range m.BySize {
if val.Mallocs == 0 {
continue
}
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("authorizeeveryone", func(args ...string) (string, error) {
if len(args) == 0 {
if server.Configuration.SendAuthToNewClients {
return "All clients are recieving auth challenges upon claiming a name.", nil
}
return "All clients are not recieving auth challenges upon claiming a name.", nil
} else if args[0] == "on" {
server.Configuration.SendAuthToNewClients = true
return "All new clients will recieve auth challenges upon claiming a name.", nil
} else if args[0] == "off" {
server.Configuration.SendAuthToNewClients = false
return "All new clients will not recieve auth challenges upon claiming a name.", nil
}
return "Usage: authorizeeveryone [ on | off ]", nil
})
shell.Register("kickclients", func(args ...string) (string, error) {
if len(args) == 0 {
return "Please enter either a count or a fraction of clients to kick.", nil
}
input, err := strconv.ParseFloat(args[0], 64)
if err != nil {
return "Argument must be a number", err
}
var count int
if input >= 1 {
count = int(input)
} else {
server.GlobalSubscriptionLock.RLock()
count = int(float64(len(server.GlobalSubscriptionInfo)) * input)
server.GlobalSubscriptionLock.RUnlock()
}
msg := server.ClientMessage{Arguments: &server.CloseRebalance}
server.GlobalSubscriptionLock.RLock()
defer server.GlobalSubscriptionLock.RUnlock()
kickCount := 0
for i, cl := range server.GlobalSubscriptionInfo {
if i >= count {
break
}
if cl.Send(msg) {
kickCount++
}
}
return fmt.Sprintf("Kicked %d clients", kickCount), nil
})
shell.Register("panic", func(args ...string) (string, error) {
go func() {
panic("requested panic")
}()
return "", nil
})
shell.Start()
}