]> git.r.bdr.sh - rbdr/mobius/commitdiff
Improve third party client compatability
authorJeff Halter <redacted>
Wed, 18 Jan 2023 22:56:58 +0000 (14:56 -0800)
committerJeff Halter <redacted>
Wed, 18 Jan 2023 22:56:58 +0000 (14:56 -0800)
hotline/client_conn.go
hotline/server.go
hotline/transaction_handlers.go
hotline/transaction_handlers_test.go

index 8c95aebbf2273882e57dadb1c0d09352a4bed0ed..14aef9e835ebc7ae5f79a0d826f55930db0046af 100644 (file)
@@ -44,7 +44,6 @@ type ClientConn struct {
        transfersMU sync.Mutex
        transfers   map[int]map[[4]byte]*FileTransfer
 
-       Agreed bool
        logger *zap.SugaredLogger
 }
 
@@ -157,7 +156,7 @@ func (cc *ClientConn) Disconnect() {
 // notifyOthers sends transaction t to other clients connected to the server
 func (cc *ClientConn) notifyOthers(t Transaction) (trans []Transaction) {
        for _, c := range sortedClients(cc.Server.Clients) {
-               if c.ID != cc.ID && c.Agreed {
+               if c.ID != cc.ID {
                        t.clientID = c.ID
                        trans = append(trans, t)
                }
index d87ddb99ea121fd499695ad44c10ba6ab6ae74b1..b17102e9ac5f3ebb46eb81a4ff5c96aef4e4f2e7 100644 (file)
@@ -2,7 +2,6 @@ package hotline
 
 import (
        "bufio"
-       "bytes"
        "context"
        "encoding/binary"
        "errors"
@@ -33,13 +32,6 @@ type requestCtx struct {
        name       string
 }
 
-var nostalgiaVersion = []byte{0, 0, 2, 0x2c} // version ID used by the Nostalgia client
-var frogblastVersion = []byte{0, 0, 0, 0xb9} // version ID used by the Frogblast 1.2.4 client
-
-var heildrun = []byte{0, 0x97}
-
-var obsessionVersion = []byte{0xbe, 0x00} // version ID used by the Obsession client
-
 type Server struct {
        Port          int
        Accounts      map[string]*Account
@@ -385,7 +377,6 @@ func (s *Server) NewClientConn(conn io.ReadWriteCloser, remoteAddr string) *Clie
                Version:    []byte{},
                AutoReply:  []byte{},
                transfers:  map[int]map[[4]byte]*FileTransfer{},
-               Agreed:     false,
                RemoteAddr: remoteAddr,
        }
        clientConn.transfers = map[int]map[[4]byte]*FileTransfer{
@@ -472,9 +463,6 @@ func (s *Server) connectedUsers() []Field {
 
        var connectedUsers []Field
        for _, c := range sortedClients(s.Clients) {
-               if !c.Agreed {
-                       continue
-               }
                user := User{
                        ID:    *c.ID,
                        Icon:  c.Icon,
@@ -678,22 +666,19 @@ func (s *Server) handleNewConnection(ctx context.Context, rwc io.ReadWriteCloser
 
        // Used simplified hotline v1.2.3 login flow for clients that do not send login info in tranAgreed
        // TODO: figure out a generalized solution that doesn't require playing whack-a-mole for specific client versions
-       if c.Version == nil || bytes.Equal(c.Version, nostalgiaVersion) || bytes.Equal(c.Version, frogblastVersion) || bytes.Equal(c.Version, obsessionVersion) || bytes.Equal(c.Version, heildrun) {
-               c.Agreed = true
-               c.logger = c.logger.With("name", string(c.UserName))
-               c.logger.Infow("Login successful", "clientVersion", fmt.Sprintf("%v", func() int { i, _ := byteToInt(c.Version); return i }()))
-
-               for _, t := range c.notifyOthers(
-                       *NewTransaction(
-                               tranNotifyChangeUser, nil,
-                               NewField(fieldUserName, c.UserName),
-                               NewField(fieldUserID, *c.ID),
-                               NewField(fieldUserIconID, c.Icon),
-                               NewField(fieldUserFlags, c.Flags),
-                       ),
-               ) {
-                       c.Server.outbox <- t
-               }
+       c.logger = c.logger.With("name", string(c.UserName))
+       c.logger.Infow("Login successful", "clientVersion", fmt.Sprintf("%v", func() int { i, _ := byteToInt(c.Version); return i }()))
+
+       for _, t := range c.notifyOthers(
+               *NewTransaction(
+                       tranNotifyChangeUser, nil,
+                       NewField(fieldUserName, c.UserName),
+                       NewField(fieldUserID, *c.ID),
+                       NewField(fieldUserIconID, c.Icon),
+                       NewField(fieldUserFlags, c.Flags),
+               ),
+       ) {
+               c.Server.outbox <- t
        }
 
        c.Server.Stats.ConnectionCounter += 1
index acc8fe4ac76d6bd2ad8cc43d46a85270f0d36aa9..d3238f4d05bc5d3b247d978cce94031c3525b5c6 100644 (file)
@@ -933,8 +933,6 @@ func HandleGetUserNameList(cc *ClientConn, t *Transaction) (res []Transaction, e
 }
 
 func HandleTranAgreed(cc *ClientConn, t *Transaction) (res []Transaction, err error) {
-       cc.Agreed = true
-
        if t.GetField(fieldUserName).Data != nil {
                if cc.Authorize(accessAnyName) {
                        cc.UserName = t.GetField(fieldUserName).Data
index 2720cddc07d9b82f007fb95fb70d6f3b707fa335..69dedf9e6e4ee47022deb312e1dc5b74f1bd9bcb 100644 (file)
@@ -232,21 +232,18 @@ func TestHandleGetUserNameList(t *testing.T) {
                                                                Icon:     []byte{0, 2},
                                                                Flags:    []byte{0, 3},
                                                                UserName: []byte{0, 4},
-                                                               Agreed:   true,
                                                        },
                                                        uint16(2): {
                                                                ID:       &[]byte{0, 2},
                                                                Icon:     []byte{0, 2},
                                                                Flags:    []byte{0, 3},
                                                                UserName: []byte{0, 4},
-                                                               Agreed:   true,
                                                        },
                                                        uint16(3): {
                                                                ID:       &[]byte{0, 3},
                                                                Icon:     []byte{0, 2},
                                                                Flags:    []byte{0, 3},
                                                                UserName: []byte{0, 4},
-                                                               Agreed:   false,
                                                        },
                                                },
                                        },