42wim/matterbridge

View on GitHub
bridge/steam/steam.go

Summary

Maintainability
A
0 mins
Test Coverage
package bsteam

import (
    "fmt"
    "sync"
    "time"

    "github.com/42wim/matterbridge/bridge"
    "github.com/42wim/matterbridge/bridge/config"
    "github.com/42wim/matterbridge/bridge/helper"
    "github.com/Philipp15b/go-steam"
    "github.com/Philipp15b/go-steam/protocol/steamlang"
    "github.com/Philipp15b/go-steam/steamid"
)

type Bsteam struct {
    c         *steam.Client
    connected chan struct{}
    userMap   map[steamid.SteamId]string
    sync.RWMutex
    *bridge.Config
}

func New(cfg *bridge.Config) bridge.Bridger {
    b := &Bsteam{Config: cfg}
    b.userMap = make(map[steamid.SteamId]string)
    b.connected = make(chan struct{})
    return b
}

func (b *Bsteam) Connect() error {
    b.Log.Info("Connecting")
    b.c = steam.NewClient()
    go b.handleEvents()
    go b.c.Connect()
    select {
    case <-b.connected:
        b.Log.Info("Connection succeeded")
    case <-time.After(time.Second * 30):
        return fmt.Errorf("connection timed out")
    }
    return nil
}

func (b *Bsteam) Disconnect() error {
    b.c.Disconnect()
    return nil

}

func (b *Bsteam) JoinChannel(channel config.ChannelInfo) error {
    id, err := steamid.NewId(channel.Name)
    if err != nil {
        return err
    }
    b.c.Social.JoinChat(id)
    return nil
}

func (b *Bsteam) Send(msg config.Message) (string, error) {
    // ignore delete messages
    if msg.Event == config.EventMsgDelete {
        return "", nil
    }
    id, err := steamid.NewId(msg.Channel)
    if err != nil {
        return "", err
    }

    // Handle files
    if msg.Extra != nil {
        for _, rmsg := range helper.HandleExtra(&msg, b.General) {
            b.c.Social.SendMessage(id, steamlang.EChatEntryType_ChatMsg, rmsg.Username+rmsg.Text)
        }
        for i := range msg.Extra["file"] {
            if err := b.handleFileInfo(&msg, msg.Extra["file"][i]); err != nil {
                b.Log.Error(err)
            }
            b.c.Social.SendMessage(id, steamlang.EChatEntryType_ChatMsg, msg.Username+msg.Text)
        }
        return "", nil
    }

    b.c.Social.SendMessage(id, steamlang.EChatEntryType_ChatMsg, msg.Username+msg.Text)
    return "", nil
}

func (b *Bsteam) getNick(id steamid.SteamId) string {
    b.RLock()
    defer b.RUnlock()
    if name, ok := b.userMap[id]; ok {
        return name
    }
    return "unknown"
}