forked from lug/matterbridge
		
	Add the discord bridge for real
This commit is contained in:
		
							
								
								
									
										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 "" | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 Wim
					Wim