notify/main.go

144 lines
2.9 KiB
Go

package main
import (
"crypto/tls"
"fmt"
"log"
"os"
"strings"
"sync"
"github.com/matrix-org/gomatrix"
irc "github.com/thoj/go-ircevent"
)
func notifyMatrix(url string, room string, user string, token string, msg string) error {
server := url
if server == "" {
server = "https://matrix.org"
}
if token == "" || user == "" || msg == "" {
return fmt.Errorf("'matrix_user', 'matrix_access_token', and 'matrix_msg' are required")
}
matrixClient, err := gomatrix.NewClient(server, "", "")
if err != nil {
return err
}
matrixClient.SetCredentials(user, token)
_, err = matrixClient.JoinRoom(room, "", nil)
if err != nil {
return err
}
_, err = matrixClient.SendMessageEvent(room, "m.room.message", gomatrix.TextMessage{
Body: msg,
FormattedBody: msg,
Format: "org.matrix.custom.html",
MsgType: "m.text",
})
if err != nil {
return err
}
return nil
}
func notifyIRC(server string, channel string, nick string, pass string, msg string) error {
ircServer := server
if ircServer == "" {
ircServer = "irc.libera.chat:6697"
}
serverDomain := strings.Split(ircServer, ":")[0]
irccon := irc.IRC(nick, nick)
if pass != "" {
irccon.Password = pass
}
irccon.UseTLS = true
irccon.TLSConfig = &tls.Config{ServerName: serverDomain}
err := irccon.Connect(ircServer)
if err != nil {
return err
}
defer irccon.Quit()
irccon.AddCallback("001", func(e *irc.Event) {
fmt.Println("Joining IRC channel: " + channel)
irccon.Join(channel)
})
irccon.AddCallback("366", func(e *irc.Event) {
fmt.Println("Posting on the IRC channel...")
irccon.Privmsg(channel, msg)
irccon.Quit()
})
irccon.Loop()
return nil
}
func main() {
matrixURL := os.Getenv("PLUGIN_MATRIX_URL")
matrixRoomID := os.Getenv("PLUGIN_MATRIX_ROOM_ID")
matrixUser := os.Getenv("PLUGIN_MATRIX_USER")
matrixAccessToken := os.Getenv("PLUGIN_MATRIX_ACCESS_TOKEN")
matrixMsg := os.Getenv("PLUGIN_MATRIX_MSG")
ircServer := os.Getenv("PLUGIN_IRC_SERVER")
ircChannel := os.Getenv("PLUGIN_IRC_CHANNEL")
ircNickname := os.Getenv("PLUGIN_IRC_NICKNAME")
ircPassword := os.Getenv("PLUGIN_IRC_PASSWORD")
ircMsg := os.Getenv("PLUGIN_IRC_MSG")
var waitGroup sync.WaitGroup
c := make(chan error)
waitGroup.Add(2)
go func() {
waitGroup.Wait()
close(c)
}()
go func() {
defer waitGroup.Done()
var err error = nil
if matrixRoomID != "" {
err = notifyMatrix(matrixURL, matrixRoomID, matrixUser, matrixAccessToken, matrixMsg)
}
c <- err
}()
go func() {
defer waitGroup.Done()
var err error = nil
if ircChannel != "" {
err = notifyIRC(ircServer, ircChannel, ircNickname, ircPassword, ircMsg)
}
c <- err
}()
var errs []error
for err := range c {
if err != nil {
errs = append(errs, err)
fmt.Println("Error: " + err.Error())
}
}
if len(errs) > 0 {
log.Fatal("Notify Faild!")
return
}
log.Println("Message sent successfully")
}