aboutsummaryrefslogblamecommitdiff
path: root/main.go
blob: a8a349c199729f02c7619937ebdedfff72a8f050 (plain) (tree)
1
2
3
4
5
6
7
8
9


            

                      
                       
              

               

                   
                   
                
 


                                        

                                                               
                                                                      
                                                                
                                                       

 
                           
                                                    
                                                  

 
                        
                                                                                      
                                                                               





                                                                                

 
                                                                                  
 

                                    
 

                                  
                                             
                                             
                                                    



                                                                    
         
 



                                                                               
 










                                                                        

         
                       
                              

         
                                                  
                       
                              

         
                                                 
                       
                              

         
                          
 
 




                                                       
         
 
                                  



                                                              
                                          
                                       



                                                             
                                                               




                                                               
                                                               





















                                                                              

         
                       
                              

         
                                           
                       
                              

         
                                         
                       
                              

         
                  


             

                                    







                                                         
                                       



                              

                  

                                                     


                                                                                                         
                         
                                            
                                                                                              
                                                  
                                                             
                                                           
                                                  
                                                                         

                                                
                                           
                                                         







                              












                                                           
package main

import (
	"crypto/rand"
	"encoding/hex"
	"encoding/json"
	"flag"
	"fmt"
	_ "fmt"
	"io/ioutil"
	"os"
	_ "strings"
	_ "time"

	log "github.com/sirupsen/logrus"
	"gopkg.in/yaml.v2"

	"git.deuxfleurs.fr/Deuxfleurs/easybridge/connector"
	"git.deuxfleurs.fr/Deuxfleurs/easybridge/connector/irc"
	"git.deuxfleurs.fr/Deuxfleurs/easybridge/connector/mattermost"
	"git.deuxfleurs.fr/Deuxfleurs/easybridge/connector/xmpp"
	"git.deuxfleurs.fr/Deuxfleurs/easybridge/mxlib"
)

type ConfigAccount struct {
	Protocol string            `json:"protocol"`
	Config   map[string]string `json:"config"`
}

type ConfigFile struct {
	ASBindAddr   string                              `json:"appservice_bind_addr"`
	WebBindAddr  string                              `json:"web_bind_addr"`
	Registration string                              `json:"registration"`
	Server       string                              `json:"homeserver_url"`
	DbType       string                              `json:"db_type"`
	DbPath       string                              `json:"db_path"`
	MatrixDomain string                              `json:"matrix_domain"`
	Accounts     map[string]map[string]ConfigAccount `json:"accounts"`
}

var configFlag = flag.String("config", "./config.json", "Configuration file path")

var config *ConfigFile
var registration *mxlib.Registration

func readConfig() ConfigFile {
	config_file := ConfigFile{
		ASBindAddr:   "0.0.0.0:8321",
		WebBindAddr:  "0.0.0.0:8281",
		Registration: "./registration.yaml",
		Server:       "http://localhost:8008",
		DbType:       "sqlite3",
		DbPath:       "easybridge.db",
		Accounts:     map[string]map[string]ConfigAccount{},
	}

	_, err := os.Stat(*configFlag)
	if os.IsNotExist(err) {
		// Generate default config file
		log.Printf("Generating default config file as %s", *configFlag)

		bytes, err := json.MarshalIndent(&config_file, "", "  ")
		if err != nil {
			log.Fatal(err)
		}

		err = ioutil.WriteFile(*configFlag, bytes, 0644)
		if err != nil {
			log.Fatal(err)
		}

		return config_file
	}

	if err != nil {
		log.Fatal(err)
	}

	bytes, err := ioutil.ReadFile(*configFlag)
	if err != nil {
		log.Fatal(err)
	}

	err = json.Unmarshal(bytes, &config_file)
	if err != nil {
		log.Fatal(err)
	}

	return config_file
}

func readRegistration(file string) mxlib.Registration {
	rnd := make([]byte, 64)
	n, err := rand.Read(rnd)
	if err != nil || n != 64 {
		log.Fatal(err)
	}

	reg := mxlib.Registration{
		Id:              "Easybridge",
		Url:             "http://localhost:8321",
		AsToken:         hex.EncodeToString(rnd[:32]),
		HsToken:         hex.EncodeToString(rnd[32:]),
		SenderLocalpart: "_ezbr_",
		RateLimited:     false,
		Namespaces: mxlib.RegistrationNamespaceSet{
			Users: []mxlib.RegistrationNamespace{
				mxlib.RegistrationNamespace{
					Exclusive: true,
					Regex:     "@_ezbr_.*",
				},
			},
			Aliases: []mxlib.RegistrationNamespace{
				mxlib.RegistrationNamespace{
					Exclusive: true,
					Regex:     "#_ezbr_.*",
				},
			},
			Rooms: []mxlib.RegistrationNamespace{},
		},
	}

	_, err = os.Stat(file)
	if os.IsNotExist(err) {
		// Generate default config file
		log.Printf("Generating default registration file as %s", file)

		bytes, err := yaml.Marshal(&reg)
		if err != nil {
			log.Fatal(err)
		}

		err = ioutil.WriteFile(file, bytes, 0644)
		if err != nil {
			log.Fatal(err)
		}

		return reg
	}

	if err != nil {
		log.Fatal(err)
	}

	bytes, err := ioutil.ReadFile(file)
	if err != nil {
		log.Fatal(err)
	}

	err = yaml.Unmarshal(bytes, &reg)
	if err != nil {
		log.Fatal(err)
	}

	return reg
}

func main() {
	log.SetLevel(log.DebugLevel)

	flag.Parse()

	config_file := readConfig()
	config = &config_file

	reg_file := readRegistration(config.Registration)
	registration = &reg_file

	errch, err := StartAppService()
	if err != nil {
		log.Fatal(err)
	}

	StartWeb()

	for user, accounts := range config.Accounts {
		for name, params := range accounts {
			conn := createConnector(params.Protocol)
			if conn == nil {
				log.Fatalf("Could not create connector for protocol %s", params.Protocol)
			}
			account := &Account{
				MatrixUser:  fmt.Sprintf("@%s:%s", user, config.MatrixDomain),
				AccountName: name,
				Protocol:    params.Protocol,
				Config:      params.Config,
				Conn:        conn,
				JoinedRooms: map[connector.RoomID]bool{},
			}
			conn.SetHandler(account)
			AddAccount(account)
			go account.connect(params.Config)
		}
	}

	err = <-errch
	if err != nil {
		log.Fatal(err)
	}
}

func createConnector(protocol string) connector.Connector {
	switch protocol {
	case "irc":
		return &irc.IRC{}
	case "xmpp":
		return &xmpp.XMPP{}
	case "mattermost":
		return &mattermost.Mattermost{}
	default:
		return nil
	}
}