Prechádzať zdrojové kódy

clear up OService user flag and status constants

In 34e7946 we added a bunch of new user statuses. We observed that there
were some duplicate values in the list. Turns out the "duplicates" were
flags incorrectly named as statuses.

Digging further into the protocol docs, it appears there are two
different kinds of constants: flags and statuses. Flags are uint16,
statuses are uin32.

Cleaned up some errors and inconsistencies:
- Status consts were incorrectly namd as flags.
- Two flags were typed as uint32 when they should hace remained uint16.
- Some of the status const values are not powers of 2, not sure how they
  can be useful as flags.
- User info TLV cast the invisibility flag, a uint32, to uint16. The
  invisibility flagged still worked despite this. Re-typed the flag to
  uint32 for consistency's sake.
Mike 2 rokov pred
rodič
commit
a075fb540f
4 zmenil súbory, kde vykonal 35 pridanie a 39 odobranie
  1. 8 8
      foodgroup/oservice.go
  2. 5 5
      state/session.go
  3. 7 7
      state/session_test.go
  4. 15 19
      wire/snacs.go

+ 8 - 8
foodgroup/oservice.go

@@ -422,23 +422,23 @@ func (s OServiceService) UserInfoQuery(_ context.Context, sess *state.Session, i
 // It returns SNAC wire.OServiceUserInfoUpdate containing the user's info.
 func (s OServiceService) SetUserInfoFields(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, inBody wire.SNAC_0x01_0x1E_OServiceSetUserInfoFields) (wire.SNACMessage, error) {
 	if status, hasStatus := inBody.Uint32(wire.OServiceUserInfoStatus); hasStatus {
-		if status == wire.OServiceUserFlagNormal {
+		if status == wire.OServiceUserStatusAvailable {
 			sess.SetInvisible(false)
 			if err := broadcastArrival(ctx, sess, s.messageRelayer, s.feedbagManager, s.legacyBuddyListManager); err != nil {
 				return wire.SNACMessage{}, err
 			}
 		}
-		if status&wire.OServiceUserFlagInvisible == wire.OServiceUserFlagInvisible {
+		if status&wire.OServiceUserStatusInvisible == wire.OServiceUserStatusInvisible {
 			sess.SetInvisible(true)
 			if err := broadcastDeparture(ctx, sess, s.messageRelayer, s.feedbagManager, s.legacyBuddyListManager); err != nil {
 				return wire.SNACMessage{}, err
 			}
-			if status&wire.OServiceStatusDirectRequireAuth == wire.OServiceStatusDirectRequireAuth {
-				s.logger.InfoContext(ctx, "got unsupported status", "status", status)
-			}
-			if status&wire.OServiceStatusHideIP == wire.OServiceStatusHideIP {
-				s.logger.InfoContext(ctx, "got unsupported status", "status", status)
-			}
+		}
+		if status&wire.OServiceUserStatusDirectRequireAuth == wire.OServiceUserStatusDirectRequireAuth {
+			s.logger.InfoContext(ctx, "got unsupported status", "status", status)
+		}
+		if status&wire.OServiceUserStatusHideIP == wire.OServiceUserStatusHideIP {
+			s.logger.InfoContext(ctx, "got unsupported status", "status", status)
 		}
 	}
 	return wire.SNACMessage{

+ 5 - 5
state/session.go

@@ -190,16 +190,16 @@ func (s *Session) userInfo() wire.TLVList {
 
 	// away message status
 	if s.awayMessage != "" {
-		tlvs.Append(wire.NewTLV(wire.OServiceUserInfoUserFlags, uint16(wire.OServiceUserFlagOSCARFree|wire.OServiceUserFlagUnavailable)))
+		tlvs.Append(wire.NewTLV(wire.OServiceUserInfoUserFlags, wire.OServiceUserFlagOSCARFree|wire.OServiceUserFlagUnavailable))
 	} else {
-		tlvs.Append(wire.NewTLV(wire.OServiceUserInfoUserFlags, uint16(wire.OServiceUserFlagOSCARFree)))
+		tlvs.Append(wire.NewTLV(wire.OServiceUserInfoUserFlags, wire.OServiceUserFlagOSCARFree))
 	}
 
-	// invisibility status
+	// reflects invisibility toggle status back to toggling client
 	if s.invisible {
-		tlvs.Append(wire.NewTLV(wire.OServiceUserInfoStatus, uint16(wire.OServiceUserFlagInvisible)))
+		tlvs.Append(wire.NewTLV(wire.OServiceUserInfoStatus, wire.OServiceUserStatusInvisible))
 	} else {
-		tlvs.Append(wire.NewTLV(wire.OServiceUserInfoStatus, uint16(0)))
+		tlvs.Append(wire.NewTLV(wire.OServiceUserInfoStatus, uint32(0)))
 	}
 
 	// idle status

+ 7 - 7
state/session_test.go

@@ -83,7 +83,7 @@ func TestSession_TLVUserInfo(t *testing.T) {
 					TLVList: wire.TLVList{
 						wire.NewTLV(wire.OServiceUserInfoSignonTOD, uint32(1)),
 						wire.NewTLV(wire.OServiceUserInfoUserFlags, uint16(0x0010)),
-						wire.NewTLV(wire.OServiceUserInfoStatus, uint16(0x0000)),
+						wire.NewTLV(wire.OServiceUserInfoStatus, uint32(0x0000)),
 						wire.NewTLV(wire.OServiceUserInfoIdleTime, uint16(0)),
 					},
 				},
@@ -102,7 +102,7 @@ func TestSession_TLVUserInfo(t *testing.T) {
 					TLVList: wire.TLVList{
 						wire.NewTLV(wire.OServiceUserInfoSignonTOD, uint32(1)),
 						wire.NewTLV(wire.OServiceUserInfoUserFlags, uint16(0x30)),
-						wire.NewTLV(wire.OServiceUserInfoStatus, uint16(0x0000)),
+						wire.NewTLV(wire.OServiceUserInfoStatus, uint32(0x0000)),
 						wire.NewTLV(wire.OServiceUserInfoIdleTime, uint16(0)),
 					},
 				},
@@ -121,7 +121,7 @@ func TestSession_TLVUserInfo(t *testing.T) {
 					TLVList: wire.TLVList{
 						wire.NewTLV(wire.OServiceUserInfoSignonTOD, uint32(1)),
 						wire.NewTLV(wire.OServiceUserInfoUserFlags, uint16(0x0010)),
-						wire.NewTLV(wire.OServiceUserInfoStatus, uint16(0x0100)),
+						wire.NewTLV(wire.OServiceUserInfoStatus, uint32(0x0100)),
 						wire.NewTLV(wire.OServiceUserInfoIdleTime, uint16(0)),
 					},
 				},
@@ -144,7 +144,7 @@ func TestSession_TLVUserInfo(t *testing.T) {
 					TLVList: wire.TLVList{
 						wire.NewTLV(wire.OServiceUserInfoSignonTOD, uint32(1)),
 						wire.NewTLV(wire.OServiceUserInfoUserFlags, uint16(0x0010)),
-						wire.NewTLV(wire.OServiceUserInfoStatus, uint16(0x0000)),
+						wire.NewTLV(wire.OServiceUserInfoStatus, uint32(0x0000)),
 						wire.NewTLV(wire.OServiceUserInfoIdleTime, uint16(1001)),
 					},
 				},
@@ -164,7 +164,7 @@ func TestSession_TLVUserInfo(t *testing.T) {
 					TLVList: wire.TLVList{
 						wire.NewTLV(wire.OServiceUserInfoSignonTOD, uint32(1)),
 						wire.NewTLV(wire.OServiceUserInfoUserFlags, uint16(0x0010)),
-						wire.NewTLV(wire.OServiceUserInfoStatus, uint16(0x0000)),
+						wire.NewTLV(wire.OServiceUserInfoStatus, uint32(0x0000)),
 						wire.NewTLV(wire.OServiceUserInfoIdleTime, uint16(0)),
 					},
 				},
@@ -194,7 +194,7 @@ func TestSession_TLVUserInfo(t *testing.T) {
 					TLVList: wire.TLVList{
 						wire.NewTLV(wire.OServiceUserInfoSignonTOD, uint32(1)),
 						wire.NewTLV(wire.OServiceUserInfoUserFlags, uint16(0x0010)),
-						wire.NewTLV(wire.OServiceUserInfoStatus, uint16(0x0000)),
+						wire.NewTLV(wire.OServiceUserInfoStatus, uint32(0x0000)),
 						wire.NewTLV(wire.OServiceUserInfoIdleTime, uint16(0)),
 						wire.NewTLV(wire.OServiceUserInfoOscarCaps, []byte{
 							// chat: "748F2420-6287-11D1-8222-444553540000"
@@ -221,7 +221,7 @@ func TestSession_TLVUserInfo(t *testing.T) {
 					TLVList: wire.TLVList{
 						wire.NewTLV(wire.OServiceUserInfoSignonTOD, uint32(1)),
 						wire.NewTLV(wire.OServiceUserInfoUserFlags, uint16(0x0010)),
-						wire.NewTLV(wire.OServiceUserInfoStatus, uint16(0x0000)),
+						wire.NewTLV(wire.OServiceUserInfoStatus, uint32(0x0000)),
 						wire.NewTLV(wire.OServiceUserInfoIdleTime, uint16(0)),
 					},
 				},

+ 15 - 19
wire/snacs.go

@@ -144,29 +144,25 @@ const (
 	OServiceUserInfoOscarCaps uint16 = 0x0D
 	OServiceUserInfoBARTInfo  uint16 = 0x1D
 
-	OServiceUserFlagOSCARFree   uint32 = 0x00000010 // AIM (not AOL) account
-	OServiceUserFlagNormal      uint32 = 0x00000000 // user is normal
-	OServiceUserFlagAway        uint32 = 0x00000001 // user is also away
-	OServiceUserFlagDND         uint32 = 0x00000002 // don't disturb user
-	OServiceUserFlagOut         uint32 = 0x00000004 // user is not available
-	OServiceUserFlagBusy        uint32 = 0x00000010 // user is busy
-	OServiceUserFlagInvisible   uint32 = 0x00000100 // user is invisible
-	OServiceUserFlagUnavailable uint32 = 0x00000020 // user is away
-	OServiceUserFlagEvil        uint32 = 0x00003000 // user is evil
-	OServiceUserFlagDepression  uint32 = 0x00004000 // user is having a depression :(
-	OServiceUserFlagAtHome      uint32 = 0x00005000 // user is at home
-	OServiceUserFlagAtWork      uint32 = 0x00006000 // user is at work
-	OServiceUserFlagLunch       uint32 = 0x00002001 // user is having a lunch
-	OServiceUserFlagBirthday    uint32 = 0x00080000 // user is having a birthday :DDD
+	OServiceUserStatusAvailable         uint32 = 0x00000000 // user is available
+	OServiceUserStatusAway              uint32 = 0x00000001 // user is away
+	OServiceUserStatusDND               uint32 = 0x00000002 // don't disturb user
+	OServiceUserStatusOut               uint32 = 0x00000004 // user is not available
+	OServiceUserStatusBusy              uint32 = 0x00000010 // user is busy
+	OServiceUserStatusChat              uint32 = 0x00000020 // user is available to chat
+	OServiceUserStatusInvisible         uint32 = 0x00000100 // user is invisible
+	OServiceUserStatusWebAware          uint32 = 0x00010000
+	OServiceUserStatusHideIP            uint32 = 0x00020000
+	OServiceUserStatusBirthday          uint32 = 0x00080000 // user is having a birthday :DDD
+	OServiceUserStatusICQHomePage       uint32 = 0x00200000
+	OServiceUserStatusDirectRequireAuth uint32 = 0x10000000
+
+	OServiceUserFlagOSCARFree   uint16 = 0x0010 // AIM (not AOL) account
+	OServiceUserFlagUnavailable uint16 = 0x0020 // user is away
 
 	OServicePrivacyFlagIdle   uint32 = 0x00000001
 	OServicePrivacyFlagMember uint32 = 0x00000002
 
-	OServiceStatusWebAware          uint32 = 0x00010000
-	OServiceStatusHideIP            uint32 = 0x00020000
-	OServiceStatusICQHomePage       uint32 = 0x00200000
-	OServiceStatusDirectRequireAuth uint32 = 0x10000000
-
 	OServiceTLVTagsReconnectHere uint16 = 0x05
 	OServiceTLVTagsLoginCookie   uint16 = 0x06
 	OServiceTLVTagsGroupID       uint16 = 0x0D