mirror of
https://github.com/42wim/matterbridge.git
synced 2024-11-24 11:42:03 -08:00
Add the discord bridge for real
This commit is contained in:
parent
6af82401fc
commit
596096d6da
128
bridge/discord/discord.go
Normal file
128
bridge/discord/discord.go
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
package bdiscord
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/42wim/matterbridge/bridge/config"
|
||||||
|
log "github.com/Sirupsen/logrus"
|
||||||
|
"github.com/bwmarrin/discordgo"
|
||||||
|
)
|
||||||
|
|
||||||
|
type bdiscord struct {
|
||||||
|
c *discordgo.Session
|
||||||
|
Config *config.Protocol
|
||||||
|
Remote chan config.Message
|
||||||
|
protocol string
|
||||||
|
origin string
|
||||||
|
Channels []*discordgo.Channel
|
||||||
|
Nick string
|
||||||
|
}
|
||||||
|
|
||||||
|
var flog *log.Entry
|
||||||
|
var protocol = "discord"
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
flog = log.WithFields(log.Fields{"module": protocol})
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(config config.Protocol, origin string, c chan config.Message) *bdiscord {
|
||||||
|
b := &bdiscord{}
|
||||||
|
b.Config = &config
|
||||||
|
b.Remote = c
|
||||||
|
b.protocol = protocol
|
||||||
|
b.origin = origin
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *bdiscord) Connect() error {
|
||||||
|
var err error
|
||||||
|
flog.Info("Trying " + b.protocol + " connection")
|
||||||
|
b.c, err = discordgo.New(b.Config.Token)
|
||||||
|
if err != nil {
|
||||||
|
flog.Debugf("%#v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
flog.Info("Connection succeeded")
|
||||||
|
b.c.AddHandler(b.messageCreate)
|
||||||
|
err = b.c.Open()
|
||||||
|
if err != nil {
|
||||||
|
flog.Debugf("%#v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
guilds, err := b.c.UserGuilds()
|
||||||
|
if err != nil {
|
||||||
|
flog.Debugf("%#v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
userinfo, err := b.c.User("@me")
|
||||||
|
if err != nil {
|
||||||
|
flog.Debugf("%#v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
b.Nick = userinfo.Username
|
||||||
|
for _, guild := range guilds {
|
||||||
|
if guild.Name == b.Config.Guild {
|
||||||
|
b.Channels, err = b.c.GuildChannels(guild.ID)
|
||||||
|
if err != nil {
|
||||||
|
flog.Debugf("%#v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *bdiscord) FullOrigin() string {
|
||||||
|
return b.protocol + "." + b.origin
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *bdiscord) JoinChannel(channel string) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *bdiscord) Name() string {
|
||||||
|
return b.protocol + "." + b.origin
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *bdiscord) Protocol() string {
|
||||||
|
return b.protocol
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *bdiscord) Origin() string {
|
||||||
|
return b.origin
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *bdiscord) Send(msg config.Message) error {
|
||||||
|
channelID := b.getChannelID(msg.Channel)
|
||||||
|
if channelID == "" {
|
||||||
|
flog.Errorf("Could not find channelID for %v", msg.Channel)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
b.c.ChannelMessageSend(channelID, msg.Username+msg.Text)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *bdiscord) messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) {
|
||||||
|
// not relay our own messages
|
||||||
|
if m.Author.Username == b.Nick {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
b.Remote <- config.Message{Username: m.Author.Username, Text: m.Content, Channel: b.getChannelName(m.ChannelID),
|
||||||
|
Origin: b.origin, Protocol: b.protocol, FullOrigin: b.FullOrigin()}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *bdiscord) getChannelID(name string) string {
|
||||||
|
for _, channel := range b.Channels {
|
||||||
|
if channel.Name == name {
|
||||||
|
return channel.ID
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *bdiscord) getChannelName(id string) string {
|
||||||
|
for _, channel := range b.Channels {
|
||||||
|
if channel.ID == id {
|
||||||
|
return channel.Name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user