package main import ( "flag" "fmt" "os" "os/signal" "regexp" "strings" "syscall" "time" bkosmi "github.com/42wim/matterbridge/bridge/kosmi" "github.com/sirupsen/logrus" ) func main() { roomURL := flag.String("room", "https://app.kosmi.io/room/@hyperspaceout", "Kosmi room URL") debug := flag.Bool("debug", false, "Enable debug logging") flag.Parse() log := logrus.New() if *debug { log.SetLevel(logrus.DebugLevel) } else { log.SetLevel(logrus.InfoLevel) } log.SetFormatter(&logrus.TextFormatter{FullTimestamp: true}) logger := log.WithField("bridge", "kosmi-native-test") logger.Info("Starting Kosmi native WebSocket test") logger.Infof("Room URL: %s", *roomURL) roomID, err := extractRoomID(*roomURL) if err != nil { logger.Fatalf("Failed to extract room ID: %v", err) } client := bkosmi.NewGraphQLWSClient(*roomURL, roomID, "", logger) client.OnMessage(func(payload *bkosmi.NewMessagePayload) { username := payload.Data.NewMessage.User.DisplayName if username == "" { username = payload.Data.NewMessage.User.Username } ts := time.Unix(payload.Data.NewMessage.Time, 0) logger.Infof("Received message: [%s] %s: %s", ts.Format("15:04:05"), username, payload.Data.NewMessage.Body) }) logger.Info("Connecting to Kosmi via native WebSocket...") if err := client.Connect(); err != nil { logger.Fatalf("Failed to connect: %v", err) } logger.Info("Successfully connected!") logger.Info("Listening for messages... Press Ctrl+C to exit") sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) go func() { time.Sleep(5 * time.Second) logger.Info("Bridge is running. Messages from Kosmi will appear above.") }() <-sigChan logger.Info("Shutting down...") if err := client.Disconnect(); err != nil { logger.Errorf("Error disconnecting: %v", err) } logger.Info("Goodbye!") } func extractRoomID(url string) (string, error) { url = strings.TrimSuffix(url, "/") re := regexp.MustCompile(`/room/(@?[a-zA-Z0-9_-]+)`) matches := re.FindStringSubmatch(url) if len(matches) >= 2 { roomID := matches[1] if !strings.HasPrefix(roomID, "@") { roomID = "@" + roomID } return roomID, nil } return "", fmt.Errorf("could not extract room ID from URL: %s", url) }