afk/main.go

107 lines
2.4 KiB
Go

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