package main import ( "bufio" "flag" "os" "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/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() 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") client.Events.AddListener(bot.PacketHandler{Priority: 64, ID: packetid.ClientboundKeepAlive, F: keepalive(client)}) basic.EventsListener{ ChatMsg: onChatMsg, }.Attach(client) go onChatSend(client) err = client.HandleGame() if err != nil { log.Fatal().Err(err).Msg("") } } func keepalive(c *bot.Client) func(packet.Packet) error { return func(pk packet.Packet) error { log.Debug().Msg("keepalive") var id packet.Long if err := pk.Scan(&id); err != nil { return err } return c.Conn.WritePacket(packet.Marshal( packetid.ServerboundKeepAlive, id, )) } } 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 } if err := c.Conn.WritePacket(packet.Marshal( packetid.ServerboundChat, packet.String(msg), )); err != nil { log.Err(err).Msg("") } } }