Refactor: Simplify LoginClient, replace Account struct with strom.Account, add Ticker module, and enhance configuration handling
This commit is contained in:
@@ -1,7 +1,34 @@
|
||||
package modules
|
||||
|
||||
import "strom"
|
||||
import (
|
||||
"strom"
|
||||
|
||||
func IgnoreConfig(c *strom.Conn) (err error) {
|
||||
"github.com/admin-else/queser"
|
||||
"github.com/admin-else/queser/generated/v1_21_8"
|
||||
)
|
||||
|
||||
type ConfigIgnorer struct {
|
||||
*strom.Conn
|
||||
}
|
||||
|
||||
func (c *ConfigIgnorer) Default(event any) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func (c *ConfigIgnorer) OnKnownPacks(packet v1_21_8.PacketCommonSelectKnownPacks) (err error) {
|
||||
return c.Send(packet)
|
||||
}
|
||||
|
||||
func (c *ConfigIgnorer) OnFinish(packet v1_21_8.ConfigurationToClientPacketFinishConfiguration) (err error) {
|
||||
err = c.Send(v1_21_8.ConfigurationToServerPacketFinishConfiguration{})
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
c.State = queser.Play
|
||||
err = strom.HandlerDone
|
||||
return
|
||||
}
|
||||
|
||||
func IgnoreConfig(c *strom.Conn) (err error) {
|
||||
return c.Start(&ConfigIgnorer{c})
|
||||
}
|
||||
|
||||
+10
-46
@@ -1,7 +1,6 @@
|
||||
package modules
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/aes"
|
||||
"crypto/cipher"
|
||||
"crypto/rand"
|
||||
@@ -9,10 +8,7 @@ import (
|
||||
"crypto/sha1"
|
||||
"crypto/x509"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
"strom"
|
||||
@@ -20,23 +16,21 @@ import (
|
||||
"github.com/admin-else/queser"
|
||||
"github.com/admin-else/queser/data"
|
||||
"github.com/admin-else/queser/generated/v1_21_8"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type Account struct {
|
||||
Username string
|
||||
Uuid uuid.UUID
|
||||
Token string
|
||||
}
|
||||
type LoginClient struct {
|
||||
*strom.Conn
|
||||
Account Account
|
||||
Account strom.Account
|
||||
|
||||
GivenAccount v1_21_8.LoginToClientPacketSuccess
|
||||
}
|
||||
|
||||
func (s *LoginClient) Default(event any) (err error) {
|
||||
err = fmt.Errorf("unexpected event: %T%v", event, event)
|
||||
err = fmt.Errorf("unexpected event: %#v", event)
|
||||
return
|
||||
}
|
||||
|
||||
func (s *LoginClient) OnCycle(_ strom.OnLoopCycle) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -60,7 +54,7 @@ func (s *LoginClient) OnStart(_ strom.OnStart) (err error) {
|
||||
return
|
||||
}
|
||||
s.State = queser.Login
|
||||
err = s.Send(v1_21_8.LoginToServerPacketLoginStart{Username: s.Account.Username, PlayerUUID: s.Account.Uuid})
|
||||
err = s.Send(v1_21_8.LoginToServerPacketLoginStart{Username: s.Account.Name, PlayerUUID: s.Account.Uuid})
|
||||
return
|
||||
}
|
||||
|
||||
@@ -102,47 +96,17 @@ func AuthDigest(elems ...[]byte) string {
|
||||
return res
|
||||
}
|
||||
|
||||
func JoinServerAPI(a Account, serverId string) (err error) {
|
||||
var body []byte
|
||||
body, err = json.Marshal(struct {
|
||||
AccessToken string `json:"accessToken"`
|
||||
SelectedProfile string `json:"selectedProfile"`
|
||||
ServerId string `json:"serverId"`
|
||||
}{
|
||||
AccessToken: a.Token,
|
||||
SelectedProfile: strings.ReplaceAll(a.Uuid.String(), "-", ""),
|
||||
ServerId: serverId,
|
||||
})
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
var resp *http.Response
|
||||
resp, err = http.Post("https://sessionserver.mojang.com/session/minecraft/join", "application/json", bytes.NewReader(body))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if resp.StatusCode != 204 {
|
||||
body, err = io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err = fmt.Errorf("bad client code %v body %v", resp.StatusCode, string(body))
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (s *LoginClient) OnEncrypt(packet v1_21_8.LoginToClientPacketEncryptionBegin) (err error) {
|
||||
sharedSecret := make([]byte, 16)
|
||||
_, _ = rand.Read(sharedSecret) //never fails
|
||||
|
||||
if packet.ShouldAuthenticate {
|
||||
if s.Account.Token == "" {
|
||||
if s.Account.Ygg == "" {
|
||||
err = fmt.Errorf("the account has no token so we cant join online servers")
|
||||
return
|
||||
}
|
||||
serverId := AuthDigest([]byte(packet.ServerId), sharedSecret, packet.PublicKey)
|
||||
err = JoinServerAPI(s.Account, serverId)
|
||||
err = s.Account.JoinServer(serverId)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@@ -199,7 +163,7 @@ func (s *LoginClient) OnSuccess(success v1_21_8.LoginToClientPacketSuccess) (err
|
||||
return
|
||||
}
|
||||
|
||||
func Login(c *strom.Conn, account Account) (err error) {
|
||||
func Login(c *strom.Conn, account strom.Account) (err error) {
|
||||
return c.Start(&LoginClient{
|
||||
Conn: c,
|
||||
Account: account,
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
package modules
|
||||
|
||||
import "time"
|
||||
|
||||
type IntervalTask struct {
|
||||
F func() error
|
||||
LastTrigger time.Time
|
||||
Interval time.Duration
|
||||
}
|
||||
|
||||
type OnceTask struct {
|
||||
F func() error
|
||||
Trigger time.Time
|
||||
}
|
||||
|
||||
type Ticker struct {
|
||||
Once []OnceTask
|
||||
Interval []IntervalTask
|
||||
Active bool
|
||||
}
|
||||
|
||||
func (t *Ticker) Tick() (err error) {
|
||||
if !t.Active {
|
||||
return
|
||||
}
|
||||
for i, task := range t.Interval {
|
||||
if time.Since(task.LastTrigger) >= task.Interval {
|
||||
task.LastTrigger = time.Now()
|
||||
err = task.F()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
t.Interval[i] = task
|
||||
}
|
||||
var triggerLater []OnceTask
|
||||
for _, task := range t.Once {
|
||||
if task.Trigger.After(time.Now()) {
|
||||
err = task.F()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
triggerLater = append(triggerLater, task)
|
||||
}
|
||||
}
|
||||
t.Once = triggerLater
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user