4
0
mirror of https://github.com/cwinfo/matterbridge.git synced 2025-06-26 23:29:25 +00:00

Compare commits

..

15 Commits

Author SHA1 Message Date
Wim
6bef998bb3 Release v1.12.2 2018-12-04 10:26:29 +01:00
Wim
919a0309ad Update changelog 2018-12-04 10:24:44 +01:00
Wim
95bcca7335 Fix multiple channel join regression. Closes #639 2018-12-04 10:21:52 +01:00
Wim
c78bd24c61 Make slack-legacy change less restrictive (#626) 2018-12-04 10:21:38 +01:00
Wim
d2cfd235ef Release v1.12.1 2018-11-29 00:09:18 +01:00
Wim
f8bf7f8d76 Update changelog 2018-11-29 00:08:58 +01:00
Wim
8432330cb2 Fix regression on using server ID (discord). #619 #617 2018-11-29 00:04:55 +01:00
Wim
02577a2b5c Make sure threaded files stay in thread (slack). Fixes #590 2018-11-29 00:04:54 +01:00
Wim
73501739d5 Do not post empty messages (slack). Fixes #574 2018-11-29 00:04:53 +01:00
Wim
ba674af5d4 Handle deleted/edited thread starting messages (slack). Fixes #600 (#605) 2018-11-29 00:04:53 +01:00
3c85d937c6 Remove double " from Discord gateway webhookurl= (#607) 2018-11-29 00:04:53 +01:00
Wim
c6fd65d1d7 Limit discord username via webhook to 32 chars 2018-11-23 20:52:31 +01:00
Wim
0795906533 Rework connection logic (irc)
If IRC connection fails on first connect, bail out.
Wait until after nickserv auth until joining channels (also after reconnects)
Don't do a separate irc timeout, some connections take a while #503
2018-11-23 00:26:50 +01:00
Wim
a2b45bc799 Fix Nickserv logic (irc) #602 2018-11-22 22:46:38 +01:00
Wim
757657f29c Bump version 2018-11-19 21:49:21 +01:00
7 changed files with 87 additions and 34 deletions

View File

@ -76,9 +76,10 @@ func (b *Bdiscord) Connect() error {
if err != nil {
return err
}
serverName := strings.Replace(b.GetString("Server"), "ID:", "", -1)
b.Nick = userinfo.Username
for _, guild := range guilds {
if guild.Name == b.GetString("Server") {
if guild.Name == serverName || guild.ID == serverName {
b.Channels, err = b.c.GuildChannels(guild.ID)
b.guildID = guild.ID
if err != nil {
@ -164,6 +165,10 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {
msg.Text = helper.ClipMessage(msg.Text, MessageLength)
msg.Text = b.replaceUserMentions(msg.Text)
// discord username must be [0..32] max
if len(msg.Username) > 32 {
msg.Username = msg.Username[0:32]
}
err := b.c.WebhookExecute(
wID,
wToken,

View File

@ -31,9 +31,9 @@ type Birc struct {
i *girc.Client
Nick string
names map[string][]string
connected chan struct{}
connected chan error
Local chan config.Message // local queue for flood control
FirstConnection bool
FirstConnection, authDone bool
MessageDelay, MessageQueue, MessageLength int
*bridge.Config
@ -44,7 +44,7 @@ func New(cfg *bridge.Config) bridge.Bridger {
b.Config = cfg
b.Nick = b.GetString("Nick")
b.names = make(map[string][]string)
b.connected = make(chan struct{})
b.connected = make(chan error)
if b.GetInt("MessageDelay") == 0 {
b.MessageDelay = 1300
} else {
@ -116,14 +116,18 @@ func (b *Birc) Connect() error {
i.Handlers.Add(girc.RPL_WELCOME, b.handleNewConnection)
i.Handlers.Add(girc.RPL_ENDOFMOTD, b.handleOtherAuth)
i.Handlers.Add(girc.ALL_EVENTS, b.handleOther)
go func() {
for {
if err := i.Connect(); err != nil {
b.Log.Errorf("disconnect: error: %s", err)
if b.FirstConnection {
b.connected <- err
return
}
} else {
b.Log.Info("disconnect: client requested quit")
}
b.Log.Info("reconnecting in 30 seconds...")
time.Sleep(30 * time.Second)
i.Handlers.Clear(girc.RPL_WELCOME)
@ -135,13 +139,12 @@ func (b *Birc) Connect() error {
}
}()
b.i = i
select {
case <-b.connected:
b.Log.Info("Connection succeeded")
case <-time.After(time.Second * 30):
return fmt.Errorf("connection timed out")
err = <-b.connected
if err != nil {
return fmt.Errorf("connection failed %s", err)
}
//i.Debug = false
b.Log.Info("Connection succeeded")
b.FirstConnection = false
if b.GetInt("DebugLevel") == 0 {
i.Handlers.Clear(girc.ALL_EVENTS)
}
@ -156,6 +159,13 @@ func (b *Birc) Disconnect() error {
}
func (b *Birc) JoinChannel(channel config.ChannelInfo) error {
// need to check if we have nickserv auth done before joining channels
for {
if b.authDone {
break
}
time.Sleep(time.Second)
}
if channel.Options.Key != "" {
b.Log.Debugf("using key %s for channel %s", channel.Options.Key, channel.Name)
b.i.Cmd.JoinKey(channel.Name, channel.Options.Key)
@ -287,7 +297,6 @@ func (b *Birc) handleNewConnection(client *girc.Client, event girc.Event) {
i := b.i
b.Nick = event.Params[0]
i.Handlers.Add(girc.RPL_ENDOFMOTD, b.handleOtherAuth)
i.Handlers.Add("PRIVMSG", b.handlePrivMsg)
i.Handlers.Add("CTCP_ACTION", b.handlePrivMsg)
i.Handlers.Add(girc.RPL_TOPICWHOTIME, b.handleTopicWhoTime)
@ -296,8 +305,6 @@ func (b *Birc) handleNewConnection(client *girc.Client, event girc.Event) {
i.Handlers.Add("PART", b.handleJoinPart)
i.Handlers.Add("QUIT", b.handleJoinPart)
i.Handlers.Add("KICK", b.handleJoinPart)
// we are now fully connected
b.connected <- struct{}{}
}
func (b *Birc) handleJoinPart(client *girc.Client, event girc.Event) {
@ -334,8 +341,7 @@ func (b *Birc) handleJoinPart(client *girc.Client, event girc.Event) {
func (b *Birc) handleNotice(client *girc.Client, event girc.Event) {
if strings.Contains(event.String(), "This nickname is registered") && event.Source.Name == b.GetString("NickServNick") {
b.Log.Debugf("Sending identify to nickserv %s", b.GetString("NickServNick"))
b.i.Cmd.Message(b.GetString("NickServNick"), "IDENTIFY "+b.GetString("NickServPassword"))
b.handleNickServ()
} else {
b.handlePrivMsg(client, event)
}
@ -357,10 +363,9 @@ func (b *Birc) handleOther(client *girc.Client, event girc.Event) {
}
func (b *Birc) handleOtherAuth(client *girc.Client, event girc.Event) {
if strings.EqualFold(b.GetString("NickServNick"), "Q@CServe.quakenet.org") {
b.Log.Debugf("Authenticating %s against %s", b.GetString("NickServUsername"), b.GetString("NickServNick"))
b.i.Cmd.Message(b.GetString("NickServNick"), "AUTH "+b.GetString("NickServUsername")+" "+b.GetString("NickServPassword"))
}
b.handleNickServ()
// we are now fully connected
b.connected <- nil
}
func (b *Birc) skipPrivMsg(event girc.Event) bool {
@ -464,3 +469,17 @@ func (b *Birc) storeNames(client *girc.Client, event girc.Event) {
func (b *Birc) formatnicks(nicks []string) string {
return strings.Join(nicks, ", ") + " currently on IRC"
}
func (b *Birc) handleNickServ() {
if !b.GetBool("UseSASL") && b.GetString("NickServNick") != "" && b.GetString("NickServPassword") != "" {
b.Log.Debugf("Sending identify to nickserv %s", b.GetString("NickServNick"))
b.i.Cmd.Message(b.GetString("NickServNick"), "IDENTIFY "+b.GetString("NickServPassword"))
}
if strings.EqualFold(b.GetString("NickServNick"), "Q@CServe.quakenet.org") {
b.Log.Debugf("Authenticating %s against %s", b.GetString("NickServUsername"), b.GetString("NickServNick"))
b.i.Cmd.Message(b.GetString("NickServNick"), "AUTH "+b.GetString("NickServUsername")+" "+b.GetString("NickServPassword"))
}
// give nickserv some slack
time.Sleep(time.Second * 5)
b.authDone = true
}

View File

@ -202,6 +202,13 @@ func (b *Bslack) handleStatusEvent(ev *slack.MessageEvent, rmsg *config.Message)
rmsg.Event = config.EventJoinLeave
case sChannelTopic, sChannelPurpose:
rmsg.Event = config.EventTopicChange
case sMessageChanged:
rmsg.Text = ev.SubMessage.Text
// handle deleted thread starting messages
if ev.SubMessage.Text == "This message was deleted." {
rmsg.Event = config.EventMsgDelete
return true
}
case sMessageDeleted:
rmsg.Text = config.EventMsgDelete
rmsg.Event = config.EventMsgDelete

View File

@ -48,6 +48,7 @@ const (
sChannelLeave = "channel_leave"
sChannelJoined = "channel_joined"
sMemberJoined = "member_joined_channel"
sMessageChanged = "message_changed"
sMessageDeleted = "message_deleted"
sSlackAttachment = "slack_attachment"
sPinnedItem = "pinned_item"
@ -76,14 +77,9 @@ func New(cfg *bridge.Config) bridge.Bridger {
// Print a deprecation warning for legacy non-bot tokens (#527).
token := cfg.GetString(tokenConfig)
if token != "" && !strings.HasPrefix(token, "xoxb") {
cfg.Log.Error("Non-bot token detected. It is STRONGLY recommended to use a proper bot-token instead.")
cfg.Log.Error("Legacy tokens may be deprecated by Slack at short notice. See the Matterbridge GitHub wiki for a migration guide.")
cfg.Log.Error("See https://github.com/42wim/matterbridge/wiki/Slack-bot-setup")
cfg.Log.Error("")
cfg.Log.Error("To continue using a legacy token please move your configuration to a \"slack-legacy\" bridge instead.")
cfg.Log.Error("See https://github.com/42wim/matterbridge/wiki/Section-Slack-(basic)#legacy-configuration)")
cfg.Log.Error("Delaying start of bridge by 30 seconds. Future Matterbridge release will fail here unless you use a \"slack-legacy\" bridge.")
time.Sleep(30 * time.Second)
cfg.Log.Warn("Non-bot token detected. It is STRONGLY recommended to use a proper bot-token instead.")
cfg.Log.Warn("Legacy tokens may be deprecated by Slack at short notice. See the Matterbridge GitHub wiki for a migration guide.")
cfg.Log.Warn("See https://github.com/42wim/matterbridge/wiki/Slack-bot-setup")
return NewLegacy(cfg)
}
return newBridge(cfg)
@ -356,6 +352,10 @@ func (b *Bslack) editMessage(msg *config.Message, channelInfo *slack.Channel) (b
}
func (b *Bslack) postMessage(msg *config.Message, messageParameters *slack.PostMessageParameters, channelInfo *slack.Channel) (string, error) {
// don't post empty messages
if msg.Text == "" {
return "", nil
}
for {
_, id, err := b.rtm.PostMessage(channelInfo.ID, msg.Text, *messageParameters)
if err == nil {
@ -385,11 +385,16 @@ func (b *Bslack) uploadFile(msg *config.Message, channelID string) {
ts := time.Now()
b.Log.Debugf("Adding file %s to cache at %s with timestamp", fi.Name, ts.String())
b.cache.Add("filename"+fi.Name, ts)
initialComment := fmt.Sprintf("File from %s", msg.Username)
if fi.Comment != "" {
initialComment += fmt.Sprintf("with comment: %s", fi.Comment)
}
res, err := b.sc.UploadFile(slack.FileUploadParameters{
Reader: bytes.NewReader(*fi.Data),
Filename: fi.Name,
Channels: []string{channelID},
InitialComment: fi.Comment,
Reader: bytes.NewReader(*fi.Data),
Filename: fi.Name,
Channels: []string{channelID},
InitialComment: initialComment,
ThreadTimestamp: msg.ParentID,
})
if err != nil {
b.Log.Errorf("uploadfile %#v", err)

View File

@ -1,3 +1,20 @@
# v1.12.2
## Bugfix
* irc: Fix multiple channel join regression. Closes #639
* slack: Make slack-legacy change less restrictive (#626)
# v1.12.1
## Bugfix
* discord: fix regression on server ID connection #619 #617
* discord: Limit discord username via webhook to 32 chars
* slack: Make sure threaded files stay in thread (slack). Fixes #590
* slack: Do not post empty messages (slack). Fixes #574
* slack: Handle deleted/edited thread starting messages (slack). Fixes #600 (#605)
* irc: Rework connection logic (irc)
* irc: Fix Nickserv logic (irc) #602
# v1.12.0
## Breaking changes

View File

@ -14,7 +14,7 @@ import (
)
var (
version = "1.12.0"
version = "1.12.2"
githash string
)

View File

@ -1389,7 +1389,7 @@ enable=true
#OPTIONAL - webhookurl only works for discord (it needs a different URL for each cahnnel)
[gateway.inout.options]
webhookurl=""https://discordapp.com/api/webhooks/123456789123456789/C9WPqExYWONPDZabcdef-def1434FGFjstasJX9pYht73y"
webhookurl="https://discordapp.com/api/webhooks/123456789123456789/C9WPqExYWONPDZabcdef-def1434FGFjstasJX9pYht73y"
#API example
#[[gateway.inout]]