mirror of
https://github.com/matrix-org/dendrite.git
synced 2025-12-15 10:53:09 -06:00
Trying stuff out
This commit is contained in:
parent
cf2913ad52
commit
237d87efcc
499
vendor/manifest
vendored
499
vendor/manifest
vendored
|
|
@ -1,499 +0,0 @@
|
||||||
{
|
|
||||||
"version": 0,
|
|
||||||
"dependencies": [
|
|
||||||
{
|
|
||||||
"importpath": "github.com/Shopify/sarama",
|
|
||||||
"repository": "https://github.com/Shopify/sarama",
|
|
||||||
"revision": "574d3147eee384229bf96a5d12c207fe7b5234f3",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/alecthomas/gometalinter",
|
|
||||||
"repository": "https://github.com/alecthomas/gometalinter",
|
|
||||||
"revision": "b8b1f84ae8cb72e7870785840eab2d6c6355aa9f",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/alecthomas/units",
|
|
||||||
"repository": "https://github.com/alecthomas/units",
|
|
||||||
"revision": "2efee857e7cfd4f3d0138cc3cbb1b4966962b93a",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/apache/thrift",
|
|
||||||
"repository": "https://github.com/apache/thrift",
|
|
||||||
"revision": "b2a4d4ae21c789b689dd162deb819665567f481c",
|
|
||||||
"branch": "HEAD"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/apache/thrift/lib/go/thrift",
|
|
||||||
"repository": "https://github.com/apache/thrift",
|
|
||||||
"revision": "b2a4d4ae21c789b689dd162deb819665567f481c",
|
|
||||||
"branch": "HEAD",
|
|
||||||
"path": "/lib/go/thrift"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/beorn7/perks/quantile",
|
|
||||||
"repository": "https://github.com/beorn7/perks",
|
|
||||||
"revision": "4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/quantile"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/codahale/hdrhistogram",
|
|
||||||
"repository": "https://github.com/codahale/hdrhistogram",
|
|
||||||
"revision": "3a0bb77429bd3a61596f5e8a3172445844342120",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/crossdock/crossdock-go",
|
|
||||||
"repository": "https://github.com/crossdock/crossdock-go",
|
|
||||||
"revision": "049aabb0122b03bc9bd30cab8f3f91fb60166361",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/davecgh/go-spew/spew",
|
|
||||||
"repository": "https://github.com/davecgh/go-spew",
|
|
||||||
"revision": "346938d642f2ec3594ed81d874461961cd0faa76",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/spew"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/eapache/go-resiliency/breaker",
|
|
||||||
"repository": "https://github.com/eapache/go-resiliency",
|
|
||||||
"revision": "b86b1ec0dd4209a588dc1285cdd471e73525c0b3",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/breaker"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/eapache/go-xerial-snappy",
|
|
||||||
"repository": "https://github.com/eapache/go-xerial-snappy",
|
|
||||||
"revision": "bb955e01b9346ac19dc29eb16586c90ded99a98c",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/eapache/queue",
|
|
||||||
"repository": "https://github.com/eapache/queue",
|
|
||||||
"revision": "44cc805cf13205b55f69e14bcb69867d1ae92f98",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/golang/protobuf/proto",
|
|
||||||
"repository": "https://github.com/golang/protobuf",
|
|
||||||
"revision": "8ee79997227bf9b34611aee7946ae64735e6fd93",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/proto"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/golang/snappy",
|
|
||||||
"repository": "https://github.com/golang/snappy",
|
|
||||||
"revision": "7db9049039a047d955fe8c19b83c8ff5abd765c7",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/google/shlex",
|
|
||||||
"repository": "https://github.com/google/shlex",
|
|
||||||
"revision": "6f45313302b9c56850fc17f99e40caebce98c716",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/gorilla/context",
|
|
||||||
"repository": "https://github.com/gorilla/context",
|
|
||||||
"revision": "08b5f424b9271eedf6f9f0ce86cb9396ed337a42",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/gorilla/mux",
|
|
||||||
"repository": "https://github.com/gorilla/mux",
|
|
||||||
"revision": "392c28fe23e1c45ddba891b0320b3b5df220beea",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/jaegertracing/jaeger-client-go",
|
|
||||||
"repository": "https://github.com/jaegertracing/jaeger-client-go",
|
|
||||||
"revision": "3ad49a1d839b517923a6fdac36d81cbf7b744f37",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/jaegertracing/jaeger-lib/metrics",
|
|
||||||
"repository": "https://github.com/jaegertracing/jaeger-lib",
|
|
||||||
"revision": "21a3da6d66fe0e278072676fdc84cd4c9ccb9b67",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/metrics"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/klauspost/crc32",
|
|
||||||
"repository": "https://github.com/klauspost/crc32",
|
|
||||||
"revision": "cb6bfca970f6908083f26f39a79009d608efd5cd",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/lib/pq",
|
|
||||||
"repository": "https://github.com/lib/pq",
|
|
||||||
"revision": "23da1db4f16d9658a86ae9b717c245fc078f10f1",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/matrix-org/dugong",
|
|
||||||
"repository": "https://github.com/matrix-org/dugong",
|
|
||||||
"revision": "ea0a4690a0d5b414a18dbb06cf6153309a2d0528",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/matrix-org/gomatrix",
|
|
||||||
"repository": "https://github.com/matrix-org/gomatrix",
|
|
||||||
"revision": "51f01ddc3d93b709449b011bfc67a72a611b1510",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/matrix-org/gomatrixserverlib",
|
|
||||||
"repository": "https://github.com/matrix-org/gomatrixserverlib",
|
|
||||||
"revision": "1c2cbc0872f0b2f19929dd70d22f77486078641e",
|
|
||||||
"branch": "HEAD"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/matrix-org/naffka",
|
|
||||||
"repository": "https://github.com/matrix-org/naffka",
|
|
||||||
"revision": "662bfd0841d0194bfe0a700d54226bb96eac574d",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/matrix-org/util",
|
|
||||||
"repository": "https://github.com/matrix-org/util",
|
|
||||||
"revision": "8b1c8ab81986c1ce7f06a52fce48f4a1156b66ee",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/matttproud/golang_protobuf_extensions/pbutil",
|
|
||||||
"repository": "https://github.com/matttproud/golang_protobuf_extensions",
|
|
||||||
"revision": "c12348ce28de40eed0136aa2b644d0ee0650e56c",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/pbutil"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/nfnt/resize",
|
|
||||||
"repository": "https://github.com/nfnt/resize",
|
|
||||||
"revision": "891127d8d1b52734debe1b3c3d7e747502b6c366",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/nicksnyder/go-i18n/i18n",
|
|
||||||
"repository": "https://github.com/nicksnyder/go-i18n",
|
|
||||||
"revision": "3e70a1a463008cea6726380c908b1a6a8bdf7b24",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/i18n"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/opentracing/opentracing-go",
|
|
||||||
"repository": "https://github.com/opentracing/opentracing-go",
|
|
||||||
"revision": "8ebe5d4e236eed9fd88e593c288bfb804d630b8c",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/pelletier/go-toml",
|
|
||||||
"repository": "https://github.com/pelletier/go-toml",
|
|
||||||
"revision": "1d6b12b7cb290426e27e6b4e38b89fcda3aeef03",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/pierrec/lz4",
|
|
||||||
"repository": "https://github.com/pierrec/lz4",
|
|
||||||
"revision": "5c9560bfa9ace2bf86080bf40d46b34ae44604df",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/pierrec/xxHash/xxHash32",
|
|
||||||
"repository": "https://github.com/pierrec/xxHash",
|
|
||||||
"revision": "5a004441f897722c627870a981d02b29924215fa",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/xxHash32"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/pkg/errors",
|
|
||||||
"repository": "https://github.com/pkg/errors",
|
|
||||||
"revision": "c605e284fe17294bda444b34710735b29d1a9d90",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/pmezard/go-difflib/difflib",
|
|
||||||
"repository": "https://github.com/pmezard/go-difflib",
|
|
||||||
"revision": "792786c7400a136282c1664665ae0a8db921c6c2",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/difflib"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/prometheus/client_golang/prometheus",
|
|
||||||
"repository": "https://github.com/prometheus/client_golang",
|
|
||||||
"revision": "c51dc758d4bb30acacbef9eaa2b774969a135086",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/prometheus/client_golang/prometheus/promhttp",
|
|
||||||
"repository": "https://github.com/prometheus/client_golang",
|
|
||||||
"revision": "c51dc758d4bb30acacbef9eaa2b774969a135086",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/prometheus/client_model/go",
|
|
||||||
"repository": "https://github.com/prometheus/client_model",
|
|
||||||
"revision": "fa8ad6fec33561be4280a8f0514318c79d7f6cb6",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/go"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/prometheus/common/expfmt",
|
|
||||||
"repository": "https://github.com/prometheus/common",
|
|
||||||
"revision": "dd2f054febf4a6c00f2343686efb775948a8bff4",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/expfmt"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg",
|
|
||||||
"repository": "https://github.com/prometheus/common",
|
|
||||||
"revision": "dd2f054febf4a6c00f2343686efb775948a8bff4",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/internal/bitbucket.org/ww/goautoneg"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/prometheus/common/model",
|
|
||||||
"repository": "https://github.com/prometheus/common",
|
|
||||||
"revision": "dd2f054febf4a6c00f2343686efb775948a8bff4",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/model"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/prometheus/procfs",
|
|
||||||
"repository": "https://github.com/prometheus/procfs",
|
|
||||||
"revision": "1878d9fbb537119d24b21ca07effd591627cd160",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/rcrowley/go-metrics",
|
|
||||||
"repository": "https://github.com/rcrowley/go-metrics",
|
|
||||||
"revision": "1f30fe9094a513ce4c700b9a54458bbb0c96996c",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/sirupsen/logrus",
|
|
||||||
"repository": "https://github.com/sirupsen/logrus",
|
|
||||||
"revision": "89742aefa4b206dcf400792f3bd35b542998eb3b",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/stretchr/testify/assert",
|
|
||||||
"repository": "https://github.com/stretchr/testify",
|
|
||||||
"revision": "890a5c3458b43e6104ff5da8dfa139d013d77544",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/assert"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/stretchr/testify/require",
|
|
||||||
"repository": "https://github.com/stretchr/testify",
|
|
||||||
"revision": "890a5c3458b43e6104ff5da8dfa139d013d77544",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/require"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/tidwall/gjson",
|
|
||||||
"repository": "https://github.com/tidwall/gjson",
|
|
||||||
"revision": "67e2a63ac70d273b6bc7589f12f07180bc9fc189",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/tidwall/match",
|
|
||||||
"repository": "https://github.com/tidwall/match",
|
|
||||||
"revision": "1731857f09b1f38450e2c12409748407822dc6be",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/tidwall/sjson",
|
|
||||||
"repository": "https://github.com/tidwall/sjson",
|
|
||||||
"revision": "6a22caf2fd45d5e2119bfc3717e984f15a7eb7ee",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/uber-go/atomic",
|
|
||||||
"repository": "https://github.com/uber-go/atomic",
|
|
||||||
"revision": "54f72d32435d760d5604f17a82e2435b28dc4ba5",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "github.com/uber/tchannel-go",
|
|
||||||
"repository": "https://github.com/uber/tchannel-go",
|
|
||||||
"revision": "b3e26487e291972fda9c7301864a2ee7a319fd35",
|
|
||||||
"branch": "dev"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "go.uber.org/atomic",
|
|
||||||
"repository": "https://github.com/uber-go/atomic",
|
|
||||||
"revision": "54f72d32435d760d5604f17a82e2435b28dc4ba5",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "go.uber.org/multierr",
|
|
||||||
"repository": "https://github.com/uber-go/multierr",
|
|
||||||
"revision": "fb7d312c2c04c34f0ad621048bbb953b168f9ff6",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "go.uber.org/zap",
|
|
||||||
"repository": "https://github.com/uber-go/zap",
|
|
||||||
"revision": "35aad584952c3e7020db7b839f6b102de6271f89",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "golang.org/x/crypto/bcrypt",
|
|
||||||
"repository": "https://go.googlesource.com/crypto",
|
|
||||||
"revision": "9419663f5a44be8b34ca85f08abc5fe1be11f8a3",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/bcrypt"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "golang.org/x/crypto/blowfish",
|
|
||||||
"repository": "https://go.googlesource.com/crypto",
|
|
||||||
"revision": "9419663f5a44be8b34ca85f08abc5fe1be11f8a3",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/blowfish"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "golang.org/x/crypto/curve25519",
|
|
||||||
"repository": "https://go.googlesource.com/crypto",
|
|
||||||
"revision": "9419663f5a44be8b34ca85f08abc5fe1be11f8a3",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/curve25519"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "golang.org/x/crypto/ed25519",
|
|
||||||
"repository": "https://go.googlesource.com/crypto",
|
|
||||||
"revision": "9419663f5a44be8b34ca85f08abc5fe1be11f8a3",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/ed25519"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "golang.org/x/crypto/internal/subtle",
|
|
||||||
"repository": "https://go.googlesource.com/crypto",
|
|
||||||
"revision": "e4dc69e5b2fd71dcaf8bd5d054eb936deb78d1fa",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/internal/subtle"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "golang.org/x/crypto/nacl/secretbox",
|
|
||||||
"repository": "https://go.googlesource.com/crypto",
|
|
||||||
"revision": "e4dc69e5b2fd71dcaf8bd5d054eb936deb78d1fa",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/nacl/secretbox"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "golang.org/x/crypto/poly1305",
|
|
||||||
"repository": "https://go.googlesource.com/crypto",
|
|
||||||
"revision": "e4dc69e5b2fd71dcaf8bd5d054eb936deb78d1fa",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/poly1305"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "golang.org/x/crypto/salsa20/salsa",
|
|
||||||
"repository": "https://go.googlesource.com/crypto",
|
|
||||||
"revision": "e4dc69e5b2fd71dcaf8bd5d054eb936deb78d1fa",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/salsa20/salsa"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "golang.org/x/crypto/ssh",
|
|
||||||
"repository": "https://go.googlesource.com/crypto",
|
|
||||||
"revision": "9419663f5a44be8b34ca85f08abc5fe1be11f8a3",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/ssh"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "golang.org/x/net/bpf",
|
|
||||||
"repository": "https://go.googlesource.com/net",
|
|
||||||
"revision": "0a9397675ba34b2845f758fe3cd68828369c6517",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/bpf"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "golang.org/x/net/context",
|
|
||||||
"repository": "https://go.googlesource.com/net",
|
|
||||||
"revision": "007e530097ad7f954752df63046b4036f98ba6a6",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/context"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "golang.org/x/net/internal/iana",
|
|
||||||
"repository": "https://go.googlesource.com/net",
|
|
||||||
"revision": "0a9397675ba34b2845f758fe3cd68828369c6517",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/internal/iana"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "golang.org/x/net/internal/socket",
|
|
||||||
"repository": "https://go.googlesource.com/net",
|
|
||||||
"revision": "0a9397675ba34b2845f758fe3cd68828369c6517",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/internal/socket"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "golang.org/x/net/ipv4",
|
|
||||||
"repository": "https://go.googlesource.com/net",
|
|
||||||
"revision": "0a9397675ba34b2845f758fe3cd68828369c6517",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/ipv4"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "golang.org/x/net/ipv6",
|
|
||||||
"repository": "https://go.googlesource.com/net",
|
|
||||||
"revision": "0a9397675ba34b2845f758fe3cd68828369c6517",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/ipv6"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "golang.org/x/sys/unix",
|
|
||||||
"repository": "https://go.googlesource.com/sys",
|
|
||||||
"revision": "43eea11bc92608addb41b8a406b0407495c106f6",
|
|
||||||
"branch": "master",
|
|
||||||
"path": "/unix"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "gopkg.in/Shopify/sarama.v1",
|
|
||||||
"repository": "https://gopkg.in/Shopify/sarama.v1",
|
|
||||||
"revision": "0fb560e5f7fbcaee2f75e3c34174320709f69944",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "gopkg.in/airbrake/gobrake.v2",
|
|
||||||
"repository": "https://gopkg.in/airbrake/gobrake.v2",
|
|
||||||
"revision": "668876711219e8b0206e2994bf0a59d889c775aa",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "gopkg.in/alecthomas/kingpin.v3-unstable",
|
|
||||||
"repository": "https://gopkg.in/alecthomas/kingpin.v3-unstable",
|
|
||||||
"revision": "23bcc3c4eae3c47e1384a1aef1d611e5603b8dfc",
|
|
||||||
"branch": "v3-unstable"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "gopkg.in/gemnasium/logrus-airbrake-hook.v2",
|
|
||||||
"repository": "https://gopkg.in/gemnasium/logrus-airbrake-hook.v2",
|
|
||||||
"revision": "e928b033a891c0175fb643d5aa0779e86325eb12",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "gopkg.in/h2non/bimg.v1",
|
|
||||||
"repository": "https://gopkg.in/h2non/bimg.v1",
|
|
||||||
"revision": "02e621739c77c791d8c153f240b7a1f75b07816f",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "gopkg.in/macaroon.v2",
|
|
||||||
"repository": "https://gopkg.in/macaroon.v2",
|
|
||||||
"revision": "bed2a428da6e56d950bed5b41fcbae3141e5b0d0",
|
|
||||||
"branch": "master"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"importpath": "gopkg.in/yaml.v2",
|
|
||||||
"repository": "https://gopkg.in/yaml.v2",
|
|
||||||
"revision": "287cf08546ab5e7e37d55a84f7ed3fd1db036de5",
|
|
||||||
"branch": "v2"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
708
vendor/src/github.com/matrix-org/gomatrix/client.go
vendored
708
vendor/src/github.com/matrix-org/gomatrix/client.go
vendored
|
|
@ -1,708 +0,0 @@
|
||||||
// Package gomatrix implements the Matrix Client-Server API.
|
|
||||||
//
|
|
||||||
// Specification can be found at http://matrix.org/docs/spec/client_server/r0.2.0.html
|
|
||||||
package gomatrix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
"net/url"
|
|
||||||
"path"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Client represents a Matrix client.
|
|
||||||
type Client struct {
|
|
||||||
HomeserverURL *url.URL // The base homeserver URL
|
|
||||||
Prefix string // The API prefix eg '/_matrix/client/r0'
|
|
||||||
UserID string // The user ID of the client. Used for forming HTTP paths which use the client's user ID.
|
|
||||||
AccessToken string // The access_token for the client.
|
|
||||||
Client *http.Client // The underlying HTTP client which will be used to make HTTP requests.
|
|
||||||
Syncer Syncer // The thing which can process /sync responses
|
|
||||||
Store Storer // The thing which can store rooms/tokens/ids
|
|
||||||
|
|
||||||
// The ?user_id= query parameter for application services. This must be set *prior* to calling a method. If this is empty,
|
|
||||||
// no user_id parameter will be sent.
|
|
||||||
// See http://matrix.org/docs/spec/application_service/unstable.html#identity-assertion
|
|
||||||
AppServiceUserID string
|
|
||||||
|
|
||||||
syncingMutex sync.Mutex // protects syncingID
|
|
||||||
syncingID uint32 // Identifies the current Sync. Only one Sync can be active at any given time.
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTPError An HTTP Error response, which may wrap an underlying native Go Error.
|
|
||||||
type HTTPError struct {
|
|
||||||
WrappedError error
|
|
||||||
Message string
|
|
||||||
Code int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e HTTPError) Error() string {
|
|
||||||
var wrappedErrMsg string
|
|
||||||
if e.WrappedError != nil {
|
|
||||||
wrappedErrMsg = e.WrappedError.Error()
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("msg=%s code=%d wrapped=%s", e.Message, e.Code, wrappedErrMsg)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BuildURL builds a URL with the Client's homserver/prefix/access_token set already.
|
|
||||||
func (cli *Client) BuildURL(urlPath ...string) string {
|
|
||||||
ps := []string{cli.Prefix}
|
|
||||||
for _, p := range urlPath {
|
|
||||||
ps = append(ps, p)
|
|
||||||
}
|
|
||||||
return cli.BuildBaseURL(ps...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BuildBaseURL builds a URL with the Client's homeserver/access_token set already. You must
|
|
||||||
// supply the prefix in the path.
|
|
||||||
func (cli *Client) BuildBaseURL(urlPath ...string) string {
|
|
||||||
// copy the URL. Purposefully ignore error as the input is from a valid URL already
|
|
||||||
hsURL, _ := url.Parse(cli.HomeserverURL.String())
|
|
||||||
parts := []string{hsURL.Path}
|
|
||||||
parts = append(parts, urlPath...)
|
|
||||||
hsURL.Path = path.Join(parts...)
|
|
||||||
// Manually add the trailing slash back to the end of the path if it's explicitly needed
|
|
||||||
if strings.HasSuffix(urlPath[len(urlPath)-1], "/") {
|
|
||||||
hsURL.Path = hsURL.Path + "/"
|
|
||||||
}
|
|
||||||
query := hsURL.Query()
|
|
||||||
if cli.AccessToken != "" {
|
|
||||||
query.Set("access_token", cli.AccessToken)
|
|
||||||
}
|
|
||||||
if cli.AppServiceUserID != "" {
|
|
||||||
query.Set("user_id", cli.AppServiceUserID)
|
|
||||||
}
|
|
||||||
hsURL.RawQuery = query.Encode()
|
|
||||||
return hsURL.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
// BuildURLWithQuery builds a URL with query parameters in addition to the Client's homeserver/prefix/access_token set already.
|
|
||||||
func (cli *Client) BuildURLWithQuery(urlPath []string, urlQuery map[string]string) string {
|
|
||||||
u, _ := url.Parse(cli.BuildURL(urlPath...))
|
|
||||||
q := u.Query()
|
|
||||||
for k, v := range urlQuery {
|
|
||||||
q.Set(k, v)
|
|
||||||
}
|
|
||||||
u.RawQuery = q.Encode()
|
|
||||||
return u.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetCredentials sets the user ID and access token on this client instance.
|
|
||||||
func (cli *Client) SetCredentials(userID, accessToken string) {
|
|
||||||
cli.AccessToken = accessToken
|
|
||||||
cli.UserID = userID
|
|
||||||
}
|
|
||||||
|
|
||||||
// ClearCredentials removes the user ID and access token on this client instance.
|
|
||||||
func (cli *Client) ClearCredentials() {
|
|
||||||
cli.AccessToken = ""
|
|
||||||
cli.UserID = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sync starts syncing with the provided Homeserver. If Sync() is called twice then the first sync will be stopped and the
|
|
||||||
// error will be nil.
|
|
||||||
//
|
|
||||||
// This function will block until a fatal /sync error occurs, so it should almost always be started as a new goroutine.
|
|
||||||
// Fatal sync errors can be caused by:
|
|
||||||
// - The failure to create a filter.
|
|
||||||
// - Client.Syncer.OnFailedSync returning an error in response to a failed sync.
|
|
||||||
// - Client.Syncer.ProcessResponse returning an error.
|
|
||||||
// If you wish to continue retrying in spite of these fatal errors, call Sync() again.
|
|
||||||
func (cli *Client) Sync() error {
|
|
||||||
// Mark the client as syncing.
|
|
||||||
// We will keep syncing until the syncing state changes. Either because
|
|
||||||
// Sync is called or StopSync is called.
|
|
||||||
syncingID := cli.incrementSyncingID()
|
|
||||||
nextBatch := cli.Store.LoadNextBatch(cli.UserID)
|
|
||||||
filterID := cli.Store.LoadFilterID(cli.UserID)
|
|
||||||
if filterID == "" {
|
|
||||||
filterJSON := cli.Syncer.GetFilterJSON(cli.UserID)
|
|
||||||
resFilter, err := cli.CreateFilter(filterJSON)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
filterID = resFilter.FilterID
|
|
||||||
cli.Store.SaveFilterID(cli.UserID, filterID)
|
|
||||||
}
|
|
||||||
|
|
||||||
for {
|
|
||||||
resSync, err := cli.SyncRequest(30000, nextBatch, filterID, false, "")
|
|
||||||
if err != nil {
|
|
||||||
duration, err2 := cli.Syncer.OnFailedSync(resSync, err)
|
|
||||||
if err2 != nil {
|
|
||||||
return err2
|
|
||||||
}
|
|
||||||
time.Sleep(duration)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check that the syncing state hasn't changed
|
|
||||||
// Either because we've stopped syncing or another sync has been started.
|
|
||||||
// We discard the response from our sync.
|
|
||||||
if cli.getSyncingID() != syncingID {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save the token now *before* processing it. This means it's possible
|
|
||||||
// to not process some events, but it means that we won't get constantly stuck processing
|
|
||||||
// a malformed/buggy event which keeps making us panic.
|
|
||||||
cli.Store.SaveNextBatch(cli.UserID, resSync.NextBatch)
|
|
||||||
if err = cli.Syncer.ProcessResponse(resSync, nextBatch); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
nextBatch = resSync.NextBatch
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cli *Client) incrementSyncingID() uint32 {
|
|
||||||
cli.syncingMutex.Lock()
|
|
||||||
defer cli.syncingMutex.Unlock()
|
|
||||||
cli.syncingID++
|
|
||||||
return cli.syncingID
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cli *Client) getSyncingID() uint32 {
|
|
||||||
cli.syncingMutex.Lock()
|
|
||||||
defer cli.syncingMutex.Unlock()
|
|
||||||
return cli.syncingID
|
|
||||||
}
|
|
||||||
|
|
||||||
// StopSync stops the ongoing sync started by Sync.
|
|
||||||
func (cli *Client) StopSync() {
|
|
||||||
// Advance the syncing state so that any running Syncs will terminate.
|
|
||||||
cli.incrementSyncingID()
|
|
||||||
}
|
|
||||||
|
|
||||||
// MakeRequest makes a JSON HTTP request to the given URL.
|
|
||||||
// If "resBody" is not nil, the response body will be json.Unmarshalled into it.
|
|
||||||
//
|
|
||||||
// Returns the HTTP body as bytes on 2xx with a nil error. Returns an error if the response is not 2xx along
|
|
||||||
// with the HTTP body bytes if it got that far. This error is an HTTPError which includes the returned
|
|
||||||
// HTTP status code and possibly a RespError as the WrappedError, if the HTTP body could be decoded as a RespError.
|
|
||||||
func (cli *Client) MakeRequest(method string, httpURL string, reqBody interface{}, resBody interface{}) ([]byte, error) {
|
|
||||||
var req *http.Request
|
|
||||||
var err error
|
|
||||||
if reqBody != nil {
|
|
||||||
var jsonStr []byte
|
|
||||||
jsonStr, err = json.Marshal(reqBody)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
req, err = http.NewRequest(method, httpURL, bytes.NewBuffer(jsonStr))
|
|
||||||
} else {
|
|
||||||
req, err = http.NewRequest(method, httpURL, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
req.Header.Set("Content-Type", "application/json")
|
|
||||||
res, err := cli.Client.Do(req)
|
|
||||||
if res != nil {
|
|
||||||
defer res.Body.Close()
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
contents, err := ioutil.ReadAll(res.Body)
|
|
||||||
if res.StatusCode/100 != 2 { // not 2xx
|
|
||||||
var wrap error
|
|
||||||
var respErr RespError
|
|
||||||
if _ = json.Unmarshal(contents, &respErr); respErr.ErrCode != "" {
|
|
||||||
wrap = respErr
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we failed to decode as RespError, don't just drop the HTTP body, include it in the
|
|
||||||
// HTTP error instead (e.g proxy errors which return HTML).
|
|
||||||
msg := "Failed to " + method + " JSON to " + req.URL.Path
|
|
||||||
if wrap == nil {
|
|
||||||
msg = msg + ": " + string(contents)
|
|
||||||
}
|
|
||||||
|
|
||||||
return contents, HTTPError{
|
|
||||||
Code: res.StatusCode,
|
|
||||||
Message: msg,
|
|
||||||
WrappedError: wrap,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if resBody != nil {
|
|
||||||
if err = json.Unmarshal(contents, &resBody); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return contents, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateFilter makes an HTTP request according to http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-user-userid-filter
|
|
||||||
func (cli *Client) CreateFilter(filter json.RawMessage) (resp *RespCreateFilter, err error) {
|
|
||||||
urlPath := cli.BuildURL("user", cli.UserID, "filter")
|
|
||||||
_, err = cli.MakeRequest("POST", urlPath, &filter, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// SyncRequest makes an HTTP request according to http://matrix.org/docs/spec/client_server/r0.2.0.html#get-matrix-client-r0-sync
|
|
||||||
func (cli *Client) SyncRequest(timeout int, since, filterID string, fullState bool, setPresence string) (resp *RespSync, err error) {
|
|
||||||
query := map[string]string{
|
|
||||||
"timeout": strconv.Itoa(timeout),
|
|
||||||
}
|
|
||||||
if since != "" {
|
|
||||||
query["since"] = since
|
|
||||||
}
|
|
||||||
if filterID != "" {
|
|
||||||
query["filter"] = filterID
|
|
||||||
}
|
|
||||||
if setPresence != "" {
|
|
||||||
query["set_presence"] = setPresence
|
|
||||||
}
|
|
||||||
if fullState {
|
|
||||||
query["full_state"] = "true"
|
|
||||||
}
|
|
||||||
urlPath := cli.BuildURLWithQuery([]string{"sync"}, query)
|
|
||||||
_, err = cli.MakeRequest("GET", urlPath, nil, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cli *Client) register(u string, req *ReqRegister) (resp *RespRegister, uiaResp *RespUserInteractive, err error) {
|
|
||||||
var bodyBytes []byte
|
|
||||||
bodyBytes, err = cli.MakeRequest("POST", u, req, nil)
|
|
||||||
if err != nil {
|
|
||||||
httpErr, ok := err.(HTTPError)
|
|
||||||
if !ok { // network error
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if httpErr.Code == 401 {
|
|
||||||
// body should be RespUserInteractive, if it isn't, fail with the error
|
|
||||||
err = json.Unmarshal(bodyBytes, &uiaResp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// body should be RespRegister
|
|
||||||
err = json.Unmarshal(bodyBytes, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Register makes an HTTP request according to http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-register
|
|
||||||
//
|
|
||||||
// Registers with kind=user. For kind=guest, see RegisterGuest.
|
|
||||||
func (cli *Client) Register(req *ReqRegister) (*RespRegister, *RespUserInteractive, error) {
|
|
||||||
u := cli.BuildURL("register")
|
|
||||||
return cli.register(u, req)
|
|
||||||
}
|
|
||||||
|
|
||||||
// RegisterGuest makes an HTTP request according to http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-register
|
|
||||||
// with kind=guest.
|
|
||||||
//
|
|
||||||
// For kind=user, see Register.
|
|
||||||
func (cli *Client) RegisterGuest(req *ReqRegister) (*RespRegister, *RespUserInteractive, error) {
|
|
||||||
query := map[string]string{
|
|
||||||
"kind": "guest",
|
|
||||||
}
|
|
||||||
u := cli.BuildURLWithQuery([]string{"register"}, query)
|
|
||||||
return cli.register(u, req)
|
|
||||||
}
|
|
||||||
|
|
||||||
// RegisterDummy performs m.login.dummy registration according to https://matrix.org/docs/spec/client_server/r0.2.0.html#dummy-auth
|
|
||||||
//
|
|
||||||
// Only a username and password need to be provided on the ReqRegister struct. Most local/developer homeservers will allow registration
|
|
||||||
// this way. If the homeserver does not, an error is returned.
|
|
||||||
//
|
|
||||||
// This does not set credentials on the client instance. See SetCredentials() instead.
|
|
||||||
//
|
|
||||||
// res, err := cli.RegisterDummy(&gomatrix.ReqRegister{
|
|
||||||
// Username: "alice",
|
|
||||||
// Password: "wonderland",
|
|
||||||
// })
|
|
||||||
// if err != nil {
|
|
||||||
// panic(err)
|
|
||||||
// }
|
|
||||||
// token := res.AccessToken
|
|
||||||
func (cli *Client) RegisterDummy(req *ReqRegister) (*RespRegister, error) {
|
|
||||||
res, uia, err := cli.Register(req)
|
|
||||||
if err != nil && uia == nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if uia != nil && uia.HasSingleStageFlow("m.login.dummy") {
|
|
||||||
req.Auth = struct {
|
|
||||||
Type string `json:"type"`
|
|
||||||
Session string `json:"session,omitempty"`
|
|
||||||
}{"m.login.dummy", uia.Session}
|
|
||||||
res, _, err = cli.Register(req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if res == nil {
|
|
||||||
return nil, fmt.Errorf("registration failed: does this server support m.login.dummy?")
|
|
||||||
}
|
|
||||||
return res, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Login a user to the homeserver according to http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-login
|
|
||||||
// This does not set credentials on this client instance. See SetCredentials() instead.
|
|
||||||
func (cli *Client) Login(req *ReqLogin) (resp *RespLogin, err error) {
|
|
||||||
urlPath := cli.BuildURL("login")
|
|
||||||
_, err = cli.MakeRequest("POST", urlPath, req, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Logout the current user. See http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-logout
|
|
||||||
// This does not clear the credentials from the client instance. See ClearCredentials() instead.
|
|
||||||
func (cli *Client) Logout() (resp *RespLogout, err error) {
|
|
||||||
urlPath := cli.BuildURL("logout")
|
|
||||||
_, err = cli.MakeRequest("POST", urlPath, nil, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Versions returns the list of supported Matrix versions on this homeserver. See http://matrix.org/docs/spec/client_server/r0.2.0.html#get-matrix-client-versions
|
|
||||||
func (cli *Client) Versions() (resp *RespVersions, err error) {
|
|
||||||
urlPath := cli.BuildBaseURL("_matrix", "client", "versions")
|
|
||||||
_, err = cli.MakeRequest("GET", urlPath, nil, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// JoinRoom joins the client to a room ID or alias. See http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-join-roomidoralias
|
|
||||||
//
|
|
||||||
// If serverName is specified, this will be added as a query param to instruct the homeserver to join via that server. If content is specified, it will
|
|
||||||
// be JSON encoded and used as the request body.
|
|
||||||
func (cli *Client) JoinRoom(roomIDorAlias, serverName string, content interface{}) (resp *RespJoinRoom, err error) {
|
|
||||||
var urlPath string
|
|
||||||
if serverName != "" {
|
|
||||||
urlPath = cli.BuildURLWithQuery([]string{"join", roomIDorAlias}, map[string]string{
|
|
||||||
"server_name": serverName,
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
urlPath = cli.BuildURL("join", roomIDorAlias)
|
|
||||||
}
|
|
||||||
_, err = cli.MakeRequest("POST", urlPath, content, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetDisplayName returns the display name of the user from the specified MXID. See https://matrix.org/docs/spec/client_server/r0.2.0.html#get-matrix-client-r0-profile-userid-displayname
|
|
||||||
func (cli *Client) GetDisplayName(mxid string) (resp *RespUserDisplayName, err error) {
|
|
||||||
urlPath := cli.BuildURL("profile", mxid, "displayname")
|
|
||||||
_, err = cli.MakeRequest("GET", urlPath, nil, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetOwnDisplayName returns the user's display name. See https://matrix.org/docs/spec/client_server/r0.2.0.html#get-matrix-client-r0-profile-userid-displayname
|
|
||||||
func (cli *Client) GetOwnDisplayName() (resp *RespUserDisplayName, err error) {
|
|
||||||
urlPath := cli.BuildURL("profile", cli.UserID, "displayname")
|
|
||||||
_, err = cli.MakeRequest("GET", urlPath, nil, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetDisplayName sets the user's profile display name. See http://matrix.org/docs/spec/client_server/r0.2.0.html#put-matrix-client-r0-profile-userid-displayname
|
|
||||||
func (cli *Client) SetDisplayName(displayName string) (err error) {
|
|
||||||
urlPath := cli.BuildURL("profile", cli.UserID, "displayname")
|
|
||||||
s := struct {
|
|
||||||
DisplayName string `json:"displayname"`
|
|
||||||
}{displayName}
|
|
||||||
_, err = cli.MakeRequest("PUT", urlPath, &s, nil)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetAvatarURL gets the user's avatar URL. See http://matrix.org/docs/spec/client_server/r0.2.0.html#get-matrix-client-r0-profile-userid-avatar-url
|
|
||||||
func (cli *Client) GetAvatarURL() (url string, err error) {
|
|
||||||
urlPath := cli.BuildURL("profile", cli.UserID, "avatar_url")
|
|
||||||
s := struct {
|
|
||||||
AvatarURL string `json:"avatar_url"`
|
|
||||||
}{}
|
|
||||||
|
|
||||||
_, err = cli.MakeRequest("GET", urlPath, nil, &s)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
return s.AvatarURL, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetAvatarURL sets the user's avatar URL. See http://matrix.org/docs/spec/client_server/r0.2.0.html#put-matrix-client-r0-profile-userid-avatar-url
|
|
||||||
func (cli *Client) SetAvatarURL(url string) (err error) {
|
|
||||||
urlPath := cli.BuildURL("profile", cli.UserID, "avatar_url")
|
|
||||||
s := struct {
|
|
||||||
AvatarURL string `json:"avatar_url"`
|
|
||||||
}{url}
|
|
||||||
_, err = cli.MakeRequest("PUT", urlPath, &s, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SendMessageEvent sends a message event into a room. See http://matrix.org/docs/spec/client_server/r0.2.0.html#put-matrix-client-r0-rooms-roomid-send-eventtype-txnid
|
|
||||||
// contentJSON should be a pointer to something that can be encoded as JSON using json.Marshal.
|
|
||||||
func (cli *Client) SendMessageEvent(roomID string, eventType string, contentJSON interface{}) (resp *RespSendEvent, err error) {
|
|
||||||
txnID := txnID()
|
|
||||||
urlPath := cli.BuildURL("rooms", roomID, "send", eventType, txnID)
|
|
||||||
_, err = cli.MakeRequest("PUT", urlPath, contentJSON, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// SendStateEvent sends a state event into a room. See http://matrix.org/docs/spec/client_server/r0.2.0.html#put-matrix-client-r0-rooms-roomid-state-eventtype-statekey
|
|
||||||
// contentJSON should be a pointer to something that can be encoded as JSON using json.Marshal.
|
|
||||||
func (cli *Client) SendStateEvent(roomID, eventType, stateKey string, contentJSON interface{}) (resp *RespSendEvent, err error) {
|
|
||||||
urlPath := cli.BuildURL("rooms", roomID, "state", eventType, stateKey)
|
|
||||||
_, err = cli.MakeRequest("PUT", urlPath, contentJSON, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// SendText sends an m.room.message event into the given room with a msgtype of m.text
|
|
||||||
// See http://matrix.org/docs/spec/client_server/r0.2.0.html#m-text
|
|
||||||
func (cli *Client) SendText(roomID, text string) (*RespSendEvent, error) {
|
|
||||||
return cli.SendMessageEvent(roomID, "m.room.message",
|
|
||||||
TextMessage{"m.text", text})
|
|
||||||
}
|
|
||||||
|
|
||||||
// SendImage sends an m.room.message event into the given room with a msgtype of m.image
|
|
||||||
// See https://matrix.org/docs/spec/client_server/r0.2.0.html#m-image
|
|
||||||
func (cli *Client) SendImage(roomID, body, url string) (*RespSendEvent, error) {
|
|
||||||
return cli.SendMessageEvent(roomID, "m.room.message",
|
|
||||||
ImageMessage{
|
|
||||||
MsgType: "m.image",
|
|
||||||
Body: body,
|
|
||||||
URL: url,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// SendVideo sends an m.room.message event into the given room with a msgtype of m.video
|
|
||||||
// See https://matrix.org/docs/spec/client_server/r0.2.0.html#m-video
|
|
||||||
func (cli *Client) SendVideo(roomID, body, url string) (*RespSendEvent, error) {
|
|
||||||
return cli.SendMessageEvent(roomID, "m.room.message",
|
|
||||||
VideoMessage{
|
|
||||||
MsgType: "m.video",
|
|
||||||
Body: body,
|
|
||||||
URL: url,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// SendNotice sends an m.room.message event into the given room with a msgtype of m.notice
|
|
||||||
// See http://matrix.org/docs/spec/client_server/r0.2.0.html#m-notice
|
|
||||||
func (cli *Client) SendNotice(roomID, text string) (*RespSendEvent, error) {
|
|
||||||
return cli.SendMessageEvent(roomID, "m.room.message",
|
|
||||||
TextMessage{"m.notice", text})
|
|
||||||
}
|
|
||||||
|
|
||||||
// RedactEvent redacts the given event. See http://matrix.org/docs/spec/client_server/r0.2.0.html#put-matrix-client-r0-rooms-roomid-redact-eventid-txnid
|
|
||||||
func (cli *Client) RedactEvent(roomID, eventID string, req *ReqRedact) (resp *RespSendEvent, err error) {
|
|
||||||
txnID := txnID()
|
|
||||||
urlPath := cli.BuildURL("rooms", roomID, "redact", eventID, txnID)
|
|
||||||
_, err = cli.MakeRequest("PUT", urlPath, req, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateRoom creates a new Matrix room. See https://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-createroom
|
|
||||||
// resp, err := cli.CreateRoom(&gomatrix.ReqCreateRoom{
|
|
||||||
// Preset: "public_chat",
|
|
||||||
// })
|
|
||||||
// fmt.Println("Room:", resp.RoomID)
|
|
||||||
func (cli *Client) CreateRoom(req *ReqCreateRoom) (resp *RespCreateRoom, err error) {
|
|
||||||
urlPath := cli.BuildURL("createRoom")
|
|
||||||
_, err = cli.MakeRequest("POST", urlPath, req, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// LeaveRoom leaves the given room. See http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-rooms-roomid-leave
|
|
||||||
func (cli *Client) LeaveRoom(roomID string) (resp *RespLeaveRoom, err error) {
|
|
||||||
u := cli.BuildURL("rooms", roomID, "leave")
|
|
||||||
_, err = cli.MakeRequest("POST", u, struct{}{}, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// ForgetRoom forgets a room entirely. See http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-rooms-roomid-forget
|
|
||||||
func (cli *Client) ForgetRoom(roomID string) (resp *RespForgetRoom, err error) {
|
|
||||||
u := cli.BuildURL("rooms", roomID, "forget")
|
|
||||||
_, err = cli.MakeRequest("POST", u, struct{}{}, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// InviteUser invites a user to a room. See http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-rooms-roomid-invite
|
|
||||||
func (cli *Client) InviteUser(roomID string, req *ReqInviteUser) (resp *RespInviteUser, err error) {
|
|
||||||
u := cli.BuildURL("rooms", roomID, "invite")
|
|
||||||
_, err = cli.MakeRequest("POST", u, req, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// InviteUserByThirdParty invites a third-party identifier to a room. See http://matrix.org/docs/spec/client_server/r0.2.0.html#invite-by-third-party-id-endpoint
|
|
||||||
func (cli *Client) InviteUserByThirdParty(roomID string, req *ReqInvite3PID) (resp *RespInviteUser, err error) {
|
|
||||||
u := cli.BuildURL("rooms", roomID, "invite")
|
|
||||||
_, err = cli.MakeRequest("POST", u, req, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// KickUser kicks a user from a room. See http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-rooms-roomid-kick
|
|
||||||
func (cli *Client) KickUser(roomID string, req *ReqKickUser) (resp *RespKickUser, err error) {
|
|
||||||
u := cli.BuildURL("rooms", roomID, "kick")
|
|
||||||
_, err = cli.MakeRequest("POST", u, req, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// BanUser bans a user from a room. See http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-rooms-roomid-ban
|
|
||||||
func (cli *Client) BanUser(roomID string, req *ReqBanUser) (resp *RespBanUser, err error) {
|
|
||||||
u := cli.BuildURL("rooms", roomID, "ban")
|
|
||||||
_, err = cli.MakeRequest("POST", u, req, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnbanUser unbans a user from a room. See http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-rooms-roomid-unban
|
|
||||||
func (cli *Client) UnbanUser(roomID string, req *ReqUnbanUser) (resp *RespUnbanUser, err error) {
|
|
||||||
u := cli.BuildURL("rooms", roomID, "unban")
|
|
||||||
_, err = cli.MakeRequest("POST", u, req, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// UserTyping sets the typing status of the user. See https://matrix.org/docs/spec/client_server/r0.2.0.html#put-matrix-client-r0-rooms-roomid-typing-userid
|
|
||||||
func (cli *Client) UserTyping(roomID string, typing bool, timeout int64) (resp *RespTyping, err error) {
|
|
||||||
req := ReqTyping{Typing: typing, Timeout: timeout}
|
|
||||||
u := cli.BuildURL("rooms", roomID, "typing", cli.UserID)
|
|
||||||
_, err = cli.MakeRequest("PUT", u, req, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// StateEvent gets a single state event in a room. It will attempt to JSON unmarshal into the given "outContent" struct with
|
|
||||||
// the HTTP response body, or return an error.
|
|
||||||
// See http://matrix.org/docs/spec/client_server/r0.2.0.html#get-matrix-client-r0-rooms-roomid-state-eventtype-statekey
|
|
||||||
func (cli *Client) StateEvent(roomID, eventType, stateKey string, outContent interface{}) (err error) {
|
|
||||||
u := cli.BuildURL("rooms", roomID, "state", eventType, stateKey)
|
|
||||||
_, err = cli.MakeRequest("GET", u, nil, outContent)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// UploadLink uploads an HTTP URL and then returns an MXC URI.
|
|
||||||
func (cli *Client) UploadLink(link string) (*RespMediaUpload, error) {
|
|
||||||
res, err := cli.Client.Get(link)
|
|
||||||
if res != nil {
|
|
||||||
defer res.Body.Close()
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return cli.UploadToContentRepo(res.Body, res.Header.Get("Content-Type"), res.ContentLength)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UploadToContentRepo uploads the given bytes to the content repository and returns an MXC URI.
|
|
||||||
// See http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-media-r0-upload
|
|
||||||
func (cli *Client) UploadToContentRepo(content io.Reader, contentType string, contentLength int64) (*RespMediaUpload, error) {
|
|
||||||
req, err := http.NewRequest("POST", cli.BuildBaseURL("_matrix/media/r0/upload"), content)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
req.Header.Set("Content-Type", contentType)
|
|
||||||
req.ContentLength = contentLength
|
|
||||||
res, err := cli.Client.Do(req)
|
|
||||||
if res != nil {
|
|
||||||
defer res.Body.Close()
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if res.StatusCode != 200 {
|
|
||||||
contents, err := ioutil.ReadAll(res.Body)
|
|
||||||
if err != nil {
|
|
||||||
return nil, HTTPError{
|
|
||||||
Message: "Upload request failed - Failed to read response body: " + err.Error(),
|
|
||||||
Code: res.StatusCode,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil, HTTPError{
|
|
||||||
Message: "Upload request failed: " + string(contents),
|
|
||||||
Code: res.StatusCode,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var m RespMediaUpload
|
|
||||||
if err := json.NewDecoder(res.Body).Decode(&m); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &m, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// JoinedMembers returns a map of joined room members. See TODO-SPEC. https://github.com/matrix-org/synapse/pull/1680
|
|
||||||
//
|
|
||||||
// In general, usage of this API is discouraged in favour of /sync, as calling this API can race with incoming membership changes.
|
|
||||||
// This API is primarily designed for application services which may want to efficiently look up joined members in a room.
|
|
||||||
func (cli *Client) JoinedMembers(roomID string) (resp *RespJoinedMembers, err error) {
|
|
||||||
u := cli.BuildURL("rooms", roomID, "joined_members")
|
|
||||||
_, err = cli.MakeRequest("GET", u, nil, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// JoinedRooms returns a list of rooms which the client is joined to. See TODO-SPEC. https://github.com/matrix-org/synapse/pull/1680
|
|
||||||
//
|
|
||||||
// In general, usage of this API is discouraged in favour of /sync, as calling this API can race with incoming membership changes.
|
|
||||||
// This API is primarily designed for application services which may want to efficiently look up joined rooms.
|
|
||||||
func (cli *Client) JoinedRooms() (resp *RespJoinedRooms, err error) {
|
|
||||||
u := cli.BuildURL("joined_rooms")
|
|
||||||
_, err = cli.MakeRequest("GET", u, nil, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Messages returns a list of message and state events for a room. It uses
|
|
||||||
// pagination query parameters to paginate history in the room.
|
|
||||||
// See https://matrix.org/docs/spec/client_server/r0.2.0.html#get-matrix-client-r0-rooms-roomid-messages
|
|
||||||
func (cli *Client) Messages(roomID, from, to string, dir rune, limit int) (resp *RespMessages, err error) {
|
|
||||||
query := map[string]string{
|
|
||||||
"from": from,
|
|
||||||
"dir": string(dir),
|
|
||||||
}
|
|
||||||
if to != "" {
|
|
||||||
query["to"] = to
|
|
||||||
}
|
|
||||||
if limit != 0 {
|
|
||||||
query["limit"] = strconv.Itoa(limit)
|
|
||||||
}
|
|
||||||
|
|
||||||
urlPath := cli.BuildURLWithQuery([]string{"rooms", roomID, "messages"}, query)
|
|
||||||
_, err = cli.MakeRequest("GET", urlPath, nil, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// TurnServer returns turn server details and credentials for the client to use when initiating calls.
|
|
||||||
// See http://matrix.org/docs/spec/client_server/r0.2.0.html#get-matrix-client-r0-voip-turnserver
|
|
||||||
func (cli *Client) TurnServer() (resp *RespTurnServer, err error) {
|
|
||||||
urlPath := cli.BuildURL("voip", "turnServer")
|
|
||||||
_, err = cli.MakeRequest("GET", urlPath, nil, &resp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func txnID() string {
|
|
||||||
return "go" + strconv.FormatInt(time.Now().UnixNano(), 10)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewClient creates a new Matrix Client ready for syncing
|
|
||||||
func NewClient(homeserverURL, userID, accessToken string) (*Client, error) {
|
|
||||||
hsURL, err := url.Parse(homeserverURL)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
// By default, use an in-memory store which will never save filter ids / next batch tokens to disk.
|
|
||||||
// The client will work with this storer: it just won't remember across restarts.
|
|
||||||
// In practice, a database backend should be used.
|
|
||||||
store := NewInMemoryStore()
|
|
||||||
cli := Client{
|
|
||||||
AccessToken: accessToken,
|
|
||||||
HomeserverURL: hsURL,
|
|
||||||
UserID: userID,
|
|
||||||
Prefix: "/_matrix/client/r0",
|
|
||||||
Syncer: NewDefaultSyncer(userID, store),
|
|
||||||
Store: store,
|
|
||||||
}
|
|
||||||
// By default, use the default HTTP client.
|
|
||||||
cli.Client = http.DefaultClient
|
|
||||||
|
|
||||||
return &cli, nil
|
|
||||||
}
|
|
||||||
103
vendor/src/github.com/matrix-org/gomatrix/events.go
vendored
103
vendor/src/github.com/matrix-org/gomatrix/events.go
vendored
|
|
@ -1,103 +0,0 @@
|
||||||
package gomatrix
|
|
||||||
|
|
||||||
import (
|
|
||||||
"html"
|
|
||||||
"regexp"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Event represents a single Matrix event.
|
|
||||||
type Event struct {
|
|
||||||
StateKey *string `json:"state_key,omitempty"` // The state key for the event. Only present on State Events.
|
|
||||||
Sender string `json:"sender"` // The user ID of the sender of the event
|
|
||||||
Type string `json:"type"` // The event type
|
|
||||||
Timestamp int64 `json:"origin_server_ts"` // The unix timestamp when this message was sent by the origin server
|
|
||||||
ID string `json:"event_id"` // The unique ID of this event
|
|
||||||
RoomID string `json:"room_id"` // The room the event was sent to. May be nil (e.g. for presence)
|
|
||||||
Content map[string]interface{} `json:"content"` // The JSON content of the event.
|
|
||||||
Redacts string `json:"redacts,omitempty"` // The event ID that was redacted if a m.room.redaction event
|
|
||||||
Unsigned map[string]interface{} `json:"unsigned"` // The unsigned portions of the event, such as age and prev_content
|
|
||||||
}
|
|
||||||
|
|
||||||
// Body returns the value of the "body" key in the event content if it is
|
|
||||||
// present and is a string.
|
|
||||||
func (event *Event) Body() (body string, ok bool) {
|
|
||||||
value, exists := event.Content["body"]
|
|
||||||
if !exists {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
body, ok = value.(string)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// MessageType returns the value of the "msgtype" key in the event content if
|
|
||||||
// it is present and is a string.
|
|
||||||
func (event *Event) MessageType() (msgtype string, ok bool) {
|
|
||||||
value, exists := event.Content["msgtype"]
|
|
||||||
if !exists {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
msgtype, ok = value.(string)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// TextMessage is the contents of a Matrix formated message event.
|
|
||||||
type TextMessage struct {
|
|
||||||
MsgType string `json:"msgtype"`
|
|
||||||
Body string `json:"body"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ImageInfo contains info about an image - http://matrix.org/docs/spec/client_server/r0.2.0.html#m-image
|
|
||||||
type ImageInfo struct {
|
|
||||||
Height uint `json:"h,omitempty"`
|
|
||||||
Width uint `json:"w,omitempty"`
|
|
||||||
Mimetype string `json:"mimetype,omitempty"`
|
|
||||||
Size uint `json:"size,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// VideoInfo contains info about a video - http://matrix.org/docs/spec/client_server/r0.2.0.html#m-video
|
|
||||||
type VideoInfo struct {
|
|
||||||
Mimetype string `json:"mimetype,omitempty"`
|
|
||||||
ThumbnailInfo ImageInfo `json:"thumbnail_info"`
|
|
||||||
ThumbnailURL string `json:"thumbnail_url,omitempty"`
|
|
||||||
Height uint `json:"h,omitempty"`
|
|
||||||
Width uint `json:"w,omitempty"`
|
|
||||||
Duration uint `json:"duration,omitempty"`
|
|
||||||
Size uint `json:"size,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// VideoMessage is an m.video - http://matrix.org/docs/spec/client_server/r0.2.0.html#m-video
|
|
||||||
type VideoMessage struct {
|
|
||||||
MsgType string `json:"msgtype"`
|
|
||||||
Body string `json:"body"`
|
|
||||||
URL string `json:"url"`
|
|
||||||
Info VideoInfo `json:"info"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// ImageMessage is an m.image event
|
|
||||||
type ImageMessage struct {
|
|
||||||
MsgType string `json:"msgtype"`
|
|
||||||
Body string `json:"body"`
|
|
||||||
URL string `json:"url"`
|
|
||||||
Info ImageInfo `json:"info"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// An HTMLMessage is the contents of a Matrix HTML formated message event.
|
|
||||||
type HTMLMessage struct {
|
|
||||||
Body string `json:"body"`
|
|
||||||
MsgType string `json:"msgtype"`
|
|
||||||
Format string `json:"format"`
|
|
||||||
FormattedBody string `json:"formatted_body"`
|
|
||||||
}
|
|
||||||
|
|
||||||
var htmlRegex = regexp.MustCompile("<[^<]+?>")
|
|
||||||
|
|
||||||
// GetHTMLMessage returns an HTMLMessage with the body set to a stripped version of the provided HTML, in addition
|
|
||||||
// to the provided HTML.
|
|
||||||
func GetHTMLMessage(msgtype, htmlText string) HTMLMessage {
|
|
||||||
return HTMLMessage{
|
|
||||||
Body: html.UnescapeString(htmlRegex.ReplaceAllLiteralString(htmlText, "")),
|
|
||||||
MsgType: msgtype,
|
|
||||||
Format: "org.matrix.custom.html",
|
|
||||||
FormattedBody: htmlText,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,90 +0,0 @@
|
||||||
// Copyright 2017 Jan Christian Grünhage
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package gomatrix
|
|
||||||
|
|
||||||
import "errors"
|
|
||||||
|
|
||||||
//Filter is used by clients to specify how the server should filter responses to e.g. sync requests
|
|
||||||
//Specified by: https://matrix.org/docs/spec/client_server/r0.2.0.html#filtering
|
|
||||||
type Filter struct {
|
|
||||||
AccountData FilterPart `json:"account_data,omitempty"`
|
|
||||||
EventFields []string `json:"event_fields,omitempty"`
|
|
||||||
EventFormat string `json:"event_format,omitempty"`
|
|
||||||
Presence FilterPart `json:"presence,omitempty"`
|
|
||||||
Room RoomFilter `json:"room,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RoomFilter is used to define filtering rules for room events
|
|
||||||
type RoomFilter struct {
|
|
||||||
AccountData FilterPart `json:"account_data,omitempty"`
|
|
||||||
Ephemeral FilterPart `json:"ephemeral,omitempty"`
|
|
||||||
IncludeLeave bool `json:"include_leave,omitempty"`
|
|
||||||
NotRooms []string `json:"not_rooms,omitempty"`
|
|
||||||
Rooms []string `json:"rooms,omitempty"`
|
|
||||||
State FilterPart `json:"state,omitempty"`
|
|
||||||
Timeline FilterPart `json:"timeline,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// FilterPart is used to define filtering rules for specific categories of events
|
|
||||||
type FilterPart struct {
|
|
||||||
NotRooms []string `json:"not_rooms,omitempty"`
|
|
||||||
Rooms []string `json:"rooms,omitempty"`
|
|
||||||
Limit int `json:"limit,omitempty"`
|
|
||||||
NotSenders []string `json:"not_senders,omitempty"`
|
|
||||||
NotTypes []string `json:"not_types,omitempty"`
|
|
||||||
Senders []string `json:"senders,omitempty"`
|
|
||||||
Types []string `json:"types,omitempty"`
|
|
||||||
ContainsURL *bool `json:"contains_url,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate checks if the filter contains valid property values
|
|
||||||
func (filter *Filter) Validate() error {
|
|
||||||
if filter.EventFormat != "client" && filter.EventFormat != "federation" {
|
|
||||||
return errors.New("Bad event_format value. Must be one of [\"client\", \"federation\"]")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DefaultFilter returns the default filter used by the Matrix server if no filter is provided in the request
|
|
||||||
func DefaultFilter() Filter {
|
|
||||||
return Filter{
|
|
||||||
AccountData: DefaultFilterPart(),
|
|
||||||
EventFields: nil,
|
|
||||||
EventFormat: "client",
|
|
||||||
Presence: DefaultFilterPart(),
|
|
||||||
Room: RoomFilter{
|
|
||||||
AccountData: DefaultFilterPart(),
|
|
||||||
Ephemeral: DefaultFilterPart(),
|
|
||||||
IncludeLeave: false,
|
|
||||||
NotRooms: nil,
|
|
||||||
Rooms: nil,
|
|
||||||
State: DefaultFilterPart(),
|
|
||||||
Timeline: DefaultFilterPart(),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// DefaultFilterPart returns the default filter part used by the Matrix server if no filter is provided in the request
|
|
||||||
func DefaultFilterPart() FilterPart {
|
|
||||||
return FilterPart{
|
|
||||||
NotRooms: nil,
|
|
||||||
Rooms: nil,
|
|
||||||
Limit: 20,
|
|
||||||
NotSenders: nil,
|
|
||||||
NotTypes: nil,
|
|
||||||
Senders: nil,
|
|
||||||
Types: nil,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,177 +0,0 @@
|
||||||
package gomatrix
|
|
||||||
|
|
||||||
// RespError is the standard JSON error response from Homeservers. It also implements the Golang "error" interface.
|
|
||||||
// See http://matrix.org/docs/spec/client_server/r0.2.0.html#api-standards
|
|
||||||
type RespError struct {
|
|
||||||
ErrCode string `json:"errcode"`
|
|
||||||
Err string `json:"error"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error returns the errcode and error message.
|
|
||||||
func (e RespError) Error() string {
|
|
||||||
return e.ErrCode + ": " + e.Err
|
|
||||||
}
|
|
||||||
|
|
||||||
// RespCreateFilter is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-user-userid-filter
|
|
||||||
type RespCreateFilter struct {
|
|
||||||
FilterID string `json:"filter_id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RespVersions is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#get-matrix-client-versions
|
|
||||||
type RespVersions struct {
|
|
||||||
Versions []string `json:"versions"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RespJoinRoom is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-rooms-roomid-join
|
|
||||||
type RespJoinRoom struct {
|
|
||||||
RoomID string `json:"room_id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RespLeaveRoom is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-rooms-roomid-leave
|
|
||||||
type RespLeaveRoom struct{}
|
|
||||||
|
|
||||||
// RespForgetRoom is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-rooms-roomid-forget
|
|
||||||
type RespForgetRoom struct{}
|
|
||||||
|
|
||||||
// RespInviteUser is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-rooms-roomid-invite
|
|
||||||
type RespInviteUser struct{}
|
|
||||||
|
|
||||||
// RespKickUser is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-rooms-roomid-kick
|
|
||||||
type RespKickUser struct{}
|
|
||||||
|
|
||||||
// RespBanUser is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-rooms-roomid-ban
|
|
||||||
type RespBanUser struct{}
|
|
||||||
|
|
||||||
// RespUnbanUser is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-rooms-roomid-unban
|
|
||||||
type RespUnbanUser struct{}
|
|
||||||
|
|
||||||
// RespTyping is the JSON response for https://matrix.org/docs/spec/client_server/r0.2.0.html#put-matrix-client-r0-rooms-roomid-typing-userid
|
|
||||||
type RespTyping struct{}
|
|
||||||
|
|
||||||
// RespJoinedRooms is the JSON response for TODO-SPEC https://github.com/matrix-org/synapse/pull/1680
|
|
||||||
type RespJoinedRooms struct {
|
|
||||||
JoinedRooms []string `json:"joined_rooms"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RespJoinedMembers is the JSON response for TODO-SPEC https://github.com/matrix-org/synapse/pull/1680
|
|
||||||
type RespJoinedMembers struct {
|
|
||||||
Joined map[string]struct {
|
|
||||||
DisplayName *string `json:"display_name"`
|
|
||||||
AvatarURL *string `json:"avatar_url"`
|
|
||||||
} `json:"joined"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RespMessages is the JSON response for https://matrix.org/docs/spec/client_server/r0.2.0.html#get-matrix-client-r0-rooms-roomid-messages
|
|
||||||
type RespMessages struct {
|
|
||||||
Start string `json:"start"`
|
|
||||||
Chunk []Event `json:"chunk"`
|
|
||||||
End string `json:"end"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RespSendEvent is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#put-matrix-client-r0-rooms-roomid-send-eventtype-txnid
|
|
||||||
type RespSendEvent struct {
|
|
||||||
EventID string `json:"event_id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RespMediaUpload is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-media-r0-upload
|
|
||||||
type RespMediaUpload struct {
|
|
||||||
ContentURI string `json:"content_uri"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RespUserInteractive is the JSON response for https://matrix.org/docs/spec/client_server/r0.2.0.html#user-interactive-authentication-api
|
|
||||||
type RespUserInteractive struct {
|
|
||||||
Flows []struct {
|
|
||||||
Stages []string `json:"stages"`
|
|
||||||
} `json:"flows"`
|
|
||||||
Params map[string]interface{} `json:"params"`
|
|
||||||
Session string `json:"session"`
|
|
||||||
Completed []string `json:"completed"`
|
|
||||||
ErrCode string `json:"errcode"`
|
|
||||||
Error string `json:"error"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// HasSingleStageFlow returns true if there exists at least 1 Flow with a single stage of stageName.
|
|
||||||
func (r RespUserInteractive) HasSingleStageFlow(stageName string) bool {
|
|
||||||
for _, f := range r.Flows {
|
|
||||||
if len(f.Stages) == 1 && f.Stages[0] == stageName {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// RespUserDisplayName is the JSON response for https://matrix.org/docs/spec/client_server/r0.2.0.html#get-matrix-client-r0-profile-userid-displayname
|
|
||||||
type RespUserDisplayName struct {
|
|
||||||
DisplayName string `json:"displayname"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RespRegister is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-register
|
|
||||||
type RespRegister struct {
|
|
||||||
AccessToken string `json:"access_token"`
|
|
||||||
DeviceID string `json:"device_id"`
|
|
||||||
HomeServer string `json:"home_server"`
|
|
||||||
RefreshToken string `json:"refresh_token"`
|
|
||||||
UserID string `json:"user_id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RespLogin is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-login
|
|
||||||
type RespLogin struct {
|
|
||||||
AccessToken string `json:"access_token"`
|
|
||||||
DeviceID string `json:"device_id"`
|
|
||||||
HomeServer string `json:"home_server"`
|
|
||||||
UserID string `json:"user_id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RespLogout is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-logout
|
|
||||||
type RespLogout struct{}
|
|
||||||
|
|
||||||
// RespCreateRoom is the JSON response for https://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-createroom
|
|
||||||
type RespCreateRoom struct {
|
|
||||||
RoomID string `json:"room_id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RespSync is the JSON response for http://matrix.org/docs/spec/client_server/r0.2.0.html#get-matrix-client-r0-sync
|
|
||||||
type RespSync struct {
|
|
||||||
NextBatch string `json:"next_batch"`
|
|
||||||
AccountData struct {
|
|
||||||
Events []Event `json:"events"`
|
|
||||||
} `json:"account_data"`
|
|
||||||
Presence struct {
|
|
||||||
Events []Event `json:"events"`
|
|
||||||
} `json:"presence"`
|
|
||||||
Rooms struct {
|
|
||||||
Leave map[string]struct {
|
|
||||||
State struct {
|
|
||||||
Events []Event `json:"events"`
|
|
||||||
} `json:"state"`
|
|
||||||
Timeline struct {
|
|
||||||
Events []Event `json:"events"`
|
|
||||||
Limited bool `json:"limited"`
|
|
||||||
PrevBatch string `json:"prev_batch"`
|
|
||||||
} `json:"timeline"`
|
|
||||||
} `json:"leave"`
|
|
||||||
Join map[string]struct {
|
|
||||||
State struct {
|
|
||||||
Events []Event `json:"events"`
|
|
||||||
} `json:"state"`
|
|
||||||
Timeline struct {
|
|
||||||
Events []Event `json:"events"`
|
|
||||||
Limited bool `json:"limited"`
|
|
||||||
PrevBatch string `json:"prev_batch"`
|
|
||||||
} `json:"timeline"`
|
|
||||||
} `json:"join"`
|
|
||||||
Invite map[string]struct {
|
|
||||||
State struct {
|
|
||||||
Events []Event
|
|
||||||
} `json:"invite_state"`
|
|
||||||
} `json:"invite"`
|
|
||||||
} `json:"rooms"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// RespTurnServer is the JSON response from a Turn Server
|
|
||||||
type RespTurnServer struct {
|
|
||||||
Username string `json:"username"`
|
|
||||||
Password string `json:"password"`
|
|
||||||
TTL int `json:"ttl"`
|
|
||||||
URIs []string `json:"uris"`
|
|
||||||
}
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
// Copyright 2019 Sumukha PK
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package gomatrix
|
|
||||||
|
|
||||||
// TagContent contains the data for an m.tag message type
|
|
||||||
// https://matrix.org/docs/spec/client_server/r0.4.0.html#m-tag
|
|
||||||
type TagContent struct {
|
|
||||||
Tags map[string]TagProperties `json:"tags"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// TagProperties contains the properties of a Tag
|
|
||||||
type TagProperties struct {
|
|
||||||
Order float32 `json:"order,omitempty"` // Empty values must be neglected
|
|
||||||
}
|
|
||||||
Loading…
Reference in a new issue