Add quick & dirty sshchat support (https://github.com/shazow/ssh-chat)
This commit is contained in:
parent
ed9118b346
commit
67a9d133e9
|
@ -10,6 +10,7 @@ import (
|
||||||
"github.com/42wim/matterbridge/bridge/mattermost"
|
"github.com/42wim/matterbridge/bridge/mattermost"
|
||||||
"github.com/42wim/matterbridge/bridge/rocketchat"
|
"github.com/42wim/matterbridge/bridge/rocketchat"
|
||||||
"github.com/42wim/matterbridge/bridge/slack"
|
"github.com/42wim/matterbridge/bridge/slack"
|
||||||
|
"github.com/42wim/matterbridge/bridge/sshchat"
|
||||||
"github.com/42wim/matterbridge/bridge/steam"
|
"github.com/42wim/matterbridge/bridge/steam"
|
||||||
"github.com/42wim/matterbridge/bridge/telegram"
|
"github.com/42wim/matterbridge/bridge/telegram"
|
||||||
"github.com/42wim/matterbridge/bridge/xmpp"
|
"github.com/42wim/matterbridge/bridge/xmpp"
|
||||||
|
@ -79,6 +80,9 @@ func New(cfg *config.Config, bridge *config.Bridge, c chan config.Message) *Brid
|
||||||
case "steam":
|
case "steam":
|
||||||
b.Config = cfg.Steam[name]
|
b.Config = cfg.Steam[name]
|
||||||
b.Bridger = bsteam.New(cfg.Steam[name], bridge.Account, c)
|
b.Bridger = bsteam.New(cfg.Steam[name], bridge.Account, c)
|
||||||
|
case "sshchat":
|
||||||
|
b.Config = cfg.Sshchat[name]
|
||||||
|
b.Bridger = bsshchat.New(cfg.Sshchat[name], bridge.Account, c)
|
||||||
case "api":
|
case "api":
|
||||||
b.Config = cfg.Api[name]
|
b.Config = cfg.Api[name]
|
||||||
b.Bridger = api.New(cfg.Api[name], bridge.Account, c)
|
b.Bridger = api.New(cfg.Api[name], bridge.Account, c)
|
||||||
|
|
|
@ -141,6 +141,7 @@ type Config struct {
|
||||||
Discord map[string]Protocol
|
Discord map[string]Protocol
|
||||||
Telegram map[string]Protocol
|
Telegram map[string]Protocol
|
||||||
Rocketchat map[string]Protocol
|
Rocketchat map[string]Protocol
|
||||||
|
Sshchat map[string]Protocol
|
||||||
General Protocol
|
General Protocol
|
||||||
Gateway []Gateway
|
Gateway []Gateway
|
||||||
SameChannelGateway []SameChannelGateway
|
SameChannelGateway []SameChannelGateway
|
||||||
|
|
|
@ -0,0 +1,138 @@
|
||||||
|
package bsshchat
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"github.com/42wim/matterbridge/bridge/config"
|
||||||
|
log "github.com/Sirupsen/logrus"
|
||||||
|
"github.com/shazow/ssh-chat/sshd"
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Bsshchat struct {
|
||||||
|
r *bufio.Scanner
|
||||||
|
w io.WriteCloser
|
||||||
|
Config *config.Protocol
|
||||||
|
Remote chan config.Message
|
||||||
|
Account string
|
||||||
|
}
|
||||||
|
|
||||||
|
var flog *log.Entry
|
||||||
|
var protocol = "sshchat"
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
flog = log.WithFields(log.Fields{"module": protocol})
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(cfg config.Protocol, account string, c chan config.Message) *Bsshchat {
|
||||||
|
b := &Bsshchat{}
|
||||||
|
b.Config = &cfg
|
||||||
|
b.Account = account
|
||||||
|
b.Remote = c
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bsshchat) Connect() error {
|
||||||
|
var err error
|
||||||
|
flog.Infof("Connecting %s", b.Config.Server)
|
||||||
|
go func() {
|
||||||
|
err = sshd.ConnectShell(b.Config.Server, b.Config.Nick, func(r io.Reader, w io.WriteCloser) error {
|
||||||
|
b.r = bufio.NewScanner(r)
|
||||||
|
b.w = w
|
||||||
|
b.r.Scan()
|
||||||
|
w.Write([]byte("/theme mono\r\n"))
|
||||||
|
b.handleSshChat()
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}()
|
||||||
|
if err != nil {
|
||||||
|
flog.Debugf("%#v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
flog.Info("Connection succeeded")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bsshchat) Disconnect() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bsshchat) JoinChannel(channel config.ChannelInfo) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bsshchat) Send(msg config.Message) (string, error) {
|
||||||
|
// ignore delete messages
|
||||||
|
if msg.Event == config.EVENT_MSG_DELETE {
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
flog.Debugf("Receiving %#v", msg)
|
||||||
|
if msg.Extra != nil {
|
||||||
|
if len(msg.Extra["file"]) > 0 {
|
||||||
|
for _, f := range msg.Extra["file"] {
|
||||||
|
fi := f.(config.FileInfo)
|
||||||
|
if fi.URL != "" {
|
||||||
|
msg.Text = fi.URL
|
||||||
|
}
|
||||||
|
b.w.Write([]byte(msg.Username + msg.Text))
|
||||||
|
}
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b.w.Write([]byte(msg.Username + msg.Text + "\r\n"))
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
func (b *Bsshchat) sshchatKeepAlive() chan bool {
|
||||||
|
done := make(chan bool)
|
||||||
|
go func() {
|
||||||
|
ticker := time.NewTicker(90 * time.Second)
|
||||||
|
defer ticker.Stop()
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-ticker.C:
|
||||||
|
flog.Debugf("PING")
|
||||||
|
err := b.xc.PingC2S("", "")
|
||||||
|
if err != nil {
|
||||||
|
flog.Debugf("PING failed %#v", err)
|
||||||
|
}
|
||||||
|
case <-done:
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
return done
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
func stripPrompt(s string) string {
|
||||||
|
pos := strings.LastIndex(s, "\033[K")
|
||||||
|
if pos < 0 {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
return s[pos+3:]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bsshchat) handleSshChat() error {
|
||||||
|
/*
|
||||||
|
done := b.sshchatKeepAlive()
|
||||||
|
defer close(done)
|
||||||
|
*/
|
||||||
|
wait := true
|
||||||
|
for {
|
||||||
|
if b.r.Scan() {
|
||||||
|
res := strings.Split(stripPrompt(b.r.Text()), ":")
|
||||||
|
if res[0] == "-> Set theme" {
|
||||||
|
wait = false
|
||||||
|
log.Debugf("mono found, allowing")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if !wait {
|
||||||
|
flog.Debugf("message %#v", res)
|
||||||
|
rmsg := config.Message{Username: res[0], Text: strings.Join(res[1:], ":"), Channel: "sshchat", Account: b.Account, UserID: "nick"}
|
||||||
|
b.Remote <- rmsg
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue