Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Addmatrix #376

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
765 changes: 765 additions & 0 deletions bridge/matrix/matrix.go

Large diffs are not rendered by default.

24 changes: 24 additions & 0 deletions bridge/matrix/room.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package matrix

import (
"sync"

"maunium.net/go/mautrix/event"
"maunium.net/go/mautrix/id"
)

type User struct {
ID id.UserID
*event.MemberEventContent
}

type Channel struct {
ID id.RoomID
Alias id.RoomAlias
AltAliases []id.RoomAlias
Members map[id.UserID]*User
IsDirect bool
Encrypted bool
Topic string
sync.RWMutex
}
64 changes: 64 additions & 0 deletions bridge/matrix/sync.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package matrix

import (
"fmt"
"time"

"github.com/davecgh/go-spew/spew"
"maunium.net/go/mautrix"
"maunium.net/go/mautrix/event"
"maunium.net/go/mautrix/id"
)

type Syncer struct {
m *Matrix
}

func NewSyncer(m *Matrix) *Syncer {
return &Syncer{
m: m,
}
}

func (s *Syncer) ProcessResponse(resp *mautrix.RespSync, since string) error {
for room, sync := range resp.Rooms.Join {
fmt.Println(room)

for _, ev := range append(append(
append(sync.State.Events, sync.Timeline.Events...),
sync.Ephemeral.Events...),
sync.AccountData.Events...) {
ev.Content.ParseRaw(ev.Type)
ev.RoomID = room
spew.Dump(ev)

switch ev.Type {
case event.StateCanonicalAlias:
s.m.handleCanonicalAlias(mautrix.EventSourceState, ev)
case event.StateRoomName:
s.m.handleRoomName(mautrix.EventSourceState, ev)
case event.StateMember:
s.m.handleMember(mautrix.EventSourceState, ev)
case event.AccountDataDirectChats:
s.m.handleDM(mautrix.EventSourceAccountData, ev)
}
}
return nil
}

return nil
}

func (s *Syncer) OnFailedSync(res *mautrix.RespSync, err error) (time.Duration, error) {
return 10 * time.Second, nil
}

func (s *Syncer) GetFilterJSON(userID id.UserID) *mautrix.Filter {
return &mautrix.Filter{
Room: mautrix.RoomFilter{
Timeline: mautrix.FilterPart{
Limit: 50,
},
},
}
}
21 changes: 8 additions & 13 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,29 +1,24 @@
module github.com/42wim/matterircd

require (
github.com/42wim/matterbridge v1.21.0
github.com/davecgh/go-spew v1.1.1
github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f
github.com/google/gops v0.3.11
github.com/google/gops v0.3.14
github.com/gorilla/websocket v1.4.2
github.com/hashicorp/golang-lru v0.5.4
github.com/jpillora/backoff v1.0.0
github.com/kr/pretty v0.2.0 // indirect
github.com/matterbridge/logrus-prefixed-formatter v0.5.3-0.20200523233437-d971309a77ba
github.com/mattermost/mattermost-server/v5 v5.25.2
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
github.com/mitchellh/mapstructure v1.2.3
github.com/mattermost/mattermost-server/v5 v5.30.1
github.com/mitchellh/mapstructure v1.3.3
github.com/muesli/reflow v0.1.0
github.com/onsi/gomega v1.5.0 // indirect
github.com/sirupsen/logrus v1.6.0
github.com/slack-go/slack v0.6.6
github.com/sirupsen/logrus v1.7.0
github.com/slack-go/slack v0.7.4
github.com/sorcix/irc v1.1.4
github.com/spf13/pflag v1.0.5
github.com/spf13/viper v1.7.0
github.com/spf13/viper v1.7.1
github.com/stretchr/testify v1.6.1
github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de // indirect
golang.org/x/tools v0.0.0-20200529172331-a64b76657301 // indirect
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c // indirect
maunium.net/go/mautrix v0.8.0
)

//replace github.com/nlopes/slack v0.6.0 => github.com/matterbridge/slack v0.1.1-0.20191208194820-95190f11bfb6
Expand Down
731 changes: 656 additions & 75 deletions go.sum

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions mm-go-irckit/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ const handshakeMsgTolerance = 20

// ID will normalize a name to be used as a unique identifier for comparison.
func ID(s string) string {
if strings.HasPrefix(s, "!") {
return s
}

return strings.ToLower(s)
}

