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") }