120 lines
2.6 KiB
Go
120 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"flag"
|
|
"github.com/bwmarrin/discordgo"
|
|
"os"
|
|
"os/signal"
|
|
"strings"
|
|
|
|
"github.com/Tnze/go-mc/bot"
|
|
"github.com/Tnze/go-mc/bot/basic"
|
|
_ "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/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")
|
|
discordFlag := fs.String("discord", "", "Discord bot token")
|
|
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)
|
|
}
|
|
|
|
minecraft := bot.NewClient()
|
|
basic.NewPlayer(minecraft, basic.DefaultSettings)
|
|
|
|
auth, err := yggdrasil.Authenticate(*emailFlag, *passwordFlag)
|
|
if err != nil {
|
|
log.Fatal().Err(err).Msg("")
|
|
}
|
|
|
|
minecraft.Auth.UUID, minecraft.Auth.Name = auth.SelectedProfile()
|
|
minecraft.Auth.AsTk = auth.AccessToken()
|
|
|
|
var discord *discordgo.Session
|
|
if *discordFlag != "" {
|
|
discord, err = discordgo.New("Bot " + *discordFlag)
|
|
if err != nil {
|
|
log.Fatal().Err(err).Msg("")
|
|
}
|
|
// TODO discord.Application("@me")
|
|
}
|
|
|
|
client := &Client{
|
|
minecraft: minecraft,
|
|
discord: discord,
|
|
}
|
|
|
|
basic.EventsListener{
|
|
GameStart: func() error {
|
|
sendChat(minecraft, "/afk")
|
|
return nil
|
|
},
|
|
ChatMsg: client.onChatMsg,
|
|
}.Attach(minecraft)
|
|
|
|
err = minecraft.JoinServer(*ipFlag)
|
|
if err != nil {
|
|
log.Fatal().Err(err).Msg("")
|
|
}
|
|
log.Info().Msg("Login success")
|
|
|
|
go onChatSend(minecraft)
|
|
|
|
go func() {
|
|
for {
|
|
err := minecraft.HandleGame()
|
|
if err != nil {
|
|
log.Err(err).Msg("")
|
|
}
|
|
}
|
|
}()
|
|
|
|
ch := make(chan os.Signal, 1)
|
|
signal.Notify(ch, os.Interrupt, os.Kill)
|
|
<-ch
|
|
}
|
|
|
|
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("")
|
|
}
|
|
}
|