diff --git a/id/matrixuri.go b/id/matrixuri.go index 5ec403e9..acd8e0c0 100644 --- a/id/matrixuri.go +++ b/id/matrixuri.go @@ -65,6 +65,9 @@ func (uri *MatrixURI) getQuery() url.Values { // String converts the parsed matrix: URI back into the string representation. func (uri *MatrixURI) String() string { + if uri == nil { + return "" + } parts := []string{ SigilToPathSegment[uri.Sigil1], url.PathEscape(uri.MXID1), @@ -81,6 +84,9 @@ func (uri *MatrixURI) String() string { // MatrixToURL converts to parsed matrix: URI into a matrix.to URL func (uri *MatrixURI) MatrixToURL() string { + if uri == nil { + return "" + } fragment := fmt.Sprintf("#/%s", url.PathEscape(uri.PrimaryIdentifier())) if uri.Sigil2 != 0 { fragment = fmt.Sprintf("%s/%s", fragment, url.PathEscape(uri.SecondaryIdentifier())) @@ -96,13 +102,16 @@ func (uri *MatrixURI) MatrixToURL() string { // PrimaryIdentifier returns the first Matrix identifier in the URI. // Currently room IDs, room aliases and user IDs can be in the primary identifier slot. func (uri *MatrixURI) PrimaryIdentifier() string { + if uri == nil { + return "" + } return fmt.Sprintf("%c%s", uri.Sigil1, uri.MXID1) } // SecondaryIdentifier returns the second Matrix identifier in the URI. // Currently only event IDs can be in the secondary identifier slot. func (uri *MatrixURI) SecondaryIdentifier() string { - if uri.Sigil2 == 0 { + if uri == nil || uri.Sigil2 == 0 { return "" } return fmt.Sprintf("%c%s", uri.Sigil2, uri.MXID2) @@ -110,7 +119,7 @@ func (uri *MatrixURI) SecondaryIdentifier() string { // UserID returns the user ID from the URI if the primary identifier is a user ID. func (uri *MatrixURI) UserID() UserID { - if uri.Sigil1 == '@' { + if uri != nil && uri.Sigil1 == '@' { return UserID(uri.PrimaryIdentifier()) } return "" @@ -118,7 +127,7 @@ func (uri *MatrixURI) UserID() UserID { // RoomID returns the room ID from the URI if the primary identifier is a room ID. func (uri *MatrixURI) RoomID() RoomID { - if uri.Sigil1 == '!' { + if uri != nil && uri.Sigil1 == '!' { return RoomID(uri.PrimaryIdentifier()) } return "" @@ -126,7 +135,7 @@ func (uri *MatrixURI) RoomID() RoomID { // RoomAlias returns the room alias from the URI if the primary identifier is a room alias. func (uri *MatrixURI) RoomAlias() RoomAlias { - if uri.Sigil1 == '#' { + if uri != nil && uri.Sigil1 == '#' { return RoomAlias(uri.PrimaryIdentifier()) } return "" @@ -134,7 +143,7 @@ func (uri *MatrixURI) RoomAlias() RoomAlias { // EventID returns the event ID from the URI if the primary identifier is a room ID or alias and the secondary identifier is an event ID. func (uri *MatrixURI) EventID() EventID { - if (uri.Sigil1 == '!' || uri.Sigil1 == '#') && uri.Sigil2 == '$' { + if uri != nil && (uri.Sigil1 == '!' || uri.Sigil1 == '#') && uri.Sigil2 == '$' { return EventID(uri.SecondaryIdentifier()) } return "" diff --git a/id/opaque.go b/id/opaque.go index 16863b95..1d9f0dcf 100644 --- a/id/opaque.go +++ b/id/opaque.go @@ -37,6 +37,9 @@ func (roomID RoomID) String() string { } func (roomID RoomID) URI(via ...string) *MatrixURI { + if roomID == "" { + return nil + } return &MatrixURI{ Sigil1: '!', MXID1: string(roomID)[1:], @@ -45,6 +48,11 @@ func (roomID RoomID) URI(via ...string) *MatrixURI { } func (roomID RoomID) EventURI(eventID EventID, via ...string) *MatrixURI { + if roomID == "" { + return nil + } else if eventID == "" { + return roomID.URI(via...) + } return &MatrixURI{ Sigil1: '!', MXID1: string(roomID)[1:], @@ -59,13 +67,20 @@ func (roomAlias RoomAlias) String() string { } func (roomAlias RoomAlias) URI() *MatrixURI { + if roomAlias == "" { + return nil + } return &MatrixURI{ Sigil1: '#', MXID1: string(roomAlias)[1:], } } +// Deprecated: room alias event links should not be used. Use room IDs instead. func (roomAlias RoomAlias) EventURI(eventID EventID) *MatrixURI { + if roomAlias == "" { + return nil + } return &MatrixURI{ Sigil1: '#', MXID1: string(roomAlias)[1:], diff --git a/id/userid.go b/id/userid.go index 53b68b96..1e1f3b29 100644 --- a/id/userid.go +++ b/id/userid.go @@ -81,6 +81,9 @@ func (userID UserID) Homeserver() string { // // This does not parse or validate the user ID. Use the ParseAndValidate method if you want to ensure the user ID is valid first. func (userID UserID) URI() *MatrixURI { + if userID == "" { + return nil + } return &MatrixURI{ Sigil1: '@', MXID1: string(userID)[1:],