afk/main.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("")
}
}