1
0
Fork 0
mirror of https://codeberg.org/june64/mrvc.git synced 2026-01-10 16:06:33 +01:00

introduce extendable tree structure for holding the nested room infos

Instead of creating a nested map on demand for the nested room infos,
move to an extendable tree structure described by explicit types. This
makes the information structure clearer and allows for easily adding
information at various levels in the future.
This commit is contained in:
June 2025-08-17 21:07:52 +02:00
commit 77d5d33c45
Signed by: june
SSH key fingerprint: SHA256:o9EAq4Y9N9K0pBQeBTqhSDrND5E7oB+60ZNx0U1yPe0

85
main.go
View file

@ -41,6 +41,28 @@ type VersionPath struct {
Version string Version string
} }
type RoomInfoTree map[id.RoomID](*RoomInfo)
type RoomInfo struct {
MaxRoomVersions map[string](*MaxRoomVersionInfo)
}
type MaxRoomVersionInfo struct {
Servers map[string](*ServerInfo)
}
type ServerInfo struct {
Versions map[string](*VersionInfo)
}
type VersionInfo struct {
Homeservers map[string](*HomeserverInfo)
}
type HomeserverInfo struct {
MemberCount uint
}
var unknownServerVersionInfo = fclient.Version{ var unknownServerVersionInfo = fclient.Version{
Server: struct { Server: struct {
Name string `json:"name"` Name string `json:"name"`
@ -362,7 +384,7 @@ func main() {
serverVersionInfoByHomeserver := getServerVersionInfoByHomeserver(homeservers, federationClient) serverVersionInfoByHomeserver := getServerVersionInfoByHomeserver(homeservers, federationClient)
// Info map tree. // Info map tree.
roomMaxVersionInfos := make(map[id.RoomID](map[string](map[string](map[string](map[string]uint))))) roomInfoTree := make(RoomInfoTree)
// Member counters. // Member counters.
membersByRoomID := make(map[id.RoomID]uint) membersByRoomID := make(map[id.RoomID]uint)
membersByMaxRoomVersion := make(map[MaxRoomVersionPath]uint) membersByMaxRoomVersion := make(map[MaxRoomVersionPath]uint)
@ -381,77 +403,82 @@ func main() {
membersByServerPath[ServerPath{roomID, maxRoomVersion, serverVersionInfo.Server.Name}] += members membersByServerPath[ServerPath{roomID, maxRoomVersion, serverVersionInfo.Server.Name}] += members
membersByVersionPath[VersionPath{roomID, maxRoomVersion, serverVersionInfo.Server.Name, serverVersionInfo.Server.Version}] += members membersByVersionPath[VersionPath{roomID, maxRoomVersion, serverVersionInfo.Server.Name, serverVersionInfo.Server.Version}] += members
// Sort into roomMaxVersionInfos map tree. // Sort into roomInfoTree.
maxRoomVersionMap, ok := roomMaxVersionInfos[roomID] roomInfo, ok := roomInfoTree[roomID]
if !ok { if !ok {
maxRoomVersionMap = make(map[string](map[string](map[string](map[string]uint)))) roomInfo = &RoomInfo{MaxRoomVersions: make(map[string]*MaxRoomVersionInfo)}
roomMaxVersionInfos[roomID] = maxRoomVersionMap roomInfoTree[roomID] = roomInfo
} }
serverMap, ok := maxRoomVersionMap[maxRoomVersion] maxRoomVersionInfo, ok := roomInfo.MaxRoomVersions[maxRoomVersion]
if !ok { if !ok {
serverMap = make(map[string](map[string](map[string]uint))) maxRoomVersionInfo = &MaxRoomVersionInfo{Servers: make(map[string]*ServerInfo)}
maxRoomVersionMap[maxRoomVersion] = serverMap roomInfo.MaxRoomVersions[maxRoomVersion] = maxRoomVersionInfo
} }
versionMap, ok := serverMap[serverVersionInfo.Server.Name] serverInfo, ok := maxRoomVersionInfo.Servers[serverVersionInfo.Server.Name]
if !ok { if !ok {
versionMap = make(map[string](map[string]uint)) serverInfo = &ServerInfo{Versions: make(map[string]*VersionInfo)}
serverMap[serverVersionInfo.Server.Name] = versionMap maxRoomVersionInfo.Servers[serverVersionInfo.Server.Name] = serverInfo
} }
homeserverMap, ok := versionMap[serverVersionInfo.Server.Version] versionInfo, ok := serverInfo.Versions[serverVersionInfo.Server.Version]
if !ok { if !ok {
homeserverMap = make(map[string]uint) versionInfo = &VersionInfo{Homeservers: make(map[string]*HomeserverInfo)}
versionMap[serverVersionInfo.Server.Version] = homeserverMap serverInfo.Versions[serverVersionInfo.Server.Version] = versionInfo
} }
homeserverMap[hs] = members homeserverInfo, ok := versionInfo.Homeservers[hs]
if !ok {
homeserverInfo = &HomeserverInfo{}
versionInfo.Homeservers[hs] = homeserverInfo
}
homeserverInfo.MemberCount = members
} }
} }
for roomID, roomIDValue := range roomMaxVersionInfos { for roomID, roomInfo := range roomInfoTree {
fmt.Println("Room:") fmt.Println("Room:")
fmt.Printf(" %s -> %d\n", givenRoomsByRoomID[roomID], membersByRoomID[roomID]) fmt.Printf(" %s -> %d\n", givenRoomsByRoomID[roomID], membersByRoomID[roomID])
fmt.Println("Version Support:") fmt.Println("Version Support:")
maxRoomVersionKeys := make([]string, 0, len(roomIDValue)) maxRoomVersionKeys := make([]string, 0, len(roomInfo.MaxRoomVersions))
for key := range roomIDValue { for key := range roomInfo.MaxRoomVersions {
maxRoomVersionKeys = append(maxRoomVersionKeys, key) maxRoomVersionKeys = append(maxRoomVersionKeys, key)
} }
slices.SortFunc(maxRoomVersionKeys, compareVersionStrings) slices.SortFunc(maxRoomVersionKeys, compareVersionStrings)
for _, maxRoomVersionKey := range maxRoomVersionKeys { for _, maxRoomVersionKey := range maxRoomVersionKeys {
maxRoomVersionValue := roomIDValue[maxRoomVersionKey] maxRoomVersionInfo := roomInfo.MaxRoomVersions[maxRoomVersionKey]
fmt.Printf(" %s -> %d\n", maxRoomVersionKey, membersByMaxRoomVersion[MaxRoomVersionPath{roomID, maxRoomVersionKey}]) fmt.Printf(" %s -> %d\n", maxRoomVersionKey, membersByMaxRoomVersion[MaxRoomVersionPath{roomID, maxRoomVersionKey}])
serverKeys := make([]string, 0, len(maxRoomVersionValue)) serverKeys := make([]string, 0, len(maxRoomVersionInfo.Servers))
for key := range maxRoomVersionValue { for key := range maxRoomVersionInfo.Servers {
serverKeys = append(serverKeys, key) serverKeys = append(serverKeys, key)
} }
sort.Strings(serverKeys) sort.Strings(serverKeys)
for _, serverKey := range serverKeys { for _, serverKey := range serverKeys {
serverValue := maxRoomVersionValue[serverKey] serverInfo := maxRoomVersionInfo.Servers[serverKey]
fmt.Printf(" %s -> %d\n", serverKey, membersByServerPath[ServerPath{roomID, maxRoomVersionKey, serverKey}]) fmt.Printf(" %s -> %d\n", serverKey, membersByServerPath[ServerPath{roomID, maxRoomVersionKey, serverKey}])
versionKeys := make([]string, 0, len(serverValue)) versionKeys := make([]string, 0, len(serverInfo.Versions))
for key := range serverValue { for key := range serverInfo.Versions {
versionKeys = append(versionKeys, key) versionKeys = append(versionKeys, key)
} }
slices.SortFunc(versionKeys, compareVersionStrings) slices.SortFunc(versionKeys, compareVersionStrings)
for _, versionKey := range versionKeys { for _, versionKey := range versionKeys {
versionValue := serverValue[versionKey] versionInfo := serverInfo.Versions[versionKey]
fmt.Printf(" %s -> %d\n", versionKey, membersByVersionPath[VersionPath{roomID, maxRoomVersionKey, serverKey, versionKey}]) fmt.Printf(" %s -> %d\n", versionKey, membersByVersionPath[VersionPath{roomID, maxRoomVersionKey, serverKey, versionKey}])
if config.PrintHomeserverMemberCount { if config.PrintHomeserverMemberCount {
homeserverKeys := make([]string, 0, len(versionValue)) homeserverKeys := make([]string, 0, len(versionInfo.Homeservers))
for key := range versionValue { for key := range versionInfo.Homeservers {
homeserverKeys = append(homeserverKeys, key) homeserverKeys = append(homeserverKeys, key)
} }
sort.Strings(homeserverKeys) sort.Strings(homeserverKeys)
for _, homeserverKey := range homeserverKeys { for _, homeserverKey := range homeserverKeys {
homeserverValue := versionValue[homeserverKey] homeserverInfo := versionInfo.Homeservers[homeserverKey]
fmt.Printf(" %s -> %d\n", homeserverKey, homeserverValue) fmt.Printf(" %s -> %d\n", homeserverKey, homeserverInfo.MemberCount)
} }
} }
} }