afk/main.go

111 lines
2.4 KiB
Go

package main
import (
"bufio"
"flag"
"os"
"os/signal"
"strings"
"github.com/Tnze/go-mc/bot"
"github.com/Tnze/go-mc/bot/basic"
"github.com/Tnze/go-mc/chat"
_ "github.com/Tnze/go-mc/data/lang/en-us"
"github.com/Tnze/go-mc/data/packetid"
"github.com/Tnze/go-mc/net/packet"
"github.com/Tnze/go-mc/yggdrasil"
"github.com/google/uuid"
"github.com/peterbourgon/ff/v3"
"github.com/peterbourgon/ff/v3/fftoml"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
func main() {
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
zerolog.SetGlobalLevel(zerolog.InfoLevel)
fs := flag.NewFlagSet("afk", flag.ExitOnError)
emailFlag := fs.String("email", "", "Login Email")
passwordFlag := fs.String("password", "", "Login Password")
ipFlag := fs.String("ip", "", "Server IP")
debugFlag := fs.Bool("debug", false, "Debug Logging")
if err := ff.Parse(fs, os.Args[1:],
ff.WithEnvVarPrefix("AFK"),
ff.WithConfigFileFlag("config"),
ff.WithAllowMissingConfigFile(true),
ff.WithConfigFileParser(fftoml.New().Parse),
); err != nil {
log.Err(err).Msg("")
return
}
if *debugFlag {
zerolog.SetGlobalLevel(zerolog.DebugLevel)
}
client := bot.NewClient()
basic.NewPlayer(client, basic.DefaultSettings)
auth, err := yggdrasil.Authenticate(*emailFlag, *passwordFlag)
if err != nil {
log.Fatal().Err(err).Msg("")
}
client.Auth.UUID, client.Auth.Name = auth.SelectedProfile()
client.Auth.AsTk = auth.AccessToken()
err = client.JoinServer(*ipFlag)
if err != nil {
log.Fatal().Err(err).Msg("")
}
log.Info().Msg("Login success")
basic.EventsListener{
GameStart: func() error {
sendChat(client, "/afk")
return nil
},
ChatMsg: onChatMsg,
}.Attach(client)
go onChatSend(client)
go func() {
for {
err := client.HandleGame()
if err != nil {
log.Err(err).Msg("")
}
}
}()
ch := make(chan os.Signal, 1)
signal.Notify(ch, os.Interrupt, os.Kill)
<-ch
}
func onChatMsg(c chat.Message, _ byte, _ uuid.UUID) error {
log.Info().Msg(c.String())
return nil
}
func onChatSend(c *bot.Client) {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
msg := scanner.Text()
if strings.TrimSpace(msg) == "" {
continue
}
sendChat(c, msg)
}
}
func sendChat(c *bot.Client, msg string) {
if err := c.Conn.WritePacket(packet.Marshal(
packetid.ServerboundChat,
packet.String(msg),
)); err != nil {
log.Err(err).Msg("")
}
}