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("") } }