소스 검색

Merge branch 'master' into multidevice

Tulir Asokan 3 년 전
부모
커밋
a8b9c88707
4개의 변경된 파일56개의 추가작업 그리고 6개의 파일을 삭제
  1. 10 1
      config/bridge.go
  2. 12 0
      example-config.yaml
  3. 23 1
      matrix.go
  4. 11 4
      metrics.go

+ 10 - 1
config/bridge.go

@@ -72,6 +72,13 @@ type BridgeConfig struct {
 
 	CommandPrefix string `yaml:"command_prefix"`
 
+	ManagementRoomText struct {
+		Welcome            string `yaml:"welcome"`
+		WelcomeConnected   string `yaml:"welcome_connected"`
+		WelcomeUnconnected string `yaml:"welcome_unconnected"`
+		AdditionalHelp     string `yaml:"additional_help"`
+	} `yaml:"management_room_text"`
+
 	Encryption struct {
 		Allow   bool `yaml:"allow"`
 		Default bool `yaml:"default"`
@@ -111,7 +118,9 @@ func (bc *BridgeConfig) setDefaults() {
 	bc.BridgeNotices = true
 	bc.EnableStatusBroadcast = true
 
-	bc.Relay.AdminOnly = true
+	bc.ManagementRoomText.Welcome = "Hello, I'm a WhatsApp bridge bot."
+	bc.ManagementRoomText.WelcomeConnected = "Use `help` for help."
+	bc.ManagementRoomText.WelcomeUnconnected = "Use `help` for help or `login` to log in."
 }
 
 type umBridgeConfig BridgeConfig

+ 12 - 0
example-config.yaml

@@ -167,6 +167,18 @@ bridge:
     # The prefix for commands. Only required in non-management rooms.
     command_prefix: "!wa"
 
+    # Messages sent upon joining a management room.
+    # Markdown is supported. The defaults are listed below.
+    management_room_text:
+        # Sent when joining a room.
+        welcome: "Hello, I'm a WhatsApp bridge bot."
+        # Sent when joining a management room and the user is already logged in.
+        welcome_connected: "Use `help` for help."
+        # Sent when joining a management room and the user is not logged in.
+        welcome_unconnected: "Use `help` for help or `login` to log in."
+        # Optional extra text sent when joining a management room.
+        # additional_help: "This would be some additional text in case you need it."
+
     # End-to-bridge encryption support options.
     #
     # See https://docs.mau.fi/bridges/general/end-to-bridge-encryption.html for more info.

+ 23 - 1
matrix.go

@@ -94,6 +94,13 @@ func (mx *MatrixHandler) joinAndCheckMembers(evt *event.Event, intent *appservic
 	return members
 }
 
+func (mx *MatrixHandler) sendNoticeWithMarkdown(roomID id.RoomID, message string) (*mautrix.RespSendEvent, error) {
+	intent := mx.as.BotIntent()
+	content := format.RenderMarkdown(message, true, false)
+	content.MsgType = event.MsgNotice
+	return intent.SendMessageEvent(roomID, event.EventMessage, content)
+}
+
 func (mx *MatrixHandler) HandleBotInvite(evt *event.Event) {
 	intent := mx.as.BotIntent()
 
@@ -128,11 +135,26 @@ func (mx *MatrixHandler) HandleBotInvite(evt *event.Event) {
 		return
 	}
 
+	_, _ = mx.sendNoticeWithMarkdown(evt.RoomID, mx.bridge.Config.Bridge.ManagementRoomText.Welcome)
+
 	if !hasPuppets && (len(user.ManagementRoom) == 0 || evt.Content.AsMember().IsDirect) {
 		user.SetManagementRoom(evt.RoomID)
-		_, _ = intent.SendNotice(user.ManagementRoom, "This room has been registered as your bridge management/status room. Send `help` to get a list of commands.")
+		_, _ = intent.SendNotice(user.ManagementRoom, "This room has been registered as your bridge management/status room.")
 		mx.log.Debugln(evt.RoomID, "registered as a management room with", evt.Sender)
 	}
+
+	if evt.RoomID == user.ManagementRoom {
+		if user.HasSession() {
+			_, _ = mx.sendNoticeWithMarkdown(evt.RoomID, mx.bridge.Config.Bridge.ManagementRoomText.WelcomeConnected)
+		} else {
+			_, _ = mx.sendNoticeWithMarkdown(evt.RoomID, mx.bridge.Config.Bridge.ManagementRoomText.WelcomeUnconnected)
+		}
+
+		additionalHelp := mx.bridge.Config.Bridge.ManagementRoomText.AdditionalHelp
+		if len(additionalHelp) > 0 {
+			_, _ = mx.sendNoticeWithMarkdown(evt.RoomID, additionalHelp)
+		}
+	}
 }
 
 func (mx *MatrixHandler) handlePrivatePortal(roomID id.RoomID, inviter *User, puppet *Puppet, key database.PortalKey) {

+ 11 - 4
metrics.go

@@ -20,6 +20,7 @@ import (
 	"context"
 	"net/http"
 	"runtime/debug"
+	"sync"
 	"time"
 
 	"github.com/prometheus/client_golang/prometheus"
@@ -58,10 +59,12 @@ type MetricsHandler struct {
 	unencryptedGroupCount   prometheus.Gauge
 	unencryptedPrivateCount prometheus.Gauge
 
-	connected      prometheus.Gauge
-	connectedState map[string]bool
-	loggedIn       prometheus.Gauge
-	loggedInState  map[string]bool
+	connected          prometheus.Gauge
+	connectedState     map[string]bool
+	connectedStateLock sync.Mutex
+	loggedIn           prometheus.Gauge
+	loggedInState      map[string]bool
+	loggedInStateLock  sync.Mutex
 }
 
 func NewMetricsHandler(address string, log log.Logger, db *database.Database) *MetricsHandler {
@@ -168,6 +171,8 @@ func (mh *MetricsHandler) TrackLoginState(jid types.JID, loggedIn bool) {
 	if !mh.running {
 		return
 	}
+	mh.loggedInStateLock.Lock()
+	defer mh.loggedInStateLock.Unlock()
 	currentVal, ok := mh.loggedInState[jid.User]
 	if !ok || currentVal != loggedIn {
 		mh.loggedInState[jid.User] = loggedIn
@@ -183,6 +188,8 @@ func (mh *MetricsHandler) TrackConnectionState(jid types.JID, connected bool) {
 	if !mh.running {
 		return
 	}
+	mh.connectedStateLock.Lock()
+	defer mh.connectedStateLock.Unlock()
 	currentVal, ok := mh.connectedState[jid.User]
 	if !ok || currentVal != connected {
 		mh.connectedState[jid.User] = connected