-
Notifications
You must be signed in to change notification settings - Fork 2
/
invitev2.go
81 lines (70 loc) · 2.36 KB
/
invitev2.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package fclient
import (
"encoding/json"
"errors"
"github.com/neilalexander/harmony/internal/gomatrixserverlib"
"github.com/tidwall/gjson"
)
// InviteV2Request and InviteV2StrippedState are defined in
// https://matrix.org/docs/spec/server_server/r0.1.3#put-matrix-federation-v2-invite-roomid-eventid
func NewInviteV2Request(event gomatrixserverlib.PDU, state []gomatrixserverlib.InviteStrippedState) (
request InviteV2Request, err error,
) {
if !gomatrixserverlib.KnownRoomVersion(event.Version()) {
err = gomatrixserverlib.UnsupportedRoomVersionError{
Version: event.Version(),
}
return
}
request.fields.inviteV2RequestHeaders = inviteV2RequestHeaders{
RoomVersion: event.Version(),
InviteRoomState: state,
}
request.fields.Event = event
return
}
type inviteV2RequestHeaders struct {
RoomVersion gomatrixserverlib.RoomVersion `json:"room_version"`
InviteRoomState []gomatrixserverlib.InviteStrippedState `json:"invite_room_state"`
}
// InviteV2Request is used in the body of a /_matrix/federation/v2/invite request.
type InviteV2Request struct {
fields struct {
inviteV2RequestHeaders
Event gomatrixserverlib.PDU `json:"event"`
}
}
// MarshalJSON implements json.Marshaller
func (i InviteV2Request) MarshalJSON() ([]byte, error) {
return json.Marshal(i.fields)
}
// UnmarshalJSON implements json.Unmarshaller
func (i *InviteV2Request) UnmarshalJSON(data []byte) error {
err := json.Unmarshal(data, &i.fields.inviteV2RequestHeaders)
if err != nil {
return err
}
eventJSON := gjson.GetBytes(data, "event")
if !eventJSON.Exists() {
return errors.New("gomatrixserverlib: request doesn't contain event")
}
verImpl, err := gomatrixserverlib.GetRoomVersion(i.fields.RoomVersion)
if err != nil {
return err
}
i.fields.Event, err = verImpl.NewEventFromUntrustedJSON([]byte(eventJSON.String()))
return err
}
// Event returns the invite event.
func (i *InviteV2Request) Event() gomatrixserverlib.PDU {
return i.fields.Event
}
// RoomVersion returns the room version of the invited room.
func (i *InviteV2Request) RoomVersion() gomatrixserverlib.RoomVersion {
return i.fields.RoomVersion
}
// InviteRoomState returns stripped state events for the room, containing
// enough information for the client to identify the room.
func (i *InviteV2Request) InviteRoomState() []gomatrixserverlib.InviteStrippedState {
return i.fields.InviteRoomState
}