mirror of
https://codeberg.org/june64/mrvc.git
synced 2026-01-10 16:06:33 +01:00
This is especially useful when using the recursive option as it allows for easier identification of each child room.
146 lines
4.2 KiB
Go
146 lines
4.2 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"slices"
|
|
"sort"
|
|
"strings"
|
|
|
|
"github.com/hashicorp/go-version"
|
|
"github.com/matrix-org/gomatrixserverlib/fclient"
|
|
"maunium.net/go/mautrix"
|
|
"maunium.net/go/mautrix/id"
|
|
|
|
"codeberg.org/june64/mrvc/config"
|
|
"codeberg.org/june64/mrvc/roominfotree"
|
|
)
|
|
|
|
func compareVersionStrings(a, b string) int {
|
|
// Try to parse a and b as versions.
|
|
// Use only the first part of the version string as sometimes there are suffixes after a space, like " (<commit>)", which then can't be parsed.
|
|
aStart := strings.Split(a, " ")[0]
|
|
bStart := strings.Split(b, " ")[0]
|
|
aVersion, aErr := version.NewVersion(aStart)
|
|
bVersion, bErr := version.NewVersion(bStart)
|
|
// An input, which can't be parsed as a version, should be interpreted as being smaller than an input, which can be parsed as a version.
|
|
switch {
|
|
case aErr != nil && bErr == nil:
|
|
return -1
|
|
case aErr == nil && bErr != nil:
|
|
return 1
|
|
case aErr != nil && bErr != nil:
|
|
return strings.Compare(a, b)
|
|
}
|
|
|
|
if cmpResult := aVersion.Compare(bVersion); cmpResult != 0 {
|
|
return cmpResult
|
|
} else {
|
|
// When the versions are equal, look at the potential suffixes in the version string.
|
|
aEnd := strings.TrimPrefix(a, aStart)
|
|
bEnd := strings.TrimPrefix(b, bStart)
|
|
|
|
return strings.Compare(aEnd, bEnd)
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
config := config.Get()
|
|
|
|
userId := id.UserID(config.UserID)
|
|
_, homeserver, err := userId.ParseAndValidate()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
clientWellKnown, err := mautrix.DiscoverClientAPI(context.Background(), homeserver)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
homeserverURL := clientWellKnown.Homeserver.BaseURL
|
|
|
|
client, err := mautrix.NewClient(
|
|
homeserverURL,
|
|
userId,
|
|
config.Token,
|
|
)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
federationClient := fclient.NewClient(
|
|
fclient.WithWellKnownSRVLookups(true),
|
|
fclient.WithTimeout(config.HomeserverVersionInfoTimeout),
|
|
)
|
|
|
|
roomInfoTree := roominfotree.Get(config.Rooms, config.Recursive, config.RecursionMaxDepth, config.RecursionSuggestedOnly, client, federationClient)
|
|
|
|
for roomID, roomInfo := range roomInfoTree {
|
|
fmt.Println("Room:")
|
|
fmt.Printf(" %s -> %d\n", roomID, roomInfo.MemberCount)
|
|
givenAliases := roomInfo.GivenAliases
|
|
if len(givenAliases) > 0 {
|
|
fmt.Println("Given Aliases:")
|
|
for _, alias := range givenAliases {
|
|
fmt.Printf(" %s\n", alias)
|
|
}
|
|
}
|
|
aliases := roomInfo.Aliases
|
|
if len(aliases) > 0 {
|
|
fmt.Println("Aliases:")
|
|
for _, alias := range aliases {
|
|
fmt.Printf(" %s\n", alias)
|
|
}
|
|
}
|
|
|
|
fmt.Println("Version Support:")
|
|
|
|
maxRoomVersionKeys := make([]string, 0, len(roomInfo.MaxRoomVersions))
|
|
for key := range roomInfo.MaxRoomVersions {
|
|
maxRoomVersionKeys = append(maxRoomVersionKeys, key)
|
|
}
|
|
slices.SortFunc(maxRoomVersionKeys, compareVersionStrings)
|
|
for _, maxRoomVersionKey := range maxRoomVersionKeys {
|
|
maxRoomVersionInfo := roomInfo.MaxRoomVersions[maxRoomVersionKey]
|
|
|
|
fmt.Printf(" %s -> %d\n", maxRoomVersionKey, maxRoomVersionInfo.MemberCount)
|
|
|
|
serverKeys := make([]string, 0, len(maxRoomVersionInfo.Servers))
|
|
for key := range maxRoomVersionInfo.Servers {
|
|
serverKeys = append(serverKeys, key)
|
|
}
|
|
sort.Strings(serverKeys)
|
|
for _, serverKey := range serverKeys {
|
|
serverInfo := maxRoomVersionInfo.Servers[serverKey]
|
|
|
|
fmt.Printf(" %s -> %d\n", serverKey, serverInfo.MemberCount)
|
|
|
|
versionKeys := make([]string, 0, len(serverInfo.Versions))
|
|
for key := range serverInfo.Versions {
|
|
versionKeys = append(versionKeys, key)
|
|
}
|
|
slices.SortFunc(versionKeys, compareVersionStrings)
|
|
for _, versionKey := range versionKeys {
|
|
versionInfo := serverInfo.Versions[versionKey]
|
|
|
|
fmt.Printf(" %s -> %d\n", versionKey, versionInfo.MemberCount)
|
|
|
|
if config.PrintHomeserverMemberCount {
|
|
homeserverKeys := make([]string, 0, len(versionInfo.Homeservers))
|
|
for key := range versionInfo.Homeservers {
|
|
homeserverKeys = append(homeserverKeys, key)
|
|
}
|
|
sort.Strings(homeserverKeys)
|
|
for _, homeserverKey := range homeserverKeys {
|
|
homeserverInfo := versionInfo.Homeservers[homeserverKey]
|
|
|
|
fmt.Printf(" %s -> %d\n", homeserverKey, homeserverInfo.MemberCount)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
fmt.Println()
|
|
}
|
|
}
|