Thumbnail

rani/matterbridge.git

Clone URL: https://git.buni.party/rani/matterbridge.git

commit 599980cbd039c4d56ef20accdaff17f195f5f75d Author: Patrick Connolly <patrick.c.connolly@gmail.com> Date: Fri Nov 09 03:45:40 2018 +0000 Add ability to show when user is typing across Slack bridges (#559) diff --git a/bridge/config/config.go b/bridge/config/config.go index bdf77f8..9d335ca 100644 --- a/bridge/config/config.go +++ b/bridge/config/config.go @@ -236 +237 @@ const (   EVENT_USER_ACTION = "user_action"   EVENT_MSG_DELETE = "msg_delete"   EVENT_API_CONNECTED = "api_connected" + EVENT_USER_TYPING = "user_typing"  )    type Message struct { @@ -1106 +1117 @@ type Protocol struct {   Server string // IRC,mattermost,XMPP,discord   ShowJoinPart bool // all protocols   ShowTopicChange bool // slack + ShowUserTyping bool // slack   ShowEmbeds bool // discord   SkipTLSVerify bool // IRC, mattermost   StripNick bool // all protocols diff --git a/bridge/slack/handlers.go b/bridge/slack/handlers.go index 4307e7b..0f5e140 100644 --- a/bridge/slack/handlers.go +++ b/bridge/slack/handlers.go @@ -237 +239 @@ func (b *Bslack) handleSlack() {   time.Sleep(time.Second)   b.Log.Debug("Start listening for Slack messages")   for message := range messages { - b.Log.Debugf("<= Sending message from %s on %s to gateway", message.Username, b.Account) + if message.Event != config.EVENT_USER_TYPING { + b.Log.Debugf("<= Sending message from %s on %s to gateway", message.Username, b.Account) + }     // cleanup the message   message.Text = b.replaceMention(message.Text) @@ -466 +4814 @@ func (b *Bslack) handleSlackClient(messages chan *config.Message) {   b.Log.Debugf("== Receiving event %#v", msg.Data)   }   switch ev := msg.Data.(type) { + case *slack.UserTypingEvent: + rmsg, err := b.handleTypingEvent(ev) + if err != nil { + b.Log.Errorf("%#v", err) + continue + } + + messages <- rmsg   case *slack.MessageEvent:   if b.skipMessageEvent(ev) {   b.Log.Debugf("Skipped message: %#v", ev) @@ -2256 +23524 @@ func (b *Bslack) handleAttachments(ev *slack.MessageEvent, rmsg *config.Message)    var commentRE = regexp.MustCompile(`.*?commented: (.*)`)   +func (b *Bslack) handleTypingEvent(ev *slack.UserTypingEvent) (*config.Message, error) { + var err error + // use our own func because rtm.GetChannelInfo doesn't work for private channels + channelInfo, err := b.getChannelByID(ev.Channel) + if err != nil { + return nil, err + } + + rmsg := config.Message{ + Channel: channelInfo.Name, + Account: b.Account, + Event: config.EVENT_USER_TYPING, + } + + return &rmsg, nil + +} +  // handleDownloadFile handles file download  func (b *Bslack) handleDownloadFile(rmsg *config.Message, file *slack.File) error {   if b.fileIsAvailable(file) { diff --git a/bridge/slack/slack.go b/bridge/slack/slack.go index 8c96837..701f476 100644 --- a/bridge/slack/slack.go +++ b/bridge/slack/slack.go @@ -1877 +18710 @@ func (b *Bslack) Reload(cfg *bridge.Config) (string, error) {  }    func (b *Bslack) Send(msg config.Message) (string, error) { - b.Log.Debugf("=> Receiving %#v", msg) + // Too noisy to log like other events + if msg.Event != config.EVENT_USER_TYPING { + b.Log.Debugf("=> Receiving %#v", msg) + }     // Make a action /me of the message   if msg.Event == config.EVENT_USER_ACTION { @@ -2666 +26912 @@ func (b *Bslack) sendRTM(msg config.Message) (string, error) {   if err != nil {   return "", fmt.Errorf("could not send message: %v", err)   } + if msg.Event == config.EVENT_USER_TYPING { + if b.GetBool("ShowUserTyping") { + b.rtm.SendMessage(b.rtm.NewTypingMessage(channelInfo.ID)) + } + return "", nil + }     // Delete message   if msg.Event == config.EVENT_MSG_DELETE { diff --git a/gateway/gateway.go b/gateway/gateway.go index d4c8465..3a6fa1e 100644 --- a/gateway/gateway.go +++ b/gateway/gateway.go @@ -2977 +29711 @@ func (gw *Gateway) handleMessage(msg config.Message, dest *bridge.Bridge) []*BrM   continue   }   } - flog.Debugf("=> Sending %#v from %s (%s) to %s (%s)", msg, msg.Account, originchannel, dest.Account, channel.Name) + + // Too noisy to log like other events + if msg.Event != config.EVENT_USER_TYPING { + flog.Debugf("=> Sending %#v from %s (%s) to %s (%s)", msg, msg.Account, originchannel, dest.Account, channel.Name) + }     msg.Channel = channel.Name   msg.Avatar = gw.modifyAvatar(origmsg, dest) @@ -3376 +3419 @@ func (gw *Gateway) ignoreMessage(msg *config.Message) bool {     // check if we need to ignore a empty message   if msg.Text == "" { + if msg.Event == config.EVENT_USER_TYPING { + return false + }   // we have an attachment or actual bytes, do not ignore   if msg.Extra != nil &&   (msg.Extra["attachments"] != nil || diff --git a/matterbridge.toml.sample b/matterbridge.toml.sample index 441a333..d4b2fbb 100644 --- a/matterbridge.toml.sample +++ b/matterbridge.toml.sample @@ -6656 +66512 @@ ShowTopicChange=false  #OPTIONAL (default false)  PreserveThreading=false   +#Enable showing "user_typing" events from across gateway when available. +#Hint: Set your bot/user's "Full Name" to be "Someone", +#and so the message will say "Someone is typing". +#OPTIONAL (default false) +ShowUserTyping=false +  ###################################################################  #discord section  ###################################################################