Expand Down
3 changes: 2 additions & 1 deletion mm-go-irckit/server_commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,7 @@ func CmdPrivMsg(s Server, u *User, msg *irc.Message) error {
// or a user
if toUser, exists := s.HasUser(query); exists {
switch {
case query == "mattermost" || query == "slack":
case query == "mattermost" || query == "slack" || query == "matrix":
go u.handleServiceBot(query, toUser, msg.Trailing)
msg.Trailing = "<redacted>"
case toUser.Ghost, toUser.Me:
Expand All @@ -421,6 +421,7 @@ func CmdPrivMsg(s Server, u *User, msg *irc.Message) error {

msgID, err2 := u.br.MsgUser(toUser.User, msg.Trailing)
if err2 != nil {
u.MsgSpoofUser(u, u.br.Protocol(), "msg: "+msg.Trailing+" could not be send: "+err2.Error())
return err
}
u.msgLastMutex.Lock()
Expand Down
50 changes: 50 additions & 0 deletions mm-go-irckit/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,56 @@ func login(u *User, toUser *User, args []string, service string) {
return
}

if service == "matrix" {
var err error

if len(args) != 1 && len(args) != 3 {
u.MsgUser(toUser, "need LOGIN <server> <login> <pass> or LOGIN <token>")
return
}

if len(args) == 1 {
u.Credentials.Token = args[len(args)-1]
}

if u.Credentials.Token == "help" {
u.MsgUser(toUser, "need LOGIN <server> <login> <pass> or LOGIN <token>")
return
}

if len(args) == 3 {
u.Credentials = bridge.Credentials{
Server: args[0],
Login: args[1],
Pass: args[2],
}
}

if u.br != nil && u.br.Connected() {
err = u.br.Logout()
if err != nil {
u.MsgUser(toUser, err.Error())
return
}
}

u.inprogress = true
defer func() { u.inprogress = false }()

err = u.loginTo("matrix")
if err != nil {
u.MsgUser(toUser, err.Error())
return
}

u.MsgUser(toUser, "login OK")
if u.Credentials.Token != "" {
u.MsgUser(toUser, "token used: "+u.Credentials.Token)
}

return
}

if service == "slack" {
var err error

Expand Down
21 changes: 15 additions & 6 deletions mm-go-irckit/userbridge.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"time"

"github.com/42wim/matterircd/bridge"
"github.com/42wim/matterircd/bridge/matrix"
"github.com/42wim/matterircd/bridge/mattermost"
"github.com/42wim/matterircd/bridge/slack"
"github.com/davecgh/go-spew/spew"
Expand All @@ -32,6 +33,7 @@ type UserBridge struct {
msgMapMutex sync.RWMutex //nolint:structcheck
updateCounter map[string]time.Time //nolint:structcheck
updateCounterMutex sync.Mutex //nolint:structcheck
eventChan chan *bridge.Event //nolint:structcheck
}

func NewUserBridge(c net.Conn, srv Server, cfg *viper.Viper) *User {
Expand All @@ -48,16 +50,18 @@ func NewUserBridge(c net.Conn, srv Server, cfg *viper.Viper) *User {
u.msgMap = make(map[string]map[string]int)
u.msgCounter = make(map[string]int)
u.updateCounter = make(map[string]time.Time)
u.eventChan = make(chan *bridge.Event, 10000)

// used for login
u.createService("mattermost", "loginservice")
u.createService("slack", "loginservice")
u.createService("matrix", "loginservice")
u.createService("matterircd", "systemservice")
return u
}

func (u *User) handleEventChan(events chan *bridge.Event) {
for event := range events {
func (u *User) handleEventChan() {
for event := range u.eventChan {
logger.Tracef("eventchan %s", spew.Sdump(event))
switch e := event.Data.(type) {
case *bridge.ChannelMessageEvent:
Expand Down Expand Up @@ -482,6 +486,7 @@ func (u *User) addUsersToChannels() {
// create and join the users
users := u.CreateUsersFromInfo(u.br.GetUsers())
srv.BatchAdd(users)
fmt.Println("GOT USERS", len(users))
u.addUsersToChannel(users, "&users", "&users")

// join ourself
Expand Down Expand Up @@ -510,6 +515,8 @@ func (u *User) addUsersToChannels() {
}

close(channels)

go u.handleEventChan()
}

func (u *User) createSpoof(mmchannel *bridge.ChannelInfo) func(string, string) {
Expand Down Expand Up @@ -745,13 +752,15 @@ func (u *User) isValidServer(server, protocol string) bool {
func (u *User) loginTo(protocol string) error {
var err error

eventChan := make(chan *bridge.Event)
//eventChan := make(chan *bridge.Event, 10000)

switch protocol {
case "slack":
u.br, err = slack.New(u.v, u.Credentials, eventChan, u.addUsersToChannels)
u.br, err = slack.New(u.v, u.Credentials, u.eventChan, u.addUsersToChannels)
case "mattermost":
u.br, _, err = mattermost.New(u.v, u.Credentials, eventChan, u.addUsersToChannels)
u.br, _, err = mattermost.New(u.v, u.Credentials, u.eventChan, u.addUsersToChannels)
case "matrix":
u.br, _, err = matrix.New(u.v, u.Credentials, u.eventChan, u.addUsersToChannels)
}

if err != nil {
Expand All @@ -768,7 +777,7 @@ func (u *User) loginTo(protocol string) error {
u.User = info.User
u.MentionKeys = info.MentionKeys

go u.handleEventChan(eventChan)
//go u.handleEventChan(eventChan)

return nil
}
Expand Down
Loading