bedrocktool/utils/input.go

78 lines
1.7 KiB
Go

package utils
import (
"bufio"
"context"
"fmt"
"net"
"os"
"regexp"
"strings"
"github.com/sirupsen/logrus"
)
func User_input(ctx context.Context, q string) (string, bool) {
c := make(chan string)
go func() {
fmt.Print(q)
reader := bufio.NewReader(os.Stdin)
answer, _ := reader.ReadString('\n')
r, _ := regexp.Compile(`[\n\r]`)
answer = string(r.ReplaceAll([]byte(answer), []byte("")))
c <- answer
}()
select {
case <-ctx.Done():
return "", true
case a := <-c:
return a, false
}
}
func server_url_to_name(server string) string {
host, _, err := net.SplitHostPort(server)
if err != nil {
logrus.Fatalf("Invalid server: %s", err)
}
return host
}
func ServerInput(ctx context.Context, server string) (address, name string, err error) {
if server == "" { // no arg provided, interactive input
var cancelled bool
server, cancelled = User_input(ctx, "Enter Server: ")
if cancelled {
return "", "", context.Canceled
}
}
if strings.HasPrefix(server, "realm:") { // for realms use api to get ip address
realm_info := strings.Split(server, ":")
id := ""
if len(realm_info) == 3 {
id = realm_info[2]
}
name, address, err = get_realm(context.Background(), GetRealmsApi(), realm_info[1], id)
if err != nil {
return "", "", err
}
name = CleanupName(name)
} else if strings.HasSuffix(server, ".pcap") || strings.HasSuffix(server, ".pcap2") {
s := strings.Split(server, ".")
name = strings.Join(s[:len(s)-1], ".")
address = server
} else {
// if an actual server address if given
// add port if necessary
address = server
if len(strings.Split(address, ":")) == 1 {
address += ":19132"
}
name = server_url_to_name(address)
}
return address, name, nil
}