summaryrefslogtreecommitdiffstats
path: root/bridge/discord
diff options
context:
space:
mode:
authorWim <wim@42.be>2016-09-19 21:05:13 +0200
committerWim <wim@42.be>2016-09-19 21:05:13 +0200
commit596096d6dac2eae4143e6a9b596df309bc2dc2be (patch)
treeeae1052b81c038f37827568bd5edb518ffc5689b /bridge/discord
parent6af82401fca60e899d763709d432c7ae3e918b61 (diff)
downloadmatterbridge-msglm-596096d6dac2eae4143e6a9b596df309bc2dc2be.tar.gz
matterbridge-msglm-596096d6dac2eae4143e6a9b596df309bc2dc2be.tar.bz2
matterbridge-msglm-596096d6dac2eae4143e6a9b596df309bc2dc2be.zip
Add the discord bridge for real
Diffstat (limited to 'bridge/discord')
-rw-r--r--bridge/discord/discord.go128
1 files changed, 128 insertions, 0 deletions
diff --git a/bridge/discord/discord.go b/bridge/discord/discord.go
new file mode 100644
index 00000000..b144392c
--- /dev/null
+++ b/bridge/discord/discord.go
@@ -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 ""
+}