Просмотр исходного кода

oservice: make system message screen name configurable (#217)

* oservice: make system message screen name configurable

* config: leave SYSTEM_MSG_SCREEN_NAME out of the generated config files
Lucas 1 день назад
Родитель
Сommit
d63dfb8d84
3 измененных файлов с 82 добавлено и 8 удалено
  1. 1 0
      config/config.go
  2. 17 4
      foodgroup/oservice.go
  3. 64 4
      foodgroup/oservice_test.go

+ 1 - 0
config/config.go

@@ -158,6 +158,7 @@ type Config struct {
 	DBPath                 string `envconfig:"DB_PATH" required:"true" basic:"oscar.sqlite" ssl:"oscar.sqlite" description:"The path to the SQLite database file. The file and DB schema are auto-created if they doesn't exist."`
 	DisableAuth            bool   `envconfig:"DISABLE_AUTH" required:"true" basic:"true" ssl:"true" description:"Disable password check and auto-create new users at login time. Useful for quickly creating new accounts during development without having to register new users via the management API."`
 	DisableMultiLoginNotif bool   `envconfig:"DISABLE_MULTI_LOGIN_NOTIF" required:"false" basic:"true" ssl:"true" description:"Disable notification sent when another client signs in with the same screen name."`
+	SystemMsgScreenName    string `envconfig:"SYSTEM_MSG_SCREEN_NAME" required:"false" basic:"" ssl:"" description:"Screen name that server notifications, such as the multiple sign-in and offline message notices, are sent from. Defaults to 'OOS System Msg' when blank."`
 	LogLevel               string `envconfig:"LOG_LEVEL" required:"true" basic:"info" ssl:"info" description:"Set logging granularity. Possible values: 'trace', 'debug', 'info', 'warn', 'error'."`
 	ICBMLegacyCharset      string `envconfig:"ICBM_LEGACY_CHARSET" required:"false" default:"Windows1251" basic:"Windows1251" ssl:"Windows1251" description:"Fallback character set used to transcode IMs between Unicode-capable and legacy clients. Possible values: Windows1250 (central european: polish, czech, hungarian), Windows1251 (russian), Windows1252 (western european: english, french, german), Windows1253 (greek), Windows1254 (turkish), Windows1255 (hebrew), Windows1256 (arabic), Windows1257 (baltic: lithuanian, latvian, estonian), Windows1258 (vietnamese), KOI8R (russian), KOI8U (ukrainian)."`
 

+ 17 - 4
foodgroup/oservice.go

@@ -13,6 +13,10 @@ import (
 	"github.com/mk6i/open-oscar-server/wire"
 )
 
+// defaultSystemMsgScreenName is the screen name system messages are sent from
+// when SYSTEM_MSG_SCREEN_NAME is not set.
+const defaultSystemMsgScreenName = "OOS System Msg"
+
 // OServiceService provides functionality for the OService food group, which
 // provides an assortment of services useful across multiple food groups.
 type OServiceService struct {
@@ -878,7 +882,7 @@ func (s OServiceService) sendOfflineMessageNotification(ctx context.Context, ins
 		"not wish to receive offline messages, please go to "+
 		"<a href=\"https://www.youtube.com/watch?v=dQw4w9WgXcQ&list=RDdQw4w9WgXcQ&start_radio=1&pp=ygUJcmljayByb2xsoAcB\">IM Settings</a>.", instance.OfflineMsgCount())
 
-	message, err := systemMessage(msg)
+	message, err := systemMessage(s.systemMsgScreenName(), msg)
 	if err != nil {
 		return err
 	}
@@ -897,7 +901,7 @@ func (s OServiceService) sendMultipleInstanceNotification(ctx context.Context, i
 		"<a href=\"https://www.youtube.com/watch?v=dQw4w9WgXcQ&list=RDdQw4w9WgXcQ&start_radio=1&pp=ygUJcmljayByb2xsoAcB\">here</a> "+
 		"for more information.", instance.DisplayScreenName(), instance.Session().InstanceCount())
 
-	message, err := systemMessage(msg)
+	message, err := systemMessage(s.systemMsgScreenName(), msg)
 	if err != nil {
 		return err
 	}
@@ -907,7 +911,16 @@ func (s OServiceService) sendMultipleInstanceNotification(ctx context.Context, i
 	return nil
 }
 
-func systemMessage(msg string) (wire.SNACMessage, error) {
+// systemMsgScreenName returns the screen name that system messages are sent
+// from.
+func (s OServiceService) systemMsgScreenName() string {
+	if s.cfg.SystemMsgScreenName != "" {
+		return s.cfg.SystemMsgScreenName
+	}
+	return defaultSystemMsgScreenName
+}
+
+func systemMessage(screenName string, msg string) (wire.SNACMessage, error) {
 	frags, err := wire.ICBMFragmentListASCII(msg)
 	if err != nil {
 		return wire.SNACMessage{}, fmt.Errorf("creating ICBM fragments: %w", err)
@@ -922,7 +935,7 @@ func systemMessage(msg string) (wire.SNACMessage, error) {
 		Body: wire.SNAC_0x04_0x07_ICBMChannelMsgToClient{
 			ChannelID: wire.ICBMChannelIM,
 			TLVUserInfo: wire.TLVUserInfo{
-				ScreenName: "OOS System Msg",
+				ScreenName: screenName,
 			},
 			TLVRestBlock: wire.TLVRestBlock{
 				TLVList: []wire.TLV{

+ 64 - 4
foodgroup/oservice_test.go

@@ -3676,8 +3676,8 @@ func TestOServiceService_ClientOnline(t *testing.T) {
 						{
 							screenName: state.NewIdentScreenName("me"),
 							message: func() wire.SNACMessage {
-								msg, err := systemMessage("You just received 3 IM(s) while you were offline. If you " +
-									"do not wish to receive offline messages, please go to " +
+								msg, err := systemMessage(defaultSystemMsgScreenName, "You just received 3 IM(s) while you were offline. If you "+
+									"do not wish to receive offline messages, please go to "+
 									"<a href=\"https://www.youtube.com/watch?v=dQw4w9WgXcQ&list=RDdQw4w9WgXcQ&start_radio=1&pp=ygUJcmljayByb2xsoAcB\">IM Settings</a>.")
 								require.NoError(t, err)
 								return msg
@@ -3782,8 +3782,68 @@ func TestOServiceService_ClientOnline(t *testing.T) {
 						{
 							screenName: state.NewIdentScreenName("me"),
 							message: func() wire.SNACMessage {
-								msg, err := systemMessage("Your screen name (me) is now signed into Open OSCAR Server in 3 locations. Click " +
-									"<a href=\"https://www.youtube.com/watch?v=dQw4w9WgXcQ&list=RDdQw4w9WgXcQ&start_radio=1&pp=ygUJcmljayByb2xsoAcB\">here</a> " +
+								msg, err := systemMessage(defaultSystemMsgScreenName, "Your screen name (me) is now signed into Open OSCAR Server in 3 locations. Click "+
+									"<a href=\"https://www.youtube.com/watch?v=dQw4w9WgXcQ&list=RDdQw4w9WgXcQ&start_radio=1&pp=ygUJcmljayByb2xsoAcB\">here</a> "+
+									"for more information.")
+								require.NoError(t, err)
+								return msg
+							}(),
+						},
+					},
+				},
+			},
+			validateSess: func(t *testing.T, instance *state.SessionInstance) {
+				assert.True(t, instance.Session().Instance(3).SignonComplete())
+			},
+		},
+		{
+			name: "notify that BOS user is logged in to multiple locations, SystemMsgScreenName is set",
+			instance: func() *state.SessionInstance {
+				instance1 := newTestInstance("me")
+				instance1.SetSignonComplete()
+				instance2 := instance1.Session().AddInstance()
+				instance2.SetSignonComplete()
+				instance3 := instance1.Session().AddInstance()
+				// instance 3 is not yet signed on
+				return instance3
+			}(),
+			bodyIn:  wire.SNAC_0x01_0x02_OServiceClientOnline{},
+			service: wire.BOS,
+			cfg: config.Config{
+				SystemMsgScreenName: "AIM Bot",
+			},
+			mockParams: mockParams{
+				buddyBroadcasterParams: buddyBroadcasterParams{
+					broadcastVisibilityParams: broadcastVisibilityParams{
+						{
+							from:             state.NewIdentScreenName("me"),
+							filter:           nil,
+							doSendDepartures: false,
+						},
+					},
+				},
+				messageRelayerParams: messageRelayerParams{
+					relayToScreenNameParams: relayToScreenNameParams{
+						{
+							screenName: state.NewIdentScreenName("me"),
+							message: wire.SNACMessage{
+								Frame: wire.SNACFrame{
+									FoodGroup: wire.Stats,
+									SubGroup:  wire.StatsSetMinReportInterval,
+									RequestID: wire.ReqIDFromServer,
+								},
+								Body: wire.SNAC_0x0B_0x02_StatsSetMinReportInterval{
+									MinReportInterval: 1,
+								},
+							},
+						},
+					},
+					relayToOtherInstancesParams: relayToOtherInstancesParams{
+						{
+							screenName: state.NewIdentScreenName("me"),
+							message: func() wire.SNACMessage {
+								msg, err := systemMessage("AIM Bot", "Your screen name (me) is now signed into Open OSCAR Server in 3 locations. Click "+
+									"<a href=\"https://www.youtube.com/watch?v=dQw4w9WgXcQ&list=RDdQw4w9WgXcQ&start_radio=1&pp=ygUJcmljayByb2xsoAcB\">here</a> "+
 									"for more information.")
 								require.NoError(t, err)
 								return msg