diff --git a/.gitignore b/.gitignore index 6e29bad2c..bac199fc2 100644 --- a/.gitignore +++ b/.gitignore @@ -162,6 +162,8 @@ go.work # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 # User-specific stuff +.idea/ +.idea .idea/**/workspace.xml .idea/**/tasks.xml .idea/**/usage.statistics.xml diff --git a/.idea/Open-IM-Server.iml b/.idea/Open-IM-Server.iml new file mode 100644 index 000000000..5e764c4f0 --- /dev/null +++ b/.idea/Open-IM-Server.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 000000000..589964a46 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,14 @@ + + + + + sqlite.xerial + true + org.sqlite.JDBC + jdbc:sqlite:C:\Users\Administrator\Desktop\Open-IM-Server\docker-compose_cfg\grafana.db + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..28a804d89 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..d9805dbb6 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..35eb1ddfb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/cmd/openim-api/main.go b/cmd/openim-api/main.go index aac83a805..b80460990 100644 --- a/cmd/openim-api/main.go +++ b/cmd/openim-api/main.go @@ -73,7 +73,7 @@ func run(port int) error { if err != nil { return err } - if client.CreateRpcRootNodes(config.GetServiceNames()); err != nil { + if err := client.CreateRpcRootNodes(config.GetServiceNames()); err != nil { return err } fmt.Println("api init discov client success") diff --git a/cmd/openim-msgtransfer/main.go b/cmd/openim-msgtransfer/main.go deleted file mode 100644 index aef347793..000000000 --- a/cmd/openim-msgtransfer/main.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 main - -import ( - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/cmd" -) - -func main() { - msgTransferCmd := cmd.NewMsgTransferCmd() - msgTransferCmd.AddPrometheusPortFlag() - if err := msgTransferCmd.Exec(); err != nil { - panic(err.Error()) - } -} diff --git a/config/config.yaml b/config/config.yaml index ea6f8772d..07d46957e 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -56,14 +56,11 @@ kafka: topic: "offlineMsgToMongoMysql" #不建议修改 msgToPush: topic: "msgToPush" #不建议修改 - msgToModify: - topic: "msgToModify" #不建议修改 consumerGroupID: #消费者组,不建议修改 msgToRedis: redis # msgToMongo: mongo # msgToMySql: mysql # msgToPush: push # - msgToModify: modify # rpc: @@ -76,41 +73,26 @@ api: listenIP: #默认为0.0.0.0 object: - enable: minio #使用minio - apiURL: http://127.0.0.1:10002/third/object + enable: "minio" #使用minio + apiURL: "http://127.0.0.1:10002/object/" minio: - tempBucket: "openim" #不建议修改 - dataBucket: "openim" #不建议修改 - location: us-east-1 #不建议修改 - endpoint: http://127.0.0.1:10005 #minio对外服务的ip和端口,app要能访问此ip和端口 - accessKeyID: root #ID - secretAccessKey: openIM123 #秘钥 - isDistributedMod: false #是否分布式多硬盘部署,如果是多硬盘部署,需要修改为true - tencent: #tencent cos - appID: - region: - bucket: - secretID: - secretKey: - ali: #ali oss - regionID: - accessKeyID: - accessKeySecret: - stsEndpoint: - ossEndpoint: - bucket: - finalHost: - stsDurationSeconds: - OssRoleArn: - aws: - accessKeyID: - accessKeySecret: - region: - bucket: - finalHost: - roleArn: - externalId: - roleSessionName: + bucket: "openim" #不建议修改 + endpoint: "http://127.0.0.1:10005" #minio对外服务的ip和端口,app要能访问此ip和端口 + accessKeyID: "root" #ID + secretAccessKey: "openIM123" #秘钥 + sessionToken: "" #token + cos: #tencent cos + bucketURL: "https://temp-1252357374.cos.ap-chengdu.myqcloud.com" + secretID: "" + secretKey: "" + sessionToken: "" + oss: #ali oss + endpoint: "https://oss-cn-chengdu.aliyuncs.com" + bucket: "demo-9999999" + bucketURL: "https://demo-9999999.oss-cn-chengdu.aliyuncs.com" + accessKeyID: "" + accessKeySecret: "" + sessionToken: "" rpcPort: #rpc服务端口,不建议修改,端口由脚本读取后传入程序,如启动多个程序,只需要填入多个端口,用逗号隔开,如 [10110, 10111] openImUserPort: [ 10110 ] @@ -182,7 +164,8 @@ groupMessageHasReadReceiptEnable: true #群聊已读是否开 singleMessageHasReadReceiptEnable: true #单聊已读是否开启 retainChatRecords: 365 #mongo保存离线消息时间(天) -chatRecordsClearTime: "0 2 * * 3" #每周三凌晨2点清理mongo中的过期(超过retainChatRecords时间)消息 +chatRecordsClearTime: "0 2 * * 3" #每周三凌晨2点清理mongo中的过期(超过retainChatRecords时间)消息,这个删除是为了清理满足上个配置retainChatRecords的过期消息,不会发送通知,仅仅作为清理磁盘使用 +msgDestructTime: "0 2 * * *" #消息自动删除时间,每天凌晨2点删除过期消息,这个删除是为了删除保留时间超过超过会话字段msg_destruct_time(秒)的消息。 secret: tuoyun #秘钥,获取token时校验 diff --git a/go.mod b/go.mod index 0a8c1fd52..8a7fd7153 100644 --- a/go.mod +++ b/go.mod @@ -17,13 +17,13 @@ require ( github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/jinzhu/copier v0.3.5 github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible - github.com/minio/minio-go/v7 v7.0.22 - github.com/mitchellh/mapstructure v1.4.2 + github.com/minio/minio-go/v7 v7.0.59 + github.com/mitchellh/mapstructure v1.5.0 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.13.0 github.com/robfig/cron/v3 v3.0.1 - github.com/sirupsen/logrus v1.9.0 // indirect + github.com/sirupsen/logrus v1.9.2 // indirect github.com/stretchr/testify v1.8.3 github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20210325043845-84a0811633ca go.mongodb.org/mongo-driver v1.8.3 @@ -39,10 +39,12 @@ require ( require github.com/google/uuid v1.3.0 require ( + github.com/aliyun/aliyun-oss-go-sdk v2.2.7+incompatible github.com/go-redis/redis v6.15.9+incompatible github.com/go-sql-driver/mysql v1.6.0 github.com/go-zookeeper/zk v1.0.3 github.com/redis/go-redis/v9 v9.0.5 + github.com/tencentyun/cos-go-sdk-v5 v0.7.41 ) require ( @@ -57,9 +59,10 @@ require ( github.com/bytedance/sonic v1.9.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect + github.com/clbanning/mxj v1.8.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/dustin/go-humanize v1.0.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/eapache/go-resiliency v1.2.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect github.com/eapache/queue v1.1.0 // indirect @@ -70,6 +73,7 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.3 // indirect github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-querystring v1.1.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/googleapis/gax-go/v2 v2.7.1 // indirect github.com/hashicorp/go-uuid v1.0.2 // indirect @@ -82,17 +86,16 @@ require ( github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/klauspost/cpuid v1.3.1 // indirect + github.com/klauspost/compress v1.16.5 // indirect github.com/klauspost/cpuid/v2 v2.2.4 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/lithammer/shortuuid v3.0.0+incompatible // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/minio/md5-simd v1.1.0 // indirect - github.com/minio/sha256-simd v0.1.1 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/minio/md5-simd v1.1.2 // indirect + github.com/minio/sha256-simd v1.0.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/mozillazg/go-httpheader v0.4.0 // indirect github.com/onsi/ginkgo v1.16.5 // indirect github.com/onsi/gomega v1.18.1 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect @@ -102,7 +105,7 @@ require ( github.com/prometheus/common v0.37.0 // indirect github.com/prometheus/procfs v0.8.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rs/xid v1.2.1 // indirect + github.com/rs/xid v1.5.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect @@ -136,7 +139,7 @@ require ( go.uber.org/zap v1.24.0 golang.org/x/crypto v0.10.0 // indirect google.golang.org/genproto v0.0.0-20230525234025-438c736192d0 // indirect - gopkg.in/ini.v1 v1.66.2 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect ) replace github.com/Shopify/sarama => github.com/Shopify/sarama v1.29.0 diff --git a/go.sum b/go.sum index 443d6cb9d..e95d2e81e 100644 --- a/go.sum +++ b/go.sum @@ -51,6 +51,7 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/OpenIMSDK/open_utils v1.0.8 h1:IopxWgJwEF5ZAPsRuiZZOfcxNOQOCt/p8VDENcHN9r4= github.com/OpenIMSDK/open_utils v1.0.8/go.mod h1:FLoaQblWUVKQgqt2LrNzfSZLT6D3DICBn1kcOMDLUOI= +github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM= github.com/Shopify/sarama v1.29.0 h1:ARid8o8oieau9XrHI55f/L3EoRAhm9px6sonbD7yuUE= github.com/Shopify/sarama v1.29.0/go.mod h1:2QpgD79wpdAESqNQMxNc0KYMkycd4slxGdV3TWSVqrU= github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= @@ -60,6 +61,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/aliyun/aliyun-oss-go-sdk v2.2.7+incompatible h1:KpbJFXwhVeuxNtBJ74MCGbIoaBok2uZvkD7QXp2+Wis= +github.com/aliyun/aliyun-oss-go-sdk v2.2.7+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -83,6 +86,8 @@ github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583j github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= +github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -94,8 +99,8 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/r github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dtm-labs/rockscache v0.1.1 h1:6S1vgaHvGqrLd8Ka4hRTKeKPV7v+tT0MSkTIX81LRyA= github.com/dtm-labs/rockscache v0.1.1/go.mod h1:c76WX0kyIibmQ2ACxUXvDvaLykoPakivMqIxt+UzE7A= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q= github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= @@ -202,6 +207,9 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -216,6 +224,7 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -274,11 +283,10 @@ github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= -github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= +github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= +github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= @@ -306,16 +314,15 @@ github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APP github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/minio/md5-simd v1.1.0 h1:QPfiOqlZH+Cj9teu0t9b1nTBfPbyTl16Of5MeuShdK4= -github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= -github.com/minio/minio-go/v7 v7.0.22 h1:iXhsiRyYh1ozm/+jN2qGgEIahYjEkvcpuu6NcdpSxcA= -github.com/minio/minio-go/v7 v7.0.22/go.mod h1:ei5JjmxwHaMrgsMrn4U/+Nmg+d8MKS1U2DAn1ou4+Do= -github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= -github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.59 h1:lxIXwsTIcQkYoEG25rUJbzpmSB/oWeVDmxFo/uWUUsw= +github.com/minio/minio-go/v7 v7.0.59/go.mod h1:NUDy4A4oXPq1l2yK6LTSvCEzAMeIcoz9lcj5dbzSrRE= +github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -324,6 +331,9 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60= +github.com/mozillazg/go-httpheader v0.4.0 h1:aBn6aRXtFzyDLZ4VIRLsZbbJloagQfMnCiYgOq6hK4w= +github.com/mozillazg/go-httpheader v0.4.0/go.mod h1:PuT8h0pw6efvp8ZeUec1Rs7dwjK08bt6gKSReGMqtdA= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= @@ -384,14 +394,14 @@ github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDO github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= +github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -412,6 +422,10 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.194/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.194/go.mod h1:yrBKWhChnDqNz1xuXdSbWXG56XawEq0G5j1lg4VwBD4= +github.com/tencentyun/cos-go-sdk-v5 v0.7.41 h1:iU0Li/Np78H4SBna0ECQoF3mpgi6ImLXU+doGzPFXGc= +github.com/tencentyun/cos-go-sdk-v5 v0.7.41/go.mod h1:4dCEtLHGh8QPxHEkgq+nFaky7yZxQuYwgSJM87icDaw= github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20210325043845-84a0811633ca h1:G/aIr3WiUesWHL2YGYgEqjM5tCAJ43Ml+0C18wDkWWs= github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20210325043845-84a0811633ca/go.mod h1:b18KQa4IxHbxeseW1GcZox53d7J0z39VNONTxvvlkXw= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= @@ -782,8 +796,8 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI= -gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/internal/api/conversation.go b/internal/api/conversation.go index 7f1732fec..6058049a1 100644 --- a/internal/api/conversation.go +++ b/internal/api/conversation.go @@ -41,18 +41,6 @@ func (o *ConversationApi) GetConversations(c *gin.Context) { a2r.Call(conversation.ConversationClient.GetConversations, o.Client, c) } -func (o *ConversationApi) BatchSetConversations(c *gin.Context) { - a2r.Call(conversation.ConversationClient.BatchSetConversations, o.Client, c) -} - -func (o *ConversationApi) SetRecvMsgOpt(c *gin.Context) { - a2r.Call(conversation.ConversationClient.SetRecvMsgOpt, o.Client, c) -} - -func (o *ConversationApi) ModifyConversationField(c *gin.Context) { - a2r.Call(conversation.ConversationClient.ModifyConversationField, o.Client, c) -} - func (o *ConversationApi) SetConversations(c *gin.Context) { a2r.Call(conversation.ConversationClient.SetConversations, o.Client, c) } diff --git a/internal/api/group.go b/internal/api/group.go index 432645caa..2e293f72a 100644 --- a/internal/api/group.go +++ b/internal/api/group.go @@ -128,3 +128,7 @@ func (o *GroupApi) GetJoinedSuperGroupList(c *gin.Context) { func (o *GroupApi) GetSuperGroupsInfo(c *gin.Context) { a2r.Call(group.GroupClient.GetSuperGroupsInfo, o.Client, c) } + +func (o *GroupApi) GroupCreateCount(c *gin.Context) { + a2r.Call(group.GroupClient.GroupCreateCount, o.Client, c) +} diff --git a/internal/api/msg.go b/internal/api/msg.go index a4da4ea7e..7e9101681 100644 --- a/internal/api/msg.go +++ b/internal/api/msg.go @@ -25,6 +25,7 @@ import ( "github.com/OpenIMSDK/Open-IM-Server/pkg/apistruct" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify" "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry" "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg" @@ -162,33 +163,16 @@ func (m *MessageApi) DeleteMsgPhysical(c *gin.Context) { a2r.Call(msg.MsgClient.DeleteMsgPhysical, m.Client, c) } -func (m *MessageApi) SetMessageReactionExtensions(c *gin.Context) { - a2r.Call(msg.MsgClient.SetMessageReactionExtensions, m.Client, c) -} - -func (m *MessageApi) GetMessageListReactionExtensions(c *gin.Context) { - a2r.Call(msg.MsgClient.GetMessagesReactionExtensions, m.Client, c) -} - -func (m *MessageApi) AddMessageReactionExtensions(c *gin.Context) { - a2r.Call(msg.MsgClient.AddMessageReactionExtensions, m.Client, c) -} - -func (m *MessageApi) DeleteMessageReactionExtensions(c *gin.Context) { - a2r.Call(msg.MsgClient.DeleteMessageReactionExtensions, m.Client, c) -} - func (m *MessageApi) SendMessage(c *gin.Context) { params := apistruct.ManagementSendMsgReq{} if err := c.BindJSON(¶ms); err != nil { apiresp.GinError(c, errs.ErrArgs.WithDetail(err.Error()).Wrap()) return } - // todo - //if !tokenverify.IsAppManagerUid(c) { - // apiresp.GinError(c, errs.ErrNoPermission.Wrap("only app manager can send message")) - // return - //} + if !tokenverify.IsAppManagerUid(c) { + apiresp.GinError(c, errs.ErrNoPermission.Wrap("only app manager can send message")) + return + } var data interface{} switch params.ContentType { @@ -253,3 +237,11 @@ func (m *MessageApi) CheckMsgIsSendSuccess(c *gin.Context) { func (m *MessageApi) GetUsersOnlineStatus(c *gin.Context) { a2r.Call(msg.MsgClient.GetSendMsgStatus, m.Client, c) } + +func (m *MessageApi) GetActiveUser(c *gin.Context) { + a2r.Call(msg.MsgClient.GetActiveUser, m.Client, c) +} + +func (m *MessageApi) GetActiveGroup(c *gin.Context) { + a2r.Call(msg.MsgClient.GetActiveGroup, m.Client, c) +} diff --git a/internal/api/route.go b/internal/api/route.go index b014f66ab..b37e5a3f7 100644 --- a/internal/api/route.go +++ b/internal/api/route.go @@ -41,6 +41,7 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive log.ZInfo(context.Background(), "load config", "config", config.Config) r.Use(gin.Recovery(), mw.CorsHandler(), mw.GinParseOperationID()) u := NewUserApi(discov) + m := NewMessageApi(discov) if config.Config.Prometheus.Enable { prome.NewApiRequestCounter() prome.NewApiRequestFailedCounter() @@ -59,6 +60,7 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive userRouterGroup.POST("/account_check", ParseToken, u.AccountCheck) userRouterGroup.POST("/get_users", ParseToken, u.GetUsers) userRouterGroup.POST("/get_users_online_status", ParseToken, u.GetUsersOnlineStatus) + userRouterGroup.POST("/get_users_online_token_detail", ParseToken, u.GetUsersOnlineTokenDetail) } //friend routing group friendRouterGroup := r.Group("/friend", ParseToken) @@ -111,7 +113,6 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive authRouterGroup := r.Group("/auth") { a := NewAuthApi(discov) - authRouterGroup.POST("/user_register", u.UserRegister) authRouterGroup.POST("/user_token", a.UserToken) authRouterGroup.POST("/parse_token", a.ParseToken) authRouterGroup.POST("/force_logout", ParseToken, a.ForceLogout) @@ -123,17 +124,19 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive thirdGroup.POST("/fcm_update_token", t.FcmUpdateToken) thirdGroup.POST("/set_app_badge", t.SetAppBadge) - thirdGroup.POST("/apply_put", t.ApplyPut) - thirdGroup.POST("/get_put", t.GetPut) - thirdGroup.POST("/confirm_put", t.ConfirmPut) - thirdGroup.POST("/get_hash", t.GetHash) - thirdGroup.POST("/object", t.GetURL) - thirdGroup.GET("/object", t.GetURL) + objectGroup := r.Group("/object", ParseToken) + + objectGroup.POST("/part_limit", t.PartLimit) + objectGroup.POST("/part_size", t.PartSize) + objectGroup.POST("/initiate_multipart_upload", t.InitiateMultipartUpload) + objectGroup.POST("/auth_sign", t.AuthSign) + objectGroup.POST("/complete_multipart_upload", t.CompleteMultipartUpload) + objectGroup.POST("/access_url", t.AccessURL) + objectGroup.GET("/*name", t.ObjectRedirect) } //Message msgGroup := r.Group("/msg", ParseToken) { - m := NewMessageApi(discov) msgGroup.POST("/newest_seq", m.GetSeq) msgGroup.POST("/send_msg", m.SendMessage) msgGroup.POST("/pull_msg_by_seq", m.PullMsgBySeqs) @@ -159,15 +162,15 @@ func NewGinRouter(discov discoveryregistry.SvcDiscoveryRegistry, rdb redis.Unive conversationGroup.POST("/get_all_conversations", c.GetAllConversations) conversationGroup.POST("/get_conversation", c.GetConversation) conversationGroup.POST("/get_conversations", c.GetConversations) - conversationGroup.POST("/batch_set_conversation", c.BatchSetConversations) - conversationGroup.POST("/set_recv_msg_opt", c.SetRecvMsgOpt) - conversationGroup.POST("/modify_conversation_field", c.ModifyConversationField) conversationGroup.POST("/set_conversations", c.SetConversations) } statisticsGroup := r.Group("/statistics", ParseToken) { - statisticsGroup.POST("/user_register", u.UserRegisterCount) + statisticsGroup.POST("/user/register", u.UserRegisterCount) + statisticsGroup.POST("/user/active", m.GetActiveUser) + statisticsGroup.POST("/group/create", g.GroupCreateCount) + statisticsGroup.POST("/group/active", m.GetActiveGroup) } return r } diff --git a/internal/api/third.go b/internal/api/third.go index 79be58a46..ad9475511 100644 --- a/internal/api/third.go +++ b/internal/api/third.go @@ -1,33 +1,16 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 api import ( - "math/rand" - "net/http" - "strconv" - - "github.com/gin-gonic/gin" - "github.com/OpenIMSDK/Open-IM-Server/pkg/a2r" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext" "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry" "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third" "github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient" + "github.com/gin-gonic/gin" + "math/rand" + "net/http" + "strconv" ) type ThirdApi rpcclient.Third @@ -36,54 +19,55 @@ func NewThirdApi(discov discoveryregistry.SvcDiscoveryRegistry) ThirdApi { return ThirdApi(*rpcclient.NewThird(discov)) } -func (o *ThirdApi) ApplyPut(c *gin.Context) { - a2r.Call(third.ThirdClient.ApplyPut, o.Client, c) +func (o *ThirdApi) FcmUpdateToken(c *gin.Context) { + a2r.Call(third.ThirdClient.FcmUpdateToken, o.Client, c) +} + +func (o *ThirdApi) SetAppBadge(c *gin.Context) { + a2r.Call(third.ThirdClient.SetAppBadge, o.Client, c) } -func (o *ThirdApi) GetPut(c *gin.Context) { - a2r.Call(third.ThirdClient.GetPut, o.Client, c) +// #################### s3 #################### + +func (o *ThirdApi) PartLimit(c *gin.Context) { + a2r.Call(third.ThirdClient.PartLimit, o.Client, c) } -func (o *ThirdApi) ConfirmPut(c *gin.Context) { - a2r.Call(third.ThirdClient.ConfirmPut, o.Client, c) +func (o *ThirdApi) PartSize(c *gin.Context) { + a2r.Call(third.ThirdClient.PartSize, o.Client, c) } -func (o *ThirdApi) GetHash(c *gin.Context) { - a2r.Call(third.ThirdClient.GetHashInfo, o.Client, c) +func (o *ThirdApi) InitiateMultipartUpload(c *gin.Context) { + a2r.Call(third.ThirdClient.InitiateMultipartUpload, o.Client, c) } -func (o *ThirdApi) FcmUpdateToken(c *gin.Context) { - a2r.Call(third.ThirdClient.FcmUpdateToken, o.Client, c) +func (o *ThirdApi) AuthSign(c *gin.Context) { + a2r.Call(third.ThirdClient.AuthSign, o.Client, c) } -func (o *ThirdApi) SetAppBadge(c *gin.Context) { - a2r.Call(third.ThirdClient.SetAppBadge, o.Client, c) +func (o *ThirdApi) CompleteMultipartUpload(c *gin.Context) { + a2r.Call(third.ThirdClient.CompleteMultipartUpload, o.Client, c) } -func (o *ThirdApi) GetURL(c *gin.Context) { - if c.Request.Method == http.MethodPost { - a2r.Call(third.ThirdClient.GetUrl, o.Client, c) - return - } - name := c.Query("name") +func (o *ThirdApi) AccessURL(c *gin.Context) { + a2r.Call(third.ThirdClient.AccessURL, o.Client, c) +} + +func (o *ThirdApi) ObjectRedirect(c *gin.Context) { + name := c.Param("name") if name == "" { c.String(http.StatusBadRequest, "name is empty") return } + if name[0] == '/' { + name = name[1:] + } operationID := c.Query("operationID") if operationID == "" { - operationID = "auto_" + strconv.Itoa(rand.Int()) - } - expires, _ := strconv.ParseInt(c.Query("expires"), 10, 64) - if expires <= 0 { - expires = 3600 * 1000 + operationID = strconv.Itoa(rand.Int()) } - attachment, _ := strconv.ParseBool(c.Query("attachment")) - c.Set(constant.OperationID, operationID) - resp, err := o.Client.GetUrl( - mcontext.SetOperationID(c, operationID), - &third.GetUrlReq{Name: name, Expires: expires, Attachment: attachment}, - ) + ctx := mcontext.SetOperationID(c, operationID) + resp, err := o.Client.AccessURL(ctx, &third.AccessURLReq{Name: name}) if err != nil { if errs.ErrArgs.Is(err) { c.String(http.StatusBadRequest, err.Error()) diff --git a/internal/api/user.go b/internal/api/user.go index e99e17b00..4e3fb7f7f 100644 --- a/internal/api/user.go +++ b/internal/api/user.go @@ -19,10 +19,12 @@ import ( "github.com/OpenIMSDK/Open-IM-Server/pkg/a2r" "github.com/OpenIMSDK/Open-IM-Server/pkg/apiresp" - "github.com/OpenIMSDK/Open-IM-Server/pkg/apistruct" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry" "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" + "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msggateway" "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/user" "github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient" ) @@ -62,17 +64,118 @@ func (u *UserApi) GetUsers(c *gin.Context) { } func (u *UserApi) GetUsersOnlineStatus(c *gin.Context) { - params := apistruct.ManagementSendMsgReq{} - if err := c.BindJSON(¶ms); err != nil { + var req msggateway.GetUsersOnlineStatusReq + if err := c.BindJSON(&req); err != nil { apiresp.GinError(c, errs.ErrArgs.WithDetail(err.Error()).Wrap()) return } - if !tokenverify.IsAppManagerUid(c) { - apiresp.GinError(c, errs.ErrNoPermission.Wrap("only app manager can send message")) + conns, err := u.Discov.GetConns(c, config.Config.RpcRegisterName.OpenImMessageGatewayName) + if err != nil { + apiresp.GinError(c, err) return } + + var wsResult []*msggateway.GetUsersOnlineStatusResp_SuccessResult + var respResult []*msggateway.GetUsersOnlineStatusResp_SuccessResult + flag := false + + //Online push message + for _, v := range conns { + msgClient := msggateway.NewMsgGatewayClient(v) + reply, err := msgClient.GetUsersOnlineStatus(c, &req) + if err != nil { + log.ZWarn(c, "GetUsersOnlineStatus rpc err", err) + continue + } else { + wsResult = append(wsResult, reply.SuccessResult...) + } + } + // 遍历 api 请求体中的 userIDs + for _, v1 := range req.UserIDs { + flag = false + res := new(msggateway.GetUsersOnlineStatusResp_SuccessResult) + // 遍历从各个网关中获取的在线结果 + for _, v2 := range wsResult { + // 如果匹配上说明在线,反之 + if v2.UserID == v1 { + flag = true + res.UserID = v1 + res.Status = constant.OnlineStatus + res.DetailPlatformStatus = append(res.DetailPlatformStatus, v2.DetailPlatformStatus...) + break + } + } + if !flag { + res.UserID = v1 + res.Status = constant.OnlineStatus + } + respResult = append(respResult, res) + } + apiresp.GinSuccess(c, respResult) } func (u *UserApi) UserRegisterCount(c *gin.Context) { a2r.Call(user.UserClient.UserRegisterCount, u.Client, c) } + +func (u *UserApi) GetUsersOnlineTokenDetail(c *gin.Context) { + var wsResult []*msggateway.GetUsersOnlineStatusResp_SuccessResult + var respResult []*msggateway.SingleDetail + flag := false + var req msggateway.GetUsersOnlineStatusReq + if err := c.BindJSON(&req); err != nil { + apiresp.GinError(c, errs.ErrArgs.WithDetail(err.Error()).Wrap()) + return + } + conns, err := u.Discov.GetConns(c, config.Config.RpcRegisterName.OpenImMessageGatewayName) + if err != nil { + apiresp.GinError(c, err) + return + } + //Online push message + for _, v := range conns { + msgClient := msggateway.NewMsgGatewayClient(v) + reply, err := msgClient.GetUsersOnlineStatus(c, &req) + if err != nil { + log.ZWarn(c, "GetUsersOnlineStatus rpc err", err) + continue + } else { + wsResult = append(wsResult, reply.SuccessResult...) + } + } + + for _, v1 := range req.UserIDs { + m := make(map[string][]string, 10) + flag = false + temp := new(msggateway.SingleDetail) + for _, v2 := range wsResult { + if v2.UserID == v1 { + flag = true + temp.UserID = v1 + temp.Status = constant.OnlineStatus + for _, status := range v2.DetailPlatformStatus { + if v, ok := m[status.Platform]; ok { + m[status.Platform] = append(v, status.Token) + } else { + m[status.Platform] = []string{status.Token} + } + } + } + + } + for p, tokens := range m { + t := new(msggateway.SinglePlatformToken) + t.Platform = p + t.Token = tokens + t.Total = int32(len(tokens)) + temp.SinglePlatformToken = append(temp.SinglePlatformToken, t) + } + + if flag { + respResult = append(respResult, temp) + } + } + + apiresp.GinSuccess(c, respResult) + +} diff --git a/internal/msggateway/client.go b/internal/msggateway/client.go index 439a98fee..ec3e08d7c 100644 --- a/internal/msggateway/client.go +++ b/internal/msggateway/client.go @@ -21,14 +21,13 @@ import ( "runtime/debug" "sync" - "google.golang.org/protobuf/proto" - "github.com/OpenIMSDK/Open-IM-Server/pkg/apiresp" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext" "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" + "google.golang.org/protobuf/proto" ) var ErrConnClosed = errors.New("conn has closed") @@ -68,6 +67,7 @@ type Client struct { longConnServer LongConnServer closed bool closedErr error + token string } func newClient(ctx *UserConnContext, conn LongConn, isCompress bool) *Client { @@ -80,13 +80,7 @@ func newClient(ctx *UserConnContext, conn LongConn, isCompress bool) *Client { ctx: ctx, } } - -func (c *Client) ResetClient( - ctx *UserConnContext, - conn LongConn, - isBackground, isCompress bool, - longConnServer LongConnServer, -) { +func (c *Client) ResetClient(ctx *UserConnContext, conn LongConn, isBackground, isCompress bool, longConnServer LongConnServer, token string) { c.w = new(sync.Mutex) c.conn = conn c.PlatformID = utils.StringToInt(ctx.GetPlatformID()) @@ -98,6 +92,7 @@ func (c *Client) ResetClient( c.IsBackground = false c.closed = false c.closedErr = nil + c.token = token } func (c *Client) pongHandler(_ string) error { c.conn.SetReadDeadline(pongWait) @@ -166,9 +161,7 @@ func (c *Client) handleMessage(message []byte) error { if binaryReq.SendID != c.UserID { return utils.Wrap(errors.New("exception conn userID not same to req userID"), binaryReq.String()) } - ctx := mcontext.WithMustInfoCtx( - []string{binaryReq.OperationID, binaryReq.SendID, constant.PlatformIDToName(c.PlatformID), c.ctx.GetConnID()}, - ) + ctx := mcontext.WithMustInfoCtx([]string{binaryReq.OperationID, binaryReq.SendID, constant.PlatformIDToName(c.PlatformID), c.ctx.GetConnID()}) log.ZDebug(ctx, "gateway req message", "req", binaryReq.String()) var messageErr error var resp []byte @@ -186,12 +179,7 @@ func (c *Client) handleMessage(message []byte) error { case WsSetBackgroundStatus: resp, messageErr = c.setAppBackgroundStatus(ctx, binaryReq) default: - return fmt.Errorf( - "ReqIdentifier failed,sendID:%s,msgIncr:%s,reqIdentifier:%d", - binaryReq.SendID, - binaryReq.MsgIncr, - binaryReq.ReqIdentifier, - ) + return fmt.Errorf("ReqIdentifier failed,sendID:%s,msgIncr:%s,reqIdentifier:%d", binaryReq.SendID, binaryReq.MsgIncr, binaryReq.ReqIdentifier) } c.replyMessage(ctx, &binaryReq, messageErr, resp) return nil diff --git a/internal/msggateway/hub_server.go b/internal/msggateway/hub_server.go index a7d571e20..ea7b9fd8d 100644 --- a/internal/msggateway/hub_server.go +++ b/internal/msggateway/hub_server.go @@ -101,6 +101,7 @@ func (s *Server) GetUsersOnlineStatus( ps.Platform = constant.PlatformIDToName(client.PlatformID) ps.Status = constant.OnlineStatus ps.ConnID = client.ctx.GetConnID() + ps.Token = client.token ps.IsBackground = client.IsBackground temp.Status = constant.OnlineStatus temp.DetailPlatformStatus = append(temp.DetailPlatformStatus, ps) @@ -179,11 +180,14 @@ func (s *Server) KickUserOffline( for _, v := range req.KickUserIDList { if clients, _, ok := s.LongConnServer.GetUserPlatformCons(v, int(req.PlatformID)); ok { for _, client := range clients { + log.ZDebug(ctx, "kick user offline", "userID", v, "platformID", req.PlatformID, "client", client) err := client.KickOnlineMessage() if err != nil { return nil, err } } + } else { + log.ZWarn(ctx, "conn not exist", nil, "userID", v, "platformID", req.PlatformID) } } return &msggateway.KickUserOfflineResp{}, nil diff --git a/internal/msggateway/n_ws_server.go b/internal/msggateway/n_ws_server.go index 53469fca8..c204dc115 100644 --- a/internal/msggateway/n_ws_server.go +++ b/internal/msggateway/n_ws_server.go @@ -381,7 +381,7 @@ func (ws *WsServer) wsHandler(w http.ResponseWriter, r *http.Request) { } } client := ws.clientPool.Get().(*Client) - client.ResetClient(connContext, wsLongConn, connContext.GetBackground(), compression, ws) + client.ResetClient(connContext, wsLongConn, connContext.GetBackground(), compression, ws, token) ws.registerChan <- client go client.readMessage() } diff --git a/internal/msgtransfer/init.go b/internal/msgtransfer/init.go index 946048f0c..1f166d743 100644 --- a/internal/msgtransfer/init.go +++ b/internal/msgtransfer/init.go @@ -1,17 +1,3 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 msgtransfer import ( @@ -19,28 +5,26 @@ import ( "sync" "time" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/relation" relationTb "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/tx" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/unrelation" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/mw" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome" openKeeper "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry/zookeeper" "github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) type MsgTransfer struct { persistentCH *PersistentConsumerHandler // 聊天记录持久化到mysql的消费者 订阅的topic: ws2ms_chat historyCH *OnlineHistoryRedisConsumerHandler // 这个消费者聚合消息, 订阅的topic:ws2ms_chat, 修改通知发往msg_to_modify topic, 消息存入redis后Incr Redis, 再发消息到ms2pschat topic推送, 发消息到msg_to_mongo topic持久化 historyMongoCH *OnlineHistoryMongoConsumerHandler // mongoDB批量插入, 成功后删除redis中消息,以及处理删除通知消息删除的 订阅的topic: msg_to_mongo - modifyCH *ModifyMsgConsumerHandler // 负责消费修改消息通知的consumer, 订阅的topic: msg_to_modify + // modifyCH *ModifyMsgConsumerHandler // 负责消费修改消息通知的consumer, 订阅的topic: msg_to_modify } func StartTransfer(prometheusPort int) error { @@ -62,18 +46,9 @@ func StartTransfer(prometheusPort int) error { if err := mongo.CreateMsgIndex(); err != nil { return err } - client, err := openKeeper.NewClient( - config.Config.Zookeeper.ZkAddr, - config.Config.Zookeeper.Schema, - openKeeper.WithFreq( - time.Hour, - ), - openKeeper.WithRoundRobin(), - openKeeper.WithUserNameAndPassword(config.Config.Zookeeper.Username, - config.Config.Zookeeper.Password), - openKeeper.WithTimeout(10), - openKeeper.WithLogger(log.NewZkLogger()), - ) + client, err := openKeeper.NewClient(config.Config.Zookeeper.ZkAddr, config.Config.Zookeeper.Schema, + openKeeper.WithFreq(time.Hour), openKeeper.WithRoundRobin(), openKeeper.WithUserNameAndPassword(config.Config.Zookeeper.Username, + config.Config.Zookeeper.Password), openKeeper.WithTimeout(10), openKeeper.WithLogger(log.NewZkLogger())) if err != nil { return err } @@ -83,35 +58,20 @@ func StartTransfer(prometheusPort int) error { client.AddOption(mw.GrpcClient(), grpc.WithTransportCredentials(insecure.NewCredentials())) msgModel := cache.NewMsgCacheModel(rdb) msgDocModel := unrelation.NewMsgMongoDriver(mongo.GetDatabase()) - extendMsgModel := unrelation.NewExtendMsgSetMongoDriver(mongo.GetDatabase()) - extendMsgCache := cache.NewExtendMsgSetCacheRedis(rdb, extendMsgModel, cache.GetDefaultOpt()) chatLogDatabase := controller.NewChatLogDatabase(relation.NewChatLogGorm(db)) - extendMsgDatabase := controller.NewExtendMsgDatabase(extendMsgModel, extendMsgCache, tx.NewMongo(mongo.GetClient())) msgDatabase := controller.NewCommonMsgDatabase(msgDocModel, msgModel) conversationRpcClient := rpcclient.NewConversationRpcClient(client) groupRpcClient := rpcclient.NewGroupRpcClient(client) - msgTransfer := NewMsgTransfer( - chatLogDatabase, - extendMsgDatabase, - msgDatabase, - &conversationRpcClient, - &groupRpcClient, - ) + msgTransfer := NewMsgTransfer(chatLogDatabase, msgDatabase, &conversationRpcClient, &groupRpcClient) msgTransfer.initPrometheus() return msgTransfer.Start(prometheusPort) } func NewMsgTransfer(chatLogDatabase controller.ChatLogDatabase, - extendMsgDatabase controller.ExtendMsgDatabase, msgDatabase controller.CommonMsgDatabase, + msgDatabase controller.CommonMsgDatabase, conversationRpcClient *rpcclient.ConversationRpcClient, groupRpcClient *rpcclient.GroupRpcClient) *MsgTransfer { - return &MsgTransfer{ - persistentCH: NewPersistentConsumerHandler(chatLogDatabase), - historyCH: NewOnlineHistoryRedisConsumerHandler(msgDatabase, conversationRpcClient, groupRpcClient), - historyMongoCH: NewOnlineHistoryMongoConsumerHandler( - msgDatabase, - ), - modifyCH: NewModifyMsgConsumerHandler(extendMsgDatabase), - } + return &MsgTransfer{persistentCH: NewPersistentConsumerHandler(chatLogDatabase), historyCH: NewOnlineHistoryRedisConsumerHandler(msgDatabase, conversationRpcClient, groupRpcClient), + historyMongoCH: NewOnlineHistoryMongoConsumerHandler(msgDatabase)} } func (m *MsgTransfer) initPrometheus() { @@ -136,7 +96,7 @@ func (m *MsgTransfer) Start(prometheusPort int) error { } go m.historyCH.historyConsumerGroup.RegisterHandleAndConsumer(m.historyCH) go m.historyMongoCH.historyConsumerGroup.RegisterHandleAndConsumer(m.historyMongoCH) - go m.modifyCH.modifyMsgConsumerGroup.RegisterHandleAndConsumer(m.modifyCH) + // go m.modifyCH.modifyMsgConsumerGroup.RegisterHandleAndConsumer(m.modifyCH) err := prome.StartPrometheusSrv(prometheusPort) if err != nil { return err diff --git a/internal/msgtransfer/modify_msg_handler.go b/internal/msgtransfer/modify_msg_handler.go deleted file mode 100644 index 38a2f5fce..000000000 --- a/internal/msgtransfer/modify_msg_handler.go +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 msgtransfer - -import ( - "context" - "encoding/json" - - "github.com/Shopify/sarama" - - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller" - unRelationTb "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/unrelation" - kfk "github.com/OpenIMSDK/Open-IM-Server/pkg/common/kafka" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext" - pbMsg "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg" - "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" - "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" - - "google.golang.org/protobuf/proto" -) - -type ModifyMsgConsumerHandler struct { - modifyMsgConsumerGroup *kfk.MConsumerGroup - - extendMsgDatabase controller.ExtendMsgDatabase - extendSetMsgModel unRelationTb.ExtendMsgSetModel -} - -func NewModifyMsgConsumerHandler(database controller.ExtendMsgDatabase) *ModifyMsgConsumerHandler { - return &ModifyMsgConsumerHandler{ - modifyMsgConsumerGroup: kfk.NewMConsumerGroup(&kfk.MConsumerGroupConfig{KafkaVersion: sarama.V2_0_0_0, - OffsetsInitial: sarama.OffsetNewest, IsReturnErr: false}, []string{config.Config.Kafka.MsgToModify.Topic}, - config.Config.Kafka.Addr, config.Config.Kafka.ConsumerGroupID.MsgToModify), - extendMsgDatabase: database, - } -} - -func (ModifyMsgConsumerHandler) Setup(_ sarama.ConsumerGroupSession) error { return nil } -func (ModifyMsgConsumerHandler) Cleanup(_ sarama.ConsumerGroupSession) error { return nil } -func (mmc *ModifyMsgConsumerHandler) ConsumeClaim(sess sarama.ConsumerGroupSession, - claim sarama.ConsumerGroupClaim) error { - for msg := range claim.Messages() { - ctx := mmc.modifyMsgConsumerGroup.GetContextFromMsg(msg) - log.ZDebug( - ctx, - "kafka get info to mysql", - "ModifyMsgConsumerHandler", - msg.Topic, - "msgPartition", - msg.Partition, - "msg", - string(msg.Value), - "key", - string(msg.Key), - ) - if len(msg.Value) != 0 { - mmc.ModifyMsg(ctx, msg, string(msg.Key), sess) - } else { - log.ZError(ctx, "msg get from kafka but is nil", nil, "key", msg.Key) - } - sess.MarkMessage(msg, "") - } - return nil -} - -func (mmc *ModifyMsgConsumerHandler) ModifyMsg( - ctx context.Context, - cMsg *sarama.ConsumerMessage, - msgKey string, - _ sarama.ConsumerGroupSession, -) { - msgFromMQ := pbMsg.MsgDataToModifyByMQ{} - operationID := mcontext.GetOperationID(ctx) - err := proto.Unmarshal(cMsg.Value, &msgFromMQ) - if err != nil { - log.ZError(ctx, "msg_transfer Unmarshal msg err", err, "msg", string(cMsg.Value)) - return - } - log.ZDebug(ctx, "proto.Unmarshal MsgDataToMQ", "msgs", msgFromMQ.String()) - for _, msg := range msgFromMQ.Messages { - isReactionFromCache := utils.GetSwitchFromOptions(msg.Options, constant.IsReactionFromCache) - if !isReactionFromCache { - continue - } - ctx = mcontext.SetOperationID(ctx, operationID) - if msg.ContentType == constant.ReactionMessageModifier { - notification := &sdkws.ReactionMessageModifierNotification{} - if err := json.Unmarshal(msg.Content, notification); err != nil { - continue - } - if notification.IsExternalExtensions { - continue - } - if !notification.IsReact { - // first time to modify - var reactionExtensionList = make(map[string]unRelationTb.KeyValueModel) - extendMsg := unRelationTb.ExtendMsgModel{ - ReactionExtensionList: reactionExtensionList, - ClientMsgID: notification.ClientMsgID, - MsgFirstModifyTime: notification.MsgFirstModifyTime, - } - for _, v := range notification.SuccessReactionExtensions { - reactionExtensionList[v.TypeKey] = unRelationTb.KeyValueModel{ - TypeKey: v.TypeKey, - Value: v.Value, - LatestUpdateTime: v.LatestUpdateTime, - } - } - - if err := mmc.extendMsgDatabase.InsertExtendMsg(ctx, notification.ConversationID, notification.SessionType, &extendMsg); err != nil { - // log.ZError(ctx, "MsgFirstModify InsertExtendMsg failed", notification.ConversationID, - // notification.SessionType, extendMsg, err.Error()) - continue - } - } else { - if err := mmc.extendMsgDatabase.InsertOrUpdateReactionExtendMsgSet(ctx, notification.ConversationID, notification.SessionType, notification.ClientMsgID, notification.MsgFirstModifyTime, mmc.extendSetMsgModel.Pb2Model(notification.SuccessReactionExtensions)); err != nil { - // log.NewError(operationID, "InsertOrUpdateReactionExtendMsgSet failed") - } - } - } else if msg.ContentType == constant.ReactionMessageDeleter { - notification := &sdkws.ReactionMessageDeleteNotification{} - if err := json.Unmarshal(msg.Content, notification); err != nil { - continue - } - if err := mmc.extendMsgDatabase.DeleteReactionExtendMsgSet(ctx, notification.ConversationID, notification.SessionType, notification.ClientMsgID, notification.MsgFirstModifyTime, mmc.extendSetMsgModel.Pb2Model(notification.SuccessReactionExtensions)); err != nil { - // log.NewError(operationID, "InsertOrUpdateReactionExtendMsgSet failed") - } - } - } -} diff --git a/internal/push/push_to_client.go b/internal/push/push_to_client.go index 7cc5b1ea4..607d862e1 100644 --- a/internal/push/push_to_client.go +++ b/internal/push/push_to_client.go @@ -1,17 +1,3 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 push import ( @@ -52,16 +38,9 @@ type Pusher struct { var errNoOfflinePusher = errors.New("no offlinePusher is configured") -func NewPusher( - discov discoveryregistry.SvcDiscoveryRegistry, - offlinePusher offlinepush.OfflinePusher, - database controller.PushDatabase, - groupLocalCache *localcache.GroupLocalCache, - conversationLocalCache *localcache.ConversationLocalCache, - conversationRpcClient *rpcclient.ConversationRpcClient, - groupRpcClient *rpcclient.GroupRpcClient, - msgRpcClient *rpcclient.MessageRpcClient, -) *Pusher { +func NewPusher(discov discoveryregistry.SvcDiscoveryRegistry, offlinePusher offlinepush.OfflinePusher, database controller.PushDatabase, + groupLocalCache *localcache.GroupLocalCache, conversationLocalCache *localcache.ConversationLocalCache, + conversationRpcClient *rpcclient.ConversationRpcClient, groupRpcClient *rpcclient.GroupRpcClient, msgRpcClient *rpcclient.MessageRpcClient) *Pusher { return &Pusher{ discov: discov, database: database, @@ -108,18 +87,7 @@ func (p *Pusher) Push2User(ctx context.Context, userIDs []string, msg *sdkws.Msg return err } isOfflinePush := utils.GetSwitchFromOptions(msg.Options, constant.IsOfflinePush) - log.ZDebug( - ctx, - "push_result", - "ws push result", - wsResults, - "sendData", - msg, - "isOfflinePush", - isOfflinePush, - "push_to_userID", - userIDs, - ) + log.ZDebug(ctx, "push_result", "ws push result", wsResults, "sendData", msg, "isOfflinePush", isOfflinePush, "push_to_userID", userIDs) p.successCount++ for _, userID := range userIDs { if isOfflinePush && userID != msg.SendID { @@ -170,15 +138,7 @@ func (p *Pusher) Push2SuperGroup(ctx context.Context, groupID string, msg *sdkws } defer func(groupID string, userIDs []string) { if err := p.DeleteMemberAndSetConversationSeq(ctx, groupID, userIDs); err != nil { - log.ZError( - ctx, - "MemberQuitNotification DeleteMemberAndSetConversationSeq", - err, - "groupID", - groupID, - "userIDs", - userIDs, - ) + log.ZError(ctx, "MemberQuitNotification DeleteMemberAndSetConversationSeq", err, "groupID", groupID, "userIDs", userIDs) } }(groupID, []string{tips.QuitUser.UserID}) pushToUserIDs = append(pushToUserIDs, tips.QuitUser.UserID) @@ -187,21 +147,10 @@ func (p *Pusher) Push2SuperGroup(ctx context.Context, groupID string, msg *sdkws if p.UnmarshalNotificationElem(msg.Content, &tips) != nil { return err } - kickedUsers := utils.Slice( - tips.KickedUserList, - func(e *sdkws.GroupMemberFullInfo) string { return e.UserID }, - ) + kickedUsers := utils.Slice(tips.KickedUserList, func(e *sdkws.GroupMemberFullInfo) string { return e.UserID }) defer func(groupID string, userIDs []string) { if err := p.DeleteMemberAndSetConversationSeq(ctx, groupID, userIDs); err != nil { - log.ZError( - ctx, - "MemberKickedNotification DeleteMemberAndSetConversationSeq", - err, - "groupID", - groupID, - "userIDs", - userIDs, - ) + log.ZError(ctx, "MemberKickedNotification DeleteMemberAndSetConversationSeq", err, "groupID", groupID, "userIDs", userIDs) } }(groupID, kickedUsers) pushToUserIDs = append(pushToUserIDs, kickedUsers...) @@ -211,16 +160,7 @@ func (p *Pusher) Push2SuperGroup(ctx context.Context, groupID string, msg *sdkws if p.UnmarshalNotificationElem(msg.Content, &tips) != nil { return err } - log.ZInfo( - ctx, - "GroupDismissedNotificationInfo****", - "groupID", - groupID, - "num", - len(pushToUserIDs), - "list", - pushToUserIDs, - ) + log.ZInfo(ctx, "GroupDismissedNotificationInfo****", "groupID", groupID, "num", len(pushToUserIDs), "list", pushToUserIDs) if len(config.Config.Manager.UserID) > 0 { ctx = mcontext.WithOpUserIDContext(ctx, config.Config.Manager.UserID[0]) } @@ -284,23 +224,9 @@ func (p *Pusher) Push2SuperGroup(ctx context.Context, groupID string, msg *sdkws log.ZError(ctx, "offlinePushMsg failed", err, "groupID", groupID, "msg", msg) return err } - _, err := p.GetConnsAndOnlinePush( - ctx, - msg, - utils.IntersectString(needOfflinePushUserIDs, WebAndPcBackgroundUserIDs), - ) + _, err := p.GetConnsAndOnlinePush(ctx, msg, utils.IntersectString(needOfflinePushUserIDs, WebAndPcBackgroundUserIDs)) if err != nil { - log.ZError( - ctx, - "offlinePushMsg failed", - err, - "groupID", - groupID, - "msg", - msg, - "userIDs", - utils.IntersectString(needOfflinePushUserIDs, WebAndPcBackgroundUserIDs), - ) + log.ZError(ctx, "offlinePushMsg failed", err, "groupID", groupID, "msg", msg, "userIDs", utils.IntersectString(needOfflinePushUserIDs, WebAndPcBackgroundUserIDs)) return err } } @@ -308,11 +234,7 @@ func (p *Pusher) Push2SuperGroup(ctx context.Context, groupID string, msg *sdkws return nil } -func (p *Pusher) GetConnsAndOnlinePush( - ctx context.Context, - msg *sdkws.MsgData, - pushToUserIDs []string, -) (wsResults []*msggateway.SingleMsgToUserResults, err error) { +func (p *Pusher) GetConnsAndOnlinePush(ctx context.Context, msg *sdkws.MsgData, pushToUserIDs []string) (wsResults []*msggateway.SingleMsgToUserResults, err error) { conns, err := p.discov.GetConns(ctx, config.Config.RpcRegisterName.OpenImMessageGatewayName) log.ZDebug(ctx, "get gateway conn", "conn length", len(conns)) if err != nil { @@ -321,11 +243,7 @@ func (p *Pusher) GetConnsAndOnlinePush( //Online push message for _, v := range conns { msgClient := msggateway.NewMsgGatewayClient(v) - reply, err := msgClient.SuperGroupOnlineBatchPushOneMsg( - ctx, - &msggateway.OnlineBatchPushOneMsgReq{MsgData: msg, PushToUserIDs: pushToUserIDs}, - ) - p.discov.CloseConn(v) + reply, err := msgClient.SuperGroupOnlineBatchPushOneMsg(ctx, &msggateway.OnlineBatchPushOneMsgReq{MsgData: msg, PushToUserIDs: pushToUserIDs}) if err != nil { continue } @@ -338,12 +256,7 @@ func (p *Pusher) GetConnsAndOnlinePush( return wsResults, nil } -func (p *Pusher) offlinePushMsg( - ctx context.Context, - conversationID string, - msg *sdkws.MsgData, - offlinePushUserIDs []string, -) error { +func (p *Pusher) offlinePushMsg(ctx context.Context, conversationID string, msg *sdkws.MsgData, offlinePushUserIDs []string) error { title, content, opts, err := p.getOfflinePushInfos(conversationID, msg) if err != nil { return err @@ -377,10 +290,7 @@ func (p *Pusher) GetOfflinePushOpts(msg *sdkws.MsgData) (opts *offlinepush.Opts, return opts, nil } -func (p *Pusher) getOfflinePushInfos( - conversationID string, - msg *sdkws.MsgData, -) (title, content string, opts *offlinepush.Opts, err error) { +func (p *Pusher) getOfflinePushInfos(conversationID string, msg *sdkws.MsgData) (title, content string, opts *offlinepush.Opts, err error) { if p.offlinePusher == nil { err = errNoOfflinePusher return diff --git a/internal/rpc/auth/auth.go b/internal/rpc/auth/auth.go index 9376a5ccc..48e21fbce 100644 --- a/internal/rpc/auth/auth.go +++ b/internal/rpc/auth/auth.go @@ -60,7 +60,7 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e func (s *authServer) UserToken(ctx context.Context, req *pbAuth.UserTokenReq) (*pbAuth.UserTokenResp, error) { resp := pbAuth.UserTokenResp{} if req.Secret != config.Config.Secret { - return nil, errs.ErrIdentity.Wrap("secret invalid") + return nil, errs.ErrNoPermission.Wrap("secret invalid") } if _, err := s.userRpcClient.GetUserInfo(ctx, req.UserID); err != nil { return nil, err @@ -115,14 +115,13 @@ func (s *authServer) ParseToken( } func (s *authServer) ForceLogout(ctx context.Context, req *pbAuth.ForceLogoutReq) (*pbAuth.ForceLogoutResp, error) { - resp := pbAuth.ForceLogoutResp{} if err := tokenverify.CheckAdmin(ctx); err != nil { return nil, err } if err := s.forceKickOff(ctx, req.UserID, req.PlatformID, mcontext.GetOperationID(ctx)); err != nil { return nil, err } - return &resp, nil + return &pbAuth.ForceLogoutResp{}, nil } func (s *authServer) forceKickOff(ctx context.Context, userID string, platformID int32, operationID string) error { @@ -134,8 +133,7 @@ func (s *authServer) forceKickOff(ctx context.Context, userID string, platformID client := msggateway.NewMsgGatewayClient(v) kickReq := &msggateway.KickUserOfflineReq{KickUserIDList: []string{userID}, PlatformID: platformID} _, err := client.KickUserOffline(ctx, kickReq) - s.RegisterCenter.CloseConn(v) return utils.Wrap(err, "") } - return errs.ErrInternalServer.Wrap() + return nil } diff --git a/internal/rpc/conversation/conversaion.go b/internal/rpc/conversation/conversaion.go index 640c09991..1f45d0224 100644 --- a/internal/rpc/conversation/conversaion.go +++ b/internal/rpc/conversation/conversaion.go @@ -1,24 +1,8 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 conversation import ( "context" - "google.golang.org/grpc" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/convert" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache" @@ -33,6 +17,7 @@ import ( "github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient" "github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient/notification" "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" + "google.golang.org/grpc" ) type conversationServer struct { @@ -59,19 +44,12 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e pbConversation.RegisterConversationServer(server, &conversationServer{ conversationNotificationSender: notification.NewConversationNotificationSender(&msgRpcClient), groupRpcClient: &groupRpcClient, - conversationDatabase: controller.NewConversationDatabase( - conversationDB, - cache.NewConversationRedis(rdb, cache.GetDefaultOpt(), conversationDB), - tx.NewGorm(db), - ), + conversationDatabase: controller.NewConversationDatabase(conversationDB, cache.NewConversationRedis(rdb, cache.GetDefaultOpt(), conversationDB), tx.NewGorm(db)), }) return nil } -func (c *conversationServer) GetConversation( - ctx context.Context, - req *pbConversation.GetConversationReq, -) (*pbConversation.GetConversationResp, error) { +func (c *conversationServer) GetConversation(ctx context.Context, req *pbConversation.GetConversationReq) (*pbConversation.GetConversationResp, error) { conversations, err := c.conversationDatabase.FindConversations(ctx, req.OwnerUserID, []string{req.ConversationID}) if err != nil { return nil, err @@ -84,10 +62,7 @@ func (c *conversationServer) GetConversation( return resp, nil } -func (c *conversationServer) GetAllConversations( - ctx context.Context, - req *pbConversation.GetAllConversationsReq, -) (*pbConversation.GetAllConversationsResp, error) { +func (c *conversationServer) GetAllConversations(ctx context.Context, req *pbConversation.GetAllConversationsReq) (*pbConversation.GetAllConversationsResp, error) { conversations, err := c.conversationDatabase.GetUserAllConversation(ctx, req.OwnerUserID) if err != nil { return nil, err @@ -97,10 +72,7 @@ func (c *conversationServer) GetAllConversations( return resp, nil } -func (c *conversationServer) GetConversations( - ctx context.Context, - req *pbConversation.GetConversationsReq, -) (*pbConversation.GetConversationsResp, error) { +func (c *conversationServer) GetConversations(ctx context.Context, req *pbConversation.GetConversationsReq) (*pbConversation.GetConversationsResp, error) { conversations, err := c.conversationDatabase.FindConversations(ctx, req.OwnerUserID, req.ConversationIDs) if err != nil { return nil, err @@ -110,32 +82,12 @@ func (c *conversationServer) GetConversations( return resp, nil } -func (c *conversationServer) BatchSetConversations( - ctx context.Context, - req *pbConversation.BatchSetConversationsReq, -) (*pbConversation.BatchSetConversationsResp, error) { - conversations := convert.ConversationsPb2DB(req.Conversations) - err := c.conversationDatabase.SetUserConversations(ctx, req.OwnerUserID, conversations) - if err != nil { - return nil, err - } - _ = c.conversationNotificationSender.ConversationChangeNotification(ctx, req.OwnerUserID) - return &pbConversation.BatchSetConversationsResp{}, nil -} - -func (c *conversationServer) SetConversation( - ctx context.Context, - req *pbConversation.SetConversationReq, -) (*pbConversation.SetConversationResp, error) { +func (c *conversationServer) SetConversation(ctx context.Context, req *pbConversation.SetConversationReq) (*pbConversation.SetConversationResp, error) { var conversation tableRelation.ConversationModel if err := utils.CopyStructFields(&conversation, req.Conversation); err != nil { return nil, err } - err := c.conversationDatabase.SetUserConversations( - ctx, - req.Conversation.OwnerUserID, - []*tableRelation.ConversationModel{&conversation}, - ) + err := c.conversationDatabase.SetUserConversations(ctx, req.Conversation.OwnerUserID, []*tableRelation.ConversationModel{&conversation}) if err != nil { return nil, err } @@ -144,79 +96,7 @@ func (c *conversationServer) SetConversation( return resp, nil } -func (c *conversationServer) SetRecvMsgOpt( - ctx context.Context, - req *pbConversation.SetRecvMsgOptReq, -) (*pbConversation.SetRecvMsgOptResp, error) { - if err := c.conversationDatabase.SetUsersConversationFiledTx(ctx, []string{req.OwnerUserID}, &tableRelation.ConversationModel{OwnerUserID: req.OwnerUserID, ConversationID: req.ConversationID, RecvMsgOpt: req.RecvMsgOpt}, map[string]interface{}{"recv_msg_opt": req.RecvMsgOpt}); err != nil { - return nil, err - } - _ = c.conversationNotificationSender.ConversationChangeNotification(ctx, req.OwnerUserID) - return &pbConversation.SetRecvMsgOptResp{}, nil -} - -// deprecated -func (c *conversationServer) ModifyConversationField( - ctx context.Context, - req *pbConversation.ModifyConversationFieldReq, -) (*pbConversation.ModifyConversationFieldResp, error) { - resp := &pbConversation.ModifyConversationFieldResp{} - var err error - if req.Conversation.ConversationType == constant.GroupChatType { - groupInfo, err := c.groupRpcClient.GetGroupInfo(ctx, req.Conversation.GroupID) - if err != nil { - return nil, err - } - if groupInfo.Status == constant.GroupStatusDismissed && req.FieldType != constant.FieldUnread { - return nil, err - } - } - conversation := convert.ConversationPb2DB(req.Conversation) - if req.FieldType == constant.FieldIsPrivateChat { - err := c.conversationDatabase.SyncPeerUserPrivateConversationTx( - ctx, - []*tableRelation.ConversationModel{conversation}, - ) - if err != nil { - return nil, err - } - c.conversationNotificationSender.ConversationSetPrivateNotification( - ctx, - req.Conversation.OwnerUserID, - req.Conversation.UserID, - req.Conversation.IsPrivateChat, - ) - return resp, nil - } - filedMap := make(map[string]interface{}) - switch req.FieldType { - case constant.FieldRecvMsgOpt: - filedMap["recv_msg_opt"] = req.Conversation.RecvMsgOpt - case constant.FieldGroupAtType: - filedMap["group_at_type"] = req.Conversation.GroupAtType - case constant.FieldIsPinned: - filedMap["is_pinned"] = req.Conversation.IsPinned - case constant.FieldEx: - filedMap["ex"] = req.Conversation.Ex - case constant.FieldAttachedInfo: - filedMap["attached_info"] = req.Conversation.AttachedInfo - case constant.FieldBurnDuration: - filedMap["burn_duration"] = req.Conversation.BurnDuration - } - err = c.conversationDatabase.SetUsersConversationFiledTx(ctx, req.UserIDList, conversation, filedMap) - if err != nil { - return nil, err - } - for _, v := range req.UserIDList { - c.conversationNotificationSender.ConversationChangeNotification(ctx, v) - } - return resp, nil -} - -func (c *conversationServer) SetConversations( - ctx context.Context, - req *pbConversation.SetConversationsReq, -) (*pbConversation.SetConversationsResp, error) { +func (c *conversationServer) SetConversations(ctx context.Context, req *pbConversation.SetConversationsReq) (*pbConversation.SetConversationsResp, error) { if req.Conversation == nil { return nil, errs.ErrArgs.Wrap("conversation must not be nil") } @@ -228,6 +108,12 @@ func (c *conversationServer) SetConversations( if groupInfo.Status == constant.GroupStatusDismissed { return nil, err } + // for _, userID := range req.UserIDs { + // if _, err := c.groupRpcClient.GetGroupMemberCache(ctx, req.Conversation.GroupID, userID); err != nil { + // log.ZError(ctx, "user not in group", err, "userID", userID, "groupID", req.Conversation.GroupID) + // return nil, err + // } + // } } var conversation tableRelation.ConversationModel conversation.ConversationID = req.Conversation.ConversationID @@ -250,24 +136,25 @@ func (c *conversationServer) SetConversations( if req.Conversation.GroupAtType != nil { m["group_at_type"] = req.Conversation.GroupAtType.Value } - if req.Conversation.IsPrivateChat != nil { + if req.Conversation.MsgDestructTime != nil { + m["msg_destruct_time"] = req.Conversation.MsgDestructTime.Value + } + if req.Conversation.IsMsgDestruct != nil { + m["is_msg_destruct"] = req.Conversation.IsMsgDestruct.Value + } + if req.Conversation.IsPrivateChat != nil && req.Conversation.ConversationType != constant.SuperGroupChatType { var conversations []*tableRelation.ConversationModel for _, ownerUserID := range req.UserIDs { conversation2 := conversation - conversation.OwnerUserID = ownerUserID - conversation.IsPrivateChat = req.Conversation.IsPrivateChat.Value + conversation2.OwnerUserID = ownerUserID + conversation2.IsPrivateChat = req.Conversation.IsPrivateChat.Value conversations = append(conversations, &conversation2) } if err := c.conversationDatabase.SyncPeerUserPrivateConversationTx(ctx, conversations); err != nil { return nil, err } - for _, ownerUserID := range req.UserIDs { - c.conversationNotificationSender.ConversationSetPrivateNotification( - ctx, - ownerUserID, - req.Conversation.UserID, - req.Conversation.IsPrivateChat.Value, - ) + for _, userID := range req.UserIDs { + c.conversationNotificationSender.ConversationSetPrivateNotification(ctx, userID, req.Conversation.UserID, req.Conversation.IsPrivateChat.Value) } } if req.Conversation.BurnDuration != nil { @@ -284,10 +171,7 @@ func (c *conversationServer) SetConversations( } // 获取超级大群开启免打扰的用户ID -func (c *conversationServer) GetRecvMsgNotNotifyUserIDs( - ctx context.Context, - req *pbConversation.GetRecvMsgNotNotifyUserIDsReq, -) (*pbConversation.GetRecvMsgNotNotifyUserIDsResp, error) { +func (c *conversationServer) GetRecvMsgNotNotifyUserIDs(ctx context.Context, req *pbConversation.GetRecvMsgNotNotifyUserIDsReq) (*pbConversation.GetRecvMsgNotNotifyUserIDsResp, error) { userIDs, err := c.conversationDatabase.FindRecvMsgNotNotifyUserIDs(ctx, req.GroupID) if err != nil { return nil, err @@ -296,10 +180,7 @@ func (c *conversationServer) GetRecvMsgNotNotifyUserIDs( } // create conversation without notification for msg redis transfer -func (c *conversationServer) CreateSingleChatConversations( - ctx context.Context, - req *pbConversation.CreateSingleChatConversationsReq, -) (*pbConversation.CreateSingleChatConversationsResp, error) { +func (c *conversationServer) CreateSingleChatConversations(ctx context.Context, req *pbConversation.CreateSingleChatConversationsReq) (*pbConversation.CreateSingleChatConversationsResp, error) { var conversation tableRelation.ConversationModel conversation.ConversationID = utils.GetConversationIDBySessionType(constant.SingleChatType, req.RecvID, req.SendID) conversation.ConversationType = constant.SingleChatType @@ -320,10 +201,7 @@ func (c *conversationServer) CreateSingleChatConversations( return &pbConversation.CreateSingleChatConversationsResp{}, nil } -func (c *conversationServer) CreateGroupChatConversations( - ctx context.Context, - req *pbConversation.CreateGroupChatConversationsReq, -) (*pbConversation.CreateGroupChatConversationsResp, error) { +func (c *conversationServer) CreateGroupChatConversations(ctx context.Context, req *pbConversation.CreateGroupChatConversationsReq) (*pbConversation.CreateGroupChatConversationsResp, error) { err := c.conversationDatabase.CreateGroupChatConversation(ctx, req.GroupID, req.UserIDs) if err != nil { return nil, err @@ -331,10 +209,7 @@ func (c *conversationServer) CreateGroupChatConversations( return &pbConversation.CreateGroupChatConversationsResp{}, nil } -func (c *conversationServer) SetConversationMaxSeq( - ctx context.Context, - req *pbConversation.SetConversationMaxSeqReq, -) (*pbConversation.SetConversationMaxSeqResp, error) { +func (c *conversationServer) SetConversationMaxSeq(ctx context.Context, req *pbConversation.SetConversationMaxSeqReq) (*pbConversation.SetConversationMaxSeqResp, error) { if err := c.conversationDatabase.UpdateUsersConversationFiled(ctx, req.OwnerUserID, req.ConversationID, map[string]interface{}{"max_seq": req.MaxSeq}); err != nil { return nil, err @@ -342,10 +217,7 @@ func (c *conversationServer) SetConversationMaxSeq( return &pbConversation.SetConversationMaxSeqResp{}, nil } -func (c *conversationServer) GetConversationIDs( - ctx context.Context, - req *pbConversation.GetConversationIDsReq, -) (*pbConversation.GetConversationIDsResp, error) { +func (c *conversationServer) GetConversationIDs(ctx context.Context, req *pbConversation.GetConversationIDsReq) (*pbConversation.GetConversationIDsResp, error) { conversationIDs, err := c.conversationDatabase.GetConversationIDs(ctx, req.UserID) if err != nil { return nil, err @@ -353,10 +225,7 @@ func (c *conversationServer) GetConversationIDs( return &pbConversation.GetConversationIDsResp{ConversationIDs: conversationIDs}, nil } -func (c *conversationServer) GetUserConversationIDsHash( - ctx context.Context, - req *pbConversation.GetUserConversationIDsHashReq, -) (*pbConversation.GetUserConversationIDsHashResp, error) { +func (c *conversationServer) GetUserConversationIDsHash(ctx context.Context, req *pbConversation.GetUserConversationIDsHashReq) (*pbConversation.GetUserConversationIDsHashResp, error) { hash, err := c.conversationDatabase.GetUserConversationIDsHash(ctx, req.OwnerUserID) if err != nil { return nil, err @@ -364,15 +233,10 @@ func (c *conversationServer) GetUserConversationIDsHash( return &pbConversation.GetUserConversationIDsHashResp{Hash: hash}, nil } -func (c *conversationServer) GetConversationsByConversationID( - ctx context.Context, - req *pbConversation.GetConversationsByConversationIDReq, -) (*pbConversation.GetConversationsByConversationIDResp, error) { +func (c *conversationServer) GetConversationsByConversationID(ctx context.Context, req *pbConversation.GetConversationsByConversationIDReq) (*pbConversation.GetConversationsByConversationIDResp, error) { conversations, err := c.conversationDatabase.GetConversationsByConversationID(ctx, req.ConversationIDs) if err != nil { return nil, err } - return &pbConversation.GetConversationsByConversationIDResp{ - Conversations: convert.ConversationsDB2Pb(conversations), - }, nil + return &pbConversation.GetConversationsByConversationIDResp{Conversations: convert.ConversationsDB2Pb(conversations)}, nil } diff --git a/internal/rpc/group/db_map.go b/internal/rpc/group/db_map.go index 2ab1a75ea..84c0e74a4 100644 --- a/internal/rpc/group/db_map.go +++ b/internal/rpc/group/db_map.go @@ -15,19 +15,23 @@ package group import ( + "context" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext" "time" pbGroup "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/group" "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" ) -func UpdateGroupInfoMap(group *sdkws.GroupInfoForSet) map[string]any { +func UpdateGroupInfoMap(ctx context.Context, group *sdkws.GroupInfoForSet) map[string]any { m := make(map[string]any) if group.GroupName != "" { m["name"] = group.GroupName } if group.Notification != "" { - m["Notification"] = group.Notification + m["notification"] = group.Notification + m["notification_update_time"] = time.Now() + m["notification_user_id"] = mcontext.GetOpUserID(ctx) } if group.Introduction != "" { m["introduction"] = group.Introduction diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go index 8daf45454..ec5d0bdb5 100644 --- a/internal/rpc/group/group.go +++ b/internal/rpc/group/group.go @@ -1,22 +1,10 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 group import ( "context" "fmt" + pbConversation "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/conversation" + "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/wrapperspb" "math/big" "math/rand" "strconv" @@ -29,8 +17,6 @@ import ( "github.com/OpenIMSDK/Open-IM-Server/pkg/common/mw/specialerror" "github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient" - "google.golang.org/grpc" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller" @@ -45,6 +31,7 @@ import ( pbGroup "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/group" "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" + "google.golang.org/grpc" ) func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error { @@ -70,17 +57,13 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e pbGroup.RegisterGroupServer(server, &groupServer{ GroupDatabase: database, User: userRpcClient, - Notification: notification.NewGroupNotificationSender( - database, - &msgRpcClient, - func(ctx context.Context, userIDs []string) ([]notification.CommonUser, error) { - users, err := userRpcClient.GetUsersInfo(ctx, userIDs) - if err != nil { - return nil, err - } - return utils.Slice(users, func(e *sdkws.UserInfo) notification.CommonUser { return e }), nil - }, - ), + Notification: notification.NewGroupNotificationSender(database, &msgRpcClient, &userRpcClient, func(ctx context.Context, userIDs []string) ([]notification.CommonUser, error) { + users, err := userRpcClient.GetUsersInfo(ctx, userIDs) + if err != nil { + return nil, err + } + return utils.Slice(users, func(e *sdkws.UserInfo) notification.CommonUser { return e }), nil + }), conversationRpcClient: conversationRpcClient, msgRpcClient: msgRpcClient, }) @@ -137,16 +120,7 @@ func (s *groupServer) GenGroupID(ctx context.Context, groupID *string) error { } } for i := 0; i < 10; i++ { - id := utils.Md5( - strings.Join( - []string{ - mcontext.GetOperationID(ctx), - strconv.FormatInt(time.Now().UnixNano(), 10), - strconv.Itoa(rand.Int()), - }, - ",;,", - ), - ) + id := utils.Md5(strings.Join([]string{mcontext.GetOperationID(ctx), strconv.FormatInt(time.Now().UnixNano(), 10), strconv.Itoa(rand.Int())}, ",;,")) bi := big.NewInt(0) bi.SetString(id[0:8], 16) id = bi.String() @@ -260,10 +234,7 @@ func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupR return resp, nil } -func (s *groupServer) GetJoinedGroupList( - ctx context.Context, - req *pbGroup.GetJoinedGroupListReq, -) (*pbGroup.GetJoinedGroupListResp, error) { +func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJoinedGroupListReq) (*pbGroup.GetJoinedGroupListResp, error) { resp := &pbGroup.GetJoinedGroupListResp{} if err := tokenverify.CheckAccessV3(ctx, req.FromUserID); err != nil { return nil, err @@ -273,8 +244,7 @@ func (s *groupServer) GetJoinedGroupList( pageNumber = req.Pagination.PageNumber showNumber = req.Pagination.ShowNumber } - // total, members, err := s.GroupDatabase.PageGroupMember(ctx, nil, []string{req.FromUserID}, nil, pageNumber, - // showNumber) + //total, members, err := s.GroupDatabase.PageGroupMember(ctx, nil, []string{req.FromUserID}, nil, pageNumber, showNumber) total, members, err := s.GroupDatabase.PageGetJoinGroup(ctx, req.FromUserID, pageNumber, showNumber) if err != nil { return nil, err @@ -313,10 +283,7 @@ func (s *groupServer) GetJoinedGroupList( return resp, nil } -func (s *groupServer) InviteUserToGroup( - ctx context.Context, - req *pbGroup.InviteUserToGroupReq, -) (*pbGroup.InviteUserToGroupResp, error) { +func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.InviteUserToGroupReq) (*pbGroup.InviteUserToGroupResp, error) { resp := &pbGroup.InviteUserToGroupResp{} if len(req.InvitedUserIDs) == 0 { return nil, errs.ErrArgs.Wrap("user empty") @@ -417,10 +384,7 @@ func (s *groupServer) InviteUserToGroup( return resp, nil } -func (s *groupServer) GetGroupAllMember( - ctx context.Context, - req *pbGroup.GetGroupAllMemberReq, -) (*pbGroup.GetGroupAllMemberResp, error) { +func (s *groupServer) GetGroupAllMember(ctx context.Context, req *pbGroup.GetGroupAllMemberReq) (*pbGroup.GetGroupAllMemberResp, error) { resp := &pbGroup.GetGroupAllMemberResp{} group, err := s.GroupDatabase.TakeGroup(ctx, req.GroupID) if err != nil { @@ -448,10 +412,7 @@ func (s *groupServer) GetGroupAllMember( return resp, nil } -func (s *groupServer) GetGroupMemberList( - ctx context.Context, - req *pbGroup.GetGroupMemberListReq, -) (*pbGroup.GetGroupMemberListResp, error) { +func (s *groupServer) GetGroupMemberList(ctx context.Context, req *pbGroup.GetGroupMemberListReq) (*pbGroup.GetGroupMemberListResp, error) { resp := &pbGroup.GetGroupMemberListResp{} total, members, err := s.PageGetGroupMember(ctx, req.GroupID, req.Pagination.PageNumber, req.Pagination.ShowNumber) log.ZDebug(ctx, "GetGroupMemberList", "total", total, "members", members, "length", len(members)) @@ -464,10 +425,7 @@ func (s *groupServer) GetGroupMemberList( return resp, nil } -func (s *groupServer) KickGroupMember( - ctx context.Context, - req *pbGroup.KickGroupMemberReq, -) (*pbGroup.KickGroupMemberResp, error) { +func (s *groupServer) KickGroupMember(ctx context.Context, req *pbGroup.KickGroupMemberReq) (*pbGroup.KickGroupMemberResp, error) { resp := &pbGroup.KickGroupMemberResp{} group, err := s.GroupDatabase.TakeGroup(ctx, req.GroupID) if err != nil { @@ -575,10 +533,7 @@ func (s *groupServer) KickGroupMember( return resp, nil } -func (s *groupServer) GetGroupMembersInfo( - ctx context.Context, - req *pbGroup.GetGroupMembersInfoReq, -) (*pbGroup.GetGroupMembersInfoResp, error) { +func (s *groupServer) GetGroupMembersInfo(ctx context.Context, req *pbGroup.GetGroupMembersInfoReq) (*pbGroup.GetGroupMembersInfoResp, error) { resp := &pbGroup.GetGroupMembersInfoResp{} if len(req.UserIDs) == 0 { return nil, errs.ErrArgs.Wrap("userIDs empty") @@ -605,10 +560,7 @@ func (s *groupServer) GetGroupMembersInfo( return resp, nil } -func (s *groupServer) GetGroupApplicationList( - ctx context.Context, - req *pbGroup.GetGroupApplicationListReq, -) (*pbGroup.GetGroupApplicationListResp, error) { +func (s *groupServer) GetGroupApplicationList(ctx context.Context, req *pbGroup.GetGroupApplicationListReq) (*pbGroup.GetGroupApplicationListResp, error) { pageNumber, showNumber := utils.GetPage(req.Pagination) groupIDs, err := s.GroupDatabase.FindUserManagedGroupID(ctx, req.FromUserID) @@ -659,19 +611,12 @@ func (s *groupServer) GetGroupApplicationList( return e.GroupID }) resp.GroupRequests = utils.Slice(groupRequests, func(e *relationTb.GroupRequestModel) *sdkws.GroupRequest { - return convert.Db2PbGroupRequest( - e, - userMap[e.UserID], - convert.Db2PbGroupInfo(groupMap[e.GroupID], ownerMap[e.GroupID].UserID, groupMemberNumMap[e.GroupID]), - ) + return convert.Db2PbGroupRequest(e, userMap[e.UserID], convert.Db2PbGroupInfo(groupMap[e.GroupID], ownerMap[e.GroupID].UserID, groupMemberNumMap[e.GroupID])) }) return resp, nil } -func (s *groupServer) GetGroupsInfo( - ctx context.Context, - req *pbGroup.GetGroupsInfoReq, -) (*pbGroup.GetGroupsInfoResp, error) { +func (s *groupServer) GetGroupsInfo(ctx context.Context, req *pbGroup.GetGroupsInfoReq) (*pbGroup.GetGroupsInfoResp, error) { resp := &pbGroup.GetGroupsInfoResp{} if len(req.GroupIDs) == 0 { return nil, errs.ErrArgs.Wrap("groupID is empty") @@ -701,10 +646,7 @@ func (s *groupServer) GetGroupsInfo( return resp, nil } -func (s *groupServer) GroupApplicationResponse( - ctx context.Context, - req *pbGroup.GroupApplicationResponseReq, -) (*pbGroup.GroupApplicationResponseResp, error) { +func (s *groupServer) GroupApplicationResponse(ctx context.Context, req *pbGroup.GroupApplicationResponseReq) (*pbGroup.GroupApplicationResponseResp, error) { defer log.ZInfo(ctx, utils.GetFuncName()+" Return") if !utils.Contain(req.HandleResult, constant.GroupResponseAgree, constant.GroupResponseRefuse) { return nil, errs.ErrArgs.Wrap("HandleResult unknown") @@ -776,10 +718,7 @@ func (s *groupServer) GroupApplicationResponse( return &pbGroup.GroupApplicationResponseResp{}, nil } -func (s *groupServer) JoinGroup( - ctx context.Context, - req *pbGroup.JoinGroupReq, -) (resp *pbGroup.JoinGroupResp, err error) { +func (s *groupServer) JoinGroup(ctx context.Context, req *pbGroup.JoinGroupReq) (resp *pbGroup.JoinGroupResp, err error) { defer log.ZInfo(ctx, "JoinGroup.Return") user, err := s.User.GetUserInfo(ctx, req.InviterUserID) if err != nil { @@ -879,10 +818,7 @@ func (s *groupServer) deleteMemberAndSetConversationSeq(ctx context.Context, gro return s.conversationRpcClient.SetConversationMaxSeq(ctx, userIDs, conevrsationID, maxSeq) } -func (s *groupServer) SetGroupInfo( - ctx context.Context, - req *pbGroup.SetGroupInfoReq, -) (*pbGroup.SetGroupInfoResp, error) { +func (s *groupServer) SetGroupInfo(ctx context.Context, req *pbGroup.SetGroupInfoReq) (*pbGroup.SetGroupInfoResp, error) { var opMember *relationTb.GroupMemberModel if !tokenverify.IsAppManagerUid(ctx) { var err error @@ -910,7 +846,7 @@ func (s *groupServer) SetGroupInfo( if err != nil { return nil, err } - data := UpdateGroupInfoMap(req.GroupInfoForSet) + data := UpdateGroupInfoMap(ctx, req.GroupInfoForSet) if len(data) == 0 { return resp, nil } @@ -931,11 +867,25 @@ func (s *groupServer) SetGroupInfo( } var num int if req.GroupInfoForSet.Notification != "" { + go func() { + nctx := mcontext.NewCtx("@@@" + mcontext.GetOperationID(ctx)) + conversation := &pbConversation.ConversationReq{ + ConversationID: utils.GetConversationIDBySessionType(constant.SuperGroupChatType, req.GroupInfoForSet.GroupID), + ConversationType: constant.SuperGroupChatType, + GroupID: req.GroupInfoForSet.GroupID, + } + resp, err := s.GetGroupMemberUserIDs(nctx, &pbGroup.GetGroupMemberUserIDsReq{GroupID: req.GroupInfoForSet.GroupID}) + if err != nil { + log.ZWarn(ctx, "GetGroupMemberIDs", err) + return + } + conversation.GroupAtType = &wrapperspb.Int32Value{Value: constant.GroupNotification} + if err := s.conversationRpcClient.SetConversations(nctx, resp.UserIDs, conversation); err != nil { + log.ZWarn(ctx, "SetConversations", err, resp.UserIDs, conversation) + } + }() num++ - s.Notification.GroupInfoSetAnnouncementNotification( - ctx, - &sdkws.GroupInfoSetAnnouncementTips{Group: tips.Group, OpUser: tips.OpUser}, - ) + s.Notification.GroupInfoSetAnnouncementNotification(ctx, &sdkws.GroupInfoSetAnnouncementTips{Group: tips.Group, OpUser: tips.OpUser}) } switch len(data) - num { @@ -952,10 +902,7 @@ func (s *groupServer) SetGroupInfo( return resp, nil } -func (s *groupServer) TransferGroupOwner( - ctx context.Context, - req *pbGroup.TransferGroupOwnerReq, -) (*pbGroup.TransferGroupOwnerResp, error) { +func (s *groupServer) TransferGroupOwner(ctx context.Context, req *pbGroup.TransferGroupOwnerReq) (*pbGroup.TransferGroupOwnerResp, error) { resp := &pbGroup.TransferGroupOwnerResp{} group, err := s.GroupDatabase.TakeGroup(ctx, req.GroupID) if err != nil { @@ -1034,20 +981,9 @@ func (s *groupServer) GetGroups(ctx context.Context, req *pbGroup.GetGroupsReq) return resp, nil } -func (s *groupServer) GetGroupMembersCMS( - ctx context.Context, - req *pbGroup.GetGroupMembersCMSReq, -) (*pbGroup.GetGroupMembersCMSResp, error) { +func (s *groupServer) GetGroupMembersCMS(ctx context.Context, req *pbGroup.GetGroupMembersCMSReq) (*pbGroup.GetGroupMembersCMSResp, error) { resp := &pbGroup.GetGroupMembersCMSResp{} - total, members, err := s.GroupDatabase.SearchGroupMember( - ctx, - req.UserName, - []string{req.GroupID}, - nil, - nil, - req.Pagination.PageNumber, - req.Pagination.ShowNumber, - ) + total, members, err := s.GroupDatabase.SearchGroupMember(ctx, req.UserName, []string{req.GroupID}, nil, nil, req.Pagination.PageNumber, req.Pagination.ShowNumber) if err != nil { return nil, err } @@ -1067,10 +1003,7 @@ func (s *groupServer) GetGroupMembersCMS( return resp, nil } -func (s *groupServer) GetUserReqApplicationList( - ctx context.Context, - req *pbGroup.GetUserReqApplicationListReq, -) (*pbGroup.GetUserReqApplicationListResp, error) { +func (s *groupServer) GetUserReqApplicationList(ctx context.Context, req *pbGroup.GetUserReqApplicationListReq) (*pbGroup.GetUserReqApplicationListResp, error) { resp := &pbGroup.GetUserReqApplicationListResp{} user, err := s.User.GetPublicUserInfo(ctx, req.UserID) if err != nil { @@ -1117,19 +1050,12 @@ func (s *groupServer) GetUserReqApplicationList( return nil, err } resp.GroupRequests = utils.Slice(requests, func(e *relationTb.GroupRequestModel) *sdkws.GroupRequest { - return convert.Db2PbGroupRequest( - e, - user, - convert.Db2PbGroupInfo(groupMap[e.GroupID], ownerMap[e.GroupID].UserID, uint32(groupMemberNum[e.GroupID])), - ) + return convert.Db2PbGroupRequest(e, user, convert.Db2PbGroupInfo(groupMap[e.GroupID], ownerMap[e.GroupID].UserID, uint32(groupMemberNum[e.GroupID]))) }) return resp, nil } -func (s *groupServer) DismissGroup( - ctx context.Context, - req *pbGroup.DismissGroupReq, -) (*pbGroup.DismissGroupResp, error) { +func (s *groupServer) DismissGroup(ctx context.Context, req *pbGroup.DismissGroupReq) (*pbGroup.DismissGroupResp, error) { defer log.ZInfo(ctx, "DismissGroup.return") resp := &pbGroup.DismissGroupResp{} owner, err := s.TakeGroupOwner(ctx, req.GroupID) @@ -1178,10 +1104,7 @@ func (s *groupServer) DismissGroup( return resp, nil } -func (s *groupServer) MuteGroupMember( - ctx context.Context, - req *pbGroup.MuteGroupMemberReq, -) (*pbGroup.MuteGroupMemberResp, error) { +func (s *groupServer) MuteGroupMember(ctx context.Context, req *pbGroup.MuteGroupMemberReq) (*pbGroup.MuteGroupMemberResp, error) { resp := &pbGroup.MuteGroupMemberResp{} //if err := tokenverify.CheckAccessV3(ctx, req.UserID); err != nil { // return nil, err @@ -1216,10 +1139,7 @@ func (s *groupServer) MuteGroupMember( return resp, nil } -func (s *groupServer) CancelMuteGroupMember( - ctx context.Context, - req *pbGroup.CancelMuteGroupMemberReq, -) (*pbGroup.CancelMuteGroupMemberResp, error) { +func (s *groupServer) CancelMuteGroupMember(ctx context.Context, req *pbGroup.CancelMuteGroupMemberReq) (*pbGroup.CancelMuteGroupMemberResp, error) { resp := &pbGroup.CancelMuteGroupMemberResp{} //member, err := s.GroupDatabase.TakeGroupMember(ctx, req.GroupID, req.UserID) //if err != nil { @@ -1231,8 +1151,7 @@ func (s *groupServer) CancelMuteGroupMember( // return nil, err // } // if opMember.RoleLevel <= member.RoleLevel { - // return nil, errs.ErrNoPermission.Wrap(fmt.Sprintf("self RoleLevel %d target %d", opMember.RoleLevel, - // member.RoleLevel)) + // return nil, errs.ErrNoPermission.Wrap(fmt.Sprintf("self RoleLevel %d target %d", opMember.RoleLevel, member.RoleLevel)) // } //} //if err := tokenverify.CheckAccessV3(ctx, req.UserID); err != nil { @@ -1280,10 +1199,7 @@ func (s *groupServer) MuteGroup(ctx context.Context, req *pbGroup.MuteGroupReq) return resp, nil } -func (s *groupServer) CancelMuteGroup( - ctx context.Context, - req *pbGroup.CancelMuteGroupReq, -) (*pbGroup.CancelMuteGroupResp, error) { +func (s *groupServer) CancelMuteGroup(ctx context.Context, req *pbGroup.CancelMuteGroupReq) (*pbGroup.CancelMuteGroupResp, error) { resp := &pbGroup.CancelMuteGroupResp{} if err := s.CheckGroupAdmin(ctx, req.GroupID); err != nil { return nil, err @@ -1295,10 +1211,7 @@ func (s *groupServer) CancelMuteGroup( return resp, nil } -func (s *groupServer) SetGroupMemberInfo( - ctx context.Context, - req *pbGroup.SetGroupMemberInfoReq, -) (*pbGroup.SetGroupMemberInfoResp, error) { +func (s *groupServer) SetGroupMemberInfo(ctx context.Context, req *pbGroup.SetGroupMemberInfoReq) (*pbGroup.SetGroupMemberInfoResp, error) { resp := &pbGroup.SetGroupMemberInfoResp{} if len(req.Members) == 0 { return nil, errs.ErrArgs.Wrap("members empty") @@ -1325,11 +1238,9 @@ func (s *groupServer) SetGroupMemberInfo( delete(duplicateMap, [...]string{member.GroupID, member.UserID}) } if len(duplicateMap) > 0 { - return nil, errs.ErrArgs.Wrap( - "user not found" + strings.Join(utils.Slice(utils.Keys(duplicateMap), func(e [2]string) string { - return fmt.Sprintf("[group: %s user: %s]", e[0], e[1]) - }), ","), - ) + return nil, errs.ErrArgs.Wrap("user not found" + strings.Join(utils.Slice(utils.Keys(duplicateMap), func(e [2]string) string { + return fmt.Sprintf("[group: %s user: %s]", e[0], e[1]) + }), ",")) } memberMap := utils.SliceToMap(members, func(e *relationTb.GroupMemberModel) [2]string { return [...]string{e.GroupID, e.UserID} @@ -1359,9 +1270,7 @@ func (s *groupServer) SetGroupMemberInfo( } dbMember, ok := memberMap[[...]string{member.GroupID, member.UserID}] if !ok { - return nil, errs.ErrRecordNotFound.Wrap( - fmt.Sprintf("user %s not in group %s", member.UserID, member.GroupID), - ) + return nil, errs.ErrRecordNotFound.Wrap(fmt.Sprintf("user %s not in group %s", member.UserID, member.GroupID)) } //if opMember.RoleLevel == constant.GroupOwner { // continue @@ -1423,25 +1332,14 @@ func (s *groupServer) SetGroupMemberInfo( if member.Nickname != nil || member.FaceURL != nil || member.Ex != nil { log.ZDebug(ctx, "setGroupMemberInfo notification", "member", member.UserID) if err := s.Notification.GroupMemberInfoSetNotification(ctx, member.GroupID, member.UserID); err != nil { - log.ZError( - ctx, - "setGroupMemberInfo notification failed", - err, - "member", - member.UserID, - "groupID", - member.GroupID, - ) + log.ZError(ctx, "setGroupMemberInfo notification failed", err, "member", member.UserID, "groupID", member.GroupID) } } } return resp, nil } -func (s *groupServer) GetGroupAbstractInfo( - ctx context.Context, - req *pbGroup.GetGroupAbstractInfoReq, -) (*pbGroup.GetGroupAbstractInfoResp, error) { +func (s *groupServer) GetGroupAbstractInfo(ctx context.Context, req *pbGroup.GetGroupAbstractInfoReq) (*pbGroup.GetGroupAbstractInfoResp, error) { resp := &pbGroup.GetGroupAbstractInfoResp{} if len(req.GroupIDs) == 0 { return nil, errs.ErrArgs.Wrap("groupIDs empty") @@ -1472,10 +1370,7 @@ func (s *groupServer) GetGroupAbstractInfo( return resp, nil } -func (s *groupServer) GetUserInGroupMembers( - ctx context.Context, - req *pbGroup.GetUserInGroupMembersReq, -) (*pbGroup.GetUserInGroupMembersResp, error) { +func (s *groupServer) GetUserInGroupMembers(ctx context.Context, req *pbGroup.GetUserInGroupMembersReq) (*pbGroup.GetUserInGroupMembersResp, error) { resp := &pbGroup.GetUserInGroupMembersResp{} if len(req.GroupIDs) == 0 { return nil, errs.ErrArgs.Wrap("groupIDs empty") @@ -1499,10 +1394,7 @@ func (s *groupServer) GetUserInGroupMembers( return resp, nil } -func (s *groupServer) GetGroupMemberUserIDs( - ctx context.Context, - req *pbGroup.GetGroupMemberUserIDsReq, -) (resp *pbGroup.GetGroupMemberUserIDsResp, err error) { +func (s *groupServer) GetGroupMemberUserIDs(ctx context.Context, req *pbGroup.GetGroupMemberUserIDsReq) (resp *pbGroup.GetGroupMemberUserIDsResp, err error) { resp = &pbGroup.GetGroupMemberUserIDsResp{} resp.UserIDs, err = s.GroupDatabase.FindGroupMemberUserID(ctx, req.GroupID) if err != nil { @@ -1511,10 +1403,7 @@ func (s *groupServer) GetGroupMemberUserIDs( return resp, nil } -func (s *groupServer) GetGroupMemberRoleLevel( - ctx context.Context, - req *pbGroup.GetGroupMemberRoleLevelReq, -) (*pbGroup.GetGroupMemberRoleLevelResp, error) { +func (s *groupServer) GetGroupMemberRoleLevel(ctx context.Context, req *pbGroup.GetGroupMemberRoleLevelReq) (*pbGroup.GetGroupMemberRoleLevelResp, error) { resp := &pbGroup.GetGroupMemberRoleLevelResp{} if len(req.RoleLevels) == 0 { return nil, errs.ErrArgs.Wrap("RoleLevels empty") diff --git a/internal/rpc/group/statistics.go b/internal/rpc/group/statistics.go new file mode 100644 index 000000000..c6664b4df --- /dev/null +++ b/internal/rpc/group/statistics.go @@ -0,0 +1,28 @@ +package group + +import ( + "context" + "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" + "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/group" + "time" +) + +func (s *groupServer) GroupCreateCount(ctx context.Context, req *group.GroupCreateCountReq) (*group.GroupCreateCountResp, error) { + if req.Start > req.End { + return nil, errs.ErrArgs.Wrap("start > end") + } + total, err := s.GroupDatabase.CountTotal(ctx, nil) + if err != nil { + return nil, err + } + start := time.UnixMilli(req.Start) + before, err := s.GroupDatabase.CountTotal(ctx, &start) + if err != nil { + return nil, err + } + count, err := s.GroupDatabase.CountRangeEverydayTotal(ctx, start, time.UnixMilli(req.End)) + if err != nil { + return nil, err + } + return &group.GroupCreateCountResp{Total: total, Before: before, Count: count}, nil +} diff --git a/internal/rpc/msg/extend_msg.go b/internal/rpc/msg/extend_msg.go deleted file mode 100644 index 6f82d980f..000000000 --- a/internal/rpc/msg/extend_msg.go +++ /dev/null @@ -1,414 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 msg - -import ( - "context" - - "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg" - "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" -) - -func (m *msgServer) SetMessageReactionExtensions( - ctx context.Context, - req *msg.SetMessageReactionExtensionsReq, -) (resp *msg.SetMessageReactionExtensionsResp, err error) { - //resp = &msg.SetMessageReactionExtensionsResp{} - ////resp.ClientMsgID = req.ClientMsgID - ////resp.MsgFirstModifyTime = req.MsgFirstModifyTime - // - //if err := CallbackSetMessageReactionExtensions(ctx, req); err != nil { - // return nil, err - //} - ////if ExternalExtension - //if req.IsExternalExtensions { - // resp.MsgFirstModifyTime = req.MsgFirstModifyTime - // notification.ExtendMessageUpdatedNotification(req.OperationID, req.OpUserID, req.conversationID, - // req.SessionType, req, &resp, !req.IsReact, false) - // return resp, nil - //} - //isExists, err := m.MsgDatabase.JudgeMessageReactionExist(ctx, req.ClientMsgID, req.SessionType) - //if err != nil { - // return nil, err - //} - // - //if !isExists { - // if !req.IsReact { - // resp.MsgFirstModifyTime = utils.GetCurrentTimestampByMill() - // for k, v := range req.ReactionExtensions { - // err := m.MessageLocker.LockMessageTypeKey(ctx, req.ClientMsgID, k) - // if err != nil { - // return nil, err - // } - // v.LatestUpdateTime = utils.GetCurrentTimestampByMill() - // if err := m.MsgDatabase.SetMessageTypeKeyValue(ctx, req.ClientMsgID, req.SessionType, k, - // utils.StructToJsonString(v)); err != nil { - // return nil, err - // } - // } - // resp.IsReact = true - // _, err := m.MsgDatabase.SetMessageReactionExpire(ctx, req.ClientMsgID, req.SessionType, - // time.Duration(24*3)*time.Hour) - // if err != nil { - // return nil, err - // } - // } else { - // err := m.MessageLocker.LockGlobalMessage(ctx, req.ClientMsgID) - // if err != nil { - // return nil, err - // } - // mongoValue, err := m.MsgDatabase.GetExtendMsg(ctx, req.conversationID, req.SessionType, req.ClientMsgID, - // req.MsgFirstModifyTime) - // if err != nil { - // return nil, err - // } - // setValue := make(map[string]*sdkws.KeyValue) - // for k, v := range req.ReactionExtensions { - // - // temp := new(sdkws.KeyValue) - // if vv, ok := mongoValue.ReactionExtensions[k]; ok { - // utils.CopyStructFields(temp, &vv) - // if v.LatestUpdateTime != vv.LatestUpdateTime { - // setKeyResultInfo(&resp, 300, "message have update", req.ClientMsgID, k, temp) - // continue - // } - // } - // temp.TypeKey = k - // temp.Value = v.Value - // temp.LatestUpdateTime = utils.GetCurrentTimestampByMill() - // setValue[k] = temp - // } - // err = db.DB.InsertOrUpdateReactionExtendMsgSet(req.conversationID, req.SessionType, req.ClientMsgID, - // req.MsgFirstModifyTime, setValue) - // if err != nil { - // for _, value := range setValue { - // temp := new(msg.KeyValueResp) - // temp.KeyValue = value - // temp.ErrMsg = err.Error() - // temp.ErrCode = 100 - // resp.Result = append(resp.Result, temp) - // } - // } else { - // for _, value := range setValue { - // temp := new(msg.KeyValueResp) - // temp.KeyValue = value - // resp.Result = append(resp.Result, temp) - // } - // } - // lockErr := m.dMessageLocker.UnLockGlobalMessage(req.ClientMsgID) - // if lockErr != nil { - // log.Error(req.OperationID, "UnLockGlobalMessage err:", lockErr.Error()) - // } - // } - // - //} else { - // log.Debug(req.OperationID, "redis handle secondly", req.String()) - // - // for k, v := range req.Pb2Model { - // err := m.dMessageLocker.LockMessageTypeKey(req.ClientMsgID, k) - // if err != nil { - // setKeyResultInfo(&resp, 100, err.Error(), req.ClientMsgID, k, v) - // continue - // } - // redisValue, err := db.DB.GetMessageTypeKeyValue(req.ClientMsgID, req.SessionType, k) - // if err != nil && err != go_redis.Nil { - // setKeyResultInfo(&resp, 200, err.Error(), req.ClientMsgID, k, v) - // continue - // } - // temp := new(sdkws.KeyValue) - // utils.JsonStringToStruct(redisValue, temp) - // if v.LatestUpdateTime != temp.LatestUpdateTime { - // setKeyResultInfo(&resp, 300, "message have update", req.ClientMsgID, k, temp) - // continue - // } else { - // v.LatestUpdateTime = utils.GetCurrentTimestampByMill() - // newerr := db.DB.SetMessageTypeKeyValue(req.ClientMsgID, req.SessionType, k, utils.StructToJsonString(v)) - // if newerr != nil { - // setKeyResultInfo(&resp, 201, newerr.Error(), req.ClientMsgID, k, temp) - // continue - // } - // setKeyResultInfo(&resp, 0, "", req.ClientMsgID, k, v) - // } - // - // } - //} - //if !isExists { - // if !req.IsReact { - // notification.ExtendMessageUpdatedNotification(req.OperationID, req.OpUserID, req.conversationID, - // req.SessionType, req, &resp, true, true) - // } else { - // notification.ExtendMessageUpdatedNotification(req.OperationID, req.OpUserID, req.conversationID, - // req.SessionType, req, &resp, false, false) - // } - //} else { - // notification.ExtendMessageUpdatedNotification(req.OperationID, req.OpUserID, req.conversationID, - // req.SessionType, req, &resp, false, true) - //} - //log.Debug(req.OperationID, utils.GetSelfFuncName(), "m return is:", resp.String()) - return resp, nil - -} - -func (m *msgServer) setKeyResultInfo( - ctx context.Context, - r *msg.SetMessageReactionExtensionsResp, - errCode int32, - errMsg, clientMsgID, typeKey string, - keyValue *sdkws.KeyValue, -) { - temp := new(msg.KeyValueResp) - temp.KeyValue = keyValue - temp.ErrCode = errCode - temp.ErrMsg = errMsg - r.Result = append(r.Result, temp) - _ = m.MessageLocker.UnLockMessageTypeKey(ctx, clientMsgID, typeKey) -} - -func (m *msgServer) setDeleteKeyResultInfo( - ctx context.Context, - r *msg.DeleteMessagesReactionExtensionsResp, - errCode int32, - errMsg, clientMsgID, typeKey string, - keyValue *sdkws.KeyValue, -) { - temp := new(msg.KeyValueResp) - temp.KeyValue = keyValue - temp.ErrCode = errCode - temp.ErrMsg = errMsg - r.Result = append(r.Result, temp) - _ = m.MessageLocker.UnLockMessageTypeKey(ctx, clientMsgID, typeKey) -} - -func (m *msgServer) GetMessagesReactionExtensions( - ctx context.Context, - req *msg.GetMessagesReactionExtensionsReq, -) (resp *msg.GetMessagesReactionExtensionsResp, err error) { - //log.Debug(req.OperationID, utils.GetSelfFuncName(), "m args is:", req.String()) - //var rResp msg.GetMessageListReactionExtensionsResp - //for _, messageValue := range req.MessageReactionKeyList { - // var oneMessage msg.SingleMessageExtensionResult - // oneMessage.ClientMsgID = messageValue.ClientMsgID - // - // isExists, err := db.DB.JudgeMessageReactionExist(messageValue.ClientMsgID, req.SessionType) - // if err != nil { - // rResp.ErrCode = 100 - // rResp.ErrMsg = err.Error() - // return &rResp, nil - // } - // if isExists { - // redisValue, err := db.DB.GetOneMessageAllReactionList(messageValue.ClientMsgID, req.SessionType) - // if err != nil { - // oneMessage.ErrCode = 100 - // oneMessage.ErrMsg = err.Error() - // rResp.SingleMessageResult = append(rResp.SingleMessageResult, &oneMessage) - // continue - // } - // keyMap := make(map[string]*sdkws.KeyValue) - // - // for k, v := range redisValue { - // temp := new(sdkws.KeyValue) - // utils.JsonStringToStruct(v, temp) - // keyMap[k] = temp - // } - // oneMessage.Pb2Model = keyMap - // - // } else { - // mongoValue, err := db.DB.GetExtendMsg(req.conversationID, req.SessionType, messageValue.ClientMsgID, - // messageValue.MsgFirstModifyTime) - // if err != nil { - // oneMessage.ErrCode = 100 - // oneMessage.ErrMsg = err.Error() - // rResp.SingleMessageResult = append(rResp.SingleMessageResult, &oneMessage) - // continue - // } - // keyMap := make(map[string]*sdkws.KeyValue) - // - // for k, v := range mongoValue.Pb2Model { - // temp := new(sdkws.KeyValue) - // temp.TypeKey = v.TypeKey - // temp.Value = v.Value - // temp.LatestUpdateTime = v.LatestUpdateTime - // keyMap[k] = temp - // } - // oneMessage.Pb2Model = keyMap - // } - // rResp.SingleMessageResult = append(rResp.SingleMessageResult, &oneMessage) - //} - //log.Debug(req.OperationID, utils.GetSelfFuncName(), "m return is:", rResp.String()) - return resp, nil - -} - -func (m *msgServer) AddMessageReactionExtensions( - ctx context.Context, - req *msg.ModifyMessageReactionExtensionsReq, -) (resp *msg.ModifyMessageReactionExtensionsResp, err error) { - return -} - -func (m *msgServer) DeleteMessageReactionExtensions( - ctx context.Context, - req *msg.DeleteMessagesReactionExtensionsReq, -) (resp *msg.DeleteMessagesReactionExtensionsResp, err error) { - //log.Debug(req.OperationID, utils.GetSelfFuncName(), "m args is:", req.String()) - //var rResp msg.DeleteMessagesReactionExtensionsResp - //callbackResp := notification.callbackDeleteMessageReactionExtensions(req) - //if callbackResp.ActionCode != constant.ActionAllow || callbackResp.ErrCode != 0 { - // rResp.ErrCode = int32(callbackResp.ErrCode) - // rResp.ErrMsg = callbackResp.ErrMsg - // for _, value := range req.Pb2Model { - // temp := new(msg.KeyValueResp) - // temp.KeyValue = value - // temp.ErrMsg = callbackResp.ErrMsg - // temp.ErrCode = 100 - // rResp.Result = append(rResp.Result, temp) - // } - // return &rResp, nil - //} - ////if ExternalExtension - //if req.IsExternalExtensions { - // rResp.Result = callbackResp.ResultReactionExtensionList - // notification.ExtendMessageDeleteNotification(req.OperationID, req.OpUserID, req.conversationID, req.SessionType, - // req, &rResp, false, false) - // return &rResp, nil - // - //} - //for _, v := range callbackResp.ResultReactionExtensions { - // if v.ErrCode != 0 { - // func(req *[]*sdkws.KeyValue, typeKey string) { - // for i := 0; i < len(*req); i++ { - // if (*req)[i].TypeKey == typeKey { - // *req = append((*req)[:i], (*req)[i+1:]...) - // } - // } - // }(&req.Pb2Model, v.KeyValue.TypeKey) - // rResp.Result = append(rResp.Result, v) - // } - //} - //isExists, err := db.DB.JudgeMessageReactionExist(req.ClientMsgID, req.SessionType) - //if err != nil { - // rResp.ErrCode = 100 - // rResp.ErrMsg = err.Error() - // for _, value := range req.Pb2Model { - // temp := new(msg.KeyValueResp) - // temp.KeyValue = value - // temp.ErrMsg = err.Error() - // temp.ErrCode = 100 - // rResp.Result = append(rResp.Result, temp) - // } - // return &rResp, nil - //} - // - //if isExists { - // log.Debug(req.OperationID, "redis handle this delete", req.String()) - // for _, v := range req.Pb2Model { - // err := m.dMessageLocker.LockMessageTypeKey(req.ClientMsgID, v.TypeKey) - // if err != nil { - // setDeleteKeyResultInfo(&rResp, 100, err.Error(), req.ClientMsgID, v.TypeKey, v) - // continue - // } - // - // redisValue, err := db.DB.GetMessageTypeKeyValue(req.ClientMsgID, req.SessionType, v.TypeKey) - // if err != nil && err != go_redis.Nil { - // setDeleteKeyResultInfo(&rResp, 200, err.Error(), req.ClientMsgID, v.TypeKey, v) - // continue - // } - // temp := new(sdkws.KeyValue) - // utils.JsonStringToStruct(redisValue, temp) - // if v.LatestUpdateTime != temp.LatestUpdateTime { - // setDeleteKeyResultInfo(&rResp, 300, "message have update", req.ClientMsgID, v.TypeKey, temp) - // continue - // } else { - // newErr := db.DB.DeleteOneMessageKey(req.ClientMsgID, req.SessionType, v.TypeKey) - // if newErr != nil { - // setDeleteKeyResultInfo(&rResp, 201, newErr.Error(), req.ClientMsgID, v.TypeKey, temp) - // continue - // } - // setDeleteKeyResultInfo(&rResp, 0, "", req.ClientMsgID, v.TypeKey, v) - // } - // } - //} else { - // err := m.dMessageLocker.LockGlobalMessage(req.ClientMsgID) - // if err != nil { - // rResp.ErrCode = 100 - // rResp.ErrMsg = err.Error() - // for _, value := range req.Pb2Model { - // temp := new(msg.KeyValueResp) - // temp.KeyValue = value - // temp.ErrMsg = err.Error() - // temp.ErrCode = 100 - // rResp.Result = append(rResp.Result, temp) - // } - // return &rResp, nil - // } - // mongoValue, err := db.DB.GetExtendMsg(req.conversationID, req.SessionType, req.ClientMsgID, - // req.MsgFirstModifyTime) - // if err != nil { - // rResp.ErrCode = 200 - // rResp.ErrMsg = err.Error() - // for _, value := range req.Pb2Model { - // temp := new(msg.KeyValueResp) - // temp.KeyValue = value - // temp.ErrMsg = err.Error() - // temp.ErrCode = 100 - // rResp.Result = append(rResp.Result, temp) - // } - // return &rResp, nil - // } - // setValue := make(map[string]*sdkws.KeyValue) - // for _, v := range req.Pb2Model { - // - // temp := new(sdkws.KeyValue) - // if vv, ok := mongoValue.Pb2Model[v.TypeKey]; ok { - // utils.CopyStructFields(temp, &vv) - // if v.LatestUpdateTime != vv.LatestUpdateTime { - // setDeleteKeyResultInfo(&rResp, 300, "message have update", req.ClientMsgID, v.TypeKey, temp) - // continue - // } - // } else { - // setDeleteKeyResultInfo(&rResp, 400, "key not in", req.ClientMsgID, v.TypeKey, v) - // continue - // } - // temp.TypeKey = v.TypeKey - // setValue[v.TypeKey] = temp - // } - // err = db.DB.DeleteReactionExtendMsgSet(req.conversationID, req.SessionType, req.ClientMsgID, - // req.MsgFirstModifyTime, setValue) - // if err != nil { - // for _, value := range setValue { - // temp := new(msg.KeyValueResp) - // temp.KeyValue = value - // temp.ErrMsg = err.Error() - // temp.ErrCode = 100 - // rResp.Result = append(rResp.Result, temp) - // } - // } else { - // for _, value := range setValue { - // temp := new(msg.KeyValueResp) - // temp.KeyValue = value - // rResp.Result = append(rResp.Result, temp) - // } - // } - // lockErr := m.dMessageLocker.UnLockGlobalMessage(req.ClientMsgID) - // if lockErr != nil { - // log.Error(req.OperationID, "UnLockGlobalMessage err:", lockErr.Error()) - // } - // - //} - // notification.ExtendMessageDeleteNotification(req.OperationID, req.OpUserID, req.conversationID, req.SessionType, - // req, &rResp, false, isExists) - //log.Debug(req.OperationID, utils.GetSelfFuncName(), "m return is:", rResp.String()) - return resp, nil -} diff --git a/internal/rpc/msg/extend_msg_callback.go b/internal/rpc/msg/extend_msg_callback.go deleted file mode 100644 index d510afd0c..000000000 --- a/internal/rpc/msg/extend_msg_callback.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 msg - -import ( - "context" - - cbapi "github.com/OpenIMSDK/Open-IM-Server/pkg/callbackstruct" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/http" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext" - "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg" -) - -func callbackSetMessageReactionExtensions(ctx context.Context, setReq *msg.SetMessageReactionExtensionsReq) error { - if !config.Config.Callback.CallbackAfterSendGroupMsg.Enable { - return nil - } - req := &cbapi.CallbackBeforeSetMessageReactionExtReq{ - OperationID: mcontext.GetOperationID(ctx), - CallbackCommand: constant.CallbackBeforeSetMessageReactionExtensionCommand, - ConversationID: setReq.ConversationID, - OpUserID: mcontext.GetOpUserID(ctx), - SessionType: setReq.SessionType, - ReactionExtensionList: setReq.ReactionExtensions, - ClientMsgID: setReq.ClientMsgID, - IsReact: setReq.IsReact, - IsExternalExtensions: setReq.IsExternalExtensions, - MsgFirstModifyTime: setReq.MsgFirstModifyTime, - } - resp := &cbapi.CallbackBeforeSetMessageReactionExtResp{} - if err := http.CallBackPostReturn(ctx, cbURL(), req, resp, config.Config.Callback.CallbackAfterSendGroupMsg); err != nil { - return err - } - setReq.MsgFirstModifyTime = resp.MsgFirstModifyTime - return nil -} - -func callbackDeleteMessageReactionExtensions( - ctx context.Context, - setReq *msg.DeleteMessagesReactionExtensionsReq, -) error { - if !config.Config.Callback.CallbackAfterSendGroupMsg.Enable { - return nil - } - req := &cbapi.CallbackDeleteMessageReactionExtReq{ - OperationID: setReq.OperationID, - CallbackCommand: constant.CallbackBeforeDeleteMessageReactionExtensionsCommand, - ConversationID: setReq.ConversationID, - OpUserID: setReq.OpUserID, - SessionType: setReq.SessionType, - ReactionExtensionList: setReq.ReactionExtensions, - ClientMsgID: setReq.ClientMsgID, - IsExternalExtensions: setReq.IsExternalExtensions, - MsgFirstModifyTime: setReq.MsgFirstModifyTime, - } - resp := &cbapi.CallbackDeleteMessageReactionExtResp{} - return http.CallBackPostReturn(ctx, cbURL(), req, resp, config.Config.Callback.CallbackAfterSendGroupMsg) -} - -func callbackGetMessageListReactionExtensions(ctx context.Context, getReq *msg.GetMessagesReactionExtensionsReq) error { - if !config.Config.Callback.CallbackAfterSendGroupMsg.Enable { - return nil - } - req := &cbapi.CallbackGetMessageListReactionExtReq{ - OperationID: mcontext.GetOperationID(ctx), - CallbackCommand: constant.CallbackGetMessageListReactionExtensionsCommand, - ConversationID: getReq.ConversationID, - OpUserID: mcontext.GetOperationID(ctx), - SessionType: getReq.SessionType, - TypeKeyList: getReq.TypeKeys, - } - resp := &cbapi.CallbackGetMessageListReactionExtResp{} - return http.CallBackPostReturn(ctx, cbURL(), req, resp, config.Config.Callback.CallbackAfterSendGroupMsg) -} - -func callbackAddMessageReactionExtensions(ctx context.Context, setReq *msg.ModifyMessageReactionExtensionsReq) error { - req := &cbapi.CallbackAddMessageReactionExtReq{ - OperationID: mcontext.GetOperationID(ctx), - CallbackCommand: constant.CallbackAddMessageListReactionExtensionsCommand, - ConversationID: setReq.ConversationID, - OpUserID: mcontext.GetOperationID(ctx), - SessionType: setReq.SessionType, - ReactionExtensionList: setReq.ReactionExtensions, - ClientMsgID: setReq.ClientMsgID, - IsReact: setReq.IsReact, - IsExternalExtensions: setReq.IsExternalExtensions, - MsgFirstModifyTime: setReq.MsgFirstModifyTime, - } - resp := &cbapi.CallbackAddMessageReactionExtResp{} - return http.CallBackPostReturn(ctx, cbURL(), req, resp, config.Config.Callback.CallbackAfterSendGroupMsg) -} diff --git a/internal/rpc/msg/revoke.go b/internal/rpc/msg/revoke.go index c4b64aa46..b7664e2c6 100644 --- a/internal/rpc/msg/revoke.go +++ b/internal/rpc/msg/revoke.go @@ -99,7 +99,6 @@ func (m *msgServer) RevokeMsg(ctx context.Context, req *msg.RevokeMsgReq) (*msg. } now := time.Now().UnixMilli() err = m.MsgDatabase.RevokeMsg(ctx, req.ConversationID, req.Seq, &unRelationTb.RevokeModel{ - ID: uuid.New().String(), Role: role, UserID: req.UserID, Nickname: user.Nickname, diff --git a/internal/rpc/msg/send.go b/internal/rpc/msg/send.go index 2c27b869d..671450eee 100644 --- a/internal/rpc/msg/send.go +++ b/internal/rpc/msg/send.go @@ -31,20 +31,24 @@ import ( func (m *msgServer) SendMsg(ctx context.Context, req *pbMsg.SendMsgReq) (resp *pbMsg.SendMsgResp, error error) { resp = &pbMsg.SendMsgResp{} - flag := isMessageHasReadEnabled(req.MsgData) - if !flag { - return nil, errs.ErrMessageHasReadDisable.Wrap() - } - m.encapsulateMsgData(req.MsgData) - switch req.MsgData.SessionType { - case constant.SingleChatType: - return m.sendMsgSingleChat(ctx, req) - case constant.NotificationChatType: - return m.sendMsgNotification(ctx, req) - case constant.SuperGroupChatType: - return m.sendMsgSuperGroupChat(ctx, req) - default: - return nil, errs.ErrArgs.Wrap("unknown sessionType") + if req.MsgData != nil { + flag := isMessageHasReadEnabled(req.MsgData) + if !flag { + return nil, errs.ErrMessageHasReadDisable.Wrap() + } + m.encapsulateMsgData(req.MsgData) + switch req.MsgData.SessionType { + case constant.SingleChatType: + return m.sendMsgSingleChat(ctx, req) + case constant.NotificationChatType: + return m.sendMsgNotification(ctx, req) + case constant.SuperGroupChatType: + return m.sendMsgSuperGroupChat(ctx, req) + default: + return nil, errs.ErrArgs.Wrap("unknown sessionType") + } + } else { + return nil, errs.ErrArgs.Wrap("msgData is nil") } } @@ -160,7 +164,7 @@ func (m *msgServer) sendMsgSingleChat(ctx context.Context, req *pbMsg.SendMsgReq } if !isSend { promePkg.Inc(promePkg.SingleChatMsgProcessFailedCounter) - return nil, errs.ErrUserNotRecvMsg + return nil, nil } else { if err = callbackBeforeSendSingleMsg(ctx, req); err != nil { return nil, err diff --git a/internal/rpc/msg/server.go b/internal/rpc/msg/server.go index 4702eb5f9..909707703 100644 --- a/internal/rpc/msg/server.go +++ b/internal/rpc/msg/server.go @@ -1,42 +1,25 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 msg import ( "context" - "google.golang.org/grpc" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/localcache" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/tx" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/unrelation" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome" "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry" "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/conversation" "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg" "github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient" + "google.golang.org/grpc" ) type MessageInterceptorChain []MessageInterceptorFunc type msgServer struct { RegisterCenter discoveryregistry.SvcDiscoveryRegistry MsgDatabase controller.CommonMsgDatabase - ExtendMsgDatabase controller.ExtendMsgDatabase Group *rpcclient.GroupRpcClient User *rpcclient.UserRpcClient Conversation *rpcclient.ConversationRpcClient @@ -77,13 +60,6 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e } cacheModel := cache.NewMsgCacheModel(rdb) msgDocModel := unrelation.NewMsgMongoDriver(mongo.GetDatabase()) - extendMsgModel := unrelation.NewExtendMsgSetMongoDriver(mongo.GetDatabase()) - extendMsgCacheModel := cache.NewExtendMsgSetCacheRedis(rdb, extendMsgModel, cache.GetDefaultOpt()) - extendMsgDatabase := controller.NewExtendMsgDatabase( - extendMsgModel, - extendMsgCacheModel, - tx.NewMongo(mongo.GetClient()), - ) msgDatabase := controller.NewCommonMsgDatabase(msgDocModel, cacheModel) conversationClient := rpcclient.NewConversationRpcClient(client) userRpcClient := rpcclient.NewUserRpcClient(client) @@ -94,7 +70,6 @@ func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) e User: &userRpcClient, Group: &groupRpcClient, MsgDatabase: msgDatabase, - ExtendMsgDatabase: extendMsgDatabase, RegisterCenter: client, GroupLocalCache: localcache.NewGroupLocalCache(&groupRpcClient), ConversationLocalCache: localcache.NewConversationLocalCache(&conversationClient), @@ -125,8 +100,7 @@ func (m *msgServer) initPrometheus() { } func (m *msgServer) conversationAndGetRecvID(conversation *conversation.Conversation, userID string) (recvID string) { - if conversation.ConversationType == constant.SingleChatType || - conversation.ConversationType == constant.NotificationChatType { + if conversation.ConversationType == constant.SingleChatType || conversation.ConversationType == constant.NotificationChatType { if userID == conversation.OwnerUserID { recvID = conversation.UserID } else { diff --git a/internal/rpc/msg/statistics.go b/internal/rpc/msg/statistics.go new file mode 100644 index 000000000..872ec8f18 --- /dev/null +++ b/internal/rpc/msg/statistics.go @@ -0,0 +1,84 @@ +package msg + +import ( + "context" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/unrelation" + "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg" + "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" + "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" + "time" +) + +func (m *msgServer) GetActiveUser(ctx context.Context, req *msg.GetActiveUserReq) (*msg.GetActiveUserResp, error) { + msgCount, userCount, users, dateCount, err := m.MsgDatabase.RangeUserSendCount(ctx, time.UnixMilli(req.Start), time.UnixMilli(req.End), req.Group, req.Ase, req.Pagination.PageNumber, req.Pagination.ShowNumber) + if err != nil { + return nil, err + } + var pbUsers []*msg.ActiveUser + if len(users) > 0 { + userIDs := utils.Slice(users, func(e *unrelation.UserCount) string { return e.UserID }) + userMap, err := m.User.GetUsersInfoMap(ctx, userIDs) + if err != nil { + return nil, err + } + pbUsers = make([]*msg.ActiveUser, 0, len(users)) + for _, user := range users { + pbUser := userMap[user.UserID] + if pbUser == nil { + pbUser = &sdkws.UserInfo{ + UserID: user.UserID, + Nickname: user.UserID, + } + } + pbUsers = append(pbUsers, &msg.ActiveUser{ + User: pbUser, + Count: user.Count, + }) + } + } + return &msg.GetActiveUserResp{ + MsgCount: msgCount, + UserCount: userCount, + DateCount: dateCount, + Users: pbUsers, + }, nil +} + +func (m *msgServer) GetActiveGroup(ctx context.Context, req *msg.GetActiveGroupReq) (*msg.GetActiveGroupResp, error) { + msgCount, groupCount, groups, dateCount, err := m.MsgDatabase.RangeGroupSendCount(ctx, time.UnixMilli(req.Start), time.UnixMilli(req.End), req.Ase, req.Pagination.PageNumber, req.Pagination.ShowNumber) + if err != nil { + return nil, err + } + var pbGroups []*msg.ActiveGroup + if len(groups) > 0 { + groupIDs := utils.Slice(groups, func(e *unrelation.GroupCount) string { return e.GroupID }) + resp, err := m.Group.GetGroupInfos(ctx, groupIDs, false) + if err != nil { + return nil, err + } + groupMap := make(map[string]*sdkws.GroupInfo, len(groups)) + for i, group := range groups { + groupMap[group.GroupID] = resp[i] + } + pbGroups = make([]*msg.ActiveGroup, 0, len(groups)) + for _, group := range groups { + pbGroup := groupMap[group.GroupID] + if pbGroup == nil { + pbGroup = &sdkws.GroupInfo{ + GroupID: group.GroupID, + GroupName: group.GroupID, + } + } + pbGroups = append(pbGroups, &msg.ActiveGroup{ + Group: pbGroup, + Count: group.Count, + }) + } + } + return &msg.GetActiveGroupResp{ + MsgCount: msgCount, + GroupCount: groupCount, + DateCount: dateCount, + Groups: pbGroups, + }, nil +} diff --git a/internal/rpc/third/s3.go b/internal/rpc/third/s3.go index 4ff9a3ce8..4cbbd3d7d 100644 --- a/internal/rpc/third/s3.go +++ b/internal/rpc/third/s3.go @@ -1,52 +1,151 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 third import ( "context" - "time" - - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/cont" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext" + "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third" + "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" + "time" ) -func (t *thirdServer) ApplyPut(ctx context.Context, req *third.ApplyPutReq) (*third.ApplyPutResp, error) { - return t.s3dataBase.ApplyPut(ctx, req) +func (t *thirdServer) PartLimit(ctx context.Context, req *third.PartLimitReq) (*third.PartLimitResp, error) { + limit := t.s3dataBase.PartLimit() + return &third.PartLimitResp{ + MinPartSize: limit.MinPartSize, + MaxPartSize: limit.MaxPartSize, + MaxNumSize: int32(limit.MaxNumSize), + }, nil } -func (t *thirdServer) GetPut(ctx context.Context, req *third.GetPutReq) (*third.GetPutResp, error) { - return t.s3dataBase.GetPut(ctx, req) +func (t *thirdServer) PartSize(ctx context.Context, req *third.PartSizeReq) (*third.PartSizeResp, error) { + size, err := t.s3dataBase.PartSize(ctx, req.Size) + if err != nil { + return nil, err + } + return &third.PartSizeResp{Size: size}, nil } -func (t *thirdServer) ConfirmPut(ctx context.Context, req *third.ConfirmPutReq) (*third.ConfirmPutResp, error) { - return t.s3dataBase.ConfirmPut(ctx, req) +func (t *thirdServer) InitiateMultipartUpload(ctx context.Context, req *third.InitiateMultipartUploadReq) (*third.InitiateMultipartUploadResp, error) { + defer log.ZDebug(ctx, "return") + if err := checkUploadName(ctx, req.Name); err != nil { + return nil, err + } + expireTime := time.Now().Add(t.defaultExpire) + result, err := t.s3dataBase.InitiateMultipartUpload(ctx, req.Hash, req.Size, t.defaultExpire, int(req.MaxParts)) + if err != nil { + if haErr, ok := errs.Unwrap(err).(*cont.HashAlreadyExistsError); ok { + obj := &relation.ObjectModel{ + Name: req.Name, + UserID: mcontext.GetOpUserID(ctx), + Hash: req.Hash, + Key: haErr.Object.Key, + Size: haErr.Object.Size, + ContentType: req.ContentType, + Cause: req.Cause, + CreateTime: time.Now(), + } + if err := t.s3dataBase.SetObject(ctx, obj); err != nil { + return nil, err + } + return &third.InitiateMultipartUploadResp{ + Url: t.apiAddress(obj.Name), + }, nil + } + return nil, err + } + var sign *third.AuthSignParts + if result.Sign != nil && len(result.Sign.Parts) > 0 { + sign = &third.AuthSignParts{ + Url: result.Sign.URL, + Query: toPbMapArray(result.Sign.Query), + Header: toPbMapArray(result.Sign.Header), + Parts: make([]*third.SignPart, len(result.Sign.Parts)), + } + for i, part := range result.Sign.Parts { + sign.Parts[i] = &third.SignPart{ + PartNumber: int32(part.PartNumber), + Url: part.URL, + Query: toPbMapArray(part.Query), + Header: toPbMapArray(part.Header), + } + } + } + return &third.InitiateMultipartUploadResp{ + Upload: &third.UploadInfo{ + UploadID: result.UploadID, + PartSize: result.PartSize, + Sign: sign, + ExpireTime: expireTime.UnixMilli(), + }, + }, nil } -func (t *thirdServer) GetUrl(ctx context.Context, req *third.GetUrlReq) (*third.GetUrlResp, error) { - if req.Expires <= 0 { - if err := tokenverify.CheckAdmin(ctx); err != nil { - return nil, err +func (t *thirdServer) AuthSign(ctx context.Context, req *third.AuthSignReq) (*third.AuthSignResp, error) { + defer log.ZDebug(ctx, "return") + partNumbers := utils.Slice(req.PartNumbers, func(partNumber int32) int { return int(partNumber) }) + result, err := t.s3dataBase.AuthSign(ctx, req.UploadID, partNumbers) + if err != nil { + return nil, err + } + resp := &third.AuthSignResp{ + Url: result.URL, + Query: toPbMapArray(result.Query), + Header: toPbMapArray(result.Header), + Parts: make([]*third.SignPart, len(result.Parts)), + } + for i, part := range result.Parts { + resp.Parts[i] = &third.SignPart{ + PartNumber: int32(part.PartNumber), + Url: part.URL, + Query: toPbMapArray(part.Query), + Header: toPbMapArray(part.Header), } } - return t.s3dataBase.GetUrl(ctx, req) + return resp, nil +} + +func (t *thirdServer) CompleteMultipartUpload(ctx context.Context, req *third.CompleteMultipartUploadReq) (*third.CompleteMultipartUploadResp, error) { + defer log.ZDebug(ctx, "return") + if err := checkUploadName(ctx, req.Name); err != nil { + return nil, err + } + result, err := t.s3dataBase.CompleteMultipartUpload(ctx, req.UploadID, req.Parts) + if err != nil { + return nil, err + } + obj := &relation.ObjectModel{ + Name: req.Name, + UserID: mcontext.GetOpUserID(ctx), + Hash: result.Hash, + Key: result.Key, + Size: result.Size, + ContentType: req.ContentType, + Cause: req.Cause, + CreateTime: time.Now(), + } + if err := t.s3dataBase.SetObject(ctx, obj); err != nil { + return nil, err + } + return &third.CompleteMultipartUploadResp{ + Url: t.apiAddress(obj.Name), + }, nil } -func (t *thirdServer) GetHashInfo(ctx context.Context, req *third.GetHashInfoReq) (*third.GetHashInfoResp, error) { - return t.s3dataBase.GetHashInfo(ctx, req) +func (t *thirdServer) AccessURL(ctx context.Context, req *third.AccessURLReq) (*third.AccessURLResp, error) { + expireTime, rawURL, err := t.s3dataBase.AccessURL(ctx, req.Name, t.defaultExpire) + if err != nil { + return nil, err + } + return &third.AccessURLResp{ + Url: rawURL, + ExpireTime: expireTime.UnixMilli(), + }, nil } -func (t *thirdServer) CleanObject(ctx context.Context, now time.Time) { - t.s3dataBase.CleanExpirationObject(ctx, now) +func (t *thirdServer) apiAddress(name string) string { + return t.apiURL + name } diff --git a/internal/rpc/third/third.go b/internal/rpc/third/third.go index ebf2c60d1..7c487b1d2 100644 --- a/internal/rpc/third/third.go +++ b/internal/rpc/third/third.go @@ -1,80 +1,83 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 third import ( "context" + "fmt" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/cos" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/minio" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/oss" "net/url" - - "google.golang.org/grpc" + "time" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/obj" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/relation" relationTb "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation" "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry" "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third" "github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient" + "google.golang.org/grpc" ) func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error { - u, err := url.Parse(config.Config.Object.ApiURL) - if err != nil { + apiURL := config.Config.Object.ApiURL + if apiURL == "" { + return fmt.Errorf("api url is empty") + } + if _, err := url.Parse(config.Config.Object.ApiURL); err != nil { return err } + if apiURL[len(apiURL)-1] != '/' { + apiURL += "/" + } rdb, err := cache.NewRedis() if err != nil { return err } - o, err := obj.NewMinioInterface() + db, err := relation.NewGormDB() if err != nil { return err } - db, err := relation.NewGormDB() - if err != nil { + if err := db.AutoMigrate(&relationTb.ObjectModel{}); err != nil { return err } - if err := db.AutoMigrate(&relationTb.ObjectHashModel{}, &relationTb.ObjectInfoModel{}, &relationTb.ObjectPutModel{}); err != nil { + // 根据配置文件策略选择 oss 方式 + enable := config.Config.Object.Enable + var o s3.Interface + switch config.Config.Object.Enable { + case "minio": + o, err = minio.NewMinio() + case "cos": + o, err = cos.NewCos() + case "oss": + o, err = oss.NewOSS() + default: + err = fmt.Errorf("invalid object enable: %s", enable) + } + if err != nil { return err } third.RegisterThirdServer(server, &thirdServer{ + apiURL: apiURL, thirdDatabase: controller.NewThirdDatabase(cache.NewMsgCacheModel(rdb)), userRpcClient: rpcclient.NewUserRpcClient(client), - s3dataBase: controller.NewS3Database( - o, - relation.NewObjectHash(db), - relation.NewObjectInfo(db), - relation.NewObjectPut(db), - u, - ), + s3dataBase: controller.NewS3Database(o, relation.NewObjectInfo(db)), + defaultExpire: time.Hour * 24 * 7, }) return nil } type thirdServer struct { + apiURL string thirdDatabase controller.ThirdDatabase s3dataBase controller.S3Database userRpcClient rpcclient.UserRpcClient + defaultExpire time.Duration } -func (t *thirdServer) FcmUpdateToken( - ctx context.Context, - req *third.FcmUpdateTokenReq, -) (resp *third.FcmUpdateTokenResp, err error) { +func (t *thirdServer) FcmUpdateToken(ctx context.Context, req *third.FcmUpdateTokenReq) (resp *third.FcmUpdateTokenResp, err error) { err = t.thirdDatabase.FcmUpdateToken(ctx, req.Account, int(req.PlatformID), req.FcmToken, req.ExpireTime) if err != nil { return nil, err @@ -82,10 +85,7 @@ func (t *thirdServer) FcmUpdateToken( return &third.FcmUpdateTokenResp{}, nil } -func (t *thirdServer) SetAppBadge( - ctx context.Context, - req *third.SetAppBadgeReq, -) (resp *third.SetAppBadgeResp, err error) { +func (t *thirdServer) SetAppBadge(ctx context.Context, req *third.SetAppBadgeReq) (resp *third.SetAppBadgeResp, err error) { err = t.thirdDatabase.SetAppBadge(ctx, req.UserID, int(req.AppUnreadCount)) if err != nil { return nil, err diff --git a/internal/rpc/third/tool.go b/internal/rpc/third/tool.go new file mode 100644 index 000000000..84017ae1f --- /dev/null +++ b/internal/rpc/third/tool.go @@ -0,0 +1,63 @@ +package third + +import ( + "context" + "errors" + "fmt" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify" + "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" + "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third" + "strings" + "unicode/utf8" +) + +func toPbMapArray(m map[string][]string) []*third.KeyValues { + res := make([]*third.KeyValues, 0, len(m)) + for key := range m { + res = append(res, &third.KeyValues{ + Key: key, + Values: m[key], + }) + } + return res +} + +func checkUploadName(ctx context.Context, name string) error { + if name == "" { + return errs.ErrArgs.Wrap("name is empty") + } + if name[0] == '/' { + return errs.ErrArgs.Wrap("name cannot start with `/`") + } + if err := checkValidObjectName(name); err != nil { + return errs.ErrArgs.Wrap(err.Error()) + } + opUserID := mcontext.GetOpUserID(ctx) + if opUserID == "" { + return errs.ErrNoPermission.Wrap("opUserID is empty") + } + if !tokenverify.IsManagerUserID(opUserID) { + if !strings.HasPrefix(name, opUserID+"/") { + return errs.ErrNoPermission.Wrap(fmt.Sprintf("name must start with `%s/`", opUserID)) + } + } + return nil +} + +func checkValidObjectNamePrefix(objectName string) error { + if len(objectName) > 1024 { + return errors.New("object name cannot be longer than 1024 characters") + } + if !utf8.ValidString(objectName) { + return errors.New("object name with non UTF-8 strings are not supported") + } + return nil +} + +func checkValidObjectName(objectName string) error { + if strings.TrimSpace(objectName) == "" { + return errors.New("object name cannot be empty") + } + return checkValidObjectNamePrefix(objectName) +} diff --git a/internal/rpc/user/statistics.go b/internal/rpc/user/statistics.go index 7da40bb1e..dc11b8a90 100644 --- a/internal/rpc/user/statistics.go +++ b/internal/rpc/user/statistics.go @@ -29,13 +29,18 @@ func (s *userServer) UserRegisterCount( if req.Start > req.End { return nil, errs.ErrArgs.Wrap("start > end") } - total, err := s.CountTotal(ctx) + total, err := s.CountTotal(ctx, nil) if err != nil { return nil, err } - count, err := s.CountRangeEverydayTotal(ctx, time.UnixMilli(req.Start), time.UnixMilli(req.End)) + start := time.UnixMilli(req.Start) + before, err := s.CountTotal(ctx, &start) if err != nil { return nil, err } - return &pbuser.UserRegisterCountResp{Total: total, Count: count}, nil + count, err := s.CountRangeEverydayTotal(ctx, start, time.UnixMilli(req.End)) + if err != nil { + return nil, err + } + return &pbuser.UserRegisterCountResp{Total: total, Before: before, Count: count}, nil } diff --git a/internal/rpc/user/user.go b/internal/rpc/user/user.go index d2368ceb3..4619db4ce 100644 --- a/internal/rpc/user/user.go +++ b/internal/rpc/user/user.go @@ -1,26 +1,12 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 user import ( "context" + "errors" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" "strings" "time" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/convert" @@ -37,9 +23,8 @@ import ( "github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient" "github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient/notification" - "google.golang.org/grpc" - "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" + "google.golang.org/grpc" ) type userServer struct { @@ -63,7 +48,7 @@ func Start(client registry.SvcDiscoveryRegistry, server *grpc.Server) error { } users := make([]*tablerelation.UserModel, 0) if len(config.Config.Manager.UserID) != len(config.Config.Manager.Nickname) { - return errs.ErrConfig.Wrap("len(config.Config.Manager.AppManagerUid) != len(config.Config.Manager.Nickname)") + return errors.New("len(config.Config.Manager.AppManagerUid) != len(config.Config.Manager.Nickname)") } for k, v := range config.Config.Manager.UserID { users = append(users, &tablerelation.UserModel{UserID: v, Nickname: config.Config.Manager.Nickname[k]}) @@ -74,22 +59,16 @@ func Start(client registry.SvcDiscoveryRegistry, server *grpc.Server) error { friendRpcClient := rpcclient.NewFriendRpcClient(client) msgRpcClient := rpcclient.NewMessageRpcClient(client) u := &userServer{ - UserDatabase: database, - RegisterCenter: client, - friendRpcClient: &friendRpcClient, - notificationSender: notification.NewFriendNotificationSender( - &msgRpcClient, - notification.WithDBFunc(database.FindWithError), - ), + UserDatabase: database, + RegisterCenter: client, + friendRpcClient: &friendRpcClient, + notificationSender: notification.NewFriendNotificationSender(&msgRpcClient, notification.WithDBFunc(database.FindWithError)), } pbuser.RegisterUserServer(server, u) return u.UserDatabase.InitOnce(context.Background(), users) } -func (s *userServer) GetDesignateUsers( - ctx context.Context, - req *pbuser.GetDesignateUsersReq, -) (resp *pbuser.GetDesignateUsersResp, err error) { +func (s *userServer) GetDesignateUsers(ctx context.Context, req *pbuser.GetDesignateUsersReq) (resp *pbuser.GetDesignateUsersResp, err error) { resp = &pbuser.GetDesignateUsersResp{} users, err := s.FindWithError(ctx, req.UserIDs) if err != nil { @@ -102,10 +81,7 @@ func (s *userServer) GetDesignateUsers( return resp, nil } -func (s *userServer) UpdateUserInfo( - ctx context.Context, - req *pbuser.UpdateUserInfoReq, -) (resp *pbuser.UpdateUserInfoResp, err error) { +func (s *userServer) UpdateUserInfo(ctx context.Context, req *pbuser.UpdateUserInfoReq) (resp *pbuser.UpdateUserInfoResp, err error) { resp = &pbuser.UpdateUserInfoResp{} err = tokenverify.CheckAccessV3(ctx, req.UserInfo.UserID) if err != nil { @@ -130,10 +106,7 @@ func (s *userServer) UpdateUserInfo( return resp, nil } -func (s *userServer) SetGlobalRecvMessageOpt( - ctx context.Context, - req *pbuser.SetGlobalRecvMessageOptReq, -) (resp *pbuser.SetGlobalRecvMessageOptResp, err error) { +func (s *userServer) SetGlobalRecvMessageOpt(ctx context.Context, req *pbuser.SetGlobalRecvMessageOptReq) (resp *pbuser.SetGlobalRecvMessageOptResp, err error) { resp = &pbuser.SetGlobalRecvMessageOptResp{} if _, err := s.FindWithError(ctx, []string{req.UserID}); err != nil { return nil, err @@ -147,10 +120,7 @@ func (s *userServer) SetGlobalRecvMessageOpt( return resp, nil } -func (s *userServer) AccountCheck( - ctx context.Context, - req *pbuser.AccountCheckReq, -) (resp *pbuser.AccountCheckResp, err error) { +func (s *userServer) AccountCheck(ctx context.Context, req *pbuser.AccountCheckReq) (resp *pbuser.AccountCheckResp, err error) { resp = &pbuser.AccountCheckResp{} if utils.Duplicate(req.CheckUserIDs) { return nil, errs.ErrArgs.Wrap("userID repeated") @@ -179,10 +149,7 @@ func (s *userServer) AccountCheck( return resp, nil } -func (s *userServer) GetPaginationUsers( - ctx context.Context, - req *pbuser.GetPaginationUsersReq, -) (resp *pbuser.GetPaginationUsersResp, err error) { +func (s *userServer) GetPaginationUsers(ctx context.Context, req *pbuser.GetPaginationUsersReq) (resp *pbuser.GetPaginationUsersResp, err error) { var pageNumber, showNumber int32 if req.Pagination != nil { pageNumber = req.Pagination.PageNumber @@ -195,17 +162,14 @@ func (s *userServer) GetPaginationUsers( return &pbuser.GetPaginationUsersResp{Total: int32(total), Users: convert.UsersDB2Pb(users)}, err } -func (s *userServer) UserRegister( - ctx context.Context, - req *pbuser.UserRegisterReq, -) (resp *pbuser.UserRegisterResp, err error) { +func (s *userServer) UserRegister(ctx context.Context, req *pbuser.UserRegisterReq) (resp *pbuser.UserRegisterResp, err error) { resp = &pbuser.UserRegisterResp{} if len(req.Users) == 0 { return nil, errs.ErrArgs.Wrap("users is empty") } if req.Secret != config.Config.Secret { log.ZDebug(ctx, "UserRegister", config.Config.Secret, req.Secret) - return nil, errs.ErrIdentity.Wrap("secret invalid") + return nil, errs.ErrNoPermission.Wrap("secret invalid") } if utils.DuplicateAny(req.Users, func(e *sdkws.UserInfo) string { return e.UserID }) { return nil, errs.ErrArgs.Wrap("userID repeated") @@ -246,10 +210,7 @@ func (s *userServer) UserRegister( return resp, nil } -func (s *userServer) GetGlobalRecvMessageOpt( - ctx context.Context, - req *pbuser.GetGlobalRecvMessageOptReq, -) (resp *pbuser.GetGlobalRecvMessageOptResp, err error) { +func (s *userServer) GetGlobalRecvMessageOpt(ctx context.Context, req *pbuser.GetGlobalRecvMessageOptReq) (resp *pbuser.GetGlobalRecvMessageOptResp, err error) { user, err := s.FindWithError(ctx, []string{req.UserID}) if err != nil { return nil, err @@ -257,10 +218,7 @@ func (s *userServer) GetGlobalRecvMessageOpt( return &pbuser.GetGlobalRecvMessageOptResp{GlobalRecvMsgOpt: user[0].GlobalRecvMsgOpt}, nil } -func (s *userServer) GetAllUserID( - ctx context.Context, - req *pbuser.GetAllUserIDReq, -) (resp *pbuser.GetAllUserIDResp, err error) { +func (s *userServer) GetAllUserID(ctx context.Context, req *pbuser.GetAllUserIDReq) (resp *pbuser.GetAllUserIDResp, err error) { userIDs, err := s.UserDatabase.GetAllUserID(ctx) if err != nil { return nil, err diff --git a/internal/tools/conversation.go b/internal/tools/conversation.go new file mode 100644 index 000000000..1cad58248 --- /dev/null +++ b/internal/tools/conversation.go @@ -0,0 +1,38 @@ +package tools + +import ( + "context" + "time" + + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext" + "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" +) + +func (c *MsgTool) ConversationsDestructMsgs() { + log.ZInfo(context.Background(), "start msg destruct cron task") + ctx := mcontext.NewCtx(utils.GetSelfFuncName()) + conversations, err := c.conversationDatabase.GetConversationIDsNeedDestruct(ctx) + if err != nil { + log.ZError(ctx, "get conversation id need destruct failed", err) + return + } + log.ZDebug(context.Background(), "nums conversations need destruct", "nums", len(conversations)) + for _, conversation := range conversations { + log.ZDebug(ctx, "UserMsgsDestruct", "conversationID", conversation.ConversationID, "ownerUserID", conversation.OwnerUserID, "msgDestructTime", conversation.MsgDestructTime, "lastMsgDestructTime", conversation.LatestMsgDestructTime) + seqs, err := c.msgDatabase.UserMsgsDestruct(ctx, conversation.OwnerUserID, conversation.ConversationID, conversation.MsgDestructTime, conversation.LatestMsgDestructTime) + if err != nil { + log.ZError(ctx, "user msg destruct failed", err, "conversationID", conversation.ConversationID, "ownerUserID", conversation.OwnerUserID) + continue + } + if err := c.conversationDatabase.UpdateUsersConversationFiled(ctx, []string{conversation.OwnerUserID}, conversation.ConversationID, map[string]interface{}{"latest_msg_destruct_time": time.Now()}); err != nil { + log.ZError(ctx, "updateUsersConversationFiled failed", err, "conversationID", conversation.ConversationID, "ownerUserID", conversation.OwnerUserID) + continue + } + if len(seqs) > 0 { + if err := c.msgNotificationSender.UserDeleteMsgsNotification(ctx, conversation.OwnerUserID, conversation.ConversationID, seqs); err != nil { + log.ZError(ctx, "userDeleteMsgsNotification failed", err, "conversationID", conversation.ConversationID, "ownerUserID", conversation.OwnerUserID) + } + } + } +} diff --git a/internal/tools/cron_task.go b/internal/tools/cron_task.go index 365c6cbf4..5e4183615 100644 --- a/internal/tools/cron_task.go +++ b/internal/tools/cron_task.go @@ -26,7 +26,6 @@ import ( ) func StartCronTask() error { - log.ZInfo(context.Background(), "start cron task", "cron config", config.Config.ChatRecordsClearTime) fmt.Println("cron task start, config", config.Config.ChatRecordsClearTime) msgTool, err := InitMsgTool() if err != nil { @@ -35,10 +34,17 @@ func StartCronTask() error { c := cron.New() var wg sync.WaitGroup wg.Add(1) + log.ZInfo(context.Background(), "start chatRecordsClearTime cron task", "cron config", config.Config.ChatRecordsClearTime) _, err = c.AddFunc(config.Config.ChatRecordsClearTime, msgTool.AllConversationClearMsgAndFixSeq) if err != nil { - fmt.Println("start cron failed", err.Error(), config.Config.ChatRecordsClearTime) - return err + fmt.Println("start allConversationClearMsgAndFixSeq cron failed", err.Error(), config.Config.ChatRecordsClearTime) + panic(err) + } + log.ZInfo(context.Background(), "start msgDestruct cron task", "cron config", config.Config.MsgDestructTime) + _, err = c.AddFunc(config.Config.MsgDestructTime, msgTool.ConversationsDestructMsgs) + if err != nil { + fmt.Println("start conversationsDestructMsgs cron failed", err.Error(), config.Config.ChatRecordsClearTime) + panic(err) } c.Start() wg.Wait() diff --git a/internal/tools/msg.go b/internal/tools/msg.go index 8389352a8..7247d32eb 100644 --- a/internal/tools/msg.go +++ b/internal/tools/msg.go @@ -1,24 +1,10 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 tools import ( "context" - "errors" "fmt" "math" + "time" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache" @@ -28,29 +14,33 @@ import ( "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/unrelation" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/mw" + "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry/zookeeper" + "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" + "github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient" + "github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient/notification" "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" + "github.com/redis/go-redis/v9" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) type MsgTool struct { - msgDatabase controller.CommonMsgDatabase - conversationDatabase controller.ConversationDatabase - userDatabase controller.UserDatabase - groupDatabase controller.GroupDatabase + msgDatabase controller.CommonMsgDatabase + conversationDatabase controller.ConversationDatabase + userDatabase controller.UserDatabase + groupDatabase controller.GroupDatabase + msgNotificationSender *notification.MsgNotificationSender } -var errSeq = errors.New("cache max seq and mongo max seq is diff > 10") - -func NewMsgTool( - msgDatabase controller.CommonMsgDatabase, - userDatabase controller.UserDatabase, - groupDatabase controller.GroupDatabase, - conversationDatabase controller.ConversationDatabase, -) *MsgTool { +func NewMsgTool(msgDatabase controller.CommonMsgDatabase, userDatabase controller.UserDatabase, + groupDatabase controller.GroupDatabase, conversationDatabase controller.ConversationDatabase, msgNotificationSender *notification.MsgNotificationSender) *MsgTool { return &MsgTool{ - msgDatabase: msgDatabase, - userDatabase: userDatabase, - groupDatabase: groupDatabase, - conversationDatabase: conversationDatabase, + msgDatabase: msgDatabase, + userDatabase: userDatabase, + groupDatabase: groupDatabase, + conversationDatabase: conversationDatabase, + msgNotificationSender: msgNotificationSender, } } @@ -67,20 +57,21 @@ func InitMsgTool() (*MsgTool, error) { if err != nil { return nil, err } + discov, err := zookeeper.NewClient(config.Config.Zookeeper.ZkAddr, config.Config.Zookeeper.Schema, + zookeeper.WithFreq(time.Hour), zookeeper.WithRoundRobin(), zookeeper.WithUserNameAndPassword(config.Config.Zookeeper.Username, + config.Config.Zookeeper.Password), zookeeper.WithTimeout(10), zookeeper.WithLogger(log.NewZkLogger())) + if err != nil { + return nil, err + } + discov.AddOption(mw.GrpcClient(), grpc.WithTransportCredentials(insecure.NewCredentials())) userDB := relation.NewUserGorm(db) msgDatabase := controller.InitCommonMsgDatabase(rdb, mongo.GetDatabase()) - userDatabase := controller.NewUserDatabase( - userDB, - cache.NewUserCacheRedis(rdb, relation.NewUserGorm(db), cache.GetDefaultOpt()), - tx.NewGorm(db), - ) + userDatabase := controller.NewUserDatabase(userDB, cache.NewUserCacheRedis(rdb, relation.NewUserGorm(db), cache.GetDefaultOpt()), tx.NewGorm(db)) groupDatabase := controller.InitGroupDatabase(db, rdb, mongo.GetDatabase()) - conversationDatabase := controller.NewConversationDatabase( - relation.NewConversationGorm(db), - cache.NewConversationRedis(rdb, cache.GetDefaultOpt(), relation.NewConversationGorm(db)), - tx.NewGorm(db), - ) - msgTool := NewMsgTool(msgDatabase, userDatabase, groupDatabase, conversationDatabase) + conversationDatabase := controller.NewConversationDatabase(relation.NewConversationGorm(db), cache.NewConversationRedis(rdb, cache.GetDefaultOpt(), relation.NewConversationGorm(db)), tx.NewGorm(db)) + msgRpcClient := rpcclient.NewMessageRpcClient(discov) + msgNotificationSender := notification.NewMsgNotificationSender(rpcclient.WithRpcClient(&msgRpcClient)) + msgTool := NewMsgTool(msgDatabase, userDatabase, groupDatabase, conversationDatabase, msgNotificationSender) return msgTool, nil } @@ -102,30 +93,21 @@ func (c *MsgTool) AllConversationClearMsgAndFixSeq() { func (c *MsgTool) ClearConversationsMsg(ctx context.Context, conversationIDs []string) { for _, conversationID := range conversationIDs { if err := c.msgDatabase.DeleteConversationMsgsAndSetMinSeq(ctx, conversationID, int64(config.Config.RetainChatRecords*24*60*60)); err != nil { - log.ZError( - ctx, - "DeleteUserSuperGroupMsgsAndSetMinSeq failed", - err, - "conversationID", - conversationID, - "DBRetainChatRecords", - config.Config.RetainChatRecords, - ) + log.ZError(ctx, "DeleteUserSuperGroupMsgsAndSetMinSeq failed", err, "conversationID", conversationID, "DBRetainChatRecords", config.Config.RetainChatRecords) } if err := c.checkMaxSeq(ctx, conversationID); err != nil { log.ZError(ctx, "fixSeq failed", err, "conversationID", conversationID) } - } } func (c *MsgTool) checkMaxSeqWithMongo(ctx context.Context, conversationID string, maxSeqCache int64) error { - maxSeqMongo, _, err := c.msgDatabase.GetMongoMaxAndMinSeq(ctx, conversationID) + minSeqMongo, maxSeqMongo, err := c.msgDatabase.GetMongoMaxAndMinSeq(ctx, conversationID) if err != nil { return err } if math.Abs(float64(maxSeqMongo-maxSeqCache)) > 10 { - return errSeq + log.ZError(ctx, "cache max seq and mongo max seq is diff > 10", nil, "maxSeqMongo", maxSeqMongo, "minSeqMongo", minSeqMongo, "maxSeqCache", maxSeqCache, "conversationID", conversationID) } return nil } @@ -133,6 +115,9 @@ func (c *MsgTool) checkMaxSeqWithMongo(ctx context.Context, conversationID strin func (c *MsgTool) checkMaxSeq(ctx context.Context, conversationID string) error { maxSeq, err := c.msgDatabase.GetMaxSeq(ctx, conversationID) if err != nil { + if errs.Unwrap(err) == redis.Nil { + return nil + } return err } if err := c.checkMaxSeqWithMongo(ctx, conversationID, maxSeq); err != nil { diff --git a/pkg/apiresp/format.go b/pkg/apiresp/format.go new file mode 100644 index 000000000..34fb85464 --- /dev/null +++ b/pkg/apiresp/format.go @@ -0,0 +1,5 @@ +package apiresp + +type ApiFormat interface { + ApiFormat() +} diff --git a/pkg/apiresp/resp.go b/pkg/apiresp/resp.go index a7bd271a3..638c70dbe 100644 --- a/pkg/apiresp/resp.go +++ b/pkg/apiresp/resp.go @@ -49,6 +49,9 @@ func isAllFieldsPrivate(v any) bool { } func ApiSuccess(data any) *ApiResponse { + if format, ok := data.(ApiFormat); ok { + format.ApiFormat() + } if isAllFieldsPrivate(data) { return &ApiResponse{} } diff --git a/pkg/apistruct/msg.go b/pkg/apistruct/msg.go index 4b776cb48..274c31a61 100644 --- a/pkg/apistruct/msg.go +++ b/pkg/apistruct/msg.go @@ -1,27 +1,8 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 apistruct -import ( - "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg" - sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" -) - type DelMsgReq struct { - UserID string `json:"userID,omitempty" binding:"required"` - SeqList []uint32 `json:"seqList,omitempty" binding:"required"` + UserID string `json:"userID,omitempty" binding:"required"` + SeqList []uint32 `json:"seqList,omitempty" binding:"required"` OperationID string `json:"operationID,omitempty" binding:"required"` } @@ -29,19 +10,19 @@ type DelMsgResp struct { } type CleanUpMsgReq struct { - UserID string `json:"userID" binding:"required"` - OperationID string `json:"operationID" binding:"required"` + UserID string `json:"userID" binding:"required"` + OperationID string `json:"operationID" binding:"required"` } type CleanUpMsgResp struct { } type DelSuperGroupMsgReq struct { - UserID string `json:"userID" binding:"required"` - GroupID string `json:"groupID" binding:"required"` + UserID string `json:"userID" binding:"required"` + GroupID string `json:"groupID" binding:"required"` SeqList []uint32 `json:"seqList,omitempty"` IsAllDelete bool `json:"isAllDelete"` - OperationID string `json:"operationID" binding:"required"` + OperationID string `json:"operationID" binding:"required"` } type DelSuperGroupMsgResp struct { @@ -54,92 +35,28 @@ type MsgDeleteNotificationElem struct { } type SetMsgMinSeqReq struct { - UserID string `json:"userID" binding:"required"` + UserID string `json:"userID" binding:"required"` GroupID string `json:"groupID"` - MinSeq uint32 `json:"minSeq" binding:"required"` - OperationID string `json:"operationID" binding:"required"` + MinSeq uint32 `json:"minSeq" binding:"required"` + OperationID string `json:"operationID" binding:"required"` } type SetMsgMinSeqResp struct { } -type ModifyMessageReactionExtensionsReq struct { - OperationID string `json:"operationID" binding:"required"` - conversationID string `json:"conversationID" binding:"required"` - SessionType int32 `json:"sessionType" binding:"required"` - ReactionExtensionList map[string]*sdkws.KeyValue `json:"reactionExtensionList,omitempty" binding:"required"` - ClientMsgID string `json:"clientMsgID" binding:"required"` - Ex *string `json:"ex"` - AttachedInfo *string `json:"attachedInfo"` - IsReact bool `json:"isReact"` - IsExternalExtensions bool `json:"isExternalExtensions"` - MsgFirstModifyTime int64 `json:"msgFirstModifyTime"` -} - -type ModifyMessageReactionExtensionsResp struct { - Data struct { - ResultKeyValue []*msg.KeyValueResp `json:"result"` - MsgFirstModifyTime int64 `json:"msgFirstModifyTime"` - IsReact bool `json:"isReact"` - } `json:"data"` -} - -//type OperateMessageListReactionExtensionsReq struct { -// OperationID string `json:"operationID" -// binding:"required"` conversationID string -// `json:"conversationID" binding:"required"` SessionType string -// `json:"sessionType" binding:"required"` MessageReactionKeyList -// []*msg.GetMessageListReactionExtensionsReq_MessageReactionKey `json:"messageReactionKeyList" binding:"required"` -//} - -type OperateMessageListReactionExtensionsResp struct { - Data struct { - SuccessList []*msg.ExtendMsgResp `json:"successList"` - FailedList []*msg.ExtendMsgResp `json:"failedList"` - } `json:"data"` -} - -type SetMessageReactionExtensionsCallbackReq ModifyMessageReactionExtensionsReq - -type SetMessageReactionExtensionsCallbackResp ModifyMessageReactionExtensionsResp - -//type GetMessageListReactionExtensionsReq OperateMessageListReactionExtensionsReq - -type GetMessageListReactionExtensionsResp struct { - Data []*msg.SingleMessageExtensionResult `json:"data"` -} - -type AddMessageReactionExtensionsReq ModifyMessageReactionExtensionsReq - -type AddMessageReactionExtensionsResp ModifyMessageReactionExtensionsResp - -type DeleteMessageReactionExtensionsReq struct { - OperationID string `json:"operationID" binding:"required"` - conversationID string `json:"conversationID" binding:"required"` - SessionType int32 `json:"sessionType" binding:"required"` - ClientMsgID string `json:"clientMsgID" binding:"required"` - IsExternalExtensions bool `json:"isExternalExtensions"` - MsgFirstModifyTime int64 `json:"msgFirstModifyTime" binding:"required"` - ReactionExtensionList []*sdkws.KeyValue `json:"reactionExtensionList" binding:"required"` -} - -type DeleteMessageReactionExtensionsResp struct { - Data []*msg.KeyValueResp -} - type PictureBaseInfo struct { UUID string `mapstructure:"uuid"` - Type string `mapstructure:"type"` - Size int64 `mapstructure:"size"` - Width int32 `mapstructure:"width"` + Type string `mapstructure:"type" ` + Size int64 `mapstructure:"size" ` + Width int32 `mapstructure:"width" ` Height int32 `mapstructure:"height"` - Url string `mapstructure:"url"` + Url string `mapstructure:"url" ` } type PictureElem struct { SourcePath string `mapstructure:"sourcePath"` SourcePicture PictureBaseInfo `mapstructure:"sourcePicture"` - BigPicture PictureBaseInfo `mapstructure:"bigPicture"` + BigPicture PictureBaseInfo `mapstructure:"bigPicture" ` SnapshotPicture PictureBaseInfo `mapstructure:"snapshotPicture"` } type SoundElem struct { @@ -181,35 +98,35 @@ type LocationElem struct { Latitude float64 `mapstructure:"latitude"` } type CustomElem struct { - Data string `mapstructure:"data" validate:"required"` + Data string `mapstructure:"data" validate:"required"` Description string `mapstructure:"description"` Extension string `mapstructure:"extension"` } type TextElem struct { - Text string `mapstructure:"text" validate:"required"` + Content string `mapstructure:"content" validate:"required"` } type RevokeElem struct { RevokeMsgClientID string `mapstructure:"revokeMsgClientID" validate:"required"` } type OANotificationElem struct { - NotificationName string `mapstructure:"notificationName" json:"notificationName" validate:"required"` + NotificationName string `mapstructure:"notificationName" json:"notificationName" validate:"required"` NotificationFaceURL string `mapstructure:"notificationFaceURL" json:"notificationFaceURL"` - NotificationType int32 `mapstructure:"notificationType" json:"notificationType" validate:"required"` - Text string `mapstructure:"text" json:"text" validate:"required"` - Url string `mapstructure:"url" json:"url"` - MixType int32 `mapstructure:"mixType" json:"mixType"` - PictureElem PictureElem `mapstructure:"pictureElem" json:"pictureElem"` - SoundElem SoundElem `mapstructure:"soundElem" json:"soundElem"` - VideoElem VideoElem `mapstructure:"videoElem" json:"videoElem"` - FileElem FileElem `mapstructure:"fileElem" json:"fileElem"` - Ex string `mapstructure:"ex" json:"ex"` + NotificationType int32 `mapstructure:"notificationType" json:"notificationType" validate:"required"` + Text string `mapstructure:"text" json:"text" validate:"required"` + Url string `mapstructure:"url" json:"url"` + MixType int32 `mapstructure:"mixType" json:"mixType"` + PictureElem PictureElem `mapstructure:"pictureElem" json:"pictureElem"` + SoundElem SoundElem `mapstructure:"soundElem" json:"soundElem"` + VideoElem VideoElem `mapstructure:"videoElem" json:"videoElem"` + FileElem FileElem `mapstructure:"fileElem" json:"fileElem"` + Ex string `mapstructure:"ex" json:"ex"` } type MessageRevoked struct { - RevokerID string `mapstructure:"revokerID" json:"revokerID" validate:"required"` - RevokerRole int32 `mapstructure:"revokerRole" json:"revokerRole" validate:"required"` - ClientMsgID string `mapstructure:"clientMsgID" json:"clientMsgID" validate:"required"` + RevokerID string `mapstructure:"revokerID" json:"revokerID" validate:"required"` + RevokerRole int32 `mapstructure:"revokerRole" json:"revokerRole" validate:"required"` + ClientMsgID string `mapstructure:"clientMsgID" json:"clientMsgID" validate:"required"` RevokerNickname string `mapstructure:"revokerNickname" json:"revokerNickname"` - SessionType int32 `mapstructure:"sessionType" json:"sessionType" validate:"required"` - Seq uint32 `mapstructure:"seq" json:"seq" validate:"required"` + SessionType int32 `mapstructure:"sessionType" json:"sessionType" validate:"required"` + Seq uint32 `mapstructure:"seq" json:"seq" validate:"required"` } diff --git a/pkg/callbackstruct/message.go b/pkg/callbackstruct/message.go index 677e70f27..dabdc1d55 100644 --- a/pkg/callbackstruct/message.go +++ b/pkg/callbackstruct/message.go @@ -15,7 +15,6 @@ package callbackstruct import ( - "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg" sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" ) @@ -80,71 +79,3 @@ type CallbackMsgModifyCommandResp struct { AttachedInfo *string `json:"attachedInfo"` Ex *string `json:"ex"` } -type CallbackBeforeSetMessageReactionExtReq struct { - OperationID string `json:"operationID"` - CallbackCommand `json:"callbackCommand"` - ConversationID string `json:"conversationID"` - OpUserID string `json:"opUserID"` - SessionType int32 `json:"sessionType"` - ReactionExtensionList map[string]*sdkws.KeyValue `json:"reactionExtensionList"` - ClientMsgID string `json:"clientMsgID"` - IsReact bool `json:"isReact"` - IsExternalExtensions bool `json:"isExternalExtensions"` - MsgFirstModifyTime int64 `json:"msgFirstModifyTime"` -} -type CallbackBeforeSetMessageReactionExtResp struct { - CommonCallbackResp - ResultReactionExtensionList []*msg.KeyValueResp `json:"resultReactionExtensionList"` - MsgFirstModifyTime int64 `json:"msgFirstModifyTime"` -} -type CallbackDeleteMessageReactionExtReq struct { - CallbackCommand `json:"callbackCommand"` - OperationID string `json:"operationID"` - ConversationID string `json:"conversationID"` - OpUserID string `json:"opUserID"` - SessionType int32 `json:"sessionType"` - ReactionExtensionList []*sdkws.KeyValue `json:"reactionExtensionList"` - ClientMsgID string `json:"clientMsgID"` - IsExternalExtensions bool `json:"isExternalExtensions"` - MsgFirstModifyTime int64 `json:"msgFirstModifyTime"` -} -type CallbackDeleteMessageReactionExtResp struct { - CommonCallbackResp - ResultReactionExtensionList []*msg.KeyValueResp `json:"resultReactionExtensionList"` - MsgFirstModifyTime int64 `json:"msgFirstModifyTime"` -} - -type CallbackGetMessageListReactionExtReq struct { - OperationID string `json:"operationID"` - CallbackCommand `json:"callbackCommand"` - ConversationID string `json:"conversationID"` - OpUserID string `json:"opUserID"` - SessionType int32 `json:"sessionType"` - TypeKeyList []string `json:"typeKeyList"` - //MessageKeyList []*msg.GetMessageListReactionExtensionsReq_MessageReactionKey `json:"messageKeyList"` -} - -type CallbackGetMessageListReactionExtResp struct { - CommonCallbackResp - MessageResultList []*msg.SingleMessageExtensionResult `json:"messageResultList"` -} - -type CallbackAddMessageReactionExtReq struct { - OperationID string `json:"operationID"` - CallbackCommand `json:"callbackCommand"` - ConversationID string `json:"conversationID"` - OpUserID string `json:"opUserID"` - SessionType int32 `json:"sessionType"` - ReactionExtensionList map[string]*sdkws.KeyValue `json:"reactionExtensionList"` - ClientMsgID string `json:"clientMsgID"` - IsReact bool `json:"isReact"` - IsExternalExtensions bool `json:"isExternalExtensions"` - MsgFirstModifyTime int64 `json:"msgFirstModifyTime"` -} - -type CallbackAddMessageReactionExtResp struct { - CommonCallbackResp - ResultReactionExtensionList []*msg.KeyValueResp `json:"resultReactionExtensionList"` - IsReact bool `json:"isReact"` - MsgFirstModifyTime int64 `json:"msgFirstModifyTime"` -} diff --git a/pkg/common/cmd/cron_task.go b/pkg/common/cmd/cron_task.go index c26cf2e4f..25dc9aae4 100644 --- a/pkg/common/cmd/cron_task.go +++ b/pkg/common/cmd/cron_task.go @@ -21,7 +21,7 @@ type CronTaskCmd struct { } func NewCronTaskCmd() *CronTaskCmd { - return &CronTaskCmd{NewRootCmd("cronTask")} + return &CronTaskCmd{NewRootCmd("cronTask", WithCronTaskLogName())} } func (c *CronTaskCmd) addRunE(f func() error) { diff --git a/pkg/common/cmd/root.go b/pkg/common/cmd/root.go index b15d984a0..c5fce2c95 100644 --- a/pkg/common/cmd/root.go +++ b/pkg/common/cmd/root.go @@ -31,17 +31,40 @@ type RootCmd struct { prometheusPort int } -func NewRootCmd(name string) (rootCmd *RootCmd) { +type CmdOpts struct { + loggerPrefixName string +} + +func WithCronTaskLogName() func(*CmdOpts) { + return func(opts *CmdOpts) { + opts.loggerPrefixName = "OpenIM.CronTask.log.all" + } +} + +func WithLogName(logName string) func(*CmdOpts) { + return func(opts *CmdOpts) { + opts.loggerPrefixName = logName + } +} + +func NewRootCmd(name string, opts ...func(*CmdOpts)) (rootCmd *RootCmd) { rootCmd = &RootCmd{Name: name} c := cobra.Command{ - Use: "start", - Short: fmt.Sprintf(`Start %s server`, name), - Long: fmt.Sprintf(`Start %s server`, name), + Use: "start openIM application", + Short: fmt.Sprintf(`Start %s `, name), + Long: fmt.Sprintf(`Start %s `, name), PersistentPreRunE: func(cmd *cobra.Command, args []string) error { if err := rootCmd.getConfFromCmdAndInit(cmd); err != nil { panic(err) } - if err := log.InitFromConfig("OpenIM.log.all", name, config.Config.Log.RemainLogLevel, config.Config.Log.IsStdout, config.Config.Log.IsJson, config.Config.Log.StorageLocation, config.Config.Log.RemainRotationCount); err != nil { + cmdOpts := &CmdOpts{} + for _, opt := range opts { + opt(cmdOpts) + } + if cmdOpts.loggerPrefixName == "" { + cmdOpts.loggerPrefixName = "OpenIM.log.all" + } + if err := log.InitFromConfig(cmdOpts.loggerPrefixName, name, config.Config.Log.RemainLogLevel, config.Config.Log.IsStdout, config.Config.Log.IsJson, config.Config.Log.StorageLocation, config.Config.Log.RemainRotationCount); err != nil { panic(err) } return nil diff --git a/pkg/common/cmd/rpc.go b/pkg/common/cmd/rpc.go index bfaef5305..8ff4195d2 100644 --- a/pkg/common/cmd/rpc.go +++ b/pkg/common/cmd/rpc.go @@ -1,27 +1,12 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 cmd import ( "errors" - "github.com/spf13/cobra" - "google.golang.org/grpc" - "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry" "github.com/OpenIMSDK/Open-IM-Server/pkg/startrpc" + "github.com/spf13/cobra" + "google.golang.org/grpc" ) type RpcCmd struct { @@ -41,10 +26,7 @@ func (a *RpcCmd) Exec() error { return a.Execute() } -func (a *RpcCmd) StartSvr( - name string, - rpcFn func(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error, -) error { +func (a *RpcCmd) StartSvr(name string, rpcFn func(discov discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error) error { if a.GetPortFlag() == 0 { return errors.New("port is required") } diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go index eef803e12..ae5599891 100644 --- a/pkg/common/config/config.go +++ b/pkg/common/config/config.go @@ -91,15 +91,11 @@ type config struct { MsgToPush struct { Topic string `yaml:"topic"` } `yaml:"msgToPush"` - MsgToModify struct { - Topic string `yaml:"topic"` - } `yaml:"msgToModify"` ConsumerGroupID struct { - MsgToRedis string `yaml:"msgToRedis"` - MsgToMongo string `yaml:"msgToMongo"` - MsgToMySql string `yaml:"msgToMySql"` - MsgToPush string `yaml:"msgToPush"` - MsgToModify string `yaml:"msgToModify"` + MsgToRedis string `yaml:"msgToRedis"` + MsgToMongo string `yaml:"msgToMongo"` + MsgToMySql string `yaml:"msgToMySql"` + MsgToPush string `yaml:"msgToPush"` } `yaml:"consumerGroupID"` } `yaml:"kafka"` @@ -117,42 +113,26 @@ type config struct { Enable string `yaml:"enable"` ApiURL string `yaml:"apiURL"` Minio struct { - TempBucket string `yaml:"tempBucket"` - DataBucket string `yaml:"dataBucket"` - Location string `yaml:"location"` - Endpoint string `yaml:"endpoint"` - AccessKeyID string `yaml:"accessKeyID"` - SecretAccessKey string `yaml:"secretAccessKey"` - IsDistributedMod bool `yaml:"isDistributedMod"` + Bucket string `yaml:"bucket"` + Endpoint string `yaml:"endpoint"` + AccessKeyID string `yaml:"accessKeyID"` + SecretAccessKey string `yaml:"secretAccessKey"` + SessionToken string `yaml:"sessionToken"` } `yaml:"minio"` - Tencent struct { - AppID string `yaml:"appID"` - Region string `yaml:"region"` - Bucket string `yaml:"bucket"` - SecretID string `yaml:"secretID"` - SecretKey string `yaml:"secretKey"` - } `yaml:"tencent"` - Ali struct { - RegionID string `yaml:"regionID"` - AccessKeyID string `yaml:"accessKeyID"` - AccessKeySecret string `yaml:"accessKeySecret"` - StsEndpoint string `yaml:"stsEndpoint"` - OssEndpoint string `yaml:"ossEndpoint"` - Bucket string `yaml:"bucket"` - FinalHost string `yaml:"finalHost"` - StsDurationSeconds int64 `yaml:"stsDurationSeconds"` - OssRoleArn string `yaml:"OssRoleArn"` - } `yaml:"ali"` - Aws struct { + Cos struct { + BucketURL string `yaml:"bucketURL"` + SecretID string `yaml:"secretID"` + SecretKey string `yaml:"secretKey"` + SessionToken string `yaml:"sessionToken"` + } `yaml:"cos"` + Oss struct { + Endpoint string `yaml:"endpoint"` + Bucket string `yaml:"bucket"` + BucketURL string `yaml:"bucketURL"` AccessKeyID string `yaml:"accessKeyID"` AccessKeySecret string `yaml:"accessKeySecret"` - Region string `yaml:"region"` - Bucket string `yaml:"bucket"` - FinalHost string `yaml:"finalHost"` - RoleArn string `yaml:"roleArn"` - ExternalId string `yaml:"externalId"` - RoleSessionName string `yaml:"roleSessionName"` - } `yaml:"aws"` + SessionToken string `yaml:"sessionToken"` + } `yaml:"oss"` } `yaml:"object"` RpcPort struct { @@ -229,6 +209,7 @@ type config struct { SingleMessageHasReadReceiptEnable bool `yaml:"singleMessageHasReadReceiptEnable"` RetainChatRecords int `yaml:"retainChatRecords"` ChatRecordsClearTime string `yaml:"chatRecordsClearTime"` + MsgDestructTime string `yaml:"msgDestructTime"` Secret string `yaml:"secret"` TokenPolicy struct { Expire int64 `yaml:"expire"` diff --git a/pkg/common/convert/conversation.go b/pkg/common/convert/conversation.go index f00cae58f..4bb051a7c 100644 --- a/pkg/common/convert/conversation.go +++ b/pkg/common/convert/conversation.go @@ -22,6 +22,7 @@ import ( func ConversationDB2Pb(conversationDB *relation.ConversationModel) *conversation.Conversation { conversationPB := &conversation.Conversation{} + conversationPB.LatestMsgDestructTime = conversationDB.LatestMsgDestructTime.Unix() if err := utils.CopyStructFields(conversationPB, conversationDB); err != nil { return nil } @@ -34,6 +35,7 @@ func ConversationsDB2Pb(conversationsDB []*relation.ConversationModel) (conversa if err := utils.CopyStructFields(conversationPB, conversationDB); err != nil { continue } + conversationPB.LatestMsgDestructTime = conversationDB.LatestMsgDestructTime.Unix() conversationsPB = append(conversationsPB, conversationPB) } return conversationsPB diff --git a/pkg/common/db/cache/extend_msg_set.go b/pkg/common/db/cache/extend_msg_set.go deleted file mode 100644 index d7750e66b..000000000 --- a/pkg/common/db/cache/extend_msg_set.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 cache - -import ( - "context" - "time" - - "github.com/dtm-labs/rockscache" - "github.com/redis/go-redis/v9" - - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/unrelation" -) - -const ( - extendMsgSetCache = "EXTEND_MSG_SET_CACHE:" - extendMsgCache = "EXTEND_MSG_CACHE:" -) - -type ExtendMsgSetCache interface { - metaCache - NewCache() ExtendMsgSetCache - GetExtendMsg( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - firstModifyTime int64, - ) (extendMsg *unrelation.ExtendMsgModel, err error) - DelExtendMsg(clientMsgID string) ExtendMsgSetCache -} - -type ExtendMsgSetCacheRedis struct { - metaCache - expireTime time.Duration - rcClient *rockscache.Client - extendMsgSetDB unrelation.ExtendMsgSetModelInterface -} - -func NewExtendMsgSetCacheRedis( - rdb redis.UniversalClient, - extendMsgSetDB unrelation.ExtendMsgSetModelInterface, - options rockscache.Options, -) ExtendMsgSetCache { - rcClient := rockscache.NewClient(rdb, options) - return &ExtendMsgSetCacheRedis{ - metaCache: NewMetaCacheRedis(rcClient), - expireTime: time.Second * 30 * 60, - extendMsgSetDB: extendMsgSetDB, - rcClient: rcClient, - } -} - -func (e *ExtendMsgSetCacheRedis) NewCache() ExtendMsgSetCache { - return &ExtendMsgSetCacheRedis{ - metaCache: NewMetaCacheRedis(e.rcClient, e.metaCache.GetPreDelKeys()...), - expireTime: e.expireTime, - extendMsgSetDB: e.extendMsgSetDB, - rcClient: e.rcClient, - } -} - -func (e *ExtendMsgSetCacheRedis) getKey(clientMsgID string) string { - return extendMsgCache + clientMsgID -} - -func (e *ExtendMsgSetCacheRedis) GetExtendMsg( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - firstModifyTime int64, -) (extendMsg *unrelation.ExtendMsgModel, err error) { - return getCache( - ctx, - e.rcClient, - e.getKey(clientMsgID), - e.expireTime, - func(ctx context.Context) (*unrelation.ExtendMsgModel, error) { - return e.extendMsgSetDB.TakeExtendMsg(ctx, conversationID, sessionType, clientMsgID, firstModifyTime) - }, - ) -} - -func (e *ExtendMsgSetCacheRedis) DelExtendMsg(clientMsgID string) ExtendMsgSetCache { - new := e.NewCache() - new.AddKeys(e.getKey(clientMsgID)) - return new -} diff --git a/pkg/common/db/controller/conversation.go b/pkg/common/db/controller/conversation.go index 8e7b7a350..7908d163a 100644 --- a/pkg/common/db/controller/conversation.go +++ b/pkg/common/db/controller/conversation.go @@ -1,21 +1,8 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 controller import ( "context" + "time" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache" @@ -27,22 +14,13 @@ import ( type ConversationDatabase interface { //UpdateUserConversationFiled 更新用户该会话的属性信息 - UpdateUsersConversationFiled( - ctx context.Context, - userIDs []string, - conversationID string, - args map[string]interface{}, - ) error + UpdateUsersConversationFiled(ctx context.Context, userIDs []string, conversationID string, args map[string]interface{}) error //CreateConversation 创建一批新的会话 CreateConversation(ctx context.Context, conversations []*relationTb.ConversationModel) error //SyncPeerUserPrivateConversation 同步对端私聊会话内部保证事务操作 SyncPeerUserPrivateConversationTx(ctx context.Context, conversation []*relationTb.ConversationModel) error //FindConversations 根据会话ID获取某个用户的多个会话 - FindConversations( - ctx context.Context, - ownerUserID string, - conversationIDs []string, - ) ([]*relationTb.ConversationModel, error) + FindConversations(ctx context.Context, ownerUserID string, conversationIDs []string) ([]*relationTb.ConversationModel, error) //FindRecvMsgNotNotifyUserIDs 获取超级大群开启免打扰的用户ID FindRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) ([]string, error) //GetUserAllConversation 获取一个用户在服务器上所有的会话 @@ -50,28 +28,17 @@ type ConversationDatabase interface { //SetUserConversations 设置用户多个会话属性,如果会话不存在则创建,否则更新,内部保证原子性 SetUserConversations(ctx context.Context, ownerUserID string, conversations []*relationTb.ConversationModel) error //SetUsersConversationFiledTx 设置多个用户会话关于某个字段的更新操作,如果会话不存在则创建,否则更新,内部保证事务操作 - SetUsersConversationFiledTx( - ctx context.Context, - userIDs []string, - conversation *relationTb.ConversationModel, - filedMap map[string]interface{}, - ) error + SetUsersConversationFiledTx(ctx context.Context, userIDs []string, conversation *relationTb.ConversationModel, filedMap map[string]interface{}) error CreateGroupChatConversation(ctx context.Context, groupID string, userIDs []string) error GetConversationIDs(ctx context.Context, userID string) ([]string, error) GetUserConversationIDsHash(ctx context.Context, ownerUserID string) (hash uint64, err error) GetAllConversationIDs(ctx context.Context) ([]string, error) GetUserAllHasReadSeqs(ctx context.Context, ownerUserID string) (map[string]int64, error) - GetConversationsByConversationID( - ctx context.Context, - conversationIDs []string, - ) ([]*relationTb.ConversationModel, error) + GetConversationsByConversationID(ctx context.Context, conversationIDs []string) ([]*relationTb.ConversationModel, error) + GetConversationIDsNeedDestruct(ctx context.Context) ([]*relationTb.ConversationModel, error) } -func NewConversationDatabase( - conversation relationTb.ConversationModelInterface, - cache cache.ConversationCache, - tx tx.Tx, -) ConversationDatabase { +func NewConversationDatabase(conversation relationTb.ConversationModelInterface, cache cache.ConversationCache, tx tx.Tx) ConversationDatabase { return &conversationDatabase{ conversationDB: conversation, cache: cache, @@ -85,12 +52,7 @@ type conversationDatabase struct { tx tx.Tx } -func (c *conversationDatabase) SetUsersConversationFiledTx( - ctx context.Context, - userIDs []string, - conversation *relationTb.ConversationModel, - filedMap map[string]interface{}, -) (err error) { +func (c *conversationDatabase) SetUsersConversationFiledTx(ctx context.Context, userIDs []string, conversation *relationTb.ConversationModel, filedMap map[string]interface{}) (err error) { cache := c.cache.NewCache() if err := c.tx.Transaction(func(tx any) error { conversationTx := c.conversationDB.NewTx(tx) @@ -113,12 +75,14 @@ func (c *conversationDatabase) SetUsersConversationFiledTx( NotUserIDs := utils.DifferenceString(haveUserIDs, userIDs) log.ZDebug(ctx, "SetUsersConversationFiledTx", "NotUserIDs", NotUserIDs, "haveUserIDs", haveUserIDs, "userIDs", userIDs) var conversations []*relationTb.ConversationModel + now := time.Now() for _, v := range NotUserIDs { temp := new(relationTb.ConversationModel) if err := utils.CopyStructFields(temp, conversation); err != nil { return err } temp.OwnerUserID = v + temp.CreateTime = now conversations = append(conversations, temp) } @@ -136,12 +100,7 @@ func (c *conversationDatabase) SetUsersConversationFiledTx( return cache.ExecDel(ctx) } -func (c *conversationDatabase) UpdateUsersConversationFiled( - ctx context.Context, - userIDs []string, - conversationID string, - args map[string]interface{}, -) error { +func (c *conversationDatabase) UpdateUsersConversationFiled(ctx context.Context, userIDs []string, conversationID string, args map[string]interface{}) error { _, err := c.conversationDB.UpdateByMap(ctx, userIDs, conversationID, args) if err != nil { return err @@ -149,10 +108,7 @@ func (c *conversationDatabase) UpdateUsersConversationFiled( return c.cache.DelUsersConversation(conversationID, userIDs...).ExecDel(ctx) } -func (c *conversationDatabase) CreateConversation( - ctx context.Context, - conversations []*relationTb.ConversationModel, -) error { +func (c *conversationDatabase) CreateConversation(ctx context.Context, conversations []*relationTb.ConversationModel) error { if err := c.conversationDB.Create(ctx, conversations); err != nil { return err } @@ -165,35 +121,34 @@ func (c *conversationDatabase) CreateConversation( return cache.DelConversationIDs(userIDs...).DelUserConversationIDsHash(userIDs...).ExecDel(ctx) } -func (c *conversationDatabase) SyncPeerUserPrivateConversationTx( - ctx context.Context, - conversations []*relationTb.ConversationModel, -) error { +func (c *conversationDatabase) SyncPeerUserPrivateConversationTx(ctx context.Context, conversations []*relationTb.ConversationModel) error { cache := c.cache.NewCache() if err := c.tx.Transaction(func(tx any) error { conversationTx := c.conversationDB.NewTx(tx) for _, conversation := range conversations { for _, v := range [][2]string{{conversation.OwnerUserID, conversation.UserID}, {conversation.UserID, conversation.OwnerUserID}} { - haveUserIDs, err := conversationTx.FindUserID(ctx, []string{v[0]}, []string{conversation.ConversationID}) + ownerUserID := v[0] + userID := v[1] + haveUserIDs, err := conversationTx.FindUserID(ctx, []string{ownerUserID}, []string{conversation.ConversationID}) if err != nil { return err } if len(haveUserIDs) > 0 { - _, err := conversationTx.UpdateByMap(ctx, []string{v[0]}, conversation.ConversationID, map[string]interface{}{"is_private_chat": conversation.IsPrivateChat}) + _, err := conversationTx.UpdateByMap(ctx, []string{ownerUserID}, conversation.ConversationID, map[string]interface{}{"is_private_chat": conversation.IsPrivateChat}) if err != nil { return err } - cache = cache.DelUsersConversation(conversation.ConversationID, v[0]) + cache = cache.DelUsersConversation(conversation.ConversationID, ownerUserID) } else { newConversation := *conversation - newConversation.OwnerUserID = v[0] - newConversation.UserID = v[1] + newConversation.OwnerUserID = ownerUserID + newConversation.UserID = userID newConversation.ConversationID = conversation.ConversationID newConversation.IsPrivateChat = conversation.IsPrivateChat if err := conversationTx.Create(ctx, []*relationTb.ConversationModel{&newConversation}); err != nil { return err } - cache = cache.DelConversationIDs(v[0]).DelUserConversationIDsHash(v[0]) + cache = cache.DelConversationIDs(ownerUserID).DelUserConversationIDsHash(ownerUserID) } } } @@ -201,37 +156,22 @@ func (c *conversationDatabase) SyncPeerUserPrivateConversationTx( }); err != nil { return err } - return c.cache.ExecDel(ctx) + return cache.ExecDel(ctx) } -func (c *conversationDatabase) FindConversations( - ctx context.Context, - ownerUserID string, - conversationIDs []string, -) ([]*relationTb.ConversationModel, error) { +func (c *conversationDatabase) FindConversations(ctx context.Context, ownerUserID string, conversationIDs []string) ([]*relationTb.ConversationModel, error) { return c.cache.GetConversations(ctx, ownerUserID, conversationIDs) } -func (c *conversationDatabase) GetConversation( - ctx context.Context, - ownerUserID string, - conversationID string, -) (*relationTb.ConversationModel, error) { +func (c *conversationDatabase) GetConversation(ctx context.Context, ownerUserID string, conversationID string) (*relationTb.ConversationModel, error) { return c.cache.GetConversation(ctx, ownerUserID, conversationID) } -func (c *conversationDatabase) GetUserAllConversation( - ctx context.Context, - ownerUserID string, -) ([]*relationTb.ConversationModel, error) { +func (c *conversationDatabase) GetUserAllConversation(ctx context.Context, ownerUserID string) ([]*relationTb.ConversationModel, error) { return c.cache.GetUserAllConversations(ctx, ownerUserID) } -func (c *conversationDatabase) SetUserConversations( - ctx context.Context, - ownerUserID string, - conversations []*relationTb.ConversationModel, -) error { +func (c *conversationDatabase) SetUserConversations(ctx context.Context, ownerUserID string, conversations []*relationTb.ConversationModel) error { cache := c.cache.NewCache() if err := c.tx.Transaction(func(tx any) error { var conversationIDs []string @@ -281,11 +221,7 @@ func (c *conversationDatabase) FindRecvMsgNotNotifyUserIDs(ctx context.Context, return c.cache.GetSuperGroupRecvMsgNotNotifyUserIDs(ctx, groupID) } -func (c *conversationDatabase) CreateGroupChatConversation( - ctx context.Context, - groupID string, - userIDs []string, -) error { +func (c *conversationDatabase) CreateGroupChatConversation(ctx context.Context, groupID string, userIDs []string) error { cache := c.cache.NewCache() conversationID := utils.GetConversationIDBySessionType(constant.SuperGroupChatType, groupID) if err := c.tx.Transaction(func(tx any) error { @@ -325,10 +261,7 @@ func (c *conversationDatabase) GetConversationIDs(ctx context.Context, userID st return c.cache.GetUserConversationIDs(ctx, userID) } -func (c *conversationDatabase) GetUserConversationIDsHash( - ctx context.Context, - ownerUserID string, -) (hash uint64, err error) { +func (c *conversationDatabase) GetUserConversationIDsHash(ctx context.Context, ownerUserID string) (hash uint64, err error) { return c.cache.GetUserConversationIDsHash(ctx, ownerUserID) } @@ -336,16 +269,14 @@ func (c *conversationDatabase) GetAllConversationIDs(ctx context.Context) ([]str return c.conversationDB.GetAllConversationIDs(ctx) } -func (c *conversationDatabase) GetUserAllHasReadSeqs( - ctx context.Context, - ownerUserID string, -) (map[string]int64, error) { +func (c *conversationDatabase) GetUserAllHasReadSeqs(ctx context.Context, ownerUserID string) (map[string]int64, error) { return c.cache.GetUserAllHasReadSeqs(ctx, ownerUserID) } -func (c *conversationDatabase) GetConversationsByConversationID( - ctx context.Context, - conversationIDs []string, -) ([]*relationTb.ConversationModel, error) { +func (c *conversationDatabase) GetConversationsByConversationID(ctx context.Context, conversationIDs []string) ([]*relationTb.ConversationModel, error) { return c.conversationDB.GetConversationsByConversationID(ctx, conversationIDs) } + +func (c *conversationDatabase) GetConversationIDsNeedDestruct(ctx context.Context) ([]*relationTb.ConversationModel, error) { + return c.conversationDB.GetConversationIDsNeedDestruct(ctx) +} diff --git a/pkg/common/db/controller/extend_msg.go b/pkg/common/db/controller/extend_msg.go deleted file mode 100644 index 73b6d9330..000000000 --- a/pkg/common/db/controller/extend_msg.go +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 controller - -import ( - "context" - - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache" - unRelationTb "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/unrelation" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/tx" -) - -// for mongoDB -type ExtendMsgDatabase interface { - CreateExtendMsgSet(ctx context.Context, set *unRelationTb.ExtendMsgSetModel) error - GetAllExtendMsgSet( - ctx context.Context, - ID string, - opts *unRelationTb.GetAllExtendMsgSetOpts, - ) (sets []*unRelationTb.ExtendMsgSetModel, err error) - GetExtendMsgSet( - ctx context.Context, - conversationID string, - sessionType int32, - maxMsgUpdateTime int64, - ) (*unRelationTb.ExtendMsgSetModel, error) - InsertExtendMsg( - ctx context.Context, - conversationID string, - sessionType int32, - msg *unRelationTb.ExtendMsgModel, - ) error - InsertOrUpdateReactionExtendMsgSet( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - msgFirstModifyTime int64, - reactionExtensionList map[string]*unRelationTb.KeyValueModel, - ) error - DeleteReactionExtendMsgSet( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - msgFirstModifyTime int64, - reactionExtensionList map[string]*unRelationTb.KeyValueModel, - ) error - GetExtendMsg( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - maxMsgUpdateTime int64, - ) (extendMsg *unRelationTb.ExtendMsgModel, err error) -} - -type extendMsgDatabase struct { - database unRelationTb.ExtendMsgSetModelInterface - cache cache.ExtendMsgSetCache - ctxTx tx.CtxTx -} - -func NewExtendMsgDatabase( - extendMsgModel unRelationTb.ExtendMsgSetModelInterface, - cache cache.ExtendMsgSetCache, - ctxTx tx.CtxTx, -) ExtendMsgDatabase { - return &extendMsgDatabase{database: extendMsgModel, cache: cache, ctxTx: ctxTx} -} - -func (e *extendMsgDatabase) CreateExtendMsgSet(ctx context.Context, set *unRelationTb.ExtendMsgSetModel) error { - return e.database.CreateExtendMsgSet(ctx, set) -} - -func (e *extendMsgDatabase) GetAllExtendMsgSet( - ctx context.Context, - conversationID string, - opts *unRelationTb.GetAllExtendMsgSetOpts, -) (sets []*unRelationTb.ExtendMsgSetModel, err error) { - return e.database.GetAllExtendMsgSet(ctx, conversationID, opts) -} - -func (e *extendMsgDatabase) GetExtendMsgSet( - ctx context.Context, - conversationID string, - sessionType int32, - maxMsgUpdateTime int64, -) (*unRelationTb.ExtendMsgSetModel, error) { - return e.database.GetExtendMsgSet(ctx, conversationID, sessionType, maxMsgUpdateTime) -} - -func (e *extendMsgDatabase) InsertExtendMsg( - ctx context.Context, - conversationID string, - sessionType int32, - msg *unRelationTb.ExtendMsgModel, -) error { - return e.database.InsertExtendMsg(ctx, conversationID, sessionType, msg) -} - -func (e *extendMsgDatabase) InsertOrUpdateReactionExtendMsgSet( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - msgFirstModifyTime int64, - reactionExtensionList map[string]*unRelationTb.KeyValueModel, -) error { - return e.database.InsertOrUpdateReactionExtendMsgSet( - ctx, - conversationID, - sessionType, - clientMsgID, - msgFirstModifyTime, - reactionExtensionList, - ) -} - -func (e *extendMsgDatabase) DeleteReactionExtendMsgSet( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - msgFirstModifyTime int64, - reactionExtensionList map[string]*unRelationTb.KeyValueModel, -) error { - return e.database.DeleteReactionExtendMsgSet( - ctx, - conversationID, - sessionType, - clientMsgID, - msgFirstModifyTime, - reactionExtensionList, - ) -} - -func (e *extendMsgDatabase) GetExtendMsg( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - maxMsgUpdateTime int64, -) (extendMsg *unRelationTb.ExtendMsgModel, err error) { - return e.cache.GetExtendMsg(ctx, conversationID, sessionType, clientMsgID, maxMsgUpdateTime) -} diff --git a/pkg/common/db/controller/group.go b/pkg/common/db/controller/group.go index 18b10aca5..9010e3350 100644 --- a/pkg/common/db/controller/group.go +++ b/pkg/common/db/controller/group.go @@ -17,6 +17,7 @@ package controller import ( "context" "fmt" + "time" "github.com/dtm-labs/rockscache" "github.com/redis/go-redis/v9" @@ -121,6 +122,11 @@ type GroupDatabase interface { DeleteSuperGroup(ctx context.Context, groupID string) error DeleteSuperGroupMember(ctx context.Context, groupID string, userIDs []string) error CreateSuperGroupMember(ctx context.Context, groupID string, userIDs []string) error + + // 获取群总数 + CountTotal(ctx context.Context, before *time.Time) (count int64, err error) + // 获取范围内群增量 + CountRangeEverydayTotal(ctx context.Context, start time.Time, end time.Time) (map[string]int64, error) } func NewGroupDatabase( @@ -562,3 +568,11 @@ func (g *groupDatabase) CreateSuperGroupMember(ctx context.Context, groupID stri } return g.cache.DelSuperGroupMemberIDs(groupID).DelJoinedSuperGroupIDs(userIDs...).ExecDel(ctx) } + +func (g *groupDatabase) CountTotal(ctx context.Context, before *time.Time) (count int64, err error) { + return g.groupDB.CountTotal(ctx, before) +} + +func (g *groupDatabase) CountRangeEverydayTotal(ctx context.Context, start time.Time, end time.Time) (map[string]int64, error) { + return g.groupDB.CountRangeEverydayTotal(ctx, start, end) +} diff --git a/pkg/common/db/controller/msg.go b/pkg/common/db/controller/msg.go index 435e3e70b..f23e7580c 100644 --- a/pkg/common/db/controller/msg.go +++ b/pkg/common/db/controller/msg.go @@ -1,21 +1,6 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 controller import ( - "fmt" "time" "github.com/redis/go-redis/v9" @@ -33,11 +18,10 @@ import ( "context" "errors" - "go.mongodb.org/mongo-driver/mongo" - pbMsg "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg" "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" + "go.mongodb.org/mongo-driver/mongo" ) const ( @@ -56,28 +40,17 @@ type CommonMsgDatabase interface { DeleteMessagesFromCache(ctx context.Context, conversationID string, seqs []int64) error DelUserDeleteMsgsList(ctx context.Context, conversationID string, seqs []int64) // incrSeq然后批量插入缓存 - BatchInsertChat2Cache( - ctx context.Context, - conversationID string, - msgs []*sdkws.MsgData, - ) (seq int64, isNewConversation bool, err error) + BatchInsertChat2Cache(ctx context.Context, conversationID string, msgs []*sdkws.MsgData) (seq int64, isNewConversation bool, err error) // 通过seqList获取mongo中写扩散消息 - GetMsgBySeqsRange( - ctx context.Context, - userID string, - conversationID string, - begin, end, num, userMaxSeq int64, - ) (minSeq int64, maxSeq int64, seqMsg []*sdkws.MsgData, err error) + GetMsgBySeqsRange(ctx context.Context, userID string, conversationID string, begin, end, num, userMaxSeq int64) (minSeq int64, maxSeq int64, seqMsg []*sdkws.MsgData, err error) // 通过seqList获取大群在 mongo里面的消息 - GetMsgBySeqs( - ctx context.Context, - userID string, - conversationID string, - seqs []int64, - ) (minSeq int64, maxSeq int64, seqMsg []*sdkws.MsgData, err error) + GetMsgBySeqs(ctx context.Context, userID string, conversationID string, seqs []int64) (minSeq int64, maxSeq int64, seqMsg []*sdkws.MsgData, err error) // 删除会话消息重置最小seq, remainTime为消息保留的时间单位秒,超时消息删除, 传0删除所有消息(此方法不删除redis cache) DeleteConversationMsgsAndSetMinSeq(ctx context.Context, conversationID string, remainTime int64) error + // 用户标记删除过期消息返回标记删除的seq列表 + UserMsgsDestruct(cte context.Context, userID string, conversationID string, destructTime int64, lastMsgDestructTime time.Time) (seqs []int64, err error) + // 用户根据seq删除消息 DeleteUserMsgsBySeqs(ctx context.Context, userID string, conversationID string, seqs []int64) error // 物理删除消息置空 @@ -101,11 +74,8 @@ type CommonMsgDatabase interface { GetHasReadSeq(ctx context.Context, userID string, conversationID string) (int64, error) UserSetHasReadSeqs(ctx context.Context, userID string, hasReadSeqs map[string]int64) error - GetMongoMaxAndMinSeq(ctx context.Context, conversationID string) (maxSeq, minSeq int64, err error) - GetConversationMinMaxSeqInMongoAndCache( - ctx context.Context, - conversationID string, - ) (minSeqMongo, maxSeqMongo, minSeqCache, maxSeqCache int64, err error) + GetMongoMaxAndMinSeq(ctx context.Context, conversationID string) (minSeqMongo, maxSeqMongo int64, err error) + GetConversationMinMaxSeqInMongoAndCache(ctx context.Context, conversationID string) (minSeqMongo, maxSeqMongo, minSeqCache, maxSeqCache int64, err error) SetSendMsgStatus(ctx context.Context, id string, status int32) error GetSendMsgStatus(ctx context.Context, id string) (int32, error) @@ -115,51 +85,17 @@ type CommonMsgDatabase interface { MsgToPushMQ(ctx context.Context, key, conversarionID string, msg2mq *sdkws.MsgData) (int32, int64, error) MsgToMongoMQ(ctx context.Context, key, conversarionID string, msgs []*sdkws.MsgData, lastSeq int64) error - // modify - JudgeMessageReactionExist(ctx context.Context, clientMsgID string, sessionType int32) (bool, error) - SetMessageTypeKeyValue(ctx context.Context, clientMsgID string, sessionType int32, typeKey, value string) error - SetMessageReactionExpire( - ctx context.Context, - clientMsgID string, - sessionType int32, - expiration time.Duration, - ) (bool, error) - GetExtendMsg( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - maxMsgUpdateTime int64, - ) (*pbMsg.ExtendMsg, error) - InsertOrUpdateReactionExtendMsgSet( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - msgFirstModifyTime int64, - reactionExtensionList map[string]*sdkws.KeyValue, - ) error - GetMessageTypeKeyValue(ctx context.Context, clientMsgID string, sessionType int32, typeKey string) (string, error) - GetOneMessageAllReactionList(ctx context.Context, clientMsgID string, sessionType int32) (map[string]string, error) - DeleteOneMessageKey(ctx context.Context, clientMsgID string, sessionType int32, subKey string) error - DeleteReactionExtendMsgSet( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - msgFirstModifyTime int64, - reactionExtensionList map[string]*sdkws.KeyValue, - ) error + RangeUserSendCount(ctx context.Context, start time.Time, end time.Time, group bool, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, users []*unRelationTb.UserCount, dateCount map[string]int64, err error) + RangeGroupSendCount(ctx context.Context, start time.Time, end time.Time, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, groups []*unRelationTb.GroupCount, dateCount map[string]int64, err error) } func NewCommonMsgDatabase(msgDocModel unRelationTb.MsgDocModelInterface, cacheModel cache.MsgModel) CommonMsgDatabase { return &commonMsgDatabase{ - msgDocDatabase: msgDocModel, - cache: cacheModel, - producer: kafka.NewKafkaProducer(config.Config.Kafka.Addr, config.Config.Kafka.LatestMsgToRedis.Topic), - producerToMongo: kafka.NewKafkaProducer(config.Config.Kafka.Addr, config.Config.Kafka.MsgToMongo.Topic), - producerToPush: kafka.NewKafkaProducer(config.Config.Kafka.Addr, config.Config.Kafka.MsgToPush.Topic), - producerToModify: kafka.NewKafkaProducer(config.Config.Kafka.Addr, config.Config.Kafka.MsgToModify.Topic), + msgDocDatabase: msgDocModel, + cache: cacheModel, + producer: kafka.NewKafkaProducer(config.Config.Kafka.Addr, config.Config.Kafka.LatestMsgToRedis.Topic), + producerToMongo: kafka.NewKafkaProducer(config.Config.Kafka.Addr, config.Config.Kafka.MsgToMongo.Topic), + producerToPush: kafka.NewKafkaProducer(config.Config.Kafka.Addr, config.Config.Kafka.MsgToPush.Topic), } } @@ -171,15 +107,13 @@ func InitCommonMsgDatabase(rdb redis.UniversalClient, database *mongo.Database) } type commonMsgDatabase struct { - msgDocDatabase unRelationTb.MsgDocModelInterface - extendMsgDatabase unRelationTb.ExtendMsgSetModelInterface - extendMsgSetModel unRelationTb.ExtendMsgSetModel - msg unRelationTb.MsgDocModel - cache cache.MsgModel - producer *kafka.Producer - producerToMongo *kafka.Producer - producerToModify *kafka.Producer - producerToPush *kafka.Producer + msgDocDatabase unRelationTb.MsgDocModelInterface + msg unRelationTb.MsgDocModel + cache cache.MsgModel + producer *kafka.Producer + producerToMongo *kafka.Producer + producerToModify *kafka.Producer + producerToPush *kafka.Producer } func (db *commonMsgDatabase) MsgToMQ(ctx context.Context, key string, msg2mq *sdkws.MsgData) error { @@ -187,32 +121,16 @@ func (db *commonMsgDatabase) MsgToMQ(ctx context.Context, key string, msg2mq *sd return err } -func (db *commonMsgDatabase) MsgToModifyMQ( - ctx context.Context, - key, conversationID string, - messages []*sdkws.MsgData, -) error { +func (db *commonMsgDatabase) MsgToModifyMQ(ctx context.Context, key, conversationID string, messages []*sdkws.MsgData) error { if len(messages) > 0 { - _, _, err := db.producerToModify.SendMessage( - ctx, - key, - &pbMsg.MsgDataToModifyByMQ{ConversationID: conversationID, Messages: messages}, - ) + _, _, err := db.producerToModify.SendMessage(ctx, key, &pbMsg.MsgDataToModifyByMQ{ConversationID: conversationID, Messages: messages}) return err } return nil } -func (db *commonMsgDatabase) MsgToPushMQ( - ctx context.Context, - key, conversationID string, - msg2mq *sdkws.MsgData, -) (int32, int64, error) { - partition, offset, err := db.producerToPush.SendMessage( - ctx, - key, - &pbMsg.PushMsgDataToMQ{MsgData: msg2mq, ConversationID: conversationID}, - ) +func (db *commonMsgDatabase) MsgToPushMQ(ctx context.Context, key, conversationID string, msg2mq *sdkws.MsgData) (int32, int64, error) { + partition, offset, err := db.producerToPush.SendMessage(ctx, key, &pbMsg.PushMsgDataToMQ{MsgData: msg2mq, ConversationID: conversationID}) if err != nil { log.ZError(ctx, "MsgToPushMQ", err, "key", key, "msg2mq", msg2mq) return 0, 0, err @@ -220,30 +138,15 @@ func (db *commonMsgDatabase) MsgToPushMQ( return partition, offset, nil } -func (db *commonMsgDatabase) MsgToMongoMQ( - ctx context.Context, - key, conversationID string, - messages []*sdkws.MsgData, - lastSeq int64, -) error { +func (db *commonMsgDatabase) MsgToMongoMQ(ctx context.Context, key, conversationID string, messages []*sdkws.MsgData, lastSeq int64) error { if len(messages) > 0 { - _, _, err := db.producerToMongo.SendMessage( - ctx, - key, - &pbMsg.MsgDataToMongoByMQ{LastSeq: lastSeq, ConversationID: conversationID, MsgData: messages}, - ) + _, _, err := db.producerToMongo.SendMessage(ctx, key, &pbMsg.MsgDataToMongoByMQ{LastSeq: lastSeq, ConversationID: conversationID, MsgData: messages}) return err } return nil } -func (db *commonMsgDatabase) BatchInsertBlock( - ctx context.Context, - conversationID string, - fields []any, - key int8, - firstSeq int64, -) error { +func (db *commonMsgDatabase) BatchInsertBlock(ctx context.Context, conversationID string, fields []any, key int8, firstSeq int64) error { if len(fields) == 0 { return nil } @@ -344,12 +247,7 @@ func (db *commonMsgDatabase) BatchInsertBlock( return nil } -func (db *commonMsgDatabase) BatchInsertChat2DB( - ctx context.Context, - conversationID string, - msgList []*sdkws.MsgData, - currentMaxSeq int64, -) error { +func (db *commonMsgDatabase) BatchInsertChat2DB(ctx context.Context, conversationID string, msgList []*sdkws.MsgData, currentMaxSeq int64) error { if len(msgList) == 0 { return errs.ErrArgs.Wrap("msgList is empty") } @@ -395,21 +293,11 @@ func (db *commonMsgDatabase) BatchInsertChat2DB( return db.BatchInsertBlock(ctx, conversationID, msgs, updateKeyMsg, msgList[0].Seq) } -func (db *commonMsgDatabase) RevokeMsg( - ctx context.Context, - conversationID string, - seq int64, - revoke *unRelationTb.RevokeModel, -) error { +func (db *commonMsgDatabase) RevokeMsg(ctx context.Context, conversationID string, seq int64, revoke *unRelationTb.RevokeModel) error { return db.BatchInsertBlock(ctx, conversationID, []any{revoke}, updateKeyRevoke, seq) } -func (db *commonMsgDatabase) MarkSingleChatMsgsAsRead( - ctx context.Context, - userID string, - conversationID string, - totalSeqs []int64, -) error { +func (db *commonMsgDatabase) MarkSingleChatMsgsAsRead(ctx context.Context, userID string, conversationID string, totalSeqs []int64) error { for docID, seqs := range db.msg.GetDocIDSeqsMap(conversationID, totalSeqs) { var indexes []int64 for _, seq := range seqs { @@ -432,11 +320,7 @@ func (db *commonMsgDatabase) DelUserDeleteMsgsList(ctx context.Context, conversa db.cache.DelUserDeleteMsgsList(ctx, conversationID, seqs) } -func (db *commonMsgDatabase) BatchInsertChat2Cache( - ctx context.Context, - conversationID string, - msgs []*sdkws.MsgData, -) (seq int64, isNew bool, err error) { +func (db *commonMsgDatabase) BatchInsertChat2Cache(ctx context.Context, conversationID string, msgs []*sdkws.MsgData) (seq int64, isNew bool, err error) { currentMaxSeq, err := db.cache.GetMaxSeq(ctx, conversationID) if err != nil && errs.Unwrap(err) != redis.Nil { prome.Inc(prome.SeqGetFailedCounter) @@ -483,11 +367,7 @@ func (db *commonMsgDatabase) BatchInsertChat2Cache( return lastMaxSeq, isNew, utils.Wrap(err, "") } -func (db *commonMsgDatabase) getMsgBySeqs( - ctx context.Context, - userID, conversationID string, - seqs []int64, -) (totalMsgs []*sdkws.MsgData, err error) { +func (db *commonMsgDatabase) getMsgBySeqs(ctx context.Context, userID, conversationID string, seqs []int64) (totalMsgs []*sdkws.MsgData, err error) { for docID, seqs := range db.msg.GetDocIDSeqsMap(conversationID, seqs) { //log.ZDebug(ctx, "getMsgBySeqs", "docID", docID, "seqs", seqs) msgs, err := db.findMsgInfoBySeq(ctx, userID, docID, seqs) @@ -501,50 +381,7 @@ func (db *commonMsgDatabase) getMsgBySeqs( return totalMsgs, nil } -// func (db *commonMsgDatabase) refetchDelSeqsMsgs(ctx context.Context, conversationID string, delNums, rangeBegin, -// begin int64) (seqMsgs []*unRelationTb.MsgDataModel, err error) { -// var reFetchSeqs []int64 -// if delNums > 0 { -// newBeginSeq := rangeBegin - delNums -// if newBeginSeq >= begin { -// newEndSeq := rangeBegin - 1 -// for i := newBeginSeq; i <= newEndSeq; i++ { -// reFetchSeqs = append(reFetchSeqs, i) -// } -// } -// } -// if len(reFetchSeqs) == 0 { -// return -// } -// if len(reFetchSeqs) > 0 { -// m := db.msg.GetDocIDSeqsMap(conversationID, reFetchSeqs) -// for docID, seqs := range m { -// msgs, _, err := db.findMsgInfoBySeq(ctx, docID, seqs) -// if err != nil { -// return nil, err -// } -// for _, msg := range msgs { -// if msg.Status != constant.MsgDeleted { -// seqMsgs = append(seqMsgs, msg) -// } -// } -// } -// } -// if len(seqMsgs) < int(delNums) { -// seqMsgs2, err := db.refetchDelSeqsMsgs(ctx, conversationID, delNums-int64(len(seqMsgs)), rangeBegin-1, begin) -// if err != nil { -// return seqMsgs, err -// } -// seqMsgs = append(seqMsgs, seqMsgs2...) -// } -// return seqMsgs, nil -// } - -func (db *commonMsgDatabase) findMsgInfoBySeq( - ctx context.Context, - userID, docID string, - seqs []int64, -) (totalMsgs []*unRelationTb.MsgInfoModel, err error) { +func (db *commonMsgDatabase) findMsgInfoBySeq(ctx context.Context, userID, docID string, seqs []int64) (totalMsgs []*unRelationTb.MsgInfoModel, err error) { msgs, err := db.msgDocDatabase.GetMsgBySeqIndexIn1Doc(ctx, userID, docID, seqs) for _, msg := range msgs { if msg.IsRead { @@ -554,25 +391,8 @@ func (db *commonMsgDatabase) findMsgInfoBySeq( return msgs, err } -func (db *commonMsgDatabase) getMsgBySeqsRange( - ctx context.Context, - userID string, - conversationID string, - allSeqs []int64, - begin, end int64, -) (seqMsgs []*sdkws.MsgData, err error) { - log.ZDebug( - ctx, - "getMsgBySeqsRange", - "conversationID", - conversationID, - "allSeqs", - allSeqs, - "begin", - begin, - "end", - end, - ) +func (db *commonMsgDatabase) getMsgBySeqsRange(ctx context.Context, userID string, conversationID string, allSeqs []int64, begin, end int64) (seqMsgs []*sdkws.MsgData, err error) { + log.ZDebug(ctx, "getMsgBySeqsRange", "conversationID", conversationID, "allSeqs", allSeqs, "begin", begin, "end", end) for docID, seqs := range db.msg.GetDocIDSeqsMap(conversationID, allSeqs) { log.ZDebug(ctx, "getMsgBySeqsRange", "docID", docID, "seqs", seqs) msgs, err := db.findMsgInfoBySeq(ctx, userID, docID, seqs) @@ -589,12 +409,7 @@ func (db *commonMsgDatabase) getMsgBySeqsRange( return seqMsgs, nil } -func (db *commonMsgDatabase) GetMsgBySeqsRange( - ctx context.Context, - userID string, - conversationID string, - begin, end, num, userMaxSeq int64, -) (int64, int64, []*sdkws.MsgData, error) { +func (db *commonMsgDatabase) GetMsgBySeqsRange(ctx context.Context, userID string, conversationID string, begin, end, num, userMaxSeq int64) (int64, int64, []*sdkws.MsgData, error) { userMinSeq, err := db.cache.GetConversationUserMinSeq(ctx, conversationID, userID) if err != nil && errs.Unwrap(err) != redis.Nil { return 0, 0, nil, err @@ -614,18 +429,7 @@ func (db *commonMsgDatabase) GetMsgBySeqsRange( if err != nil && errs.Unwrap(err) != redis.Nil { return 0, 0, nil, err } - log.ZDebug( - ctx, - "GetMsgBySeqsRange", - "userMinSeq", - userMinSeq, - "conMinSeq", - minSeq, - "conMaxSeq", - maxSeq, - "userMaxSeq", - userMaxSeq, - ) + log.ZDebug(ctx, "GetMsgBySeqsRange", "userMinSeq", userMinSeq, "conMinSeq", minSeq, "conMaxSeq", maxSeq, "userMaxSeq", userMaxSeq) if userMaxSeq != 0 { if userMaxSeq < maxSeq { maxSeq = userMaxSeq @@ -675,18 +479,7 @@ func (db *commonMsgDatabase) GetMsgBySeqsRange( cacheDelNum += 1 } } - log.ZDebug( - ctx, - "get delSeqs from redis", - "delSeqs", - delSeqs, - "userID", - userID, - "conversationID", - conversationID, - "cacheDelNum", - cacheDelNum, - ) + log.ZDebug(ctx, "get delSeqs from redis", "delSeqs", delSeqs, "userID", userID, "conversationID", conversationID, "cacheDelNum", cacheDelNum) var reGetSeqsCache []int64 for i := 1; i <= cacheDelNum; { newSeq := newBegin - int64(i) @@ -706,15 +499,7 @@ func (db *commonMsgDatabase) GetMsgBySeqsRange( if err != nil { if err != redis.Nil { prome.Add(prome.MsgPullFromRedisFailedCounter, len(failedSeqs2)) - log.ZError( - ctx, - "get message from redis exception", - err, - "conversationID", - conversationID, - "seqs", - reGetSeqsCache, - ) + log.ZError(ctx, "get message from redis exception", err, "conversationID", conversationID, "seqs", reGetSeqsCache) } } failedSeqs = append(failedSeqs, failedSeqs2...) @@ -740,12 +525,7 @@ func (db *commonMsgDatabase) GetMsgBySeqsRange( return minSeq, maxSeq, successMsgs, nil } -func (db *commonMsgDatabase) GetMsgBySeqs( - ctx context.Context, - userID string, - conversationID string, - seqs []int64, -) (int64, int64, []*sdkws.MsgData, error) { +func (db *commonMsgDatabase) GetMsgBySeqs(ctx context.Context, userID string, conversationID string, seqs []int64) (int64, int64, []*sdkws.MsgData, error) { userMinSeq, err := db.cache.GetConversationUserMinSeq(ctx, conversationID, userID) if err != nil && errs.Unwrap(err) != redis.Nil { return 0, 0, nil, err @@ -771,33 +551,10 @@ func (db *commonMsgDatabase) GetMsgBySeqs( if err != nil { if err != redis.Nil { prome.Add(prome.MsgPullFromRedisFailedCounter, len(failedSeqs)) - log.ZError( - ctx, - "get message from redis exception", - err, - "failedSeqs", - failedSeqs, - "conversationID", - conversationID, - ) + log.ZError(ctx, "get message from redis exception", err, "failedSeqs", failedSeqs, "conversationID", conversationID) } } - log.ZInfo( - ctx, - "db.cache.GetMessagesBySeq", - "userID", - userID, - "conversationID", - conversationID, - "seqs", - seqs, - "successMsgs", - len(successMsgs), - "failedSeqs", - failedSeqs, - "conversationID", - conversationID, - ) + log.ZInfo(ctx, "db.cache.GetMessagesBySeq", "userID", userID, "conversationID", conversationID, "seqs", seqs, "successMsgs", len(successMsgs), "failedSeqs", failedSeqs, "conversationID", conversationID) prome.Add(prome.MsgPullFromRedisSuccessCounter, len(successMsgs)) if len(failedSeqs) > 0 { mongoMsgs, err := db.getMsgBySeqs(ctx, userID, conversationID, failedSeqs) @@ -811,11 +568,7 @@ func (db *commonMsgDatabase) GetMsgBySeqs( return minSeq, maxSeq, successMsgs, nil } -func (db *commonMsgDatabase) DeleteConversationMsgsAndSetMinSeq( - ctx context.Context, - conversationID string, - remainTime int64, -) error { +func (db *commonMsgDatabase) DeleteConversationMsgsAndSetMinSeq(ctx context.Context, conversationID string, remainTime int64) error { var delStruct delMsgRecursionStruct var skip int64 minSeq, err := db.deleteMsgRecursion(ctx, conversationID, skip, &delStruct, remainTime) @@ -835,6 +588,49 @@ func (db *commonMsgDatabase) DeleteConversationMsgsAndSetMinSeq( return db.cache.SetMinSeq(ctx, conversationID, minSeq) } +func (db *commonMsgDatabase) UserMsgsDestruct(ctx context.Context, userID string, conversationID string, destructTime int64, lastMsgDestructTime time.Time) (seqs []int64, err error) { + var index int64 + for { + // from oldest 2 newest + msgDocModel, err := db.msgDocDatabase.GetMsgDocModelByIndex(ctx, conversationID, index, 1) + if err != nil || msgDocModel.DocID == "" { + if err != nil { + if err == unrelation.ErrMsgListNotExist { + log.ZDebug(ctx, "deleteMsgRecursion finished", "conversationID", conversationID, "userID", userID, "index", index) + } else { + log.ZError(ctx, "deleteMsgRecursion GetUserMsgListByIndex failed", err, "conversationID", conversationID, "index", index) + } + } + // 获取报错,或者获取不到了,物理删除并且返回seq delMongoMsgsPhysical(delStruct.delDocIDList), 结束递归 + break + } + index++ + //&& msgDocModel.Msg[0].Msg.SendTime > lastMsgDestructTime.UnixMilli() + if len(msgDocModel.Msg) > 0 { + for _, msg := range msgDocModel.Msg { + if msg != nil && msg.Msg != nil && msg.Msg.SendTime+destructTime*1000 <= time.Now().UnixMilli() { + if msg.Msg.SendTime > lastMsgDestructTime.UnixMilli() && !utils.Contain(userID, msg.DelList...) { + seqs = append(seqs, msg.Msg.Seq) + } + } else { + log.ZDebug(ctx, "deleteMsgRecursion finished", "conversationID", conversationID, "userID", userID, "index", index) + break + } + + } + } + } + + log.ZDebug(ctx, "UserMsgsDestruct", "conversationID", conversationID, "userID", userID, "seqs", seqs) + if len(seqs) > 0 { + latestSeq := seqs[len(seqs)-1] + if err := db.cache.SetConversationUserMinSeq(ctx, conversationID, userID, latestSeq); err != nil { + return nil, err + } + } + return seqs, nil +} + // this is struct for recursion type delMsgRecursionStruct struct { minSeq int64 @@ -849,26 +645,13 @@ func (d *delMsgRecursionStruct) getSetMinSeq() int64 { // seq 70 // set minSeq 21 // recursion 删除list并且返回设置的最小seq -func (db *commonMsgDatabase) deleteMsgRecursion( - ctx context.Context, - conversationID string, - index int64, - delStruct *delMsgRecursionStruct, - remainTime int64, -) (int64, error) { +func (db *commonMsgDatabase) deleteMsgRecursion(ctx context.Context, conversationID string, index int64, delStruct *delMsgRecursionStruct, remainTime int64) (int64, error) { // find from oldest list msgDocModel, err := db.msgDocDatabase.GetMsgDocModelByIndex(ctx, conversationID, index, 1) if err != nil || msgDocModel.DocID == "" { if err != nil { if err == unrelation.ErrMsgListNotExist { - log.ZDebug( - ctx, - "deleteMsgRecursion ErrMsgListNotExist", - "conversationID", - conversationID, - "index:", - index, - ) + log.ZDebug(ctx, "deleteMsgRecursion ErrMsgListNotExist", "conversationID", conversationID, "index:", index) } else { log.ZError(ctx, "deleteMsgRecursion GetUserMsgListByIndex failed", err, "conversationID", conversationID, "index", index) } @@ -880,23 +663,11 @@ func (db *commonMsgDatabase) deleteMsgRecursion( } return delStruct.getSetMinSeq() + 1, nil } - log.ZDebug( - ctx, - "doc info", - "conversationID", - conversationID, - "index", - index, - "docID", - msgDocModel.DocID, - "len", - len(msgDocModel.Msg), - ) + log.ZDebug(ctx, "doc info", "conversationID", conversationID, "index", index, "docID", msgDocModel.DocID, "len", len(msgDocModel.Msg)) if int64(len(msgDocModel.Msg)) > db.msg.GetSingleGocMsgNum() { log.ZWarn(ctx, "msgs too large", nil, "lenth", len(msgDocModel.Msg), "docID:", msgDocModel.DocID) } - if msgDocModel.IsFull() && - msgDocModel.Msg[len(msgDocModel.Msg)-1].Msg.SendTime+(remainTime*1000) < utils.GetCurrentTimestampByMill() { + if msgDocModel.IsFull() && msgDocModel.Msg[len(msgDocModel.Msg)-1].Msg.SendTime+(remainTime*1000) < utils.GetCurrentTimestampByMill() { log.ZDebug(ctx, "doc is full and all msg is expired", "docID", msgDocModel.DocID) delStruct.delDocIDs = append(delStruct.delDocIDs, msgDocModel.DocID) delStruct.minSeq = msgDocModel.Msg[len(msgDocModel.Msg)-1].Msg.Seq @@ -933,11 +704,7 @@ func (db *commonMsgDatabase) deleteMsgRecursion( return seq, err } -func (db *commonMsgDatabase) DeleteMsgsPhysicalBySeqs( - ctx context.Context, - conversationID string, - allSeqs []int64, -) error { +func (db *commonMsgDatabase) DeleteMsgsPhysicalBySeqs(ctx context.Context, conversationID string, allSeqs []int64) error { if err := db.cache.DeleteMessages(ctx, conversationID, allSeqs); err != nil { return err } @@ -953,12 +720,7 @@ func (db *commonMsgDatabase) DeleteMsgsPhysicalBySeqs( return nil } -func (db *commonMsgDatabase) DeleteUserMsgsBySeqs( - ctx context.Context, - userID string, - conversationID string, - seqs []int64, -) error { +func (db *commonMsgDatabase) DeleteUserMsgsBySeqs(ctx context.Context, userID string, conversationID string, seqs []int64) error { cachedMsgs, _, err := db.cache.GetMessagesBySeq(ctx, conversationID, seqs) if err != nil && errs.Unwrap(err) != redis.Nil { log.ZWarn(ctx, "DeleteUserMsgsBySeqs", err, "conversationID", conversationID, "seqs", seqs) @@ -1027,70 +789,31 @@ func (db *commonMsgDatabase) GetMinSeqs(ctx context.Context, conversationIDs []s func (db *commonMsgDatabase) GetMinSeq(ctx context.Context, conversationID string) (int64, error) { return db.cache.GetMinSeq(ctx, conversationID) } - -func (db *commonMsgDatabase) GetConversationUserMinSeq( - ctx context.Context, - conversationID string, - userID string, -) (int64, error) { +func (db *commonMsgDatabase) GetConversationUserMinSeq(ctx context.Context, conversationID string, userID string) (int64, error) { return db.cache.GetConversationUserMinSeq(ctx, conversationID, userID) } - -func (db *commonMsgDatabase) GetConversationUserMinSeqs( - ctx context.Context, - conversationID string, - userIDs []string, -) (map[string]int64, error) { +func (db *commonMsgDatabase) GetConversationUserMinSeqs(ctx context.Context, conversationID string, userIDs []string) (map[string]int64, error) { return db.cache.GetConversationUserMinSeqs(ctx, conversationID, userIDs) } - -func (db *commonMsgDatabase) SetConversationUserMinSeq( - ctx context.Context, - conversationID string, - userID string, - minSeq int64, -) error { +func (db *commonMsgDatabase) SetConversationUserMinSeq(ctx context.Context, conversationID string, userID string, minSeq int64) error { return db.cache.SetConversationUserMinSeq(ctx, conversationID, userID, minSeq) } - -func (db *commonMsgDatabase) SetConversationUserMinSeqs( - ctx context.Context, - conversationID string, - seqs map[string]int64, -) (err error) { +func (db *commonMsgDatabase) SetConversationUserMinSeqs(ctx context.Context, conversationID string, seqs map[string]int64) (err error) { return db.cache.SetConversationUserMinSeqs(ctx, conversationID, seqs) } -func (db *commonMsgDatabase) SetUserConversationsMinSeqs( - ctx context.Context, - userID string, - seqs map[string]int64, -) error { +func (db *commonMsgDatabase) SetUserConversationsMinSeqs(ctx context.Context, userID string, seqs map[string]int64) error { return db.cache.SetUserConversationsMinSeqs(ctx, userID, seqs) } -func (db *commonMsgDatabase) UserSetHasReadSeqs( - ctx context.Context, - userID string, - hasReadSeqs map[string]int64, -) error { +func (db *commonMsgDatabase) UserSetHasReadSeqs(ctx context.Context, userID string, hasReadSeqs map[string]int64) error { return db.cache.UserSetHasReadSeqs(ctx, userID, hasReadSeqs) } -func (db *commonMsgDatabase) SetHasReadSeq( - ctx context.Context, - userID string, - conversationID string, - hasReadSeq int64, -) error { +func (db *commonMsgDatabase) SetHasReadSeq(ctx context.Context, userID string, conversationID string, hasReadSeq int64) error { return db.cache.SetHasReadSeq(ctx, userID, conversationID, hasReadSeq) } - -func (db *commonMsgDatabase) GetHasReadSeqs( - ctx context.Context, - userID string, - conversationIDs []string, -) (map[string]int64, error) { +func (db *commonMsgDatabase) GetHasReadSeqs(ctx context.Context, userID string, conversationIDs []string) (map[string]int64, error) { return db.cache.GetHasReadSeqs(ctx, userID, conversationIDs) } @@ -1106,10 +829,7 @@ func (db *commonMsgDatabase) GetSendMsgStatus(ctx context.Context, id string) (i return db.cache.GetSendMsgStatus(ctx, id) } -func (db *commonMsgDatabase) GetConversationMinMaxSeqInMongoAndCache( - ctx context.Context, - conversationID string, -) (minSeqMongo, maxSeqMongo, minSeqCache, maxSeqCache int64, err error) { +func (db *commonMsgDatabase) GetConversationMinMaxSeqInMongoAndCache(ctx context.Context, conversationID string) (minSeqMongo, maxSeqMongo, minSeqCache, maxSeqCache int64, err error) { minSeqMongo, maxSeqMongo, err = db.GetMinMaxSeqMongo(ctx, conversationID) if err != nil { return @@ -1125,17 +845,11 @@ func (db *commonMsgDatabase) GetConversationMinMaxSeqInMongoAndCache( return } -func (db *commonMsgDatabase) GetMongoMaxAndMinSeq( - ctx context.Context, - conversationID string, -) (maxSeq, minSeq int64, err error) { +func (db *commonMsgDatabase) GetMongoMaxAndMinSeq(ctx context.Context, conversationID string) (minSeqMongo, maxSeqMongo int64, err error) { return db.GetMinMaxSeqMongo(ctx, conversationID) } -func (db *commonMsgDatabase) GetMinMaxSeqMongo( - ctx context.Context, - conversationID string, -) (minSeqMongo, maxSeqMongo int64, err error) { +func (db *commonMsgDatabase) GetMinMaxSeqMongo(ctx context.Context, conversationID string) (minSeqMongo, maxSeqMongo int64, err error) { oldestMsgMongo, err := db.msgDocDatabase.GetOldestMsg(ctx, conversationID) if err != nil { return @@ -1149,124 +863,10 @@ func (db *commonMsgDatabase) GetMinMaxSeqMongo( return } -func (db *commonMsgDatabase) JudgeMessageReactionExist( - ctx context.Context, - clientMsgID string, - sessionType int32, -) (bool, error) { - return db.cache.JudgeMessageReactionExist(ctx, clientMsgID, sessionType) -} - -func (db *commonMsgDatabase) SetMessageTypeKeyValue( - ctx context.Context, - clientMsgID string, - sessionType int32, - typeKey, value string, -) error { - return db.cache.SetMessageTypeKeyValue(ctx, clientMsgID, sessionType, typeKey, value) -} - -func (db *commonMsgDatabase) SetMessageReactionExpire( - ctx context.Context, - clientMsgID string, - sessionType int32, - expiration time.Duration, -) (bool, error) { - return db.cache.SetMessageReactionExpire(ctx, clientMsgID, sessionType, expiration) -} - -func (db *commonMsgDatabase) GetMessageTypeKeyValue( - ctx context.Context, - clientMsgID string, - sessionType int32, - typeKey string, -) (string, error) { - return db.cache.GetMessageTypeKeyValue(ctx, clientMsgID, sessionType, typeKey) -} - -func (db *commonMsgDatabase) GetOneMessageAllReactionList( - ctx context.Context, - clientMsgID string, - sessionType int32, -) (map[string]string, error) { - return db.cache.GetOneMessageAllReactionList(ctx, clientMsgID, sessionType) -} - -func (db *commonMsgDatabase) DeleteOneMessageKey( - ctx context.Context, - clientMsgID string, - sessionType int32, - subKey string, -) error { - return db.cache.DeleteOneMessageKey(ctx, clientMsgID, sessionType, subKey) -} - -func (db *commonMsgDatabase) InsertOrUpdateReactionExtendMsgSet( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - msgFirstModifyTime int64, - reactionExtensions map[string]*sdkws.KeyValue, -) error { - return db.extendMsgDatabase.InsertOrUpdateReactionExtendMsgSet( - ctx, - conversationID, - sessionType, - clientMsgID, - msgFirstModifyTime, - db.extendMsgSetModel.Pb2Model(reactionExtensions), - ) -} - -func (db *commonMsgDatabase) GetExtendMsg( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - maxMsgUpdateTime int64, -) (*pbMsg.ExtendMsg, error) { - extendMsgSet, err := db.extendMsgDatabase.GetExtendMsgSet(ctx, conversationID, sessionType, maxMsgUpdateTime) - if err != nil { - return nil, err - } - extendMsg, ok := extendMsgSet.ExtendMsgs[clientMsgID] - if !ok { - return nil, errs.ErrRecordNotFound.Wrap(fmt.Sprintf("cant find client msg id: %s", clientMsgID)) - } - reactionExtensionList := make(map[string]*pbMsg.KeyValueResp) - for key, model := range extendMsg.ReactionExtensionList { - reactionExtensionList[key] = &pbMsg.KeyValueResp{ - KeyValue: &sdkws.KeyValue{ - TypeKey: model.TypeKey, - Value: model.Value, - LatestUpdateTime: model.LatestUpdateTime, - }, - } - } - return &pbMsg.ExtendMsg{ - ReactionExtensions: reactionExtensionList, - ClientMsgID: extendMsg.ClientMsgID, - MsgFirstModifyTime: extendMsg.MsgFirstModifyTime, - AttachedInfo: extendMsg.AttachedInfo, - Ex: extendMsg.Ex, - }, nil +func (db *commonMsgDatabase) RangeUserSendCount(ctx context.Context, start time.Time, end time.Time, group bool, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, users []*unRelationTb.UserCount, dateCount map[string]int64, err error) { + return db.msgDocDatabase.RangeUserSendCount(ctx, start, end, group, ase, pageNumber, showNumber) } -func (db *commonMsgDatabase) DeleteReactionExtendMsgSet( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - msgFirstModifyTime int64, - reactionExtensions map[string]*sdkws.KeyValue, -) error { - return db.extendMsgDatabase.DeleteReactionExtendMsgSet( - ctx, - conversationID, - sessionType, - clientMsgID, - msgFirstModifyTime, - db.extendMsgSetModel.Pb2Model(reactionExtensions), - ) +func (db *commonMsgDatabase) RangeGroupSendCount(ctx context.Context, start time.Time, end time.Time, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, groups []*unRelationTb.GroupCount, dateCount map[string]int64, err error) { + return db.msgDocDatabase.RangeGroupSendCount(ctx, start, end, ase, pageNumber, showNumber) } diff --git a/pkg/common/db/controller/s3.go b/pkg/common/db/controller/s3.go new file mode 100644 index 000000000..f192dadc5 --- /dev/null +++ b/pkg/common/db/controller/s3.go @@ -0,0 +1,76 @@ +package controller + +import "C" +import ( + "context" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3/cont" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation" + "path/filepath" + "time" +) + +type S3Database interface { + PartLimit() *s3.PartLimit + PartSize(ctx context.Context, size int64) (int64, error) + AuthSign(ctx context.Context, uploadID string, partNumbers []int) (*s3.AuthSignResult, error) + InitiateMultipartUpload(ctx context.Context, hash string, size int64, expire time.Duration, maxParts int) (*cont.InitiateUploadResult, error) + CompleteMultipartUpload(ctx context.Context, uploadID string, parts []string) (*cont.UploadResult, error) + AccessURL(ctx context.Context, name string, expire time.Duration) (time.Time, string, error) + SetObject(ctx context.Context, info *relation.ObjectModel) error +} + +func NewS3Database(s3 s3.Interface, obj relation.ObjectInfoModelInterface) S3Database { + return &s3Database{ + s3: cont.New(s3), + obj: obj, + } +} + +type s3Database struct { + s3 *cont.Controller + obj relation.ObjectInfoModelInterface +} + +func (s *s3Database) PartSize(ctx context.Context, size int64) (int64, error) { + return s.s3.PartSize(ctx, size) +} + +func (s *s3Database) PartLimit() *s3.PartLimit { + return s.s3.PartLimit() +} + +func (s *s3Database) AuthSign(ctx context.Context, uploadID string, partNumbers []int) (*s3.AuthSignResult, error) { + return s.s3.AuthSign(ctx, uploadID, partNumbers) +} + +func (s *s3Database) InitiateMultipartUpload(ctx context.Context, hash string, size int64, expire time.Duration, maxParts int) (*cont.InitiateUploadResult, error) { + return s.s3.InitiateUpload(ctx, hash, size, expire, maxParts) +} + +func (s *s3Database) CompleteMultipartUpload(ctx context.Context, uploadID string, parts []string) (*cont.UploadResult, error) { + return s.s3.CompleteUpload(ctx, uploadID, parts) +} + +func (s *s3Database) SetObject(ctx context.Context, info *relation.ObjectModel) error { + return s.obj.SetObject(ctx, info) +} + +func (s *s3Database) AccessURL(ctx context.Context, name string, expire time.Duration) (time.Time, string, error) { + obj, err := s.obj.Take(ctx, name) + if err != nil { + return time.Time{}, "", err + } + opt := &s3.AccessURLOption{ + ContentType: obj.ContentType, + } + if filename := filepath.Base(obj.Name); filename != "" { + opt.ContentDisposition = `attachment; filename=` + filename + } + expireTime := time.Now().Add(expire) + rawURL, err := s.s3.AccessURL(ctx, obj.Key, expire, opt) + if err != nil { + return time.Time{}, "", err + } + return expireTime, rawURL, nil +} diff --git a/pkg/common/db/controller/storage.go b/pkg/common/db/controller/storage.go deleted file mode 100644 index c383eb8ec..000000000 --- a/pkg/common/db/controller/storage.go +++ /dev/null @@ -1,567 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 controller - -import ( - "bytes" - "context" - "crypto/md5" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "io" - "net/url" - "path" - "strconv" - "time" - - "github.com/google/uuid" - - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/obj" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" - "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" - "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third" - "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" -) - -const ( - hashPrefix = "hash" - tempPrefix = "temp" - fragmentPrefix = "fragment_" - urlsName = "urls.json" -) - -type S3Database interface { - ApplyPut(ctx context.Context, req *third.ApplyPutReq) (*third.ApplyPutResp, error) - GetPut(ctx context.Context, req *third.GetPutReq) (*third.GetPutResp, error) - ConfirmPut(ctx context.Context, req *third.ConfirmPutReq) (*third.ConfirmPutResp, error) - GetUrl(ctx context.Context, req *third.GetUrlReq) (*third.GetUrlResp, error) - GetHashInfo(ctx context.Context, req *third.GetHashInfoReq) (*third.GetHashInfoResp, error) - CleanExpirationObject(ctx context.Context, t time.Time) -} - -func NewS3Database( - obj obj.Interface, - hash relation.ObjectHashModelInterface, - info relation.ObjectInfoModelInterface, - put relation.ObjectPutModelInterface, - url *url.URL, -) S3Database { - return &s3Database{ - url: url, - obj: obj, - hash: hash, - info: info, - put: put, - } -} - -type s3Database struct { - url *url.URL - obj obj.Interface - hash relation.ObjectHashModelInterface - info relation.ObjectInfoModelInterface - put relation.ObjectPutModelInterface -} - -// today 今天的日期 -func (c *s3Database) today() string { - return time.Now().Format("20060102") -} - -// fragmentName 根据序号生成文件名 -func (c *s3Database) fragmentName(index int) string { - return fragmentPrefix + strconv.Itoa(index+1) -} - -// getFragmentNum 获取分片大小和分片数量 -func (c *s3Database) getFragmentNum(fragmentSize int64, objectSize int64) (int64, int) { - if size := c.obj.MinFragmentSize(); fragmentSize < size { - fragmentSize = size - } - if fragmentSize <= 0 || objectSize <= fragmentSize { - return objectSize, 1 - } else { - num := int(objectSize / fragmentSize) - if objectSize%fragmentSize > 0 { - num++ - } - if n := c.obj.MaxFragmentNum(); num > n { - num = n - } - return fragmentSize, num - } -} - -func (c *s3Database) CheckHash(hash string) error { - val, err := hex.DecodeString(hash) - if err != nil { - return err - } - if len(val) != md5.Size { - return errs.ErrArgs.Wrap("invalid hash") - } - return nil -} - -func (c *s3Database) urlName(name string) string { - u := url.URL{ - Scheme: c.url.Scheme, - Opaque: c.url.Opaque, - User: c.url.User, - Host: c.url.Host, - Path: c.url.Path, - RawPath: c.url.RawPath, - ForceQuery: c.url.ForceQuery, - RawQuery: c.url.RawQuery, - Fragment: c.url.Fragment, - RawFragment: c.url.RawFragment, - } - v := make(url.Values, 1) - v.Set("name", name) - u.RawQuery = v.Encode() - return u.String() -} - -func (c *s3Database) UUID() string { - return uuid.New().String() -} - -func (c *s3Database) HashName(hash string) string { - return path.Join(hashPrefix, hash+"_"+c.today()+"_"+c.UUID()) -} - -func (c *s3Database) isNotFound(err error) bool { - return relation.IsNotFound(err) -} - -func (c *s3Database) ApplyPut(ctx context.Context, req *third.ApplyPutReq) (*third.ApplyPutResp, error) { - if err := c.CheckHash(req.Hash); err != nil { - return nil, err - } - if err := c.obj.CheckName(req.Name); err != nil { - return nil, err - } - if req.ValidTime != 0 && req.ValidTime <= time.Now().UnixMilli() { - return nil, errors.New("invalid ValidTime") - } - var expirationTime *time.Time - if req.ValidTime != 0 { - expirationTime = utils.ToPtr(time.UnixMilli(req.ValidTime)) - } - if hash, err := c.hash.Take(ctx, req.Hash, c.obj.Name()); err == nil { - o := relation.ObjectInfoModel{ - Name: req.Name, - Hash: hash.Hash, - ValidTime: expirationTime, - ContentType: req.ContentType, - CreateTime: time.Now(), - } - if err := c.info.SetObject(ctx, &o); err != nil { - return nil, err - } - return &third.ApplyPutResp{Url: c.urlName(o.Name)}, nil // 服务器已存在 - } else if !c.isNotFound(err) { - return nil, err - } - // 新上传 - var fragmentNum int - const effective = time.Hour * 24 * 2 - req.FragmentSize, fragmentNum = c.getFragmentNum(req.FragmentSize, req.Size) - put := relation.ObjectPutModel{ - PutID: req.PutID, - Hash: req.Hash, - Name: req.Name, - ObjectSize: req.Size, - ContentType: req.ContentType, - FragmentSize: req.FragmentSize, - ValidTime: expirationTime, - EffectiveTime: time.Now().Add(effective), - } - if put.PutID == "" { - put.PutID = c.UUID() - } - if v, err := c.put.Take(ctx, put.PutID); err == nil { - now := time.Now().UnixMilli() - if v.EffectiveTime.UnixMilli() <= now { - if err := c.put.DelPut(ctx, []string{v.PutID}); err != nil { - return nil, err - } - } else { - return nil, errs.ErrDuplicateKey.Wrap(fmt.Sprintf("duplicate put id %s", put.PutID)) - } - } else if !c.isNotFound(err) { - return nil, err - } - put.Path = path.Join(tempPrefix, c.today(), req.Hash, put.PutID) - putURLs := make([]string, 0, fragmentNum) - for i := 0; i < fragmentNum; i++ { - url, err := c.obj.PresignedPutURL(ctx, &obj.ApplyPutArgs{ - Bucket: c.obj.TempBucket(), - Name: path.Join(put.Path, c.fragmentName(i)), - Effective: effective, - MaxObjectSize: req.FragmentSize, - }) - if err != nil { - return nil, err - } - putURLs = append(putURLs, url) - } - urlsJsonData, err := json.Marshal(putURLs) - if err != nil { - return nil, err - } - t := md5.Sum(urlsJsonData) - put.PutURLsHash = hex.EncodeToString(t[:]) - _, err = c.obj.PutObject( - ctx, - &obj.BucketObject{Bucket: c.obj.TempBucket(), Name: path.Join(put.Path, urlsName)}, - bytes.NewReader(urlsJsonData), - int64(len(urlsJsonData)), - ) - if err != nil { - return nil, err - } - put.CreateTime = time.Now() - if err := c.put.Create(ctx, []*relation.ObjectPutModel{&put}); err != nil { - return nil, err - } - return &third.ApplyPutResp{ - PutID: put.PutID, - FragmentSize: put.FragmentSize, - PutURLs: putURLs, - ValidTime: put.EffectiveTime.UnixMilli(), - }, nil -} - -func (c *s3Database) GetPut(ctx context.Context, req *third.GetPutReq) (*third.GetPutResp, error) { - up, err := c.put.Take(ctx, req.PutID) - if err != nil { - return nil, err - } - reader, err := c.obj.GetObject( - ctx, - &obj.BucketObject{Bucket: c.obj.TempBucket(), Name: path.Join(up.Path, urlsName)}, - ) - if err != nil { - return nil, err - } - urlsData, err := io.ReadAll(reader) - if err != nil { - return nil, err - } - t := md5.Sum(urlsData) - if h := hex.EncodeToString(t[:]); h != up.PutURLsHash { - return nil, fmt.Errorf("invalid put urls hash %s %s", h, up.PutURLsHash) - } - var urls []string - if err := json.Unmarshal(urlsData, &urls); err != nil { - return nil, err - } - _, fragmentNum := c.getFragmentNum(up.FragmentSize, up.ObjectSize) - if len(urls) != fragmentNum { - return nil, fmt.Errorf("invalid urls length %d fragment %d", len(urls), fragmentNum) - } - fragments := make([]*third.GetPutFragment, fragmentNum) - for i := 0; i < fragmentNum; i++ { - name := path.Join(up.Path, c.fragmentName(i)) - o, err := c.obj.GetObjectInfo(ctx, &obj.BucketObject{ - Bucket: c.obj.TempBucket(), - Name: name, - }) - if err != nil { - if c.obj.IsNotFound(err) { - fragments[i] = &third.GetPutFragment{Url: urls[i]} - continue - } - return nil, err - } - fragments[i] = &third.GetPutFragment{Size: o.Size, Hash: o.Hash, Url: urls[i]} - } - var validTime int64 - if up.ValidTime != nil { - validTime = up.ValidTime.UnixMilli() - } - return &third.GetPutResp{ - FragmentSize: up.FragmentSize, - Size: up.ObjectSize, - Name: up.Name, - Hash: up.Hash, - Fragments: fragments, - PutURLsHash: up.PutURLsHash, - ContentType: up.ContentType, - ValidTime: validTime, - }, nil -} - -func (c *s3Database) ConfirmPut(ctx context.Context, req *third.ConfirmPutReq) (_ *third.ConfirmPutResp, _err error) { - put, err := c.put.Take(ctx, req.PutID) - if err != nil { - return nil, err - } - _, pack := c.getFragmentNum(put.FragmentSize, put.ObjectSize) - defer func() { - if _err == nil { - // 清理上传的碎片 - err := c.obj.DeleteObject(ctx, &obj.BucketObject{Bucket: c.obj.TempBucket(), Name: put.Path}) - if err != nil { - log.ZError(ctx, "deleteObject failed", err, "Bucket", c.obj.TempBucket(), "Path", put.Path) - } - } - }() - now := time.Now().UnixMilli() - if put.EffectiveTime.UnixMilli() < now { - return nil, errs.ErrFileUploadedExpired.Wrap("put expired") - } - if put.ValidTime != nil && put.ValidTime.UnixMilli() < now { - return nil, errs.ErrFileUploadedExpired.Wrap("object expired") - } - if hash, err := c.hash.Take(ctx, put.Hash, c.obj.Name()); err == nil { - o := relation.ObjectInfoModel{ - Name: put.Name, - Hash: hash.Hash, - ValidTime: put.ValidTime, - ContentType: put.ContentType, - CreateTime: time.Now(), - } - if err := c.info.SetObject(ctx, &o); err != nil { - return nil, err - } - defer func() { - err := c.obj.DeleteObject(ctx, &obj.BucketObject{ - Bucket: c.obj.TempBucket(), - Name: put.Path, - }) - if err != nil { - log.ZError(ctx, "DeleteObject", err, "Bucket", c.obj.TempBucket(), "Path", put.Path) - } - }() - // 服务端已存在 - return &third.ConfirmPutResp{ - Url: c.urlName(o.Name), - }, nil - } else if !c.isNotFound(err) { - return nil, err - } - src := make([]obj.BucketObject, pack) - for i := 0; i < pack; i++ { - name := path.Join(put.Path, c.fragmentName(i)) - o, err := c.obj.GetObjectInfo(ctx, &obj.BucketObject{ - Bucket: c.obj.TempBucket(), - Name: name, - }) - if err != nil { - return nil, err - } - if i+1 == pack { // 最后一个 - size := put.ObjectSize - put.FragmentSize*int64(i) - if size != o.Size { - return nil, fmt.Errorf("last fragment %d size %d not equal to %d hash %s", i, o.Size, size, o.Hash) - } - } else { - if o.Size != put.FragmentSize { - return nil, fmt.Errorf("fragment %d size %d not equal to %d hash %s", i, o.Size, put.FragmentSize, o.Hash) - } - } - src[i] = obj.BucketObject{ - Bucket: c.obj.TempBucket(), - Name: name, - } - } - dst := &obj.BucketObject{ - Bucket: c.obj.DataBucket(), - Name: c.HashName(put.Hash), - } - if len(src) == 1 { // 未分片直接触发copy - // 检查数据完整性,避免脏数据 - o, err := c.obj.GetObjectInfo(ctx, &src[0]) - if err != nil { - return nil, err - } - if put.ObjectSize != o.Size { - return nil, fmt.Errorf("size mismatching should %d reality %d", put.ObjectSize, o.Size) - } - if put.Hash != o.Hash { - return nil, fmt.Errorf("hash mismatching should %s reality %s", put.Hash, o.Hash) - } - if err := c.obj.CopyObject(ctx, &src[0], dst); err != nil { - return nil, err - } - } else { - tempBucket := &obj.BucketObject{ - Bucket: c.obj.TempBucket(), - Name: path.Join(put.Path, "merge_"+c.UUID()), - } - defer func() { // 清理合成的文件 - if err := c.obj.DeleteObject(ctx, tempBucket); err != nil { - log.ZError(ctx, "DeleteObject", err, "Bucket", tempBucket.Bucket, "Path", tempBucket.Name) - } - }() - err := c.obj.ComposeObject(ctx, src, tempBucket) - if err != nil { - return nil, err - } - info, err := c.obj.GetObjectInfo(ctx, tempBucket) - if err != nil { - return nil, err - } - if put.ObjectSize != info.Size { - return nil, fmt.Errorf("size mismatch should %d reality %d", put.ObjectSize, info.Size) - } - if put.Hash != info.Hash { - return nil, fmt.Errorf("hash mismatch should %s reality %s", put.Hash, info.Hash) - } - if err := c.obj.CopyObject(ctx, tempBucket, dst); err != nil { - return nil, err - } - } - h := &relation.ObjectHashModel{ - Hash: put.Hash, - Engine: c.obj.Name(), - Size: put.ObjectSize, - Bucket: c.obj.DataBucket(), - Name: dst.Name, - CreateTime: time.Now(), - } - if err := c.hash.Create(ctx, []*relation.ObjectHashModel{h}); err != nil { - return nil, err - } - o := &relation.ObjectInfoModel{ - Name: put.Name, - Hash: put.Hash, - ContentType: put.ContentType, - ValidTime: put.ValidTime, - CreateTime: time.Now(), - } - if err := c.info.SetObject(ctx, o); err != nil { - return nil, err - } - if err := c.put.DelPut(ctx, []string{put.PutID}); err != nil { - log.ZError(ctx, "DelPut", err, "PutID", put.PutID) - } - return &third.ConfirmPutResp{ - Url: c.urlName(o.Name), - }, nil -} - -func (c *s3Database) GetUrl(ctx context.Context, req *third.GetUrlReq) (*third.GetUrlResp, error) { - info, err := c.info.Take(ctx, req.Name) - if err != nil { - return nil, err - } - if info.ValidTime != nil && info.ValidTime.Before(time.Now()) { - return nil, errs.ErrRecordNotFound.Wrap("object expired") - } - hash, err := c.hash.Take(ctx, info.Hash, c.obj.Name()) - if err != nil { - return nil, err - } - opt := obj.HeaderOption{ContentType: info.ContentType} - if req.Attachment { - opt.Filename = info.Name - } - u, err := c.obj.PresignedGetURL(ctx, hash.Bucket, hash.Name, time.Duration(req.Expires)*time.Millisecond, &opt) - if err != nil { - return nil, err - } - return &third.GetUrlResp{ - Url: u, - Size: hash.Size, - Hash: hash.Hash, - }, nil -} - -func (c *s3Database) CleanExpirationObject(ctx context.Context, t time.Time) { - // 清理上传产生的临时文件 - c.cleanPutTemp(ctx, t, 10) - // 清理hash引用全过期的文件 - c.cleanExpirationObject(ctx, t) - // 清理没有引用的hash对象 - c.clearNoCitation(ctx, c.obj.Name(), 10) -} - -func (c *s3Database) cleanPutTemp(ctx context.Context, t time.Time, num int) { - for { - puts, err := c.put.FindExpirationPut(ctx, t, num) - if err != nil { - log.ZError(ctx, "FindExpirationPut", err, "Time", t, "Num", num) - return - } - if len(puts) == 0 { - return - } - for _, put := range puts { - err := c.obj.DeleteObject(ctx, &obj.BucketObject{Bucket: c.obj.TempBucket(), Name: put.Path}) - if err != nil { - log.ZError(ctx, "DeleteObject", err, "Bucket", c.obj.TempBucket(), "Path", put.Path) - return - } - } - ids := utils.Slice(puts, func(e *relation.ObjectPutModel) string { return e.PutID }) - err = c.put.DelPut(ctx, ids) - if err != nil { - log.ZError(ctx, "DelPut", err, "PutID", ids) - return - } - } -} - -func (c *s3Database) cleanExpirationObject(ctx context.Context, t time.Time) { - err := c.info.DeleteExpiration(ctx, t) - if err != nil { - log.ZError(ctx, "DeleteExpiration", err, "Time", t) - } -} - -func (c *s3Database) clearNoCitation(ctx context.Context, engine string, limit int) { - for { - list, err := c.hash.DeleteNoCitation(ctx, engine, limit) - if err != nil { - log.ZError(ctx, "DeleteNoCitation", err, "Engine", engine, "Limit", limit) - return - } - if len(list) == 0 { - return - } - var hasErr bool - for _, h := range list { - err := c.obj.DeleteObject(ctx, &obj.BucketObject{Bucket: h.Bucket, Name: h.Name}) - if err != nil { - hasErr = true - log.ZError(ctx, "DeleteObject", err, "Bucket", h.Bucket, "Path", h.Name) - continue - } - } - if hasErr { - return - } - } -} - -func (c *s3Database) GetHashInfo(ctx context.Context, req *third.GetHashInfoReq) (*third.GetHashInfoResp, error) { - if err := c.CheckHash(req.Hash); err != nil { - return nil, err - } - o, err := c.hash.Take(ctx, req.Hash, c.obj.Name()) - if err != nil { - return nil, err - } - return &third.GetHashInfoResp{ - Hash: o.Hash, - Size: o.Size, - }, nil -} diff --git a/pkg/common/db/controller/user.go b/pkg/common/db/controller/user.go index 03224b61e..db725ae60 100644 --- a/pkg/common/db/controller/user.go +++ b/pkg/common/db/controller/user.go @@ -45,7 +45,7 @@ type UserDatabase interface { //函数内部先查询db中是否存在,存在则什么都不做;不存在则插入 InitOnce(ctx context.Context, users []*relation.UserModel) (err error) // 获取用户总数 - CountTotal(ctx context.Context) (int64, error) + CountTotal(ctx context.Context, before *time.Time) (int64, error) // 获取范围内用户增量 CountRangeEverydayTotal(ctx context.Context, start time.Time, end time.Time) (map[string]int64, error) } @@ -151,8 +151,8 @@ func (u *userDatabase) GetAllUserID(ctx context.Context) (userIDs []string, err return u.userDB.GetAllUserID(ctx) } -func (u *userDatabase) CountTotal(ctx context.Context) (count int64, err error) { - return u.userDB.CountTotal(ctx) +func (u *userDatabase) CountTotal(ctx context.Context, before *time.Time) (count int64, err error) { + return u.userDB.CountTotal(ctx, before) } func (u *userDatabase) CountRangeEverydayTotal( diff --git a/pkg/common/db/obj/minio.go b/pkg/common/db/obj/minio.go deleted file mode 100644 index ffd8684c9..000000000 --- a/pkg/common/db/obj/minio.go +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 obj - -import ( - "context" - "errors" - "fmt" - "io" - "net/http" - "net/url" - "time" - - "github.com/minio/minio-go/v7" - "github.com/minio/minio-go/v7/pkg/credentials" - "github.com/minio/minio-go/v7/pkg/s3utils" - - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config" - "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" -) - -func NewMinioInterface() (Interface, error) { - conf := config.Config.Object.Minio - u, err := url.Parse(conf.Endpoint) - if err != nil { - return nil, fmt.Errorf("minio endpoint parse %w", err) - } - if u.Scheme != "http" && u.Scheme != "https" { - return nil, fmt.Errorf("invalid minio endpoint scheme %s", u.Scheme) - } - client, err := minio.New(u.Host, &minio.Options{ - Creds: credentials.NewStaticV4(conf.AccessKeyID, conf.SecretAccessKey, ""), - Secure: u.Scheme == "https", - }) - if err != nil { - return nil, fmt.Errorf("minio new client %w", err) - } - ctx, cancel := context.WithTimeout(context.Background(), time.Second*20) - defer cancel() - initBucket := func(ctx context.Context) error { - for _, bucket := range utils.Distinct([]string{conf.TempBucket, conf.DataBucket}) { - exists, err := client.BucketExists(ctx, bucket) - if err != nil { - return fmt.Errorf("minio bucket %s exists %w", bucket, err) - } - if exists { - continue - } - opt := minio.MakeBucketOptions{ - Region: conf.Location, - ObjectLocking: conf.IsDistributedMod, - } - if err := client.MakeBucket(ctx, bucket, opt); err != nil { - return fmt.Errorf("minio make bucket %s %w", bucket, err) - } - } - return nil - } - if err := initBucket(ctx); err != nil { - fmt.Println("minio init error:", err) - } - return &minioImpl{ - client: client, - tempBucket: conf.TempBucket, - dataBucket: conf.DataBucket, - }, nil -} - -type minioImpl struct { - tempBucket string // 上传桶 - dataBucket string // 永久桶 - urlstr string // 访问地址 - client *minio.Client -} - -func (m *minioImpl) Name() string { - return "minio" -} - -func (m *minioImpl) MinFragmentSize() int64 { - return 1024 * 1024 * 5 // 每个分片最小大小 minio.absMinPartSize -} - -func (m *minioImpl) MaxFragmentNum() int { - return 1000 // 最大分片数量 minio.maxPartsCount -} - -func (m *minioImpl) MinExpirationTime() time.Duration { - return time.Hour * 24 -} - -func (m *minioImpl) TempBucket() string { - return m.tempBucket -} - -func (m *minioImpl) DataBucket() string { - return m.dataBucket -} - -func (m *minioImpl) PresignedGetURL( - ctx context.Context, - bucket string, - name string, - expires time.Duration, - opt *HeaderOption, -) (string, error) { - var reqParams url.Values - if opt != nil { - reqParams = make(url.Values) - if opt.ContentType != "" { - reqParams.Set("response-content-type", opt.ContentType) - } - if opt.Filename != "" { - reqParams.Set("response-content-disposition", "attachment;filename="+opt.Filename) - } - } - u, err := m.client.PresignedGetObject(ctx, bucket, name, expires, reqParams) - if err != nil { - return "", err - } - return u.String(), nil -} - -func (m *minioImpl) PresignedPutURL(ctx context.Context, args *ApplyPutArgs) (string, error) { - if args.Effective <= 0 { - return "", errors.New("EffectiveTime <= 0") - } - _, err := m.GetObjectInfo(ctx, &BucketObject{ - Bucket: m.tempBucket, - Name: args.Name, - }) - if err == nil { - return "", fmt.Errorf("minio bucket %s name %s already exists", args.Bucket, args.Name) - } else if !m.IsNotFound(err) { - return "", err - } - u, err := m.client.PresignedPutObject(ctx, m.tempBucket, args.Name, args.Effective) - if err != nil { - return "", fmt.Errorf("minio apply error: %w", err) - } - return u.String(), nil -} - -func (m *minioImpl) GetObjectInfo(ctx context.Context, args *BucketObject) (*ObjectInfo, error) { - info, err := m.client.StatObject(ctx, args.Bucket, args.Name, minio.StatObjectOptions{}) - if err != nil { - return nil, err - } - return &ObjectInfo{ - Size: info.Size, - Hash: info.ETag, - }, nil -} - -func (m *minioImpl) CopyObject(ctx context.Context, src *BucketObject, dst *BucketObject) error { - _, err := m.client.CopyObject(ctx, minio.CopyDestOptions{ - Bucket: dst.Bucket, - Object: dst.Name, - }, minio.CopySrcOptions{ - Bucket: src.Bucket, - Object: src.Name, - }) - return err -} - -func (m *minioImpl) DeleteObject(ctx context.Context, info *BucketObject) error { - return m.client.RemoveObject(ctx, info.Bucket, info.Name, minio.RemoveObjectOptions{}) -} - -func (m *minioImpl) MoveObjectInfo(ctx context.Context, src *BucketObject, dst *BucketObject) error { - if err := m.CopyObject(ctx, src, dst); err != nil { - return err - } - return m.DeleteObject(ctx, src) -} - -func (m *minioImpl) ComposeObject(ctx context.Context, src []BucketObject, dst *BucketObject) error { - destOptions := minio.CopyDestOptions{ - Bucket: dst.Bucket, - Object: dst.Name + ".temp", - } - sources := make([]minio.CopySrcOptions, len(src)) - for i, s := range src { - sources[i] = minio.CopySrcOptions{ - Bucket: s.Bucket, - Object: s.Name, - } - } - _, err := m.client.ComposeObject(ctx, destOptions, sources...) - if err != nil { - return err - } - return m.MoveObjectInfo(ctx, &BucketObject{ - Bucket: destOptions.Bucket, - Name: destOptions.Object, - }, &BucketObject{ - Bucket: dst.Bucket, - Name: dst.Name, - }) -} - -func (m *minioImpl) IsNotFound(err error) bool { - if err == nil { - return false - } - switch e := err.(type) { - case minio.ErrorResponse: - return e.StatusCode == http.StatusNotFound || e.Code == "NoSuchKey" - case *minio.ErrorResponse: - return e.StatusCode == http.StatusNotFound || e.Code == "NoSuchKey" - default: - return false - } -} - -func (m *minioImpl) PutObject( - ctx context.Context, - info *BucketObject, - reader io.Reader, - size int64, -) (*ObjectInfo, error) { - update, err := m.client.PutObject(ctx, info.Bucket, info.Name, reader, size, minio.PutObjectOptions{}) - if err != nil { - return nil, err - } - return &ObjectInfo{ - Size: update.Size, - Hash: update.ETag, - }, nil -} - -func (m *minioImpl) GetObject(ctx context.Context, info *BucketObject) (SizeReader, error) { - object, err := m.client.GetObject(ctx, info.Bucket, info.Name, minio.GetObjectOptions{}) - if err != nil { - return nil, err - } - stat, err := object.Stat() - if err != nil { - return nil, err - } - return NewSizeReader(object, stat.Size), nil -} - -func (m *minioImpl) CheckName(name string) error { - return s3utils.CheckValidObjectName(name) -} diff --git a/pkg/common/db/obj/obj.go b/pkg/common/db/obj/obj.go deleted file mode 100644 index d8f5d9390..000000000 --- a/pkg/common/db/obj/obj.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 obj - -import ( - "context" - "io" - "net/http" - "time" -) - -type BucketObject struct { - Bucket string `json:"bucket"` - Name string `json:"name"` -} - -type ApplyPutArgs struct { - Bucket string - Name string - Effective time.Duration // 申请有效时间 - Header http.Header // header - MaxObjectSize int64 -} - -type HeaderOption struct { - ContentType string - Filename string -} - -type ObjectInfo struct { - Size int64 - Hash string -} - -type SizeReader interface { - io.ReadCloser - Size() int64 -} - -func NewSizeReader(r io.ReadCloser, size int64) SizeReader { - if r == nil { - return nil - } - return &sizeReader{ - size: size, - ReadCloser: r, - } -} - -type sizeReader struct { - size int64 - io.ReadCloser -} - -func (r *sizeReader) Size() int64 { - return r.size -} - -type Interface interface { - // Name 存储名字 - Name() string - // MinFragmentSize 最小允许的分片大小 - MinFragmentSize() int64 - // MaxFragmentNum 最大允许的分片数量 - MaxFragmentNum() int - // MinExpirationTime 最小过期时间 - MinExpirationTime() time.Duration - // TempBucket 临时桶名,用于上传 - TempBucket() string - // DataBucket 永久存储的桶名 - DataBucket() string - // PresignedGetURL 通过桶名和对象名返回URL - PresignedGetURL( - ctx context.Context, - bucket string, - name string, - expires time.Duration, - opt *HeaderOption, - ) (string, error) - // PresignedPutURL 申请上传,返回PUT的上传地址 - PresignedPutURL(ctx context.Context, args *ApplyPutArgs) (string, error) - // GetObjectInfo 获取对象信息 - GetObjectInfo(ctx context.Context, args *BucketObject) (*ObjectInfo, error) - // CopyObject 复制对象 - CopyObject(ctx context.Context, src *BucketObject, dst *BucketObject) error - // DeleteObject 删除对象(不存在返回nil) - DeleteObject(ctx context.Context, info *BucketObject) error - // ComposeObject 合并对象 - ComposeObject(ctx context.Context, src []BucketObject, dst *BucketObject) error - // IsNotFound 判断是不是不存在导致的错误 - IsNotFound(err error) bool - // CheckName 检查名字是否可用 - CheckName(name string) error - // PutObject 上传文件 - PutObject(ctx context.Context, info *BucketObject, reader io.Reader, size int64) (*ObjectInfo, error) - // GetObject 下载文件 - GetObject(ctx context.Context, info *BucketObject) (SizeReader, error) -} diff --git a/pkg/common/db/relation/conversation_model.go b/pkg/common/db/relation/conversation_model.go index 47be971c0..04300f704 100644 --- a/pkg/common/db/relation/conversation_model.go +++ b/pkg/common/db/relation/conversation_model.go @@ -1,27 +1,12 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 relation import ( "context" - "gorm.io/gorm" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation" "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" + "gorm.io/gorm" ) type ConversationGorm struct { @@ -44,173 +29,66 @@ func (c *ConversationGorm) Delete(ctx context.Context, groupIDs []string) (err e return utils.Wrap(c.db(ctx).Where("group_id in (?)", groupIDs).Delete(&relation.ConversationModel{}).Error, "") } -func (c *ConversationGorm) UpdateByMap( - ctx context.Context, - userIDList []string, - conversationID string, - args map[string]interface{}, -) (rows int64, err error) { +func (c *ConversationGorm) UpdateByMap(ctx context.Context, userIDList []string, conversationID string, args map[string]interface{}) (rows int64, err error) { result := c.db(ctx).Where("owner_user_id IN (?) and conversation_id=?", userIDList, conversationID).Updates(args) return result.RowsAffected, utils.Wrap(result.Error, "") } func (c *ConversationGorm) Update(ctx context.Context, conversation *relation.ConversationModel) (err error) { - return utils.Wrap( - c.db(ctx). - Where("owner_user_id = ? and conversation_id = ?", conversation.OwnerUserID, conversation.ConversationID). - Updates(conversation). - Error, - "", - ) -} - -func (c *ConversationGorm) Find( - ctx context.Context, - ownerUserID string, - conversationIDs []string, -) (conversations []*relation.ConversationModel, err error) { - err = utils.Wrap( - c.db(ctx). - Where("owner_user_id=? and conversation_id IN (?)", ownerUserID, conversationIDs). - Find(&conversations). - Error, - "", - ) + return utils.Wrap(c.db(ctx).Where("owner_user_id = ? and conversation_id = ?", conversation.OwnerUserID, conversation.ConversationID).Updates(conversation).Error, "") +} + +func (c *ConversationGorm) Find(ctx context.Context, ownerUserID string, conversationIDs []string) (conversations []*relation.ConversationModel, err error) { + err = utils.Wrap(c.db(ctx).Where("owner_user_id=? and conversation_id IN (?)", ownerUserID, conversationIDs).Find(&conversations).Error, "") return conversations, err } -func (c *ConversationGorm) Take( - ctx context.Context, - userID, conversationID string, -) (conversation *relation.ConversationModel, err error) { +func (c *ConversationGorm) Take(ctx context.Context, userID, conversationID string) (conversation *relation.ConversationModel, err error) { cc := &relation.ConversationModel{} - return cc, utils.Wrap( - c.db(ctx).Where("conversation_id = ? And owner_user_id = ?", conversationID, userID).Take(cc).Error, - "", - ) -} - -func (c *ConversationGorm) FindUserID( - ctx context.Context, - userIDs []string, - conversationIDs []string, -) (existUserID []string, err error) { - return existUserID, utils.Wrap( - c.db(ctx). - Where(" owner_user_id IN (?) and conversation_id in (?)", userIDs, conversationIDs). - Pluck("owner_user_id", &existUserID). - Error, - "", - ) -} - -func (c *ConversationGorm) FindConversationID( - ctx context.Context, - userID string, - conversationIDList []string, -) (existConversationID []string, err error) { - return existConversationID, utils.Wrap( - c.db(ctx). - Where(" conversation_id IN (?) and owner_user_id=?", conversationIDList, userID). - Pluck("conversation_id", &existConversationID). - Error, - "", - ) -} - -func (c *ConversationGorm) FindUserIDAllConversationID( - ctx context.Context, - userID string, -) (conversationIDList []string, err error) { - return conversationIDList, utils.Wrap( - c.db(ctx).Where("owner_user_id=?", userID).Pluck("conversation_id", &conversationIDList).Error, - "", - ) -} - -func (c *ConversationGorm) FindUserIDAllConversations( - ctx context.Context, - userID string, -) (conversations []*relation.ConversationModel, err error) { + return cc, utils.Wrap(c.db(ctx).Where("conversation_id = ? And owner_user_id = ?", conversationID, userID).Take(cc).Error, "") +} + +func (c *ConversationGorm) FindUserID(ctx context.Context, userIDs []string, conversationIDs []string) (existUserID []string, err error) { + return existUserID, utils.Wrap(c.db(ctx).Where(" owner_user_id IN (?) and conversation_id in (?)", userIDs, conversationIDs).Pluck("owner_user_id", &existUserID).Error, "") +} + +func (c *ConversationGorm) FindConversationID(ctx context.Context, userID string, conversationIDList []string) (existConversationID []string, err error) { + return existConversationID, utils.Wrap(c.db(ctx).Where(" conversation_id IN (?) and owner_user_id=?", conversationIDList, userID).Pluck("conversation_id", &existConversationID).Error, "") +} + +func (c *ConversationGorm) FindUserIDAllConversationID(ctx context.Context, userID string) (conversationIDList []string, err error) { + return conversationIDList, utils.Wrap(c.db(ctx).Where("owner_user_id=?", userID).Pluck("conversation_id", &conversationIDList).Error, "") +} + +func (c *ConversationGorm) FindUserIDAllConversations(ctx context.Context, userID string) (conversations []*relation.ConversationModel, err error) { return conversations, utils.Wrap(c.db(ctx).Where("owner_user_id=?", userID).Find(&conversations).Error, "") } -func (c *ConversationGorm) FindRecvMsgNotNotifyUserIDs( - ctx context.Context, - groupID string, -) (userIDs []string, err error) { - return userIDs, utils.Wrap( - c.db(ctx). - Where("group_id = ? and recv_msg_opt = ?", groupID, constant.ReceiveNotNotifyMessage). - Pluck("user_id", &userIDs). - Error, - "", - ) -} - -func (c *ConversationGorm) FindSuperGroupRecvMsgNotNotifyUserIDs( - ctx context.Context, - groupID string, -) (userIDs []string, err error) { - return userIDs, utils.Wrap( - c.db(ctx). - Where("group_id = ? and recv_msg_opt = ? and conversation_type = ?", groupID, constant.ReceiveNotNotifyMessage, constant.SuperGroupChatType). - Pluck("user_id", &userIDs). - Error, - "", - ) -} - -func (c *ConversationGorm) GetUserRecvMsgOpt( - ctx context.Context, - ownerUserID, conversationID string, -) (opt int, err error) { +func (c *ConversationGorm) FindRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) (userIDs []string, err error) { + return userIDs, utils.Wrap(c.db(ctx).Where("group_id = ? and recv_msg_opt = ?", groupID, constant.ReceiveNotNotifyMessage).Pluck("user_id", &userIDs).Error, "") +} + +func (c *ConversationGorm) FindSuperGroupRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) (userIDs []string, err error) { + return userIDs, utils.Wrap(c.db(ctx).Where("group_id = ? and recv_msg_opt = ? and conversation_type = ?", groupID, constant.ReceiveNotNotifyMessage, constant.SuperGroupChatType).Pluck("user_id", &userIDs).Error, "") +} + +func (c *ConversationGorm) GetUserRecvMsgOpt(ctx context.Context, ownerUserID, conversationID string) (opt int, err error) { var conversation relation.ConversationModel - return int( - conversation.RecvMsgOpt, - ), utils.Wrap( - c.db(ctx). - Where("conversation_id = ? And owner_user_id = ?", conversationID, ownerUserID). - Select("recv_msg_opt"). - Find(&conversation). - Error, - "", - ) + return int(conversation.RecvMsgOpt), utils.Wrap(c.db(ctx).Where("conversation_id = ? And owner_user_id = ?", conversationID, ownerUserID).Select("recv_msg_opt").Find(&conversation).Error, "") } func (c *ConversationGorm) GetAllConversationIDs(ctx context.Context) (conversationIDs []string, err error) { - return conversationIDs, utils.Wrap( - c.db(ctx).Distinct("conversation_id").Pluck("conversation_id", &conversationIDs).Error, - "", - ) -} - -func (c *ConversationGorm) GetUserAllHasReadSeqs( - ctx context.Context, - ownerUserID string, -) (hasReadSeqs map[string]int64, err error) { - var conversations []*relation.ConversationModel - err = utils.Wrap( - c.db(ctx). - Where("owner_user_id = ?", ownerUserID). - Select("conversation_id", "has_read_seq"). - Find(&conversations). - Error, - "", - ) - hasReadSeqs = make(map[string]int64, len(conversations)) - // for _, conversation := range conversations { - // hasReadSeqs[conversation.ConversationID] = conversation.HasReadSeq - // } - return hasReadSeqs, err -} - -func (c *ConversationGorm) GetConversationsByConversationID( - ctx context.Context, - conversationIDs []string, -) (conversations []*relation.ConversationModel, err error) { - return conversations, utils.Wrap( - c.db(ctx).Where("conversation_id IN (?)", conversationIDs).Find(&conversations).Error, - "", - ) + return conversationIDs, utils.Wrap(c.db(ctx).Distinct("conversation_id").Pluck("conversation_id", &conversationIDs).Error, "") +} + +func (c *ConversationGorm) GetUserAllHasReadSeqs(ctx context.Context, ownerUserID string) (hasReadSeqs map[string]int64, err error) { + return nil, nil +} + +func (c *ConversationGorm) GetConversationsByConversationID(ctx context.Context, conversationIDs []string) (conversations []*relation.ConversationModel, err error) { + return conversations, utils.Wrap(c.db(ctx).Where("conversation_id IN (?)", conversationIDs).Find(&conversations).Error, "") +} + +func (c *ConversationGorm) GetConversationIDsNeedDestruct(ctx context.Context) (conversations []*relation.ConversationModel, err error) { + return conversations, utils.Wrap(c.db(ctx).Where("is_msg_destruct = 1 && UNIX_TIMESTAMP(NOW()) > (msg_destruct_time + UNIX_TIMESTAMP(latest_msg_destruct_time)) && msg_destruct_time != 0").Find(&conversations).Error, "") } diff --git a/pkg/common/db/relation/group_model.go b/pkg/common/db/relation/group_model.go index 8e3431c83..f3e1aec2f 100644 --- a/pkg/common/db/relation/group_model.go +++ b/pkg/common/db/relation/group_model.go @@ -1,27 +1,13 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 relation import ( "context" - - "gorm.io/gorm" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/ormutil" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation" + "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" + "gorm.io/gorm" + "time" ) var _ relation.GroupModelInterface = (*GroupGorm)(nil) @@ -47,13 +33,7 @@ func (g *GroupGorm) UpdateMap(ctx context.Context, groupID string, args map[stri } func (g *GroupGorm) UpdateStatus(ctx context.Context, groupID string, status int32) (err error) { - return utils.Wrap( - g.DB.Where("group_id = ?", groupID). - Model(&relation.GroupModel{}). - Updates(map[string]any{"status": status}). - Error, - "", - ) + return utils.Wrap(g.DB.Where("group_id = ?", groupID).Model(&relation.GroupModel{}).Updates(map[string]any{"status": status}).Error, "") } func (g *GroupGorm) Find(ctx context.Context, groupIDs []string) (groups []*relation.GroupModel, err error) { @@ -65,17 +45,37 @@ func (g *GroupGorm) Take(ctx context.Context, groupID string) (group *relation.G return group, utils.Wrap(g.DB.Where("group_id = ?", groupID).Take(group).Error, "") } -func (g *GroupGorm) Search( - ctx context.Context, - keyword string, - pageNumber, showNumber int32, -) (total uint32, groups []*relation.GroupModel, err error) { +func (g *GroupGorm) Search(ctx context.Context, keyword string, pageNumber, showNumber int32) (total uint32, groups []*relation.GroupModel, err error) { return ormutil.GormSearch[relation.GroupModel](g.DB, []string{"name"}, keyword, pageNumber, showNumber) } func (g *GroupGorm) GetGroupIDsByGroupType(ctx context.Context, groupType int) (groupIDs []string, err error) { - return groupIDs, utils.Wrap( - g.DB.Model(&relation.GroupModel{}).Where("group_type = ? ", groupType).Pluck("group_id", &groupIDs).Error, - "", - ) + return groupIDs, utils.Wrap(g.DB.Model(&relation.GroupModel{}).Where("group_type = ? ", groupType).Pluck("group_id", &groupIDs).Error, "") +} + +func (g *GroupGorm) CountTotal(ctx context.Context, before *time.Time) (count int64, err error) { + db := g.db(ctx).Model(&relation.GroupModel{}) + if before != nil { + db = db.Where("create_time < ?", before) + } + if err := db.Count(&count).Error; err != nil { + return 0, err + } + return count, nil +} + +func (g *GroupGorm) CountRangeEverydayTotal(ctx context.Context, start time.Time, end time.Time) (map[string]int64, error) { + var res []struct { + Date time.Time `gorm:"column:date"` + Count int64 `gorm:"column:count"` + } + err := g.db(ctx).Model(&relation.GroupModel{}).Select("DATE(create_time) AS date, count(1) AS count").Where("create_time >= ? and create_time < ?", start, end).Group("date").Find(&res).Error + if err != nil { + return nil, errs.Wrap(err) + } + v := make(map[string]int64) + for _, r := range res { + v[r.Date.Format("2006-01-02")] = r.Count + } + return v, nil } diff --git a/pkg/common/db/relation/object_hash_model.go b/pkg/common/db/relation/object_hash_model.go deleted file mode 100644 index 5ff8cd47a..000000000 --- a/pkg/common/db/relation/object_hash_model.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 relation - -import ( - "context" - - "gorm.io/gorm" - - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation" - "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" -) - -type ObjectHashGorm struct { - *MetaDB -} - -func NewObjectHash(db *gorm.DB) relation.ObjectHashModelInterface { - return &ObjectHashGorm{ - NewMetaDB(db, &relation.ObjectHashModel{}), - } -} - -func (o *ObjectHashGorm) NewTx(tx any) relation.ObjectHashModelInterface { - return &ObjectHashGorm{ - NewMetaDB(tx.(*gorm.DB), &relation.ObjectHashModel{}), - } -} - -func (o *ObjectHashGorm) Take( - ctx context.Context, - hash string, - engine string, -) (oh *relation.ObjectHashModel, err error) { - oh = &relation.ObjectHashModel{} - return oh, utils.Wrap1(o.DB.Where("hash = ? and engine = ?", hash, engine).Take(oh).Error) -} - -func (o *ObjectHashGorm) Create(ctx context.Context, h []*relation.ObjectHashModel) (err error) { - return utils.Wrap1(o.DB.Create(h).Error) -} - -func (o *ObjectHashGorm) DeleteNoCitation( - ctx context.Context, - engine string, - num int, -) (list []*relation.ObjectHashModel, err error) { - err = o.DB.Table(relation.ObjectHashModelTableName, "as h").Select("h.*"). - Joins("LEFT JOIN "+relation.ObjectInfoModelTableName+" as i ON h.hash = i.hash"). - Where("h.engine = ? AND i.hash IS NULL", engine). - Limit(num). - Find(&list).Error - return list, utils.Wrap1(err) -} diff --git a/pkg/common/db/relation/object_info_model.go b/pkg/common/db/relation/object_info_model.go deleted file mode 100644 index 642ae8ef2..000000000 --- a/pkg/common/db/relation/object_info_model.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 relation - -import ( - "context" - "time" - - "gorm.io/gorm" - - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation" - "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" - "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" -) - -type ObjectInfoGorm struct { - *MetaDB -} - -func NewObjectInfo(db *gorm.DB) relation.ObjectInfoModelInterface { - return &ObjectInfoGorm{ - NewMetaDB(db, &relation.ObjectInfoModel{}), - } -} - -func (o *ObjectInfoGorm) NewTx(tx any) relation.ObjectInfoModelInterface { - return &ObjectInfoGorm{ - NewMetaDB(tx.(*gorm.DB), &relation.ObjectInfoModel{}), - } -} - -func (o *ObjectInfoGorm) SetObject(ctx context.Context, obj *relation.ObjectInfoModel) (err error) { - if err := o.DB.WithContext(ctx).Where("name = ?", obj.Name).Delete(&relation.ObjectInfoModel{}).Error; err != nil { - return errs.Wrap(err) - } - return errs.Wrap(o.DB.WithContext(ctx).Create(obj).Error) - //return errs.Wrap(o.DB.WithContext(ctx).Transaction(func(tx *gorm.DB) error { - // if err := tx.Where("name = ?", obj.Name).Delete(&relation.ObjectInfoModel{}).Error; err != nil { - // return errs.Wrap(err) - // } - // return errs.Wrap(tx.Create(obj).Error) - //})) -} - -func (o *ObjectInfoGorm) Take(ctx context.Context, name string) (info *relation.ObjectInfoModel, err error) { - info = &relation.ObjectInfoModel{} - return info, utils.Wrap1(o.DB.WithContext(ctx).Where("name = ?", name).Take(info).Error) -} - -func (o *ObjectInfoGorm) DeleteExpiration(ctx context.Context, expiration time.Time) (err error) { - return utils.Wrap1( - o.DB.WithContext(ctx). - Where("expiration_time IS NOT NULL AND expiration_time <= ?", expiration). - Delete(&relation.ObjectInfoModel{}). - Error, - ) -} diff --git a/pkg/common/db/relation/object_model.go b/pkg/common/db/relation/object_model.go new file mode 100644 index 000000000..cfbd011b8 --- /dev/null +++ b/pkg/common/db/relation/object_model.go @@ -0,0 +1,36 @@ +package relation + +import ( + "context" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation" + "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" + "gorm.io/gorm" +) + +type ObjectInfoGorm struct { + *MetaDB +} + +func NewObjectInfo(db *gorm.DB) relation.ObjectInfoModelInterface { + return &ObjectInfoGorm{ + NewMetaDB(db, &relation.ObjectModel{}), + } +} + +func (o *ObjectInfoGorm) NewTx(tx any) relation.ObjectInfoModelInterface { + return &ObjectInfoGorm{ + NewMetaDB(tx.(*gorm.DB), &relation.ObjectModel{}), + } +} + +func (o *ObjectInfoGorm) SetObject(ctx context.Context, obj *relation.ObjectModel) (err error) { + if err := o.DB.WithContext(ctx).Where("name = ?", obj.Name).FirstOrCreate(obj).Error; err != nil { + return errs.Wrap(err) + } + return nil +} + +func (o *ObjectInfoGorm) Take(ctx context.Context, name string) (info *relation.ObjectModel, err error) { + info = &relation.ObjectModel{} + return info, errs.Wrap(o.DB.WithContext(ctx).Where("name = ?", name).Take(info).Error) +} diff --git a/pkg/common/db/relation/object_put_model.go b/pkg/common/db/relation/object_put_model.go deleted file mode 100644 index d2df2636d..000000000 --- a/pkg/common/db/relation/object_put_model.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 relation - -import ( - "context" - "time" - - "gorm.io/gorm" - - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation" - "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" -) - -type ObjectPutGorm struct { - *MetaDB -} - -func NewObjectPut(db *gorm.DB) relation.ObjectPutModelInterface { - return &ObjectPutGorm{ - NewMetaDB(db, &relation.ObjectPutModel{}), - } -} - -func (o *ObjectPutGorm) NewTx(tx any) relation.ObjectPutModelInterface { - return &ObjectPutGorm{ - NewMetaDB(tx.(*gorm.DB), &relation.ObjectPutModel{}), - } -} - -func (o *ObjectPutGorm) Create(ctx context.Context, m []*relation.ObjectPutModel) (err error) { - return utils.Wrap1(o.DB.Create(m).Error) -} - -func (o *ObjectPutGorm) Take(ctx context.Context, putID string) (put *relation.ObjectPutModel, err error) { - put = &relation.ObjectPutModel{} - return put, utils.Wrap1(o.DB.Where("put_id = ?", putID).Take(put).Error) -} - -func (o *ObjectPutGorm) SetCompleted(ctx context.Context, putID string) (err error) { - return utils.Wrap1(o.DB.Model(&relation.ObjectPutModel{}).Where("put_id = ?", putID).Update("complete", true).Error) -} - -func (o *ObjectPutGorm) FindExpirationPut( - ctx context.Context, - expirationTime time.Time, - num int, -) (list []*relation.ObjectPutModel, err error) { - err = o.DB.Where("effective_time <= ?", expirationTime).Limit(num).Find(&list).Error - return list, utils.Wrap1(err) -} - -func (o *ObjectPutGorm) DelPut(ctx context.Context, ids []string) (err error) { - return utils.Wrap1(o.DB.Where("put_id IN ?", ids).Delete(&relation.ObjectPutModel{}).Error) -} diff --git a/pkg/common/db/relation/user_model.go b/pkg/common/db/relation/user_model.go index 89a1773d4..d03216d9b 100644 --- a/pkg/common/db/relation/user_model.go +++ b/pkg/common/db/relation/user_model.go @@ -41,7 +41,7 @@ func (u *UserGorm) Create(ctx context.Context, users []*relation.UserModel) (err // 更新用户信息 零值 func (u *UserGorm) UpdateByMap(ctx context.Context, userID string, args map[string]interface{}) (err error) { - return utils.Wrap(u.db(ctx).Where("user_id = ?", userID).Updates(args).Error, "") + return utils.Wrap(u.db(ctx).Model(&relation.UserModel{}).Where("user_id = ?", userID).Updates(args).Error, "") } // 更新多个用户信息 非零值 @@ -94,9 +94,15 @@ func (u *UserGorm) GetUserGlobalRecvMsgOpt(ctx context.Context, userID string) ( return opt, err } -func (u *UserGorm) CountTotal(ctx context.Context) (count int64, err error) { - err = u.db(ctx).Model(&relation.UserModel{}).Count(&count).Error - return count, errs.Wrap(err) +func (u *UserGorm) CountTotal(ctx context.Context, before *time.Time) (count int64, err error) { + db := u.db(ctx).Model(&relation.UserModel{}) + if before != nil { + db = db.Where("create_time < ?", before) + } + if err := db.Count(&count).Error; err != nil { + return 0, err + } + return count, nil } func (u *UserGorm) CountRangeEverydayTotal( diff --git a/pkg/common/db/s3/cont/consts.go b/pkg/common/db/s3/cont/consts.go new file mode 100644 index 000000000..144370a2d --- /dev/null +++ b/pkg/common/db/s3/cont/consts.go @@ -0,0 +1,9 @@ +package cont + +const ( + hashPath = "openim/data/hash/" + tempPath = "openim/temp/" + UploadTypeMultipart = 1 // 分片上传 + UploadTypePresigned = 2 // 预签名上传 + partSeparator = "," +) diff --git a/pkg/common/db/s3/cont/controller.go b/pkg/common/db/s3/cont/controller.go new file mode 100644 index 000000000..ba834a739 --- /dev/null +++ b/pkg/common/db/s3/cont/controller.go @@ -0,0 +1,244 @@ +package cont + +import ( + "context" + "crypto/md5" + "encoding/hex" + "errors" + "fmt" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" + "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" + "github.com/google/uuid" + "path" + "strings" + "time" +) + +func New(impl s3.Interface) *Controller { + return &Controller{impl: impl} +} + +type Controller struct { + impl s3.Interface +} + +func (c *Controller) HashPath(md5 string) string { + return path.Join(hashPath, md5) +} + +func (c *Controller) NowPath() string { + now := time.Now() + return path.Join( + fmt.Sprintf("%04d", now.Year()), + fmt.Sprintf("%02d", now.Month()), + fmt.Sprintf("%02d", now.Day()), + fmt.Sprintf("%02d", now.Hour()), + fmt.Sprintf("%02d", now.Minute()), + fmt.Sprintf("%02d", now.Second()), + ) +} + +func (c *Controller) UUID() string { + id := uuid.New() + return hex.EncodeToString(id[:]) +} + +func (c *Controller) PartSize(ctx context.Context, size int64) (int64, error) { + return c.impl.PartSize(ctx, size) +} + +func (c *Controller) PartLimit() *s3.PartLimit { + return c.impl.PartLimit() +} + +func (c *Controller) GetHashObject(ctx context.Context, hash string) (*s3.ObjectInfo, error) { + return c.impl.StatObject(ctx, c.HashPath(hash)) +} + +func (c *Controller) InitiateUpload(ctx context.Context, hash string, size int64, expire time.Duration, maxParts int) (*InitiateUploadResult, error) { + defer log.ZDebug(ctx, "return") + if size < 0 { + return nil, errors.New("invalid size") + } + if hashBytes, err := hex.DecodeString(hash); err != nil { + return nil, err + } else if len(hashBytes) != md5.Size { + return nil, errors.New("invalid md5") + } + partSize, err := c.impl.PartSize(ctx, size) + if err != nil { + return nil, err + } + partNumber := int(size / partSize) + if size%partSize > 0 { + partNumber++ + } + if maxParts > 0 && partNumber > 0 && partNumber < maxParts { + return nil, errors.New(fmt.Sprintf("too many parts: %d", partNumber)) + } + if info, err := c.impl.StatObject(ctx, c.HashPath(hash)); err == nil { + return nil, &HashAlreadyExistsError{Object: info} + } else if !c.impl.IsNotFound(err) { + return nil, err + } + if size <= partSize { + // 预签名上传 + key := path.Join(tempPath, c.NowPath(), fmt.Sprintf("%s_%d_%s.presigned", hash, size, c.UUID())) + rawURL, err := c.impl.PresignedPutObject(ctx, key, expire) + if err != nil { + return nil, err + } + return &InitiateUploadResult{ + UploadID: newMultipartUploadID(multipartUploadID{ + Type: UploadTypePresigned, + ID: "", + Key: key, + Size: size, + Hash: hash, + }), + PartSize: partSize, + Sign: &s3.AuthSignResult{ + Parts: []s3.SignPart{ + { + PartNumber: 1, + URL: rawURL, + }, + }, + }, + }, nil + } else { + // 分片上传 + upload, err := c.impl.InitiateMultipartUpload(ctx, c.HashPath(hash)) + if err != nil { + return nil, err + } + if maxParts < 0 { + maxParts = partNumber + } + var authSign *s3.AuthSignResult + if maxParts > 0 { + partNumbers := make([]int, partNumber) + for i := 0; i < maxParts; i++ { + partNumbers[i] = i + 1 + } + authSign, err = c.impl.AuthSign(ctx, upload.UploadID, upload.Key, time.Hour*24, partNumbers) + if err != nil { + return nil, err + } + } + return &InitiateUploadResult{ + UploadID: newMultipartUploadID(multipartUploadID{ + Type: UploadTypeMultipart, + ID: upload.UploadID, + Key: upload.Key, + Size: size, + Hash: hash, + }), + PartSize: partSize, + Sign: authSign, + }, nil + } +} + +func (c *Controller) CompleteUpload(ctx context.Context, uploadID string, partHashs []string) (*UploadResult, error) { + defer log.ZDebug(ctx, "return") + upload, err := parseMultipartUploadID(uploadID) + if err != nil { + return nil, err + } + if md5Sum := md5.Sum([]byte(strings.Join(partHashs, partSeparator))); hex.EncodeToString(md5Sum[:]) != upload.Hash { + fmt.Println("CompleteUpload sum:", hex.EncodeToString(md5Sum[:]), "upload hash:", upload.Hash) + return nil, errors.New("md5 mismatching") + } + if info, err := c.impl.StatObject(ctx, c.HashPath(upload.Hash)); err == nil { + return &UploadResult{ + Key: info.Key, + Size: info.Size, + Hash: info.ETag, + }, nil + } else if !c.impl.IsNotFound(err) { + return nil, err + } + cleanObject := make(map[string]struct{}) + defer func() { + for key := range cleanObject { + _ = c.impl.DeleteObject(ctx, key) + } + }() + var targetKey string + switch upload.Type { + case UploadTypeMultipart: + parts := make([]s3.Part, len(partHashs)) + for i, part := range partHashs { + parts[i] = s3.Part{ + PartNumber: i + 1, + ETag: part, + } + } + // todo: 验证大小 + result, err := c.impl.CompleteMultipartUpload(ctx, upload.ID, upload.Key, parts) + if err != nil { + return nil, err + } + targetKey = result.Key + case UploadTypePresigned: + uploadInfo, err := c.impl.StatObject(ctx, upload.Key) + if err != nil { + return nil, err + } + cleanObject[uploadInfo.Key] = struct{}{} + if uploadInfo.Size != upload.Size { + return nil, errors.New("upload size mismatching") + } + md5Sum := md5.Sum([]byte(strings.Join([]string{uploadInfo.ETag}, partSeparator))) + if md5val := hex.EncodeToString(md5Sum[:]); md5val != upload.Hash { + return nil, errs.ErrArgs.Wrap(fmt.Sprintf("md5 mismatching %s != %s", md5val, upload.Hash)) + } + // 防止在这个时候,并发操作,导致文件被覆盖 + copyInfo, err := c.impl.CopyObject(ctx, uploadInfo.Key, upload.Key+"."+c.UUID()) + if err != nil { + return nil, err + } + cleanObject[copyInfo.Key] = struct{}{} + if copyInfo.ETag != uploadInfo.ETag { + return nil, errors.New("[concurrency]copy md5 mismatching") + } + hashCopyInfo, err := c.impl.CopyObject(ctx, copyInfo.Key, c.HashPath(upload.Hash)) + if err != nil { + return nil, err + } + log.ZInfo(ctx, "hashCopyInfo", "value", fmt.Sprintf("%+v", hashCopyInfo)) + targetKey = hashCopyInfo.Key + default: + return nil, errors.New("invalid upload id type") + } + return &UploadResult{ + Key: targetKey, + Size: upload.Size, + Hash: upload.Hash, + }, nil +} + +func (c *Controller) AuthSign(ctx context.Context, uploadID string, partNumbers []int) (*s3.AuthSignResult, error) { + upload, err := parseMultipartUploadID(uploadID) + if err != nil { + return nil, err + } + switch upload.Type { + case UploadTypeMultipart: + return c.impl.AuthSign(ctx, upload.ID, upload.Key, time.Hour*24, partNumbers) + case UploadTypePresigned: + return nil, errors.New("presigned id not support auth sign") + default: + return nil, errors.New("invalid upload id type") + } +} + +func (c *Controller) IsNotFound(err error) bool { + return c.impl.IsNotFound(err) +} + +func (c *Controller) AccessURL(ctx context.Context, name string, expire time.Duration, opt *s3.AccessURLOption) (string, error) { + return c.impl.AccessURL(ctx, name, expire, opt) +} diff --git a/pkg/common/db/s3/cont/error.go b/pkg/common/db/s3/cont/error.go new file mode 100644 index 000000000..afd1d0eba --- /dev/null +++ b/pkg/common/db/s3/cont/error.go @@ -0,0 +1,14 @@ +package cont + +import ( + "fmt" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3" +) + +type HashAlreadyExistsError struct { + Object *s3.ObjectInfo +} + +func (e *HashAlreadyExistsError) Error() string { + return fmt.Sprintf("hash already exists: %s", e.Object.Key) +} diff --git a/pkg/common/db/s3/cont/id.go b/pkg/common/db/s3/cont/id.go new file mode 100644 index 000000000..67acfae37 --- /dev/null +++ b/pkg/common/db/s3/cont/id.go @@ -0,0 +1,35 @@ +package cont + +import ( + "encoding/base64" + "encoding/json" + "fmt" +) + +type multipartUploadID struct { + Type int `json:"a,omitempty"` + ID string `json:"b,omitempty"` + Key string `json:"c,omitempty"` + Size int64 `json:"d,omitempty"` + Hash string `json:"e,omitempty"` +} + +func newMultipartUploadID(id multipartUploadID) string { + data, err := json.Marshal(id) + if err != nil { + panic(err) + } + return base64.StdEncoding.EncodeToString(data) +} + +func parseMultipartUploadID(id string) (*multipartUploadID, error) { + data, err := base64.StdEncoding.DecodeString(id) + if err != nil { + return nil, fmt.Errorf("invalid multipart upload id: %w", err) + } + var upload multipartUploadID + if err := json.Unmarshal(data, &upload); err != nil { + return nil, fmt.Errorf("invalid multipart upload id: %w", err) + } + return &upload, nil +} diff --git a/pkg/common/db/s3/cont/structs.go b/pkg/common/db/s3/cont/structs.go new file mode 100644 index 000000000..160dfba70 --- /dev/null +++ b/pkg/common/db/s3/cont/structs.go @@ -0,0 +1,15 @@ +package cont + +import "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3" + +type InitiateUploadResult struct { + UploadID string `json:"uploadID"` // 上传ID + PartSize int64 `json:"partSize"` // 分片大小 + Sign *s3.AuthSignResult `json:"sign"` // 分片信息 +} + +type UploadResult struct { + Hash string `json:"hash"` + Size int64 `json:"size"` + Key string `json:"key"` +} diff --git a/pkg/common/db/s3/cos/cos.go b/pkg/common/db/s3/cos/cos.go new file mode 100644 index 000000000..4b1b4aa4d --- /dev/null +++ b/pkg/common/db/s3/cos/cos.go @@ -0,0 +1,254 @@ +package cos + +import ( + "context" + "errors" + "fmt" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3" + "github.com/tencentyun/cos-go-sdk-v5" + "net/http" + "net/url" + "strconv" + "strings" + "time" +) + +const ( + minPartSize = 1024 * 1024 * 1 // 1MB + maxPartSize = 1024 * 1024 * 1024 * 5 // 5GB + maxNumSize = 1000 +) + +func NewCos() (s3.Interface, error) { + conf := config.Config.Object.Cos + u, err := url.Parse(conf.BucketURL) + if err != nil { + panic(err) + } + client := cos.NewClient(&cos.BaseURL{BucketURL: u}, &http.Client{ + Transport: &cos.AuthorizationTransport{ + SecretID: conf.SecretID, + SecretKey: conf.SecretKey, + SessionToken: conf.SessionToken, + }, + }) + return &Cos{ + copyURL: u.Host + "/", + client: client, + credential: client.GetCredential(), + }, nil +} + +type Cos struct { + copyURL string + client *cos.Client + credential *cos.Credential +} + +func (c *Cos) Engine() string { + return "tencent-cos" +} + +func (c *Cos) PartLimit() *s3.PartLimit { + return &s3.PartLimit{ + MinPartSize: minPartSize, + MaxPartSize: maxPartSize, + MaxNumSize: maxNumSize, + } +} + +func (c *Cos) InitiateMultipartUpload(ctx context.Context, name string) (*s3.InitiateMultipartUploadResult, error) { + result, _, err := c.client.Object.InitiateMultipartUpload(ctx, name, nil) + if err != nil { + return nil, err + } + return &s3.InitiateMultipartUploadResult{ + UploadID: result.UploadID, + Bucket: result.Bucket, + Key: result.Key, + }, nil +} + +func (c *Cos) CompleteMultipartUpload(ctx context.Context, uploadID string, name string, parts []s3.Part) (*s3.CompleteMultipartUploadResult, error) { + opts := &cos.CompleteMultipartUploadOptions{ + Parts: make([]cos.Object, len(parts)), + } + for i, part := range parts { + opts.Parts[i] = cos.Object{ + PartNumber: part.PartNumber, + ETag: strings.ReplaceAll(part.ETag, `"`, ``), + } + } + result, _, err := c.client.Object.CompleteMultipartUpload(ctx, name, uploadID, opts) + if err != nil { + return nil, err + } + return &s3.CompleteMultipartUploadResult{ + Location: result.Location, + Bucket: result.Bucket, + Key: result.Key, + ETag: result.ETag, + }, nil +} + +func (c *Cos) PartSize(ctx context.Context, size int64) (int64, error) { + if size <= 0 { + return 0, errors.New("size must be greater than 0") + } + if size > maxPartSize*maxNumSize { + return 0, fmt.Errorf("size must be less than %db", maxPartSize*maxNumSize) + } + if size <= minPartSize*maxNumSize { + return minPartSize, nil + } + partSize := size / maxNumSize + if size%maxNumSize != 0 { + partSize++ + } + return partSize, nil +} + +func (c *Cos) AuthSign(ctx context.Context, uploadID string, name string, expire time.Duration, partNumbers []int) (*s3.AuthSignResult, error) { + result := s3.AuthSignResult{ + URL: c.client.BaseURL.BucketURL.String() + "/" + cos.EncodeURIComponent(name), + Query: url.Values{"uploadId": {uploadID}}, + Header: make(http.Header), + Parts: make([]s3.SignPart, len(partNumbers)), + } + req, err := http.NewRequestWithContext(ctx, http.MethodPut, result.URL, nil) + if err != nil { + return nil, err + } + cos.AddAuthorizationHeader(c.credential.SecretID, c.credential.SecretKey, c.credential.SessionToken, req, cos.NewAuthTime(expire)) + result.Header = req.Header + for i, partNumber := range partNumbers { + result.Parts[i] = s3.SignPart{ + PartNumber: partNumber, + Query: url.Values{"partNumber": {strconv.Itoa(partNumber)}}, + } + } + return &result, nil +} + +func (c *Cos) PresignedPutObject(ctx context.Context, name string, expire time.Duration) (string, error) { + rawURL, err := c.client.Object.GetPresignedURL(ctx, http.MethodPut, name, c.credential.SecretID, c.credential.SecretKey, expire, nil) + if err != nil { + return "", err + } + return rawURL.String(), nil +} + +func (c *Cos) DeleteObject(ctx context.Context, name string) error { + _, err := c.client.Object.Delete(ctx, name) + return err +} + +func (c *Cos) StatObject(ctx context.Context, name string) (*s3.ObjectInfo, error) { + if name != "" && name[0] == '/' { + name = name[1:] + } + info, err := c.client.Object.Head(ctx, name, nil) + if err != nil { + return nil, err + } + res := &s3.ObjectInfo{Key: name} + if res.ETag = strings.ToLower(strings.ReplaceAll(info.Header.Get("ETag"), `"`, "")); res.ETag == "" { + return nil, errors.New("StatObject etag not found") + } + if contentLengthStr := info.Header.Get("Content-Length"); contentLengthStr == "" { + return nil, errors.New("StatObject content-length not found") + } else { + res.Size, err = strconv.ParseInt(contentLengthStr, 10, 64) + if err != nil { + return nil, fmt.Errorf("StatObject content-length parse error: %w", err) + } + if res.Size < 0 { + return nil, errors.New("StatObject content-length must be greater than 0") + } + } + if lastModified := info.Header.Get("Last-Modified"); lastModified == "" { + return nil, errors.New("StatObject last-modified not found") + } else { + res.LastModified, err = time.Parse(http.TimeFormat, lastModified) + if err != nil { + return nil, fmt.Errorf("StatObject last-modified parse error: %w", err) + } + } + return res, nil +} + +func (c *Cos) CopyObject(ctx context.Context, src string, dst string) (*s3.CopyObjectInfo, error) { + sourceURL := c.copyURL + src + result, _, err := c.client.Object.Copy(ctx, dst, sourceURL, nil) + if err != nil { + return nil, err + } + return &s3.CopyObjectInfo{ + Key: dst, + ETag: strings.ReplaceAll(result.ETag, `"`, ``), + }, nil +} + +func (c *Cos) IsNotFound(err error) bool { + switch e := err.(type) { + case *cos.ErrorResponse: + return e.Response.StatusCode == http.StatusNotFound || e.Code == "NoSuchKey" + default: + return false + } +} + +func (c *Cos) AbortMultipartUpload(ctx context.Context, uploadID string, name string) error { + _, err := c.client.Object.AbortMultipartUpload(ctx, name, uploadID) + return err +} + +func (c *Cos) ListUploadedParts(ctx context.Context, uploadID string, name string, partNumberMarker int, maxParts int) (*s3.ListUploadedPartsResult, error) { + result, _, err := c.client.Object.ListParts(ctx, name, uploadID, &cos.ObjectListPartsOptions{ + MaxParts: strconv.Itoa(maxParts), + PartNumberMarker: strconv.Itoa(partNumberMarker), + }) + if err != nil { + return nil, err + } + res := &s3.ListUploadedPartsResult{ + Key: result.Key, + UploadID: result.UploadID, + UploadedParts: make([]s3.UploadedPart, len(result.Parts)), + } + res.MaxParts, _ = strconv.Atoi(result.MaxParts) + res.NextPartNumberMarker, _ = strconv.Atoi(result.NextPartNumberMarker) + for i, part := range result.Parts { + lastModified, _ := time.Parse(http.TimeFormat, part.LastModified) + res.UploadedParts[i] = s3.UploadedPart{ + PartNumber: part.PartNumber, + LastModified: lastModified, + ETag: part.ETag, + Size: part.Size, + } + } + return res, nil +} + +func (c *Cos) AccessURL(ctx context.Context, name string, expire time.Duration, opt *s3.AccessURLOption) (string, error) { + //reqParams := make(url.Values) + //if opt != nil { + // if opt.ContentType != "" { + // reqParams.Set("Content-Type", opt.ContentType) + // } + // if opt.ContentDisposition != "" { + // reqParams.Set("Content-Disposition", opt.ContentDisposition) + // } + //} + if expire <= 0 { + expire = time.Hour * 24 * 365 * 99 // 99 years + } else if expire < time.Second { + expire = time.Second + } + rawURL, err := c.client.Object.GetPresignedURL(ctx, http.MethodGet, name, c.credential.SecretID, c.credential.SecretKey, expire, nil) + if err != nil { + return "", err + } + return rawURL.String(), nil +} diff --git a/pkg/common/db/s3/minio/minio.go b/pkg/common/db/s3/minio/minio.go new file mode 100644 index 000000000..367cbe8a8 --- /dev/null +++ b/pkg/common/db/s3/minio/minio.go @@ -0,0 +1,250 @@ +package minio + +import ( + "context" + "errors" + "fmt" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3" + "github.com/minio/minio-go/v7" + "github.com/minio/minio-go/v7/pkg/credentials" + "github.com/minio/minio-go/v7/pkg/signer" + "net/http" + "net/url" + "strconv" + "strings" + "time" +) + +const ( + unsignedPayload = "UNSIGNED-PAYLOAD" +) + +const ( + minPartSize = 1024 * 1024 * 5 // 1MB + maxPartSize = 1024 * 1024 * 1024 * 5 // 5GB + maxNumSize = 10000 +) + +func NewMinio() (s3.Interface, error) { + conf := config.Config.Object.Minio + u, err := url.Parse(conf.Endpoint) + if err != nil { + return nil, err + } + opts := &minio.Options{ + Creds: credentials.NewStaticV4(conf.AccessKeyID, conf.SecretAccessKey, conf.SessionToken), + Secure: u.Scheme == "https", + } + client, err := minio.New(u.Host, opts) + if err != nil { + return nil, err + } + return &Minio{ + bucket: conf.Bucket, + bucketURL: conf.Endpoint + "/" + conf.Bucket + "/", + opts: opts, + core: &minio.Core{Client: client}, + }, nil +} + +type Minio struct { + bucket string + bucketURL string + opts *minio.Options + core *minio.Core +} + +func (m *Minio) Engine() string { + return "minio" +} + +func (m *Minio) PartLimit() *s3.PartLimit { + return &s3.PartLimit{ + MinPartSize: minPartSize, + MaxPartSize: maxPartSize, + MaxNumSize: maxNumSize, + } +} + +func (m *Minio) InitiateMultipartUpload(ctx context.Context, name string) (*s3.InitiateMultipartUploadResult, error) { + uploadID, err := m.core.NewMultipartUpload(ctx, m.bucket, name, minio.PutObjectOptions{}) + if err != nil { + return nil, err + } + return &s3.InitiateMultipartUploadResult{ + Bucket: m.bucket, + Key: name, + UploadID: uploadID, + }, nil +} + +func (m *Minio) CompleteMultipartUpload(ctx context.Context, uploadID string, name string, parts []s3.Part) (*s3.CompleteMultipartUploadResult, error) { + minioParts := make([]minio.CompletePart, len(parts)) + for i, part := range parts { + minioParts[i] = minio.CompletePart{ + PartNumber: part.PartNumber, + ETag: strings.ToLower(part.ETag), + } + } + upload, err := m.core.CompleteMultipartUpload(ctx, m.bucket, name, uploadID, minioParts, minio.PutObjectOptions{}) + if err != nil { + return nil, err + } + return &s3.CompleteMultipartUploadResult{ + Location: upload.Location, + Bucket: upload.Bucket, + Key: upload.Key, + ETag: strings.ToLower(upload.ETag), + }, nil +} + +func (m *Minio) PartSize(ctx context.Context, size int64) (int64, error) { + if size <= 0 { + return 0, errors.New("size must be greater than 0") + } + if size > maxPartSize*maxNumSize { + return 0, fmt.Errorf("size must be less than %db", maxPartSize*maxNumSize) + } + if size <= minPartSize*maxNumSize { + return minPartSize, nil + } + partSize := size / maxNumSize + if size%maxNumSize != 0 { + partSize++ + } + return partSize, nil +} + +func (m *Minio) AuthSign(ctx context.Context, uploadID string, name string, expire time.Duration, partNumbers []int) (*s3.AuthSignResult, error) { + creds, err := m.opts.Creds.Get() + if err != nil { + return nil, err + } + result := s3.AuthSignResult{ + URL: m.bucketURL + name, + Query: url.Values{"uploadId": {uploadID}}, + Parts: make([]s3.SignPart, len(partNumbers)), + } + for i, partNumber := range partNumbers { + rawURL := result.URL + "?partNumber=" + strconv.Itoa(partNumber) + "&uploadId=" + uploadID + request, err := http.NewRequestWithContext(ctx, http.MethodPut, rawURL, nil) + if err != nil { + return nil, err + } + request.Header.Set("X-Amz-Content-Sha256", unsignedPayload) + request = signer.SignV4Trailer(*request, creds.AccessKeyID, creds.SecretAccessKey, creds.SessionToken, "us-east-1", nil) + result.Parts[i] = s3.SignPart{ + PartNumber: partNumber, + URL: request.URL.String(), + Query: url.Values{"partNumber": {strconv.Itoa(partNumber)}}, + Header: request.Header, + } + } + return &result, nil +} + +func (m *Minio) PresignedPutObject(ctx context.Context, name string, expire time.Duration) (string, error) { + rawURL, err := m.core.Client.PresignedPutObject(ctx, m.bucket, name, expire) + if err != nil { + return "", err + } + return rawURL.String(), nil +} + +func (m *Minio) DeleteObject(ctx context.Context, name string) error { + return m.core.Client.RemoveObject(ctx, m.bucket, name, minio.RemoveObjectOptions{}) +} + +func (m *Minio) StatObject(ctx context.Context, name string) (*s3.ObjectInfo, error) { + info, err := m.core.Client.StatObject(ctx, m.bucket, name, minio.StatObjectOptions{}) + if err != nil { + return nil, err + } + return &s3.ObjectInfo{ + ETag: strings.ToLower(info.ETag), + Key: info.Key, + Size: info.Size, + LastModified: info.LastModified, + }, nil +} + +func (m *Minio) CopyObject(ctx context.Context, src string, dst string) (*s3.CopyObjectInfo, error) { + result, err := m.core.Client.CopyObject(ctx, minio.CopyDestOptions{ + Bucket: m.bucket, + Object: dst, + }, minio.CopySrcOptions{ + Bucket: m.bucket, + Object: src, + }) + if err != nil { + return nil, err + } + return &s3.CopyObjectInfo{ + Key: dst, + ETag: strings.ToLower(result.ETag), + }, nil +} + +func (m *Minio) IsNotFound(err error) bool { + if err == nil { + return false + } + switch e := err.(type) { + case minio.ErrorResponse: + return e.StatusCode == http.StatusNotFound || e.Code == "NoSuchKey" + case *minio.ErrorResponse: + return e.StatusCode == http.StatusNotFound || e.Code == "NoSuchKey" + default: + return false + } +} + +func (m *Minio) AbortMultipartUpload(ctx context.Context, uploadID string, name string) error { + return m.core.AbortMultipartUpload(ctx, m.bucket, name, uploadID) +} + +func (m *Minio) ListUploadedParts(ctx context.Context, uploadID string, name string, partNumberMarker int, maxParts int) (*s3.ListUploadedPartsResult, error) { + result, err := m.core.ListObjectParts(ctx, m.bucket, name, uploadID, partNumberMarker, maxParts) + if err != nil { + return nil, err + } + res := &s3.ListUploadedPartsResult{ + Key: result.Key, + UploadID: result.UploadID, + MaxParts: result.MaxParts, + NextPartNumberMarker: result.NextPartNumberMarker, + UploadedParts: make([]s3.UploadedPart, len(result.ObjectParts)), + } + for i, part := range result.ObjectParts { + res.UploadedParts[i] = s3.UploadedPart{ + PartNumber: part.PartNumber, + LastModified: part.LastModified, + ETag: part.ETag, + Size: part.Size, + } + } + return res, nil +} + +func (m *Minio) AccessURL(ctx context.Context, name string, expire time.Duration, opt *s3.AccessURLOption) (string, error) { + //reqParams := make(url.Values) + //if opt != nil { + // if opt.ContentType != "" { + // reqParams.Set("Content-Type", opt.ContentType) + // } + // if opt.ContentDisposition != "" { + // reqParams.Set("Content-Disposition", opt.ContentDisposition) + // } + //} + if expire <= 0 { + expire = time.Hour * 24 * 365 * 99 // 99 years + } else if expire < time.Second { + expire = time.Second + } + u, err := m.core.Client.PresignedGetObject(ctx, m.bucket, name, expire, nil) + if err != nil { + return "", err + } + return u.String(), nil +} diff --git a/pkg/common/db/s3/oss/oss.go b/pkg/common/db/s3/oss/oss.go new file mode 100644 index 000000000..f2b50da50 --- /dev/null +++ b/pkg/common/db/s3/oss/oss.go @@ -0,0 +1,259 @@ +package oss + +import ( + "context" + "errors" + "fmt" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config" + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/s3" + "github.com/aliyun/aliyun-oss-go-sdk/oss" + "net/http" + "net/url" + "strconv" + "strings" + "time" +) + +const ( + minPartSize = 1024 * 1024 * 1 // 1MB + maxPartSize = 1024 * 1024 * 1024 * 5 // 5GB + maxNumSize = 10000 +) + +func NewOSS() (s3.Interface, error) { + conf := config.Config.Object.Oss + if conf.BucketURL == "" { + return nil, errors.New("bucket url is empty") + } + client, err := oss.New(conf.Endpoint, conf.AccessKeyID, conf.AccessKeySecret) + if err != nil { + return nil, err + } + bucket, err := client.Bucket(conf.Bucket) + if err != nil { + return nil, err + } + if conf.BucketURL[len(conf.BucketURL)-1] != '/' { + conf.BucketURL += "/" + } + return &OSS{ + bucketURL: conf.BucketURL, + bucket: bucket, + credentials: client.Config.GetCredentials(), + }, nil +} + +type OSS struct { + bucketURL string + bucket *oss.Bucket + credentials oss.Credentials +} + +func (o *OSS) Engine() string { + return "ali-oss" +} + +func (o *OSS) PartLimit() *s3.PartLimit { + return &s3.PartLimit{ + MinPartSize: minPartSize, + MaxPartSize: maxPartSize, + MaxNumSize: maxNumSize, + } +} + +func (o *OSS) InitiateMultipartUpload(ctx context.Context, name string) (*s3.InitiateMultipartUploadResult, error) { + result, err := o.bucket.InitiateMultipartUpload(name) + if err != nil { + return nil, err + } + return &s3.InitiateMultipartUploadResult{ + UploadID: result.UploadID, + Bucket: result.Bucket, + Key: result.Key, + }, nil +} + +func (o *OSS) CompleteMultipartUpload(ctx context.Context, uploadID string, name string, parts []s3.Part) (*s3.CompleteMultipartUploadResult, error) { + ossParts := make([]oss.UploadPart, len(parts)) + for i, part := range parts { + ossParts[i] = oss.UploadPart{ + PartNumber: part.PartNumber, + ETag: strings.ToUpper(part.ETag), + } + } + result, err := o.bucket.CompleteMultipartUpload(oss.InitiateMultipartUploadResult{ + UploadID: uploadID, + Bucket: o.bucket.BucketName, + Key: name, + }, ossParts) + if err != nil { + return nil, err + } + return &s3.CompleteMultipartUploadResult{ + Location: result.Location, + Bucket: result.Bucket, + Key: result.Key, + ETag: strings.ToLower(strings.ReplaceAll(result.ETag, `"`, ``)), + }, nil +} + +func (o *OSS) PartSize(ctx context.Context, size int64) (int64, error) { + if size <= 0 { + return 0, errors.New("size must be greater than 0") + } + if size > maxPartSize*maxNumSize { + return 0, fmt.Errorf("size must be less than %db", maxPartSize*maxNumSize) + } + if size <= minPartSize*maxNumSize { + return minPartSize, nil + } + partSize := size / maxNumSize + if size%maxNumSize != 0 { + partSize++ + } + return partSize, nil +} + +func (o *OSS) AuthSign(ctx context.Context, uploadID string, name string, expire time.Duration, partNumbers []int) (*s3.AuthSignResult, error) { + result := s3.AuthSignResult{ + URL: o.bucketURL + name, + Query: url.Values{"uploadId": {uploadID}}, + Header: make(http.Header), + Parts: make([]s3.SignPart, len(partNumbers)), + } + for i, partNumber := range partNumbers { + rawURL := fmt.Sprintf(`%s%s?partNumber=%d&uploadId=%s`, o.bucketURL, name, partNumber, uploadID) + request, err := http.NewRequestWithContext(ctx, http.MethodPut, rawURL, nil) + if err != nil { + return nil, err + } + if o.credentials.GetSecurityToken() != "" { + request.Header.Set(oss.HTTPHeaderOssSecurityToken, o.credentials.GetSecurityToken()) + } + request.Header.Set(oss.HTTPHeaderHost, request.Host) + request.Header.Set(oss.HTTPHeaderDate, time.Now().UTC().Format(http.TimeFormat)) + authorization := fmt.Sprintf(`OSS %s:%s`, o.credentials.GetAccessKeyID(), o.getSignedStr(request, fmt.Sprintf(`/%s/%s?partNumber=%d&uploadId=%s`, o.bucket.BucketName, name, partNumber, uploadID), o.credentials.GetAccessKeySecret())) + request.Header.Set(oss.HTTPHeaderAuthorization, authorization) + result.Parts[i] = s3.SignPart{ + PartNumber: partNumber, + Query: url.Values{"partNumber": {strconv.Itoa(partNumber)}}, + URL: request.URL.String(), + Header: request.Header, + } + } + return &result, nil +} + +func (o *OSS) PresignedPutObject(ctx context.Context, name string, expire time.Duration) (string, error) { + return o.bucket.SignURL(name, http.MethodPut, int64(expire/time.Second)) +} + +func (o *OSS) StatObject(ctx context.Context, name string) (*s3.ObjectInfo, error) { + header, err := o.bucket.GetObjectMeta(name) + if err != nil { + return nil, err + } + res := &s3.ObjectInfo{Key: name} + if res.ETag = strings.ToLower(strings.ReplaceAll(header.Get("ETag"), `"`, ``)); res.ETag == "" { + return nil, errors.New("StatObject etag not found") + } + if contentLengthStr := header.Get("Content-Length"); contentLengthStr == "" { + return nil, errors.New("StatObject content-length not found") + } else { + res.Size, err = strconv.ParseInt(contentLengthStr, 10, 64) + if err != nil { + return nil, fmt.Errorf("StatObject content-length parse error: %w", err) + } + if res.Size < 0 { + return nil, errors.New("StatObject content-length must be greater than 0") + } + } + if lastModified := header.Get("Last-Modified"); lastModified == "" { + return nil, errors.New("StatObject last-modified not found") + } else { + res.LastModified, err = time.Parse(http.TimeFormat, lastModified) + if err != nil { + return nil, fmt.Errorf("StatObject last-modified parse error: %w", err) + } + } + return res, nil +} + +func (o *OSS) DeleteObject(ctx context.Context, name string) error { + return o.bucket.DeleteObject(name) +} + +func (o *OSS) CopyObject(ctx context.Context, src string, dst string) (*s3.CopyObjectInfo, error) { + result, err := o.bucket.CopyObject(src, dst) + if err != nil { + return nil, err + } + return &s3.CopyObjectInfo{ + Key: dst, + ETag: strings.ToLower(strings.ReplaceAll(result.ETag, `"`, ``)), + }, nil +} + +func (o *OSS) IsNotFound(err error) bool { + switch e := err.(type) { + case oss.ServiceError: + return e.StatusCode == http.StatusNotFound || e.Code == "NoSuchKey" + case *oss.ServiceError: + return e.StatusCode == http.StatusNotFound || e.Code == "NoSuchKey" + default: + return false + } +} + +func (o *OSS) AbortMultipartUpload(ctx context.Context, uploadID string, name string) error { + return o.bucket.AbortMultipartUpload(oss.InitiateMultipartUploadResult{ + UploadID: uploadID, + Key: name, + Bucket: o.bucket.BucketName, + }) +} + +func (o *OSS) ListUploadedParts(ctx context.Context, uploadID string, name string, partNumberMarker int, maxParts int) (*s3.ListUploadedPartsResult, error) { + result, err := o.bucket.ListUploadedParts(oss.InitiateMultipartUploadResult{ + UploadID: uploadID, + Key: name, + Bucket: o.bucket.BucketName, + }, oss.MaxUploads(100), oss.MaxParts(maxParts), oss.PartNumberMarker(partNumberMarker)) + if err != nil { + return nil, err + } + res := &s3.ListUploadedPartsResult{ + Key: result.Key, + UploadID: result.UploadID, + MaxParts: result.MaxParts, + UploadedParts: make([]s3.UploadedPart, len(result.UploadedParts)), + } + res.NextPartNumberMarker, _ = strconv.Atoi(result.NextPartNumberMarker) + for i, part := range result.UploadedParts { + res.UploadedParts[i] = s3.UploadedPart{ + PartNumber: part.PartNumber, + LastModified: part.LastModified, + ETag: part.ETag, + Size: int64(part.Size), + } + } + return res, nil +} + +func (o *OSS) AccessURL(ctx context.Context, name string, expire time.Duration, opt *s3.AccessURLOption) (string, error) { + //var opts []oss.Option + //if opt != nil { + // if opt.ContentType != "" { + // opts = append(opts, oss.ContentType(opt.ContentType)) + // } + // if opt.ContentDisposition != "" { + // opts = append(opts, oss.ContentDisposition(opt.ContentDisposition)) + // } + //} + if expire <= 0 { + expire = time.Hour * 24 * 365 * 99 // 99 years + } else if expire < time.Second { + expire = time.Second + } + return o.bucket.SignURL(name, http.MethodGet, int64(expire/time.Second)) +} diff --git a/pkg/common/db/s3/oss/sign.go b/pkg/common/db/s3/oss/sign.go new file mode 100644 index 000000000..82618d287 --- /dev/null +++ b/pkg/common/db/s3/oss/sign.go @@ -0,0 +1,81 @@ +package oss + +import ( + "crypto/hmac" + "crypto/sha1" + "crypto/sha256" + "encoding/base64" + "github.com/aliyun/aliyun-oss-go-sdk/oss" + "hash" + "io" + "net/http" + "sort" + "strings" +) + +func (o *OSS) getAdditionalHeaderKeys(req *http.Request) ([]string, map[string]string) { + var keysList []string + keysMap := make(map[string]string) + srcKeys := make(map[string]string) + + for k := range req.Header { + srcKeys[strings.ToLower(k)] = "" + } + + for _, v := range o.bucket.Client.Config.AdditionalHeaders { + if _, ok := srcKeys[strings.ToLower(v)]; ok { + keysMap[strings.ToLower(v)] = "" + } + } + + for k := range keysMap { + keysList = append(keysList, k) + } + sort.Strings(keysList) + return keysList, keysMap +} + +func (o *OSS) getSignedStr(req *http.Request, canonicalizedResource string, keySecret string) string { + // Find out the "x-oss-"'s address in header of the request + ossHeadersMap := make(map[string]string) + additionalList, additionalMap := o.getAdditionalHeaderKeys(req) + for k, v := range req.Header { + if strings.HasPrefix(strings.ToLower(k), "x-oss-") { + ossHeadersMap[strings.ToLower(k)] = v[0] + } else if o.bucket.Client.Config.AuthVersion == oss.AuthV2 { + if _, ok := additionalMap[strings.ToLower(k)]; ok { + ossHeadersMap[strings.ToLower(k)] = v[0] + } + } + } + hs := newHeaderSorter(ossHeadersMap) + + // Sort the ossHeadersMap by the ascending order + hs.Sort() + + // Get the canonicalizedOSSHeaders + canonicalizedOSSHeaders := "" + for i := range hs.Keys { + canonicalizedOSSHeaders += hs.Keys[i] + ":" + hs.Vals[i] + "\n" + } + + // Give other parameters values + // when sign URL, date is expires + date := req.Header.Get(oss.HTTPHeaderDate) + contentType := req.Header.Get(oss.HTTPHeaderContentType) + contentMd5 := req.Header.Get(oss.HTTPHeaderContentMD5) + + // default is v1 signature + signStr := req.Method + "\n" + contentMd5 + "\n" + contentType + "\n" + date + "\n" + canonicalizedOSSHeaders + canonicalizedResource + h := hmac.New(func() hash.Hash { return sha1.New() }, []byte(keySecret)) + + // v2 signature + if o.bucket.Client.Config.AuthVersion == oss.AuthV2 { + signStr = req.Method + "\n" + contentMd5 + "\n" + contentType + "\n" + date + "\n" + canonicalizedOSSHeaders + strings.Join(additionalList, ";") + "\n" + canonicalizedResource + h = hmac.New(func() hash.Hash { return sha256.New() }, []byte(keySecret)) + } + _, _ = io.WriteString(h, signStr) + signedStr := base64.StdEncoding.EncodeToString(h.Sum(nil)) + + return signedStr +} diff --git a/pkg/common/db/s3/oss/sort.go b/pkg/common/db/s3/oss/sort.go new file mode 100644 index 000000000..40c9a5af1 --- /dev/null +++ b/pkg/common/db/s3/oss/sort.go @@ -0,0 +1,47 @@ +package oss + +import ( + "bytes" + "sort" +) + +// headerSorter defines the key-value structure for storing the sorted data in signHeader. +type headerSorter struct { + Keys []string + Vals []string +} + +// newHeaderSorter is an additional function for function SignHeader. +func newHeaderSorter(m map[string]string) *headerSorter { + hs := &headerSorter{ + Keys: make([]string, 0, len(m)), + Vals: make([]string, 0, len(m)), + } + + for k, v := range m { + hs.Keys = append(hs.Keys, k) + hs.Vals = append(hs.Vals, v) + } + return hs +} + +// Sort is an additional function for function SignHeader. +func (hs *headerSorter) Sort() { + sort.Sort(hs) +} + +// Len is an additional function for function SignHeader. +func (hs *headerSorter) Len() int { + return len(hs.Vals) +} + +// Less is an additional function for function SignHeader. +func (hs *headerSorter) Less(i, j int) bool { + return bytes.Compare([]byte(hs.Keys[i]), []byte(hs.Keys[j])) < 0 +} + +// Swap is an additional function for function SignHeader. +func (hs *headerSorter) Swap(i, j int) { + hs.Vals[i], hs.Vals[j] = hs.Vals[j], hs.Vals[i] + hs.Keys[i], hs.Keys[j] = hs.Keys[j], hs.Keys[i] +} diff --git a/pkg/common/db/s3/s3.go b/pkg/common/db/s3/s3.go new file mode 100644 index 000000000..4f1571b1e --- /dev/null +++ b/pkg/common/db/s3/s3.go @@ -0,0 +1,134 @@ +package s3 + +import ( + "context" + "net/http" + "net/url" + "time" +) + +type PartLimit struct { + MinPartSize int64 `json:"minPartSize"` + MaxPartSize int64 `json:"maxPartSize"` + MaxNumSize int `json:"maxNumSize"` +} + +type InitiateMultipartUploadResult struct { + Bucket string `json:"bucket"` + Key string `json:"key"` + UploadID string `json:"uploadID"` +} + +type MultipartUploadRequest struct { + UploadID string `json:"uploadId"` + Bucket string `json:"bucket"` + Key string `json:"key"` + Method string `json:"method"` + URL string `json:"url"` + Query url.Values `json:"query"` + Header http.Header `json:"header"` + PartKey string `json:"partKey"` + PartSize int64 `json:"partSize"` + FirstPart int `json:"firstPart"` +} + +type Part struct { + PartNumber int `json:"partNumber"` + ETag string `json:"etag"` +} + +type CompleteMultipartUploadResult struct { + Location string `json:"location"` + Bucket string `json:"bucket"` + Key string `json:"key"` + ETag string `json:"etag"` +} + +type SignResult struct { + Parts []SignPart `json:"parts"` +} + +type ObjectInfo struct { + ETag string `json:"etag"` + Key string `json:"name"` + Size int64 `json:"size"` + LastModified time.Time `json:"lastModified"` +} + +type CopyObjectInfo struct { + Key string `json:"name"` + ETag string `json:"etag"` +} + +type SignPart struct { + PartNumber int `json:"partNumber"` + URL string `json:"url"` + Query url.Values `json:"query"` + Header http.Header `json:"header"` +} + +type AuthSignResult struct { + URL string `json:"url"` + Query url.Values `json:"query"` + Header http.Header `json:"header"` + Parts []SignPart `json:"parts"` +} + +type InitiateUpload struct { + UploadID string `json:"uploadId"` + Bucket string `json:"bucket"` + Key string `json:"key"` + Method string `json:"method"` + URL string `json:"url"` + Query url.Values `json:"query"` + Header http.Header `json:"header"` + PartKey string `json:"partKey"` + PartSize int64 `json:"partSize"` + FirstPart int `json:"firstPart"` +} + +type UploadedPart struct { + PartNumber int `json:"partNumber"` + LastModified time.Time `json:"lastModified"` + ETag string `json:"etag"` + Size int64 `json:"size"` +} + +type ListUploadedPartsResult struct { + Key string `xml:"Key"` + UploadID string `xml:"UploadId"` + NextPartNumberMarker int `xml:"NextPartNumberMarker"` + MaxParts int `xml:"MaxParts"` + UploadedParts []UploadedPart `xml:"Part"` +} + +type AccessURLOption struct { + ContentType string `json:"contentType"` + ContentDisposition string `json:"contentDisposition"` +} + +type Interface interface { + Engine() string + PartLimit() *PartLimit + + InitiateMultipartUpload(ctx context.Context, name string) (*InitiateMultipartUploadResult, error) + CompleteMultipartUpload(ctx context.Context, uploadID string, name string, parts []Part) (*CompleteMultipartUploadResult, error) + + PartSize(ctx context.Context, size int64) (int64, error) + AuthSign(ctx context.Context, uploadID string, name string, expire time.Duration, partNumbers []int) (*AuthSignResult, error) + + PresignedPutObject(ctx context.Context, name string, expire time.Duration) (string, error) + + DeleteObject(ctx context.Context, name string) error + + CopyObject(ctx context.Context, src string, dst string) (*CopyObjectInfo, error) + + StatObject(ctx context.Context, name string) (*ObjectInfo, error) + + IsNotFound(err error) bool + + AbortMultipartUpload(ctx context.Context, uploadID string, name string) error + ListUploadedParts(ctx context.Context, uploadID string, name string, partNumberMarker int, maxParts int) (*ListUploadedPartsResult, error) + + AccessURL(ctx context.Context, name string, expire time.Duration, opt *AccessURLOption) (string, error) +} diff --git a/pkg/common/db/table/relation/conversation.go b/pkg/common/db/table/relation/conversation.go index 5d6d061b1..6fd260583 100644 --- a/pkg/common/db/table/relation/conversation.go +++ b/pkg/common/db/table/relation/conversation.go @@ -1,40 +1,33 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 relation -import "context" +import ( + "context" + "time" +) const ( conversationModelTableName = "conversations" ) type ConversationModel struct { - OwnerUserID string `gorm:"column:owner_user_id;primary_key;type:char(128)" json:"OwnerUserID"` - ConversationID string `gorm:"column:conversation_id;primary_key;type:char(128)" json:"conversationID"` - ConversationType int32 `gorm:"column:conversation_type" json:"conversationType"` - UserID string `gorm:"column:user_id;type:char(64)" json:"userID"` - GroupID string `gorm:"column:group_id;type:char(128)" json:"groupID"` - RecvMsgOpt int32 `gorm:"column:recv_msg_opt" json:"recvMsgOpt"` - IsPinned bool `gorm:"column:is_pinned" json:"isPinned"` - IsPrivateChat bool `gorm:"column:is_private_chat" json:"isPrivateChat"` - BurnDuration int32 `gorm:"column:burn_duration;default:30" json:"burnDuration"` - GroupAtType int32 `gorm:"column:group_at_type" json:"groupAtType"` - AttachedInfo string `gorm:"column:attached_info;type:varchar(1024)" json:"attachedInfo"` - Ex string `gorm:"column:ex;type:varchar(1024)" json:"ex"` - MaxSeq int64 `gorm:"column:max_seq" json:"maxSeq"` - MinSeq int64 `gorm:"column:min_seq" json:"minSeq"` + OwnerUserID string `gorm:"column:owner_user_id;primary_key;type:char(128)" json:"OwnerUserID"` + ConversationID string `gorm:"column:conversation_id;primary_key;type:char(128)" json:"conversationID"` + ConversationType int32 `gorm:"column:conversation_type" json:"conversationType"` + UserID string `gorm:"column:user_id;type:char(64)" json:"userID"` + GroupID string `gorm:"column:group_id;type:char(128)" json:"groupID"` + RecvMsgOpt int32 `gorm:"column:recv_msg_opt" json:"recvMsgOpt"` + IsPinned bool `gorm:"column:is_pinned" json:"isPinned"` + IsPrivateChat bool `gorm:"column:is_private_chat" json:"isPrivateChat"` + BurnDuration int32 `gorm:"column:burn_duration;default:30" json:"burnDuration"` + GroupAtType int32 `gorm:"column:group_at_type" json:"groupAtType"` + AttachedInfo string `gorm:"column:attached_info;type:varchar(1024)" json:"attachedInfo"` + Ex string `gorm:"column:ex;type:varchar(1024)" json:"ex"` + MaxSeq int64 `gorm:"column:max_seq" json:"maxSeq"` + MinSeq int64 `gorm:"column:min_seq" json:"minSeq"` + CreateTime time.Time `gorm:"column:create_time;index:create_time;autoCreateTime"` + IsMsgDestruct bool `gorm:"column:is_msg_destruct;default:false"` + MsgDestructTime int64 `gorm:"column:msg_destruct_time;default:604800"` + LatestMsgDestructTime time.Time `gorm:"column:latest_msg_destruct_time;autoCreateTime"` } func (ConversationModel) TableName() string { @@ -44,26 +37,13 @@ func (ConversationModel) TableName() string { type ConversationModelInterface interface { Create(ctx context.Context, conversations []*ConversationModel) (err error) Delete(ctx context.Context, groupIDs []string) (err error) - UpdateByMap( - ctx context.Context, - userIDs []string, - conversationID string, - args map[string]interface{}, - ) (rows int64, err error) + UpdateByMap(ctx context.Context, userIDs []string, conversationID string, args map[string]interface{}) (rows int64, err error) Update(ctx context.Context, conversation *ConversationModel) (err error) - Find( - ctx context.Context, - ownerUserID string, - conversationIDs []string, - ) (conversations []*ConversationModel, err error) + Find(ctx context.Context, ownerUserID string, conversationIDs []string) (conversations []*ConversationModel, err error) FindUserID(ctx context.Context, userIDs []string, conversationIDs []string) ([]string, error) FindUserIDAllConversationID(ctx context.Context, userID string) ([]string, error) Take(ctx context.Context, userID, conversationID string) (conversation *ConversationModel, err error) - FindConversationID( - ctx context.Context, - userID string, - conversationIDs []string, - ) (existConversationID []string, err error) + FindConversationID(ctx context.Context, userID string, conversationIDs []string) (existConversationID []string, err error) FindUserIDAllConversations(ctx context.Context, userID string) (conversations []*ConversationModel, err error) FindRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) ([]string, error) GetUserRecvMsgOpt(ctx context.Context, ownerUserID, conversationID string) (opt int, err error) @@ -71,5 +51,6 @@ type ConversationModelInterface interface { GetAllConversationIDs(ctx context.Context) ([]string, error) GetUserAllHasReadSeqs(ctx context.Context, ownerUserID string) (hashReadSeqs map[string]int64, err error) GetConversationsByConversationID(ctx context.Context, conversationIDs []string) ([]*ConversationModel, error) + GetConversationIDsNeedDestruct(ctx context.Context) ([]*ConversationModel, error) NewTx(tx any) ConversationModelInterface } diff --git a/pkg/common/db/table/relation/group.go b/pkg/common/db/table/relation/group.go index be0afbcc3..2bafb53ec 100644 --- a/pkg/common/db/table/relation/group.go +++ b/pkg/common/db/table/relation/group.go @@ -58,4 +58,8 @@ type GroupModelInterface interface { pageNumber, showNumber int32, ) (total uint32, groups []*GroupModel, err error) GetGroupIDsByGroupType(ctx context.Context, groupType int) (groupIDs []string, err error) + // 获取群总数 + CountTotal(ctx context.Context, before *time.Time) (count int64, err error) + // 获取范围内群增量 + CountRangeEverydayTotal(ctx context.Context, start time.Time, end time.Time) (map[string]int64, error) } diff --git a/pkg/common/db/table/relation/object.go b/pkg/common/db/table/relation/object.go new file mode 100644 index 000000000..eb58c308d --- /dev/null +++ b/pkg/common/db/table/relation/object.go @@ -0,0 +1,31 @@ +package relation + +import ( + "context" + "time" +) + +const ( + ObjectInfoModelTableName = "object" +) + +type ObjectModel struct { + Name string `gorm:"column:name;primary_key"` + UserID string `gorm:"column:user_id"` + Hash string `gorm:"column:hash"` + Key string `gorm:"column:key"` + Size int64 `gorm:"column:size"` + ContentType string `gorm:"column:content_type"` + Cause string `gorm:"column:cause"` + CreateTime time.Time `gorm:"column:create_time"` +} + +func (ObjectModel) TableName() string { + return ObjectInfoModelTableName +} + +type ObjectInfoModelInterface interface { + NewTx(tx any) ObjectInfoModelInterface + SetObject(ctx context.Context, obj *ObjectModel) error + Take(ctx context.Context, name string) (*ObjectModel, error) +} diff --git a/pkg/common/db/table/relation/object_hash.go b/pkg/common/db/table/relation/object_hash.go deleted file mode 100644 index 231f21a81..000000000 --- a/pkg/common/db/table/relation/object_hash.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 relation - -import ( - "context" - "time" -) - -const ( - ObjectHashModelTableName = "object_hash" -) - -type ObjectHashModel struct { - Hash string `gorm:"column:hash;primary_key;size:32"` - Engine string `gorm:"column:engine;primary_key;size:16"` - Size int64 `gorm:"column:size"` - Bucket string `gorm:"column:bucket"` - Name string `gorm:"column:name"` - CreateTime time.Time `gorm:"column:create_time"` -} - -func (ObjectHashModel) TableName() string { - return ObjectHashModelTableName -} - -type ObjectHashModelInterface interface { - NewTx(tx any) ObjectHashModelInterface - Take(ctx context.Context, hash string, engine string) (*ObjectHashModel, error) - Create(ctx context.Context, h []*ObjectHashModel) error - DeleteNoCitation(ctx context.Context, engine string, num int) (list []*ObjectHashModel, err error) -} diff --git a/pkg/common/db/table/relation/object_info.go b/pkg/common/db/table/relation/object_info.go deleted file mode 100644 index e7b7fb57c..000000000 --- a/pkg/common/db/table/relation/object_info.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 relation - -import ( - "context" - "time" -) - -const ( - ObjectInfoModelTableName = "object_info" -) - -type ObjectInfoModel struct { - Name string `gorm:"column:name;primary_key"` - Hash string `gorm:"column:hash"` - ContentType string `gorm:"column:content_type"` - ValidTime *time.Time `gorm:"column:valid_time"` - CreateTime time.Time `gorm:"column:create_time"` -} - -func (ObjectInfoModel) TableName() string { - return ObjectInfoModelTableName -} - -type ObjectInfoModelInterface interface { - NewTx(tx any) ObjectInfoModelInterface - SetObject(ctx context.Context, obj *ObjectInfoModel) error - Take(ctx context.Context, name string) (*ObjectInfoModel, error) - DeleteExpiration(ctx context.Context, expiration time.Time) error -} diff --git a/pkg/common/db/table/relation/object_put.go b/pkg/common/db/table/relation/object_put.go deleted file mode 100644 index 49b37826c..000000000 --- a/pkg/common/db/table/relation/object_put.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 relation - -import ( - "context" - "time" -) - -const ( - ObjectPutModelTableName = "object_put" -) - -type ObjectPutModel struct { - PutID string `gorm:"column:put_id;primary_key"` - Hash string `gorm:"column:hash"` - Path string `gorm:"column:path"` - Name string `gorm:"column:name"` - ContentType string `gorm:"column:content_type"` - ObjectSize int64 `gorm:"column:object_size"` - FragmentSize int64 `gorm:"column:fragment_size"` - PutURLsHash string `gorm:"column:put_urls_hash"` - ValidTime *time.Time `gorm:"column:valid_time"` - EffectiveTime time.Time `gorm:"column:effective_time"` - CreateTime time.Time `gorm:"column:create_time"` -} - -func (ObjectPutModel) TableName() string { - return ObjectPutModelTableName -} - -type ObjectPutModelInterface interface { - NewTx(tx any) ObjectPutModelInterface - Create(ctx context.Context, m []*ObjectPutModel) error - Take(ctx context.Context, putID string) (*ObjectPutModel, error) - SetCompleted(ctx context.Context, putID string) error - FindExpirationPut(ctx context.Context, expirationTime time.Time, num int) ([]*ObjectPutModel, error) - DelPut(ctx context.Context, ids []string) error -} diff --git a/pkg/common/db/table/relation/user.go b/pkg/common/db/table/relation/user.go index 7d2bf0cf5..f44a610ad 100644 --- a/pkg/common/db/table/relation/user.go +++ b/pkg/common/db/table/relation/user.go @@ -28,7 +28,7 @@ type UserModel struct { Nickname string `gorm:"column:name;size:255"` FaceURL string `gorm:"column:face_url;size:255"` Ex string `gorm:"column:ex;size:1024"` - CreateTime time.Time `gorm:"column:create_time;index:create_time; autoCreateTime"` + CreateTime time.Time `gorm:"column:create_time;index:create_time;autoCreateTime"` AppMangerLevel int32 `gorm:"column:app_manger_level;default:18"` GlobalRecvMsgOpt int32 `gorm:"column:global_recv_msg_opt"` } @@ -66,7 +66,7 @@ type UserModelInterface interface { GetAllUserID(ctx context.Context) (userIDs []string, err error) GetUserGlobalRecvMsgOpt(ctx context.Context, userID string) (opt int, err error) // 获取用户总数 - CountTotal(ctx context.Context) (count int64, err error) + CountTotal(ctx context.Context, before *time.Time) (count int64, err error) // 获取范围内用户增量 CountRangeEverydayTotal(ctx context.Context, start time.Time, end time.Time) (map[string]int64, error) } diff --git a/pkg/common/db/table/unrelation/extend_msg_set.go b/pkg/common/db/table/unrelation/extend_msg_set.go deleted file mode 100644 index 472daf5fa..000000000 --- a/pkg/common/db/table/unrelation/extend_msg_set.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 unrelation - -import ( - "context" - "strconv" - "strings" - - "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" -) - -const ( - CExtendMsgSet = "extend_msgs" - - ExtendMsgMaxNum = 100 -) - -type ExtendMsgSetModel struct { - ConversationID string `bson:"source_id" json:"conversationID"` - SessionType int32 `bson:"session_type" json:"sessionType"` - ExtendMsgs map[string]ExtendMsgModel `bson:"extend_msgs" json:"extendMsgs"` - ExtendMsgNum int32 `bson:"extend_msg_num" json:"extendMsgNum"` - CreateTime int64 `bson:"create_time" json:"createTime"` // this block's create time - MaxMsgUpdateTime int64 `bson:"max_msg_update_time" json:"maxMsgUpdateTime"` // index find msg -} - -type KeyValueModel struct { - TypeKey string `bson:"type_key" json:"typeKey"` - Value string `bson:"value" json:"value"` - LatestUpdateTime int64 `bson:"latest_update_time" json:"latestUpdateTime"` -} - -type ExtendMsgModel struct { - ReactionExtensionList map[string]KeyValueModel `bson:"reaction_extension_list" json:"reactionExtensionList"` - ClientMsgID string `bson:"client_msg_id" json:"clientMsgID"` - MsgFirstModifyTime int64 `bson:"msg_first_modify_time" json:"msgFirstModifyTime"` // this extendMsg create time - AttachedInfo string `bson:"attached_info" json:"attachedInfo"` - Ex string `bson:"ex" json:"ex"` -} - -type ExtendMsgSetModelInterface interface { - CreateExtendMsgSet(ctx context.Context, set *ExtendMsgSetModel) error - GetAllExtendMsgSet( - ctx context.Context, - conversationID string, - opts *GetAllExtendMsgSetOpts, - ) (sets []*ExtendMsgSetModel, err error) - GetExtendMsgSet( - ctx context.Context, - conversationID string, - sessionType int32, - maxMsgUpdateTime int64, - ) (*ExtendMsgSetModel, error) - InsertExtendMsg(ctx context.Context, conversationID string, sessionType int32, msg *ExtendMsgModel) error - InsertOrUpdateReactionExtendMsgSet( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - msgFirstModifyTime int64, - reactionExtensionList map[string]*KeyValueModel, - ) error - DeleteReactionExtendMsgSet( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - msgFirstModifyTime int64, - reactionExtensionList map[string]*KeyValueModel, - ) error - TakeExtendMsg( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - maxMsgUpdateTime int64, - ) (extendMsg *ExtendMsgModel, err error) -} - -func (ExtendMsgSetModel) TableName() string { - return CExtendMsgSet -} - -func (ExtendMsgSetModel) GetExtendMsgMaxNum() int32 { - return ExtendMsgMaxNum -} - -func (ExtendMsgSetModel) GetConversationID(ID string, index int32) string { - return ID + ":" + strconv.Itoa(int(index)) -} - -func (e *ExtendMsgSetModel) SplitConversationIDAndGetIndex() int32 { - l := strings.Split(e.ConversationID, ":") - index, _ := strconv.Atoi(l[len(l)-1]) - return int32(index) -} - -type GetAllExtendMsgSetOpts struct { - ExcludeExtendMsgs bool -} - -func (ExtendMsgSetModel) Pb2Model(reactionExtensionList map[string]*sdkws.KeyValue) map[string]*KeyValueModel { - r := make(map[string]*KeyValueModel) - for key, value := range reactionExtensionList { - r[key] = &KeyValueModel{ - TypeKey: value.TypeKey, - Value: value.Value, - LatestUpdateTime: value.LatestUpdateTime, - } - } - return r -} diff --git a/pkg/common/db/table/unrelation/msg.go b/pkg/common/db/table/unrelation/msg.go index 57f9b4cca..e34bd374b 100644 --- a/pkg/common/db/table/unrelation/msg.go +++ b/pkg/common/db/table/unrelation/msg.go @@ -17,6 +17,7 @@ package unrelation import ( "context" "strconv" + "time" "go.mongodb.org/mongo-driver/mongo" @@ -36,7 +37,6 @@ type MsgDocModel struct { } type RevokeModel struct { - ID string `bson:"id"` Role int32 `bson:"role"` UserID string `bson:"user_id"` Nickname string `bson:"nickname"` @@ -83,6 +83,16 @@ type MsgInfoModel struct { IsRead bool `bson:"is_read"` } +type UserCount struct { + UserID string `bson:"user_id"` + Count int64 `bson:"count"` +} + +type GroupCount struct { + GroupID string `bson:"group_id"` + Count int64 `bson:"count"` +} + type MsgDocModelInterface interface { PushMsgsToDoc(ctx context.Context, docID string, msgsToMongo []MsgInfoModel) error Create(ctx context.Context, model *MsgDocModel) error @@ -98,6 +108,8 @@ type MsgDocModelInterface interface { GetMsgDocModelByIndex(ctx context.Context, conversationID string, index, sort int64) (*MsgDocModel, error) DeleteMsgsInOneDocByIndex(ctx context.Context, docID string, indexes []int) error MarkSingleChatMsgsAsRead(ctx context.Context, userID string, docID string, indexes []int64) error + RangeUserSendCount(ctx context.Context, start time.Time, end time.Time, group bool, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, users []*UserCount, dateCount map[string]int64, err error) + RangeGroupSendCount(ctx context.Context, start time.Time, end time.Time, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, groups []*GroupCount, dateCount map[string]int64, err error) } func (MsgDocModel) TableName() string { diff --git a/pkg/common/db/unrelation/extend_msg.go b/pkg/common/db/unrelation/extend_msg.go deleted file mode 100644 index 6f09247bc..000000000 --- a/pkg/common/db/unrelation/extend_msg.go +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 unrelation - -import ( - "context" - "errors" - "fmt" - - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/bson/primitive" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" - - unRelationTb "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/unrelation" - "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" -) - -type ExtendMsgSetMongoDriver struct { - mgoDB *mongo.Database - ExtendMsgSetCollection *mongo.Collection -} - -func NewExtendMsgSetMongoDriver(mgoDB *mongo.Database) unRelationTb.ExtendMsgSetModelInterface { - return &ExtendMsgSetMongoDriver{mgoDB: mgoDB, ExtendMsgSetCollection: mgoDB.Collection(unRelationTb.CExtendMsgSet)} -} - -func (e *ExtendMsgSetMongoDriver) CreateExtendMsgSet(ctx context.Context, set *unRelationTb.ExtendMsgSetModel) error { - _, err := e.ExtendMsgSetCollection.InsertOne(ctx, set) - return err -} - -func (e *ExtendMsgSetMongoDriver) GetAllExtendMsgSet( - ctx context.Context, - ID string, - opts *unRelationTb.GetAllExtendMsgSetOpts, -) (sets []*unRelationTb.ExtendMsgSetModel, err error) { - regex := fmt.Sprintf("^%s", ID) - var findOpts *options.FindOptions - if opts != nil { - if opts.ExcludeExtendMsgs { - findOpts = &options.FindOptions{} - findOpts.SetProjection(bson.M{"extend_msgs": 0}) - } - } - cursor, err := e.ExtendMsgSetCollection.Find(ctx, bson.M{"doc_id": primitive.Regex{Pattern: regex}}, findOpts) - if err != nil { - return nil, utils.Wrap(err, "") - } - err = cursor.All(ctx, &sets) - if err != nil { - return nil, utils.Wrap(err, fmt.Sprintf("cursor is %s", cursor.Current.String())) - } - return sets, nil -} - -func (e *ExtendMsgSetMongoDriver) GetExtendMsgSet( - ctx context.Context, - conversationID string, - sessionType int32, - maxMsgUpdateTime int64, -) (*unRelationTb.ExtendMsgSetModel, error) { - var err error - findOpts := options.Find(). - SetLimit(1). - SetSkip(0). - SetSort(bson.M{"source_id": -1}). - SetProjection(bson.M{"extend_msgs": 0}) - // update newest - find := bson.M{ - "source_id": primitive.Regex{Pattern: fmt.Sprintf("^%s", conversationID)}, - "session_type": sessionType, - } - if maxMsgUpdateTime > 0 { - find["max_msg_update_time"] = maxMsgUpdateTime - } - result, err := e.ExtendMsgSetCollection.Find(ctx, find, findOpts) - if err != nil { - return nil, utils.Wrap(err, "") - } - var setList []unRelationTb.ExtendMsgSetModel - if err := result.All(ctx, &setList); err != nil { - return nil, utils.Wrap(err, "") - } - if len(setList) == 0 { - return nil, nil - } - return &setList[0], nil -} - -// first modify msg -func (e *ExtendMsgSetMongoDriver) InsertExtendMsg( - ctx context.Context, - conversationID string, - sessionType int32, - msg *unRelationTb.ExtendMsgModel, -) error { - set, err := e.GetExtendMsgSet(ctx, conversationID, sessionType, 0) - if err != nil { - return utils.Wrap(err, "") - } - if set == nil || set.ExtendMsgNum >= set.GetExtendMsgMaxNum() { - var index int32 - if set != nil { - index = set.SplitConversationIDAndGetIndex() - } - err = e.CreateExtendMsgSet(ctx, &unRelationTb.ExtendMsgSetModel{ - ConversationID: set.GetConversationID(conversationID, index), - SessionType: sessionType, - ExtendMsgs: map[string]unRelationTb.ExtendMsgModel{msg.ClientMsgID: *msg}, - ExtendMsgNum: 1, - CreateTime: msg.MsgFirstModifyTime, - MaxMsgUpdateTime: msg.MsgFirstModifyTime, - }) - } else { - _, err = e.ExtendMsgSetCollection.UpdateOne(ctx, bson.M{"conversation_id": set.ConversationID, "session_type": sessionType}, bson.M{"$set": bson.M{"max_msg_update_time": msg.MsgFirstModifyTime, "$inc": bson.M{"extend_msg_num": 1}, fmt.Sprintf("extend_msgs.%s", msg.ClientMsgID): msg}}) - } - return utils.Wrap(err, "") -} - -// insert or update -func (e *ExtendMsgSetMongoDriver) InsertOrUpdateReactionExtendMsgSet( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - msgFirstModifyTime int64, - reactionExtensionList map[string]*unRelationTb.KeyValueModel, -) error { - var updateBson = bson.M{} - for _, v := range reactionExtensionList { - updateBson[fmt.Sprintf("extend_msgs.%s.%s", clientMsgID, v.TypeKey)] = v - } - upsert := true - opt := &options.UpdateOptions{ - Upsert: &upsert, - } - set, err := e.GetExtendMsgSet(ctx, conversationID, sessionType, msgFirstModifyTime) - if err != nil { - return utils.Wrap(err, "") - } - if set == nil { - return fmt.Errorf("conversationID %s has no set", conversationID) - } - _, err = e.ExtendMsgSetCollection.UpdateOne( - ctx, - bson.M{"source_id": set.ConversationID, "session_type": sessionType}, - bson.M{"$set": updateBson}, - opt, - ) - return utils.Wrap(err, "") -} - -// delete TypeKey -func (e *ExtendMsgSetMongoDriver) DeleteReactionExtendMsgSet( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - msgFirstModifyTime int64, - reactionExtensionList map[string]*unRelationTb.KeyValueModel, -) error { - var updateBson = bson.M{} - for _, v := range reactionExtensionList { - updateBson[fmt.Sprintf("extend_msgs.%s.%s", clientMsgID, v.TypeKey)] = "" - } - set, err := e.GetExtendMsgSet(ctx, conversationID, sessionType, msgFirstModifyTime) - if err != nil { - return utils.Wrap(err, "") - } - if set == nil { - return fmt.Errorf("conversationID %s has no set", conversationID) - } - _, err = e.ExtendMsgSetCollection.UpdateOne( - ctx, - bson.M{"source_id": set.ConversationID, "session_type": sessionType}, - bson.M{"$unset": updateBson}, - ) - return err -} - -func (e *ExtendMsgSetMongoDriver) TakeExtendMsg( - ctx context.Context, - conversationID string, - sessionType int32, - clientMsgID string, - maxMsgUpdateTime int64, -) (extendMsg *unRelationTb.ExtendMsgModel, err error) { - findOpts := options.Find(). - SetLimit(1). - SetSkip(0). - SetSort(bson.M{"source_id": -1}). - SetProjection(bson.M{fmt.Sprintf("extend_msgs.%s", clientMsgID): 1}) - regex := fmt.Sprintf("^%s", conversationID) - result, err := e.ExtendMsgSetCollection.Find( - ctx, - bson.M{ - "source_id": primitive.Regex{Pattern: regex}, - "session_type": sessionType, - "max_msg_update_time": bson.M{"$lte": maxMsgUpdateTime}, - }, - findOpts, - ) - if err != nil { - return nil, utils.Wrap(err, "") - } - var setList []unRelationTb.ExtendMsgSetModel - if err := result.All(ctx, &setList); err != nil { - return nil, utils.Wrap(err, "") - } - if len(setList) == 0 { - return nil, utils.Wrap(errors.New("GetExtendMsg failed, len(setList) == 0"), "") - } - if v, ok := setList[0].ExtendMsgs[clientMsgID]; ok { - return &v, nil - } - return nil, fmt.Errorf("cant find client msg id: %s", clientMsgID) -} diff --git a/pkg/common/db/unrelation/mongo.go b/pkg/common/db/unrelation/mongo.go index 51b9e4b7e..fd13bb2aa 100644 --- a/pkg/common/db/unrelation/mongo.go +++ b/pkg/common/db/unrelation/mongo.go @@ -94,10 +94,6 @@ func (m *Mongo) CreateSuperGroupIndex() error { return nil } -func (m *Mongo) CreateExtendMsgSetIndex() error { - return m.createMongoIndex(unrelation.CExtendMsgSet, true, "-create_time", "work_moment_id") -} - func (m *Mongo) createMongoIndex(collection string, isUnique bool, keys ...string) error { db := m.db.Database(config.Config.Mongo.Database).Collection(collection) opts := options.CreateIndexes().SetMaxTime(10 * time.Second) diff --git a/pkg/common/db/unrelation/msg.go b/pkg/common/db/unrelation/msg.go index cecbf2301..6c6d76216 100644 --- a/pkg/common/db/unrelation/msg.go +++ b/pkg/common/db/unrelation/msg.go @@ -19,6 +19,7 @@ import ( "encoding/json" "errors" "fmt" + "time" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" @@ -302,7 +303,7 @@ func (m *MsgMongoDriver) GetMsgBySeqIndexIn1Doc( } if msg.Revoke != nil { revokeContent := sdkws.MessageRevokedContent{ - RevokerID: msg.Revoke.ID, + RevokerID: msg.Revoke.UserID, RevokerRole: msg.Revoke.Role, ClientMsgID: msg.Msg.ClientMsgID, RevokerNickname: msg.Revoke.Nickname, @@ -368,3 +369,683 @@ func (m *MsgMongoDriver) MarkSingleChatMsgsAsRead( _, err := m.MsgCollection.BulkWrite(ctx, updates) return err } + +// RangeUserSendCount +// db.msg.aggregate([ +// +// { +// $match: { +// "msgs.msg.send_time": { +// "$gte": 0, +// "$lt": 1788122092317 +// } +// } +// }, +// { +// "$addFields": { +// "msgs": { +// "$filter": { +// "input": "$msgs", +// "as": "item", +// "cond": { +// "$and": [ +// { +// $gte: ["$$item.msg.send_time", 0] +// }, +// { +// $lt: ["$$item.msg.send_time", 1788122092317] +// } +// ] +// } +// } +// } +// } +// }, +// { +// "$project": { +// "_id": 0, +// +// }, +// +// }, +// { +// "$project": { +// "result": { +// "$map": { +// "input": "$msgs", +// "as": "item", +// "in": { +// user_id: "$$item.msg.send_id", +// send_date: { +// $dateToString: { +// format: "%Y-%m-%d", +// date: { +// $toDate: "$$item.msg.send_time" +// } +// } +// } +// } +// } +// } +// }, +// +// }, +// { +// "$unwind": "$result" +// }, +// { +// "$group": { +// _id: "$result.send_date", +// count: { +// $sum: 1 +// }, +// original: { +// $push: "$$ROOT" +// } +// } +// }, +// { +// "$addFields": { +// "dates": "$$ROOT" +// } +// }, +// { +// "$project": { +// "_id": 0, +// "count": 0, +// "dates.original": 0, +// +// }, +// +// }, +// { +// "$group": { +// _id: null, +// count: { +// $sum: 1 +// }, +// dates: { +// $push: "$dates" +// }, +// original: { +// $push: "$original" +// }, +// +// } +// }, +// { +// "$unwind": "$original" +// }, +// { +// "$unwind": "$original" +// }, +// { +// "$group": { +// _id: "$original.result.user_id", +// count: { +// $sum: 1 +// }, +// original: { +// $push: "$dates" +// }, +// +// } +// }, +// { +// "$addFields": { +// "dates": { +// $arrayElemAt: ["$original", 0] +// } +// } +// }, +// { +// "$project": { +// original: 0 +// } +// }, +// { +// $sort: { +// count: - 1 +// } +// }, +// { +// "$group": { +// _id: null, +// user_count: { +// $sum: 1 +// }, +// users: { +// $push: "$$ROOT" +// }, +// +// } +// }, +// { +// "$addFields": { +// "dates": { +// $arrayElemAt: ["$users", 0] +// } +// } +// }, +// { +// "$addFields": { +// "dates": "$dates.dates" +// } +// }, +// { +// "$project": { +// _id: 0, +// "users.dates": 0, +// +// } +// }, +// { +// "$addFields": { +// "msg_count": { +// $sum: "$users.count" +// } +// } +// }, +// { +// "$addFields": { +// users: { +// $slice: ["$users", 0, 10] +// } +// } +// } +// +// ]) +func (m *MsgMongoDriver) RangeUserSendCount(ctx context.Context, start time.Time, end time.Time, group bool, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, users []*table.UserCount, dateCount map[string]int64, err error) { + var sort int + if ase { + sort = 1 + } else { + sort = -1 + } + type Result struct { + MsgCount int64 `bson:"msg_count"` + UserCount int64 `bson:"user_count"` + Users []struct { + UserID string `bson:"_id"` + Count int64 `bson:"count"` + } `bson:"users"` + Dates []struct { + Date string `bson:"_id"` + Count int64 `bson:"count"` + } `bson:"dates"` + } + or := bson.A{ + bson.M{ + "doc_id": bson.M{ + "$regex": "^si_", + "$options": "i", + }, + }, + } + if group { + or = append(or, + bson.M{ + "doc_id": bson.M{ + "$regex": "^g_", + "$options": "i", + }, + }, + bson.M{ + "doc_id": bson.M{ + "$regex": "^sg_", + "$options": "i", + }, + }, + ) + } + pipeline := bson.A{ + bson.M{ + "$match": bson.M{ + "$and": bson.A{ + bson.M{ + "msgs.msg.send_time": bson.M{ + "$gte": start.UnixMilli(), + "$lt": end.UnixMilli(), + }, + }, + bson.M{ + "$or": or, + }, + }, + }, + }, + bson.M{ + "$addFields": bson.M{ + "msgs": bson.M{ + "$filter": bson.M{ + "input": "$msgs", + "as": "item", + "cond": bson.M{ + "$and": bson.A{ + bson.M{ + "$gte": bson.A{ + "$$item.msg.send_time", start.UnixMilli(), + }, + }, + bson.M{ + "$lt": bson.A{ + "$$item.msg.send_time", end.UnixMilli(), + }, + }, + }, + }, + }, + }, + }, + }, + bson.M{ + "$project": bson.M{ + "_id": 0, + }, + }, + bson.M{ + "$project": bson.M{ + "result": bson.M{ + "$map": bson.M{ + "input": "$msgs", + "as": "item", + "in": bson.M{ + "user_id": "$$item.msg.send_id", + "send_date": bson.M{ + "$dateToString": bson.M{ + "format": "%Y-%m-%d", + "date": bson.M{ + "$toDate": "$$item.msg.send_time", // 毫秒时间戳 + }, + }, + }, + }, + }, + }, + }, + }, + bson.M{ + "$unwind": "$result", + }, + bson.M{ + "$group": bson.M{ + "_id": "$result.send_date", + "count": bson.M{ + "$sum": 1, + }, + "original": bson.M{ + "$push": "$$ROOT", + }, + }, + }, + bson.M{ + "$addFields": bson.M{ + "dates": "$$ROOT", + }, + }, + bson.M{ + "$project": bson.M{ + "_id": 0, + "count": 0, + "dates.original": 0, + }, + }, + bson.M{ + "$group": bson.M{ + "_id": nil, + "count": bson.M{ + "$sum": 1, + }, + "dates": bson.M{ + "$push": "$dates", + }, + "original": bson.M{ + "$push": "$original", + }, + }, + }, + bson.M{ + "$unwind": "$original", + }, + bson.M{ + "$unwind": "$original", + }, + bson.M{ + "$group": bson.M{ + "_id": "$original.result.user_id", + "count": bson.M{ + "$sum": 1, + }, + "original": bson.M{ + "$push": "$dates", + }, + }, + }, + bson.M{ + "$addFields": bson.M{ + "dates": bson.M{ + "$arrayElemAt": bson.A{"$original", 0}, + }, + }, + }, + bson.M{ + "$project": bson.M{ + "original": 0, + }, + }, + bson.M{ + "$sort": bson.M{ + "count": sort, + }, + }, + bson.M{ + "$group": bson.M{ + "_id": nil, + "user_count": bson.M{ + "$sum": 1, + }, + "users": bson.M{ + "$push": "$$ROOT", + }, + }, + }, + bson.M{ + "$addFields": bson.M{ + "dates": bson.M{ + "$arrayElemAt": bson.A{"$users", 0}, + }, + }, + }, + bson.M{ + "$addFields": bson.M{ + "dates": "$dates.dates", + }, + }, + bson.M{ + "$project": bson.M{ + "_id": 0, + "users.dates": 0, + }, + }, + bson.M{ + "$addFields": bson.M{ + "msg_count": bson.M{ + "$sum": "$users.count", + }, + }, + }, + bson.M{ + "$addFields": bson.M{ + "users": bson.M{ + "$slice": bson.A{"$users", pageNumber - 1, showNumber}, + }, + }, + }, + } + cur, err := m.MsgCollection.Aggregate(ctx, pipeline, options.Aggregate().SetAllowDiskUse(true)) + if err != nil { + return 0, 0, nil, nil, errs.Wrap(err) + } + defer cur.Close(ctx) + var result []Result + if err := cur.All(ctx, &result); err != nil { + return 0, 0, nil, nil, errs.Wrap(err) + } + if len(result) == 0 { + return 0, 0, nil, nil, errs.Wrap(err) + } + users = make([]*table.UserCount, len(result[0].Users)) + for i, r := range result[0].Users { + users[i] = &table.UserCount{ + UserID: r.UserID, + Count: r.Count, + } + } + dateCount = make(map[string]int64) + for _, r := range result[0].Dates { + dateCount[r.Date] = r.Count + } + return result[0].MsgCount, result[0].UserCount, users, dateCount, nil +} + +func (m *MsgMongoDriver) RangeGroupSendCount(ctx context.Context, start time.Time, end time.Time, ase bool, pageNumber int32, showNumber int32) (msgCount int64, userCount int64, groups []*table.GroupCount, dateCount map[string]int64, err error) { + var sort int + if ase { + sort = 1 + } else { + sort = -1 + } + type Result struct { + MsgCount int64 `bson:"msg_count"` + UserCount int64 `bson:"user_count"` + Groups []struct { + GroupID string `bson:"_id"` + Count int64 `bson:"count"` + } `bson:"groups"` + Dates []struct { + Date string `bson:"_id"` + Count int64 `bson:"count"` + } `bson:"dates"` + } + pipeline := bson.A{ + bson.M{ + "$match": bson.M{ + "$and": bson.A{ + bson.M{ + "msgs.msg.send_time": bson.M{ + "$gte": start.UnixMilli(), + "$lt": end.UnixMilli(), + }, + }, + bson.M{ + "$or": bson.A{ + bson.M{ + "doc_id": bson.M{ + "$regex": "^g_", + "$options": "i", + }, + }, + bson.M{ + "doc_id": bson.M{ + "$regex": "^sg_", + "$options": "i", + }, + }, + }, + }, + }, + }, + }, + bson.M{ + "$addFields": bson.M{ + "msgs": bson.M{ + "$filter": bson.M{ + "input": "$msgs", + "as": "item", + "cond": bson.M{ + "$and": bson.A{ + bson.M{ + "$gte": bson.A{ + "$$item.msg.send_time", start.UnixMilli(), + }, + }, + bson.M{ + "$lt": bson.A{ + "$$item.msg.send_time", end.UnixMilli(), + }, + }, + }, + }, + }, + }, + }, + }, + bson.M{ + "$project": bson.M{ + "_id": 0, + }, + }, + bson.M{ + "$project": bson.M{ + "result": bson.M{ + "$map": bson.M{ + "input": "$msgs", + "as": "item", + "in": bson.M{ + "group_id": "$$item.msg.group_id", + "send_date": bson.M{ + "$dateToString": bson.M{ + "format": "%Y-%m-%d", + "date": bson.M{ + "$toDate": "$$item.msg.send_time", // 毫秒时间戳 + }, + }, + }, + }, + }, + }, + }, + }, + bson.M{ + "$unwind": "$result", + }, + bson.M{ + "$group": bson.M{ + "_id": "$result.send_date", + "count": bson.M{ + "$sum": 1, + }, + "original": bson.M{ + "$push": "$$ROOT", + }, + }, + }, + bson.M{ + "$addFields": bson.M{ + "dates": "$$ROOT", + }, + }, + bson.M{ + "$project": bson.M{ + "_id": 0, + "count": 0, + "dates.original": 0, + }, + }, + bson.M{ + "$group": bson.M{ + "_id": nil, + "count": bson.M{ + "$sum": 1, + }, + "dates": bson.M{ + "$push": "$dates", + }, + "original": bson.M{ + "$push": "$original", + }, + }, + }, + bson.M{ + "$unwind": "$original", + }, + bson.M{ + "$unwind": "$original", + }, + bson.M{ + "$group": bson.M{ + "_id": "$original.result.group_id", + "count": bson.M{ + "$sum": 1, + }, + "original": bson.M{ + "$push": "$dates", + }, + }, + }, + bson.M{ + "$addFields": bson.M{ + "dates": bson.M{ + "$arrayElemAt": bson.A{"$original", 0}, + }, + }, + }, + bson.M{ + "$project": bson.M{ + "original": 0, + }, + }, + bson.M{ + "$sort": bson.M{ + "count": sort, + }, + }, + bson.M{ + "$group": bson.M{ + "_id": nil, + "user_count": bson.M{ + "$sum": 1, + }, + "groups": bson.M{ + "$push": "$$ROOT", + }, + }, + }, + bson.M{ + "$addFields": bson.M{ + "dates": bson.M{ + "$arrayElemAt": bson.A{"$groups", 0}, + }, + }, + }, + bson.M{ + "$addFields": bson.M{ + "dates": "$dates.dates", + }, + }, + bson.M{ + "$project": bson.M{ + "_id": 0, + "groups.dates": 0, + }, + }, + bson.M{ + "$addFields": bson.M{ + "msg_count": bson.M{ + "$sum": "$groups.count", + }, + }, + }, + bson.M{ + "$addFields": bson.M{ + "groups": bson.M{ + "$slice": bson.A{"$groups", pageNumber - 1, showNumber}, + }, + }, + }, + } + cur, err := m.MsgCollection.Aggregate(ctx, pipeline, options.Aggregate().SetAllowDiskUse(true)) + if err != nil { + return 0, 0, nil, nil, errs.Wrap(err) + } + defer cur.Close(ctx) + var result []Result + if err := cur.All(ctx, &result); err != nil { + return 0, 0, nil, nil, errs.Wrap(err) + } + if len(result) == 0 { + return 0, 0, nil, nil, errs.Wrap(err) + } + groups = make([]*table.GroupCount, len(result[0].Groups)) + for i, r := range result[0].Groups { + groups[i] = &table.GroupCount{ + GroupID: r.GroupID, + Count: r.Count, + } + } + dateCount = make(map[string]int64) + for _, r := range result[0].Dates { + dateCount[r.Date] = r.Count + } + return result[0].MsgCount, result[0].UserCount, groups, dateCount, nil +} diff --git a/pkg/common/log/sql_logger.go b/pkg/common/log/sql_logger.go index 40b483474..9e9bb1be6 100644 --- a/pkg/common/log/sql_logger.go +++ b/pkg/common/log/sql_logger.go @@ -1,17 +1,3 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 log import ( @@ -31,11 +17,7 @@ type SqlLogger struct { SlowThreshold time.Duration } -func NewSqlLogger( - logLevel gormLogger.LogLevel, - ignoreRecordNotFoundError bool, - slowThreshold time.Duration, -) *SqlLogger { +func NewSqlLogger(logLevel gormLogger.LogLevel, ignoreRecordNotFoundError bool, slowThreshold time.Duration) *SqlLogger { return &SqlLogger{ LogLevel: logLevel, IgnoreRecordNotFoundError: ignoreRecordNotFoundError, @@ -70,17 +52,7 @@ func (l *SqlLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql s case err != nil && l.LogLevel >= gormLogger.Error && (!errors.Is(err, gorm.ErrRecordNotFound) || !l.IgnoreRecordNotFoundError): sql, rows := fc() if rows == -1 { - ZError( - ctx, - "sql exec detail", - err, - "gorm", - gormUtils.FileWithLineNum(), - "elapsed time", - fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), - "sql", - sql, - ) + ZError(ctx, "sql exec detail", err, "gorm", gormUtils.FileWithLineNum(), "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "sql", sql) } else { ZError(ctx, "sql exec detail", err, "gorm", gormUtils.FileWithLineNum(), "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "rows", rows, "sql", sql) } @@ -88,36 +60,14 @@ func (l *SqlLogger) Trace(ctx context.Context, begin time.Time, fc func() (sql s sql, rows := fc() slowLog := fmt.Sprintf("SLOW SQL >= %v", l.SlowThreshold) if rows == -1 { - ZWarn( - ctx, - "sql exec detail", - nil, - "gorm", - gormUtils.FileWithLineNum(), - nil, - "slow sql", - slowLog, - "elapsed time", - fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), - "sql", - sql, - ) + ZWarn(ctx, "sql exec detail", nil, "gorm", gormUtils.FileWithLineNum(), "slow sql", slowLog, "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "sql", sql) } else { - ZWarn(ctx, "sql exec detail", nil, "gorm", gormUtils.FileWithLineNum(), nil, "slow sql", slowLog, "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "rows", rows, "sql", sql) + ZWarn(ctx, "sql exec detail", nil, "gorm", gormUtils.FileWithLineNum(), "slow sql", slowLog, "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "rows", rows, "sql", sql) } case l.LogLevel == gormLogger.Info: sql, rows := fc() if rows == -1 { - ZDebug( - ctx, - "sql exec detail", - "gorm", - gormUtils.FileWithLineNum(), - "elapsed time", - fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), - "sql", - sql, - ) + ZDebug(ctx, "sql exec detail", "gorm", gormUtils.FileWithLineNum(), "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "sql", sql) } else { ZDebug(ctx, "sql exec detail", "gorm", gormUtils.FileWithLineNum(), "elapsed time", fmt.Sprintf("%f(ms)", float64(elapsed.Nanoseconds())/1e6), "rows", rows, "sql", sql) } diff --git a/pkg/common/mw/rpc_client_interceptor.go b/pkg/common/mw/rpc_client_interceptor.go index 40933810c..ebfcda99d 100644 --- a/pkg/common/mw/rpc_client_interceptor.go +++ b/pkg/common/mw/rpc_client_interceptor.go @@ -31,7 +31,7 @@ import ( ) func GrpcClient() grpc.DialOption { - return grpc.WithUnaryInterceptor(RpcClientInterceptor) + return grpc.WithChainUnaryInterceptor(RpcClientInterceptor) } func RpcClientInterceptor( diff --git a/pkg/common/mw/rpc_server_interceptor.go b/pkg/common/mw/rpc_server_interceptor.go index 01eb77b89..da99275fd 100644 --- a/pkg/common/mw/rpc_server_interceptor.go +++ b/pkg/common/mw/rpc_server_interceptor.go @@ -52,7 +52,6 @@ func RpcServerInterceptor( handler grpc.UnaryHandler, ) (resp interface{}, err error) { log.ZDebug(ctx, "rpc server req", "req", rpcString(req)) - //defer func() { // if r := recover(); r != nil { // log.ZError(ctx, "rpc panic", nil, "FullMethod", info.FullMethod, "type:", fmt.Sprintf("%T", r), "panic:", r) @@ -177,12 +176,13 @@ func RpcServerInterceptor( } details, err := grpcStatus.WithDetails(errInfo) if err != nil { - panic(err) + log.ZWarn(ctx, "rpc server resp WithDetails error", err, "funcName", funcName) + return nil, errs.Wrap(err) } log.ZWarn(ctx, "rpc server resp", err, "funcName", funcName) return nil, details.Err() } func GrpcServer() grpc.ServerOption { - return grpc.UnaryInterceptor(RpcServerInterceptor) + return grpc.ChainUnaryInterceptor(RpcServerInterceptor) } diff --git a/pkg/common/tokenverify/jwt_token.go b/pkg/common/tokenverify/jwt_token.go index 30e9ac9d1..68fee2602 100644 --- a/pkg/common/tokenverify/jwt_token.go +++ b/pkg/common/tokenverify/jwt_token.go @@ -84,7 +84,7 @@ func CheckAccessV3(ctx context.Context, ownerUserID string) (err error) { if opUserID == ownerUserID { return nil } - return errs.ErrIdentity.Wrap(utils.GetSelfFuncName()) + return errs.ErrNoPermission.Wrap(utils.GetSelfFuncName()) } func IsAppManagerUid(ctx context.Context) bool { @@ -95,7 +95,7 @@ func CheckAdmin(ctx context.Context) error { if utils.IsContain(mcontext.GetOpUserID(ctx), config.Config.Manager.UserID) { return nil } - return errs.ErrIdentity.Wrap(fmt.Sprintf("user %s is not admin userID", mcontext.GetOpUserID(ctx))) + return errs.ErrNoPermission.Wrap(fmt.Sprintf("user %s is not admin userID", mcontext.GetOpUserID(ctx))) } func ParseRedisInterfaceToken(redisToken interface{}) (*Claims, error) { diff --git a/pkg/discoveryregistry/discovery_register.go b/pkg/discoveryregistry/discovery_register.go index 50e720f97..4ebabe7a8 100644 --- a/pkg/discoveryregistry/discovery_register.go +++ b/pkg/discoveryregistry/discovery_register.go @@ -18,7 +18,6 @@ import ( "context" "google.golang.org/grpc" - "google.golang.org/grpc/resolver" ) type Conn interface { @@ -27,7 +26,7 @@ type Conn interface { AddOption(opts ...grpc.DialOption) CloseConn(conn grpc.ClientConnInterface) // do not use this method for call rpc - GetClientLocalConns() map[string][]resolver.Address + GetClientLocalConns() map[string][]grpc.ClientConnInterface } type SvcDiscoveryRegistry interface { diff --git a/pkg/discoveryregistry/zookeeper/discover.go b/pkg/discoveryregistry/zookeeper/discover.go index 3966d315c..a9848ee32 100644 --- a/pkg/discoveryregistry/zookeeper/discover.go +++ b/pkg/discoveryregistry/zookeeper/discover.go @@ -1,17 +1,3 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 zookeeper import ( @@ -20,9 +6,9 @@ import ( "io" "strings" - "github.com/pkg/errors" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" + "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" + "github.com/pkg/errors" "github.com/go-zookeeper/zk" "google.golang.org/grpc" @@ -76,64 +62,44 @@ func (s *ZkClient) GetConnsRemote(serviceName string) (conns []resolver.Address, } return nil, errors.Wrap(err, "get children error") } - log.ZDebug(context.Background(), "get conns from remote", "conn", string(data)) + log.ZDebug(context.Background(), "get addrs from remote", "conn", string(data)) conns = append(conns, resolver.Address{Addr: string(data), ServerName: serviceName}) } } return conns, nil } -func (s *ZkClient) GetConns( - ctx context.Context, - serviceName string, - opts ...grpc.DialOption, -) ([]grpc.ClientConnInterface, error) { +func (s *ZkClient) GetConns(ctx context.Context, serviceName string, opts ...grpc.DialOption) ([]grpc.ClientConnInterface, error) { s.logger.Printf("get conns from client, serviceName: %s", serviceName) - s.lock.Lock() opts = append(s.options, opts...) + s.lock.Lock() + defer s.lock.Unlock() conns := s.localConns[serviceName] if len(conns) == 0 { var err error s.logger.Printf("get conns from zk remote, serviceName: %s", serviceName) - conns, err = s.GetConnsRemote(serviceName) + addrs, err := s.GetConnsRemote(serviceName) if err != nil { - s.lock.Unlock() return nil, err } - if len(conns) == 0 { - return nil, fmt.Errorf( - "no conn for service %s, grpc server may not exist, local conn is %v, please check zookeeper server %v, path: %s", - serviceName, - s.localConns, - s.zkServers, - s.zkRoot, - ) + if len(addrs) == 0 { + return nil, fmt.Errorf("no conn for service %s, grpc server may not exist, local conn is %v, please check zookeeper server %v, path: %s", serviceName, s.localConns, s.zkServers, s.zkRoot) } - s.localConns[serviceName] = conns - } - s.lock.Unlock() - var ret []grpc.ClientConnInterface - s.logger.Printf("get conns from zk success, serviceName: %s", serviceName) - for _, conn := range conns { - cc, err := grpc.DialContext(ctx, conn.Addr, append(s.options, opts...)...) - if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf("conns dialContext error, conn: %s", conn.Addr)) + for _, addr := range addrs { + cc, err := grpc.DialContext(ctx, addr.Addr, append(s.options, opts...)...) + if err != nil { + log.ZError(context.Background(), "dialContext failed", err, "addr", addr.Addr, "opts", append(s.options, opts...)) + return nil, errs.Wrap(err) + } + conns = append(conns, cc) } - ret = append(ret, cc) + s.localConns[serviceName] = conns } - s.logger.Printf("dial ctx success, serviceName: %s", serviceName) - return ret, nil + return conns, nil } -func (s *ZkClient) GetConn( - ctx context.Context, - serviceName string, - opts ...grpc.DialOption, -) (grpc.ClientConnInterface, error) { - newOpts := append( - s.options, - grpc.WithDefaultServiceConfig(fmt.Sprintf(`{"LoadBalancingPolicy": "%s"}`, s.balancerName)), - ) +func (s *ZkClient) GetConn(ctx context.Context, serviceName string, opts ...grpc.DialOption) (grpc.ClientConnInterface, error) { + newOpts := append(s.options, grpc.WithDefaultServiceConfig(fmt.Sprintf(`{"LoadBalancingPolicy": "%s"}`, s.balancerName))) s.logger.Printf("get conn from client, serviceName: %s", serviceName) return grpc.DialContext(ctx, fmt.Sprintf("%s:///%s", s.scheme, serviceName), append(newOpts, opts...)...) } diff --git a/pkg/discoveryregistry/zookeeper/register.go b/pkg/discoveryregistry/zookeeper/register.go index 1531980bb..fec72538d 100644 --- a/pkg/discoveryregistry/zookeeper/register.go +++ b/pkg/discoveryregistry/zookeeper/register.go @@ -19,7 +19,6 @@ import ( "github.com/go-zookeeper/zk" "google.golang.org/grpc" - "google.golang.org/grpc/resolver" ) func (s *ZkClient) CreateRpcRootNodes(serviceNames []string) error { @@ -61,7 +60,7 @@ func (s *ZkClient) UnRegister() error { } time.Sleep(time.Second) s.node = "" - s.localConns = make(map[string][]resolver.Address) + s.localConns = make(map[string][]grpc.ClientConnInterface) s.resolvers = make(map[string]*Resolver) return nil } diff --git a/pkg/discoveryregistry/zookeeper/zk.go b/pkg/discoveryregistry/zookeeper/zk.go index b9b68c528..a3b02b12e 100644 --- a/pkg/discoveryregistry/zookeeper/zk.go +++ b/pkg/discoveryregistry/zookeeper/zk.go @@ -51,8 +51,9 @@ type ZkClient struct { lock sync.Locker options []grpc.DialOption - resolvers map[string]*Resolver - localConns map[string][]resolver.Address + resolvers map[string]*Resolver + localConns map[string][]grpc.ClientConnInterface + balancerName string logger Logger @@ -103,7 +104,7 @@ func NewClient(zkServers []string, zkRoot string, options ...ZkOption) (*ZkClien zkRoot: "/", scheme: zkRoot, timeout: timeout, - localConns: make(map[string][]resolver.Address), + localConns: make(map[string][]grpc.ClientConnInterface), resolvers: make(map[string]*Resolver), lock: &sync.Mutex{}, } @@ -216,6 +217,6 @@ func (s *ZkClient) AddOption(opts ...grpc.DialOption) { s.options = append(s.options, opts...) } -func (s *ZkClient) GetClientLocalConns() map[string][]resolver.Address { +func (s *ZkClient) GetClientLocalConns() map[string][]grpc.ClientConnInterface { return s.localConns } diff --git a/pkg/errs/code.go b/pkg/errs/code.go index b153e4e40..3cd66611d 100644 --- a/pkg/errs/code.go +++ b/pkg/errs/code.go @@ -36,17 +36,12 @@ const ( // 通用错误码 const ( - NoError = 0 //无错误 - DatabaseError = 90002 //redis/mysql等db错误 - NetworkError = 90004 //网络错误 - IdentityError = 90008 // 身份错误 非管理员token,且token中userID与请求userID不一致 - GRPCConnIsNil = 90006 //grpc连接空 - DefaultOtherError = 90006 //其他错误 - DataError = 90007 //数据错误 - ConfigError = 90009 - CallbackError = 80000 - RelationshipAlreadyError = 92001 //已经是好友关系(或者黑名单) - NotRelationshipYetError = 92002 //不是好友关系(或者黑名单) + NoError = 0 //无错误 + DatabaseError = 90002 //redis/mysql等db错误 + NetworkError = 90004 //网络错误 + DataError = 90007 //数据错误 + + CallbackError = 80000 //通用错误码 ServerInternalError = 500 //服务器内部错误 @@ -57,50 +52,41 @@ const ( // 账号错误码 UserIDNotFoundError = 1101 //UserID不存在 或未注册 - UserIDExisted = 1102 //UserID已存在 - RegisteredAlreadyError = 1103 //用户已经注册过了 + RegisteredAlreadyError = 1102 //用户已经注册过了 // 群组错误码 - GroupIDNotFoundError = 1201 //GroupID不存在 - GroupIDExisted = 1202 //GroupID已存在 - OnlyOneOwnerError = 1203 //只能有一个群主 - InGroupAlreadyError = 1204 //已在群组中 - NotInGroupYetError = 1205 //不在群组中 - DismissedAlreadyError = 1206 //群组已经解散 - OwnerNotAllowedQuitError = 1207 //群主不能退群 - GroupTypeNotSupport = 1208 - GroupNoOwner = 1209 - GroupRequestHandled = 1210 + GroupIDNotFoundError = 1201 //GroupID不存在 + GroupIDExisted = 1202 //GroupID已存在 + NotInGroupYetError = 1203 //不在群组中 + DismissedAlreadyError = 1204 //群组已经解散 + GroupTypeNotSupport = 1205 + GroupRequestHandled = 1206 // 关系链错误码 - CanNotAddYourselfError = 1301 //不能添加自己为好友 - BlockedByPeer = 1302 //被对方拉黑 - NotPeersFriend = 1303 //不是对方的好友 + CanNotAddYourselfError = 1301 //不能添加自己为好友 + BlockedByPeer = 1302 //被对方拉黑 + NotPeersFriend = 1303 //不是对方的好友 + RelationshipAlreadyError = 1304 //已经是好友关系 // 消息错误码 MessageHasReadDisable = 1401 MutedInGroup = 1402 //群成员被禁言 MutedGroup = 1403 //群被禁言 - UserNotRecvMsg = 1404 //用户设置了不接收消息 - MsgAlreadyRevoke = 1405 //消息已撤回 + MsgAlreadyRevoke = 1404 //消息已撤回 // token错误码 - TokenExpiredError = 1501 - TokenInvalidError = 1502 - TokenMalformedError = 1503 - TokenNotValidYetError = 1504 - TokenUnknownError = 1505 - TokenKickedError = 1506 - TokenDifferentPlatformIDError = 1507 - TokenDifferentUserIDError = 1508 - TokenNotExistError = 1509 + TokenExpiredError = 1501 + TokenInvalidError = 1502 + TokenMalformedError = 1503 + TokenNotValidYetError = 1504 + TokenUnknownError = 1505 + TokenKickedError = 1506 + TokenNotExistError = 1507 // 长连接网关错误码 ConnOverMaxNumLimit = 1601 ConnArgsErr = 1602 - ConnUpdateErr = 1603 // S3错误码 - FileUploadedCompleteError = 1701 // 文件已上传 - FileUploadedExpiredError = 1702 // 上传过期 + FileUploadedExpiredError = 1701 // 上传过期 ) diff --git a/pkg/errs/predefine.go b/pkg/errs/predefine.go index 4890a0996..16525420c 100644 --- a/pkg/errs/predefine.go +++ b/pkg/errs/predefine.go @@ -16,66 +16,49 @@ package errs var ( ErrArgs = NewCodeError(ArgsError, "ArgsError") + ErrNoPermission = NewCodeError(NoPermissionError, "NoPermissionError") ErrDatabase = NewCodeError(DatabaseError, "DatabaseError") ErrInternalServer = NewCodeError(ServerInternalError, "ServerInternalError") ErrNetwork = NewCodeError(NetworkError, "NetworkError") - ErrNoPermission = NewCodeError(NoPermissionError, "NoPermissionError") - ErrIdentity = NewCodeError(IdentityError, "IdentityError") ErrCallback = NewCodeError(CallbackError, "CallbackError") ErrCallbackContinue = NewCodeError(CallbackError, "ErrCallbackContinue") ErrUserIDNotFound = NewCodeError(UserIDNotFoundError, "UserIDNotFoundError") ErrGroupIDNotFound = NewCodeError(GroupIDNotFoundError, "GroupIDNotFoundError") ErrGroupIDExisted = NewCodeError(GroupIDExisted, "GroupIDExisted") - ErrUserIDExisted = NewCodeError(UserIDExisted, "UserIDExisted") ErrRecordNotFound = NewCodeError(RecordNotFoundError, "RecordNotFoundError") - ErrRelationshipAlready = NewCodeError(RelationshipAlreadyError, "RelationshipAlreadyError") - ErrNotRelationshipYet = NewCodeError(NotRelationshipYetError, "NotRelationshipYetError") - ErrCanNotAddYourself = NewCodeError(CanNotAddYourselfError, "CanNotAddYourselfError") - - ErrOnlyOneOwner = NewCodeError(OnlyOneOwnerError, "OnlyOneOwnerError") - ErrInGroupAlready = NewCodeError(InGroupAlreadyError, "InGroupAlreadyError") ErrNotInGroupYet = NewCodeError(NotInGroupYetError, "NotInGroupYetError") ErrDismissedAlready = NewCodeError(DismissedAlreadyError, "DismissedAlreadyError") - ErrOwnerNotAllowedQuit = NewCodeError(OwnerNotAllowedQuitError, "OwnerNotAllowedQuitError") ErrRegisteredAlready = NewCodeError(RegisteredAlreadyError, "RegisteredAlreadyError") ErrGroupTypeNotSupport = NewCodeError(GroupTypeNotSupport, "") - ErrGroupNoOwner = NewCodeError(GroupNoOwner, "ErrGroupNoOwner") + ErrGroupRequestHandled = NewCodeError(GroupRequestHandled, "GroupRequestHandled") - ErrDefaultOther = NewCodeError(DefaultOtherError, "DefaultOtherError") - ErrData = NewCodeError(DataError, "DataError") - ErrTokenExpired = NewCodeError(TokenExpiredError, "TokenExpiredError") - ErrTokenInvalid = NewCodeError(TokenInvalidError, "TokenInvalidError") // - ErrTokenMalformed = NewCodeError(TokenMalformedError, "TokenMalformedError") //格式错误 - ErrTokenNotValidYet = NewCodeError(TokenNotValidYetError, "TokenNotValidYetError") //还未生效 - ErrTokenUnknown = NewCodeError(TokenUnknownError, "TokenUnknownError") //未知错误 - ErrTokenKicked = NewCodeError(TokenKickedError, "TokenKickedError") - ErrTokenNotExist = NewCodeError(TokenNotExistError, "TokenNotExistError") //在redis中不存在 - ErrTokenDifferentPlatformID = NewCodeError(TokenDifferentPlatformIDError, "TokenDifferentPlatformIDError") - ErrTokenDifferentUserID = NewCodeError(TokenDifferentUserIDError, "TokenDifferentUserIDError") - ErrDuplicateKey = NewCodeError(DuplicateKeyError, "DuplicateKeyError") + ErrData = NewCodeError(DataError, "DataError") + ErrTokenExpired = NewCodeError(TokenExpiredError, "TokenExpiredError") + ErrTokenInvalid = NewCodeError(TokenInvalidError, "TokenInvalidError") // + ErrTokenMalformed = NewCodeError(TokenMalformedError, "TokenMalformedError") //格式错误 + ErrTokenNotValidYet = NewCodeError(TokenNotValidYetError, "TokenNotValidYetError") //还未生效 + ErrTokenUnknown = NewCodeError(TokenUnknownError, "TokenUnknownError") //未知错误 + ErrTokenKicked = NewCodeError(TokenKickedError, "TokenKickedError") + ErrTokenNotExist = NewCodeError(TokenNotExistError, "TokenNotExistError") //在redis中不存在 + ErrDuplicateKey = NewCodeError(DuplicateKeyError, "DuplicateKeyError") ErrMessageHasReadDisable = NewCodeError(MessageHasReadDisable, "MessageHasReadDisable") - ErrBlockedByPeer = NewCodeError(BlockedByPeer, "BlockedByPeer") - //不是对方的好友 - ErrNotPeersFriend = NewCodeError(NotPeersFriend, "NotPeersFriend") + ErrCanNotAddYourself = NewCodeError(CanNotAddYourselfError, "CanNotAddYourselfError") + ErrBlockedByPeer = NewCodeError(BlockedByPeer, "BlockedByPeer") + ErrNotPeersFriend = NewCodeError(NotPeersFriend, "NotPeersFriend") + ErrRelationshipAlready = NewCodeError(RelationshipAlreadyError, "RelationshipAlreadyError") ErrMutedInGroup = NewCodeError(MutedInGroup, "MutedInGroup") ErrMutedGroup = NewCodeError(MutedGroup, "MutedGroup") - ErrUserNotRecvMsg = NewCodeError(UserNotRecvMsg, "UserNotRecvMsg") ErrMsgAlreadyRevoke = NewCodeError(MsgAlreadyRevoke, "MsgAlreadyRevoke") ErrConnOverMaxNumLimit = NewCodeError(ConnOverMaxNumLimit, "ConnOverMaxNumLimit") - ErrConnArgsErr = NewCodeError(ConnArgsErr, "args err, need token, sendID, platformID") - ErrConnUpdateErr = NewCodeError(ConnArgsErr, "upgrade http conn err") - - ErrConfig = NewCodeError(ConfigError, "ConfigError") + ErrConnArgsErr = NewCodeError(ConnArgsErr, "args err, need token, sendID, platformID") - ErrFileUploadedComplete = NewCodeError(FileUploadedCompleteError, "FileUploadedComplete") - ErrFileUploadedExpired = NewCodeError(FileUploadedExpiredError, "FileUploadedExpiredError") - ErrGroupRequestHandled = NewCodeError(GroupRequestHandled, "GroupRequestHandled") + ErrFileUploadedExpired = NewCodeError(FileUploadedExpiredError, "FileUploadedExpiredError") ) diff --git a/pkg/errs/relation.go b/pkg/errs/relation.go index 76578f4bb..0a7ad4997 100644 --- a/pkg/errs/relation.go +++ b/pkg/errs/relation.go @@ -19,7 +19,6 @@ var Relation = &relation{m: make(map[int]map[int]struct{})} func init() { Relation.Add(RecordNotFoundError, UserIDNotFoundError) Relation.Add(RecordNotFoundError, GroupIDNotFoundError) - Relation.Add(DuplicateKeyError, UserIDExisted) Relation.Add(DuplicateKeyError, GroupIDExisted) } diff --git a/pkg/proto/conversation/conversation.pb.go b/pkg/proto/conversation/conversation.pb.go index debced9b9..7ec352420 100644 --- a/pkg/proto/conversation/conversation.pb.go +++ b/pkg/proto/conversation/conversation.pb.go @@ -32,20 +32,23 @@ type Conversation struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - OwnerUserID string `protobuf:"bytes,1,opt,name=ownerUserID,proto3" json:"ownerUserID"` - ConversationID string `protobuf:"bytes,2,opt,name=conversationID,proto3" json:"conversationID"` - RecvMsgOpt int32 `protobuf:"varint,3,opt,name=recvMsgOpt,proto3" json:"recvMsgOpt"` - ConversationType int32 `protobuf:"varint,4,opt,name=conversationType,proto3" json:"conversationType"` - UserID string `protobuf:"bytes,5,opt,name=userID,proto3" json:"userID"` - GroupID string `protobuf:"bytes,6,opt,name=groupID,proto3" json:"groupID"` - IsPinned bool `protobuf:"varint,7,opt,name=isPinned,proto3" json:"isPinned"` - AttachedInfo string `protobuf:"bytes,8,opt,name=attachedInfo,proto3" json:"attachedInfo"` - IsPrivateChat bool `protobuf:"varint,9,opt,name=isPrivateChat,proto3" json:"isPrivateChat"` - GroupAtType int32 `protobuf:"varint,10,opt,name=groupAtType,proto3" json:"groupAtType"` - Ex string `protobuf:"bytes,11,opt,name=ex,proto3" json:"ex"` - BurnDuration int32 `protobuf:"varint,12,opt,name=burnDuration,proto3" json:"burnDuration"` - MinSeq int64 `protobuf:"varint,13,opt,name=minSeq,proto3" json:"minSeq"` - MaxSeq int64 `protobuf:"varint,14,opt,name=maxSeq,proto3" json:"maxSeq"` + OwnerUserID string `protobuf:"bytes,1,opt,name=ownerUserID,proto3" json:"ownerUserID"` + ConversationID string `protobuf:"bytes,2,opt,name=conversationID,proto3" json:"conversationID"` + RecvMsgOpt int32 `protobuf:"varint,3,opt,name=recvMsgOpt,proto3" json:"recvMsgOpt"` + ConversationType int32 `protobuf:"varint,4,opt,name=conversationType,proto3" json:"conversationType"` + UserID string `protobuf:"bytes,5,opt,name=userID,proto3" json:"userID"` + GroupID string `protobuf:"bytes,6,opt,name=groupID,proto3" json:"groupID"` + IsPinned bool `protobuf:"varint,7,opt,name=isPinned,proto3" json:"isPinned"` + AttachedInfo string `protobuf:"bytes,8,opt,name=attachedInfo,proto3" json:"attachedInfo"` + IsPrivateChat bool `protobuf:"varint,9,opt,name=isPrivateChat,proto3" json:"isPrivateChat"` + GroupAtType int32 `protobuf:"varint,10,opt,name=groupAtType,proto3" json:"groupAtType"` + Ex string `protobuf:"bytes,11,opt,name=ex,proto3" json:"ex"` + BurnDuration int32 `protobuf:"varint,12,opt,name=burnDuration,proto3" json:"burnDuration"` + MinSeq int64 `protobuf:"varint,13,opt,name=minSeq,proto3" json:"minSeq"` + MaxSeq int64 `protobuf:"varint,14,opt,name=maxSeq,proto3" json:"maxSeq"` + MsgDestructTime int64 `protobuf:"varint,15,opt,name=msgDestructTime,proto3" json:"msgDestructTime"` + LatestMsgDestructTime int64 `protobuf:"varint,16,opt,name=latestMsgDestructTime,proto3" json:"latestMsgDestructTime"` + IsMsgDestruct bool `protobuf:"varint,17,opt,name=isMsgDestruct,proto3" json:"isMsgDestruct"` } func (x *Conversation) Reset() { @@ -178,6 +181,27 @@ func (x *Conversation) GetMaxSeq() int64 { return 0 } +func (x *Conversation) GetMsgDestructTime() int64 { + if x != nil { + return x.MsgDestructTime + } + return 0 +} + +func (x *Conversation) GetLatestMsgDestructTime() int64 { + if x != nil { + return x.LatestMsgDestructTime + } + return 0 +} + +func (x *Conversation) GetIsMsgDestruct() bool { + if x != nil { + return x.IsMsgDestruct + } + return false +} + type ConversationReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -196,6 +220,8 @@ type ConversationReq struct { MinSeq *wrapperspb.Int64Value `protobuf:"bytes,11,opt,name=minSeq,proto3" json:"minSeq"` MaxSeq *wrapperspb.Int64Value `protobuf:"bytes,12,opt,name=maxSeq,proto3" json:"maxSeq"` GroupAtType *wrapperspb.Int32Value `protobuf:"bytes,13,opt,name=groupAtType,proto3" json:"groupAtType"` + MsgDestructTime *wrapperspb.Int64Value `protobuf:"bytes,14,opt,name=msgDestructTime,proto3" json:"msgDestructTime"` + IsMsgDestruct *wrapperspb.BoolValue `protobuf:"bytes,15,opt,name=isMsgDestruct,proto3" json:"isMsgDestruct"` } func (x *ConversationReq) Reset() { @@ -321,107 +347,20 @@ func (x *ConversationReq) GetGroupAtType() *wrapperspb.Int32Value { return nil } -type ModifyConversationFieldReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - UserIDList []string `protobuf:"bytes,1,rep,name=userIDList,proto3" json:"userIDList"` - FieldType int32 `protobuf:"varint,2,opt,name=FieldType,proto3" json:"FieldType"` - Conversation *Conversation `protobuf:"bytes,3,opt,name=conversation,proto3" json:"conversation"` -} - -func (x *ModifyConversationFieldReq) Reset() { - *x = ModifyConversationFieldReq{} - if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ModifyConversationFieldReq) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ModifyConversationFieldReq) ProtoMessage() {} - -func (x *ModifyConversationFieldReq) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ModifyConversationFieldReq.ProtoReflect.Descriptor instead. -func (*ModifyConversationFieldReq) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{2} -} - -func (x *ModifyConversationFieldReq) GetUserIDList() []string { +func (x *ConversationReq) GetMsgDestructTime() *wrapperspb.Int64Value { if x != nil { - return x.UserIDList + return x.MsgDestructTime } return nil } -func (x *ModifyConversationFieldReq) GetFieldType() int32 { - if x != nil { - return x.FieldType - } - return 0 -} - -func (x *ModifyConversationFieldReq) GetConversation() *Conversation { +func (x *ConversationReq) GetIsMsgDestruct() *wrapperspb.BoolValue { if x != nil { - return x.Conversation + return x.IsMsgDestruct } return nil } -type ModifyConversationFieldResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *ModifyConversationFieldResp) Reset() { - *x = ModifyConversationFieldResp{} - if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ModifyConversationFieldResp) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ModifyConversationFieldResp) ProtoMessage() {} - -func (x *ModifyConversationFieldResp) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ModifyConversationFieldResp.ProtoReflect.Descriptor instead. -func (*ModifyConversationFieldResp) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{3} -} - type SetConversationReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -433,7 +372,7 @@ type SetConversationReq struct { func (x *SetConversationReq) Reset() { *x = SetConversationReq{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[4] + mi := &file_conversation_conversation_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -446,7 +385,7 @@ func (x *SetConversationReq) String() string { func (*SetConversationReq) ProtoMessage() {} func (x *SetConversationReq) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[4] + mi := &file_conversation_conversation_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -459,7 +398,7 @@ func (x *SetConversationReq) ProtoReflect() protoreflect.Message { // Deprecated: Use SetConversationReq.ProtoReflect.Descriptor instead. func (*SetConversationReq) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{4} + return file_conversation_conversation_proto_rawDescGZIP(), []int{2} } func (x *SetConversationReq) GetConversation() *Conversation { @@ -478,7 +417,7 @@ type SetConversationResp struct { func (x *SetConversationResp) Reset() { *x = SetConversationResp{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[5] + mi := &file_conversation_conversation_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -491,7 +430,7 @@ func (x *SetConversationResp) String() string { func (*SetConversationResp) ProtoMessage() {} func (x *SetConversationResp) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[5] + mi := &file_conversation_conversation_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -504,108 +443,7 @@ func (x *SetConversationResp) ProtoReflect() protoreflect.Message { // Deprecated: Use SetConversationResp.ProtoReflect.Descriptor instead. func (*SetConversationResp) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{5} -} - -type SetRecvMsgOptReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - OwnerUserID string `protobuf:"bytes,1,opt,name=ownerUserID,proto3" json:"ownerUserID"` - ConversationID string `protobuf:"bytes,2,opt,name=conversationID,proto3" json:"conversationID"` - RecvMsgOpt int32 `protobuf:"varint,3,opt,name=recvMsgOpt,proto3" json:"recvMsgOpt"` -} - -func (x *SetRecvMsgOptReq) Reset() { - *x = SetRecvMsgOptReq{} - if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SetRecvMsgOptReq) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SetRecvMsgOptReq) ProtoMessage() {} - -func (x *SetRecvMsgOptReq) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SetRecvMsgOptReq.ProtoReflect.Descriptor instead. -func (*SetRecvMsgOptReq) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{6} -} - -func (x *SetRecvMsgOptReq) GetOwnerUserID() string { - if x != nil { - return x.OwnerUserID - } - return "" -} - -func (x *SetRecvMsgOptReq) GetConversationID() string { - if x != nil { - return x.ConversationID - } - return "" -} - -func (x *SetRecvMsgOptReq) GetRecvMsgOpt() int32 { - if x != nil { - return x.RecvMsgOpt - } - return 0 -} - -type SetRecvMsgOptResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *SetRecvMsgOptResp) Reset() { - *x = SetRecvMsgOptResp{} - if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SetRecvMsgOptResp) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SetRecvMsgOptResp) ProtoMessage() {} - -func (x *SetRecvMsgOptResp) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SetRecvMsgOptResp.ProtoReflect.Descriptor instead. -func (*SetRecvMsgOptResp) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{7} + return file_conversation_conversation_proto_rawDescGZIP(), []int{3} } type GetConversationReq struct { @@ -620,7 +458,7 @@ type GetConversationReq struct { func (x *GetConversationReq) Reset() { *x = GetConversationReq{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[8] + mi := &file_conversation_conversation_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -633,7 +471,7 @@ func (x *GetConversationReq) String() string { func (*GetConversationReq) ProtoMessage() {} func (x *GetConversationReq) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[8] + mi := &file_conversation_conversation_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -646,7 +484,7 @@ func (x *GetConversationReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetConversationReq.ProtoReflect.Descriptor instead. func (*GetConversationReq) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{8} + return file_conversation_conversation_proto_rawDescGZIP(), []int{4} } func (x *GetConversationReq) GetConversationID() string { @@ -674,7 +512,7 @@ type GetConversationResp struct { func (x *GetConversationResp) Reset() { *x = GetConversationResp{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[9] + mi := &file_conversation_conversation_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -687,7 +525,7 @@ func (x *GetConversationResp) String() string { func (*GetConversationResp) ProtoMessage() {} func (x *GetConversationResp) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[9] + mi := &file_conversation_conversation_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -700,7 +538,7 @@ func (x *GetConversationResp) ProtoReflect() protoreflect.Message { // Deprecated: Use GetConversationResp.ProtoReflect.Descriptor instead. func (*GetConversationResp) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{9} + return file_conversation_conversation_proto_rawDescGZIP(), []int{5} } func (x *GetConversationResp) GetConversation() *Conversation { @@ -722,7 +560,7 @@ type GetConversationsReq struct { func (x *GetConversationsReq) Reset() { *x = GetConversationsReq{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[10] + mi := &file_conversation_conversation_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -735,7 +573,7 @@ func (x *GetConversationsReq) String() string { func (*GetConversationsReq) ProtoMessage() {} func (x *GetConversationsReq) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[10] + mi := &file_conversation_conversation_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -748,7 +586,7 @@ func (x *GetConversationsReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetConversationsReq.ProtoReflect.Descriptor instead. func (*GetConversationsReq) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{10} + return file_conversation_conversation_proto_rawDescGZIP(), []int{6} } func (x *GetConversationsReq) GetOwnerUserID() string { @@ -776,7 +614,7 @@ type GetConversationsResp struct { func (x *GetConversationsResp) Reset() { *x = GetConversationsResp{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[11] + mi := &file_conversation_conversation_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -789,7 +627,7 @@ func (x *GetConversationsResp) String() string { func (*GetConversationsResp) ProtoMessage() {} func (x *GetConversationsResp) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[11] + mi := &file_conversation_conversation_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -802,7 +640,7 @@ func (x *GetConversationsResp) ProtoReflect() protoreflect.Message { // Deprecated: Use GetConversationsResp.ProtoReflect.Descriptor instead. func (*GetConversationsResp) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{11} + return file_conversation_conversation_proto_rawDescGZIP(), []int{7} } func (x *GetConversationsResp) GetConversations() []*Conversation { @@ -823,7 +661,7 @@ type GetAllConversationsReq struct { func (x *GetAllConversationsReq) Reset() { *x = GetAllConversationsReq{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[12] + mi := &file_conversation_conversation_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -836,7 +674,7 @@ func (x *GetAllConversationsReq) String() string { func (*GetAllConversationsReq) ProtoMessage() {} func (x *GetAllConversationsReq) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[12] + mi := &file_conversation_conversation_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -849,7 +687,7 @@ func (x *GetAllConversationsReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllConversationsReq.ProtoReflect.Descriptor instead. func (*GetAllConversationsReq) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{12} + return file_conversation_conversation_proto_rawDescGZIP(), []int{8} } func (x *GetAllConversationsReq) GetOwnerUserID() string { @@ -870,7 +708,7 @@ type GetAllConversationsResp struct { func (x *GetAllConversationsResp) Reset() { *x = GetAllConversationsResp{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[13] + mi := &file_conversation_conversation_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -883,7 +721,7 @@ func (x *GetAllConversationsResp) String() string { func (*GetAllConversationsResp) ProtoMessage() {} func (x *GetAllConversationsResp) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[13] + mi := &file_conversation_conversation_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -896,7 +734,7 @@ func (x *GetAllConversationsResp) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllConversationsResp.ProtoReflect.Descriptor instead. func (*GetAllConversationsResp) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{13} + return file_conversation_conversation_proto_rawDescGZIP(), []int{9} } func (x *GetAllConversationsResp) GetConversations() []*Conversation { @@ -906,99 +744,6 @@ func (x *GetAllConversationsResp) GetConversations() []*Conversation { return nil } -type BatchSetConversationsReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Conversations []*Conversation `protobuf:"bytes,1,rep,name=conversations,proto3" json:"conversations"` - OwnerUserID string `protobuf:"bytes,2,opt,name=ownerUserID,proto3" json:"ownerUserID"` -} - -func (x *BatchSetConversationsReq) Reset() { - *x = BatchSetConversationsReq{} - if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BatchSetConversationsReq) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BatchSetConversationsReq) ProtoMessage() {} - -func (x *BatchSetConversationsReq) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BatchSetConversationsReq.ProtoReflect.Descriptor instead. -func (*BatchSetConversationsReq) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{14} -} - -func (x *BatchSetConversationsReq) GetConversations() []*Conversation { - if x != nil { - return x.Conversations - } - return nil -} - -func (x *BatchSetConversationsReq) GetOwnerUserID() string { - if x != nil { - return x.OwnerUserID - } - return "" -} - -type BatchSetConversationsResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *BatchSetConversationsResp) Reset() { - *x = BatchSetConversationsResp{} - if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BatchSetConversationsResp) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BatchSetConversationsResp) ProtoMessage() {} - -func (x *BatchSetConversationsResp) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BatchSetConversationsResp.ProtoReflect.Descriptor instead. -func (*BatchSetConversationsResp) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{15} -} - type GetRecvMsgNotNotifyUserIDsReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1010,7 +755,7 @@ type GetRecvMsgNotNotifyUserIDsReq struct { func (x *GetRecvMsgNotNotifyUserIDsReq) Reset() { *x = GetRecvMsgNotNotifyUserIDsReq{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[16] + mi := &file_conversation_conversation_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1023,7 +768,7 @@ func (x *GetRecvMsgNotNotifyUserIDsReq) String() string { func (*GetRecvMsgNotNotifyUserIDsReq) ProtoMessage() {} func (x *GetRecvMsgNotNotifyUserIDsReq) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[16] + mi := &file_conversation_conversation_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1036,7 +781,7 @@ func (x *GetRecvMsgNotNotifyUserIDsReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRecvMsgNotNotifyUserIDsReq.ProtoReflect.Descriptor instead. func (*GetRecvMsgNotNotifyUserIDsReq) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{16} + return file_conversation_conversation_proto_rawDescGZIP(), []int{10} } func (x *GetRecvMsgNotNotifyUserIDsReq) GetGroupID() string { @@ -1057,7 +802,7 @@ type GetRecvMsgNotNotifyUserIDsResp struct { func (x *GetRecvMsgNotNotifyUserIDsResp) Reset() { *x = GetRecvMsgNotNotifyUserIDsResp{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[17] + mi := &file_conversation_conversation_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1070,7 +815,7 @@ func (x *GetRecvMsgNotNotifyUserIDsResp) String() string { func (*GetRecvMsgNotNotifyUserIDsResp) ProtoMessage() {} func (x *GetRecvMsgNotNotifyUserIDsResp) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[17] + mi := &file_conversation_conversation_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1083,7 +828,7 @@ func (x *GetRecvMsgNotNotifyUserIDsResp) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRecvMsgNotNotifyUserIDsResp.ProtoReflect.Descriptor instead. func (*GetRecvMsgNotNotifyUserIDsResp) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{17} + return file_conversation_conversation_proto_rawDescGZIP(), []int{11} } func (x *GetRecvMsgNotNotifyUserIDsResp) GetUserIDs() []string { @@ -1105,7 +850,7 @@ type CreateSingleChatConversationsReq struct { func (x *CreateSingleChatConversationsReq) Reset() { *x = CreateSingleChatConversationsReq{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[18] + mi := &file_conversation_conversation_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1118,7 +863,7 @@ func (x *CreateSingleChatConversationsReq) String() string { func (*CreateSingleChatConversationsReq) ProtoMessage() {} func (x *CreateSingleChatConversationsReq) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[18] + mi := &file_conversation_conversation_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1131,7 +876,7 @@ func (x *CreateSingleChatConversationsReq) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateSingleChatConversationsReq.ProtoReflect.Descriptor instead. func (*CreateSingleChatConversationsReq) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{18} + return file_conversation_conversation_proto_rawDescGZIP(), []int{12} } func (x *CreateSingleChatConversationsReq) GetRecvID() string { @@ -1157,7 +902,7 @@ type CreateSingleChatConversationsResp struct { func (x *CreateSingleChatConversationsResp) Reset() { *x = CreateSingleChatConversationsResp{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[19] + mi := &file_conversation_conversation_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1170,7 +915,7 @@ func (x *CreateSingleChatConversationsResp) String() string { func (*CreateSingleChatConversationsResp) ProtoMessage() {} func (x *CreateSingleChatConversationsResp) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[19] + mi := &file_conversation_conversation_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1183,7 +928,7 @@ func (x *CreateSingleChatConversationsResp) ProtoReflect() protoreflect.Message // Deprecated: Use CreateSingleChatConversationsResp.ProtoReflect.Descriptor instead. func (*CreateSingleChatConversationsResp) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{19} + return file_conversation_conversation_proto_rawDescGZIP(), []int{13} } type CreateGroupChatConversationsReq struct { @@ -1198,7 +943,7 @@ type CreateGroupChatConversationsReq struct { func (x *CreateGroupChatConversationsReq) Reset() { *x = CreateGroupChatConversationsReq{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[20] + mi := &file_conversation_conversation_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1211,7 +956,7 @@ func (x *CreateGroupChatConversationsReq) String() string { func (*CreateGroupChatConversationsReq) ProtoMessage() {} func (x *CreateGroupChatConversationsReq) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[20] + mi := &file_conversation_conversation_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1224,7 +969,7 @@ func (x *CreateGroupChatConversationsReq) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateGroupChatConversationsReq.ProtoReflect.Descriptor instead. func (*CreateGroupChatConversationsReq) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{20} + return file_conversation_conversation_proto_rawDescGZIP(), []int{14} } func (x *CreateGroupChatConversationsReq) GetUserIDs() []string { @@ -1250,7 +995,7 @@ type CreateGroupChatConversationsResp struct { func (x *CreateGroupChatConversationsResp) Reset() { *x = CreateGroupChatConversationsResp{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[21] + mi := &file_conversation_conversation_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1263,7 +1008,7 @@ func (x *CreateGroupChatConversationsResp) String() string { func (*CreateGroupChatConversationsResp) ProtoMessage() {} func (x *CreateGroupChatConversationsResp) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[21] + mi := &file_conversation_conversation_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1276,7 +1021,7 @@ func (x *CreateGroupChatConversationsResp) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateGroupChatConversationsResp.ProtoReflect.Descriptor instead. func (*CreateGroupChatConversationsResp) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{21} + return file_conversation_conversation_proto_rawDescGZIP(), []int{15} } type SetConversationMaxSeqReq struct { @@ -1292,7 +1037,7 @@ type SetConversationMaxSeqReq struct { func (x *SetConversationMaxSeqReq) Reset() { *x = SetConversationMaxSeqReq{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[22] + mi := &file_conversation_conversation_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1305,7 +1050,7 @@ func (x *SetConversationMaxSeqReq) String() string { func (*SetConversationMaxSeqReq) ProtoMessage() {} func (x *SetConversationMaxSeqReq) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[22] + mi := &file_conversation_conversation_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1318,7 +1063,7 @@ func (x *SetConversationMaxSeqReq) ProtoReflect() protoreflect.Message { // Deprecated: Use SetConversationMaxSeqReq.ProtoReflect.Descriptor instead. func (*SetConversationMaxSeqReq) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{22} + return file_conversation_conversation_proto_rawDescGZIP(), []int{16} } func (x *SetConversationMaxSeqReq) GetConversationID() string { @@ -1351,7 +1096,7 @@ type SetConversationMaxSeqResp struct { func (x *SetConversationMaxSeqResp) Reset() { *x = SetConversationMaxSeqResp{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[23] + mi := &file_conversation_conversation_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1364,7 +1109,7 @@ func (x *SetConversationMaxSeqResp) String() string { func (*SetConversationMaxSeqResp) ProtoMessage() {} func (x *SetConversationMaxSeqResp) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[23] + mi := &file_conversation_conversation_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1377,7 +1122,7 @@ func (x *SetConversationMaxSeqResp) ProtoReflect() protoreflect.Message { // Deprecated: Use SetConversationMaxSeqResp.ProtoReflect.Descriptor instead. func (*SetConversationMaxSeqResp) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{23} + return file_conversation_conversation_proto_rawDescGZIP(), []int{17} } type GetConversationIDsReq struct { @@ -1391,7 +1136,7 @@ type GetConversationIDsReq struct { func (x *GetConversationIDsReq) Reset() { *x = GetConversationIDsReq{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[24] + mi := &file_conversation_conversation_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1404,7 +1149,7 @@ func (x *GetConversationIDsReq) String() string { func (*GetConversationIDsReq) ProtoMessage() {} func (x *GetConversationIDsReq) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[24] + mi := &file_conversation_conversation_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1417,7 +1162,7 @@ func (x *GetConversationIDsReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetConversationIDsReq.ProtoReflect.Descriptor instead. func (*GetConversationIDsReq) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{24} + return file_conversation_conversation_proto_rawDescGZIP(), []int{18} } func (x *GetConversationIDsReq) GetUserID() string { @@ -1438,7 +1183,7 @@ type GetConversationIDsResp struct { func (x *GetConversationIDsResp) Reset() { *x = GetConversationIDsResp{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[25] + mi := &file_conversation_conversation_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1451,7 +1196,7 @@ func (x *GetConversationIDsResp) String() string { func (*GetConversationIDsResp) ProtoMessage() {} func (x *GetConversationIDsResp) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[25] + mi := &file_conversation_conversation_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1464,7 +1209,7 @@ func (x *GetConversationIDsResp) ProtoReflect() protoreflect.Message { // Deprecated: Use GetConversationIDsResp.ProtoReflect.Descriptor instead. func (*GetConversationIDsResp) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{25} + return file_conversation_conversation_proto_rawDescGZIP(), []int{19} } func (x *GetConversationIDsResp) GetConversationIDs() []string { @@ -1486,7 +1231,7 @@ type SetConversationsReq struct { func (x *SetConversationsReq) Reset() { *x = SetConversationsReq{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[26] + mi := &file_conversation_conversation_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1499,7 +1244,7 @@ func (x *SetConversationsReq) String() string { func (*SetConversationsReq) ProtoMessage() {} func (x *SetConversationsReq) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[26] + mi := &file_conversation_conversation_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1512,7 +1257,7 @@ func (x *SetConversationsReq) ProtoReflect() protoreflect.Message { // Deprecated: Use SetConversationsReq.ProtoReflect.Descriptor instead. func (*SetConversationsReq) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{26} + return file_conversation_conversation_proto_rawDescGZIP(), []int{20} } func (x *SetConversationsReq) GetUserIDs() []string { @@ -1538,7 +1283,7 @@ type SetConversationsResp struct { func (x *SetConversationsResp) Reset() { *x = SetConversationsResp{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[27] + mi := &file_conversation_conversation_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1551,7 +1296,7 @@ func (x *SetConversationsResp) String() string { func (*SetConversationsResp) ProtoMessage() {} func (x *SetConversationsResp) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[27] + mi := &file_conversation_conversation_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1564,7 +1309,7 @@ func (x *SetConversationsResp) ProtoReflect() protoreflect.Message { // Deprecated: Use SetConversationsResp.ProtoReflect.Descriptor instead. func (*SetConversationsResp) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{27} + return file_conversation_conversation_proto_rawDescGZIP(), []int{21} } type GetUserConversationIDsHashReq struct { @@ -1578,7 +1323,7 @@ type GetUserConversationIDsHashReq struct { func (x *GetUserConversationIDsHashReq) Reset() { *x = GetUserConversationIDsHashReq{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[28] + mi := &file_conversation_conversation_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1591,7 +1336,7 @@ func (x *GetUserConversationIDsHashReq) String() string { func (*GetUserConversationIDsHashReq) ProtoMessage() {} func (x *GetUserConversationIDsHashReq) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[28] + mi := &file_conversation_conversation_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1604,7 +1349,7 @@ func (x *GetUserConversationIDsHashReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUserConversationIDsHashReq.ProtoReflect.Descriptor instead. func (*GetUserConversationIDsHashReq) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{28} + return file_conversation_conversation_proto_rawDescGZIP(), []int{22} } func (x *GetUserConversationIDsHashReq) GetOwnerUserID() string { @@ -1625,7 +1370,7 @@ type GetUserConversationIDsHashResp struct { func (x *GetUserConversationIDsHashResp) Reset() { *x = GetUserConversationIDsHashResp{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[29] + mi := &file_conversation_conversation_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1638,7 +1383,7 @@ func (x *GetUserConversationIDsHashResp) String() string { func (*GetUserConversationIDsHashResp) ProtoMessage() {} func (x *GetUserConversationIDsHashResp) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[29] + mi := &file_conversation_conversation_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1651,7 +1396,7 @@ func (x *GetUserConversationIDsHashResp) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUserConversationIDsHashResp.ProtoReflect.Descriptor instead. func (*GetUserConversationIDsHashResp) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{29} + return file_conversation_conversation_proto_rawDescGZIP(), []int{23} } func (x *GetUserConversationIDsHashResp) GetHash() uint64 { @@ -1672,7 +1417,7 @@ type GetConversationsByConversationIDReq struct { func (x *GetConversationsByConversationIDReq) Reset() { *x = GetConversationsByConversationIDReq{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[30] + mi := &file_conversation_conversation_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1685,7 +1430,7 @@ func (x *GetConversationsByConversationIDReq) String() string { func (*GetConversationsByConversationIDReq) ProtoMessage() {} func (x *GetConversationsByConversationIDReq) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[30] + mi := &file_conversation_conversation_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1698,7 +1443,7 @@ func (x *GetConversationsByConversationIDReq) ProtoReflect() protoreflect.Messag // Deprecated: Use GetConversationsByConversationIDReq.ProtoReflect.Descriptor instead. func (*GetConversationsByConversationIDReq) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{30} + return file_conversation_conversation_proto_rawDescGZIP(), []int{24} } func (x *GetConversationsByConversationIDReq) GetConversationIDs() []string { @@ -1719,7 +1464,7 @@ type GetConversationsByConversationIDResp struct { func (x *GetConversationsByConversationIDResp) Reset() { *x = GetConversationsByConversationIDResp{} if protoimpl.UnsafeEnabled { - mi := &file_conversation_conversation_proto_msgTypes[31] + mi := &file_conversation_conversation_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1732,7 +1477,7 @@ func (x *GetConversationsByConversationIDResp) String() string { func (*GetConversationsByConversationIDResp) ProtoMessage() {} func (x *GetConversationsByConversationIDResp) ProtoReflect() protoreflect.Message { - mi := &file_conversation_conversation_proto_msgTypes[31] + mi := &file_conversation_conversation_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1745,7 +1490,7 @@ func (x *GetConversationsByConversationIDResp) ProtoReflect() protoreflect.Messa // Deprecated: Use GetConversationsByConversationIDResp.ProtoReflect.Descriptor instead. func (*GetConversationsByConversationIDResp) Descriptor() ([]byte, []int) { - return file_conversation_conversation_proto_rawDescGZIP(), []int{31} + return file_conversation_conversation_proto_rawDescGZIP(), []int{25} } func (x *GetConversationsByConversationIDResp) GetConversations() []*Conversation { @@ -1763,7 +1508,7 @@ var file_conversation_conversation_proto_rawDesc = []byte{ 0x6f, 0x12, 0x19, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x1b, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x70, 0x62, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, - 0x73, 0x70, 0x62, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc2, 0x03, 0x0a, 0x0c, 0x43, 0x6f, + 0x73, 0x70, 0x62, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc8, 0x04, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x0e, @@ -1791,328 +1536,290 @@ var file_conversation_conversation_proto_rawDesc = []byte{ 0x52, 0x0c, 0x62, 0x75, 0x72, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x69, 0x6e, 0x53, 0x65, 0x71, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x69, 0x6e, 0x53, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x71, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x22, 0xde, - 0x05, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, - 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x18, - 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x12, 0x41, 0x0a, 0x0a, 0x72, 0x65, 0x63, 0x76, - 0x4d, 0x73, 0x67, 0x4f, 0x70, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x0a, 0x72, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67, 0x4f, 0x70, 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x69, - 0x73, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x08, 0x69, 0x73, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x46, 0x0a, 0x0c, 0x61, 0x74, 0x74, - 0x61, 0x63, 0x68, 0x65, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x46, 0x0a, 0x0d, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x43, 0x68, - 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, - 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x69, 0x73, 0x50, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x74, 0x12, 0x32, 0x0a, 0x02, 0x65, 0x78, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x65, 0x78, 0x12, 0x45, 0x0a, - 0x0c, 0x62, 0x75, 0x72, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, - 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x62, 0x75, 0x72, 0x6e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x06, 0x6d, 0x69, 0x6e, 0x53, 0x65, 0x71, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, - 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x6d, 0x69, 0x6e, 0x53, 0x65, 0x71, 0x12, - 0x39, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x12, 0x43, 0x0a, 0x0b, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x41, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, - 0xa7, 0x01, 0x0a, 0x1a, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x12, 0x1e, - 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4b, 0x0a, 0x0c, - 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, - 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x63, 0x6f, 0x6e, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1d, 0x0a, 0x1b, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x22, 0x61, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x43, - 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x4b, - 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x63, - 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x15, 0x0a, 0x13, 0x53, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x22, 0x7c, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67, - 0x4f, 0x70, 0x74, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x77, 0x6e, - 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x12, 0x28, + 0x0a, 0x0f, 0x6d, 0x73, 0x67, 0x44, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6d, 0x73, 0x67, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x74, 0x4d, 0x73, 0x67, 0x44, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4d, + 0x73, 0x67, 0x44, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x24, + 0x0a, 0x0d, 0x69, 0x73, 0x4d, 0x73, 0x67, 0x44, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x73, 0x4d, 0x73, 0x67, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x22, 0xf3, 0x06, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, - 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67, 0x4f, 0x70, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67, 0x4f, 0x70, 0x74, - 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67, 0x4f, 0x70, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x22, 0x5e, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, - 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x62, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4b, 0x0a, 0x0c, - 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, - 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x63, 0x6f, 0x6e, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x61, 0x0a, 0x13, 0x47, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, - 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x22, 0x65, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x4d, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, - 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, - 0x68, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4d, 0x0a, 0x0d, 0x63, 0x6f, - 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, - 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8b, 0x01, 0x0a, 0x18, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x4d, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, - 0x65, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x1b, 0x0a, 0x19, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x22, 0x39, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x76, 0x4d, - 0x73, 0x67, 0x4e, 0x6f, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, 0x73, 0x65, 0x72, 0x49, - 0x44, 0x73, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x22, - 0x3a, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67, 0x4e, 0x6f, 0x74, - 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, 0x22, 0x52, 0x0a, 0x20, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x61, 0x74, 0x43, - 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, - 0x16, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x76, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x72, 0x65, 0x63, 0x76, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x49, - 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x49, 0x44, 0x22, - 0x23, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x43, - 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x22, 0x55, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x22, 0x22, 0x0a, 0x20, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, - 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, - 0x7c, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, - 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x22, 0x1b, 0x0a, - 0x19, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x22, 0x2f, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, - 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x42, 0x0a, 0x16, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, - 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x22, - 0x7f, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, - 0x12, 0x4e, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, + 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, + 0x65, 0x72, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x12, 0x41, + 0x0a, 0x0a, 0x72, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67, 0x4f, 0x70, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67, 0x4f, 0x70, + 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x69, 0x73, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x69, 0x73, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x12, + 0x46, 0x0a, 0x0c, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x61, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x65, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x46, 0x0a, 0x0d, 0x69, 0x73, 0x50, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x0d, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x74, 0x12, + 0x32, 0x0a, 0x02, 0x65, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x02, 0x65, 0x78, 0x12, 0x45, 0x0a, 0x0c, 0x62, 0x75, 0x72, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x62, 0x75, + 0x72, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x06, 0x6d, 0x69, + 0x6e, 0x53, 0x65, 0x71, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x6d, + 0x69, 0x6e, 0x53, 0x65, 0x71, 0x12, 0x39, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, + 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x71, + 0x12, 0x43, 0x0a, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, + 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x41, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4b, 0x0a, 0x0f, 0x6d, 0x73, 0x67, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x0f, 0x6d, 0x73, 0x67, 0x44, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x0d, 0x69, 0x73, 0x4d, 0x73, 0x67, 0x44, 0x65, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x69, 0x73, 0x4d, + 0x73, 0x67, 0x44, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0x61, 0x0a, 0x12, 0x53, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x12, 0x4b, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x16, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x41, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x55, - 0x73, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x44, 0x73, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x77, 0x6e, - 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x34, 0x0a, 0x1e, 0x47, - 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x12, 0x12, 0x0a, - 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x68, 0x61, 0x73, - 0x68, 0x22, 0x4f, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x52, 0x65, 0x71, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x44, 0x73, 0x22, 0x75, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4d, 0x0a, 0x0d, 0x63, 0x6f, - 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0c, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x15, 0x0a, + 0x13, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x22, 0x5e, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, + 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, + 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, + 0x65, 0x72, 0x49, 0x44, 0x22, 0x62, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, + 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4b, 0x0a, 0x0c, 0x63, + 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, - 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x32, 0xdb, 0x0f, 0x0a, 0x0c, 0x63, 0x6f, - 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x88, 0x01, 0x0a, 0x17, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x79, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x35, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x36, 0x2e, - 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x70, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, - 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x2e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x7c, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x6c, - 0x6c, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x31, - 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, - 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, - 0x6c, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x32, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x61, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, + 0x20, 0x0a, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, + 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x44, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x22, 0x65, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x4d, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x3a, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x68, + 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4d, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x76, 0x65, + 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x39, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67, 0x4e, 0x6f, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, + 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x49, 0x44, 0x22, 0x3a, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, + 0x67, 0x4e, 0x6f, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, 0x22, + 0x52, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x43, + 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x76, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x63, 0x76, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x65, 0x6e, 0x64, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x6e, + 0x64, 0x49, 0x44, 0x22, 0x23, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x6e, + 0x67, 0x6c, 0x65, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x55, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, + 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x75, + 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, + 0x65, 0x72, 0x49, 0x44, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x22, + 0x22, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, + 0x61, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x22, 0x7c, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x12, + 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, + 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, + 0x53, 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x53, 0x65, + 0x71, 0x22, 0x1b, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x22, 0x2f, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, + 0x42, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x44, 0x73, 0x22, 0x7f, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x73, + 0x65, 0x72, 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, + 0x72, 0x49, 0x44, 0x73, 0x12, 0x4e, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x16, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, + 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x41, 0x0a, 0x1d, + 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, + 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, + 0x34, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0x4f, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, 0x76, 0x65, + 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x52, 0x65, 0x71, 0x12, 0x28, 0x0a, 0x0f, + 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x22, 0x75, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4d, + 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, + 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x32, 0xdf, 0x0c, + 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x70, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x2d, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, - 0x74, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x73, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x2f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x82, 0x01, 0x0a, 0x15, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x33, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x34, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x74, 0x43, 0x6f, - 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x70, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x1a, 0x2e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x6a, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67, 0x4f, - 0x70, 0x74, 0x12, 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67, 0x4f, 0x70, 0x74, 0x52, 0x65, 0x71, 0x1a, - 0x2c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, - 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67, 0x4f, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x91, 0x01, - 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67, 0x4e, 0x6f, 0x74, 0x4e, - 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, 0x12, 0x38, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x76, - 0x4d, 0x73, 0x67, 0x4e, 0x6f, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, 0x73, 0x65, 0x72, - 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x39, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, + 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x1a, 0x2e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x7c, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x32, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x73, + 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x2e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x1a, 0x2f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x70, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67, 0x4e, 0x6f, 0x74, - 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x9a, 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x6e, 0x67, - 0x6c, 0x65, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x3b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x61, 0x74, - 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x1a, 0x3c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6e, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x97, - 0x01, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, - 0x61, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x3a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, - 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x3b, 0x2e, 0x4f, 0x70, + 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x2e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x91, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, + 0x76, 0x4d, 0x73, 0x67, 0x4e, 0x6f, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, 0x73, 0x65, + 0x72, 0x49, 0x44, 0x73, 0x12, 0x38, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67, 0x4e, 0x6f, 0x74, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x39, + 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x63, 0x76, 0x4d, 0x73, 0x67, 0x4e, 0x6f, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x55, 0x73, + 0x65, 0x72, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x9a, 0x01, 0x0a, 0x1d, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x82, 0x01, 0x0a, 0x15, 0x53, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, - 0x65, 0x71, 0x12, 0x33, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, - 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x1a, 0x34, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, + 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, + 0x6e, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x3c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, + 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x69, 0x6e, 0x67, 0x6c, + 0x65, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x97, 0x01, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x79, 0x0a, - 0x12, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x44, 0x73, 0x12, 0x30, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, + 0x68, 0x61, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x1a, 0x3b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x44, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x73, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x43, - 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x2f, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x91, 0x01, - 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, 0x38, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x48, - 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x1a, 0x39, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, - 0x70, 0x12, 0xa3, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x3e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x52, 0x65, 0x71, 0x1a, 0x3f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x44, 0x4b, 0x2f, - 0x4f, 0x70, 0x65, 0x6e, 0x2d, 0x49, 0x4d, 0x2d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, - 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x61, 0x74, 0x43, + 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x82, 0x01, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x12, 0x33, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x1a, + 0x34, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, + 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, + 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x79, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x12, 0x30, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, + 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, + 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x31, 0x2e, + 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x73, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x1a, 0x2f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x91, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, + 0x48, 0x61, 0x73, 0x68, 0x12, 0x38, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x1a, 0x39, + 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, + 0x73, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x12, 0xa3, 0x01, 0x0a, 0x20, 0x47, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, + 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x3e, + 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x52, 0x65, 0x71, 0x1a, 0x3f, + 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x63, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x43, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x42, + 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x70, + 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x44, 0x4b, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x2d, 0x49, 0x4d, 0x2d, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2127,95 +1834,83 @@ func file_conversation_conversation_proto_rawDescGZIP() []byte { return file_conversation_conversation_proto_rawDescData } -var file_conversation_conversation_proto_msgTypes = make([]protoimpl.MessageInfo, 32) +var file_conversation_conversation_proto_msgTypes = make([]protoimpl.MessageInfo, 26) var file_conversation_conversation_proto_goTypes = []interface{}{ (*Conversation)(nil), // 0: OpenIMServer.conversation.Conversation (*ConversationReq)(nil), // 1: OpenIMServer.conversation.ConversationReq - (*ModifyConversationFieldReq)(nil), // 2: OpenIMServer.conversation.ModifyConversationFieldReq - (*ModifyConversationFieldResp)(nil), // 3: OpenIMServer.conversation.ModifyConversationFieldResp - (*SetConversationReq)(nil), // 4: OpenIMServer.conversation.SetConversationReq - (*SetConversationResp)(nil), // 5: OpenIMServer.conversation.SetConversationResp - (*SetRecvMsgOptReq)(nil), // 6: OpenIMServer.conversation.SetRecvMsgOptReq - (*SetRecvMsgOptResp)(nil), // 7: OpenIMServer.conversation.SetRecvMsgOptResp - (*GetConversationReq)(nil), // 8: OpenIMServer.conversation.GetConversationReq - (*GetConversationResp)(nil), // 9: OpenIMServer.conversation.GetConversationResp - (*GetConversationsReq)(nil), // 10: OpenIMServer.conversation.GetConversationsReq - (*GetConversationsResp)(nil), // 11: OpenIMServer.conversation.GetConversationsResp - (*GetAllConversationsReq)(nil), // 12: OpenIMServer.conversation.GetAllConversationsReq - (*GetAllConversationsResp)(nil), // 13: OpenIMServer.conversation.GetAllConversationsResp - (*BatchSetConversationsReq)(nil), // 14: OpenIMServer.conversation.BatchSetConversationsReq - (*BatchSetConversationsResp)(nil), // 15: OpenIMServer.conversation.BatchSetConversationsResp - (*GetRecvMsgNotNotifyUserIDsReq)(nil), // 16: OpenIMServer.conversation.GetRecvMsgNotNotifyUserIDsReq - (*GetRecvMsgNotNotifyUserIDsResp)(nil), // 17: OpenIMServer.conversation.GetRecvMsgNotNotifyUserIDsResp - (*CreateSingleChatConversationsReq)(nil), // 18: OpenIMServer.conversation.CreateSingleChatConversationsReq - (*CreateSingleChatConversationsResp)(nil), // 19: OpenIMServer.conversation.CreateSingleChatConversationsResp - (*CreateGroupChatConversationsReq)(nil), // 20: OpenIMServer.conversation.CreateGroupChatConversationsReq - (*CreateGroupChatConversationsResp)(nil), // 21: OpenIMServer.conversation.CreateGroupChatConversationsResp - (*SetConversationMaxSeqReq)(nil), // 22: OpenIMServer.conversation.SetConversationMaxSeqReq - (*SetConversationMaxSeqResp)(nil), // 23: OpenIMServer.conversation.SetConversationMaxSeqResp - (*GetConversationIDsReq)(nil), // 24: OpenIMServer.conversation.GetConversationIDsReq - (*GetConversationIDsResp)(nil), // 25: OpenIMServer.conversation.GetConversationIDsResp - (*SetConversationsReq)(nil), // 26: OpenIMServer.conversation.SetConversationsReq - (*SetConversationsResp)(nil), // 27: OpenIMServer.conversation.SetConversationsResp - (*GetUserConversationIDsHashReq)(nil), // 28: OpenIMServer.conversation.GetUserConversationIDsHashReq - (*GetUserConversationIDsHashResp)(nil), // 29: OpenIMServer.conversation.GetUserConversationIDsHashResp - (*GetConversationsByConversationIDReq)(nil), // 30: OpenIMServer.conversation.GetConversationsByConversationIDReq - (*GetConversationsByConversationIDResp)(nil), // 31: OpenIMServer.conversation.GetConversationsByConversationIDResp - (*wrapperspb.Int32Value)(nil), // 32: OpenIMServer.protobuf.Int32Value - (*wrapperspb.BoolValue)(nil), // 33: OpenIMServer.protobuf.BoolValue - (*wrapperspb.StringValue)(nil), // 34: OpenIMServer.protobuf.StringValue - (*wrapperspb.Int64Value)(nil), // 35: OpenIMServer.protobuf.Int64Value + (*SetConversationReq)(nil), // 2: OpenIMServer.conversation.SetConversationReq + (*SetConversationResp)(nil), // 3: OpenIMServer.conversation.SetConversationResp + (*GetConversationReq)(nil), // 4: OpenIMServer.conversation.GetConversationReq + (*GetConversationResp)(nil), // 5: OpenIMServer.conversation.GetConversationResp + (*GetConversationsReq)(nil), // 6: OpenIMServer.conversation.GetConversationsReq + (*GetConversationsResp)(nil), // 7: OpenIMServer.conversation.GetConversationsResp + (*GetAllConversationsReq)(nil), // 8: OpenIMServer.conversation.GetAllConversationsReq + (*GetAllConversationsResp)(nil), // 9: OpenIMServer.conversation.GetAllConversationsResp + (*GetRecvMsgNotNotifyUserIDsReq)(nil), // 10: OpenIMServer.conversation.GetRecvMsgNotNotifyUserIDsReq + (*GetRecvMsgNotNotifyUserIDsResp)(nil), // 11: OpenIMServer.conversation.GetRecvMsgNotNotifyUserIDsResp + (*CreateSingleChatConversationsReq)(nil), // 12: OpenIMServer.conversation.CreateSingleChatConversationsReq + (*CreateSingleChatConversationsResp)(nil), // 13: OpenIMServer.conversation.CreateSingleChatConversationsResp + (*CreateGroupChatConversationsReq)(nil), // 14: OpenIMServer.conversation.CreateGroupChatConversationsReq + (*CreateGroupChatConversationsResp)(nil), // 15: OpenIMServer.conversation.CreateGroupChatConversationsResp + (*SetConversationMaxSeqReq)(nil), // 16: OpenIMServer.conversation.SetConversationMaxSeqReq + (*SetConversationMaxSeqResp)(nil), // 17: OpenIMServer.conversation.SetConversationMaxSeqResp + (*GetConversationIDsReq)(nil), // 18: OpenIMServer.conversation.GetConversationIDsReq + (*GetConversationIDsResp)(nil), // 19: OpenIMServer.conversation.GetConversationIDsResp + (*SetConversationsReq)(nil), // 20: OpenIMServer.conversation.SetConversationsReq + (*SetConversationsResp)(nil), // 21: OpenIMServer.conversation.SetConversationsResp + (*GetUserConversationIDsHashReq)(nil), // 22: OpenIMServer.conversation.GetUserConversationIDsHashReq + (*GetUserConversationIDsHashResp)(nil), // 23: OpenIMServer.conversation.GetUserConversationIDsHashResp + (*GetConversationsByConversationIDReq)(nil), // 24: OpenIMServer.conversation.GetConversationsByConversationIDReq + (*GetConversationsByConversationIDResp)(nil), // 25: OpenIMServer.conversation.GetConversationsByConversationIDResp + (*wrapperspb.Int32Value)(nil), // 26: OpenIMServer.protobuf.Int32Value + (*wrapperspb.BoolValue)(nil), // 27: OpenIMServer.protobuf.BoolValue + (*wrapperspb.StringValue)(nil), // 28: OpenIMServer.protobuf.StringValue + (*wrapperspb.Int64Value)(nil), // 29: OpenIMServer.protobuf.Int64Value } var file_conversation_conversation_proto_depIdxs = []int32{ - 32, // 0: OpenIMServer.conversation.ConversationReq.recvMsgOpt:type_name -> OpenIMServer.protobuf.Int32Value - 33, // 1: OpenIMServer.conversation.ConversationReq.isPinned:type_name -> OpenIMServer.protobuf.BoolValue - 34, // 2: OpenIMServer.conversation.ConversationReq.attachedInfo:type_name -> OpenIMServer.protobuf.StringValue - 33, // 3: OpenIMServer.conversation.ConversationReq.isPrivateChat:type_name -> OpenIMServer.protobuf.BoolValue - 34, // 4: OpenIMServer.conversation.ConversationReq.ex:type_name -> OpenIMServer.protobuf.StringValue - 32, // 5: OpenIMServer.conversation.ConversationReq.burnDuration:type_name -> OpenIMServer.protobuf.Int32Value - 35, // 6: OpenIMServer.conversation.ConversationReq.minSeq:type_name -> OpenIMServer.protobuf.Int64Value - 35, // 7: OpenIMServer.conversation.ConversationReq.maxSeq:type_name -> OpenIMServer.protobuf.Int64Value - 32, // 8: OpenIMServer.conversation.ConversationReq.groupAtType:type_name -> OpenIMServer.protobuf.Int32Value - 0, // 9: OpenIMServer.conversation.ModifyConversationFieldReq.conversation:type_name -> OpenIMServer.conversation.Conversation - 0, // 10: OpenIMServer.conversation.SetConversationReq.conversation:type_name -> OpenIMServer.conversation.Conversation - 0, // 11: OpenIMServer.conversation.GetConversationResp.conversation:type_name -> OpenIMServer.conversation.Conversation - 0, // 12: OpenIMServer.conversation.GetConversationsResp.conversations:type_name -> OpenIMServer.conversation.Conversation - 0, // 13: OpenIMServer.conversation.GetAllConversationsResp.conversations:type_name -> OpenIMServer.conversation.Conversation - 0, // 14: OpenIMServer.conversation.BatchSetConversationsReq.conversations:type_name -> OpenIMServer.conversation.Conversation + 26, // 0: OpenIMServer.conversation.ConversationReq.recvMsgOpt:type_name -> OpenIMServer.protobuf.Int32Value + 27, // 1: OpenIMServer.conversation.ConversationReq.isPinned:type_name -> OpenIMServer.protobuf.BoolValue + 28, // 2: OpenIMServer.conversation.ConversationReq.attachedInfo:type_name -> OpenIMServer.protobuf.StringValue + 27, // 3: OpenIMServer.conversation.ConversationReq.isPrivateChat:type_name -> OpenIMServer.protobuf.BoolValue + 28, // 4: OpenIMServer.conversation.ConversationReq.ex:type_name -> OpenIMServer.protobuf.StringValue + 26, // 5: OpenIMServer.conversation.ConversationReq.burnDuration:type_name -> OpenIMServer.protobuf.Int32Value + 29, // 6: OpenIMServer.conversation.ConversationReq.minSeq:type_name -> OpenIMServer.protobuf.Int64Value + 29, // 7: OpenIMServer.conversation.ConversationReq.maxSeq:type_name -> OpenIMServer.protobuf.Int64Value + 26, // 8: OpenIMServer.conversation.ConversationReq.groupAtType:type_name -> OpenIMServer.protobuf.Int32Value + 29, // 9: OpenIMServer.conversation.ConversationReq.msgDestructTime:type_name -> OpenIMServer.protobuf.Int64Value + 27, // 10: OpenIMServer.conversation.ConversationReq.isMsgDestruct:type_name -> OpenIMServer.protobuf.BoolValue + 0, // 11: OpenIMServer.conversation.SetConversationReq.conversation:type_name -> OpenIMServer.conversation.Conversation + 0, // 12: OpenIMServer.conversation.GetConversationResp.conversation:type_name -> OpenIMServer.conversation.Conversation + 0, // 13: OpenIMServer.conversation.GetConversationsResp.conversations:type_name -> OpenIMServer.conversation.Conversation + 0, // 14: OpenIMServer.conversation.GetAllConversationsResp.conversations:type_name -> OpenIMServer.conversation.Conversation 1, // 15: OpenIMServer.conversation.SetConversationsReq.conversation:type_name -> OpenIMServer.conversation.ConversationReq 0, // 16: OpenIMServer.conversation.GetConversationsByConversationIDResp.conversations:type_name -> OpenIMServer.conversation.Conversation - 2, // 17: OpenIMServer.conversation.conversation.ModifyConversationField:input_type -> OpenIMServer.conversation.ModifyConversationFieldReq - 8, // 18: OpenIMServer.conversation.conversation.GetConversation:input_type -> OpenIMServer.conversation.GetConversationReq - 12, // 19: OpenIMServer.conversation.conversation.GetAllConversations:input_type -> OpenIMServer.conversation.GetAllConversationsReq - 10, // 20: OpenIMServer.conversation.conversation.GetConversations:input_type -> OpenIMServer.conversation.GetConversationsReq - 14, // 21: OpenIMServer.conversation.conversation.BatchSetConversations:input_type -> OpenIMServer.conversation.BatchSetConversationsReq - 4, // 22: OpenIMServer.conversation.conversation.SetConversation:input_type -> OpenIMServer.conversation.SetConversationReq - 6, // 23: OpenIMServer.conversation.conversation.SetRecvMsgOpt:input_type -> OpenIMServer.conversation.SetRecvMsgOptReq - 16, // 24: OpenIMServer.conversation.conversation.GetRecvMsgNotNotifyUserIDs:input_type -> OpenIMServer.conversation.GetRecvMsgNotNotifyUserIDsReq - 18, // 25: OpenIMServer.conversation.conversation.CreateSingleChatConversations:input_type -> OpenIMServer.conversation.CreateSingleChatConversationsReq - 20, // 26: OpenIMServer.conversation.conversation.CreateGroupChatConversations:input_type -> OpenIMServer.conversation.CreateGroupChatConversationsReq - 22, // 27: OpenIMServer.conversation.conversation.SetConversationMaxSeq:input_type -> OpenIMServer.conversation.SetConversationMaxSeqReq - 24, // 28: OpenIMServer.conversation.conversation.GetConversationIDs:input_type -> OpenIMServer.conversation.GetConversationIDsReq - 26, // 29: OpenIMServer.conversation.conversation.SetConversations:input_type -> OpenIMServer.conversation.SetConversationsReq - 28, // 30: OpenIMServer.conversation.conversation.GetUserConversationIDsHash:input_type -> OpenIMServer.conversation.GetUserConversationIDsHashReq - 30, // 31: OpenIMServer.conversation.conversation.GetConversationsByConversationID:input_type -> OpenIMServer.conversation.GetConversationsByConversationIDReq - 3, // 32: OpenIMServer.conversation.conversation.ModifyConversationField:output_type -> OpenIMServer.conversation.ModifyConversationFieldResp - 9, // 33: OpenIMServer.conversation.conversation.GetConversation:output_type -> OpenIMServer.conversation.GetConversationResp - 13, // 34: OpenIMServer.conversation.conversation.GetAllConversations:output_type -> OpenIMServer.conversation.GetAllConversationsResp - 11, // 35: OpenIMServer.conversation.conversation.GetConversations:output_type -> OpenIMServer.conversation.GetConversationsResp - 15, // 36: OpenIMServer.conversation.conversation.BatchSetConversations:output_type -> OpenIMServer.conversation.BatchSetConversationsResp - 5, // 37: OpenIMServer.conversation.conversation.SetConversation:output_type -> OpenIMServer.conversation.SetConversationResp - 7, // 38: OpenIMServer.conversation.conversation.SetRecvMsgOpt:output_type -> OpenIMServer.conversation.SetRecvMsgOptResp - 17, // 39: OpenIMServer.conversation.conversation.GetRecvMsgNotNotifyUserIDs:output_type -> OpenIMServer.conversation.GetRecvMsgNotNotifyUserIDsResp - 19, // 40: OpenIMServer.conversation.conversation.CreateSingleChatConversations:output_type -> OpenIMServer.conversation.CreateSingleChatConversationsResp - 21, // 41: OpenIMServer.conversation.conversation.CreateGroupChatConversations:output_type -> OpenIMServer.conversation.CreateGroupChatConversationsResp - 23, // 42: OpenIMServer.conversation.conversation.SetConversationMaxSeq:output_type -> OpenIMServer.conversation.SetConversationMaxSeqResp - 25, // 43: OpenIMServer.conversation.conversation.GetConversationIDs:output_type -> OpenIMServer.conversation.GetConversationIDsResp - 27, // 44: OpenIMServer.conversation.conversation.SetConversations:output_type -> OpenIMServer.conversation.SetConversationsResp - 29, // 45: OpenIMServer.conversation.conversation.GetUserConversationIDsHash:output_type -> OpenIMServer.conversation.GetUserConversationIDsHashResp - 31, // 46: OpenIMServer.conversation.conversation.GetConversationsByConversationID:output_type -> OpenIMServer.conversation.GetConversationsByConversationIDResp - 32, // [32:47] is the sub-list for method output_type - 17, // [17:32] is the sub-list for method input_type + 4, // 17: OpenIMServer.conversation.conversation.GetConversation:input_type -> OpenIMServer.conversation.GetConversationReq + 8, // 18: OpenIMServer.conversation.conversation.GetAllConversations:input_type -> OpenIMServer.conversation.GetAllConversationsReq + 6, // 19: OpenIMServer.conversation.conversation.GetConversations:input_type -> OpenIMServer.conversation.GetConversationsReq + 2, // 20: OpenIMServer.conversation.conversation.SetConversation:input_type -> OpenIMServer.conversation.SetConversationReq + 10, // 21: OpenIMServer.conversation.conversation.GetRecvMsgNotNotifyUserIDs:input_type -> OpenIMServer.conversation.GetRecvMsgNotNotifyUserIDsReq + 12, // 22: OpenIMServer.conversation.conversation.CreateSingleChatConversations:input_type -> OpenIMServer.conversation.CreateSingleChatConversationsReq + 14, // 23: OpenIMServer.conversation.conversation.CreateGroupChatConversations:input_type -> OpenIMServer.conversation.CreateGroupChatConversationsReq + 16, // 24: OpenIMServer.conversation.conversation.SetConversationMaxSeq:input_type -> OpenIMServer.conversation.SetConversationMaxSeqReq + 18, // 25: OpenIMServer.conversation.conversation.GetConversationIDs:input_type -> OpenIMServer.conversation.GetConversationIDsReq + 20, // 26: OpenIMServer.conversation.conversation.SetConversations:input_type -> OpenIMServer.conversation.SetConversationsReq + 22, // 27: OpenIMServer.conversation.conversation.GetUserConversationIDsHash:input_type -> OpenIMServer.conversation.GetUserConversationIDsHashReq + 24, // 28: OpenIMServer.conversation.conversation.GetConversationsByConversationID:input_type -> OpenIMServer.conversation.GetConversationsByConversationIDReq + 5, // 29: OpenIMServer.conversation.conversation.GetConversation:output_type -> OpenIMServer.conversation.GetConversationResp + 9, // 30: OpenIMServer.conversation.conversation.GetAllConversations:output_type -> OpenIMServer.conversation.GetAllConversationsResp + 7, // 31: OpenIMServer.conversation.conversation.GetConversations:output_type -> OpenIMServer.conversation.GetConversationsResp + 3, // 32: OpenIMServer.conversation.conversation.SetConversation:output_type -> OpenIMServer.conversation.SetConversationResp + 11, // 33: OpenIMServer.conversation.conversation.GetRecvMsgNotNotifyUserIDs:output_type -> OpenIMServer.conversation.GetRecvMsgNotNotifyUserIDsResp + 13, // 34: OpenIMServer.conversation.conversation.CreateSingleChatConversations:output_type -> OpenIMServer.conversation.CreateSingleChatConversationsResp + 15, // 35: OpenIMServer.conversation.conversation.CreateGroupChatConversations:output_type -> OpenIMServer.conversation.CreateGroupChatConversationsResp + 17, // 36: OpenIMServer.conversation.conversation.SetConversationMaxSeq:output_type -> OpenIMServer.conversation.SetConversationMaxSeqResp + 19, // 37: OpenIMServer.conversation.conversation.GetConversationIDs:output_type -> OpenIMServer.conversation.GetConversationIDsResp + 21, // 38: OpenIMServer.conversation.conversation.SetConversations:output_type -> OpenIMServer.conversation.SetConversationsResp + 23, // 39: OpenIMServer.conversation.conversation.GetUserConversationIDsHash:output_type -> OpenIMServer.conversation.GetUserConversationIDsHashResp + 25, // 40: OpenIMServer.conversation.conversation.GetConversationsByConversationID:output_type -> OpenIMServer.conversation.GetConversationsByConversationIDResp + 29, // [29:41] is the sub-list for method output_type + 17, // [17:29] is the sub-list for method input_type 17, // [17:17] is the sub-list for extension type_name 17, // [17:17] is the sub-list for extension extendee 0, // [0:17] is the sub-list for field type_name @@ -2252,30 +1947,6 @@ func file_conversation_conversation_proto_init() { } } file_conversation_conversation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ModifyConversationFieldReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_conversation_conversation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ModifyConversationFieldResp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_conversation_conversation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetConversationReq); i { case 0: return &v.state @@ -2287,7 +1958,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetConversationResp); i { case 0: return &v.state @@ -2299,31 +1970,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRecvMsgOptReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_conversation_conversation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRecvMsgOptResp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_conversation_conversation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetConversationReq); i { case 0: return &v.state @@ -2335,7 +1982,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetConversationResp); i { case 0: return &v.state @@ -2347,7 +1994,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetConversationsReq); i { case 0: return &v.state @@ -2359,7 +2006,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetConversationsResp); i { case 0: return &v.state @@ -2371,7 +2018,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllConversationsReq); i { case 0: return &v.state @@ -2383,7 +2030,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllConversationsResp); i { case 0: return &v.state @@ -2395,31 +2042,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchSetConversationsReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_conversation_conversation_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchSetConversationsResp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_conversation_conversation_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRecvMsgNotNotifyUserIDsReq); i { case 0: return &v.state @@ -2431,7 +2054,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRecvMsgNotNotifyUserIDsResp); i { case 0: return &v.state @@ -2443,7 +2066,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateSingleChatConversationsReq); i { case 0: return &v.state @@ -2455,7 +2078,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateSingleChatConversationsResp); i { case 0: return &v.state @@ -2467,7 +2090,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateGroupChatConversationsReq); i { case 0: return &v.state @@ -2479,7 +2102,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateGroupChatConversationsResp); i { case 0: return &v.state @@ -2491,7 +2114,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetConversationMaxSeqReq); i { case 0: return &v.state @@ -2503,7 +2126,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetConversationMaxSeqResp); i { case 0: return &v.state @@ -2515,7 +2138,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetConversationIDsReq); i { case 0: return &v.state @@ -2527,7 +2150,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetConversationIDsResp); i { case 0: return &v.state @@ -2539,7 +2162,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetConversationsReq); i { case 0: return &v.state @@ -2551,7 +2174,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetConversationsResp); i { case 0: return &v.state @@ -2563,7 +2186,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetUserConversationIDsHashReq); i { case 0: return &v.state @@ -2575,7 +2198,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetUserConversationIDsHashResp); i { case 0: return &v.state @@ -2587,7 +2210,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetConversationsByConversationIDReq); i { case 0: return &v.state @@ -2599,7 +2222,7 @@ func file_conversation_conversation_proto_init() { return nil } } - file_conversation_conversation_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_conversation_conversation_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetConversationsByConversationIDResp); i { case 0: return &v.state @@ -2618,7 +2241,7 @@ func file_conversation_conversation_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_conversation_conversation_proto_rawDesc, NumEnums: 0, - NumMessages: 32, + NumMessages: 26, NumExtensions: 0, NumServices: 1, }, @@ -2644,13 +2267,10 @@ const _ = grpc.SupportPackageIsVersion6 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type ConversationClient interface { - ModifyConversationField(ctx context.Context, in *ModifyConversationFieldReq, opts ...grpc.CallOption) (*ModifyConversationFieldResp, error) GetConversation(ctx context.Context, in *GetConversationReq, opts ...grpc.CallOption) (*GetConversationResp, error) GetAllConversations(ctx context.Context, in *GetAllConversationsReq, opts ...grpc.CallOption) (*GetAllConversationsResp, error) GetConversations(ctx context.Context, in *GetConversationsReq, opts ...grpc.CallOption) (*GetConversationsResp, error) - BatchSetConversations(ctx context.Context, in *BatchSetConversationsReq, opts ...grpc.CallOption) (*BatchSetConversationsResp, error) SetConversation(ctx context.Context, in *SetConversationReq, opts ...grpc.CallOption) (*SetConversationResp, error) - SetRecvMsgOpt(ctx context.Context, in *SetRecvMsgOptReq, opts ...grpc.CallOption) (*SetRecvMsgOptResp, error) GetRecvMsgNotNotifyUserIDs(ctx context.Context, in *GetRecvMsgNotNotifyUserIDsReq, opts ...grpc.CallOption) (*GetRecvMsgNotNotifyUserIDsResp, error) CreateSingleChatConversations(ctx context.Context, in *CreateSingleChatConversationsReq, opts ...grpc.CallOption) (*CreateSingleChatConversationsResp, error) CreateGroupChatConversations(ctx context.Context, in *CreateGroupChatConversationsReq, opts ...grpc.CallOption) (*CreateGroupChatConversationsResp, error) @@ -2669,15 +2289,6 @@ func NewConversationClient(cc grpc.ClientConnInterface) ConversationClient { return &conversationClient{cc} } -func (c *conversationClient) ModifyConversationField(ctx context.Context, in *ModifyConversationFieldReq, opts ...grpc.CallOption) (*ModifyConversationFieldResp, error) { - out := new(ModifyConversationFieldResp) - err := c.cc.Invoke(ctx, "/OpenIMServer.conversation.conversation/ModifyConversationField", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *conversationClient) GetConversation(ctx context.Context, in *GetConversationReq, opts ...grpc.CallOption) (*GetConversationResp, error) { out := new(GetConversationResp) err := c.cc.Invoke(ctx, "/OpenIMServer.conversation.conversation/GetConversation", in, out, opts...) @@ -2705,15 +2316,6 @@ func (c *conversationClient) GetConversations(ctx context.Context, in *GetConver return out, nil } -func (c *conversationClient) BatchSetConversations(ctx context.Context, in *BatchSetConversationsReq, opts ...grpc.CallOption) (*BatchSetConversationsResp, error) { - out := new(BatchSetConversationsResp) - err := c.cc.Invoke(ctx, "/OpenIMServer.conversation.conversation/BatchSetConversations", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *conversationClient) SetConversation(ctx context.Context, in *SetConversationReq, opts ...grpc.CallOption) (*SetConversationResp, error) { out := new(SetConversationResp) err := c.cc.Invoke(ctx, "/OpenIMServer.conversation.conversation/SetConversation", in, out, opts...) @@ -2723,15 +2325,6 @@ func (c *conversationClient) SetConversation(ctx context.Context, in *SetConvers return out, nil } -func (c *conversationClient) SetRecvMsgOpt(ctx context.Context, in *SetRecvMsgOptReq, opts ...grpc.CallOption) (*SetRecvMsgOptResp, error) { - out := new(SetRecvMsgOptResp) - err := c.cc.Invoke(ctx, "/OpenIMServer.conversation.conversation/SetRecvMsgOpt", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *conversationClient) GetRecvMsgNotNotifyUserIDs(ctx context.Context, in *GetRecvMsgNotNotifyUserIDsReq, opts ...grpc.CallOption) (*GetRecvMsgNotNotifyUserIDsResp, error) { out := new(GetRecvMsgNotNotifyUserIDsResp) err := c.cc.Invoke(ctx, "/OpenIMServer.conversation.conversation/GetRecvMsgNotNotifyUserIDs", in, out, opts...) @@ -2806,13 +2399,10 @@ func (c *conversationClient) GetConversationsByConversationID(ctx context.Contex // ConversationServer is the server API for Conversation service. type ConversationServer interface { - ModifyConversationField(context.Context, *ModifyConversationFieldReq) (*ModifyConversationFieldResp, error) GetConversation(context.Context, *GetConversationReq) (*GetConversationResp, error) GetAllConversations(context.Context, *GetAllConversationsReq) (*GetAllConversationsResp, error) GetConversations(context.Context, *GetConversationsReq) (*GetConversationsResp, error) - BatchSetConversations(context.Context, *BatchSetConversationsReq) (*BatchSetConversationsResp, error) SetConversation(context.Context, *SetConversationReq) (*SetConversationResp, error) - SetRecvMsgOpt(context.Context, *SetRecvMsgOptReq) (*SetRecvMsgOptResp, error) GetRecvMsgNotNotifyUserIDs(context.Context, *GetRecvMsgNotNotifyUserIDsReq) (*GetRecvMsgNotNotifyUserIDsResp, error) CreateSingleChatConversations(context.Context, *CreateSingleChatConversationsReq) (*CreateSingleChatConversationsResp, error) CreateGroupChatConversations(context.Context, *CreateGroupChatConversationsReq) (*CreateGroupChatConversationsResp, error) @@ -2827,9 +2417,6 @@ type ConversationServer interface { type UnimplementedConversationServer struct { } -func (*UnimplementedConversationServer) ModifyConversationField(context.Context, *ModifyConversationFieldReq) (*ModifyConversationFieldResp, error) { - return nil, status.Errorf(codes.Unimplemented, "method ModifyConversationField not implemented") -} func (*UnimplementedConversationServer) GetConversation(context.Context, *GetConversationReq) (*GetConversationResp, error) { return nil, status.Errorf(codes.Unimplemented, "method GetConversation not implemented") } @@ -2839,15 +2426,9 @@ func (*UnimplementedConversationServer) GetAllConversations(context.Context, *Ge func (*UnimplementedConversationServer) GetConversations(context.Context, *GetConversationsReq) (*GetConversationsResp, error) { return nil, status.Errorf(codes.Unimplemented, "method GetConversations not implemented") } -func (*UnimplementedConversationServer) BatchSetConversations(context.Context, *BatchSetConversationsReq) (*BatchSetConversationsResp, error) { - return nil, status.Errorf(codes.Unimplemented, "method BatchSetConversations not implemented") -} func (*UnimplementedConversationServer) SetConversation(context.Context, *SetConversationReq) (*SetConversationResp, error) { return nil, status.Errorf(codes.Unimplemented, "method SetConversation not implemented") } -func (*UnimplementedConversationServer) SetRecvMsgOpt(context.Context, *SetRecvMsgOptReq) (*SetRecvMsgOptResp, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetRecvMsgOpt not implemented") -} func (*UnimplementedConversationServer) GetRecvMsgNotNotifyUserIDs(context.Context, *GetRecvMsgNotNotifyUserIDsReq) (*GetRecvMsgNotNotifyUserIDsResp, error) { return nil, status.Errorf(codes.Unimplemented, "method GetRecvMsgNotNotifyUserIDs not implemented") } @@ -2877,24 +2458,6 @@ func RegisterConversationServer(s *grpc.Server, srv ConversationServer) { s.RegisterService(&_Conversation_serviceDesc, srv) } -func _Conversation_ModifyConversationField_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ModifyConversationFieldReq) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ConversationServer).ModifyConversationField(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/OpenIMServer.conversation.conversation/ModifyConversationField", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ConversationServer).ModifyConversationField(ctx, req.(*ModifyConversationFieldReq)) - } - return interceptor(ctx, in, info, handler) -} - func _Conversation_GetConversation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetConversationReq) if err := dec(in); err != nil { @@ -2949,24 +2512,6 @@ func _Conversation_GetConversations_Handler(srv interface{}, ctx context.Context return interceptor(ctx, in, info, handler) } -func _Conversation_BatchSetConversations_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(BatchSetConversationsReq) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ConversationServer).BatchSetConversations(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/OpenIMServer.conversation.conversation/BatchSetConversations", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ConversationServer).BatchSetConversations(ctx, req.(*BatchSetConversationsReq)) - } - return interceptor(ctx, in, info, handler) -} - func _Conversation_SetConversation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(SetConversationReq) if err := dec(in); err != nil { @@ -2985,24 +2530,6 @@ func _Conversation_SetConversation_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } -func _Conversation_SetRecvMsgOpt_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetRecvMsgOptReq) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ConversationServer).SetRecvMsgOpt(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/OpenIMServer.conversation.conversation/SetRecvMsgOpt", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ConversationServer).SetRecvMsgOpt(ctx, req.(*SetRecvMsgOptReq)) - } - return interceptor(ctx, in, info, handler) -} - func _Conversation_GetRecvMsgNotNotifyUserIDs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetRecvMsgNotNotifyUserIDsReq) if err := dec(in); err != nil { @@ -3151,10 +2678,6 @@ var _Conversation_serviceDesc = grpc.ServiceDesc{ ServiceName: "OpenIMServer.conversation.conversation", HandlerType: (*ConversationServer)(nil), Methods: []grpc.MethodDesc{ - { - MethodName: "ModifyConversationField", - Handler: _Conversation_ModifyConversationField_Handler, - }, { MethodName: "GetConversation", Handler: _Conversation_GetConversation_Handler, @@ -3167,18 +2690,10 @@ var _Conversation_serviceDesc = grpc.ServiceDesc{ MethodName: "GetConversations", Handler: _Conversation_GetConversations_Handler, }, - { - MethodName: "BatchSetConversations", - Handler: _Conversation_BatchSetConversations_Handler, - }, { MethodName: "SetConversation", Handler: _Conversation_SetConversation_Handler, }, - { - MethodName: "SetRecvMsgOpt", - Handler: _Conversation_SetRecvMsgOpt_Handler, - }, { MethodName: "GetRecvMsgNotNotifyUserIDs", Handler: _Conversation_GetRecvMsgNotNotifyUserIDs_Handler, diff --git a/pkg/proto/conversation/conversation.proto b/pkg/proto/conversation/conversation.proto index b08366af7..0a271d525 100644 --- a/pkg/proto/conversation/conversation.proto +++ b/pkg/proto/conversation/conversation.proto @@ -32,6 +32,9 @@ message Conversation{ int32 burnDuration = 12; int64 minSeq = 13; int64 maxSeq = 14; + int64 msgDestructTime = 15; + int64 latestMsgDestructTime = 16; + bool isMsgDestruct = 17; } message ConversationReq{ @@ -48,15 +51,8 @@ message ConversationReq{ OpenIMServer.protobuf.Int64Value minSeq = 11; OpenIMServer.protobuf.Int64Value maxSeq = 12; OpenIMServer.protobuf.Int32Value groupAtType = 13; -} - -message ModifyConversationFieldReq{ - repeated string userIDList = 1; - int32 FieldType = 2; - Conversation conversation = 3; -} - -message ModifyConversationFieldResp{ + OpenIMServer.protobuf.Int64Value msgDestructTime = 14; + OpenIMServer.protobuf.BoolValue isMsgDestruct = 15; } message SetConversationReq{ @@ -66,15 +62,6 @@ message SetConversationReq{ message SetConversationResp{ } -message SetRecvMsgOptReq { - string ownerUserID = 1; - string conversationID = 2; - int32 recvMsgOpt = 3; -} - -message SetRecvMsgOptResp { -} - message GetConversationReq{ string conversationID = 1; string ownerUserID = 2; @@ -101,13 +88,6 @@ message GetAllConversationsResp{ repeated Conversation conversations = 2; } -message BatchSetConversationsReq{ - repeated Conversation conversations = 1; - string ownerUserID = 2; -} - -message BatchSetConversationsResp{ -} message GetRecvMsgNotNotifyUserIDsReq { string groupID = 1; @@ -177,13 +157,10 @@ message GetConversationsByConversationIDResp { } service conversation { - rpc ModifyConversationField(ModifyConversationFieldReq)returns(ModifyConversationFieldResp); rpc GetConversation(GetConversationReq)returns(GetConversationResp); rpc GetAllConversations(GetAllConversationsReq)returns(GetAllConversationsResp); rpc GetConversations(GetConversationsReq)returns(GetConversationsResp); - rpc BatchSetConversations(BatchSetConversationsReq)returns(BatchSetConversationsResp); rpc SetConversation(SetConversationReq)returns(SetConversationResp); - rpc SetRecvMsgOpt(SetRecvMsgOptReq)returns(SetRecvMsgOptResp); rpc GetRecvMsgNotNotifyUserIDs(GetRecvMsgNotNotifyUserIDsReq) returns (GetRecvMsgNotNotifyUserIDsResp); rpc CreateSingleChatConversations(CreateSingleChatConversationsReq) returns (CreateSingleChatConversationsResp); rpc CreateGroupChatConversations(CreateGroupChatConversationsReq) returns (CreateGroupChatConversationsResp); diff --git a/pkg/proto/group/group.pb.go b/pkg/proto/group/group.pb.go index f54e54a9e..9541496e2 100644 --- a/pkg/proto/group/group.pb.go +++ b/pkg/proto/group/group.pb.go @@ -3397,6 +3397,124 @@ func (x *GetGroupMemberCacheResp) GetMember() *sdkws.GroupMemberFullInfo { return nil } +type GroupCreateCountReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Start int64 `protobuf:"varint,1,opt,name=start,proto3" json:"start"` + End int64 `protobuf:"varint,2,opt,name=end,proto3" json:"end"` +} + +func (x *GroupCreateCountReq) Reset() { + *x = GroupCreateCountReq{} + if protoimpl.UnsafeEnabled { + mi := &file_group_group_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GroupCreateCountReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GroupCreateCountReq) ProtoMessage() {} + +func (x *GroupCreateCountReq) ProtoReflect() protoreflect.Message { + mi := &file_group_group_proto_msgTypes[66] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GroupCreateCountReq.ProtoReflect.Descriptor instead. +func (*GroupCreateCountReq) Descriptor() ([]byte, []int) { + return file_group_group_proto_rawDescGZIP(), []int{66} +} + +func (x *GroupCreateCountReq) GetStart() int64 { + if x != nil { + return x.Start + } + return 0 +} + +func (x *GroupCreateCountReq) GetEnd() int64 { + if x != nil { + return x.End + } + return 0 +} + +type GroupCreateCountResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total"` + Before int64 `protobuf:"varint,2,opt,name=before,proto3" json:"before"` + Count map[string]int64 `protobuf:"bytes,3,rep,name=count,proto3" json:"count" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` +} + +func (x *GroupCreateCountResp) Reset() { + *x = GroupCreateCountResp{} + if protoimpl.UnsafeEnabled { + mi := &file_group_group_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GroupCreateCountResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GroupCreateCountResp) ProtoMessage() {} + +func (x *GroupCreateCountResp) ProtoReflect() protoreflect.Message { + mi := &file_group_group_proto_msgTypes[67] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GroupCreateCountResp.ProtoReflect.Descriptor instead. +func (*GroupCreateCountResp) Descriptor() ([]byte, []int) { + return file_group_group_proto_rawDescGZIP(), []int{67} +} + +func (x *GroupCreateCountResp) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +func (x *GroupCreateCountResp) GetBefore() int64 { + if x != nil { + return x.Before + } + return 0 +} + +func (x *GroupCreateCountResp) GetCount() map[string]int64 { + if x != nil { + return x.Count + } + return nil +} + var File_group_group_proto protoreflect.FileDescriptor var file_group_group_proto_rawDesc = []byte{ @@ -3765,210 +3883,233 @@ var file_group_group_proto_rawDesc = []byte{ 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x46, 0x75, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x32, 0xf4, 0x18, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x56, 0x0a, 0x0b, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, - 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x50, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, - 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, - 0x71, 0x1a, 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x50, 0x0a, 0x09, 0x71, 0x75, 0x69, 0x74, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x12, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x51, 0x75, 0x69, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x52, 0x65, 0x71, 0x1a, 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x51, 0x75, 0x69, 0x74, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5c, 0x0a, 0x0d, 0x67, 0x65, 0x74, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x25, 0x2e, - 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x59, 0x0a, 0x0c, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x53, - 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x7a, 0x0a, 0x17, 0x67, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2e, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, - 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x2f, 0x2e, 0x4f, 0x70, 0x65, + 0x22, 0x3d, 0x0a, 0x13, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, + 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, + 0xc9, 0x01, 0x0a, 0x14, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x16, + 0x0a, 0x06, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, + 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x49, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x2e, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x1a, 0x38, 0x0a, 0x0a, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x32, 0xdb, 0x19, 0x0a, 0x05, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x56, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x12, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, + 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x50, 0x0a, + 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, - 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x80, 0x01, 0x0a, 0x19, - 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x30, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, - 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x31, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x41, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x6b, - 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4f, - 0x77, 0x6e, 0x65, 0x72, 0x12, 0x29, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, - 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, + 0x4a, 0x6f, 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x21, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x50, 0x0a, 0x09, 0x71, 0x75, 0x69, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x20, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x2e, 0x51, 0x75, 0x69, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x21, + 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x2e, 0x51, 0x75, 0x69, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x5c, 0x0a, 0x0d, 0x67, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x25, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, + 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, + 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x59, 0x0a, 0x0c, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x7a, 0x0a, 0x17, 0x67, 0x65, + 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x2f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x80, 0x01, 0x0a, 0x19, 0x67, 0x65, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x30, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x6b, 0x0a, 0x12, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, + 0x29, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x7d, 0x0a, 0x18, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x30, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, - 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x6b, 0x0a, 0x12, 0x67, 0x65, - 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x29, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x2a, 0x2e, 0x4f, 0x70, + 0x75, 0x70, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x2a, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4f, 0x77, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x7d, 0x0a, 0x18, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x41, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x52, 0x65, 0x71, 0x1a, 0x30, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x6b, 0x0a, 0x12, 0x67, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x29, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x6e, 0x0a, 0x13, 0x67, 0x65, 0x74, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2a, - 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x2b, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, - 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x62, 0x0a, 0x0f, 0x6b, 0x69, 0x63, 0x6b, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, - 0x4b, 0x69, 0x63, 0x6b, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x1a, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x4b, 0x69, 0x63, 0x6b, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x6b, 0x0a, 0x12, 0x67, - 0x65, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x29, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x2a, 0x2e, 0x4f, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x6e, 0x0a, 0x13, 0x67, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, + 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x62, 0x0a, 0x0f, 0x6b, 0x69, 0x63, 0x6b, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x4b, 0x69, 0x63, 0x6b, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x27, 0x2e, + 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x2e, 0x4b, 0x69, 0x63, 0x6b, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x6b, 0x0a, 0x12, 0x67, 0x65, 0x74, 0x4a, 0x6f, 0x69, + 0x6e, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x29, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x68, 0x0a, 0x11, 0x69, 0x6e, 0x76, 0x69, - 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x28, 0x2e, - 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x29, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x49, 0x6e, 0x76, - 0x69, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x50, 0x0a, 0x09, 0x67, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, - 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x6b, 0x0a, 0x12, 0x67, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x43, 0x4d, 0x53, 0x12, 0x29, 0x2e, 0x4f, 0x70, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, + 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x68, 0x0a, 0x11, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x54, 0x6f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x28, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, + 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x49, 0x6e, + 0x76, 0x69, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x65, 0x71, 0x1a, 0x29, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x54, 0x6f, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x50, 0x0a, + 0x09, 0x67, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, - 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x43, - 0x4d, 0x53, 0x52, 0x65, 0x71, 0x1a, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x21, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x6b, 0x0a, 0x12, 0x67, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x43, 0x4d, 0x53, 0x12, 0x29, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x43, 0x4d, 0x53, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x59, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x12, 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x43, 0x4d, 0x53, 0x52, 0x65, 0x71, + 0x1a, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x43, 0x4d, 0x53, 0x52, 0x65, 0x73, 0x70, 0x12, 0x59, 0x0a, 0x0c, + 0x64, 0x69, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x23, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x2e, 0x44, 0x69, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, + 0x71, 0x1a, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x44, 0x69, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x44, 0x69, 0x73, 0x6d, - 0x69, 0x73, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x62, 0x0a, 0x0f, - 0x6d, 0x75, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0x26, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x4d, 0x75, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x4d, 0x75, 0x74, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x74, 0x0a, 0x15, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4d, 0x75, 0x74, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x43, + 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x62, 0x0a, 0x0f, 0x6d, 0x75, 0x74, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, + 0x4d, 0x75, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x1a, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x4d, 0x75, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x74, 0x0a, 0x15, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4d, 0x75, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x2d, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x43, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x4d, 0x75, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x50, 0x0a, 0x09, 0x6d, 0x75, 0x74, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x12, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x4d, 0x75, 0x74, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x4d, 0x75, 0x74, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x62, 0x0a, 0x0f, 0x63, 0x61, 0x6e, 0x63, - 0x65, 0x6c, 0x4d, 0x75, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x26, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4d, 0x75, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x52, 0x65, 0x71, 0x1a, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4d, - 0x75, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x7a, 0x0a, 0x17, - 0x67, 0x65, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x53, 0x75, 0x70, 0x65, 0x72, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, - 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x53, 0x75, 0x70, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x2f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, - 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x53, 0x75, 0x70, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x6b, 0x0a, 0x12, 0x67, 0x65, 0x74, 0x53, - 0x75, 0x70, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x29, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, + 0x4d, 0x75, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x1a, 0x2d, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4d, 0x75, + 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x50, 0x0a, 0x09, 0x6d, 0x75, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x70, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x6f, 0x75, 0x70, 0x2e, 0x4d, 0x75, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, + 0x1a, 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x4d, 0x75, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x62, 0x0a, 0x0f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4d, 0x75, 0x74, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x26, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x43, 0x61, 0x6e, 0x63, + 0x65, 0x6c, 0x4d, 0x75, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x27, + 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4d, 0x75, 0x74, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x7a, 0x0a, 0x17, 0x67, 0x65, 0x74, 0x4a, 0x6f, + 0x69, 0x6e, 0x65, 0x64, 0x53, 0x75, 0x70, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x2e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x65, + 0x64, 0x53, 0x75, 0x70, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x1a, 0x2f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x65, + 0x64, 0x53, 0x75, 0x70, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x6b, 0x0a, 0x12, 0x67, 0x65, 0x74, 0x53, 0x75, 0x70, 0x65, 0x72, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x29, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x70, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x6b, 0x0a, 0x12, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x29, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x2e, 0x53, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, + 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x70, + 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x6b, 0x0a, 0x12, 0x73, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x29, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x71, 0x0a, 0x14, 0x67, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x62, - 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, - 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x2c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x74, 0x0a, 0x15, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x49, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x2c, - 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x2d, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x74, 0x0a, 0x15, 0x67, - 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x55, 0x73, 0x65, - 0x72, 0x49, 0x44, 0x73, 0x12, 0x2c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, 0x52, - 0x65, 0x71, 0x1a, 0x2d, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x7a, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x2e, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x52, 0x6f, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x2f, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x52, 0x6f, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x68, 0x0a, - 0x11, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x12, 0x28, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x71, 0x1a, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x71, 0x0a, + 0x14, 0x67, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x71, 0x1a, 0x2c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x49, 0x6e, 0x66, 0x6f, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x29, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x6e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x2a, - 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x2b, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, - 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x52, 0x65, 0x73, 0x70, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x44, 0x4b, 0x2f, - 0x4f, 0x70, 0x65, 0x6e, 0x2d, 0x49, 0x4d, 0x2d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, - 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x41, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x74, 0x0a, 0x15, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, + 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x2d, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x74, 0x0a, 0x15, 0x67, 0x65, 0x74, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, 0x12, + 0x2c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x2d, 0x2e, + 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x7a, 0x0a, 0x17, + 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, + 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x2e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x2f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x6f, 0x6c, 0x65, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x68, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x28, 0x2e, + 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x29, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x6e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, + 0x65, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x65, 0x0a, 0x10, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x1a, + 0x28, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x44, + 0x4b, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x2d, 0x49, 0x4d, 0x2d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3983,7 +4124,7 @@ func file_group_group_proto_rawDescGZIP() []byte { return file_group_group_proto_rawDescData } -var file_group_group_proto_msgTypes = make([]protoimpl.MessageInfo, 66) +var file_group_group_proto_msgTypes = make([]protoimpl.MessageInfo, 69) var file_group_group_proto_goTypes = []interface{}{ (*CreateGroupReq)(nil), // 0: OpenIMServer.group.CreateGroupReq (*CreateGroupResp)(nil), // 1: OpenIMServer.group.CreateGroupResp @@ -4051,112 +4192,118 @@ var file_group_group_proto_goTypes = []interface{}{ (*GetGroupInfoCacheResp)(nil), // 63: OpenIMServer.group.GetGroupInfoCacheResp (*GetGroupMemberCacheReq)(nil), // 64: OpenIMServer.group.GetGroupMemberCacheReq (*GetGroupMemberCacheResp)(nil), // 65: OpenIMServer.group.GetGroupMemberCacheResp - (*sdkws.GroupInfo)(nil), // 66: OpenIMServer.sdkws.GroupInfo - (*sdkws.GroupInfoForSet)(nil), // 67: OpenIMServer.sdkws.GroupInfoForSet - (*sdkws.RequestPagination)(nil), // 68: OpenIMServer.sdkws.RequestPagination - (*sdkws.GroupRequest)(nil), // 69: OpenIMServer.sdkws.GroupRequest - (*sdkws.GroupMemberFullInfo)(nil), // 70: OpenIMServer.sdkws.GroupMemberFullInfo - (*wrapperspb.StringValue)(nil), // 71: OpenIMServer.protobuf.StringValue - (*wrapperspb.Int32Value)(nil), // 72: OpenIMServer.protobuf.Int32Value + (*GroupCreateCountReq)(nil), // 66: OpenIMServer.group.GroupCreateCountReq + (*GroupCreateCountResp)(nil), // 67: OpenIMServer.group.GroupCreateCountResp + nil, // 68: OpenIMServer.group.GroupCreateCountResp.CountEntry + (*sdkws.GroupInfo)(nil), // 69: OpenIMServer.sdkws.GroupInfo + (*sdkws.GroupInfoForSet)(nil), // 70: OpenIMServer.sdkws.GroupInfoForSet + (*sdkws.RequestPagination)(nil), // 71: OpenIMServer.sdkws.RequestPagination + (*sdkws.GroupRequest)(nil), // 72: OpenIMServer.sdkws.GroupRequest + (*sdkws.GroupMemberFullInfo)(nil), // 73: OpenIMServer.sdkws.GroupMemberFullInfo + (*wrapperspb.StringValue)(nil), // 74: OpenIMServer.protobuf.StringValue + (*wrapperspb.Int32Value)(nil), // 75: OpenIMServer.protobuf.Int32Value } var file_group_group_proto_depIdxs = []int32{ - 66, // 0: OpenIMServer.group.CreateGroupReq.groupInfo:type_name -> OpenIMServer.sdkws.GroupInfo - 66, // 1: OpenIMServer.group.CreateGroupResp.groupInfo:type_name -> OpenIMServer.sdkws.GroupInfo - 66, // 2: OpenIMServer.group.GetGroupsInfoResp.groupInfos:type_name -> OpenIMServer.sdkws.GroupInfo - 67, // 3: OpenIMServer.group.SetGroupInfoReq.groupInfoForSet:type_name -> OpenIMServer.sdkws.GroupInfoForSet - 68, // 4: OpenIMServer.group.GetGroupApplicationListReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination - 69, // 5: OpenIMServer.group.GetGroupApplicationListResp.groupRequests:type_name -> OpenIMServer.sdkws.GroupRequest - 68, // 6: OpenIMServer.group.GetUserReqApplicationListReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination - 69, // 7: OpenIMServer.group.GetUserReqApplicationListResp.groupRequests:type_name -> OpenIMServer.sdkws.GroupRequest - 68, // 8: OpenIMServer.group.GetGroupMemberListReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination - 70, // 9: OpenIMServer.group.GetGroupMemberListResp.members:type_name -> OpenIMServer.sdkws.GroupMemberFullInfo - 70, // 10: OpenIMServer.group.GetGroupMembersInfoResp.members:type_name -> OpenIMServer.sdkws.GroupMemberFullInfo - 68, // 11: OpenIMServer.group.GetJoinedGroupListReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination - 66, // 12: OpenIMServer.group.GetJoinedGroupListResp.groups:type_name -> OpenIMServer.sdkws.GroupInfo - 68, // 13: OpenIMServer.group.GetGroupAllMemberReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination - 70, // 14: OpenIMServer.group.GetGroupAllMemberResp.members:type_name -> OpenIMServer.sdkws.GroupMemberFullInfo - 66, // 15: OpenIMServer.group.CMSGroup.groupInfo:type_name -> OpenIMServer.sdkws.GroupInfo - 68, // 16: OpenIMServer.group.GetGroupsReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination + 69, // 0: OpenIMServer.group.CreateGroupReq.groupInfo:type_name -> OpenIMServer.sdkws.GroupInfo + 69, // 1: OpenIMServer.group.CreateGroupResp.groupInfo:type_name -> OpenIMServer.sdkws.GroupInfo + 69, // 2: OpenIMServer.group.GetGroupsInfoResp.groupInfos:type_name -> OpenIMServer.sdkws.GroupInfo + 70, // 3: OpenIMServer.group.SetGroupInfoReq.groupInfoForSet:type_name -> OpenIMServer.sdkws.GroupInfoForSet + 71, // 4: OpenIMServer.group.GetGroupApplicationListReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination + 72, // 5: OpenIMServer.group.GetGroupApplicationListResp.groupRequests:type_name -> OpenIMServer.sdkws.GroupRequest + 71, // 6: OpenIMServer.group.GetUserReqApplicationListReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination + 72, // 7: OpenIMServer.group.GetUserReqApplicationListResp.groupRequests:type_name -> OpenIMServer.sdkws.GroupRequest + 71, // 8: OpenIMServer.group.GetGroupMemberListReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination + 73, // 9: OpenIMServer.group.GetGroupMemberListResp.members:type_name -> OpenIMServer.sdkws.GroupMemberFullInfo + 73, // 10: OpenIMServer.group.GetGroupMembersInfoResp.members:type_name -> OpenIMServer.sdkws.GroupMemberFullInfo + 71, // 11: OpenIMServer.group.GetJoinedGroupListReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination + 69, // 12: OpenIMServer.group.GetJoinedGroupListResp.groups:type_name -> OpenIMServer.sdkws.GroupInfo + 71, // 13: OpenIMServer.group.GetGroupAllMemberReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination + 73, // 14: OpenIMServer.group.GetGroupAllMemberResp.members:type_name -> OpenIMServer.sdkws.GroupMemberFullInfo + 69, // 15: OpenIMServer.group.CMSGroup.groupInfo:type_name -> OpenIMServer.sdkws.GroupInfo + 71, // 16: OpenIMServer.group.GetGroupsReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination 30, // 17: OpenIMServer.group.GetGroupsResp.groups:type_name -> OpenIMServer.group.CMSGroup - 68, // 18: OpenIMServer.group.GetGroupMembersCMSReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination - 70, // 19: OpenIMServer.group.GetGroupMembersCMSResp.members:type_name -> OpenIMServer.sdkws.GroupMemberFullInfo - 66, // 20: OpenIMServer.group.GetJoinedSuperGroupListResp.groups:type_name -> OpenIMServer.sdkws.GroupInfo - 66, // 21: OpenIMServer.group.GetSuperGroupsInfoResp.groupInfos:type_name -> OpenIMServer.sdkws.GroupInfo - 71, // 22: OpenIMServer.group.SetGroupMemberInfo.nickname:type_name -> OpenIMServer.protobuf.StringValue - 71, // 23: OpenIMServer.group.SetGroupMemberInfo.faceURL:type_name -> OpenIMServer.protobuf.StringValue - 72, // 24: OpenIMServer.group.SetGroupMemberInfo.roleLevel:type_name -> OpenIMServer.protobuf.Int32Value - 71, // 25: OpenIMServer.group.SetGroupMemberInfo.ex:type_name -> OpenIMServer.protobuf.StringValue + 71, // 18: OpenIMServer.group.GetGroupMembersCMSReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination + 73, // 19: OpenIMServer.group.GetGroupMembersCMSResp.members:type_name -> OpenIMServer.sdkws.GroupMemberFullInfo + 69, // 20: OpenIMServer.group.GetJoinedSuperGroupListResp.groups:type_name -> OpenIMServer.sdkws.GroupInfo + 69, // 21: OpenIMServer.group.GetSuperGroupsInfoResp.groupInfos:type_name -> OpenIMServer.sdkws.GroupInfo + 74, // 22: OpenIMServer.group.SetGroupMemberInfo.nickname:type_name -> OpenIMServer.protobuf.StringValue + 74, // 23: OpenIMServer.group.SetGroupMemberInfo.faceURL:type_name -> OpenIMServer.protobuf.StringValue + 75, // 24: OpenIMServer.group.SetGroupMemberInfo.roleLevel:type_name -> OpenIMServer.protobuf.Int32Value + 74, // 25: OpenIMServer.group.SetGroupMemberInfo.ex:type_name -> OpenIMServer.protobuf.StringValue 50, // 26: OpenIMServer.group.SetGroupMemberInfoReq.members:type_name -> OpenIMServer.group.SetGroupMemberInfo 54, // 27: OpenIMServer.group.GetGroupAbstractInfoResp.groupAbstractInfos:type_name -> OpenIMServer.group.GroupAbstractInfo - 70, // 28: OpenIMServer.group.GetUserInGroupMembersResp.members:type_name -> OpenIMServer.sdkws.GroupMemberFullInfo - 70, // 29: OpenIMServer.group.GetGroupMemberRoleLevelResp.members:type_name -> OpenIMServer.sdkws.GroupMemberFullInfo - 66, // 30: OpenIMServer.group.GetGroupInfoCacheResp.groupInfo:type_name -> OpenIMServer.sdkws.GroupInfo - 70, // 31: OpenIMServer.group.GetGroupMemberCacheResp.member:type_name -> OpenIMServer.sdkws.GroupMemberFullInfo - 0, // 32: OpenIMServer.group.group.createGroup:input_type -> OpenIMServer.group.CreateGroupReq - 12, // 33: OpenIMServer.group.group.joinGroup:input_type -> OpenIMServer.group.JoinGroupReq - 16, // 34: OpenIMServer.group.group.quitGroup:input_type -> OpenIMServer.group.QuitGroupReq - 2, // 35: OpenIMServer.group.group.getGroupsInfo:input_type -> OpenIMServer.group.GetGroupsInfoReq - 4, // 36: OpenIMServer.group.group.setGroupInfo:input_type -> OpenIMServer.group.SetGroupInfoReq - 6, // 37: OpenIMServer.group.group.getGroupApplicationList:input_type -> OpenIMServer.group.GetGroupApplicationListReq - 8, // 38: OpenIMServer.group.group.getUserReqApplicationList:input_type -> OpenIMServer.group.GetUserReqApplicationListReq - 10, // 39: OpenIMServer.group.group.transferGroupOwner:input_type -> OpenIMServer.group.TransferGroupOwnerReq - 14, // 40: OpenIMServer.group.group.groupApplicationResponse:input_type -> OpenIMServer.group.GroupApplicationResponseReq - 18, // 41: OpenIMServer.group.group.getGroupMemberList:input_type -> OpenIMServer.group.GetGroupMemberListReq - 20, // 42: OpenIMServer.group.group.getGroupMembersInfo:input_type -> OpenIMServer.group.GetGroupMembersInfoReq - 22, // 43: OpenIMServer.group.group.kickGroupMember:input_type -> OpenIMServer.group.KickGroupMemberReq - 24, // 44: OpenIMServer.group.group.getJoinedGroupList:input_type -> OpenIMServer.group.GetJoinedGroupListReq - 26, // 45: OpenIMServer.group.group.inviteUserToGroup:input_type -> OpenIMServer.group.InviteUserToGroupReq - 31, // 46: OpenIMServer.group.group.getGroups:input_type -> OpenIMServer.group.GetGroupsReq - 34, // 47: OpenIMServer.group.group.getGroupMembersCMS:input_type -> OpenIMServer.group.GetGroupMembersCMSReq - 36, // 48: OpenIMServer.group.group.dismissGroup:input_type -> OpenIMServer.group.DismissGroupReq - 38, // 49: OpenIMServer.group.group.muteGroupMember:input_type -> OpenIMServer.group.MuteGroupMemberReq - 40, // 50: OpenIMServer.group.group.cancelMuteGroupMember:input_type -> OpenIMServer.group.CancelMuteGroupMemberReq - 42, // 51: OpenIMServer.group.group.muteGroup:input_type -> OpenIMServer.group.MuteGroupReq - 44, // 52: OpenIMServer.group.group.cancelMuteGroup:input_type -> OpenIMServer.group.CancelMuteGroupReq - 46, // 53: OpenIMServer.group.group.getJoinedSuperGroupList:input_type -> OpenIMServer.group.GetJoinedSuperGroupListReq - 48, // 54: OpenIMServer.group.group.getSuperGroupsInfo:input_type -> OpenIMServer.group.GetSuperGroupsInfoReq - 51, // 55: OpenIMServer.group.group.setGroupMemberInfo:input_type -> OpenIMServer.group.SetGroupMemberInfoReq - 53, // 56: OpenIMServer.group.group.getGroupAbstractInfo:input_type -> OpenIMServer.group.GetGroupAbstractInfoReq - 56, // 57: OpenIMServer.group.group.getUserInGroupMembers:input_type -> OpenIMServer.group.GetUserInGroupMembersReq - 58, // 58: OpenIMServer.group.group.getGroupMemberUserIDs:input_type -> OpenIMServer.group.GetGroupMemberUserIDsReq - 60, // 59: OpenIMServer.group.group.GetGroupMemberRoleLevel:input_type -> OpenIMServer.group.GetGroupMemberRoleLevelReq - 62, // 60: OpenIMServer.group.group.GetGroupInfoCache:input_type -> OpenIMServer.group.GetGroupInfoCacheReq - 64, // 61: OpenIMServer.group.group.GetGroupMemberCache:input_type -> OpenIMServer.group.GetGroupMemberCacheReq - 1, // 62: OpenIMServer.group.group.createGroup:output_type -> OpenIMServer.group.CreateGroupResp - 13, // 63: OpenIMServer.group.group.joinGroup:output_type -> OpenIMServer.group.JoinGroupResp - 17, // 64: OpenIMServer.group.group.quitGroup:output_type -> OpenIMServer.group.QuitGroupResp - 3, // 65: OpenIMServer.group.group.getGroupsInfo:output_type -> OpenIMServer.group.GetGroupsInfoResp - 5, // 66: OpenIMServer.group.group.setGroupInfo:output_type -> OpenIMServer.group.SetGroupInfoResp - 7, // 67: OpenIMServer.group.group.getGroupApplicationList:output_type -> OpenIMServer.group.GetGroupApplicationListResp - 9, // 68: OpenIMServer.group.group.getUserReqApplicationList:output_type -> OpenIMServer.group.GetUserReqApplicationListResp - 11, // 69: OpenIMServer.group.group.transferGroupOwner:output_type -> OpenIMServer.group.TransferGroupOwnerResp - 15, // 70: OpenIMServer.group.group.groupApplicationResponse:output_type -> OpenIMServer.group.GroupApplicationResponseResp - 19, // 71: OpenIMServer.group.group.getGroupMemberList:output_type -> OpenIMServer.group.GetGroupMemberListResp - 21, // 72: OpenIMServer.group.group.getGroupMembersInfo:output_type -> OpenIMServer.group.GetGroupMembersInfoResp - 23, // 73: OpenIMServer.group.group.kickGroupMember:output_type -> OpenIMServer.group.KickGroupMemberResp - 25, // 74: OpenIMServer.group.group.getJoinedGroupList:output_type -> OpenIMServer.group.GetJoinedGroupListResp - 27, // 75: OpenIMServer.group.group.inviteUserToGroup:output_type -> OpenIMServer.group.InviteUserToGroupResp - 32, // 76: OpenIMServer.group.group.getGroups:output_type -> OpenIMServer.group.GetGroupsResp - 35, // 77: OpenIMServer.group.group.getGroupMembersCMS:output_type -> OpenIMServer.group.GetGroupMembersCMSResp - 37, // 78: OpenIMServer.group.group.dismissGroup:output_type -> OpenIMServer.group.DismissGroupResp - 39, // 79: OpenIMServer.group.group.muteGroupMember:output_type -> OpenIMServer.group.MuteGroupMemberResp - 41, // 80: OpenIMServer.group.group.cancelMuteGroupMember:output_type -> OpenIMServer.group.CancelMuteGroupMemberResp - 43, // 81: OpenIMServer.group.group.muteGroup:output_type -> OpenIMServer.group.MuteGroupResp - 45, // 82: OpenIMServer.group.group.cancelMuteGroup:output_type -> OpenIMServer.group.CancelMuteGroupResp - 47, // 83: OpenIMServer.group.group.getJoinedSuperGroupList:output_type -> OpenIMServer.group.GetJoinedSuperGroupListResp - 49, // 84: OpenIMServer.group.group.getSuperGroupsInfo:output_type -> OpenIMServer.group.GetSuperGroupsInfoResp - 52, // 85: OpenIMServer.group.group.setGroupMemberInfo:output_type -> OpenIMServer.group.SetGroupMemberInfoResp - 55, // 86: OpenIMServer.group.group.getGroupAbstractInfo:output_type -> OpenIMServer.group.GetGroupAbstractInfoResp - 57, // 87: OpenIMServer.group.group.getUserInGroupMembers:output_type -> OpenIMServer.group.GetUserInGroupMembersResp - 59, // 88: OpenIMServer.group.group.getGroupMemberUserIDs:output_type -> OpenIMServer.group.GetGroupMemberUserIDsResp - 61, // 89: OpenIMServer.group.group.GetGroupMemberRoleLevel:output_type -> OpenIMServer.group.GetGroupMemberRoleLevelResp - 63, // 90: OpenIMServer.group.group.GetGroupInfoCache:output_type -> OpenIMServer.group.GetGroupInfoCacheResp - 65, // 91: OpenIMServer.group.group.GetGroupMemberCache:output_type -> OpenIMServer.group.GetGroupMemberCacheResp - 62, // [62:92] is the sub-list for method output_type - 32, // [32:62] is the sub-list for method input_type - 32, // [32:32] is the sub-list for extension type_name - 32, // [32:32] is the sub-list for extension extendee - 0, // [0:32] is the sub-list for field type_name + 73, // 28: OpenIMServer.group.GetUserInGroupMembersResp.members:type_name -> OpenIMServer.sdkws.GroupMemberFullInfo + 73, // 29: OpenIMServer.group.GetGroupMemberRoleLevelResp.members:type_name -> OpenIMServer.sdkws.GroupMemberFullInfo + 69, // 30: OpenIMServer.group.GetGroupInfoCacheResp.groupInfo:type_name -> OpenIMServer.sdkws.GroupInfo + 73, // 31: OpenIMServer.group.GetGroupMemberCacheResp.member:type_name -> OpenIMServer.sdkws.GroupMemberFullInfo + 68, // 32: OpenIMServer.group.GroupCreateCountResp.count:type_name -> OpenIMServer.group.GroupCreateCountResp.CountEntry + 0, // 33: OpenIMServer.group.group.createGroup:input_type -> OpenIMServer.group.CreateGroupReq + 12, // 34: OpenIMServer.group.group.joinGroup:input_type -> OpenIMServer.group.JoinGroupReq + 16, // 35: OpenIMServer.group.group.quitGroup:input_type -> OpenIMServer.group.QuitGroupReq + 2, // 36: OpenIMServer.group.group.getGroupsInfo:input_type -> OpenIMServer.group.GetGroupsInfoReq + 4, // 37: OpenIMServer.group.group.setGroupInfo:input_type -> OpenIMServer.group.SetGroupInfoReq + 6, // 38: OpenIMServer.group.group.getGroupApplicationList:input_type -> OpenIMServer.group.GetGroupApplicationListReq + 8, // 39: OpenIMServer.group.group.getUserReqApplicationList:input_type -> OpenIMServer.group.GetUserReqApplicationListReq + 10, // 40: OpenIMServer.group.group.transferGroupOwner:input_type -> OpenIMServer.group.TransferGroupOwnerReq + 14, // 41: OpenIMServer.group.group.groupApplicationResponse:input_type -> OpenIMServer.group.GroupApplicationResponseReq + 18, // 42: OpenIMServer.group.group.getGroupMemberList:input_type -> OpenIMServer.group.GetGroupMemberListReq + 20, // 43: OpenIMServer.group.group.getGroupMembersInfo:input_type -> OpenIMServer.group.GetGroupMembersInfoReq + 22, // 44: OpenIMServer.group.group.kickGroupMember:input_type -> OpenIMServer.group.KickGroupMemberReq + 24, // 45: OpenIMServer.group.group.getJoinedGroupList:input_type -> OpenIMServer.group.GetJoinedGroupListReq + 26, // 46: OpenIMServer.group.group.inviteUserToGroup:input_type -> OpenIMServer.group.InviteUserToGroupReq + 31, // 47: OpenIMServer.group.group.getGroups:input_type -> OpenIMServer.group.GetGroupsReq + 34, // 48: OpenIMServer.group.group.getGroupMembersCMS:input_type -> OpenIMServer.group.GetGroupMembersCMSReq + 36, // 49: OpenIMServer.group.group.dismissGroup:input_type -> OpenIMServer.group.DismissGroupReq + 38, // 50: OpenIMServer.group.group.muteGroupMember:input_type -> OpenIMServer.group.MuteGroupMemberReq + 40, // 51: OpenIMServer.group.group.cancelMuteGroupMember:input_type -> OpenIMServer.group.CancelMuteGroupMemberReq + 42, // 52: OpenIMServer.group.group.muteGroup:input_type -> OpenIMServer.group.MuteGroupReq + 44, // 53: OpenIMServer.group.group.cancelMuteGroup:input_type -> OpenIMServer.group.CancelMuteGroupReq + 46, // 54: OpenIMServer.group.group.getJoinedSuperGroupList:input_type -> OpenIMServer.group.GetJoinedSuperGroupListReq + 48, // 55: OpenIMServer.group.group.getSuperGroupsInfo:input_type -> OpenIMServer.group.GetSuperGroupsInfoReq + 51, // 56: OpenIMServer.group.group.setGroupMemberInfo:input_type -> OpenIMServer.group.SetGroupMemberInfoReq + 53, // 57: OpenIMServer.group.group.getGroupAbstractInfo:input_type -> OpenIMServer.group.GetGroupAbstractInfoReq + 56, // 58: OpenIMServer.group.group.getUserInGroupMembers:input_type -> OpenIMServer.group.GetUserInGroupMembersReq + 58, // 59: OpenIMServer.group.group.getGroupMemberUserIDs:input_type -> OpenIMServer.group.GetGroupMemberUserIDsReq + 60, // 60: OpenIMServer.group.group.GetGroupMemberRoleLevel:input_type -> OpenIMServer.group.GetGroupMemberRoleLevelReq + 62, // 61: OpenIMServer.group.group.GetGroupInfoCache:input_type -> OpenIMServer.group.GetGroupInfoCacheReq + 64, // 62: OpenIMServer.group.group.GetGroupMemberCache:input_type -> OpenIMServer.group.GetGroupMemberCacheReq + 66, // 63: OpenIMServer.group.group.GroupCreateCount:input_type -> OpenIMServer.group.GroupCreateCountReq + 1, // 64: OpenIMServer.group.group.createGroup:output_type -> OpenIMServer.group.CreateGroupResp + 13, // 65: OpenIMServer.group.group.joinGroup:output_type -> OpenIMServer.group.JoinGroupResp + 17, // 66: OpenIMServer.group.group.quitGroup:output_type -> OpenIMServer.group.QuitGroupResp + 3, // 67: OpenIMServer.group.group.getGroupsInfo:output_type -> OpenIMServer.group.GetGroupsInfoResp + 5, // 68: OpenIMServer.group.group.setGroupInfo:output_type -> OpenIMServer.group.SetGroupInfoResp + 7, // 69: OpenIMServer.group.group.getGroupApplicationList:output_type -> OpenIMServer.group.GetGroupApplicationListResp + 9, // 70: OpenIMServer.group.group.getUserReqApplicationList:output_type -> OpenIMServer.group.GetUserReqApplicationListResp + 11, // 71: OpenIMServer.group.group.transferGroupOwner:output_type -> OpenIMServer.group.TransferGroupOwnerResp + 15, // 72: OpenIMServer.group.group.groupApplicationResponse:output_type -> OpenIMServer.group.GroupApplicationResponseResp + 19, // 73: OpenIMServer.group.group.getGroupMemberList:output_type -> OpenIMServer.group.GetGroupMemberListResp + 21, // 74: OpenIMServer.group.group.getGroupMembersInfo:output_type -> OpenIMServer.group.GetGroupMembersInfoResp + 23, // 75: OpenIMServer.group.group.kickGroupMember:output_type -> OpenIMServer.group.KickGroupMemberResp + 25, // 76: OpenIMServer.group.group.getJoinedGroupList:output_type -> OpenIMServer.group.GetJoinedGroupListResp + 27, // 77: OpenIMServer.group.group.inviteUserToGroup:output_type -> OpenIMServer.group.InviteUserToGroupResp + 32, // 78: OpenIMServer.group.group.getGroups:output_type -> OpenIMServer.group.GetGroupsResp + 35, // 79: OpenIMServer.group.group.getGroupMembersCMS:output_type -> OpenIMServer.group.GetGroupMembersCMSResp + 37, // 80: OpenIMServer.group.group.dismissGroup:output_type -> OpenIMServer.group.DismissGroupResp + 39, // 81: OpenIMServer.group.group.muteGroupMember:output_type -> OpenIMServer.group.MuteGroupMemberResp + 41, // 82: OpenIMServer.group.group.cancelMuteGroupMember:output_type -> OpenIMServer.group.CancelMuteGroupMemberResp + 43, // 83: OpenIMServer.group.group.muteGroup:output_type -> OpenIMServer.group.MuteGroupResp + 45, // 84: OpenIMServer.group.group.cancelMuteGroup:output_type -> OpenIMServer.group.CancelMuteGroupResp + 47, // 85: OpenIMServer.group.group.getJoinedSuperGroupList:output_type -> OpenIMServer.group.GetJoinedSuperGroupListResp + 49, // 86: OpenIMServer.group.group.getSuperGroupsInfo:output_type -> OpenIMServer.group.GetSuperGroupsInfoResp + 52, // 87: OpenIMServer.group.group.setGroupMemberInfo:output_type -> OpenIMServer.group.SetGroupMemberInfoResp + 55, // 88: OpenIMServer.group.group.getGroupAbstractInfo:output_type -> OpenIMServer.group.GetGroupAbstractInfoResp + 57, // 89: OpenIMServer.group.group.getUserInGroupMembers:output_type -> OpenIMServer.group.GetUserInGroupMembersResp + 59, // 90: OpenIMServer.group.group.getGroupMemberUserIDs:output_type -> OpenIMServer.group.GetGroupMemberUserIDsResp + 61, // 91: OpenIMServer.group.group.GetGroupMemberRoleLevel:output_type -> OpenIMServer.group.GetGroupMemberRoleLevelResp + 63, // 92: OpenIMServer.group.group.GetGroupInfoCache:output_type -> OpenIMServer.group.GetGroupInfoCacheResp + 65, // 93: OpenIMServer.group.group.GetGroupMemberCache:output_type -> OpenIMServer.group.GetGroupMemberCacheResp + 67, // 94: OpenIMServer.group.group.GroupCreateCount:output_type -> OpenIMServer.group.GroupCreateCountResp + 64, // [64:95] is the sub-list for method output_type + 33, // [33:64] is the sub-list for method input_type + 33, // [33:33] is the sub-list for extension type_name + 33, // [33:33] is the sub-list for extension extendee + 0, // [0:33] is the sub-list for field type_name } func init() { file_group_group_proto_init() } @@ -4957,6 +5104,30 @@ func file_group_group_proto_init() { return nil } } + file_group_group_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GroupCreateCountReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_group_group_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GroupCreateCountResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -4964,7 +5135,7 @@ func file_group_group_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_group_group_proto_rawDesc, NumEnums: 0, - NumMessages: 66, + NumMessages: 69, NumExtensions: 0, NumServices: 1, }, @@ -5047,6 +5218,7 @@ type GroupClient interface { GetGroupMemberRoleLevel(ctx context.Context, in *GetGroupMemberRoleLevelReq, opts ...grpc.CallOption) (*GetGroupMemberRoleLevelResp, error) GetGroupInfoCache(ctx context.Context, in *GetGroupInfoCacheReq, opts ...grpc.CallOption) (*GetGroupInfoCacheResp, error) GetGroupMemberCache(ctx context.Context, in *GetGroupMemberCacheReq, opts ...grpc.CallOption) (*GetGroupMemberCacheResp, error) + GroupCreateCount(ctx context.Context, in *GroupCreateCountReq, opts ...grpc.CallOption) (*GroupCreateCountResp, error) } type groupClient struct { @@ -5327,6 +5499,15 @@ func (c *groupClient) GetGroupMemberCache(ctx context.Context, in *GetGroupMembe return out, nil } +func (c *groupClient) GroupCreateCount(ctx context.Context, in *GroupCreateCountReq, opts ...grpc.CallOption) (*GroupCreateCountResp, error) { + out := new(GroupCreateCountResp) + err := c.cc.Invoke(ctx, "/OpenIMServer.group.group/GroupCreateCount", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // GroupServer is the server API for Group service. type GroupServer interface { // 创建群 @@ -5386,6 +5567,7 @@ type GroupServer interface { GetGroupMemberRoleLevel(context.Context, *GetGroupMemberRoleLevelReq) (*GetGroupMemberRoleLevelResp, error) GetGroupInfoCache(context.Context, *GetGroupInfoCacheReq) (*GetGroupInfoCacheResp, error) GetGroupMemberCache(context.Context, *GetGroupMemberCacheReq) (*GetGroupMemberCacheResp, error) + GroupCreateCount(context.Context, *GroupCreateCountReq) (*GroupCreateCountResp, error) } // UnimplementedGroupServer can be embedded to have forward compatible implementations. @@ -5482,6 +5664,9 @@ func (*UnimplementedGroupServer) GetGroupInfoCache(context.Context, *GetGroupInf func (*UnimplementedGroupServer) GetGroupMemberCache(context.Context, *GetGroupMemberCacheReq) (*GetGroupMemberCacheResp, error) { return nil, status.Errorf(codes.Unimplemented, "method GetGroupMemberCache not implemented") } +func (*UnimplementedGroupServer) GroupCreateCount(context.Context, *GroupCreateCountReq) (*GroupCreateCountResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method GroupCreateCount not implemented") +} func RegisterGroupServer(s *grpc.Server, srv GroupServer) { s.RegisterService(&_Group_serviceDesc, srv) @@ -6027,6 +6212,24 @@ func _Group_GetGroupMemberCache_Handler(srv interface{}, ctx context.Context, de return interceptor(ctx, in, info, handler) } +func _Group_GroupCreateCount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GroupCreateCountReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GroupServer).GroupCreateCount(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/OpenIMServer.group.group/GroupCreateCount", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GroupServer).GroupCreateCount(ctx, req.(*GroupCreateCountReq)) + } + return interceptor(ctx, in, info, handler) +} + var _Group_serviceDesc = grpc.ServiceDesc{ ServiceName: "OpenIMServer.group.group", HandlerType: (*GroupServer)(nil), @@ -6151,6 +6354,10 @@ var _Group_serviceDesc = grpc.ServiceDesc{ MethodName: "GetGroupMemberCache", Handler: _Group_GetGroupMemberCache_Handler, }, + { + MethodName: "GroupCreateCount", + Handler: _Group_GroupCreateCount_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "group/group.proto", diff --git a/pkg/proto/group/group.proto b/pkg/proto/group/group.proto index 9d02f58f7..9379ebe86 100644 --- a/pkg/proto/group/group.proto +++ b/pkg/proto/group/group.proto @@ -332,6 +332,17 @@ message GetGroupMemberCacheResp { sdkws.GroupMemberFullInfo member = 1; } +message GroupCreateCountReq { + int64 start = 1; + int64 end = 2; +} + +message GroupCreateCountResp { + int64 total = 1; + int64 before = 2; + map count = 3; +} + service group{ //创建群 rpc createGroup(CreateGroupReq) returns(CreateGroupResp); @@ -394,6 +405,8 @@ service group{ rpc GetGroupInfoCache(GetGroupInfoCacheReq) returns (GetGroupInfoCacheResp); rpc GetGroupMemberCache(GetGroupMemberCacheReq) returns (GetGroupMemberCacheResp); + + rpc GroupCreateCount(GroupCreateCountReq) returns (GroupCreateCountResp); } diff --git a/pkg/proto/msg/msg.pb.go b/pkg/proto/msg/msg.pb.go index f52af2b63..2686704cc 100644 --- a/pkg/proto/msg/msg.pb.go +++ b/pkg/proto/msg/msg.pb.go @@ -8,17 +8,14 @@ package msg import ( context "context" - reflect "reflect" - sync "sync" - + sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" - - sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" - wrapperspb "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/wrapperspb" + reflect "reflect" + sync "sync" ) const ( @@ -630,24 +627,17 @@ func (x *GetSendMsgStatusResp) GetStatus() int32 { return 0 } -type ModifyMessageReactionExtensionsReq struct { +type MsgDataToModifyByMQ struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` - SessionType int32 `protobuf:"varint,2,opt,name=sessionType,proto3" json:"sessionType"` - ReactionExtensions map[string]*sdkws.KeyValue `protobuf:"bytes,3,rep,name=reactionExtensions,proto3" json:"reactionExtensions" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - ClientMsgID string `protobuf:"bytes,4,opt,name=clientMsgID,proto3" json:"clientMsgID"` - Ex *wrapperspb.StringValue `protobuf:"bytes,5,opt,name=ex,proto3" json:"ex"` - AttachedInfo *wrapperspb.StringValue `protobuf:"bytes,6,opt,name=attachedInfo,proto3" json:"attachedInfo"` - IsReact bool `protobuf:"varint,7,opt,name=isReact,proto3" json:"isReact"` - IsExternalExtensions bool `protobuf:"varint,8,opt,name=isExternalExtensions,proto3" json:"isExternalExtensions"` - MsgFirstModifyTime int64 `protobuf:"varint,9,opt,name=msgFirstModifyTime,proto3" json:"msgFirstModifyTime"` + Messages []*sdkws.MsgData `protobuf:"bytes,1,rep,name=messages,proto3" json:"messages"` + ConversationID string `protobuf:"bytes,2,opt,name=conversationID,proto3" json:"conversationID"` } -func (x *ModifyMessageReactionExtensionsReq) Reset() { - *x = ModifyMessageReactionExtensionsReq{} +func (x *MsgDataToModifyByMQ) Reset() { + *x = MsgDataToModifyByMQ{} if protoimpl.UnsafeEnabled { mi := &file_msg_msg_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -655,13 +645,13 @@ func (x *ModifyMessageReactionExtensionsReq) Reset() { } } -func (x *ModifyMessageReactionExtensionsReq) String() string { +func (x *MsgDataToModifyByMQ) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ModifyMessageReactionExtensionsReq) ProtoMessage() {} +func (*MsgDataToModifyByMQ) ProtoMessage() {} -func (x *ModifyMessageReactionExtensionsReq) ProtoReflect() protoreflect.Message { +func (x *MsgDataToModifyByMQ) ProtoReflect() protoreflect.Message { mi := &file_msg_msg_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -673,92 +663,33 @@ func (x *ModifyMessageReactionExtensionsReq) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use ModifyMessageReactionExtensionsReq.ProtoReflect.Descriptor instead. -func (*ModifyMessageReactionExtensionsReq) Descriptor() ([]byte, []int) { +// Deprecated: Use MsgDataToModifyByMQ.ProtoReflect.Descriptor instead. +func (*MsgDataToModifyByMQ) Descriptor() ([]byte, []int) { return file_msg_msg_proto_rawDescGZIP(), []int{12} } -func (x *ModifyMessageReactionExtensionsReq) GetConversationID() string { - if x != nil { - return x.ConversationID - } - return "" -} - -func (x *ModifyMessageReactionExtensionsReq) GetSessionType() int32 { - if x != nil { - return x.SessionType - } - return 0 -} - -func (x *ModifyMessageReactionExtensionsReq) GetReactionExtensions() map[string]*sdkws.KeyValue { +func (x *MsgDataToModifyByMQ) GetMessages() []*sdkws.MsgData { if x != nil { - return x.ReactionExtensions + return x.Messages } return nil } -func (x *ModifyMessageReactionExtensionsReq) GetClientMsgID() string { +func (x *MsgDataToModifyByMQ) GetConversationID() string { if x != nil { - return x.ClientMsgID + return x.ConversationID } return "" } -func (x *ModifyMessageReactionExtensionsReq) GetEx() *wrapperspb.StringValue { - if x != nil { - return x.Ex - } - return nil -} - -func (x *ModifyMessageReactionExtensionsReq) GetAttachedInfo() *wrapperspb.StringValue { - if x != nil { - return x.AttachedInfo - } - return nil -} - -func (x *ModifyMessageReactionExtensionsReq) GetIsReact() bool { - if x != nil { - return x.IsReact - } - return false -} - -func (x *ModifyMessageReactionExtensionsReq) GetIsExternalExtensions() bool { - if x != nil { - return x.IsExternalExtensions - } - return false -} - -func (x *ModifyMessageReactionExtensionsReq) GetMsgFirstModifyTime() int64 { - if x != nil { - return x.MsgFirstModifyTime - } - return 0 -} - -type SetMessageReactionExtensionsReq struct { +type DelMsgsReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` - SessionType int32 `protobuf:"varint,2,opt,name=sessionType,proto3" json:"sessionType"` - ReactionExtensions map[string]*sdkws.KeyValue `protobuf:"bytes,3,rep,name=reactionExtensions,proto3" json:"reactionExtensions" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - ClientMsgID string `protobuf:"bytes,4,opt,name=clientMsgID,proto3" json:"clientMsgID"` - Ex *wrapperspb.StringValue `protobuf:"bytes,5,opt,name=ex,proto3" json:"ex"` - AttachedInfo *wrapperspb.StringValue `protobuf:"bytes,6,opt,name=attachedInfo,proto3" json:"attachedInfo"` - IsReact bool `protobuf:"varint,7,opt,name=isReact,proto3" json:"isReact"` - IsExternalExtensions bool `protobuf:"varint,8,opt,name=isExternalExtensions,proto3" json:"isExternalExtensions"` - MsgFirstModifyTime int64 `protobuf:"varint,9,opt,name=msgFirstModifyTime,proto3" json:"msgFirstModifyTime"` } -func (x *SetMessageReactionExtensionsReq) Reset() { - *x = SetMessageReactionExtensionsReq{} +func (x *DelMsgsReq) Reset() { + *x = DelMsgsReq{} if protoimpl.UnsafeEnabled { mi := &file_msg_msg_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -766,13 +697,13 @@ func (x *SetMessageReactionExtensionsReq) Reset() { } } -func (x *SetMessageReactionExtensionsReq) String() string { +func (x *DelMsgsReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SetMessageReactionExtensionsReq) ProtoMessage() {} +func (*DelMsgsReq) ProtoMessage() {} -func (x *SetMessageReactionExtensionsReq) ProtoReflect() protoreflect.Message { +func (x *DelMsgsReq) ProtoReflect() protoreflect.Message { mi := &file_msg_msg_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -784,87 +715,19 @@ func (x *SetMessageReactionExtensionsReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SetMessageReactionExtensionsReq.ProtoReflect.Descriptor instead. -func (*SetMessageReactionExtensionsReq) Descriptor() ([]byte, []int) { +// Deprecated: Use DelMsgsReq.ProtoReflect.Descriptor instead. +func (*DelMsgsReq) Descriptor() ([]byte, []int) { return file_msg_msg_proto_rawDescGZIP(), []int{13} } -func (x *SetMessageReactionExtensionsReq) GetConversationID() string { - if x != nil { - return x.ConversationID - } - return "" -} - -func (x *SetMessageReactionExtensionsReq) GetSessionType() int32 { - if x != nil { - return x.SessionType - } - return 0 -} - -func (x *SetMessageReactionExtensionsReq) GetReactionExtensions() map[string]*sdkws.KeyValue { - if x != nil { - return x.ReactionExtensions - } - return nil -} - -func (x *SetMessageReactionExtensionsReq) GetClientMsgID() string { - if x != nil { - return x.ClientMsgID - } - return "" -} - -func (x *SetMessageReactionExtensionsReq) GetEx() *wrapperspb.StringValue { - if x != nil { - return x.Ex - } - return nil -} - -func (x *SetMessageReactionExtensionsReq) GetAttachedInfo() *wrapperspb.StringValue { - if x != nil { - return x.AttachedInfo - } - return nil -} - -func (x *SetMessageReactionExtensionsReq) GetIsReact() bool { - if x != nil { - return x.IsReact - } - return false -} - -func (x *SetMessageReactionExtensionsReq) GetIsExternalExtensions() bool { - if x != nil { - return x.IsExternalExtensions - } - return false -} - -func (x *SetMessageReactionExtensionsReq) GetMsgFirstModifyTime() int64 { - if x != nil { - return x.MsgFirstModifyTime - } - return 0 -} - -type SetMessageReactionExtensionsResp struct { +type DelMsgsResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - ClientMsgID string `protobuf:"bytes,1,opt,name=clientMsgID,proto3" json:"clientMsgID"` - MsgFirstModifyTime int64 `protobuf:"varint,2,opt,name=msgFirstModifyTime,proto3" json:"msgFirstModifyTime"` - IsReact bool `protobuf:"varint,3,opt,name=isReact,proto3" json:"isReact"` - Result []*KeyValueResp `protobuf:"bytes,4,rep,name=result,proto3" json:"result"` } -func (x *SetMessageReactionExtensionsResp) Reset() { - *x = SetMessageReactionExtensionsResp{} +func (x *DelMsgsResp) Reset() { + *x = DelMsgsResp{} if protoimpl.UnsafeEnabled { mi := &file_msg_msg_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -872,13 +735,13 @@ func (x *SetMessageReactionExtensionsResp) Reset() { } } -func (x *SetMessageReactionExtensionsResp) String() string { +func (x *DelMsgsResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SetMessageReactionExtensionsResp) ProtoMessage() {} +func (*DelMsgsResp) ProtoMessage() {} -func (x *SetMessageReactionExtensionsResp) ProtoReflect() protoreflect.Message { +func (x *DelMsgsResp) ProtoReflect() protoreflect.Message { mi := &file_msg_msg_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -890,52 +753,23 @@ func (x *SetMessageReactionExtensionsResp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SetMessageReactionExtensionsResp.ProtoReflect.Descriptor instead. -func (*SetMessageReactionExtensionsResp) Descriptor() ([]byte, []int) { +// Deprecated: Use DelMsgsResp.ProtoReflect.Descriptor instead. +func (*DelMsgsResp) Descriptor() ([]byte, []int) { return file_msg_msg_proto_rawDescGZIP(), []int{14} } -func (x *SetMessageReactionExtensionsResp) GetClientMsgID() string { - if x != nil { - return x.ClientMsgID - } - return "" -} - -func (x *SetMessageReactionExtensionsResp) GetMsgFirstModifyTime() int64 { - if x != nil { - return x.MsgFirstModifyTime - } - return 0 -} - -func (x *SetMessageReactionExtensionsResp) GetIsReact() bool { - if x != nil { - return x.IsReact - } - return false -} - -func (x *SetMessageReactionExtensionsResp) GetResult() []*KeyValueResp { - if x != nil { - return x.Result - } - return nil -} - -type GetMessagesReactionExtensionsReq struct { +type RevokeMsgReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` - SessionType int32 `protobuf:"varint,2,opt,name=sessionType,proto3" json:"sessionType"` - MessageReactionKeys []*GetMessagesReactionExtensionsReq_MessageReactionKey `protobuf:"bytes,3,rep,name=messageReactionKeys,proto3" json:"messageReactionKeys"` - TypeKeys []string `protobuf:"bytes,4,rep,name=TypeKeys,proto3" json:"TypeKeys"` + ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` + Seq int64 `protobuf:"varint,2,opt,name=seq,proto3" json:"seq"` + UserID string `protobuf:"bytes,3,opt,name=userID,proto3" json:"userID"` } -func (x *GetMessagesReactionExtensionsReq) Reset() { - *x = GetMessagesReactionExtensionsReq{} +func (x *RevokeMsgReq) Reset() { + *x = RevokeMsgReq{} if protoimpl.UnsafeEnabled { mi := &file_msg_msg_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -943,13 +777,13 @@ func (x *GetMessagesReactionExtensionsReq) Reset() { } } -func (x *GetMessagesReactionExtensionsReq) String() string { +func (x *RevokeMsgReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetMessagesReactionExtensionsReq) ProtoMessage() {} +func (*RevokeMsgReq) ProtoMessage() {} -func (x *GetMessagesReactionExtensionsReq) ProtoReflect() protoreflect.Message { +func (x *RevokeMsgReq) ProtoReflect() protoreflect.Message { mi := &file_msg_msg_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -961,49 +795,40 @@ func (x *GetMessagesReactionExtensionsReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetMessagesReactionExtensionsReq.ProtoReflect.Descriptor instead. -func (*GetMessagesReactionExtensionsReq) Descriptor() ([]byte, []int) { +// Deprecated: Use RevokeMsgReq.ProtoReflect.Descriptor instead. +func (*RevokeMsgReq) Descriptor() ([]byte, []int) { return file_msg_msg_proto_rawDescGZIP(), []int{15} } -func (x *GetMessagesReactionExtensionsReq) GetConversationID() string { +func (x *RevokeMsgReq) GetConversationID() string { if x != nil { return x.ConversationID } return "" } -func (x *GetMessagesReactionExtensionsReq) GetSessionType() int32 { +func (x *RevokeMsgReq) GetSeq() int64 { if x != nil { - return x.SessionType + return x.Seq } return 0 } -func (x *GetMessagesReactionExtensionsReq) GetMessageReactionKeys() []*GetMessagesReactionExtensionsReq_MessageReactionKey { - if x != nil { - return x.MessageReactionKeys - } - return nil -} - -func (x *GetMessagesReactionExtensionsReq) GetTypeKeys() []string { +func (x *RevokeMsgReq) GetUserID() string { if x != nil { - return x.TypeKeys + return x.UserID } - return nil + return "" } -type GetMessagesReactionExtensionsResp struct { +type RevokeMsgResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - SingleMessageResult []*SingleMessageExtensionResult `protobuf:"bytes,1,rep,name=singleMessageResult,proto3" json:"singleMessageResult"` } -func (x *GetMessagesReactionExtensionsResp) Reset() { - *x = GetMessagesReactionExtensionsResp{} +func (x *RevokeMsgResp) Reset() { + *x = RevokeMsgResp{} if protoimpl.UnsafeEnabled { mi := &file_msg_msg_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1011,13 +836,13 @@ func (x *GetMessagesReactionExtensionsResp) Reset() { } } -func (x *GetMessagesReactionExtensionsResp) String() string { +func (x *RevokeMsgResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetMessagesReactionExtensionsResp) ProtoMessage() {} +func (*RevokeMsgResp) ProtoMessage() {} -func (x *GetMessagesReactionExtensionsResp) ProtoReflect() protoreflect.Message { +func (x *RevokeMsgResp) ProtoReflect() protoreflect.Message { mi := &file_msg_msg_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1029,29 +854,23 @@ func (x *GetMessagesReactionExtensionsResp) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetMessagesReactionExtensionsResp.ProtoReflect.Descriptor instead. -func (*GetMessagesReactionExtensionsResp) Descriptor() ([]byte, []int) { +// Deprecated: Use RevokeMsgResp.ProtoReflect.Descriptor instead. +func (*RevokeMsgResp) Descriptor() ([]byte, []int) { return file_msg_msg_proto_rawDescGZIP(), []int{16} } -func (x *GetMessagesReactionExtensionsResp) GetSingleMessageResult() []*SingleMessageExtensionResult { - if x != nil { - return x.SingleMessageResult - } - return nil -} - -type SingleMessageExtensionResult struct { +type MarkMsgsAsReadReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ReactionExtensions map[string]*sdkws.KeyValue `protobuf:"bytes,1,rep,name=reactionExtensions,proto3" json:"reactionExtensions" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - ClientMsgID string `protobuf:"bytes,2,opt,name=clientMsgID,proto3" json:"clientMsgID"` + ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` + Seqs []int64 `protobuf:"varint,2,rep,packed,name=seqs,proto3" json:"seqs"` + UserID string `protobuf:"bytes,3,opt,name=userID,proto3" json:"userID"` } -func (x *SingleMessageExtensionResult) Reset() { - *x = SingleMessageExtensionResult{} +func (x *MarkMsgsAsReadReq) Reset() { + *x = MarkMsgsAsReadReq{} if protoimpl.UnsafeEnabled { mi := &file_msg_msg_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1059,13 +878,13 @@ func (x *SingleMessageExtensionResult) Reset() { } } -func (x *SingleMessageExtensionResult) String() string { +func (x *MarkMsgsAsReadReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SingleMessageExtensionResult) ProtoMessage() {} +func (*MarkMsgsAsReadReq) ProtoMessage() {} -func (x *SingleMessageExtensionResult) ProtoReflect() protoreflect.Message { +func (x *MarkMsgsAsReadReq) ProtoReflect() protoreflect.Message { mi := &file_msg_msg_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1077,36 +896,40 @@ func (x *SingleMessageExtensionResult) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SingleMessageExtensionResult.ProtoReflect.Descriptor instead. -func (*SingleMessageExtensionResult) Descriptor() ([]byte, []int) { +// Deprecated: Use MarkMsgsAsReadReq.ProtoReflect.Descriptor instead. +func (*MarkMsgsAsReadReq) Descriptor() ([]byte, []int) { return file_msg_msg_proto_rawDescGZIP(), []int{17} } -func (x *SingleMessageExtensionResult) GetReactionExtensions() map[string]*sdkws.KeyValue { +func (x *MarkMsgsAsReadReq) GetConversationID() string { + if x != nil { + return x.ConversationID + } + return "" +} + +func (x *MarkMsgsAsReadReq) GetSeqs() []int64 { if x != nil { - return x.ReactionExtensions + return x.Seqs } return nil } -func (x *SingleMessageExtensionResult) GetClientMsgID() string { +func (x *MarkMsgsAsReadReq) GetUserID() string { if x != nil { - return x.ClientMsgID + return x.UserID } return "" } -type ModifyMessageReactionExtensionsResp struct { +type MarkMsgsAsReadResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - SuccessList []*ExtendMsgResp `protobuf:"bytes,1,rep,name=successList,proto3" json:"successList"` - FailedList []*ExtendMsgResp `protobuf:"bytes,2,rep,name=failedList,proto3" json:"failedList"` } -func (x *ModifyMessageReactionExtensionsResp) Reset() { - *x = ModifyMessageReactionExtensionsResp{} +func (x *MarkMsgsAsReadResp) Reset() { + *x = MarkMsgsAsReadResp{} if protoimpl.UnsafeEnabled { mi := &file_msg_msg_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1114,13 +937,13 @@ func (x *ModifyMessageReactionExtensionsResp) Reset() { } } -func (x *ModifyMessageReactionExtensionsResp) String() string { +func (x *MarkMsgsAsReadResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ModifyMessageReactionExtensionsResp) ProtoMessage() {} +func (*MarkMsgsAsReadResp) ProtoMessage() {} -func (x *ModifyMessageReactionExtensionsResp) ProtoReflect() protoreflect.Message { +func (x *MarkMsgsAsReadResp) ProtoReflect() protoreflect.Message { mi := &file_msg_msg_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1132,42 +955,24 @@ func (x *ModifyMessageReactionExtensionsResp) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use ModifyMessageReactionExtensionsResp.ProtoReflect.Descriptor instead. -func (*ModifyMessageReactionExtensionsResp) Descriptor() ([]byte, []int) { +// Deprecated: Use MarkMsgsAsReadResp.ProtoReflect.Descriptor instead. +func (*MarkMsgsAsReadResp) Descriptor() ([]byte, []int) { return file_msg_msg_proto_rawDescGZIP(), []int{18} } -func (x *ModifyMessageReactionExtensionsResp) GetSuccessList() []*ExtendMsgResp { - if x != nil { - return x.SuccessList - } - return nil -} - -func (x *ModifyMessageReactionExtensionsResp) GetFailedList() []*ExtendMsgResp { - if x != nil { - return x.FailedList - } - return nil -} - -type DeleteMessagesReactionExtensionsReq struct { +type MarkConversationAsReadReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - OperationID string `protobuf:"bytes,1,opt,name=operationID,proto3" json:"operationID"` - OpUserID string `protobuf:"bytes,2,opt,name=opUserID,proto3" json:"opUserID"` - ConversationID string `protobuf:"bytes,3,opt,name=conversationID,proto3" json:"conversationID"` - SessionType int32 `protobuf:"varint,4,opt,name=sessionType,proto3" json:"sessionType"` - ClientMsgID string `protobuf:"bytes,5,opt,name=clientMsgID,proto3" json:"clientMsgID"` - IsExternalExtensions bool `protobuf:"varint,6,opt,name=isExternalExtensions,proto3" json:"isExternalExtensions"` - MsgFirstModifyTime int64 `protobuf:"varint,7,opt,name=msgFirstModifyTime,proto3" json:"msgFirstModifyTime"` - ReactionExtensions []*sdkws.KeyValue `protobuf:"bytes,8,rep,name=reactionExtensions,proto3" json:"reactionExtensions"` + ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` + UserID string `protobuf:"bytes,2,opt,name=userID,proto3" json:"userID"` + HasReadSeq int64 `protobuf:"varint,3,opt,name=hasReadSeq,proto3" json:"hasReadSeq"` + Seqs []int64 `protobuf:"varint,4,rep,packed,name=seqs,proto3" json:"seqs"` } -func (x *DeleteMessagesReactionExtensionsReq) Reset() { - *x = DeleteMessagesReactionExtensionsReq{} +func (x *MarkConversationAsReadReq) Reset() { + *x = MarkConversationAsReadReq{} if protoimpl.UnsafeEnabled { mi := &file_msg_msg_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1175,13 +980,13 @@ func (x *DeleteMessagesReactionExtensionsReq) Reset() { } } -func (x *DeleteMessagesReactionExtensionsReq) String() string { +func (x *MarkConversationAsReadReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteMessagesReactionExtensionsReq) ProtoMessage() {} +func (*MarkConversationAsReadReq) ProtoMessage() {} -func (x *DeleteMessagesReactionExtensionsReq) ProtoReflect() protoreflect.Message { +func (x *MarkConversationAsReadReq) ProtoReflect() protoreflect.Message { mi := &file_msg_msg_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1193,77 +998,47 @@ func (x *DeleteMessagesReactionExtensionsReq) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use DeleteMessagesReactionExtensionsReq.ProtoReflect.Descriptor instead. -func (*DeleteMessagesReactionExtensionsReq) Descriptor() ([]byte, []int) { +// Deprecated: Use MarkConversationAsReadReq.ProtoReflect.Descriptor instead. +func (*MarkConversationAsReadReq) Descriptor() ([]byte, []int) { return file_msg_msg_proto_rawDescGZIP(), []int{19} } -func (x *DeleteMessagesReactionExtensionsReq) GetOperationID() string { - if x != nil { - return x.OperationID - } - return "" -} - -func (x *DeleteMessagesReactionExtensionsReq) GetOpUserID() string { +func (x *MarkConversationAsReadReq) GetConversationID() string { if x != nil { - return x.OpUserID + return x.ConversationID } return "" } -func (x *DeleteMessagesReactionExtensionsReq) GetConversationID() string { +func (x *MarkConversationAsReadReq) GetUserID() string { if x != nil { - return x.ConversationID + return x.UserID } return "" } -func (x *DeleteMessagesReactionExtensionsReq) GetSessionType() int32 { +func (x *MarkConversationAsReadReq) GetHasReadSeq() int64 { if x != nil { - return x.SessionType + return x.HasReadSeq } return 0 } -func (x *DeleteMessagesReactionExtensionsReq) GetClientMsgID() string { +func (x *MarkConversationAsReadReq) GetSeqs() []int64 { if x != nil { - return x.ClientMsgID + return x.Seqs } - return "" + return nil } -func (x *DeleteMessagesReactionExtensionsReq) GetIsExternalExtensions() bool { - if x != nil { - return x.IsExternalExtensions - } - return false -} - -func (x *DeleteMessagesReactionExtensionsReq) GetMsgFirstModifyTime() int64 { - if x != nil { - return x.MsgFirstModifyTime - } - return 0 -} - -func (x *DeleteMessagesReactionExtensionsReq) GetReactionExtensions() []*sdkws.KeyValue { - if x != nil { - return x.ReactionExtensions - } - return nil -} - -type DeleteMessagesReactionExtensionsResp struct { +type MarkConversationAsReadResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Result []*KeyValueResp `protobuf:"bytes,1,rep,name=result,proto3" json:"result"` } -func (x *DeleteMessagesReactionExtensionsResp) Reset() { - *x = DeleteMessagesReactionExtensionsResp{} +func (x *MarkConversationAsReadResp) Reset() { + *x = MarkConversationAsReadResp{} if protoimpl.UnsafeEnabled { mi := &file_msg_msg_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1271,13 +1046,13 @@ func (x *DeleteMessagesReactionExtensionsResp) Reset() { } } -func (x *DeleteMessagesReactionExtensionsResp) String() string { +func (x *MarkConversationAsReadResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteMessagesReactionExtensionsResp) ProtoMessage() {} +func (*MarkConversationAsReadResp) ProtoMessage() {} -func (x *DeleteMessagesReactionExtensionsResp) ProtoReflect() protoreflect.Message { +func (x *MarkConversationAsReadResp) ProtoReflect() protoreflect.Message { mi := &file_msg_msg_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1289,28 +1064,23 @@ func (x *DeleteMessagesReactionExtensionsResp) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use DeleteMessagesReactionExtensionsResp.ProtoReflect.Descriptor instead. -func (*DeleteMessagesReactionExtensionsResp) Descriptor() ([]byte, []int) { +// Deprecated: Use MarkConversationAsReadResp.ProtoReflect.Descriptor instead. +func (*MarkConversationAsReadResp) Descriptor() ([]byte, []int) { return file_msg_msg_proto_rawDescGZIP(), []int{20} } -func (x *DeleteMessagesReactionExtensionsResp) GetResult() []*KeyValueResp { - if x != nil { - return x.Result - } - return nil -} - -type ExtendMsgResp struct { +type SetConversationHasReadSeqReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ExtendMsg *ExtendMsg `protobuf:"bytes,1,opt,name=extendMsg,proto3" json:"extendMsg"` + ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` + UserID string `protobuf:"bytes,2,opt,name=userID,proto3" json:"userID"` + HasReadSeq int64 `protobuf:"varint,3,opt,name=hasReadSeq,proto3" json:"hasReadSeq"` } -func (x *ExtendMsgResp) Reset() { - *x = ExtendMsgResp{} +func (x *SetConversationHasReadSeqReq) Reset() { + *x = SetConversationHasReadSeqReq{} if protoimpl.UnsafeEnabled { mi := &file_msg_msg_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1318,13 +1088,13 @@ func (x *ExtendMsgResp) Reset() { } } -func (x *ExtendMsgResp) String() string { +func (x *SetConversationHasReadSeqReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ExtendMsgResp) ProtoMessage() {} +func (*SetConversationHasReadSeqReq) ProtoMessage() {} -func (x *ExtendMsgResp) ProtoReflect() protoreflect.Message { +func (x *SetConversationHasReadSeqReq) ProtoReflect() protoreflect.Message { mi := &file_msg_msg_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1336,32 +1106,40 @@ func (x *ExtendMsgResp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ExtendMsgResp.ProtoReflect.Descriptor instead. -func (*ExtendMsgResp) Descriptor() ([]byte, []int) { +// Deprecated: Use SetConversationHasReadSeqReq.ProtoReflect.Descriptor instead. +func (*SetConversationHasReadSeqReq) Descriptor() ([]byte, []int) { return file_msg_msg_proto_rawDescGZIP(), []int{21} } -func (x *ExtendMsgResp) GetExtendMsg() *ExtendMsg { +func (x *SetConversationHasReadSeqReq) GetConversationID() string { if x != nil { - return x.ExtendMsg + return x.ConversationID } - return nil + return "" +} + +func (x *SetConversationHasReadSeqReq) GetUserID() string { + if x != nil { + return x.UserID + } + return "" } -type ExtendMsg struct { +func (x *SetConversationHasReadSeqReq) GetHasReadSeq() int64 { + if x != nil { + return x.HasReadSeq + } + return 0 +} + +type SetConversationHasReadSeqResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - ReactionExtensions map[string]*KeyValueResp `protobuf:"bytes,1,rep,name=reactionExtensions,proto3" json:"reactionExtensions" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - ClientMsgID string `protobuf:"bytes,2,opt,name=clientMsgID,proto3" json:"clientMsgID"` - MsgFirstModifyTime int64 `protobuf:"varint,3,opt,name=msgFirstModifyTime,proto3" json:"msgFirstModifyTime"` - AttachedInfo string `protobuf:"bytes,4,opt,name=attachedInfo,proto3" json:"attachedInfo"` - Ex string `protobuf:"bytes,5,opt,name=ex,proto3" json:"ex"` } -func (x *ExtendMsg) Reset() { - *x = ExtendMsg{} +func (x *SetConversationHasReadSeqResp) Reset() { + *x = SetConversationHasReadSeqResp{} if protoimpl.UnsafeEnabled { mi := &file_msg_msg_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1369,13 +1147,13 @@ func (x *ExtendMsg) Reset() { } } -func (x *ExtendMsg) String() string { +func (x *SetConversationHasReadSeqResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ExtendMsg) ProtoMessage() {} +func (*SetConversationHasReadSeqResp) ProtoMessage() {} -func (x *ExtendMsg) ProtoReflect() protoreflect.Message { +func (x *SetConversationHasReadSeqResp) ProtoReflect() protoreflect.Message { mi := &file_msg_msg_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1387,58 +1165,22 @@ func (x *ExtendMsg) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ExtendMsg.ProtoReflect.Descriptor instead. -func (*ExtendMsg) Descriptor() ([]byte, []int) { +// Deprecated: Use SetConversationHasReadSeqResp.ProtoReflect.Descriptor instead. +func (*SetConversationHasReadSeqResp) Descriptor() ([]byte, []int) { return file_msg_msg_proto_rawDescGZIP(), []int{22} } -func (x *ExtendMsg) GetReactionExtensions() map[string]*KeyValueResp { - if x != nil { - return x.ReactionExtensions - } - return nil -} - -func (x *ExtendMsg) GetClientMsgID() string { - if x != nil { - return x.ClientMsgID - } - return "" -} - -func (x *ExtendMsg) GetMsgFirstModifyTime() int64 { - if x != nil { - return x.MsgFirstModifyTime - } - return 0 -} - -func (x *ExtendMsg) GetAttachedInfo() string { - if x != nil { - return x.AttachedInfo - } - return "" -} - -func (x *ExtendMsg) GetEx() string { - if x != nil { - return x.Ex - } - return "" -} - -type KeyValueResp struct { +type DeleteSyncOpt struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - KeyValue *sdkws.KeyValue `protobuf:"bytes,1,opt,name=keyValue,proto3" json:"keyValue"` - ErrCode int32 `protobuf:"varint,2,opt,name=errCode,proto3" json:"errCode"` - ErrMsg string `protobuf:"bytes,3,opt,name=errMsg,proto3" json:"errMsg"` + IsSyncSelf bool `protobuf:"varint,3,opt,name=IsSyncSelf,proto3" json:"IsSyncSelf"` + IsSyncOther bool `protobuf:"varint,4,opt,name=IsSyncOther,proto3" json:"IsSyncOther"` } -func (x *KeyValueResp) Reset() { - *x = KeyValueResp{} +func (x *DeleteSyncOpt) Reset() { + *x = DeleteSyncOpt{} if protoimpl.UnsafeEnabled { mi := &file_msg_msg_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1446,13 +1188,13 @@ func (x *KeyValueResp) Reset() { } } -func (x *KeyValueResp) String() string { +func (x *DeleteSyncOpt) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KeyValueResp) ProtoMessage() {} +func (*DeleteSyncOpt) ProtoMessage() {} -func (x *KeyValueResp) ProtoReflect() protoreflect.Message { +func (x *DeleteSyncOpt) ProtoReflect() protoreflect.Message { mi := &file_msg_msg_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1464,43 +1206,37 @@ func (x *KeyValueResp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KeyValueResp.ProtoReflect.Descriptor instead. -func (*KeyValueResp) Descriptor() ([]byte, []int) { +// Deprecated: Use DeleteSyncOpt.ProtoReflect.Descriptor instead. +func (*DeleteSyncOpt) Descriptor() ([]byte, []int) { return file_msg_msg_proto_rawDescGZIP(), []int{23} } -func (x *KeyValueResp) GetKeyValue() *sdkws.KeyValue { - if x != nil { - return x.KeyValue - } - return nil -} - -func (x *KeyValueResp) GetErrCode() int32 { +func (x *DeleteSyncOpt) GetIsSyncSelf() bool { if x != nil { - return x.ErrCode + return x.IsSyncSelf } - return 0 + return false } -func (x *KeyValueResp) GetErrMsg() string { +func (x *DeleteSyncOpt) GetIsSyncOther() bool { if x != nil { - return x.ErrMsg + return x.IsSyncOther } - return "" + return false } -type MsgDataToModifyByMQ struct { +type ClearConversationsMsgReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Messages []*sdkws.MsgData `protobuf:"bytes,1,rep,name=messages,proto3" json:"messages"` - ConversationID string `protobuf:"bytes,2,opt,name=conversationID,proto3" json:"conversationID"` + ConversationIDs []string `protobuf:"bytes,1,rep,name=conversationIDs,proto3" json:"conversationIDs"` + UserID string `protobuf:"bytes,2,opt,name=userID,proto3" json:"userID"` + DeleteSyncOpt *DeleteSyncOpt `protobuf:"bytes,3,opt,name=deleteSyncOpt,proto3" json:"deleteSyncOpt"` } -func (x *MsgDataToModifyByMQ) Reset() { - *x = MsgDataToModifyByMQ{} +func (x *ClearConversationsMsgReq) Reset() { + *x = ClearConversationsMsgReq{} if protoimpl.UnsafeEnabled { mi := &file_msg_msg_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1508,13 +1244,13 @@ func (x *MsgDataToModifyByMQ) Reset() { } } -func (x *MsgDataToModifyByMQ) String() string { +func (x *ClearConversationsMsgReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MsgDataToModifyByMQ) ProtoMessage() {} +func (*ClearConversationsMsgReq) ProtoMessage() {} -func (x *MsgDataToModifyByMQ) ProtoReflect() protoreflect.Message { +func (x *ClearConversationsMsgReq) ProtoReflect() protoreflect.Message { mi := &file_msg_msg_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1526,33 +1262,40 @@ func (x *MsgDataToModifyByMQ) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MsgDataToModifyByMQ.ProtoReflect.Descriptor instead. -func (*MsgDataToModifyByMQ) Descriptor() ([]byte, []int) { +// Deprecated: Use ClearConversationsMsgReq.ProtoReflect.Descriptor instead. +func (*ClearConversationsMsgReq) Descriptor() ([]byte, []int) { return file_msg_msg_proto_rawDescGZIP(), []int{24} } -func (x *MsgDataToModifyByMQ) GetMessages() []*sdkws.MsgData { +func (x *ClearConversationsMsgReq) GetConversationIDs() []string { if x != nil { - return x.Messages + return x.ConversationIDs } return nil } -func (x *MsgDataToModifyByMQ) GetConversationID() string { +func (x *ClearConversationsMsgReq) GetUserID() string { if x != nil { - return x.ConversationID + return x.UserID } return "" } -type DelMsgsReq struct { +func (x *ClearConversationsMsgReq) GetDeleteSyncOpt() *DeleteSyncOpt { + if x != nil { + return x.DeleteSyncOpt + } + return nil +} + +type ClearConversationsMsgResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *DelMsgsReq) Reset() { - *x = DelMsgsReq{} +func (x *ClearConversationsMsgResp) Reset() { + *x = ClearConversationsMsgResp{} if protoimpl.UnsafeEnabled { mi := &file_msg_msg_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1560,13 +1303,13 @@ func (x *DelMsgsReq) Reset() { } } -func (x *DelMsgsReq) String() string { +func (x *ClearConversationsMsgResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DelMsgsReq) ProtoMessage() {} +func (*ClearConversationsMsgResp) ProtoMessage() {} -func (x *DelMsgsReq) ProtoReflect() protoreflect.Message { +func (x *ClearConversationsMsgResp) ProtoReflect() protoreflect.Message { mi := &file_msg_msg_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1578,19 +1321,22 @@ func (x *DelMsgsReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DelMsgsReq.ProtoReflect.Descriptor instead. -func (*DelMsgsReq) Descriptor() ([]byte, []int) { +// Deprecated: Use ClearConversationsMsgResp.ProtoReflect.Descriptor instead. +func (*ClearConversationsMsgResp) Descriptor() ([]byte, []int) { return file_msg_msg_proto_rawDescGZIP(), []int{25} } -type DelMsgsResp struct { +type UserClearAllMsgReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID"` + DeleteSyncOpt *DeleteSyncOpt `protobuf:"bytes,3,opt,name=deleteSyncOpt,proto3" json:"deleteSyncOpt"` } -func (x *DelMsgsResp) Reset() { - *x = DelMsgsResp{} +func (x *UserClearAllMsgReq) Reset() { + *x = UserClearAllMsgReq{} if protoimpl.UnsafeEnabled { mi := &file_msg_msg_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1598,13 +1344,13 @@ func (x *DelMsgsResp) Reset() { } } -func (x *DelMsgsResp) String() string { +func (x *UserClearAllMsgReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DelMsgsResp) ProtoMessage() {} +func (*UserClearAllMsgReq) ProtoMessage() {} -func (x *DelMsgsResp) ProtoReflect() protoreflect.Message { +func (x *UserClearAllMsgReq) ProtoReflect() protoreflect.Message { mi := &file_msg_msg_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1616,23 +1362,33 @@ func (x *DelMsgsResp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DelMsgsResp.ProtoReflect.Descriptor instead. -func (*DelMsgsResp) Descriptor() ([]byte, []int) { +// Deprecated: Use UserClearAllMsgReq.ProtoReflect.Descriptor instead. +func (*UserClearAllMsgReq) Descriptor() ([]byte, []int) { return file_msg_msg_proto_rawDescGZIP(), []int{26} } -type RevokeMsgReq struct { +func (x *UserClearAllMsgReq) GetUserID() string { + if x != nil { + return x.UserID + } + return "" +} + +func (x *UserClearAllMsgReq) GetDeleteSyncOpt() *DeleteSyncOpt { + if x != nil { + return x.DeleteSyncOpt + } + return nil +} + +type UserClearAllMsgResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` - Seq int64 `protobuf:"varint,2,opt,name=seq,proto3" json:"seq"` - UserID string `protobuf:"bytes,3,opt,name=userID,proto3" json:"userID"` } -func (x *RevokeMsgReq) Reset() { - *x = RevokeMsgReq{} +func (x *UserClearAllMsgResp) Reset() { + *x = UserClearAllMsgResp{} if protoimpl.UnsafeEnabled { mi := &file_msg_msg_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1640,13 +1396,13 @@ func (x *RevokeMsgReq) Reset() { } } -func (x *RevokeMsgReq) String() string { +func (x *UserClearAllMsgResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RevokeMsgReq) ProtoMessage() {} +func (*UserClearAllMsgResp) ProtoMessage() {} -func (x *RevokeMsgReq) ProtoReflect() protoreflect.Message { +func (x *UserClearAllMsgResp) ProtoReflect() protoreflect.Message { mi := &file_msg_msg_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1658,40 +1414,24 @@ func (x *RevokeMsgReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RevokeMsgReq.ProtoReflect.Descriptor instead. -func (*RevokeMsgReq) Descriptor() ([]byte, []int) { +// Deprecated: Use UserClearAllMsgResp.ProtoReflect.Descriptor instead. +func (*UserClearAllMsgResp) Descriptor() ([]byte, []int) { return file_msg_msg_proto_rawDescGZIP(), []int{27} } -func (x *RevokeMsgReq) GetConversationID() string { - if x != nil { - return x.ConversationID - } - return "" -} - -func (x *RevokeMsgReq) GetSeq() int64 { - if x != nil { - return x.Seq - } - return 0 -} - -func (x *RevokeMsgReq) GetUserID() string { - if x != nil { - return x.UserID - } - return "" -} - -type RevokeMsgResp struct { +type DeleteMsgsReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` + Seqs []int64 `protobuf:"varint,2,rep,packed,name=seqs,proto3" json:"seqs"` + UserID string `protobuf:"bytes,3,opt,name=userID,proto3" json:"userID"` + DeleteSyncOpt *DeleteSyncOpt `protobuf:"bytes,4,opt,name=deleteSyncOpt,proto3" json:"deleteSyncOpt"` } -func (x *RevokeMsgResp) Reset() { - *x = RevokeMsgResp{} +func (x *DeleteMsgsReq) Reset() { + *x = DeleteMsgsReq{} if protoimpl.UnsafeEnabled { mi := &file_msg_msg_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1699,13 +1439,13 @@ func (x *RevokeMsgResp) Reset() { } } -func (x *RevokeMsgResp) String() string { +func (x *DeleteMsgsReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RevokeMsgResp) ProtoMessage() {} +func (*DeleteMsgsReq) ProtoMessage() {} -func (x *RevokeMsgResp) ProtoReflect() protoreflect.Message { +func (x *DeleteMsgsReq) ProtoReflect() protoreflect.Message { mi := &file_msg_msg_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1717,97 +1457,62 @@ func (x *RevokeMsgResp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RevokeMsgResp.ProtoReflect.Descriptor instead. -func (*RevokeMsgResp) Descriptor() ([]byte, []int) { +// Deprecated: Use DeleteMsgsReq.ProtoReflect.Descriptor instead. +func (*DeleteMsgsReq) Descriptor() ([]byte, []int) { return file_msg_msg_proto_rawDescGZIP(), []int{28} } -type MarkMsgsAsReadReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` - Seqs []int64 `protobuf:"varint,2,rep,packed,name=seqs,proto3" json:"seqs"` - UserID string `protobuf:"bytes,3,opt,name=userID,proto3" json:"userID"` -} - -func (x *MarkMsgsAsReadReq) Reset() { - *x = MarkMsgsAsReadReq{} - if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MarkMsgsAsReadReq) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MarkMsgsAsReadReq) ProtoMessage() {} - -func (x *MarkMsgsAsReadReq) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[29] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MarkMsgsAsReadReq.ProtoReflect.Descriptor instead. -func (*MarkMsgsAsReadReq) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{29} -} - -func (x *MarkMsgsAsReadReq) GetConversationID() string { +func (x *DeleteMsgsReq) GetConversationID() string { if x != nil { return x.ConversationID } return "" } -func (x *MarkMsgsAsReadReq) GetSeqs() []int64 { +func (x *DeleteMsgsReq) GetSeqs() []int64 { if x != nil { return x.Seqs } return nil } -func (x *MarkMsgsAsReadReq) GetUserID() string { +func (x *DeleteMsgsReq) GetUserID() string { if x != nil { return x.UserID } return "" } -type MarkMsgsAsReadResp struct { +func (x *DeleteMsgsReq) GetDeleteSyncOpt() *DeleteSyncOpt { + if x != nil { + return x.DeleteSyncOpt + } + return nil +} + +type DeleteMsgsResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *MarkMsgsAsReadResp) Reset() { - *x = MarkMsgsAsReadResp{} +func (x *DeleteMsgsResp) Reset() { + *x = DeleteMsgsResp{} if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[30] + mi := &file_msg_msg_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MarkMsgsAsReadResp) String() string { +func (x *DeleteMsgsResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MarkMsgsAsReadResp) ProtoMessage() {} +func (*DeleteMsgsResp) ProtoMessage() {} -func (x *MarkMsgsAsReadResp) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[30] +func (x *DeleteMsgsResp) ProtoReflect() protoreflect.Message { + mi := &file_msg_msg_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1818,39 +1523,37 @@ func (x *MarkMsgsAsReadResp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MarkMsgsAsReadResp.ProtoReflect.Descriptor instead. -func (*MarkMsgsAsReadResp) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{30} +// Deprecated: Use DeleteMsgsResp.ProtoReflect.Descriptor instead. +func (*DeleteMsgsResp) Descriptor() ([]byte, []int) { + return file_msg_msg_proto_rawDescGZIP(), []int{29} } -type MarkConversationAsReadReq struct { +type DeleteMsgPhysicalReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` - UserID string `protobuf:"bytes,2,opt,name=userID,proto3" json:"userID"` - HasReadSeq int64 `protobuf:"varint,3,opt,name=hasReadSeq,proto3" json:"hasReadSeq"` - Seqs []int64 `protobuf:"varint,4,rep,packed,name=seqs,proto3" json:"seqs"` + ConversationIDs []string `protobuf:"bytes,1,rep,name=conversationIDs,proto3" json:"conversationIDs"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp"` } -func (x *MarkConversationAsReadReq) Reset() { - *x = MarkConversationAsReadReq{} +func (x *DeleteMsgPhysicalReq) Reset() { + *x = DeleteMsgPhysicalReq{} if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[31] + mi := &file_msg_msg_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MarkConversationAsReadReq) String() string { +func (x *DeleteMsgPhysicalReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MarkConversationAsReadReq) ProtoMessage() {} +func (*DeleteMsgPhysicalReq) ProtoMessage() {} -func (x *MarkConversationAsReadReq) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[31] +func (x *DeleteMsgPhysicalReq) ProtoReflect() protoreflect.Message { + mi := &file_msg_msg_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1861,62 +1564,48 @@ func (x *MarkConversationAsReadReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MarkConversationAsReadReq.ProtoReflect.Descriptor instead. -func (*MarkConversationAsReadReq) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{31} -} - -func (x *MarkConversationAsReadReq) GetConversationID() string { - if x != nil { - return x.ConversationID - } - return "" +// Deprecated: Use DeleteMsgPhysicalReq.ProtoReflect.Descriptor instead. +func (*DeleteMsgPhysicalReq) Descriptor() ([]byte, []int) { + return file_msg_msg_proto_rawDescGZIP(), []int{30} } -func (x *MarkConversationAsReadReq) GetUserID() string { +func (x *DeleteMsgPhysicalReq) GetConversationIDs() []string { if x != nil { - return x.UserID + return x.ConversationIDs } - return "" + return nil } -func (x *MarkConversationAsReadReq) GetHasReadSeq() int64 { +func (x *DeleteMsgPhysicalReq) GetTimestamp() int64 { if x != nil { - return x.HasReadSeq + return x.Timestamp } return 0 } -func (x *MarkConversationAsReadReq) GetSeqs() []int64 { - if x != nil { - return x.Seqs - } - return nil -} - -type MarkConversationAsReadResp struct { +type DeleteMsgPhysicalResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *MarkConversationAsReadResp) Reset() { - *x = MarkConversationAsReadResp{} +func (x *DeleteMsgPhysicalResp) Reset() { + *x = DeleteMsgPhysicalResp{} if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[32] + mi := &file_msg_msg_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MarkConversationAsReadResp) String() string { +func (x *DeleteMsgPhysicalResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MarkConversationAsReadResp) ProtoMessage() {} +func (*DeleteMsgPhysicalResp) ProtoMessage() {} -func (x *MarkConversationAsReadResp) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[32] +func (x *DeleteMsgPhysicalResp) ProtoReflect() protoreflect.Message { + mi := &file_msg_msg_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1927,38 +1616,37 @@ func (x *MarkConversationAsReadResp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MarkConversationAsReadResp.ProtoReflect.Descriptor instead. -func (*MarkConversationAsReadResp) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{32} +// Deprecated: Use DeleteMsgPhysicalResp.ProtoReflect.Descriptor instead. +func (*DeleteMsgPhysicalResp) Descriptor() ([]byte, []int) { + return file_msg_msg_proto_rawDescGZIP(), []int{31} } -type SetConversationHasReadSeqReq struct { +type DeleteMsgPhysicalBySeqReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` - UserID string `protobuf:"bytes,2,opt,name=userID,proto3" json:"userID"` - HasReadSeq int64 `protobuf:"varint,3,opt,name=hasReadSeq,proto3" json:"hasReadSeq"` + ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` + Seqs []int64 `protobuf:"varint,2,rep,packed,name=seqs,proto3" json:"seqs"` } -func (x *SetConversationHasReadSeqReq) Reset() { - *x = SetConversationHasReadSeqReq{} +func (x *DeleteMsgPhysicalBySeqReq) Reset() { + *x = DeleteMsgPhysicalBySeqReq{} if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[33] + mi := &file_msg_msg_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SetConversationHasReadSeqReq) String() string { +func (x *DeleteMsgPhysicalBySeqReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SetConversationHasReadSeqReq) ProtoMessage() {} +func (*DeleteMsgPhysicalBySeqReq) ProtoMessage() {} -func (x *SetConversationHasReadSeqReq) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[33] +func (x *DeleteMsgPhysicalBySeqReq) ProtoReflect() protoreflect.Message { + mi := &file_msg_msg_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1969,55 +1657,48 @@ func (x *SetConversationHasReadSeqReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SetConversationHasReadSeqReq.ProtoReflect.Descriptor instead. -func (*SetConversationHasReadSeqReq) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{33} +// Deprecated: Use DeleteMsgPhysicalBySeqReq.ProtoReflect.Descriptor instead. +func (*DeleteMsgPhysicalBySeqReq) Descriptor() ([]byte, []int) { + return file_msg_msg_proto_rawDescGZIP(), []int{32} } -func (x *SetConversationHasReadSeqReq) GetConversationID() string { +func (x *DeleteMsgPhysicalBySeqReq) GetConversationID() string { if x != nil { return x.ConversationID } return "" } -func (x *SetConversationHasReadSeqReq) GetUserID() string { - if x != nil { - return x.UserID - } - return "" -} - -func (x *SetConversationHasReadSeqReq) GetHasReadSeq() int64 { +func (x *DeleteMsgPhysicalBySeqReq) GetSeqs() []int64 { if x != nil { - return x.HasReadSeq + return x.Seqs } - return 0 + return nil } -type SetConversationHasReadSeqResp struct { +type DeleteMsgPhysicalBySeqResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *SetConversationHasReadSeqResp) Reset() { - *x = SetConversationHasReadSeqResp{} +func (x *DeleteMsgPhysicalBySeqResp) Reset() { + *x = DeleteMsgPhysicalBySeqResp{} if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[34] + mi := &file_msg_msg_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SetConversationHasReadSeqResp) String() string { +func (x *DeleteMsgPhysicalBySeqResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SetConversationHasReadSeqResp) ProtoMessage() {} +func (*DeleteMsgPhysicalBySeqResp) ProtoMessage() {} -func (x *SetConversationHasReadSeqResp) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[34] +func (x *DeleteMsgPhysicalBySeqResp) ProtoReflect() protoreflect.Message { + mi := &file_msg_msg_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2028,37 +1709,36 @@ func (x *SetConversationHasReadSeqResp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SetConversationHasReadSeqResp.ProtoReflect.Descriptor instead. -func (*SetConversationHasReadSeqResp) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{34} +// Deprecated: Use DeleteMsgPhysicalBySeqResp.ProtoReflect.Descriptor instead. +func (*DeleteMsgPhysicalBySeqResp) Descriptor() ([]byte, []int) { + return file_msg_msg_proto_rawDescGZIP(), []int{33} } -type DeleteSyncOpt struct { +type GetConversationMaxSeqReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - IsSyncSelf bool `protobuf:"varint,3,opt,name=IsSyncSelf,proto3" json:"IsSyncSelf"` - IsSyncOther bool `protobuf:"varint,4,opt,name=IsSyncOther,proto3" json:"IsSyncOther"` + ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` } -func (x *DeleteSyncOpt) Reset() { - *x = DeleteSyncOpt{} +func (x *GetConversationMaxSeqReq) Reset() { + *x = GetConversationMaxSeqReq{} if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[35] + mi := &file_msg_msg_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteSyncOpt) String() string { +func (x *GetConversationMaxSeqReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteSyncOpt) ProtoMessage() {} +func (*GetConversationMaxSeqReq) ProtoMessage() {} -func (x *DeleteSyncOpt) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[35] +func (x *GetConversationMaxSeqReq) ProtoReflect() protoreflect.Message { + mi := &file_msg_msg_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2069,354 +1749,43 @@ func (x *DeleteSyncOpt) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteSyncOpt.ProtoReflect.Descriptor instead. -func (*DeleteSyncOpt) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{35} +// Deprecated: Use GetConversationMaxSeqReq.ProtoReflect.Descriptor instead. +func (*GetConversationMaxSeqReq) Descriptor() ([]byte, []int) { + return file_msg_msg_proto_rawDescGZIP(), []int{34} } -func (x *DeleteSyncOpt) GetIsSyncSelf() bool { +func (x *GetConversationMaxSeqReq) GetConversationID() string { if x != nil { - return x.IsSyncSelf + return x.ConversationID } - return false + return "" } -func (x *DeleteSyncOpt) GetIsSyncOther() bool { - if x != nil { - return x.IsSyncOther - } - return false -} - -type ClearConversationsMsgReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ConversationIDs []string `protobuf:"bytes,1,rep,name=conversationIDs,proto3" json:"conversationIDs"` - UserID string `protobuf:"bytes,2,opt,name=userID,proto3" json:"userID"` - DeleteSyncOpt *DeleteSyncOpt `protobuf:"bytes,3,opt,name=deleteSyncOpt,proto3" json:"deleteSyncOpt"` -} - -func (x *ClearConversationsMsgReq) Reset() { - *x = ClearConversationsMsgReq{} - if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ClearConversationsMsgReq) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ClearConversationsMsgReq) ProtoMessage() {} - -func (x *ClearConversationsMsgReq) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[36] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ClearConversationsMsgReq.ProtoReflect.Descriptor instead. -func (*ClearConversationsMsgReq) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{36} -} - -func (x *ClearConversationsMsgReq) GetConversationIDs() []string { - if x != nil { - return x.ConversationIDs - } - return nil -} - -func (x *ClearConversationsMsgReq) GetUserID() string { - if x != nil { - return x.UserID - } - return "" -} - -func (x *ClearConversationsMsgReq) GetDeleteSyncOpt() *DeleteSyncOpt { - if x != nil { - return x.DeleteSyncOpt - } - return nil -} - -type ClearConversationsMsgResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *ClearConversationsMsgResp) Reset() { - *x = ClearConversationsMsgResp{} - if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[37] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ClearConversationsMsgResp) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ClearConversationsMsgResp) ProtoMessage() {} - -func (x *ClearConversationsMsgResp) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[37] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ClearConversationsMsgResp.ProtoReflect.Descriptor instead. -func (*ClearConversationsMsgResp) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{37} -} - -type UserClearAllMsgReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID"` - DeleteSyncOpt *DeleteSyncOpt `protobuf:"bytes,3,opt,name=deleteSyncOpt,proto3" json:"deleteSyncOpt"` -} - -func (x *UserClearAllMsgReq) Reset() { - *x = UserClearAllMsgReq{} - if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[38] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UserClearAllMsgReq) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UserClearAllMsgReq) ProtoMessage() {} - -func (x *UserClearAllMsgReq) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[38] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UserClearAllMsgReq.ProtoReflect.Descriptor instead. -func (*UserClearAllMsgReq) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{38} -} - -func (x *UserClearAllMsgReq) GetUserID() string { - if x != nil { - return x.UserID - } - return "" -} - -func (x *UserClearAllMsgReq) GetDeleteSyncOpt() *DeleteSyncOpt { - if x != nil { - return x.DeleteSyncOpt - } - return nil -} - -type UserClearAllMsgResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *UserClearAllMsgResp) Reset() { - *x = UserClearAllMsgResp{} - if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UserClearAllMsgResp) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UserClearAllMsgResp) ProtoMessage() {} - -func (x *UserClearAllMsgResp) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[39] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UserClearAllMsgResp.ProtoReflect.Descriptor instead. -func (*UserClearAllMsgResp) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{39} -} - -type DeleteMsgsReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` - Seqs []int64 `protobuf:"varint,2,rep,packed,name=seqs,proto3" json:"seqs"` - UserID string `protobuf:"bytes,3,opt,name=userID,proto3" json:"userID"` - DeleteSyncOpt *DeleteSyncOpt `protobuf:"bytes,4,opt,name=deleteSyncOpt,proto3" json:"deleteSyncOpt"` -} - -func (x *DeleteMsgsReq) Reset() { - *x = DeleteMsgsReq{} - if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[40] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeleteMsgsReq) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteMsgsReq) ProtoMessage() {} - -func (x *DeleteMsgsReq) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[40] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteMsgsReq.ProtoReflect.Descriptor instead. -func (*DeleteMsgsReq) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{40} -} - -func (x *DeleteMsgsReq) GetConversationID() string { - if x != nil { - return x.ConversationID - } - return "" -} - -func (x *DeleteMsgsReq) GetSeqs() []int64 { - if x != nil { - return x.Seqs - } - return nil -} - -func (x *DeleteMsgsReq) GetUserID() string { - if x != nil { - return x.UserID - } - return "" -} - -func (x *DeleteMsgsReq) GetDeleteSyncOpt() *DeleteSyncOpt { - if x != nil { - return x.DeleteSyncOpt - } - return nil -} - -type DeleteMsgsResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *DeleteMsgsResp) Reset() { - *x = DeleteMsgsResp{} - if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[41] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeleteMsgsResp) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteMsgsResp) ProtoMessage() {} - -func (x *DeleteMsgsResp) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[41] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteMsgsResp.ProtoReflect.Descriptor instead. -func (*DeleteMsgsResp) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{41} -} - -type DeleteMsgPhysicalReq struct { +type GetConversationMaxSeqResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ConversationIDs []string `protobuf:"bytes,1,rep,name=conversationIDs,proto3" json:"conversationIDs"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp"` + MaxSeq int64 `protobuf:"varint,1,opt,name=maxSeq,proto3" json:"maxSeq"` } -func (x *DeleteMsgPhysicalReq) Reset() { - *x = DeleteMsgPhysicalReq{} +func (x *GetConversationMaxSeqResp) Reset() { + *x = GetConversationMaxSeqResp{} if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[42] + mi := &file_msg_msg_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteMsgPhysicalReq) String() string { +func (x *GetConversationMaxSeqResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteMsgPhysicalReq) ProtoMessage() {} +func (*GetConversationMaxSeqResp) ProtoMessage() {} -func (x *DeleteMsgPhysicalReq) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[42] +func (x *GetConversationMaxSeqResp) ProtoReflect() protoreflect.Message { + mi := &file_msg_msg_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2427,48 +1796,43 @@ func (x *DeleteMsgPhysicalReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteMsgPhysicalReq.ProtoReflect.Descriptor instead. -func (*DeleteMsgPhysicalReq) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{42} -} - -func (x *DeleteMsgPhysicalReq) GetConversationIDs() []string { - if x != nil { - return x.ConversationIDs - } - return nil +// Deprecated: Use GetConversationMaxSeqResp.ProtoReflect.Descriptor instead. +func (*GetConversationMaxSeqResp) Descriptor() ([]byte, []int) { + return file_msg_msg_proto_rawDescGZIP(), []int{35} } -func (x *DeleteMsgPhysicalReq) GetTimestamp() int64 { +func (x *GetConversationMaxSeqResp) GetMaxSeq() int64 { if x != nil { - return x.Timestamp + return x.MaxSeq } return 0 } -type DeleteMsgPhysicalResp struct { +type GetConversationsHasReadAndMaxSeqReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID"` } -func (x *DeleteMsgPhysicalResp) Reset() { - *x = DeleteMsgPhysicalResp{} +func (x *GetConversationsHasReadAndMaxSeqReq) Reset() { + *x = GetConversationsHasReadAndMaxSeqReq{} if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[43] + mi := &file_msg_msg_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteMsgPhysicalResp) String() string { +func (x *GetConversationsHasReadAndMaxSeqReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteMsgPhysicalResp) ProtoMessage() {} +func (*GetConversationsHasReadAndMaxSeqReq) ProtoMessage() {} -func (x *DeleteMsgPhysicalResp) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[43] +func (x *GetConversationsHasReadAndMaxSeqReq) ProtoReflect() protoreflect.Message { + mi := &file_msg_msg_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2479,37 +1843,44 @@ func (x *DeleteMsgPhysicalResp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteMsgPhysicalResp.ProtoReflect.Descriptor instead. -func (*DeleteMsgPhysicalResp) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{43} +// Deprecated: Use GetConversationsHasReadAndMaxSeqReq.ProtoReflect.Descriptor instead. +func (*GetConversationsHasReadAndMaxSeqReq) Descriptor() ([]byte, []int) { + return file_msg_msg_proto_rawDescGZIP(), []int{36} } -type DeleteMsgPhysicalBySeqReq struct { +func (x *GetConversationsHasReadAndMaxSeqReq) GetUserID() string { + if x != nil { + return x.UserID + } + return "" +} + +type Seqs struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` - Seqs []int64 `protobuf:"varint,2,rep,packed,name=seqs,proto3" json:"seqs"` + MaxSeq int64 `protobuf:"varint,1,opt,name=maxSeq,proto3" json:"maxSeq"` + HasReadSeq int64 `protobuf:"varint,2,opt,name=hasReadSeq,proto3" json:"hasReadSeq"` } -func (x *DeleteMsgPhysicalBySeqReq) Reset() { - *x = DeleteMsgPhysicalBySeqReq{} +func (x *Seqs) Reset() { + *x = Seqs{} if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[44] + mi := &file_msg_msg_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteMsgPhysicalBySeqReq) String() string { +func (x *Seqs) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteMsgPhysicalBySeqReq) ProtoMessage() {} +func (*Seqs) ProtoMessage() {} -func (x *DeleteMsgPhysicalBySeqReq) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[44] +func (x *Seqs) ProtoReflect() protoreflect.Message { + mi := &file_msg_msg_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2520,48 +1891,50 @@ func (x *DeleteMsgPhysicalBySeqReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteMsgPhysicalBySeqReq.ProtoReflect.Descriptor instead. -func (*DeleteMsgPhysicalBySeqReq) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{44} +// Deprecated: Use Seqs.ProtoReflect.Descriptor instead. +func (*Seqs) Descriptor() ([]byte, []int) { + return file_msg_msg_proto_rawDescGZIP(), []int{37} } -func (x *DeleteMsgPhysicalBySeqReq) GetConversationID() string { +func (x *Seqs) GetMaxSeq() int64 { if x != nil { - return x.ConversationID + return x.MaxSeq } - return "" + return 0 } -func (x *DeleteMsgPhysicalBySeqReq) GetSeqs() []int64 { +func (x *Seqs) GetHasReadSeq() int64 { if x != nil { - return x.Seqs + return x.HasReadSeq } - return nil + return 0 } -type DeleteMsgPhysicalBySeqResp struct { +type GetConversationsHasReadAndMaxSeqResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Seqs map[string]*Seqs `protobuf:"bytes,1,rep,name=seqs,proto3" json:"seqs" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (x *DeleteMsgPhysicalBySeqResp) Reset() { - *x = DeleteMsgPhysicalBySeqResp{} +func (x *GetConversationsHasReadAndMaxSeqResp) Reset() { + *x = GetConversationsHasReadAndMaxSeqResp{} if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[45] + mi := &file_msg_msg_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteMsgPhysicalBySeqResp) String() string { +func (x *GetConversationsHasReadAndMaxSeqResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteMsgPhysicalBySeqResp) ProtoMessage() {} +func (*GetConversationsHasReadAndMaxSeqResp) ProtoMessage() {} -func (x *DeleteMsgPhysicalBySeqResp) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[45] +func (x *GetConversationsHasReadAndMaxSeqResp) ProtoReflect() protoreflect.Message { + mi := &file_msg_msg_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2572,36 +1945,47 @@ func (x *DeleteMsgPhysicalBySeqResp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteMsgPhysicalBySeqResp.ProtoReflect.Descriptor instead. -func (*DeleteMsgPhysicalBySeqResp) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{45} +// Deprecated: Use GetConversationsHasReadAndMaxSeqResp.ProtoReflect.Descriptor instead. +func (*GetConversationsHasReadAndMaxSeqResp) Descriptor() ([]byte, []int) { + return file_msg_msg_proto_rawDescGZIP(), []int{38} } -type GetConversationMaxSeqReq struct { +func (x *GetConversationsHasReadAndMaxSeqResp) GetSeqs() map[string]*Seqs { + if x != nil { + return x.Seqs + } + return nil +} + +type GetActiveUserReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` + Start int64 `protobuf:"varint,1,opt,name=start,proto3" json:"start"` + End int64 `protobuf:"varint,2,opt,name=end,proto3" json:"end"` + Ase bool `protobuf:"varint,3,opt,name=ase,proto3" json:"ase"` + Group bool `protobuf:"varint,4,opt,name=group,proto3" json:"group"` + Pagination *sdkws.RequestPagination `protobuf:"bytes,5,opt,name=pagination,proto3" json:"pagination"` } -func (x *GetConversationMaxSeqReq) Reset() { - *x = GetConversationMaxSeqReq{} +func (x *GetActiveUserReq) Reset() { + *x = GetActiveUserReq{} if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[46] + mi := &file_msg_msg_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetConversationMaxSeqReq) String() string { +func (x *GetActiveUserReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetConversationMaxSeqReq) ProtoMessage() {} +func (*GetActiveUserReq) ProtoMessage() {} -func (x *GetConversationMaxSeqReq) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[46] +func (x *GetActiveUserReq) ProtoReflect() protoreflect.Message { + mi := &file_msg_msg_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2612,43 +1996,72 @@ func (x *GetConversationMaxSeqReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetConversationMaxSeqReq.ProtoReflect.Descriptor instead. -func (*GetConversationMaxSeqReq) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{46} +// Deprecated: Use GetActiveUserReq.ProtoReflect.Descriptor instead. +func (*GetActiveUserReq) Descriptor() ([]byte, []int) { + return file_msg_msg_proto_rawDescGZIP(), []int{39} } -func (x *GetConversationMaxSeqReq) GetConversationID() string { +func (x *GetActiveUserReq) GetStart() int64 { if x != nil { - return x.ConversationID + return x.Start } - return "" + return 0 } -type GetConversationMaxSeqResp struct { +func (x *GetActiveUserReq) GetEnd() int64 { + if x != nil { + return x.End + } + return 0 +} + +func (x *GetActiveUserReq) GetAse() bool { + if x != nil { + return x.Ase + } + return false +} + +func (x *GetActiveUserReq) GetGroup() bool { + if x != nil { + return x.Group + } + return false +} + +func (x *GetActiveUserReq) GetPagination() *sdkws.RequestPagination { + if x != nil { + return x.Pagination + } + return nil +} + +type ActiveUser struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MaxSeq int64 `protobuf:"varint,1,opt,name=maxSeq,proto3" json:"maxSeq"` + User *sdkws.UserInfo `protobuf:"bytes,1,opt,name=user,proto3" json:"user"` + Count int64 `protobuf:"varint,2,opt,name=count,proto3" json:"count"` } -func (x *GetConversationMaxSeqResp) Reset() { - *x = GetConversationMaxSeqResp{} +func (x *ActiveUser) Reset() { + *x = ActiveUser{} if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[47] + mi := &file_msg_msg_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetConversationMaxSeqResp) String() string { +func (x *ActiveUser) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetConversationMaxSeqResp) ProtoMessage() {} +func (*ActiveUser) ProtoMessage() {} -func (x *GetConversationMaxSeqResp) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[47] +func (x *ActiveUser) ProtoReflect() protoreflect.Message { + mi := &file_msg_msg_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2659,43 +2072,53 @@ func (x *GetConversationMaxSeqResp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetConversationMaxSeqResp.ProtoReflect.Descriptor instead. -func (*GetConversationMaxSeqResp) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{47} +// Deprecated: Use ActiveUser.ProtoReflect.Descriptor instead. +func (*ActiveUser) Descriptor() ([]byte, []int) { + return file_msg_msg_proto_rawDescGZIP(), []int{40} } -func (x *GetConversationMaxSeqResp) GetMaxSeq() int64 { +func (x *ActiveUser) GetUser() *sdkws.UserInfo { if x != nil { - return x.MaxSeq + return x.User + } + return nil +} + +func (x *ActiveUser) GetCount() int64 { + if x != nil { + return x.Count } return 0 } -type GetConversationsHasReadAndMaxSeqReq struct { +type GetActiveUserResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID"` + MsgCount int64 `protobuf:"varint,1,opt,name=msgCount,proto3" json:"msgCount"` + UserCount int64 `protobuf:"varint,2,opt,name=userCount,proto3" json:"userCount"` + DateCount map[string]int64 `protobuf:"bytes,3,rep,name=dateCount,proto3" json:"dateCount" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + Users []*ActiveUser `protobuf:"bytes,4,rep,name=users,proto3" json:"users"` } -func (x *GetConversationsHasReadAndMaxSeqReq) Reset() { - *x = GetConversationsHasReadAndMaxSeqReq{} +func (x *GetActiveUserResp) Reset() { + *x = GetActiveUserResp{} if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[48] + mi := &file_msg_msg_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetConversationsHasReadAndMaxSeqReq) String() string { +func (x *GetActiveUserResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetConversationsHasReadAndMaxSeqReq) ProtoMessage() {} +func (*GetActiveUserResp) ProtoMessage() {} -func (x *GetConversationsHasReadAndMaxSeqReq) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[48] +func (x *GetActiveUserResp) ProtoReflect() protoreflect.Message { + mi := &file_msg_msg_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2706,44 +2129,67 @@ func (x *GetConversationsHasReadAndMaxSeqReq) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use GetConversationsHasReadAndMaxSeqReq.ProtoReflect.Descriptor instead. -func (*GetConversationsHasReadAndMaxSeqReq) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{48} +// Deprecated: Use GetActiveUserResp.ProtoReflect.Descriptor instead. +func (*GetActiveUserResp) Descriptor() ([]byte, []int) { + return file_msg_msg_proto_rawDescGZIP(), []int{41} } -func (x *GetConversationsHasReadAndMaxSeqReq) GetUserID() string { +func (x *GetActiveUserResp) GetMsgCount() int64 { if x != nil { - return x.UserID + return x.MsgCount } - return "" + return 0 } -type Seqs struct { +func (x *GetActiveUserResp) GetUserCount() int64 { + if x != nil { + return x.UserCount + } + return 0 +} + +func (x *GetActiveUserResp) GetDateCount() map[string]int64 { + if x != nil { + return x.DateCount + } + return nil +} + +func (x *GetActiveUserResp) GetUsers() []*ActiveUser { + if x != nil { + return x.Users + } + return nil +} + +type GetActiveGroupReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MaxSeq int64 `protobuf:"varint,1,opt,name=maxSeq,proto3" json:"maxSeq"` - HasReadSeq int64 `protobuf:"varint,2,opt,name=hasReadSeq,proto3" json:"hasReadSeq"` + Start int64 `protobuf:"varint,1,opt,name=start,proto3" json:"start"` + End int64 `protobuf:"varint,2,opt,name=end,proto3" json:"end"` + Ase bool `protobuf:"varint,3,opt,name=ase,proto3" json:"ase"` + Pagination *sdkws.RequestPagination `protobuf:"bytes,4,opt,name=pagination,proto3" json:"pagination"` } -func (x *Seqs) Reset() { - *x = Seqs{} +func (x *GetActiveGroupReq) Reset() { + *x = GetActiveGroupReq{} if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[49] + mi := &file_msg_msg_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *Seqs) String() string { +func (x *GetActiveGroupReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Seqs) ProtoMessage() {} +func (*GetActiveGroupReq) ProtoMessage() {} -func (x *Seqs) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[49] +func (x *GetActiveGroupReq) ProtoReflect() protoreflect.Message { + mi := &file_msg_msg_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2754,50 +2200,65 @@ func (x *Seqs) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Seqs.ProtoReflect.Descriptor instead. -func (*Seqs) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{49} +// Deprecated: Use GetActiveGroupReq.ProtoReflect.Descriptor instead. +func (*GetActiveGroupReq) Descriptor() ([]byte, []int) { + return file_msg_msg_proto_rawDescGZIP(), []int{42} } -func (x *Seqs) GetMaxSeq() int64 { +func (x *GetActiveGroupReq) GetStart() int64 { if x != nil { - return x.MaxSeq + return x.Start } return 0 } -func (x *Seqs) GetHasReadSeq() int64 { +func (x *GetActiveGroupReq) GetEnd() int64 { if x != nil { - return x.HasReadSeq + return x.End } return 0 } -type GetConversationsHasReadAndMaxSeqResp struct { +func (x *GetActiveGroupReq) GetAse() bool { + if x != nil { + return x.Ase + } + return false +} + +func (x *GetActiveGroupReq) GetPagination() *sdkws.RequestPagination { + if x != nil { + return x.Pagination + } + return nil +} + +type ActiveGroup struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Seqs map[string]*Seqs `protobuf:"bytes,1,rep,name=seqs,proto3" json:"seqs" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Group *sdkws.GroupInfo `protobuf:"bytes,1,opt,name=group,proto3" json:"group"` + Count int64 `protobuf:"varint,2,opt,name=count,proto3" json:"count"` } -func (x *GetConversationsHasReadAndMaxSeqResp) Reset() { - *x = GetConversationsHasReadAndMaxSeqResp{} +func (x *ActiveGroup) Reset() { + *x = ActiveGroup{} if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[50] + mi := &file_msg_msg_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetConversationsHasReadAndMaxSeqResp) String() string { +func (x *ActiveGroup) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetConversationsHasReadAndMaxSeqResp) ProtoMessage() {} +func (*ActiveGroup) ProtoMessage() {} -func (x *GetConversationsHasReadAndMaxSeqResp) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[50] +func (x *ActiveGroup) ProtoReflect() protoreflect.Message { + mi := &file_msg_msg_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2808,44 +2269,53 @@ func (x *GetConversationsHasReadAndMaxSeqResp) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use GetConversationsHasReadAndMaxSeqResp.ProtoReflect.Descriptor instead. -func (*GetConversationsHasReadAndMaxSeqResp) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{50} +// Deprecated: Use ActiveGroup.ProtoReflect.Descriptor instead. +func (*ActiveGroup) Descriptor() ([]byte, []int) { + return file_msg_msg_proto_rawDescGZIP(), []int{43} } -func (x *GetConversationsHasReadAndMaxSeqResp) GetSeqs() map[string]*Seqs { +func (x *ActiveGroup) GetGroup() *sdkws.GroupInfo { if x != nil { - return x.Seqs + return x.Group } return nil } -type GetMessagesReactionExtensionsReq_MessageReactionKey struct { +func (x *ActiveGroup) GetCount() int64 { + if x != nil { + return x.Count + } + return 0 +} + +type GetActiveGroupResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClientMsgID string `protobuf:"bytes,1,opt,name=clientMsgID,proto3" json:"clientMsgID"` - MsgFirstModifyTime int64 `protobuf:"varint,2,opt,name=msgFirstModifyTime,proto3" json:"msgFirstModifyTime"` + MsgCount int64 `protobuf:"varint,1,opt,name=msgCount,proto3" json:"msgCount"` + GroupCount int64 `protobuf:"varint,2,opt,name=groupCount,proto3" json:"groupCount"` + DateCount map[string]int64 `protobuf:"bytes,3,rep,name=dateCount,proto3" json:"dateCount" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + Groups []*ActiveGroup `protobuf:"bytes,4,rep,name=groups,proto3" json:"groups"` } -func (x *GetMessagesReactionExtensionsReq_MessageReactionKey) Reset() { - *x = GetMessagesReactionExtensionsReq_MessageReactionKey{} +func (x *GetActiveGroupResp) Reset() { + *x = GetActiveGroupResp{} if protoimpl.UnsafeEnabled { - mi := &file_msg_msg_proto_msgTypes[53] + mi := &file_msg_msg_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetMessagesReactionExtensionsReq_MessageReactionKey) String() string { +func (x *GetActiveGroupResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetMessagesReactionExtensionsReq_MessageReactionKey) ProtoMessage() {} +func (*GetActiveGroupResp) ProtoMessage() {} -func (x *GetMessagesReactionExtensionsReq_MessageReactionKey) ProtoReflect() protoreflect.Message { - mi := &file_msg_msg_proto_msgTypes[53] +func (x *GetActiveGroupResp) ProtoReflect() protoreflect.Message { + mi := &file_msg_msg_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2856,572 +2326,411 @@ func (x *GetMessagesReactionExtensionsReq_MessageReactionKey) ProtoReflect() pro return mi.MessageOf(x) } -// Deprecated: Use GetMessagesReactionExtensionsReq_MessageReactionKey.ProtoReflect.Descriptor instead. -func (*GetMessagesReactionExtensionsReq_MessageReactionKey) Descriptor() ([]byte, []int) { - return file_msg_msg_proto_rawDescGZIP(), []int{15, 0} +// Deprecated: Use GetActiveGroupResp.ProtoReflect.Descriptor instead. +func (*GetActiveGroupResp) Descriptor() ([]byte, []int) { + return file_msg_msg_proto_rawDescGZIP(), []int{44} } -func (x *GetMessagesReactionExtensionsReq_MessageReactionKey) GetClientMsgID() string { +func (x *GetActiveGroupResp) GetMsgCount() int64 { if x != nil { - return x.ClientMsgID + return x.MsgCount } - return "" + return 0 } -func (x *GetMessagesReactionExtensionsReq_MessageReactionKey) GetMsgFirstModifyTime() int64 { +func (x *GetActiveGroupResp) GetGroupCount() int64 { if x != nil { - return x.MsgFirstModifyTime + return x.GroupCount } return 0 } +func (x *GetActiveGroupResp) GetDateCount() map[string]int64 { + if x != nil { + return x.DateCount + } + return nil +} + +func (x *GetActiveGroupResp) GetGroups() []*ActiveGroup { + if x != nil { + return x.Groups + } + return nil +} + var File_msg_msg_proto protoreflect.FileDescriptor var file_msg_msg_proto_rawDesc = []byte{ 0x0a, 0x0d, 0x6d, 0x73, 0x67, 0x2f, 0x6d, 0x73, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x1a, 0x11, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2f, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x70, 0x62, - 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x70, 0x62, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0x5a, 0x0a, 0x0b, 0x4d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x54, 0x6f, 0x4d, 0x51, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x35, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x44, 0x61, 0x74, - 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x4d, 0x73, 0x67, - 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x22, 0x44, 0x0a, - 0x0b, 0x4d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x54, 0x6f, 0x44, 0x42, 0x12, 0x35, 0x0a, 0x07, - 0x6d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, - 0x77, 0x73, 0x2e, 0x4d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x44, - 0x61, 0x74, 0x61, 0x22, 0x70, 0x0a, 0x0f, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x73, 0x67, 0x44, 0x61, - 0x74, 0x61, 0x54, 0x6f, 0x4d, 0x51, 0x12, 0x35, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x44, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x4d, 0x73, 0x67, - 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, 0x0a, - 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x8d, 0x01, 0x0a, 0x12, 0x4d, 0x73, 0x67, 0x44, 0x61, 0x74, - 0x61, 0x54, 0x6f, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x42, 0x79, 0x4d, 0x51, 0x12, 0x18, 0x0a, 0x07, - 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6c, - 0x61, 0x73, 0x74, 0x53, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x35, - 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, - 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x4d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x6d, 0x73, - 0x67, 0x44, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x41, - 0x6e, 0x64, 0x4d, 0x69, 0x6e, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x55, - 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x55, 0x73, 0x65, - 0x72, 0x49, 0x44, 0x22, 0x45, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x41, 0x6e, 0x64, - 0x4d, 0x69, 0x6e, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x4d, 0x61, - 0x78, 0x53, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x4d, 0x61, 0x78, 0x53, - 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x4d, 0x69, 0x6e, 0x53, 0x65, 0x71, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x06, 0x4d, 0x69, 0x6e, 0x53, 0x65, 0x71, 0x22, 0x43, 0x0a, 0x0a, 0x53, 0x65, - 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x12, 0x35, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x44, - 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x4d, - 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x22, - 0x6d, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x20, - 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x49, 0x44, - 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49, 0x44, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, - 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x2d, - 0x0a, 0x13, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x16, 0x0a, - 0x14, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x15, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, - 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x22, 0x2e, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xed, 0x04, 0x0a, - 0x22, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x7c, 0x0a, - 0x12, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x2e, - 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49, 0x44, 0x12, 0x32, 0x0a, - 0x02, 0x65, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x65, - 0x78, 0x12, 0x46, 0x0a, 0x0c, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x61, 0x74, 0x74, - 0x61, 0x63, 0x68, 0x65, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x73, 0x52, - 0x65, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x52, 0x65, - 0x61, 0x63, 0x74, 0x12, 0x32, 0x0a, 0x14, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x14, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x6d, 0x73, 0x67, 0x46, 0x69, - 0x72, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x73, 0x67, 0x46, 0x69, 0x72, 0x73, 0x74, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x63, 0x0a, 0x17, 0x52, 0x65, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x32, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe7, 0x04, 0x0a, - 0x1f, 0x53, 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5a, 0x0a, 0x0b, 0x4d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x54, + 0x6f, 0x4d, 0x51, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x35, 0x0a, 0x07, 0x6d, 0x73, 0x67, + 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, + 0x4d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, + 0x22, 0x44, 0x0a, 0x0b, 0x4d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x54, 0x6f, 0x44, 0x42, 0x12, + 0x35, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x4d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x6d, + 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x22, 0x70, 0x0a, 0x0f, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x73, + 0x67, 0x44, 0x61, 0x74, 0x61, 0x54, 0x6f, 0x4d, 0x51, 0x12, 0x35, 0x0a, 0x07, 0x6d, 0x73, 0x67, + 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, + 0x4d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x79, 0x0a, 0x12, 0x72, 0x65, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x2e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x12, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, - 0x73, 0x67, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49, 0x44, 0x12, 0x32, 0x0a, 0x02, 0x65, 0x78, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x65, 0x78, 0x12, 0x46, 0x0a, 0x0c, 0x61, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x12, 0x32, 0x0a, - 0x14, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x73, 0x45, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x6d, 0x73, 0x67, 0x46, 0x69, 0x72, 0x73, 0x74, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, - 0x73, 0x67, 0x46, 0x69, 0x72, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x54, 0x69, 0x6d, - 0x65, 0x1a, 0x63, 0x0a, 0x17, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x32, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, - 0x77, 0x73, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc6, 0x01, 0x0a, 0x20, 0x53, 0x65, 0x74, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49, 0x44, 0x12, 0x2e, 0x0a, - 0x12, 0x6d, 0x73, 0x67, 0x46, 0x69, 0x72, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x54, - 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x73, 0x67, 0x46, 0x69, - 0x72, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x69, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x69, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x12, 0x36, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, - 0xe9, 0x02, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, - 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x8d, 0x01, 0x0a, 0x12, 0x4d, 0x73, 0x67, + 0x44, 0x61, 0x74, 0x61, 0x54, 0x6f, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x42, 0x79, 0x4d, 0x51, 0x12, + 0x18, 0x0a, 0x07, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x07, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x44, 0x12, 0x35, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x4d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x07, 0x6d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x22, 0x2c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4d, + 0x61, 0x78, 0x41, 0x6e, 0x64, 0x4d, 0x69, 0x6e, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x12, 0x16, + 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x45, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x78, + 0x41, 0x6e, 0x64, 0x4d, 0x69, 0x6e, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x16, 0x0a, + 0x06, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x4d, + 0x61, 0x78, 0x53, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x4d, 0x69, 0x6e, 0x53, 0x65, 0x71, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x4d, 0x69, 0x6e, 0x53, 0x65, 0x71, 0x22, 0x43, 0x0a, + 0x0a, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x12, 0x35, 0x0a, 0x07, 0x6d, + 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, + 0x73, 0x2e, 0x4d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x44, 0x61, + 0x74, 0x61, 0x22, 0x6d, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x49, 0x44, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x73, + 0x67, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, + 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x4d, 0x73, 0x67, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, + 0x65, 0x22, 0x2d, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x22, 0x16, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x15, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, + 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x22, + 0x2e, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, + 0x76, 0x0a, 0x13, 0x4d, 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x54, 0x6f, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x42, 0x79, 0x4d, 0x51, 0x12, 0x37, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, + 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x4d, 0x73, + 0x67, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, + 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x0c, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x4d, 0x73, + 0x67, 0x73, 0x52, 0x65, 0x71, 0x22, 0x0d, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x4d, 0x73, 0x67, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x22, 0x60, 0x0a, 0x0c, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x4d, 0x73, + 0x67, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, - 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x77, - 0x0a, 0x13, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, - 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x2e, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4b, - 0x65, 0x79, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x54, 0x79, 0x70, 0x65, 0x4b, - 0x65, 0x79, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x54, 0x79, 0x70, 0x65, 0x4b, - 0x65, 0x79, 0x73, 0x1a, 0x66, 0x0a, 0x12, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49, 0x44, 0x12, 0x2e, 0x0a, 0x12, 0x6d, - 0x73, 0x67, 0x46, 0x69, 0x72, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x54, 0x69, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x73, 0x67, 0x46, 0x69, 0x72, 0x73, - 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x21, - 0x47, 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x60, 0x0a, 0x13, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, - 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, - 0x67, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x13, - 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x22, 0x9d, 0x02, 0x0a, 0x1c, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x12, 0x76, 0x0a, 0x12, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x46, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x2e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49, 0x44, 0x1a, 0x63, - 0x0a, 0x17, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x32, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, - 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xa9, 0x01, 0x0a, 0x23, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x41, 0x0a, 0x0b, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, + 0x73, 0x65, 0x71, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x16, + 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x0f, 0x0a, 0x0d, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, + 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x22, 0x67, 0x0a, 0x11, 0x4d, 0x61, 0x72, 0x6b, 0x4d, + 0x73, 0x67, 0x73, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, + 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x65, 0x71, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x03, 0x52, 0x04, 0x73, 0x65, 0x71, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, + 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, + 0x22, 0x14, 0x0a, 0x12, 0x4d, 0x61, 0x72, 0x6b, 0x4d, 0x73, 0x67, 0x73, 0x41, 0x73, 0x52, 0x65, + 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x22, 0x8f, 0x01, 0x0a, 0x19, 0x4d, 0x61, 0x72, 0x6b, 0x43, + 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x61, + 0x64, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, + 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, + 0x65, 0x72, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, + 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x68, 0x61, 0x73, 0x52, 0x65, 0x61, + 0x64, 0x53, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x65, 0x71, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x03, 0x52, 0x04, 0x73, 0x65, 0x71, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x4d, 0x61, 0x72, 0x6b, + 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x73, 0x52, 0x65, + 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x22, 0x7e, 0x0a, 0x1c, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, + 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x16, + 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x52, 0x65, 0x61, + 0x64, 0x53, 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x68, 0x61, 0x73, 0x52, + 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, + 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x22, 0x51, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x73, 0x53, 0x79, + 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x49, 0x73, + 0x53, 0x79, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x79, + 0x6e, 0x63, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, + 0x73, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x22, 0xa3, 0x01, 0x0a, 0x18, 0x43, + 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x76, 0x65, + 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x45, 0x0a, 0x0d, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x6d, 0x73, 0x67, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x52, 0x0b, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3f, - 0x0a, 0x0a, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, - 0x65, 0x73, 0x70, 0x52, 0x0a, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, - 0x81, 0x03, 0x0a, 0x23, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x55, - 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x55, - 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, - 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x20, 0x0a, - 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49, 0x44, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49, - 0x44, 0x12, 0x32, 0x0a, 0x14, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x14, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x6d, 0x73, 0x67, 0x46, 0x69, 0x72, 0x73, - 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x12, 0x6d, 0x73, 0x67, 0x46, 0x69, 0x72, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x12, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x12, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x5e, 0x0a, 0x24, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x36, 0x0a, 0x06, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4b, - 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x52, 0x06, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x22, 0x4a, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x39, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x4d, 0x73, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x64, 0x4d, 0x73, 0x67, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x22, - 0xdd, 0x02, 0x0a, 0x09, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x12, 0x63, 0x0a, - 0x12, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x2e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, - 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49, - 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, - 0x73, 0x67, 0x49, 0x44, 0x12, 0x2e, 0x0a, 0x12, 0x6d, 0x73, 0x67, 0x46, 0x69, 0x72, 0x73, 0x74, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x12, 0x6d, 0x73, 0x67, 0x46, 0x69, 0x72, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x54, 0x69, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x65, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x78, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x65, 0x78, 0x1a, 0x65, 0x0a, 0x17, 0x52, 0x65, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x7a, 0x0a, 0x0c, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x38, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x08, 0x6b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x72, 0x72, - 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x65, 0x72, 0x72, 0x43, - 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x76, 0x0a, 0x13, 0x4d, - 0x73, 0x67, 0x44, 0x61, 0x74, 0x61, 0x54, 0x6f, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x42, 0x79, - 0x4d, 0x51, 0x12, 0x37, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x4d, 0x73, 0x67, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x63, - 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x22, 0x0c, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x4d, 0x73, 0x67, 0x73, 0x52, 0x65, - 0x71, 0x22, 0x0d, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x4d, 0x73, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x22, 0x60, 0x0a, 0x0c, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, - 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, - 0x65, 0x72, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x44, 0x22, 0x0f, 0x0a, 0x0d, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x4d, 0x73, 0x67, 0x52, - 0x65, 0x73, 0x70, 0x22, 0x67, 0x0a, 0x11, 0x4d, 0x61, 0x72, 0x6b, 0x4d, 0x73, 0x67, 0x73, 0x41, - 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, - 0x12, 0x12, 0x0a, 0x04, 0x73, 0x65, 0x71, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x03, 0x52, 0x04, - 0x73, 0x65, 0x71, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x14, 0x0a, 0x12, - 0x4d, 0x61, 0x72, 0x6b, 0x4d, 0x73, 0x67, 0x73, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x22, 0x8f, 0x01, 0x0a, 0x19, 0x4d, 0x61, 0x72, 0x6b, 0x43, 0x6f, 0x6e, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, - 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, - 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x68, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, - 0x12, 0x12, 0x0a, 0x04, 0x73, 0x65, 0x71, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x03, 0x52, 0x04, - 0x73, 0x65, 0x71, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x4d, 0x61, 0x72, 0x6b, 0x43, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x22, 0x7e, 0x0a, 0x1c, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, 0x52, - 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, - 0x65, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x68, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, - 0x65, 0x71, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, 0x52, - 0x65, 0x73, 0x70, 0x22, 0x51, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x79, 0x6e, - 0x63, 0x4f, 0x70, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x65, - 0x6c, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, - 0x53, 0x65, 0x6c, 0x66, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x74, - 0x68, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x79, 0x6e, - 0x63, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x22, 0xa3, 0x01, 0x0a, 0x18, 0x43, 0x6c, 0x65, 0x61, 0x72, - 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x73, 0x67, - 0x52, 0x65, 0x71, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, - 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x12, 0x16, 0x0a, - 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, - 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x45, 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, - 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x52, 0x0d, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x22, 0x1b, 0x0a, 0x19, - 0x43, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x22, 0x73, 0x0a, 0x12, 0x55, 0x73, 0x65, - 0x72, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x41, 0x6c, 0x6c, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x12, - 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x45, 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, - 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x52, - 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x22, 0x15, - 0x0a, 0x13, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x41, 0x6c, 0x6c, 0x4d, 0x73, - 0x67, 0x52, 0x65, 0x73, 0x70, 0x22, 0xaa, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4d, 0x73, 0x67, 0x73, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, - 0x12, 0x0a, 0x04, 0x73, 0x65, 0x71, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x03, 0x52, 0x04, 0x73, - 0x65, 0x71, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x03, 0x20, + 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, + 0x74, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, + 0x22, 0x1b, 0x0a, 0x19, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x22, 0x73, 0x0a, + 0x12, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x41, 0x6c, 0x6c, 0x4d, 0x73, 0x67, + 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x45, 0x0a, 0x0d, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4f, - 0x70, 0x74, 0x22, 0x10, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x22, 0x5e, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, - 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x28, 0x0a, 0x0f, - 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, - 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x22, 0x57, 0x0a, - 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, - 0x61, 0x6c, 0x42, 0x79, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, - 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x65, 0x71, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x03, - 0x52, 0x04, 0x73, 0x65, 0x71, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x42, 0x79, 0x53, 0x65, 0x71, - 0x52, 0x65, 0x73, 0x70, 0x22, 0x42, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, - 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x33, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, + 0x70, 0x74, 0x22, 0x15, 0x0a, 0x13, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x41, + 0x6c, 0x6c, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x22, 0xaa, 0x01, 0x0a, 0x0d, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x73, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, + 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x65, 0x71, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x03, 0x52, 0x04, 0x73, 0x65, 0x71, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, + 0x45, 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, + 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x74, 0x22, 0x10, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4d, 0x73, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x5e, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, + 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x76, 0x65, + 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x22, 0x57, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, + 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x42, 0x79, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x12, 0x26, + 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x65, 0x71, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x03, 0x52, 0x04, 0x73, 0x65, 0x71, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x42, + 0x79, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x22, 0x42, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, - 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x22, 0x3d, 0x0a, - 0x23, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x41, 0x6e, 0x64, 0x4d, 0x61, 0x78, 0x53, 0x65, - 0x71, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x3e, 0x0a, 0x04, - 0x53, 0x65, 0x71, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, - 0x68, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0a, 0x68, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, 0x22, 0xcd, 0x01, 0x0a, - 0x24, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x41, 0x6e, 0x64, 0x4d, 0x61, 0x78, 0x53, 0x65, - 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x54, 0x0a, 0x04, 0x73, 0x65, 0x71, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x41, 0x6e, - 0x64, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x53, 0x65, 0x71, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x73, 0x65, 0x71, 0x73, 0x1a, 0x4f, 0x0a, 0x09, 0x53, - 0x65, 0x71, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x71, - 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x32, 0xa5, 0x11, 0x0a, - 0x03, 0x6d, 0x73, 0x67, 0x12, 0x50, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x65, - 0x71, 0x12, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, - 0x52, 0x65, 0x71, 0x1a, 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x53, - 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x70, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, - 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x12, - 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, - 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x1a, 0x2b, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, - 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x68, 0x0a, 0x11, 0x50, 0x75, 0x6c, 0x6c, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x53, 0x65, 0x71, 0x73, 0x12, 0x28, 0x2e, + 0x71, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x33, 0x0a, 0x19, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, + 0x53, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x53, 0x65, + 0x71, 0x22, 0x3d, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x41, 0x6e, 0x64, 0x4d, + 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, + 0x22, 0x3e, 0x0a, 0x04, 0x53, 0x65, 0x71, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x53, + 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x71, + 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x68, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, + 0x22, 0xcd, 0x01, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x41, 0x6e, 0x64, 0x4d, + 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x54, 0x0a, 0x04, 0x73, 0x65, 0x71, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x61, 0x73, 0x52, 0x65, + 0x61, 0x64, 0x41, 0x6e, 0x64, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x2e, + 0x53, 0x65, 0x71, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x73, 0x65, 0x71, 0x73, 0x1a, + 0x4f, 0x0a, 0x09, 0x53, 0x65, 0x71, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, + 0x2e, 0x53, 0x65, 0x71, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xa9, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, + 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x10, 0x0a, + 0x03, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x45, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x54, 0x0a, 0x0a, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, + 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0x91, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x73, 0x67, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x73, 0x67, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x50, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x1a, 0x3c, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x94, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x03, 0x65, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x03, 0x61, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x58, 0x0a, + 0x0b, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x33, 0x0a, 0x05, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, + 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x98, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1a, + 0x0a, 0x08, 0x6d, 0x73, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x08, 0x6d, 0x73, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x51, 0x0a, 0x09, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, + 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x65, 0x73, 0x70, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x09, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x35, 0x0a, + 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, + 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x1a, 0x3c, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x32, 0xa8, 0x0e, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x50, 0x0a, 0x09, 0x47, 0x65, + 0x74, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x12, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x47, 0x65, 0x74, + 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x1a, 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x47, + 0x65, 0x74, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x70, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x61, 0x78, 0x53, 0x65, 0x71, 0x12, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, + 0x71, 0x1a, 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x68, + 0x0a, 0x11, 0x50, 0x75, 0x6c, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x53, + 0x65, 0x71, 0x73, 0x12, 0x28, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x53, 0x65, 0x71, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x29, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x50, 0x75, 0x6c, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, - 0x53, 0x65, 0x71, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x29, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x50, 0x75, 0x6c, - 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x53, 0x65, 0x71, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x46, 0x0a, 0x07, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x12, 0x1c, 0x2e, - 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, - 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, - 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x70, 0x0a, 0x15, 0x43, 0x6c, - 0x65, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, - 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, - 0x73, 0x67, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5e, 0x0a, 0x0f, - 0x55, 0x73, 0x65, 0x72, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x41, 0x6c, 0x6c, 0x4d, 0x73, 0x67, 0x12, - 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, - 0x73, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x41, 0x6c, 0x6c, 0x4d, - 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x25, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x53, 0x65, 0x71, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x46, 0x0a, 0x07, 0x53, 0x65, 0x6e, 0x64, + 0x4d, 0x73, 0x67, 0x12, 0x1c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, + 0x71, 0x1a, 0x1d, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x70, 0x0a, 0x15, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x73, 0x67, 0x12, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x43, 0x6c, 0x65, + 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, + 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x43, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4d, 0x73, 0x67, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x5e, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x41, + 0x6c, 0x6c, 0x4d, 0x73, 0x67, 0x12, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x6c, 0x65, - 0x61, 0x72, 0x41, 0x6c, 0x6c, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x0a, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x73, 0x12, 0x1f, 0x2e, 0x4f, 0x70, 0x65, + 0x61, 0x72, 0x41, 0x6c, 0x6c, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x25, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x41, 0x6c, 0x6c, 0x4d, 0x73, 0x67, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x4f, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x73, + 0x12, 0x1f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x73, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, + 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x42, 0x79, 0x53, 0x65, 0x71, 0x12, 0x2b, 0x2e, + 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, + 0x61, 0x6c, 0x42, 0x79, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x1a, 0x2c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x20, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x73, 0x0a, - 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, - 0x61, 0x6c, 0x42, 0x79, 0x53, 0x65, 0x71, 0x12, 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x42, 0x79, 0x53, 0x65, - 0x71, 0x52, 0x65, 0x71, 0x1a, 0x2c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, - 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x42, 0x79, 0x53, 0x65, 0x71, 0x52, 0x65, - 0x73, 0x70, 0x12, 0x64, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, - 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x12, 0x26, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x1a, - 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, - 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, - 0x69, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x61, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x53, - 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, - 0x53, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x1a, 0x26, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, - 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x61, 0x0a, 0x10, 0x47, - 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x25, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, - 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x26, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6e, - 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, - 0x0a, 0x09, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x4d, 0x73, 0x67, 0x12, 0x1e, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x52, - 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x52, - 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5b, 0x0a, 0x0e, - 0x4d, 0x61, 0x72, 0x6b, 0x4d, 0x73, 0x67, 0x73, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, 0x12, 0x23, - 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, - 0x67, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x4d, 0x73, 0x67, 0x73, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, - 0x52, 0x65, 0x71, 0x1a, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x4d, 0x73, 0x67, 0x73, 0x41, - 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x73, 0x0a, 0x16, 0x4d, 0x61, 0x72, - 0x6b, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x73, 0x52, - 0x65, 0x61, 0x64, 0x12, 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x43, 0x6f, 0x6e, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, - 0x1a, 0x2c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x7c, - 0x0a, 0x19, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, 0x12, 0x2e, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, - 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x1a, 0x2f, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, - 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x85, 0x01, 0x0a, - 0x1c, 0x53, 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x31, 0x2e, + 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x42, + 0x79, 0x53, 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x64, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x12, 0x26, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, - 0x2e, 0x53, 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x1a, 0x32, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x88, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x33, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, - 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, - 0x8b, 0x01, 0x0a, 0x1c, 0x41, 0x64, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x34, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x35, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x90, 0x01, - 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x35, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x36, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, - 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x91, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x41, 0x6e, 0x64, 0x4d, - 0x61, 0x78, 0x53, 0x65, 0x71, 0x12, 0x35, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, - 0x41, 0x6e, 0x64, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x1a, 0x36, 0x2e, 0x4f, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, + 0x61, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, + 0x73, 0x67, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x61, + 0x0a, 0x10, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x25, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x26, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x74, + 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x61, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, + 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x26, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x41, 0x6e, 0x64, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, - 0x52, 0x65, 0x73, 0x70, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x44, 0x4b, 0x2f, 0x4f, 0x70, 0x65, - 0x6e, 0x2d, 0x49, 0x4d, 0x2d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x6b, 0x67, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6d, 0x73, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x47, 0x65, 0x74, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x4c, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x4d, 0x73, + 0x67, 0x12, 0x1e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, + 0x71, 0x1a, 0x1f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x52, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x5b, 0x0a, 0x0e, 0x4d, 0x61, 0x72, 0x6b, 0x4d, 0x73, 0x67, 0x73, 0x41, 0x73, + 0x52, 0x65, 0x61, 0x64, 0x12, 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x4d, 0x73, 0x67, 0x73, + 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x61, 0x72, + 0x6b, 0x4d, 0x73, 0x67, 0x73, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, + 0x73, 0x0a, 0x16, 0x4d, 0x61, 0x72, 0x6b, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, 0x12, 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x61, 0x72, + 0x6b, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x73, 0x52, + 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x2c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x43, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x61, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x12, 0x7c, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, + 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, + 0x71, 0x12, 0x2e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, 0x52, 0x65, + 0x71, 0x1a, 0x2f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x65, 0x71, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x91, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x41, 0x6e, + 0x64, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x12, 0x35, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x61, 0x73, 0x52, 0x65, + 0x61, 0x64, 0x41, 0x6e, 0x64, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x71, 0x52, 0x65, 0x71, 0x1a, 0x36, + 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, + 0x67, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x48, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x41, 0x6e, 0x64, 0x4d, 0x61, 0x78, 0x53, + 0x65, 0x71, 0x52, 0x65, 0x73, 0x70, 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, + 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x5b, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x12, 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x42, 0x33, 0x5a, + 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x70, 0x65, 0x6e, + 0x49, 0x4d, 0x53, 0x44, 0x4b, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x2d, 0x49, 0x4d, 0x2d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6d, + 0x73, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3436,7 +2745,7 @@ func file_msg_msg_proto_rawDescGZIP() []byte { return file_msg_msg_proto_rawDescData } -var file_msg_msg_proto_msgTypes = make([]protoimpl.MessageInfo, 57) +var file_msg_msg_proto_msgTypes = make([]protoimpl.MessageInfo, 48) var file_msg_msg_proto_goTypes = []interface{}{ (*MsgDataToMQ)(nil), // 0: OpenIMServer.msg.MsgDataToMQ (*MsgDataToDB)(nil), // 1: OpenIMServer.msg.MsgDataToDB @@ -3450,137 +2759,112 @@ var file_msg_msg_proto_goTypes = []interface{}{ (*SetSendMsgStatusResp)(nil), // 9: OpenIMServer.msg.SetSendMsgStatusResp (*GetSendMsgStatusReq)(nil), // 10: OpenIMServer.msg.GetSendMsgStatusReq (*GetSendMsgStatusResp)(nil), // 11: OpenIMServer.msg.GetSendMsgStatusResp - (*ModifyMessageReactionExtensionsReq)(nil), // 12: OpenIMServer.msg.ModifyMessageReactionExtensionsReq - (*SetMessageReactionExtensionsReq)(nil), // 13: OpenIMServer.msg.SetMessageReactionExtensionsReq - (*SetMessageReactionExtensionsResp)(nil), // 14: OpenIMServer.msg.SetMessageReactionExtensionsResp - (*GetMessagesReactionExtensionsReq)(nil), // 15: OpenIMServer.msg.GetMessagesReactionExtensionsReq - (*GetMessagesReactionExtensionsResp)(nil), // 16: OpenIMServer.msg.GetMessagesReactionExtensionsResp - (*SingleMessageExtensionResult)(nil), // 17: OpenIMServer.msg.SingleMessageExtensionResult - (*ModifyMessageReactionExtensionsResp)(nil), // 18: OpenIMServer.msg.ModifyMessageReactionExtensionsResp - (*DeleteMessagesReactionExtensionsReq)(nil), // 19: OpenIMServer.msg.DeleteMessagesReactionExtensionsReq - (*DeleteMessagesReactionExtensionsResp)(nil), // 20: OpenIMServer.msg.DeleteMessagesReactionExtensionsResp - (*ExtendMsgResp)(nil), // 21: OpenIMServer.msg.ExtendMsgResp - (*ExtendMsg)(nil), // 22: OpenIMServer.msg.ExtendMsg - (*KeyValueResp)(nil), // 23: OpenIMServer.msg.KeyValueResp - (*MsgDataToModifyByMQ)(nil), // 24: OpenIMServer.msg.MsgDataToModifyByMQ - (*DelMsgsReq)(nil), // 25: OpenIMServer.msg.DelMsgsReq - (*DelMsgsResp)(nil), // 26: OpenIMServer.msg.DelMsgsResp - (*RevokeMsgReq)(nil), // 27: OpenIMServer.msg.RevokeMsgReq - (*RevokeMsgResp)(nil), // 28: OpenIMServer.msg.RevokeMsgResp - (*MarkMsgsAsReadReq)(nil), // 29: OpenIMServer.msg.MarkMsgsAsReadReq - (*MarkMsgsAsReadResp)(nil), // 30: OpenIMServer.msg.MarkMsgsAsReadResp - (*MarkConversationAsReadReq)(nil), // 31: OpenIMServer.msg.MarkConversationAsReadReq - (*MarkConversationAsReadResp)(nil), // 32: OpenIMServer.msg.MarkConversationAsReadResp - (*SetConversationHasReadSeqReq)(nil), // 33: OpenIMServer.msg.SetConversationHasReadSeqReq - (*SetConversationHasReadSeqResp)(nil), // 34: OpenIMServer.msg.SetConversationHasReadSeqResp - (*DeleteSyncOpt)(nil), // 35: OpenIMServer.msg.DeleteSyncOpt - (*ClearConversationsMsgReq)(nil), // 36: OpenIMServer.msg.ClearConversationsMsgReq - (*ClearConversationsMsgResp)(nil), // 37: OpenIMServer.msg.ClearConversationsMsgResp - (*UserClearAllMsgReq)(nil), // 38: OpenIMServer.msg.UserClearAllMsgReq - (*UserClearAllMsgResp)(nil), // 39: OpenIMServer.msg.UserClearAllMsgResp - (*DeleteMsgsReq)(nil), // 40: OpenIMServer.msg.DeleteMsgsReq - (*DeleteMsgsResp)(nil), // 41: OpenIMServer.msg.DeleteMsgsResp - (*DeleteMsgPhysicalReq)(nil), // 42: OpenIMServer.msg.DeleteMsgPhysicalReq - (*DeleteMsgPhysicalResp)(nil), // 43: OpenIMServer.msg.DeleteMsgPhysicalResp - (*DeleteMsgPhysicalBySeqReq)(nil), // 44: OpenIMServer.msg.DeleteMsgPhysicalBySeqReq - (*DeleteMsgPhysicalBySeqResp)(nil), // 45: OpenIMServer.msg.DeleteMsgPhysicalBySeqResp - (*GetConversationMaxSeqReq)(nil), // 46: OpenIMServer.msg.GetConversationMaxSeqReq - (*GetConversationMaxSeqResp)(nil), // 47: OpenIMServer.msg.GetConversationMaxSeqResp - (*GetConversationsHasReadAndMaxSeqReq)(nil), // 48: OpenIMServer.msg.GetConversationsHasReadAndMaxSeqReq - (*Seqs)(nil), // 49: OpenIMServer.msg.Seqs - (*GetConversationsHasReadAndMaxSeqResp)(nil), // 50: OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp - nil, // 51: OpenIMServer.msg.ModifyMessageReactionExtensionsReq.ReactionExtensionsEntry - nil, // 52: OpenIMServer.msg.SetMessageReactionExtensionsReq.ReactionExtensionsEntry - (*GetMessagesReactionExtensionsReq_MessageReactionKey)(nil), // 53: OpenIMServer.msg.GetMessagesReactionExtensionsReq.MessageReactionKey - nil, // 54: OpenIMServer.msg.SingleMessageExtensionResult.ReactionExtensionsEntry - nil, // 55: OpenIMServer.msg.ExtendMsg.ReactionExtensionsEntry - nil, // 56: OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp.SeqsEntry - (*sdkws.MsgData)(nil), // 57: OpenIMServer.sdkws.MsgData - (*wrapperspb.StringValue)(nil), // 58: OpenIMServer.protobuf.StringValue - (*sdkws.KeyValue)(nil), // 59: OpenIMServer.sdkws.KeyValue - (*sdkws.GetMaxSeqReq)(nil), // 60: OpenIMServer.sdkws.GetMaxSeqReq - (*sdkws.PullMessageBySeqsReq)(nil), // 61: OpenIMServer.sdkws.PullMessageBySeqsReq - (*sdkws.GetMaxSeqResp)(nil), // 62: OpenIMServer.sdkws.GetMaxSeqResp - (*sdkws.PullMessageBySeqsResp)(nil), // 63: OpenIMServer.sdkws.PullMessageBySeqsResp + (*MsgDataToModifyByMQ)(nil), // 12: OpenIMServer.msg.MsgDataToModifyByMQ + (*DelMsgsReq)(nil), // 13: OpenIMServer.msg.DelMsgsReq + (*DelMsgsResp)(nil), // 14: OpenIMServer.msg.DelMsgsResp + (*RevokeMsgReq)(nil), // 15: OpenIMServer.msg.RevokeMsgReq + (*RevokeMsgResp)(nil), // 16: OpenIMServer.msg.RevokeMsgResp + (*MarkMsgsAsReadReq)(nil), // 17: OpenIMServer.msg.MarkMsgsAsReadReq + (*MarkMsgsAsReadResp)(nil), // 18: OpenIMServer.msg.MarkMsgsAsReadResp + (*MarkConversationAsReadReq)(nil), // 19: OpenIMServer.msg.MarkConversationAsReadReq + (*MarkConversationAsReadResp)(nil), // 20: OpenIMServer.msg.MarkConversationAsReadResp + (*SetConversationHasReadSeqReq)(nil), // 21: OpenIMServer.msg.SetConversationHasReadSeqReq + (*SetConversationHasReadSeqResp)(nil), // 22: OpenIMServer.msg.SetConversationHasReadSeqResp + (*DeleteSyncOpt)(nil), // 23: OpenIMServer.msg.DeleteSyncOpt + (*ClearConversationsMsgReq)(nil), // 24: OpenIMServer.msg.ClearConversationsMsgReq + (*ClearConversationsMsgResp)(nil), // 25: OpenIMServer.msg.ClearConversationsMsgResp + (*UserClearAllMsgReq)(nil), // 26: OpenIMServer.msg.UserClearAllMsgReq + (*UserClearAllMsgResp)(nil), // 27: OpenIMServer.msg.UserClearAllMsgResp + (*DeleteMsgsReq)(nil), // 28: OpenIMServer.msg.DeleteMsgsReq + (*DeleteMsgsResp)(nil), // 29: OpenIMServer.msg.DeleteMsgsResp + (*DeleteMsgPhysicalReq)(nil), // 30: OpenIMServer.msg.DeleteMsgPhysicalReq + (*DeleteMsgPhysicalResp)(nil), // 31: OpenIMServer.msg.DeleteMsgPhysicalResp + (*DeleteMsgPhysicalBySeqReq)(nil), // 32: OpenIMServer.msg.DeleteMsgPhysicalBySeqReq + (*DeleteMsgPhysicalBySeqResp)(nil), // 33: OpenIMServer.msg.DeleteMsgPhysicalBySeqResp + (*GetConversationMaxSeqReq)(nil), // 34: OpenIMServer.msg.GetConversationMaxSeqReq + (*GetConversationMaxSeqResp)(nil), // 35: OpenIMServer.msg.GetConversationMaxSeqResp + (*GetConversationsHasReadAndMaxSeqReq)(nil), // 36: OpenIMServer.msg.GetConversationsHasReadAndMaxSeqReq + (*Seqs)(nil), // 37: OpenIMServer.msg.Seqs + (*GetConversationsHasReadAndMaxSeqResp)(nil), // 38: OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp + (*GetActiveUserReq)(nil), // 39: OpenIMServer.msg.GetActiveUserReq + (*ActiveUser)(nil), // 40: OpenIMServer.msg.ActiveUser + (*GetActiveUserResp)(nil), // 41: OpenIMServer.msg.GetActiveUserResp + (*GetActiveGroupReq)(nil), // 42: OpenIMServer.msg.GetActiveGroupReq + (*ActiveGroup)(nil), // 43: OpenIMServer.msg.ActiveGroup + (*GetActiveGroupResp)(nil), // 44: OpenIMServer.msg.GetActiveGroupResp + nil, // 45: OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp.SeqsEntry + nil, // 46: OpenIMServer.msg.GetActiveUserResp.DateCountEntry + nil, // 47: OpenIMServer.msg.GetActiveGroupResp.DateCountEntry + (*sdkws.MsgData)(nil), // 48: OpenIMServer.sdkws.MsgData + (*sdkws.RequestPagination)(nil), // 49: OpenIMServer.sdkws.RequestPagination + (*sdkws.UserInfo)(nil), // 50: OpenIMServer.sdkws.UserInfo + (*sdkws.GroupInfo)(nil), // 51: OpenIMServer.sdkws.GroupInfo + (*sdkws.GetMaxSeqReq)(nil), // 52: OpenIMServer.sdkws.GetMaxSeqReq + (*sdkws.PullMessageBySeqsReq)(nil), // 53: OpenIMServer.sdkws.PullMessageBySeqsReq + (*sdkws.GetMaxSeqResp)(nil), // 54: OpenIMServer.sdkws.GetMaxSeqResp + (*sdkws.PullMessageBySeqsResp)(nil), // 55: OpenIMServer.sdkws.PullMessageBySeqsResp } var file_msg_msg_proto_depIdxs = []int32{ - 57, // 0: OpenIMServer.msg.MsgDataToMQ.msgData:type_name -> OpenIMServer.sdkws.MsgData - 57, // 1: OpenIMServer.msg.MsgDataToDB.msgData:type_name -> OpenIMServer.sdkws.MsgData - 57, // 2: OpenIMServer.msg.PushMsgDataToMQ.msgData:type_name -> OpenIMServer.sdkws.MsgData - 57, // 3: OpenIMServer.msg.MsgDataToMongoByMQ.msgData:type_name -> OpenIMServer.sdkws.MsgData - 57, // 4: OpenIMServer.msg.SendMsgReq.msgData:type_name -> OpenIMServer.sdkws.MsgData - 51, // 5: OpenIMServer.msg.ModifyMessageReactionExtensionsReq.reactionExtensions:type_name -> OpenIMServer.msg.ModifyMessageReactionExtensionsReq.ReactionExtensionsEntry - 58, // 6: OpenIMServer.msg.ModifyMessageReactionExtensionsReq.ex:type_name -> OpenIMServer.protobuf.StringValue - 58, // 7: OpenIMServer.msg.ModifyMessageReactionExtensionsReq.attachedInfo:type_name -> OpenIMServer.protobuf.StringValue - 52, // 8: OpenIMServer.msg.SetMessageReactionExtensionsReq.reactionExtensions:type_name -> OpenIMServer.msg.SetMessageReactionExtensionsReq.ReactionExtensionsEntry - 58, // 9: OpenIMServer.msg.SetMessageReactionExtensionsReq.ex:type_name -> OpenIMServer.protobuf.StringValue - 58, // 10: OpenIMServer.msg.SetMessageReactionExtensionsReq.attachedInfo:type_name -> OpenIMServer.protobuf.StringValue - 23, // 11: OpenIMServer.msg.SetMessageReactionExtensionsResp.result:type_name -> OpenIMServer.msg.KeyValueResp - 53, // 12: OpenIMServer.msg.GetMessagesReactionExtensionsReq.messageReactionKeys:type_name -> OpenIMServer.msg.GetMessagesReactionExtensionsReq.MessageReactionKey - 17, // 13: OpenIMServer.msg.GetMessagesReactionExtensionsResp.singleMessageResult:type_name -> OpenIMServer.msg.SingleMessageExtensionResult - 54, // 14: OpenIMServer.msg.SingleMessageExtensionResult.reactionExtensions:type_name -> OpenIMServer.msg.SingleMessageExtensionResult.ReactionExtensionsEntry - 21, // 15: OpenIMServer.msg.ModifyMessageReactionExtensionsResp.successList:type_name -> OpenIMServer.msg.ExtendMsgResp - 21, // 16: OpenIMServer.msg.ModifyMessageReactionExtensionsResp.failedList:type_name -> OpenIMServer.msg.ExtendMsgResp - 59, // 17: OpenIMServer.msg.DeleteMessagesReactionExtensionsReq.reactionExtensions:type_name -> OpenIMServer.sdkws.KeyValue - 23, // 18: OpenIMServer.msg.DeleteMessagesReactionExtensionsResp.result:type_name -> OpenIMServer.msg.KeyValueResp - 22, // 19: OpenIMServer.msg.ExtendMsgResp.extendMsg:type_name -> OpenIMServer.msg.ExtendMsg - 55, // 20: OpenIMServer.msg.ExtendMsg.reactionExtensions:type_name -> OpenIMServer.msg.ExtendMsg.ReactionExtensionsEntry - 59, // 21: OpenIMServer.msg.KeyValueResp.keyValue:type_name -> OpenIMServer.sdkws.KeyValue - 57, // 22: OpenIMServer.msg.MsgDataToModifyByMQ.messages:type_name -> OpenIMServer.sdkws.MsgData - 35, // 23: OpenIMServer.msg.ClearConversationsMsgReq.deleteSyncOpt:type_name -> OpenIMServer.msg.DeleteSyncOpt - 35, // 24: OpenIMServer.msg.UserClearAllMsgReq.deleteSyncOpt:type_name -> OpenIMServer.msg.DeleteSyncOpt - 35, // 25: OpenIMServer.msg.DeleteMsgsReq.deleteSyncOpt:type_name -> OpenIMServer.msg.DeleteSyncOpt - 56, // 26: OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp.seqs:type_name -> OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp.SeqsEntry - 59, // 27: OpenIMServer.msg.ModifyMessageReactionExtensionsReq.ReactionExtensionsEntry.value:type_name -> OpenIMServer.sdkws.KeyValue - 59, // 28: OpenIMServer.msg.SetMessageReactionExtensionsReq.ReactionExtensionsEntry.value:type_name -> OpenIMServer.sdkws.KeyValue - 59, // 29: OpenIMServer.msg.SingleMessageExtensionResult.ReactionExtensionsEntry.value:type_name -> OpenIMServer.sdkws.KeyValue - 23, // 30: OpenIMServer.msg.ExtendMsg.ReactionExtensionsEntry.value:type_name -> OpenIMServer.msg.KeyValueResp - 49, // 31: OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp.SeqsEntry.value:type_name -> OpenIMServer.msg.Seqs - 60, // 32: OpenIMServer.msg.msg.GetMaxSeq:input_type -> OpenIMServer.sdkws.GetMaxSeqReq - 46, // 33: OpenIMServer.msg.msg.GetConversationMaxSeq:input_type -> OpenIMServer.msg.GetConversationMaxSeqReq - 61, // 34: OpenIMServer.msg.msg.PullMessageBySeqs:input_type -> OpenIMServer.sdkws.PullMessageBySeqsReq - 6, // 35: OpenIMServer.msg.msg.SendMsg:input_type -> OpenIMServer.msg.SendMsgReq - 36, // 36: OpenIMServer.msg.msg.ClearConversationsMsg:input_type -> OpenIMServer.msg.ClearConversationsMsgReq - 38, // 37: OpenIMServer.msg.msg.UserClearAllMsg:input_type -> OpenIMServer.msg.UserClearAllMsgReq - 40, // 38: OpenIMServer.msg.msg.DeleteMsgs:input_type -> OpenIMServer.msg.DeleteMsgsReq - 44, // 39: OpenIMServer.msg.msg.DeleteMsgPhysicalBySeq:input_type -> OpenIMServer.msg.DeleteMsgPhysicalBySeqReq - 42, // 40: OpenIMServer.msg.msg.DeleteMsgPhysical:input_type -> OpenIMServer.msg.DeleteMsgPhysicalReq - 8, // 41: OpenIMServer.msg.msg.SetSendMsgStatus:input_type -> OpenIMServer.msg.SetSendMsgStatusReq - 10, // 42: OpenIMServer.msg.msg.GetSendMsgStatus:input_type -> OpenIMServer.msg.GetSendMsgStatusReq - 27, // 43: OpenIMServer.msg.msg.RevokeMsg:input_type -> OpenIMServer.msg.RevokeMsgReq - 29, // 44: OpenIMServer.msg.msg.MarkMsgsAsRead:input_type -> OpenIMServer.msg.MarkMsgsAsReadReq - 31, // 45: OpenIMServer.msg.msg.MarkConversationAsRead:input_type -> OpenIMServer.msg.MarkConversationAsReadReq - 33, // 46: OpenIMServer.msg.msg.SetConversationHasReadSeq:input_type -> OpenIMServer.msg.SetConversationHasReadSeqReq - 13, // 47: OpenIMServer.msg.msg.SetMessageReactionExtensions:input_type -> OpenIMServer.msg.SetMessageReactionExtensionsReq - 15, // 48: OpenIMServer.msg.msg.GetMessagesReactionExtensions:input_type -> OpenIMServer.msg.GetMessagesReactionExtensionsReq - 12, // 49: OpenIMServer.msg.msg.AddMessageReactionExtensions:input_type -> OpenIMServer.msg.ModifyMessageReactionExtensionsReq - 19, // 50: OpenIMServer.msg.msg.DeleteMessageReactionExtensions:input_type -> OpenIMServer.msg.DeleteMessagesReactionExtensionsReq - 48, // 51: OpenIMServer.msg.msg.GetConversationsHasReadAndMaxSeq:input_type -> OpenIMServer.msg.GetConversationsHasReadAndMaxSeqReq - 62, // 52: OpenIMServer.msg.msg.GetMaxSeq:output_type -> OpenIMServer.sdkws.GetMaxSeqResp - 47, // 53: OpenIMServer.msg.msg.GetConversationMaxSeq:output_type -> OpenIMServer.msg.GetConversationMaxSeqResp - 63, // 54: OpenIMServer.msg.msg.PullMessageBySeqs:output_type -> OpenIMServer.sdkws.PullMessageBySeqsResp - 7, // 55: OpenIMServer.msg.msg.SendMsg:output_type -> OpenIMServer.msg.SendMsgResp - 37, // 56: OpenIMServer.msg.msg.ClearConversationsMsg:output_type -> OpenIMServer.msg.ClearConversationsMsgResp - 39, // 57: OpenIMServer.msg.msg.UserClearAllMsg:output_type -> OpenIMServer.msg.UserClearAllMsgResp - 41, // 58: OpenIMServer.msg.msg.DeleteMsgs:output_type -> OpenIMServer.msg.DeleteMsgsResp - 45, // 59: OpenIMServer.msg.msg.DeleteMsgPhysicalBySeq:output_type -> OpenIMServer.msg.DeleteMsgPhysicalBySeqResp - 43, // 60: OpenIMServer.msg.msg.DeleteMsgPhysical:output_type -> OpenIMServer.msg.DeleteMsgPhysicalResp - 9, // 61: OpenIMServer.msg.msg.SetSendMsgStatus:output_type -> OpenIMServer.msg.SetSendMsgStatusResp - 11, // 62: OpenIMServer.msg.msg.GetSendMsgStatus:output_type -> OpenIMServer.msg.GetSendMsgStatusResp - 28, // 63: OpenIMServer.msg.msg.RevokeMsg:output_type -> OpenIMServer.msg.RevokeMsgResp - 30, // 64: OpenIMServer.msg.msg.MarkMsgsAsRead:output_type -> OpenIMServer.msg.MarkMsgsAsReadResp - 32, // 65: OpenIMServer.msg.msg.MarkConversationAsRead:output_type -> OpenIMServer.msg.MarkConversationAsReadResp - 34, // 66: OpenIMServer.msg.msg.SetConversationHasReadSeq:output_type -> OpenIMServer.msg.SetConversationHasReadSeqResp - 14, // 67: OpenIMServer.msg.msg.SetMessageReactionExtensions:output_type -> OpenIMServer.msg.SetMessageReactionExtensionsResp - 16, // 68: OpenIMServer.msg.msg.GetMessagesReactionExtensions:output_type -> OpenIMServer.msg.GetMessagesReactionExtensionsResp - 18, // 69: OpenIMServer.msg.msg.AddMessageReactionExtensions:output_type -> OpenIMServer.msg.ModifyMessageReactionExtensionsResp - 20, // 70: OpenIMServer.msg.msg.DeleteMessageReactionExtensions:output_type -> OpenIMServer.msg.DeleteMessagesReactionExtensionsResp - 50, // 71: OpenIMServer.msg.msg.GetConversationsHasReadAndMaxSeq:output_type -> OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp - 52, // [52:72] is the sub-list for method output_type - 32, // [32:52] is the sub-list for method input_type - 32, // [32:32] is the sub-list for extension type_name - 32, // [32:32] is the sub-list for extension extendee - 0, // [0:32] is the sub-list for field type_name + 48, // 0: OpenIMServer.msg.MsgDataToMQ.msgData:type_name -> OpenIMServer.sdkws.MsgData + 48, // 1: OpenIMServer.msg.MsgDataToDB.msgData:type_name -> OpenIMServer.sdkws.MsgData + 48, // 2: OpenIMServer.msg.PushMsgDataToMQ.msgData:type_name -> OpenIMServer.sdkws.MsgData + 48, // 3: OpenIMServer.msg.MsgDataToMongoByMQ.msgData:type_name -> OpenIMServer.sdkws.MsgData + 48, // 4: OpenIMServer.msg.SendMsgReq.msgData:type_name -> OpenIMServer.sdkws.MsgData + 48, // 5: OpenIMServer.msg.MsgDataToModifyByMQ.messages:type_name -> OpenIMServer.sdkws.MsgData + 23, // 6: OpenIMServer.msg.ClearConversationsMsgReq.deleteSyncOpt:type_name -> OpenIMServer.msg.DeleteSyncOpt + 23, // 7: OpenIMServer.msg.UserClearAllMsgReq.deleteSyncOpt:type_name -> OpenIMServer.msg.DeleteSyncOpt + 23, // 8: OpenIMServer.msg.DeleteMsgsReq.deleteSyncOpt:type_name -> OpenIMServer.msg.DeleteSyncOpt + 45, // 9: OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp.seqs:type_name -> OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp.SeqsEntry + 49, // 10: OpenIMServer.msg.GetActiveUserReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination + 50, // 11: OpenIMServer.msg.ActiveUser.user:type_name -> OpenIMServer.sdkws.UserInfo + 46, // 12: OpenIMServer.msg.GetActiveUserResp.dateCount:type_name -> OpenIMServer.msg.GetActiveUserResp.DateCountEntry + 40, // 13: OpenIMServer.msg.GetActiveUserResp.users:type_name -> OpenIMServer.msg.ActiveUser + 49, // 14: OpenIMServer.msg.GetActiveGroupReq.pagination:type_name -> OpenIMServer.sdkws.RequestPagination + 51, // 15: OpenIMServer.msg.ActiveGroup.group:type_name -> OpenIMServer.sdkws.GroupInfo + 47, // 16: OpenIMServer.msg.GetActiveGroupResp.dateCount:type_name -> OpenIMServer.msg.GetActiveGroupResp.DateCountEntry + 43, // 17: OpenIMServer.msg.GetActiveGroupResp.groups:type_name -> OpenIMServer.msg.ActiveGroup + 37, // 18: OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp.SeqsEntry.value:type_name -> OpenIMServer.msg.Seqs + 52, // 19: OpenIMServer.msg.msg.GetMaxSeq:input_type -> OpenIMServer.sdkws.GetMaxSeqReq + 34, // 20: OpenIMServer.msg.msg.GetConversationMaxSeq:input_type -> OpenIMServer.msg.GetConversationMaxSeqReq + 53, // 21: OpenIMServer.msg.msg.PullMessageBySeqs:input_type -> OpenIMServer.sdkws.PullMessageBySeqsReq + 6, // 22: OpenIMServer.msg.msg.SendMsg:input_type -> OpenIMServer.msg.SendMsgReq + 24, // 23: OpenIMServer.msg.msg.ClearConversationsMsg:input_type -> OpenIMServer.msg.ClearConversationsMsgReq + 26, // 24: OpenIMServer.msg.msg.UserClearAllMsg:input_type -> OpenIMServer.msg.UserClearAllMsgReq + 28, // 25: OpenIMServer.msg.msg.DeleteMsgs:input_type -> OpenIMServer.msg.DeleteMsgsReq + 32, // 26: OpenIMServer.msg.msg.DeleteMsgPhysicalBySeq:input_type -> OpenIMServer.msg.DeleteMsgPhysicalBySeqReq + 30, // 27: OpenIMServer.msg.msg.DeleteMsgPhysical:input_type -> OpenIMServer.msg.DeleteMsgPhysicalReq + 8, // 28: OpenIMServer.msg.msg.SetSendMsgStatus:input_type -> OpenIMServer.msg.SetSendMsgStatusReq + 10, // 29: OpenIMServer.msg.msg.GetSendMsgStatus:input_type -> OpenIMServer.msg.GetSendMsgStatusReq + 15, // 30: OpenIMServer.msg.msg.RevokeMsg:input_type -> OpenIMServer.msg.RevokeMsgReq + 17, // 31: OpenIMServer.msg.msg.MarkMsgsAsRead:input_type -> OpenIMServer.msg.MarkMsgsAsReadReq + 19, // 32: OpenIMServer.msg.msg.MarkConversationAsRead:input_type -> OpenIMServer.msg.MarkConversationAsReadReq + 21, // 33: OpenIMServer.msg.msg.SetConversationHasReadSeq:input_type -> OpenIMServer.msg.SetConversationHasReadSeqReq + 36, // 34: OpenIMServer.msg.msg.GetConversationsHasReadAndMaxSeq:input_type -> OpenIMServer.msg.GetConversationsHasReadAndMaxSeqReq + 39, // 35: OpenIMServer.msg.msg.GetActiveUser:input_type -> OpenIMServer.msg.GetActiveUserReq + 42, // 36: OpenIMServer.msg.msg.GetActiveGroup:input_type -> OpenIMServer.msg.GetActiveGroupReq + 54, // 37: OpenIMServer.msg.msg.GetMaxSeq:output_type -> OpenIMServer.sdkws.GetMaxSeqResp + 35, // 38: OpenIMServer.msg.msg.GetConversationMaxSeq:output_type -> OpenIMServer.msg.GetConversationMaxSeqResp + 55, // 39: OpenIMServer.msg.msg.PullMessageBySeqs:output_type -> OpenIMServer.sdkws.PullMessageBySeqsResp + 7, // 40: OpenIMServer.msg.msg.SendMsg:output_type -> OpenIMServer.msg.SendMsgResp + 25, // 41: OpenIMServer.msg.msg.ClearConversationsMsg:output_type -> OpenIMServer.msg.ClearConversationsMsgResp + 27, // 42: OpenIMServer.msg.msg.UserClearAllMsg:output_type -> OpenIMServer.msg.UserClearAllMsgResp + 29, // 43: OpenIMServer.msg.msg.DeleteMsgs:output_type -> OpenIMServer.msg.DeleteMsgsResp + 33, // 44: OpenIMServer.msg.msg.DeleteMsgPhysicalBySeq:output_type -> OpenIMServer.msg.DeleteMsgPhysicalBySeqResp + 31, // 45: OpenIMServer.msg.msg.DeleteMsgPhysical:output_type -> OpenIMServer.msg.DeleteMsgPhysicalResp + 9, // 46: OpenIMServer.msg.msg.SetSendMsgStatus:output_type -> OpenIMServer.msg.SetSendMsgStatusResp + 11, // 47: OpenIMServer.msg.msg.GetSendMsgStatus:output_type -> OpenIMServer.msg.GetSendMsgStatusResp + 16, // 48: OpenIMServer.msg.msg.RevokeMsg:output_type -> OpenIMServer.msg.RevokeMsgResp + 18, // 49: OpenIMServer.msg.msg.MarkMsgsAsRead:output_type -> OpenIMServer.msg.MarkMsgsAsReadResp + 20, // 50: OpenIMServer.msg.msg.MarkConversationAsRead:output_type -> OpenIMServer.msg.MarkConversationAsReadResp + 22, // 51: OpenIMServer.msg.msg.SetConversationHasReadSeq:output_type -> OpenIMServer.msg.SetConversationHasReadSeqResp + 38, // 52: OpenIMServer.msg.msg.GetConversationsHasReadAndMaxSeq:output_type -> OpenIMServer.msg.GetConversationsHasReadAndMaxSeqResp + 41, // 53: OpenIMServer.msg.msg.GetActiveUser:output_type -> OpenIMServer.msg.GetActiveUserResp + 44, // 54: OpenIMServer.msg.msg.GetActiveGroup:output_type -> OpenIMServer.msg.GetActiveGroupResp + 37, // [37:55] is the sub-list for method output_type + 19, // [19:37] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 19, // [19:19] is the sub-list for extension extendee + 0, // [0:19] is the sub-list for field type_name } func init() { file_msg_msg_proto_init() } @@ -3734,7 +3018,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ModifyMessageReactionExtensionsReq); i { + switch v := v.(*MsgDataToModifyByMQ); i { case 0: return &v.state case 1: @@ -3746,7 +3030,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetMessageReactionExtensionsReq); i { + switch v := v.(*DelMsgsReq); i { case 0: return &v.state case 1: @@ -3758,7 +3042,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetMessageReactionExtensionsResp); i { + switch v := v.(*DelMsgsResp); i { case 0: return &v.state case 1: @@ -3770,7 +3054,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMessagesReactionExtensionsReq); i { + switch v := v.(*RevokeMsgReq); i { case 0: return &v.state case 1: @@ -3782,7 +3066,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMessagesReactionExtensionsResp); i { + switch v := v.(*RevokeMsgResp); i { case 0: return &v.state case 1: @@ -3794,7 +3078,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SingleMessageExtensionResult); i { + switch v := v.(*MarkMsgsAsReadReq); i { case 0: return &v.state case 1: @@ -3806,7 +3090,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ModifyMessageReactionExtensionsResp); i { + switch v := v.(*MarkMsgsAsReadResp); i { case 0: return &v.state case 1: @@ -3818,7 +3102,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMessagesReactionExtensionsReq); i { + switch v := v.(*MarkConversationAsReadReq); i { case 0: return &v.state case 1: @@ -3830,7 +3114,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMessagesReactionExtensionsResp); i { + switch v := v.(*MarkConversationAsReadResp); i { case 0: return &v.state case 1: @@ -3842,7 +3126,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtendMsgResp); i { + switch v := v.(*SetConversationHasReadSeqReq); i { case 0: return &v.state case 1: @@ -3854,7 +3138,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtendMsg); i { + switch v := v.(*SetConversationHasReadSeqResp); i { case 0: return &v.state case 1: @@ -3866,7 +3150,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KeyValueResp); i { + switch v := v.(*DeleteSyncOpt); i { case 0: return &v.state case 1: @@ -3878,7 +3162,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MsgDataToModifyByMQ); i { + switch v := v.(*ClearConversationsMsgReq); i { case 0: return &v.state case 1: @@ -3890,7 +3174,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DelMsgsReq); i { + switch v := v.(*ClearConversationsMsgResp); i { case 0: return &v.state case 1: @@ -3902,7 +3186,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DelMsgsResp); i { + switch v := v.(*UserClearAllMsgReq); i { case 0: return &v.state case 1: @@ -3914,7 +3198,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RevokeMsgReq); i { + switch v := v.(*UserClearAllMsgResp); i { case 0: return &v.state case 1: @@ -3926,7 +3210,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RevokeMsgResp); i { + switch v := v.(*DeleteMsgsReq); i { case 0: return &v.state case 1: @@ -3938,7 +3222,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarkMsgsAsReadReq); i { + switch v := v.(*DeleteMsgsResp); i { case 0: return &v.state case 1: @@ -3950,7 +3234,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarkMsgsAsReadResp); i { + switch v := v.(*DeleteMsgPhysicalReq); i { case 0: return &v.state case 1: @@ -3962,7 +3246,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarkConversationAsReadReq); i { + switch v := v.(*DeleteMsgPhysicalResp); i { case 0: return &v.state case 1: @@ -3974,7 +3258,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarkConversationAsReadResp); i { + switch v := v.(*DeleteMsgPhysicalBySeqReq); i { case 0: return &v.state case 1: @@ -3986,7 +3270,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetConversationHasReadSeqReq); i { + switch v := v.(*DeleteMsgPhysicalBySeqResp); i { case 0: return &v.state case 1: @@ -3998,7 +3282,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetConversationHasReadSeqResp); i { + switch v := v.(*GetConversationMaxSeqReq); i { case 0: return &v.state case 1: @@ -4010,7 +3294,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteSyncOpt); i { + switch v := v.(*GetConversationMaxSeqResp); i { case 0: return &v.state case 1: @@ -4022,7 +3306,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClearConversationsMsgReq); i { + switch v := v.(*GetConversationsHasReadAndMaxSeqReq); i { case 0: return &v.state case 1: @@ -4034,7 +3318,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClearConversationsMsgResp); i { + switch v := v.(*Seqs); i { case 0: return &v.state case 1: @@ -4046,7 +3330,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserClearAllMsgReq); i { + switch v := v.(*GetConversationsHasReadAndMaxSeqResp); i { case 0: return &v.state case 1: @@ -4058,7 +3342,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserClearAllMsgResp); i { + switch v := v.(*GetActiveUserReq); i { case 0: return &v.state case 1: @@ -4070,7 +3354,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMsgsReq); i { + switch v := v.(*ActiveUser); i { case 0: return &v.state case 1: @@ -4082,7 +3366,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMsgsResp); i { + switch v := v.(*GetActiveUserResp); i { case 0: return &v.state case 1: @@ -4094,7 +3378,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMsgPhysicalReq); i { + switch v := v.(*GetActiveGroupReq); i { case 0: return &v.state case 1: @@ -4106,7 +3390,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMsgPhysicalResp); i { + switch v := v.(*ActiveGroup); i { case 0: return &v.state case 1: @@ -4118,91 +3402,7 @@ func file_msg_msg_proto_init() { } } file_msg_msg_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMsgPhysicalBySeqReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_msg_msg_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMsgPhysicalBySeqResp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_msg_msg_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetConversationMaxSeqReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_msg_msg_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetConversationMaxSeqResp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_msg_msg_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetConversationsHasReadAndMaxSeqReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_msg_msg_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Seqs); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_msg_msg_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetConversationsHasReadAndMaxSeqResp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_msg_msg_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMessagesReactionExtensionsReq_MessageReactionKey); i { + switch v := v.(*GetActiveGroupResp); i { case 0: return &v.state case 1: @@ -4220,7 +3420,7 @@ func file_msg_msg_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_msg_msg_proto_rawDesc, NumEnums: 0, - NumMessages: 57, + NumMessages: 48, NumExtensions: 0, NumServices: 1, }, @@ -4272,12 +3472,9 @@ type MsgClient interface { MarkMsgsAsRead(ctx context.Context, in *MarkMsgsAsReadReq, opts ...grpc.CallOption) (*MarkMsgsAsReadResp, error) MarkConversationAsRead(ctx context.Context, in *MarkConversationAsReadReq, opts ...grpc.CallOption) (*MarkConversationAsReadResp, error) SetConversationHasReadSeq(ctx context.Context, in *SetConversationHasReadSeqReq, opts ...grpc.CallOption) (*SetConversationHasReadSeqResp, error) - // 修改消息 - SetMessageReactionExtensions(ctx context.Context, in *SetMessageReactionExtensionsReq, opts ...grpc.CallOption) (*SetMessageReactionExtensionsResp, error) - GetMessagesReactionExtensions(ctx context.Context, in *GetMessagesReactionExtensionsReq, opts ...grpc.CallOption) (*GetMessagesReactionExtensionsResp, error) - AddMessageReactionExtensions(ctx context.Context, in *ModifyMessageReactionExtensionsReq, opts ...grpc.CallOption) (*ModifyMessageReactionExtensionsResp, error) - DeleteMessageReactionExtensions(ctx context.Context, in *DeleteMessagesReactionExtensionsReq, opts ...grpc.CallOption) (*DeleteMessagesReactionExtensionsResp, error) GetConversationsHasReadAndMaxSeq(ctx context.Context, in *GetConversationsHasReadAndMaxSeqReq, opts ...grpc.CallOption) (*GetConversationsHasReadAndMaxSeqResp, error) + GetActiveUser(ctx context.Context, in *GetActiveUserReq, opts ...grpc.CallOption) (*GetActiveUserResp, error) + GetActiveGroup(ctx context.Context, in *GetActiveGroupReq, opts ...grpc.CallOption) (*GetActiveGroupResp, error) } type msgClient struct { @@ -4423,45 +3620,27 @@ func (c *msgClient) SetConversationHasReadSeq(ctx context.Context, in *SetConver return out, nil } -func (c *msgClient) SetMessageReactionExtensions(ctx context.Context, in *SetMessageReactionExtensionsReq, opts ...grpc.CallOption) (*SetMessageReactionExtensionsResp, error) { - out := new(SetMessageReactionExtensionsResp) - err := c.cc.Invoke(ctx, "/OpenIMServer.msg.msg/SetMessageReactionExtensions", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) GetMessagesReactionExtensions(ctx context.Context, in *GetMessagesReactionExtensionsReq, opts ...grpc.CallOption) (*GetMessagesReactionExtensionsResp, error) { - out := new(GetMessagesReactionExtensionsResp) - err := c.cc.Invoke(ctx, "/OpenIMServer.msg.msg/GetMessagesReactionExtensions", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) AddMessageReactionExtensions(ctx context.Context, in *ModifyMessageReactionExtensionsReq, opts ...grpc.CallOption) (*ModifyMessageReactionExtensionsResp, error) { - out := new(ModifyMessageReactionExtensionsResp) - err := c.cc.Invoke(ctx, "/OpenIMServer.msg.msg/AddMessageReactionExtensions", in, out, opts...) +func (c *msgClient) GetConversationsHasReadAndMaxSeq(ctx context.Context, in *GetConversationsHasReadAndMaxSeqReq, opts ...grpc.CallOption) (*GetConversationsHasReadAndMaxSeqResp, error) { + out := new(GetConversationsHasReadAndMaxSeqResp) + err := c.cc.Invoke(ctx, "/OpenIMServer.msg.msg/GetConversationsHasReadAndMaxSeq", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *msgClient) DeleteMessageReactionExtensions(ctx context.Context, in *DeleteMessagesReactionExtensionsReq, opts ...grpc.CallOption) (*DeleteMessagesReactionExtensionsResp, error) { - out := new(DeleteMessagesReactionExtensionsResp) - err := c.cc.Invoke(ctx, "/OpenIMServer.msg.msg/DeleteMessageReactionExtensions", in, out, opts...) +func (c *msgClient) GetActiveUser(ctx context.Context, in *GetActiveUserReq, opts ...grpc.CallOption) (*GetActiveUserResp, error) { + out := new(GetActiveUserResp) + err := c.cc.Invoke(ctx, "/OpenIMServer.msg.msg/GetActiveUser", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *msgClient) GetConversationsHasReadAndMaxSeq(ctx context.Context, in *GetConversationsHasReadAndMaxSeqReq, opts ...grpc.CallOption) (*GetConversationsHasReadAndMaxSeqResp, error) { - out := new(GetConversationsHasReadAndMaxSeqResp) - err := c.cc.Invoke(ctx, "/OpenIMServer.msg.msg/GetConversationsHasReadAndMaxSeq", in, out, opts...) +func (c *msgClient) GetActiveGroup(ctx context.Context, in *GetActiveGroupReq, opts ...grpc.CallOption) (*GetActiveGroupResp, error) { + out := new(GetActiveGroupResp) + err := c.cc.Invoke(ctx, "/OpenIMServer.msg.msg/GetActiveGroup", in, out, opts...) if err != nil { return nil, err } @@ -4496,12 +3675,9 @@ type MsgServer interface { MarkMsgsAsRead(context.Context, *MarkMsgsAsReadReq) (*MarkMsgsAsReadResp, error) MarkConversationAsRead(context.Context, *MarkConversationAsReadReq) (*MarkConversationAsReadResp, error) SetConversationHasReadSeq(context.Context, *SetConversationHasReadSeqReq) (*SetConversationHasReadSeqResp, error) - // 修改消息 - SetMessageReactionExtensions(context.Context, *SetMessageReactionExtensionsReq) (*SetMessageReactionExtensionsResp, error) - GetMessagesReactionExtensions(context.Context, *GetMessagesReactionExtensionsReq) (*GetMessagesReactionExtensionsResp, error) - AddMessageReactionExtensions(context.Context, *ModifyMessageReactionExtensionsReq) (*ModifyMessageReactionExtensionsResp, error) - DeleteMessageReactionExtensions(context.Context, *DeleteMessagesReactionExtensionsReq) (*DeleteMessagesReactionExtensionsResp, error) GetConversationsHasReadAndMaxSeq(context.Context, *GetConversationsHasReadAndMaxSeqReq) (*GetConversationsHasReadAndMaxSeqResp, error) + GetActiveUser(context.Context, *GetActiveUserReq) (*GetActiveUserResp, error) + GetActiveGroup(context.Context, *GetActiveGroupReq) (*GetActiveGroupResp, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -4553,21 +3729,15 @@ func (*UnimplementedMsgServer) MarkConversationAsRead(context.Context, *MarkConv func (*UnimplementedMsgServer) SetConversationHasReadSeq(context.Context, *SetConversationHasReadSeqReq) (*SetConversationHasReadSeqResp, error) { return nil, status.Errorf(codes.Unimplemented, "method SetConversationHasReadSeq not implemented") } -func (*UnimplementedMsgServer) SetMessageReactionExtensions(context.Context, *SetMessageReactionExtensionsReq) (*SetMessageReactionExtensionsResp, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetMessageReactionExtensions not implemented") -} -func (*UnimplementedMsgServer) GetMessagesReactionExtensions(context.Context, *GetMessagesReactionExtensionsReq) (*GetMessagesReactionExtensionsResp, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetMessagesReactionExtensions not implemented") -} -func (*UnimplementedMsgServer) AddMessageReactionExtensions(context.Context, *ModifyMessageReactionExtensionsReq) (*ModifyMessageReactionExtensionsResp, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddMessageReactionExtensions not implemented") -} -func (*UnimplementedMsgServer) DeleteMessageReactionExtensions(context.Context, *DeleteMessagesReactionExtensionsReq) (*DeleteMessagesReactionExtensionsResp, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteMessageReactionExtensions not implemented") -} func (*UnimplementedMsgServer) GetConversationsHasReadAndMaxSeq(context.Context, *GetConversationsHasReadAndMaxSeqReq) (*GetConversationsHasReadAndMaxSeqResp, error) { return nil, status.Errorf(codes.Unimplemented, "method GetConversationsHasReadAndMaxSeq not implemented") } +func (*UnimplementedMsgServer) GetActiveUser(context.Context, *GetActiveUserReq) (*GetActiveUserResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetActiveUser not implemented") +} +func (*UnimplementedMsgServer) GetActiveGroup(context.Context, *GetActiveGroupReq) (*GetActiveGroupResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetActiveGroup not implemented") +} func RegisterMsgServer(s *grpc.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -4843,92 +4013,56 @@ func _Msg_SetConversationHasReadSeq_Handler(srv interface{}, ctx context.Context return interceptor(ctx, in, info, handler) } -func _Msg_SetMessageReactionExtensions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetMessageReactionExtensionsReq) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).SetMessageReactionExtensions(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/OpenIMServer.msg.msg/SetMessageReactionExtensions", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).SetMessageReactionExtensions(ctx, req.(*SetMessageReactionExtensionsReq)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_GetMessagesReactionExtensions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetMessagesReactionExtensionsReq) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).GetMessagesReactionExtensions(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/OpenIMServer.msg.msg/GetMessagesReactionExtensions", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).GetMessagesReactionExtensions(ctx, req.(*GetMessagesReactionExtensionsReq)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_AddMessageReactionExtensions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ModifyMessageReactionExtensionsReq) +func _Msg_GetConversationsHasReadAndMaxSeq_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetConversationsHasReadAndMaxSeqReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(MsgServer).AddMessageReactionExtensions(ctx, in) + return srv.(MsgServer).GetConversationsHasReadAndMaxSeq(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/OpenIMServer.msg.msg/AddMessageReactionExtensions", + FullMethod: "/OpenIMServer.msg.msg/GetConversationsHasReadAndMaxSeq", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).AddMessageReactionExtensions(ctx, req.(*ModifyMessageReactionExtensionsReq)) + return srv.(MsgServer).GetConversationsHasReadAndMaxSeq(ctx, req.(*GetConversationsHasReadAndMaxSeqReq)) } return interceptor(ctx, in, info, handler) } -func _Msg_DeleteMessageReactionExtensions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteMessagesReactionExtensionsReq) +func _Msg_GetActiveUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetActiveUserReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(MsgServer).DeleteMessageReactionExtensions(ctx, in) + return srv.(MsgServer).GetActiveUser(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/OpenIMServer.msg.msg/DeleteMessageReactionExtensions", + FullMethod: "/OpenIMServer.msg.msg/GetActiveUser", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).DeleteMessageReactionExtensions(ctx, req.(*DeleteMessagesReactionExtensionsReq)) + return srv.(MsgServer).GetActiveUser(ctx, req.(*GetActiveUserReq)) } return interceptor(ctx, in, info, handler) } -func _Msg_GetConversationsHasReadAndMaxSeq_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetConversationsHasReadAndMaxSeqReq) +func _Msg_GetActiveGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetActiveGroupReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(MsgServer).GetConversationsHasReadAndMaxSeq(ctx, in) + return srv.(MsgServer).GetActiveGroup(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/OpenIMServer.msg.msg/GetConversationsHasReadAndMaxSeq", + FullMethod: "/OpenIMServer.msg.msg/GetActiveGroup", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).GetConversationsHasReadAndMaxSeq(ctx, req.(*GetConversationsHasReadAndMaxSeqReq)) + return srv.(MsgServer).GetActiveGroup(ctx, req.(*GetActiveGroupReq)) } return interceptor(ctx, in, info, handler) } @@ -4998,24 +4132,16 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ Handler: _Msg_SetConversationHasReadSeq_Handler, }, { - MethodName: "SetMessageReactionExtensions", - Handler: _Msg_SetMessageReactionExtensions_Handler, - }, - { - MethodName: "GetMessagesReactionExtensions", - Handler: _Msg_GetMessagesReactionExtensions_Handler, - }, - { - MethodName: "AddMessageReactionExtensions", - Handler: _Msg_AddMessageReactionExtensions_Handler, + MethodName: "GetConversationsHasReadAndMaxSeq", + Handler: _Msg_GetConversationsHasReadAndMaxSeq_Handler, }, { - MethodName: "DeleteMessageReactionExtensions", - Handler: _Msg_DeleteMessageReactionExtensions_Handler, + MethodName: "GetActiveUser", + Handler: _Msg_GetActiveUser_Handler, }, { - MethodName: "GetConversationsHasReadAndMaxSeq", - Handler: _Msg_GetConversationsHasReadAndMaxSeq_Handler, + MethodName: "GetActiveGroup", + Handler: _Msg_GetActiveGroup_Handler, }, }, Streams: []grpc.StreamDesc{}, diff --git a/pkg/proto/msg/msg.proto b/pkg/proto/msg/msg.proto index 9fa093edf..d67195d44 100644 --- a/pkg/proto/msg/msg.proto +++ b/pkg/proto/msg/msg.proto @@ -15,7 +15,7 @@ syntax = "proto3"; package OpenIMServer.msg; import "sdkws/sdkws.proto"; -import "wrapperspb/wrapperspb.proto"; +// import "wrapperspb/wrapperspb.proto"; option go_package = "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"; message MsgDataToMQ{ @@ -74,93 +74,6 @@ message GetSendMsgStatusResp{ } -message ModifyMessageReactionExtensionsReq { - string conversationID = 1; - int32 sessionType = 2; - map reactionExtensions = 3; - string clientMsgID = 4; - OpenIMServer.protobuf.StringValue ex = 5; - OpenIMServer.protobuf.StringValue attachedInfo = 6; - bool isReact = 7; - bool isExternalExtensions = 8; - int64 msgFirstModifyTime = 9; -} -message SetMessageReactionExtensionsReq { - string conversationID = 1; - int32 sessionType = 2; - map reactionExtensions = 3; - string clientMsgID = 4; - OpenIMServer.protobuf.StringValue ex = 5; - OpenIMServer.protobuf.StringValue attachedInfo = 6; - bool isReact = 7; - bool isExternalExtensions = 8; - int64 msgFirstModifyTime = 9; -} -message SetMessageReactionExtensionsResp { - string clientMsgID = 1; - int64 msgFirstModifyTime = 2; - bool isReact = 3; - repeated KeyValueResp result = 4; -} - -message GetMessagesReactionExtensionsReq { - string conversationID = 1; - int32 sessionType = 2; - message MessageReactionKey { - string clientMsgID = 1; - int64 msgFirstModifyTime = 2; - } - repeated MessageReactionKey messageReactionKeys = 3; - repeated string TypeKeys = 4; -} -message GetMessagesReactionExtensionsResp{ - repeated SingleMessageExtensionResult singleMessageResult = 1; - -} -message SingleMessageExtensionResult { - map reactionExtensions = 1; - string clientMsgID = 2; -} - - -message ModifyMessageReactionExtensionsResp { - repeated ExtendMsgResp successList = 1; - repeated ExtendMsgResp failedList = 2; -} - -message DeleteMessagesReactionExtensionsReq { - string operationID = 1; - string opUserID = 2; - string conversationID = 3; - int32 sessionType = 4; - string clientMsgID = 5; - bool isExternalExtensions = 6; - int64 msgFirstModifyTime = 7; - repeated sdkws.KeyValue reactionExtensions = 8; -} - -message DeleteMessagesReactionExtensionsResp { - repeated KeyValueResp result = 1; -} - -message ExtendMsgResp { - ExtendMsg extendMsg = 1; -} - -message ExtendMsg { - map reactionExtensions = 1; - string clientMsgID = 2; - int64 msgFirstModifyTime = 3; - string attachedInfo = 4; - string ex = 5; -} - -message KeyValueResp { - sdkws.KeyValue keyValue = 1; - int32 errCode = 2; - string errMsg = 3; -} - message MsgDataToModifyByMQ{ repeated sdkws.MsgData messages = 1; string conversationID = 2; @@ -255,7 +168,7 @@ message DeleteMsgPhysicalBySeqReq { } message DeleteMsgPhysicalBySeqResp { - + } message GetConversationMaxSeqReq { @@ -280,6 +193,45 @@ message GetConversationsHasReadAndMaxSeqResp { map seqs = 1; } +message GetActiveUserReq { + int64 start = 1; + int64 end = 2; + bool ase = 3; + bool group = 4; + sdkws.RequestPagination pagination = 5; +} + +message ActiveUser { + sdkws.UserInfo user = 1; + int64 count = 2; +} + +message GetActiveUserResp { + int64 msgCount = 1; + int64 userCount = 2; + map dateCount = 3; + repeated ActiveUser users = 4; +} + +message GetActiveGroupReq { + int64 start = 1; + int64 end = 2; + bool ase = 3; + sdkws.RequestPagination pagination = 4; +} + +message ActiveGroup { + sdkws.GroupInfo group = 1; + int64 count = 2; +} + +message GetActiveGroupResp { + int64 msgCount = 1; + int64 groupCount = 2; + map dateCount = 3; + repeated ActiveGroup groups = 4; +} + service msg { //获取最小最大seq(包括用户的,以及指定群组的) rpc GetMaxSeq(sdkws.GetMaxSeqReq) returns(sdkws.GetMaxSeqResp); @@ -309,11 +261,9 @@ service msg { rpc MarkMsgsAsRead(MarkMsgsAsReadReq) returns(MarkMsgsAsReadResp); rpc MarkConversationAsRead(MarkConversationAsReadReq) returns(MarkConversationAsReadResp); rpc SetConversationHasReadSeq(SetConversationHasReadSeqReq) returns(SetConversationHasReadSeqResp); - // 修改消息 - rpc SetMessageReactionExtensions(SetMessageReactionExtensionsReq) returns(SetMessageReactionExtensionsResp); - rpc GetMessagesReactionExtensions(GetMessagesReactionExtensionsReq) returns(GetMessagesReactionExtensionsResp); - rpc AddMessageReactionExtensions(ModifyMessageReactionExtensionsReq) returns(ModifyMessageReactionExtensionsResp); - rpc DeleteMessageReactionExtensions(DeleteMessagesReactionExtensionsReq) returns(DeleteMessagesReactionExtensionsResp); - + rpc GetConversationsHasReadAndMaxSeq(GetConversationsHasReadAndMaxSeqReq) returns(GetConversationsHasReadAndMaxSeqResp); + + rpc GetActiveUser(GetActiveUserReq) returns(GetActiveUserResp); + rpc GetActiveGroup(GetActiveGroupReq) returns(GetActiveGroupResp); } diff --git a/pkg/proto/msggateway/msggateway.pb.go b/pkg/proto/msggateway/msggateway.pb.go index 51f186c8c..6d3aa576a 100644 --- a/pkg/proto/msggateway/msggateway.pb.go +++ b/pkg/proto/msggateway/msggateway.pb.go @@ -459,6 +459,132 @@ func (x *GetUsersOnlineStatusResp) GetFailedResult() []*GetUsersOnlineStatusResp return nil } +type SingleDetail struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status"` + SinglePlatformToken []*SinglePlatformToken `protobuf:"bytes,3,rep,name=singlePlatformToken,proto3" json:"singlePlatformToken"` +} + +func (x *SingleDetail) Reset() { + *x = SingleDetail{} + if protoimpl.UnsafeEnabled { + mi := &file_msggateway_msggateway_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SingleDetail) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SingleDetail) ProtoMessage() {} + +func (x *SingleDetail) ProtoReflect() protoreflect.Message { + mi := &file_msggateway_msggateway_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SingleDetail.ProtoReflect.Descriptor instead. +func (*SingleDetail) Descriptor() ([]byte, []int) { + return file_msggateway_msggateway_proto_rawDescGZIP(), []int{8} +} + +func (x *SingleDetail) GetUserID() string { + if x != nil { + return x.UserID + } + return "" +} + +func (x *SingleDetail) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *SingleDetail) GetSinglePlatformToken() []*SinglePlatformToken { + if x != nil { + return x.SinglePlatformToken + } + return nil +} + +type SinglePlatformToken struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Platform string `protobuf:"bytes,1,opt,name=platform,proto3" json:"platform"` + Total int32 `protobuf:"varint,2,opt,name=total,proto3" json:"total"` + Token []string `protobuf:"bytes,3,rep,name=token,proto3" json:"token"` +} + +func (x *SinglePlatformToken) Reset() { + *x = SinglePlatformToken{} + if protoimpl.UnsafeEnabled { + mi := &file_msggateway_msggateway_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SinglePlatformToken) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SinglePlatformToken) ProtoMessage() {} + +func (x *SinglePlatformToken) ProtoReflect() protoreflect.Message { + mi := &file_msggateway_msggateway_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SinglePlatformToken.ProtoReflect.Descriptor instead. +func (*SinglePlatformToken) Descriptor() ([]byte, []int) { + return file_msggateway_msggateway_proto_rawDescGZIP(), []int{9} +} + +func (x *SinglePlatformToken) GetPlatform() string { + if x != nil { + return x.Platform + } + return "" +} + +func (x *SinglePlatformToken) GetTotal() int32 { + if x != nil { + return x.Total + } + return 0 +} + +func (x *SinglePlatformToken) GetToken() []string { + if x != nil { + return x.Token + } + return nil +} + type KickUserOfflineReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -471,7 +597,7 @@ type KickUserOfflineReq struct { func (x *KickUserOfflineReq) Reset() { *x = KickUserOfflineReq{} if protoimpl.UnsafeEnabled { - mi := &file_msggateway_msggateway_proto_msgTypes[8] + mi := &file_msggateway_msggateway_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -484,7 +610,7 @@ func (x *KickUserOfflineReq) String() string { func (*KickUserOfflineReq) ProtoMessage() {} func (x *KickUserOfflineReq) ProtoReflect() protoreflect.Message { - mi := &file_msggateway_msggateway_proto_msgTypes[8] + mi := &file_msggateway_msggateway_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -497,7 +623,7 @@ func (x *KickUserOfflineReq) ProtoReflect() protoreflect.Message { // Deprecated: Use KickUserOfflineReq.ProtoReflect.Descriptor instead. func (*KickUserOfflineReq) Descriptor() ([]byte, []int) { - return file_msggateway_msggateway_proto_rawDescGZIP(), []int{8} + return file_msggateway_msggateway_proto_rawDescGZIP(), []int{10} } func (x *KickUserOfflineReq) GetPlatformID() int32 { @@ -523,7 +649,7 @@ type KickUserOfflineResp struct { func (x *KickUserOfflineResp) Reset() { *x = KickUserOfflineResp{} if protoimpl.UnsafeEnabled { - mi := &file_msggateway_msggateway_proto_msgTypes[9] + mi := &file_msggateway_msggateway_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -536,7 +662,7 @@ func (x *KickUserOfflineResp) String() string { func (*KickUserOfflineResp) ProtoMessage() {} func (x *KickUserOfflineResp) ProtoReflect() protoreflect.Message { - mi := &file_msggateway_msggateway_proto_msgTypes[9] + mi := &file_msggateway_msggateway_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -549,7 +675,7 @@ func (x *KickUserOfflineResp) ProtoReflect() protoreflect.Message { // Deprecated: Use KickUserOfflineResp.ProtoReflect.Descriptor instead. func (*KickUserOfflineResp) Descriptor() ([]byte, []int) { - return file_msggateway_msggateway_proto_rawDescGZIP(), []int{9} + return file_msggateway_msggateway_proto_rawDescGZIP(), []int{11} } type MultiTerminalLoginCheckReq struct { @@ -566,7 +692,7 @@ type MultiTerminalLoginCheckReq struct { func (x *MultiTerminalLoginCheckReq) Reset() { *x = MultiTerminalLoginCheckReq{} if protoimpl.UnsafeEnabled { - mi := &file_msggateway_msggateway_proto_msgTypes[10] + mi := &file_msggateway_msggateway_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -579,7 +705,7 @@ func (x *MultiTerminalLoginCheckReq) String() string { func (*MultiTerminalLoginCheckReq) ProtoMessage() {} func (x *MultiTerminalLoginCheckReq) ProtoReflect() protoreflect.Message { - mi := &file_msggateway_msggateway_proto_msgTypes[10] + mi := &file_msggateway_msggateway_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -592,7 +718,7 @@ func (x *MultiTerminalLoginCheckReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MultiTerminalLoginCheckReq.ProtoReflect.Descriptor instead. func (*MultiTerminalLoginCheckReq) Descriptor() ([]byte, []int) { - return file_msggateway_msggateway_proto_rawDescGZIP(), []int{10} + return file_msggateway_msggateway_proto_rawDescGZIP(), []int{12} } func (x *MultiTerminalLoginCheckReq) GetUserID() string { @@ -632,7 +758,7 @@ type MultiTerminalLoginCheckResp struct { func (x *MultiTerminalLoginCheckResp) Reset() { *x = MultiTerminalLoginCheckResp{} if protoimpl.UnsafeEnabled { - mi := &file_msggateway_msggateway_proto_msgTypes[11] + mi := &file_msggateway_msggateway_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -645,7 +771,7 @@ func (x *MultiTerminalLoginCheckResp) String() string { func (*MultiTerminalLoginCheckResp) ProtoMessage() {} func (x *MultiTerminalLoginCheckResp) ProtoReflect() protoreflect.Message { - mi := &file_msggateway_msggateway_proto_msgTypes[11] + mi := &file_msggateway_msggateway_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -658,7 +784,7 @@ func (x *MultiTerminalLoginCheckResp) ProtoReflect() protoreflect.Message { // Deprecated: Use MultiTerminalLoginCheckResp.ProtoReflect.Descriptor instead. func (*MultiTerminalLoginCheckResp) Descriptor() ([]byte, []int) { - return file_msggateway_msggateway_proto_rawDescGZIP(), []int{11} + return file_msggateway_msggateway_proto_rawDescGZIP(), []int{13} } type GetUsersOnlineStatusResp_SuccessDetail struct { @@ -670,12 +796,13 @@ type GetUsersOnlineStatusResp_SuccessDetail struct { Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status"` ConnID string `protobuf:"bytes,3,opt,name=connID,proto3" json:"connID"` IsBackground bool `protobuf:"varint,4,opt,name=isBackground,proto3" json:"isBackground"` + Token string `protobuf:"bytes,5,opt,name=token,proto3" json:"token"` } func (x *GetUsersOnlineStatusResp_SuccessDetail) Reset() { *x = GetUsersOnlineStatusResp_SuccessDetail{} if protoimpl.UnsafeEnabled { - mi := &file_msggateway_msggateway_proto_msgTypes[12] + mi := &file_msggateway_msggateway_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -688,7 +815,7 @@ func (x *GetUsersOnlineStatusResp_SuccessDetail) String() string { func (*GetUsersOnlineStatusResp_SuccessDetail) ProtoMessage() {} func (x *GetUsersOnlineStatusResp_SuccessDetail) ProtoReflect() protoreflect.Message { - mi := &file_msggateway_msggateway_proto_msgTypes[12] + mi := &file_msggateway_msggateway_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -732,6 +859,13 @@ func (x *GetUsersOnlineStatusResp_SuccessDetail) GetIsBackground() bool { return false } +func (x *GetUsersOnlineStatusResp_SuccessDetail) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + type GetUsersOnlineStatusResp_FailedDetail struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -743,7 +877,7 @@ type GetUsersOnlineStatusResp_FailedDetail struct { func (x *GetUsersOnlineStatusResp_FailedDetail) Reset() { *x = GetUsersOnlineStatusResp_FailedDetail{} if protoimpl.UnsafeEnabled { - mi := &file_msggateway_msggateway_proto_msgTypes[13] + mi := &file_msggateway_msggateway_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -756,7 +890,7 @@ func (x *GetUsersOnlineStatusResp_FailedDetail) String() string { func (*GetUsersOnlineStatusResp_FailedDetail) ProtoMessage() {} func (x *GetUsersOnlineStatusResp_FailedDetail) ProtoReflect() protoreflect.Message { - mi := &file_msggateway_msggateway_proto_msgTypes[13] + mi := &file_msggateway_msggateway_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -792,7 +926,7 @@ type GetUsersOnlineStatusResp_SuccessResult struct { func (x *GetUsersOnlineStatusResp_SuccessResult) Reset() { *x = GetUsersOnlineStatusResp_SuccessResult{} if protoimpl.UnsafeEnabled { - mi := &file_msggateway_msggateway_proto_msgTypes[14] + mi := &file_msggateway_msggateway_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -805,7 +939,7 @@ func (x *GetUsersOnlineStatusResp_SuccessResult) String() string { func (*GetUsersOnlineStatusResp_SuccessResult) ProtoMessage() {} func (x *GetUsersOnlineStatusResp_SuccessResult) ProtoReflect() protoreflect.Message { - mi := &file_msggateway_msggateway_proto_msgTypes[14] + mi := &file_msggateway_msggateway_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -898,7 +1032,7 @@ var file_msggateway_msggateway_proto_rawDesc = []byte{ 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x73, 0x22, - 0xc5, 0x04, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x4f, 0x6e, 0x6c, 0x69, + 0xdc, 0x04, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x65, 0x0a, 0x0d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, @@ -912,99 +1046,116 @@ var file_msggateway_msggateway_proto_rawDesc = []byte{ 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x7f, 0x0a, 0x0d, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x6f, 0x6e, 0x6e, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, - 0x6e, 0x6e, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, - 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x42, 0x61, - 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x1a, 0x26, 0x0a, 0x0c, 0x46, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, - 0x1a, 0xb4, 0x01, 0x0a, 0x0d, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x73, 0x0a, 0x14, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x95, 0x01, 0x0a, 0x0d, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, + 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, + 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, + 0x06, 0x63, 0x6f, 0x6e, 0x6e, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, + 0x6f, 0x6e, 0x6e, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x42, + 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, + 0x26, 0x0a, 0x0c, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, + 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x1a, 0xb4, 0x01, 0x0a, 0x0d, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, + 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x44, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x73, 0x0a, 0x14, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x53, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x14, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x9e, + 0x01, 0x0a, 0x0c, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, + 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x5e, 0x0a, 0x13, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x50, 0x6c, 0x61, + 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x13, 0x73, 0x69, 0x6e, 0x67, + 0x6c, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, + 0x5d, 0x0a, 0x13, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, + 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, + 0x72, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x5c, + 0x0a, 0x12, 0x4b, 0x69, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, + 0x65, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, + 0x72, 0x6d, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x0e, 0x6b, 0x69, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, + 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6b, 0x69, + 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x15, 0x0a, 0x13, + 0x4b, 0x69, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x22, 0x8c, 0x01, 0x0a, 0x1a, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, + 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x44, 0x22, 0x1d, 0x0a, 0x1b, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x6c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, + 0x70, 0x32, 0xf1, 0x05, 0x0a, 0x0a, 0x6d, 0x73, 0x67, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x12, 0x66, 0x0a, 0x0d, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x73, + 0x67, 0x12, 0x29, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4f, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x2a, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, + 0x68, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x7b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x55, + 0x73, 0x65, 0x72, 0x73, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x30, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x2e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x52, 0x14, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, - 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x5c, 0x0a, 0x12, 0x4b, 0x69, 0x63, 0x6b, 0x55, - 0x73, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, - 0x0a, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0a, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x44, 0x12, 0x26, 0x0a, - 0x0e, 0x6b, 0x69, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6b, 0x69, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x49, - 0x44, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x15, 0x0a, 0x13, 0x4b, 0x69, 0x63, 0x6b, 0x55, 0x73, 0x65, - 0x72, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, 0x8c, 0x01, 0x0a, - 0x1a, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x4c, 0x6f, - 0x67, 0x69, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x75, - 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x49, - 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, - 0x6d, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, 0x1d, 0x0a, 0x1b, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x4c, 0x6f, 0x67, 0x69, - 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x32, 0xf1, 0x05, 0x0a, 0x0a, 0x6d, - 0x73, 0x67, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x66, 0x0a, 0x0d, 0x4f, 0x6e, 0x6c, - 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x73, 0x67, 0x12, 0x29, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, - 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x2a, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x7b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x4f, 0x6e, 0x6c, - 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x65, 0x71, 0x1a, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x73, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x7e, 0x0a, 0x15, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x50, 0x75, 0x73, 0x68, 0x4f, 0x6e, 0x65, 0x4d, 0x73, 0x67, 0x12, 0x31, + 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, + 0x67, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x50, 0x75, 0x73, 0x68, 0x4f, 0x6e, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, + 0x71, 0x1a, 0x32, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4f, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x75, 0x73, 0x68, 0x4f, 0x6e, 0x65, 0x4d, 0x73, + 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x88, 0x01, 0x0a, 0x1f, 0x53, 0x75, 0x70, 0x65, 0x72, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, + 0x75, 0x73, 0x68, 0x4f, 0x6e, 0x65, 0x4d, 0x73, 0x67, 0x12, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x4f, 0x6e, 0x6c, 0x69, - 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x31, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x4f, 0x6e, - 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x7e, - 0x0a, 0x15, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x75, 0x73, - 0x68, 0x4f, 0x6e, 0x65, 0x4d, 0x73, 0x67, 0x12, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x75, 0x73, - 0x68, 0x4f, 0x6e, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x32, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x50, 0x75, 0x73, 0x68, 0x4f, 0x6e, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x88, - 0x01, 0x0a, 0x1f, 0x53, 0x75, 0x70, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4f, 0x6e, 0x6c, - 0x69, 0x6e, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x75, 0x73, 0x68, 0x4f, 0x6e, 0x65, 0x4d, - 0x73, 0x67, 0x12, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4f, 0x6e, 0x6c, - 0x69, 0x6e, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x75, 0x73, 0x68, 0x4f, 0x6e, 0x65, 0x4d, - 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x32, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x75, 0x73, 0x68, 0x4f, - 0x6e, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x6c, 0x0a, 0x0f, 0x4b, 0x69, 0x63, - 0x6b, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x2b, 0x2e, 0x4f, + 0x77, 0x61, 0x79, 0x2e, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, + 0x75, 0x73, 0x68, 0x4f, 0x6e, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x32, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4b, 0x69, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x4f, - 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x2c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x4b, 0x69, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x6c, - 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x84, 0x01, 0x0a, 0x17, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x12, 0x33, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x75, - 0x6c, 0x74, 0x69, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x34, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, - 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, - 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x42, 0x3a, - 0x5a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x70, 0x65, - 0x6e, 0x49, 0x4d, 0x53, 0x44, 0x4b, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x2d, 0x49, 0x4d, 0x2d, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x42, 0x61, 0x74, + 0x63, 0x68, 0x50, 0x75, 0x73, 0x68, 0x4f, 0x6e, 0x65, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x6c, 0x0a, 0x0f, 0x4b, 0x69, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x6c, + 0x69, 0x6e, 0x65, 0x12, 0x2b, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4b, 0x69, + 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, + 0x1a, 0x2c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4b, 0x69, 0x63, 0x6b, 0x55, + 0x73, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x84, + 0x01, 0x0a, 0x17, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, + 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x33, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x6c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x1a, + 0x34, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x6d, + 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x52, 0x65, 0x73, 0x70, 0x42, 0x3a, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x44, 0x4b, 0x2f, 0x4f, 0x70, + 0x65, 0x6e, 0x2d, 0x49, 0x4d, 0x2d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x6b, 0x67, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6d, 0x73, 0x67, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1019,7 +1170,7 @@ func file_msggateway_msggateway_proto_rawDescGZIP() []byte { return file_msggateway_msggateway_proto_rawDescData } -var file_msggateway_msggateway_proto_msgTypes = make([]protoimpl.MessageInfo, 15) +var file_msggateway_msggateway_proto_msgTypes = make([]protoimpl.MessageInfo, 17) var file_msggateway_msggateway_proto_goTypes = []interface{}{ (*OnlinePushMsgReq)(nil), // 0: OpenIMServer.msggateway.OnlinePushMsgReq (*OnlinePushMsgResp)(nil), // 1: OpenIMServer.msggateway.OnlinePushMsgResp @@ -1029,41 +1180,44 @@ var file_msggateway_msggateway_proto_goTypes = []interface{}{ (*SingleMsgToUserPlatform)(nil), // 5: OpenIMServer.msggateway.SingleMsgToUserPlatform (*GetUsersOnlineStatusReq)(nil), // 6: OpenIMServer.msggateway.GetUsersOnlineStatusReq (*GetUsersOnlineStatusResp)(nil), // 7: OpenIMServer.msggateway.GetUsersOnlineStatusResp - (*KickUserOfflineReq)(nil), // 8: OpenIMServer.msggateway.KickUserOfflineReq - (*KickUserOfflineResp)(nil), // 9: OpenIMServer.msggateway.KickUserOfflineResp - (*MultiTerminalLoginCheckReq)(nil), // 10: OpenIMServer.msggateway.MultiTerminalLoginCheckReq - (*MultiTerminalLoginCheckResp)(nil), // 11: OpenIMServer.msggateway.MultiTerminalLoginCheckResp - (*GetUsersOnlineStatusResp_SuccessDetail)(nil), // 12: OpenIMServer.msggateway.GetUsersOnlineStatusResp.SuccessDetail - (*GetUsersOnlineStatusResp_FailedDetail)(nil), // 13: OpenIMServer.msggateway.GetUsersOnlineStatusResp.FailedDetail - (*GetUsersOnlineStatusResp_SuccessResult)(nil), // 14: OpenIMServer.msggateway.GetUsersOnlineStatusResp.SuccessResult - (*sdkws.MsgData)(nil), // 15: OpenIMServer.sdkws.MsgData + (*SingleDetail)(nil), // 8: OpenIMServer.msggateway.SingleDetail + (*SinglePlatformToken)(nil), // 9: OpenIMServer.msggateway.SinglePlatformToken + (*KickUserOfflineReq)(nil), // 10: OpenIMServer.msggateway.KickUserOfflineReq + (*KickUserOfflineResp)(nil), // 11: OpenIMServer.msggateway.KickUserOfflineResp + (*MultiTerminalLoginCheckReq)(nil), // 12: OpenIMServer.msggateway.MultiTerminalLoginCheckReq + (*MultiTerminalLoginCheckResp)(nil), // 13: OpenIMServer.msggateway.MultiTerminalLoginCheckResp + (*GetUsersOnlineStatusResp_SuccessDetail)(nil), // 14: OpenIMServer.msggateway.GetUsersOnlineStatusResp.SuccessDetail + (*GetUsersOnlineStatusResp_FailedDetail)(nil), // 15: OpenIMServer.msggateway.GetUsersOnlineStatusResp.FailedDetail + (*GetUsersOnlineStatusResp_SuccessResult)(nil), // 16: OpenIMServer.msggateway.GetUsersOnlineStatusResp.SuccessResult + (*sdkws.MsgData)(nil), // 17: OpenIMServer.sdkws.MsgData } var file_msggateway_msggateway_proto_depIdxs = []int32{ - 15, // 0: OpenIMServer.msggateway.OnlinePushMsgReq.msgData:type_name -> OpenIMServer.sdkws.MsgData + 17, // 0: OpenIMServer.msggateway.OnlinePushMsgReq.msgData:type_name -> OpenIMServer.sdkws.MsgData 5, // 1: OpenIMServer.msggateway.OnlinePushMsgResp.resp:type_name -> OpenIMServer.msggateway.SingleMsgToUserPlatform 5, // 2: OpenIMServer.msggateway.SingleMsgToUserResults.resp:type_name -> OpenIMServer.msggateway.SingleMsgToUserPlatform - 15, // 3: OpenIMServer.msggateway.OnlineBatchPushOneMsgReq.msgData:type_name -> OpenIMServer.sdkws.MsgData + 17, // 3: OpenIMServer.msggateway.OnlineBatchPushOneMsgReq.msgData:type_name -> OpenIMServer.sdkws.MsgData 2, // 4: OpenIMServer.msggateway.OnlineBatchPushOneMsgResp.singlePushResult:type_name -> OpenIMServer.msggateway.SingleMsgToUserResults - 14, // 5: OpenIMServer.msggateway.GetUsersOnlineStatusResp.successResult:type_name -> OpenIMServer.msggateway.GetUsersOnlineStatusResp.SuccessResult - 13, // 6: OpenIMServer.msggateway.GetUsersOnlineStatusResp.failedResult:type_name -> OpenIMServer.msggateway.GetUsersOnlineStatusResp.FailedDetail - 12, // 7: OpenIMServer.msggateway.GetUsersOnlineStatusResp.SuccessResult.detailPlatformStatus:type_name -> OpenIMServer.msggateway.GetUsersOnlineStatusResp.SuccessDetail - 0, // 8: OpenIMServer.msggateway.msgGateway.OnlinePushMsg:input_type -> OpenIMServer.msggateway.OnlinePushMsgReq - 6, // 9: OpenIMServer.msggateway.msgGateway.GetUsersOnlineStatus:input_type -> OpenIMServer.msggateway.GetUsersOnlineStatusReq - 3, // 10: OpenIMServer.msggateway.msgGateway.OnlineBatchPushOneMsg:input_type -> OpenIMServer.msggateway.OnlineBatchPushOneMsgReq - 3, // 11: OpenIMServer.msggateway.msgGateway.SuperGroupOnlineBatchPushOneMsg:input_type -> OpenIMServer.msggateway.OnlineBatchPushOneMsgReq - 8, // 12: OpenIMServer.msggateway.msgGateway.KickUserOffline:input_type -> OpenIMServer.msggateway.KickUserOfflineReq - 10, // 13: OpenIMServer.msggateway.msgGateway.MultiTerminalLoginCheck:input_type -> OpenIMServer.msggateway.MultiTerminalLoginCheckReq - 1, // 14: OpenIMServer.msggateway.msgGateway.OnlinePushMsg:output_type -> OpenIMServer.msggateway.OnlinePushMsgResp - 7, // 15: OpenIMServer.msggateway.msgGateway.GetUsersOnlineStatus:output_type -> OpenIMServer.msggateway.GetUsersOnlineStatusResp - 4, // 16: OpenIMServer.msggateway.msgGateway.OnlineBatchPushOneMsg:output_type -> OpenIMServer.msggateway.OnlineBatchPushOneMsgResp - 4, // 17: OpenIMServer.msggateway.msgGateway.SuperGroupOnlineBatchPushOneMsg:output_type -> OpenIMServer.msggateway.OnlineBatchPushOneMsgResp - 9, // 18: OpenIMServer.msggateway.msgGateway.KickUserOffline:output_type -> OpenIMServer.msggateway.KickUserOfflineResp - 11, // 19: OpenIMServer.msggateway.msgGateway.MultiTerminalLoginCheck:output_type -> OpenIMServer.msggateway.MultiTerminalLoginCheckResp - 14, // [14:20] is the sub-list for method output_type - 8, // [8:14] is the sub-list for method input_type - 8, // [8:8] is the sub-list for extension type_name - 8, // [8:8] is the sub-list for extension extendee - 0, // [0:8] is the sub-list for field type_name + 16, // 5: OpenIMServer.msggateway.GetUsersOnlineStatusResp.successResult:type_name -> OpenIMServer.msggateway.GetUsersOnlineStatusResp.SuccessResult + 15, // 6: OpenIMServer.msggateway.GetUsersOnlineStatusResp.failedResult:type_name -> OpenIMServer.msggateway.GetUsersOnlineStatusResp.FailedDetail + 9, // 7: OpenIMServer.msggateway.SingleDetail.singlePlatformToken:type_name -> OpenIMServer.msggateway.SinglePlatformToken + 14, // 8: OpenIMServer.msggateway.GetUsersOnlineStatusResp.SuccessResult.detailPlatformStatus:type_name -> OpenIMServer.msggateway.GetUsersOnlineStatusResp.SuccessDetail + 0, // 9: OpenIMServer.msggateway.msgGateway.OnlinePushMsg:input_type -> OpenIMServer.msggateway.OnlinePushMsgReq + 6, // 10: OpenIMServer.msggateway.msgGateway.GetUsersOnlineStatus:input_type -> OpenIMServer.msggateway.GetUsersOnlineStatusReq + 3, // 11: OpenIMServer.msggateway.msgGateway.OnlineBatchPushOneMsg:input_type -> OpenIMServer.msggateway.OnlineBatchPushOneMsgReq + 3, // 12: OpenIMServer.msggateway.msgGateway.SuperGroupOnlineBatchPushOneMsg:input_type -> OpenIMServer.msggateway.OnlineBatchPushOneMsgReq + 10, // 13: OpenIMServer.msggateway.msgGateway.KickUserOffline:input_type -> OpenIMServer.msggateway.KickUserOfflineReq + 12, // 14: OpenIMServer.msggateway.msgGateway.MultiTerminalLoginCheck:input_type -> OpenIMServer.msggateway.MultiTerminalLoginCheckReq + 1, // 15: OpenIMServer.msggateway.msgGateway.OnlinePushMsg:output_type -> OpenIMServer.msggateway.OnlinePushMsgResp + 7, // 16: OpenIMServer.msggateway.msgGateway.GetUsersOnlineStatus:output_type -> OpenIMServer.msggateway.GetUsersOnlineStatusResp + 4, // 17: OpenIMServer.msggateway.msgGateway.OnlineBatchPushOneMsg:output_type -> OpenIMServer.msggateway.OnlineBatchPushOneMsgResp + 4, // 18: OpenIMServer.msggateway.msgGateway.SuperGroupOnlineBatchPushOneMsg:output_type -> OpenIMServer.msggateway.OnlineBatchPushOneMsgResp + 11, // 19: OpenIMServer.msggateway.msgGateway.KickUserOffline:output_type -> OpenIMServer.msggateway.KickUserOfflineResp + 13, // 20: OpenIMServer.msggateway.msgGateway.MultiTerminalLoginCheck:output_type -> OpenIMServer.msggateway.MultiTerminalLoginCheckResp + 15, // [15:21] is the sub-list for method output_type + 9, // [9:15] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name } func init() { file_msggateway_msggateway_proto_init() } @@ -1169,7 +1323,7 @@ func file_msggateway_msggateway_proto_init() { } } file_msggateway_msggateway_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KickUserOfflineReq); i { + switch v := v.(*SingleDetail); i { case 0: return &v.state case 1: @@ -1181,7 +1335,7 @@ func file_msggateway_msggateway_proto_init() { } } file_msggateway_msggateway_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KickUserOfflineResp); i { + switch v := v.(*SinglePlatformToken); i { case 0: return &v.state case 1: @@ -1193,7 +1347,7 @@ func file_msggateway_msggateway_proto_init() { } } file_msggateway_msggateway_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MultiTerminalLoginCheckReq); i { + switch v := v.(*KickUserOfflineReq); i { case 0: return &v.state case 1: @@ -1205,7 +1359,7 @@ func file_msggateway_msggateway_proto_init() { } } file_msggateway_msggateway_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MultiTerminalLoginCheckResp); i { + switch v := v.(*KickUserOfflineResp); i { case 0: return &v.state case 1: @@ -1217,7 +1371,7 @@ func file_msggateway_msggateway_proto_init() { } } file_msggateway_msggateway_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUsersOnlineStatusResp_SuccessDetail); i { + switch v := v.(*MultiTerminalLoginCheckReq); i { case 0: return &v.state case 1: @@ -1229,7 +1383,7 @@ func file_msggateway_msggateway_proto_init() { } } file_msggateway_msggateway_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUsersOnlineStatusResp_FailedDetail); i { + switch v := v.(*MultiTerminalLoginCheckResp); i { case 0: return &v.state case 1: @@ -1241,6 +1395,30 @@ func file_msggateway_msggateway_proto_init() { } } file_msggateway_msggateway_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetUsersOnlineStatusResp_SuccessDetail); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msggateway_msggateway_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetUsersOnlineStatusResp_FailedDetail); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_msggateway_msggateway_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetUsersOnlineStatusResp_SuccessResult); i { case 0: return &v.state @@ -1259,7 +1437,7 @@ func file_msggateway_msggateway_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_msggateway_msggateway_proto_rawDesc, NumEnums: 0, - NumMessages: 15, + NumMessages: 17, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/proto/msggateway/msggateway.proto b/pkg/proto/msggateway/msggateway.proto index 0f6c0bd5f..77f0fcbf3 100644 --- a/pkg/proto/msggateway/msggateway.proto +++ b/pkg/proto/msggateway/msggateway.proto @@ -70,6 +70,7 @@ message GetUsersOnlineStatusResp{ string status = 2; string connID = 3; bool isBackground = 4; + string token =5; } message FailedDetail{ string userID = 1; @@ -80,6 +81,17 @@ message GetUsersOnlineStatusResp{ repeated SuccessDetail detailPlatformStatus = 3; } } +message SingleDetail{ + string userID = 1; + string status = 2; + repeated SinglePlatformToken singlePlatformToken = 3; +} +message SinglePlatformToken{ + string platform = 1; + int32 total =2; + repeated string token = 3; +} + message KickUserOfflineReq{ int32 platformID = 1; diff --git a/pkg/proto/sdkws/sdkws.pb.go b/pkg/proto/sdkws/sdkws.pb.go index 9a5e4d630..f2038ee5a 100644 --- a/pkg/proto/sdkws/sdkws.pb.go +++ b/pkg/proto/sdkws/sdkws.pb.go @@ -4579,425 +4579,6 @@ func (*SetAppBackgroundStatusResp) Descriptor() ([]byte, []int) { return file_sdkws_sdkws_proto_rawDescGZIP(), []int{61} } -type ExtendMsgSet struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` - SessionType int32 `protobuf:"varint,2,opt,name=sessionType,proto3" json:"sessionType"` - ExtendMsgs map[string]*ExtendMsg `protobuf:"bytes,3,rep,name=extendMsgs,proto3" json:"extendMsgs" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - MaxMsgUpdateTime int64 `protobuf:"varint,4,opt,name=MaxMsgUpdateTime,proto3" json:"MaxMsgUpdateTime"` - ExtendMsgNum int32 `protobuf:"varint,5,opt,name=extendMsgNum,proto3" json:"extendMsgNum"` - CreateTime int64 `protobuf:"varint,6,opt,name=createTime,proto3" json:"createTime"` -} - -func (x *ExtendMsgSet) Reset() { - *x = ExtendMsgSet{} - if protoimpl.UnsafeEnabled { - mi := &file_sdkws_sdkws_proto_msgTypes[62] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ExtendMsgSet) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ExtendMsgSet) ProtoMessage() {} - -func (x *ExtendMsgSet) ProtoReflect() protoreflect.Message { - mi := &file_sdkws_sdkws_proto_msgTypes[62] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ExtendMsgSet.ProtoReflect.Descriptor instead. -func (*ExtendMsgSet) Descriptor() ([]byte, []int) { - return file_sdkws_sdkws_proto_rawDescGZIP(), []int{62} -} - -func (x *ExtendMsgSet) GetConversationID() string { - if x != nil { - return x.ConversationID - } - return "" -} - -func (x *ExtendMsgSet) GetSessionType() int32 { - if x != nil { - return x.SessionType - } - return 0 -} - -func (x *ExtendMsgSet) GetExtendMsgs() map[string]*ExtendMsg { - if x != nil { - return x.ExtendMsgs - } - return nil -} - -func (x *ExtendMsgSet) GetMaxMsgUpdateTime() int64 { - if x != nil { - return x.MaxMsgUpdateTime - } - return 0 -} - -func (x *ExtendMsgSet) GetExtendMsgNum() int32 { - if x != nil { - return x.ExtendMsgNum - } - return 0 -} - -func (x *ExtendMsgSet) GetCreateTime() int64 { - if x != nil { - return x.CreateTime - } - return 0 -} - -type ExtendMsg struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ReactionExtensionList map[string]*KeyValue `protobuf:"bytes,1,rep,name=reactionExtensionList,proto3" json:"reactionExtensionList" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - ClientMsgID string `protobuf:"bytes,2,opt,name=clientMsgID,proto3" json:"clientMsgID"` - MsgFirstModifyTime int64 `protobuf:"varint,3,opt,name=msgFirstModifyTime,proto3" json:"msgFirstModifyTime"` - AttachedInfo string `protobuf:"bytes,4,opt,name=attachedInfo,proto3" json:"attachedInfo"` - Ex string `protobuf:"bytes,5,opt,name=ex,proto3" json:"ex"` -} - -func (x *ExtendMsg) Reset() { - *x = ExtendMsg{} - if protoimpl.UnsafeEnabled { - mi := &file_sdkws_sdkws_proto_msgTypes[63] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ExtendMsg) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ExtendMsg) ProtoMessage() {} - -func (x *ExtendMsg) ProtoReflect() protoreflect.Message { - mi := &file_sdkws_sdkws_proto_msgTypes[63] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ExtendMsg.ProtoReflect.Descriptor instead. -func (*ExtendMsg) Descriptor() ([]byte, []int) { - return file_sdkws_sdkws_proto_rawDescGZIP(), []int{63} -} - -func (x *ExtendMsg) GetReactionExtensionList() map[string]*KeyValue { - if x != nil { - return x.ReactionExtensionList - } - return nil -} - -func (x *ExtendMsg) GetClientMsgID() string { - if x != nil { - return x.ClientMsgID - } - return "" -} - -func (x *ExtendMsg) GetMsgFirstModifyTime() int64 { - if x != nil { - return x.MsgFirstModifyTime - } - return 0 -} - -func (x *ExtendMsg) GetAttachedInfo() string { - if x != nil { - return x.AttachedInfo - } - return "" -} - -func (x *ExtendMsg) GetEx() string { - if x != nil { - return x.Ex - } - return "" -} - -type KeyValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TypeKey string `protobuf:"bytes,1,opt,name=typeKey,proto3" json:"typeKey"` - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value"` - LatestUpdateTime int64 `protobuf:"varint,3,opt,name=latestUpdateTime,proto3" json:"latestUpdateTime"` -} - -func (x *KeyValue) Reset() { - *x = KeyValue{} - if protoimpl.UnsafeEnabled { - mi := &file_sdkws_sdkws_proto_msgTypes[64] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *KeyValue) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*KeyValue) ProtoMessage() {} - -func (x *KeyValue) ProtoReflect() protoreflect.Message { - mi := &file_sdkws_sdkws_proto_msgTypes[64] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use KeyValue.ProtoReflect.Descriptor instead. -func (*KeyValue) Descriptor() ([]byte, []int) { - return file_sdkws_sdkws_proto_rawDescGZIP(), []int{64} -} - -func (x *KeyValue) GetTypeKey() string { - if x != nil { - return x.TypeKey - } - return "" -} - -func (x *KeyValue) GetValue() string { - if x != nil { - return x.Value - } - return "" -} - -func (x *KeyValue) GetLatestUpdateTime() int64 { - if x != nil { - return x.LatestUpdateTime - } - return 0 -} - -type ReactionMessageModifierNotification struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` - OpUserID string `protobuf:"bytes,2,opt,name=opUserID,proto3" json:"opUserID"` - SessionType int32 `protobuf:"varint,3,opt,name=sessionType,proto3" json:"sessionType"` - SuccessReactionExtensions map[string]*KeyValue `protobuf:"bytes,4,rep,name=successReactionExtensions,proto3" json:"successReactionExtensions" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - ClientMsgID string `protobuf:"bytes,5,opt,name=clientMsgID,proto3" json:"clientMsgID"` - IsReact bool `protobuf:"varint,6,opt,name=isReact,proto3" json:"isReact"` - IsExternalExtensions bool `protobuf:"varint,7,opt,name=isExternalExtensions,proto3" json:"isExternalExtensions"` - MsgFirstModifyTime int64 `protobuf:"varint,8,opt,name=msgFirstModifyTime,proto3" json:"msgFirstModifyTime"` -} - -func (x *ReactionMessageModifierNotification) Reset() { - *x = ReactionMessageModifierNotification{} - if protoimpl.UnsafeEnabled { - mi := &file_sdkws_sdkws_proto_msgTypes[65] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ReactionMessageModifierNotification) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ReactionMessageModifierNotification) ProtoMessage() {} - -func (x *ReactionMessageModifierNotification) ProtoReflect() protoreflect.Message { - mi := &file_sdkws_sdkws_proto_msgTypes[65] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ReactionMessageModifierNotification.ProtoReflect.Descriptor instead. -func (*ReactionMessageModifierNotification) Descriptor() ([]byte, []int) { - return file_sdkws_sdkws_proto_rawDescGZIP(), []int{65} -} - -func (x *ReactionMessageModifierNotification) GetConversationID() string { - if x != nil { - return x.ConversationID - } - return "" -} - -func (x *ReactionMessageModifierNotification) GetOpUserID() string { - if x != nil { - return x.OpUserID - } - return "" -} - -func (x *ReactionMessageModifierNotification) GetSessionType() int32 { - if x != nil { - return x.SessionType - } - return 0 -} - -func (x *ReactionMessageModifierNotification) GetSuccessReactionExtensions() map[string]*KeyValue { - if x != nil { - return x.SuccessReactionExtensions - } - return nil -} - -func (x *ReactionMessageModifierNotification) GetClientMsgID() string { - if x != nil { - return x.ClientMsgID - } - return "" -} - -func (x *ReactionMessageModifierNotification) GetIsReact() bool { - if x != nil { - return x.IsReact - } - return false -} - -func (x *ReactionMessageModifierNotification) GetIsExternalExtensions() bool { - if x != nil { - return x.IsExternalExtensions - } - return false -} - -func (x *ReactionMessageModifierNotification) GetMsgFirstModifyTime() int64 { - if x != nil { - return x.MsgFirstModifyTime - } - return 0 -} - -type ReactionMessageDeleteNotification struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ConversationID string `protobuf:"bytes,1,opt,name=conversationID,proto3" json:"conversationID"` - OpUserID string `protobuf:"bytes,2,opt,name=opUserID,proto3" json:"opUserID"` - SessionType int32 `protobuf:"varint,3,opt,name=sessionType,proto3" json:"sessionType"` - SuccessReactionExtensions map[string]*KeyValue `protobuf:"bytes,4,rep,name=successReactionExtensions,proto3" json:"successReactionExtensions" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - ClientMsgID string `protobuf:"bytes,5,opt,name=clientMsgID,proto3" json:"clientMsgID"` - MsgFirstModifyTime int64 `protobuf:"varint,6,opt,name=msgFirstModifyTime,proto3" json:"msgFirstModifyTime"` -} - -func (x *ReactionMessageDeleteNotification) Reset() { - *x = ReactionMessageDeleteNotification{} - if protoimpl.UnsafeEnabled { - mi := &file_sdkws_sdkws_proto_msgTypes[66] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ReactionMessageDeleteNotification) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ReactionMessageDeleteNotification) ProtoMessage() {} - -func (x *ReactionMessageDeleteNotification) ProtoReflect() protoreflect.Message { - mi := &file_sdkws_sdkws_proto_msgTypes[66] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ReactionMessageDeleteNotification.ProtoReflect.Descriptor instead. -func (*ReactionMessageDeleteNotification) Descriptor() ([]byte, []int) { - return file_sdkws_sdkws_proto_rawDescGZIP(), []int{66} -} - -func (x *ReactionMessageDeleteNotification) GetConversationID() string { - if x != nil { - return x.ConversationID - } - return "" -} - -func (x *ReactionMessageDeleteNotification) GetOpUserID() string { - if x != nil { - return x.OpUserID - } - return "" -} - -func (x *ReactionMessageDeleteNotification) GetSessionType() int32 { - if x != nil { - return x.SessionType - } - return 0 -} - -func (x *ReactionMessageDeleteNotification) GetSuccessReactionExtensions() map[string]*KeyValue { - if x != nil { - return x.SuccessReactionExtensions - } - return nil -} - -func (x *ReactionMessageDeleteNotification) GetClientMsgID() string { - if x != nil { - return x.ClientMsgID - } - return "" -} - -func (x *ReactionMessageDeleteNotification) GetMsgFirstModifyTime() int64 { - if x != nil { - return x.MsgFirstModifyTime - } - return 0 -} - type RequestPagination struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5010,7 +4591,7 @@ type RequestPagination struct { func (x *RequestPagination) Reset() { *x = RequestPagination{} if protoimpl.UnsafeEnabled { - mi := &file_sdkws_sdkws_proto_msgTypes[67] + mi := &file_sdkws_sdkws_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5023,7 +4604,7 @@ func (x *RequestPagination) String() string { func (*RequestPagination) ProtoMessage() {} func (x *RequestPagination) ProtoReflect() protoreflect.Message { - mi := &file_sdkws_sdkws_proto_msgTypes[67] + mi := &file_sdkws_sdkws_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5036,7 +4617,7 @@ func (x *RequestPagination) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestPagination.ProtoReflect.Descriptor instead. func (*RequestPagination) Descriptor() ([]byte, []int) { - return file_sdkws_sdkws_proto_rawDescGZIP(), []int{67} + return file_sdkws_sdkws_proto_rawDescGZIP(), []int{62} } func (x *RequestPagination) GetPageNumber() int32 { @@ -5835,137 +5416,19 @@ var file_sdkws_sdkws_proto_rawDesc = []byte{ 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x1c, 0x0a, 0x1a, 0x53, 0x65, 0x74, 0x41, 0x70, 0x70, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0xf8, 0x02, 0x0a, 0x0c, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x63, - 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x4d, - 0x73, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x53, 0x65, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x4d, 0x61, 0x78, 0x4d, 0x73, - 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x10, 0x4d, 0x61, 0x78, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, - 0x4e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x64, 0x4d, 0x73, 0x67, 0x4e, 0x75, 0x6d, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x5c, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x64, 0x4d, 0x73, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, - 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe9, 0x02, 0x0a, 0x09, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, - 0x4d, 0x73, 0x67, 0x12, 0x6e, 0x0a, 0x15, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x4d, 0x73, - 0x67, 0x2e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x15, 0x72, 0x65, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4c, - 0x69, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x4d, 0x73, 0x67, 0x49, 0x44, 0x12, 0x2e, 0x0a, 0x12, 0x6d, 0x73, 0x67, 0x46, 0x69, 0x72, 0x73, - 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x12, 0x6d, 0x73, 0x67, 0x46, 0x69, 0x72, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x74, 0x74, - 0x61, 0x63, 0x68, 0x65, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x78, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x65, 0x78, 0x1a, 0x66, 0x0a, 0x1a, 0x52, 0x65, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x32, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, - 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x4b, 0x65, - 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x66, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x74, 0x79, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x74, 0x79, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2a, 0x0a, - 0x10, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xae, 0x04, 0x0a, 0x23, 0x52, 0x65, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, - 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x55, - 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x55, - 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x94, 0x01, 0x0a, 0x19, 0x73, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x56, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, - 0x2e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x19, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, - 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49, 0x44, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49, 0x44, - 0x12, 0x18, 0x0a, 0x07, 0x69, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x69, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x12, 0x32, 0x0a, 0x14, 0x69, 0x73, - 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, - 0x0a, 0x12, 0x6d, 0x73, 0x67, 0x46, 0x69, 0x72, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x54, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x73, 0x67, 0x46, - 0x69, 0x72, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x6a, - 0x0a, 0x1e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x32, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdc, 0x03, 0x0a, 0x21, 0x52, - 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x55, 0x73, - 0x65, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x55, 0x73, - 0x65, 0x72, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x92, 0x01, 0x0a, 0x19, 0x73, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x54, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, - 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x19, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x49, 0x44, 0x12, 0x2e, 0x0a, - 0x12, 0x6d, 0x73, 0x67, 0x46, 0x69, 0x72, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x54, - 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x73, 0x67, 0x46, 0x69, - 0x72, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x1a, 0x6a, 0x0a, - 0x1e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x32, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x73, 0x64, 0x6b, 0x77, 0x73, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, 0x11, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, - 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1e, - 0x0a, 0x0a, 0x73, 0x68, 0x6f, 0x77, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0a, 0x73, 0x68, 0x6f, 0x77, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2a, 0x30, - 0x0a, 0x09, 0x50, 0x75, 0x6c, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x0c, 0x50, - 0x75, 0x6c, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x41, 0x73, 0x63, 0x10, 0x00, 0x12, 0x11, 0x0a, - 0x0d, 0x50, 0x75, 0x6c, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x65, 0x73, 0x63, 0x10, 0x01, - 0x42, 0x35, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, - 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x44, 0x4b, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x2d, 0x49, 0x4d, - 0x2d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2f, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0x53, 0x0a, 0x11, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, + 0x1e, 0x0a, 0x0a, 0x73, 0x68, 0x6f, 0x77, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x68, 0x6f, 0x77, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2a, + 0x30, 0x0a, 0x09, 0x50, 0x75, 0x6c, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x0c, + 0x50, 0x75, 0x6c, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x41, 0x73, 0x63, 0x10, 0x00, 0x12, 0x11, + 0x0a, 0x0d, 0x50, 0x75, 0x6c, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x44, 0x65, 0x73, 0x63, 0x10, + 0x01, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x44, 0x4b, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x2d, 0x49, + 0x4d, 0x2d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2f, 0x73, 0x64, 0x6b, 0x77, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5981,94 +5444,85 @@ func file_sdkws_sdkws_proto_rawDescGZIP() []byte { } var file_sdkws_sdkws_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_sdkws_sdkws_proto_msgTypes = make([]protoimpl.MessageInfo, 79) +var file_sdkws_sdkws_proto_msgTypes = make([]protoimpl.MessageInfo, 70) var file_sdkws_sdkws_proto_goTypes = []interface{}{ - (PullOrder)(0), // 0: OpenIMServer.sdkws.PullOrder - (*GroupInfo)(nil), // 1: OpenIMServer.sdkws.GroupInfo - (*GroupInfoForSet)(nil), // 2: OpenIMServer.sdkws.GroupInfoForSet - (*GroupMemberFullInfo)(nil), // 3: OpenIMServer.sdkws.GroupMemberFullInfo - (*PublicUserInfo)(nil), // 4: OpenIMServer.sdkws.PublicUserInfo - (*UserInfo)(nil), // 5: OpenIMServer.sdkws.UserInfo - (*FriendInfo)(nil), // 6: OpenIMServer.sdkws.FriendInfo - (*BlackInfo)(nil), // 7: OpenIMServer.sdkws.BlackInfo - (*GroupRequest)(nil), // 8: OpenIMServer.sdkws.GroupRequest - (*FriendRequest)(nil), // 9: OpenIMServer.sdkws.FriendRequest - (*PullMessageBySeqsReq)(nil), // 10: OpenIMServer.sdkws.PullMessageBySeqsReq - (*SeqRange)(nil), // 11: OpenIMServer.sdkws.SeqRange - (*PullMsgs)(nil), // 12: OpenIMServer.sdkws.PullMsgs - (*PullMessageBySeqsResp)(nil), // 13: OpenIMServer.sdkws.PullMessageBySeqsResp - (*GetMaxSeqReq)(nil), // 14: OpenIMServer.sdkws.GetMaxSeqReq - (*GetMaxSeqResp)(nil), // 15: OpenIMServer.sdkws.GetMaxSeqResp - (*UserSendMsgResp)(nil), // 16: OpenIMServer.sdkws.UserSendMsgResp - (*MsgData)(nil), // 17: OpenIMServer.sdkws.MsgData - (*PushMessages)(nil), // 18: OpenIMServer.sdkws.PushMessages - (*OfflinePushInfo)(nil), // 19: OpenIMServer.sdkws.OfflinePushInfo - (*TipsComm)(nil), // 20: OpenIMServer.sdkws.TipsComm - (*GroupCreatedTips)(nil), // 21: OpenIMServer.sdkws.GroupCreatedTips - (*GroupInfoSetTips)(nil), // 22: OpenIMServer.sdkws.GroupInfoSetTips - (*GroupInfoSetNameTips)(nil), // 23: OpenIMServer.sdkws.GroupInfoSetNameTips - (*GroupInfoSetAnnouncementTips)(nil), // 24: OpenIMServer.sdkws.GroupInfoSetAnnouncementTips - (*JoinGroupApplicationTips)(nil), // 25: OpenIMServer.sdkws.JoinGroupApplicationTips - (*MemberQuitTips)(nil), // 26: OpenIMServer.sdkws.MemberQuitTips - (*GroupApplicationAcceptedTips)(nil), // 27: OpenIMServer.sdkws.GroupApplicationAcceptedTips - (*GroupApplicationRejectedTips)(nil), // 28: OpenIMServer.sdkws.GroupApplicationRejectedTips - (*GroupOwnerTransferredTips)(nil), // 29: OpenIMServer.sdkws.GroupOwnerTransferredTips - (*MemberKickedTips)(nil), // 30: OpenIMServer.sdkws.MemberKickedTips - (*MemberInvitedTips)(nil), // 31: OpenIMServer.sdkws.MemberInvitedTips - (*MemberEnterTips)(nil), // 32: OpenIMServer.sdkws.MemberEnterTips - (*GroupDismissedTips)(nil), // 33: OpenIMServer.sdkws.GroupDismissedTips - (*GroupMemberMutedTips)(nil), // 34: OpenIMServer.sdkws.GroupMemberMutedTips - (*GroupMemberCancelMutedTips)(nil), // 35: OpenIMServer.sdkws.GroupMemberCancelMutedTips - (*GroupMutedTips)(nil), // 36: OpenIMServer.sdkws.GroupMutedTips - (*GroupCancelMutedTips)(nil), // 37: OpenIMServer.sdkws.GroupCancelMutedTips - (*GroupMemberInfoSetTips)(nil), // 38: OpenIMServer.sdkws.GroupMemberInfoSetTips - (*FriendApplication)(nil), // 39: OpenIMServer.sdkws.FriendApplication - (*FromToUserID)(nil), // 40: OpenIMServer.sdkws.FromToUserID - (*FriendApplicationTips)(nil), // 41: OpenIMServer.sdkws.FriendApplicationTips - (*FriendApplicationApprovedTips)(nil), // 42: OpenIMServer.sdkws.FriendApplicationApprovedTips - (*FriendApplicationRejectedTips)(nil), // 43: OpenIMServer.sdkws.FriendApplicationRejectedTips - (*FriendAddedTips)(nil), // 44: OpenIMServer.sdkws.FriendAddedTips - (*FriendDeletedTips)(nil), // 45: OpenIMServer.sdkws.FriendDeletedTips - (*BlackAddedTips)(nil), // 46: OpenIMServer.sdkws.BlackAddedTips - (*BlackDeletedTips)(nil), // 47: OpenIMServer.sdkws.BlackDeletedTips - (*FriendInfoChangedTips)(nil), // 48: OpenIMServer.sdkws.FriendInfoChangedTips - (*UserInfoUpdatedTips)(nil), // 49: OpenIMServer.sdkws.UserInfoUpdatedTips - (*ConversationUpdateTips)(nil), // 50: OpenIMServer.sdkws.ConversationUpdateTips - (*ConversationSetPrivateTips)(nil), // 51: OpenIMServer.sdkws.ConversationSetPrivateTips - (*ConversationHasReadTips)(nil), // 52: OpenIMServer.sdkws.ConversationHasReadTips - (*NotificationElem)(nil), // 53: OpenIMServer.sdkws.NotificationElem - (*Seqs)(nil), // 54: OpenIMServer.sdkws.seqs - (*DeleteMessageTips)(nil), // 55: OpenIMServer.sdkws.DeleteMessageTips - (*RevokeMsgTips)(nil), // 56: OpenIMServer.sdkws.RevokeMsgTips - (*MessageRevokedContent)(nil), // 57: OpenIMServer.sdkws.MessageRevokedContent - (*ClearConversationTips)(nil), // 58: OpenIMServer.sdkws.ClearConversationTips - (*DeleteMsgsTips)(nil), // 59: OpenIMServer.sdkws.DeleteMsgsTips - (*MarkAsReadTips)(nil), // 60: OpenIMServer.sdkws.MarkAsReadTips - (*SetAppBackgroundStatusReq)(nil), // 61: OpenIMServer.sdkws.SetAppBackgroundStatusReq - (*SetAppBackgroundStatusResp)(nil), // 62: OpenIMServer.sdkws.SetAppBackgroundStatusResp - (*ExtendMsgSet)(nil), // 63: OpenIMServer.sdkws.ExtendMsgSet - (*ExtendMsg)(nil), // 64: OpenIMServer.sdkws.ExtendMsg - (*KeyValue)(nil), // 65: OpenIMServer.sdkws.KeyValue - (*ReactionMessageModifierNotification)(nil), // 66: OpenIMServer.sdkws.ReactionMessageModifierNotification - (*ReactionMessageDeleteNotification)(nil), // 67: OpenIMServer.sdkws.ReactionMessageDeleteNotification - (*RequestPagination)(nil), // 68: OpenIMServer.sdkws.RequestPagination - nil, // 69: OpenIMServer.sdkws.PullMessageBySeqsResp.MsgsEntry - nil, // 70: OpenIMServer.sdkws.PullMessageBySeqsResp.NotificationMsgsEntry - nil, // 71: OpenIMServer.sdkws.GetMaxSeqResp.MaxSeqsEntry - nil, // 72: OpenIMServer.sdkws.GetMaxSeqResp.MinSeqsEntry - nil, // 73: OpenIMServer.sdkws.MsgData.OptionsEntry - nil, // 74: OpenIMServer.sdkws.PushMessages.MsgsEntry - nil, // 75: OpenIMServer.sdkws.PushMessages.NotificationMsgsEntry - nil, // 76: OpenIMServer.sdkws.ExtendMsgSet.ExtendMsgsEntry - nil, // 77: OpenIMServer.sdkws.ExtendMsg.ReactionExtensionListEntry - nil, // 78: OpenIMServer.sdkws.ReactionMessageModifierNotification.SuccessReactionExtensionsEntry - nil, // 79: OpenIMServer.sdkws.ReactionMessageDeleteNotification.SuccessReactionExtensionsEntry - (*wrapperspb.Int32Value)(nil), // 80: OpenIMServer.protobuf.Int32Value + (PullOrder)(0), // 0: OpenIMServer.sdkws.PullOrder + (*GroupInfo)(nil), // 1: OpenIMServer.sdkws.GroupInfo + (*GroupInfoForSet)(nil), // 2: OpenIMServer.sdkws.GroupInfoForSet + (*GroupMemberFullInfo)(nil), // 3: OpenIMServer.sdkws.GroupMemberFullInfo + (*PublicUserInfo)(nil), // 4: OpenIMServer.sdkws.PublicUserInfo + (*UserInfo)(nil), // 5: OpenIMServer.sdkws.UserInfo + (*FriendInfo)(nil), // 6: OpenIMServer.sdkws.FriendInfo + (*BlackInfo)(nil), // 7: OpenIMServer.sdkws.BlackInfo + (*GroupRequest)(nil), // 8: OpenIMServer.sdkws.GroupRequest + (*FriendRequest)(nil), // 9: OpenIMServer.sdkws.FriendRequest + (*PullMessageBySeqsReq)(nil), // 10: OpenIMServer.sdkws.PullMessageBySeqsReq + (*SeqRange)(nil), // 11: OpenIMServer.sdkws.SeqRange + (*PullMsgs)(nil), // 12: OpenIMServer.sdkws.PullMsgs + (*PullMessageBySeqsResp)(nil), // 13: OpenIMServer.sdkws.PullMessageBySeqsResp + (*GetMaxSeqReq)(nil), // 14: OpenIMServer.sdkws.GetMaxSeqReq + (*GetMaxSeqResp)(nil), // 15: OpenIMServer.sdkws.GetMaxSeqResp + (*UserSendMsgResp)(nil), // 16: OpenIMServer.sdkws.UserSendMsgResp + (*MsgData)(nil), // 17: OpenIMServer.sdkws.MsgData + (*PushMessages)(nil), // 18: OpenIMServer.sdkws.PushMessages + (*OfflinePushInfo)(nil), // 19: OpenIMServer.sdkws.OfflinePushInfo + (*TipsComm)(nil), // 20: OpenIMServer.sdkws.TipsComm + (*GroupCreatedTips)(nil), // 21: OpenIMServer.sdkws.GroupCreatedTips + (*GroupInfoSetTips)(nil), // 22: OpenIMServer.sdkws.GroupInfoSetTips + (*GroupInfoSetNameTips)(nil), // 23: OpenIMServer.sdkws.GroupInfoSetNameTips + (*GroupInfoSetAnnouncementTips)(nil), // 24: OpenIMServer.sdkws.GroupInfoSetAnnouncementTips + (*JoinGroupApplicationTips)(nil), // 25: OpenIMServer.sdkws.JoinGroupApplicationTips + (*MemberQuitTips)(nil), // 26: OpenIMServer.sdkws.MemberQuitTips + (*GroupApplicationAcceptedTips)(nil), // 27: OpenIMServer.sdkws.GroupApplicationAcceptedTips + (*GroupApplicationRejectedTips)(nil), // 28: OpenIMServer.sdkws.GroupApplicationRejectedTips + (*GroupOwnerTransferredTips)(nil), // 29: OpenIMServer.sdkws.GroupOwnerTransferredTips + (*MemberKickedTips)(nil), // 30: OpenIMServer.sdkws.MemberKickedTips + (*MemberInvitedTips)(nil), // 31: OpenIMServer.sdkws.MemberInvitedTips + (*MemberEnterTips)(nil), // 32: OpenIMServer.sdkws.MemberEnterTips + (*GroupDismissedTips)(nil), // 33: OpenIMServer.sdkws.GroupDismissedTips + (*GroupMemberMutedTips)(nil), // 34: OpenIMServer.sdkws.GroupMemberMutedTips + (*GroupMemberCancelMutedTips)(nil), // 35: OpenIMServer.sdkws.GroupMemberCancelMutedTips + (*GroupMutedTips)(nil), // 36: OpenIMServer.sdkws.GroupMutedTips + (*GroupCancelMutedTips)(nil), // 37: OpenIMServer.sdkws.GroupCancelMutedTips + (*GroupMemberInfoSetTips)(nil), // 38: OpenIMServer.sdkws.GroupMemberInfoSetTips + (*FriendApplication)(nil), // 39: OpenIMServer.sdkws.FriendApplication + (*FromToUserID)(nil), // 40: OpenIMServer.sdkws.FromToUserID + (*FriendApplicationTips)(nil), // 41: OpenIMServer.sdkws.FriendApplicationTips + (*FriendApplicationApprovedTips)(nil), // 42: OpenIMServer.sdkws.FriendApplicationApprovedTips + (*FriendApplicationRejectedTips)(nil), // 43: OpenIMServer.sdkws.FriendApplicationRejectedTips + (*FriendAddedTips)(nil), // 44: OpenIMServer.sdkws.FriendAddedTips + (*FriendDeletedTips)(nil), // 45: OpenIMServer.sdkws.FriendDeletedTips + (*BlackAddedTips)(nil), // 46: OpenIMServer.sdkws.BlackAddedTips + (*BlackDeletedTips)(nil), // 47: OpenIMServer.sdkws.BlackDeletedTips + (*FriendInfoChangedTips)(nil), // 48: OpenIMServer.sdkws.FriendInfoChangedTips + (*UserInfoUpdatedTips)(nil), // 49: OpenIMServer.sdkws.UserInfoUpdatedTips + (*ConversationUpdateTips)(nil), // 50: OpenIMServer.sdkws.ConversationUpdateTips + (*ConversationSetPrivateTips)(nil), // 51: OpenIMServer.sdkws.ConversationSetPrivateTips + (*ConversationHasReadTips)(nil), // 52: OpenIMServer.sdkws.ConversationHasReadTips + (*NotificationElem)(nil), // 53: OpenIMServer.sdkws.NotificationElem + (*Seqs)(nil), // 54: OpenIMServer.sdkws.seqs + (*DeleteMessageTips)(nil), // 55: OpenIMServer.sdkws.DeleteMessageTips + (*RevokeMsgTips)(nil), // 56: OpenIMServer.sdkws.RevokeMsgTips + (*MessageRevokedContent)(nil), // 57: OpenIMServer.sdkws.MessageRevokedContent + (*ClearConversationTips)(nil), // 58: OpenIMServer.sdkws.ClearConversationTips + (*DeleteMsgsTips)(nil), // 59: OpenIMServer.sdkws.DeleteMsgsTips + (*MarkAsReadTips)(nil), // 60: OpenIMServer.sdkws.MarkAsReadTips + (*SetAppBackgroundStatusReq)(nil), // 61: OpenIMServer.sdkws.SetAppBackgroundStatusReq + (*SetAppBackgroundStatusResp)(nil), // 62: OpenIMServer.sdkws.SetAppBackgroundStatusResp + (*RequestPagination)(nil), // 63: OpenIMServer.sdkws.RequestPagination + nil, // 64: OpenIMServer.sdkws.PullMessageBySeqsResp.MsgsEntry + nil, // 65: OpenIMServer.sdkws.PullMessageBySeqsResp.NotificationMsgsEntry + nil, // 66: OpenIMServer.sdkws.GetMaxSeqResp.MaxSeqsEntry + nil, // 67: OpenIMServer.sdkws.GetMaxSeqResp.MinSeqsEntry + nil, // 68: OpenIMServer.sdkws.MsgData.OptionsEntry + nil, // 69: OpenIMServer.sdkws.PushMessages.MsgsEntry + nil, // 70: OpenIMServer.sdkws.PushMessages.NotificationMsgsEntry + (*wrapperspb.Int32Value)(nil), // 71: OpenIMServer.protobuf.Int32Value } var file_sdkws_sdkws_proto_depIdxs = []int32{ - 80, // 0: OpenIMServer.sdkws.GroupInfoForSet.needVerification:type_name -> OpenIMServer.protobuf.Int32Value - 80, // 1: OpenIMServer.sdkws.GroupInfoForSet.lookMemberInfo:type_name -> OpenIMServer.protobuf.Int32Value - 80, // 2: OpenIMServer.sdkws.GroupInfoForSet.applyMemberFriend:type_name -> OpenIMServer.protobuf.Int32Value + 71, // 0: OpenIMServer.sdkws.GroupInfoForSet.needVerification:type_name -> OpenIMServer.protobuf.Int32Value + 71, // 1: OpenIMServer.sdkws.GroupInfoForSet.lookMemberInfo:type_name -> OpenIMServer.protobuf.Int32Value + 71, // 2: OpenIMServer.sdkws.GroupInfoForSet.applyMemberFriend:type_name -> OpenIMServer.protobuf.Int32Value 5, // 3: OpenIMServer.sdkws.FriendInfo.friendUser:type_name -> OpenIMServer.sdkws.UserInfo 4, // 4: OpenIMServer.sdkws.BlackInfo.blackUserInfo:type_name -> OpenIMServer.sdkws.PublicUserInfo 4, // 5: OpenIMServer.sdkws.GroupRequest.userInfo:type_name -> OpenIMServer.sdkws.PublicUserInfo @@ -6076,14 +5530,14 @@ var file_sdkws_sdkws_proto_depIdxs = []int32{ 11, // 7: OpenIMServer.sdkws.PullMessageBySeqsReq.seqRanges:type_name -> OpenIMServer.sdkws.SeqRange 0, // 8: OpenIMServer.sdkws.PullMessageBySeqsReq.order:type_name -> OpenIMServer.sdkws.PullOrder 17, // 9: OpenIMServer.sdkws.PullMsgs.Msgs:type_name -> OpenIMServer.sdkws.MsgData - 69, // 10: OpenIMServer.sdkws.PullMessageBySeqsResp.msgs:type_name -> OpenIMServer.sdkws.PullMessageBySeqsResp.MsgsEntry - 70, // 11: OpenIMServer.sdkws.PullMessageBySeqsResp.notificationMsgs:type_name -> OpenIMServer.sdkws.PullMessageBySeqsResp.NotificationMsgsEntry - 71, // 12: OpenIMServer.sdkws.GetMaxSeqResp.maxSeqs:type_name -> OpenIMServer.sdkws.GetMaxSeqResp.MaxSeqsEntry - 72, // 13: OpenIMServer.sdkws.GetMaxSeqResp.minSeqs:type_name -> OpenIMServer.sdkws.GetMaxSeqResp.MinSeqsEntry - 73, // 14: OpenIMServer.sdkws.MsgData.options:type_name -> OpenIMServer.sdkws.MsgData.OptionsEntry + 64, // 10: OpenIMServer.sdkws.PullMessageBySeqsResp.msgs:type_name -> OpenIMServer.sdkws.PullMessageBySeqsResp.MsgsEntry + 65, // 11: OpenIMServer.sdkws.PullMessageBySeqsResp.notificationMsgs:type_name -> OpenIMServer.sdkws.PullMessageBySeqsResp.NotificationMsgsEntry + 66, // 12: OpenIMServer.sdkws.GetMaxSeqResp.maxSeqs:type_name -> OpenIMServer.sdkws.GetMaxSeqResp.MaxSeqsEntry + 67, // 13: OpenIMServer.sdkws.GetMaxSeqResp.minSeqs:type_name -> OpenIMServer.sdkws.GetMaxSeqResp.MinSeqsEntry + 68, // 14: OpenIMServer.sdkws.MsgData.options:type_name -> OpenIMServer.sdkws.MsgData.OptionsEntry 19, // 15: OpenIMServer.sdkws.MsgData.offlinePushInfo:type_name -> OpenIMServer.sdkws.OfflinePushInfo - 74, // 16: OpenIMServer.sdkws.PushMessages.msgs:type_name -> OpenIMServer.sdkws.PushMessages.MsgsEntry - 75, // 17: OpenIMServer.sdkws.PushMessages.notificationMsgs:type_name -> OpenIMServer.sdkws.PushMessages.NotificationMsgsEntry + 69, // 16: OpenIMServer.sdkws.PushMessages.msgs:type_name -> OpenIMServer.sdkws.PushMessages.MsgsEntry + 70, // 17: OpenIMServer.sdkws.PushMessages.notificationMsgs:type_name -> OpenIMServer.sdkws.PushMessages.NotificationMsgsEntry 1, // 18: OpenIMServer.sdkws.GroupCreatedTips.group:type_name -> OpenIMServer.sdkws.GroupInfo 3, // 19: OpenIMServer.sdkws.GroupCreatedTips.opUser:type_name -> OpenIMServer.sdkws.GroupMemberFullInfo 3, // 20: OpenIMServer.sdkws.GroupCreatedTips.memberList:type_name -> OpenIMServer.sdkws.GroupMemberFullInfo @@ -6137,23 +5591,15 @@ var file_sdkws_sdkws_proto_depIdxs = []int32{ 40, // 68: OpenIMServer.sdkws.BlackAddedTips.fromToUserID:type_name -> OpenIMServer.sdkws.FromToUserID 40, // 69: OpenIMServer.sdkws.BlackDeletedTips.fromToUserID:type_name -> OpenIMServer.sdkws.FromToUserID 40, // 70: OpenIMServer.sdkws.FriendInfoChangedTips.fromToUserID:type_name -> OpenIMServer.sdkws.FromToUserID - 76, // 71: OpenIMServer.sdkws.ExtendMsgSet.extendMsgs:type_name -> OpenIMServer.sdkws.ExtendMsgSet.ExtendMsgsEntry - 77, // 72: OpenIMServer.sdkws.ExtendMsg.reactionExtensionList:type_name -> OpenIMServer.sdkws.ExtendMsg.ReactionExtensionListEntry - 78, // 73: OpenIMServer.sdkws.ReactionMessageModifierNotification.successReactionExtensions:type_name -> OpenIMServer.sdkws.ReactionMessageModifierNotification.SuccessReactionExtensionsEntry - 79, // 74: OpenIMServer.sdkws.ReactionMessageDeleteNotification.successReactionExtensions:type_name -> OpenIMServer.sdkws.ReactionMessageDeleteNotification.SuccessReactionExtensionsEntry - 12, // 75: OpenIMServer.sdkws.PullMessageBySeqsResp.MsgsEntry.value:type_name -> OpenIMServer.sdkws.PullMsgs - 12, // 76: OpenIMServer.sdkws.PullMessageBySeqsResp.NotificationMsgsEntry.value:type_name -> OpenIMServer.sdkws.PullMsgs - 12, // 77: OpenIMServer.sdkws.PushMessages.MsgsEntry.value:type_name -> OpenIMServer.sdkws.PullMsgs - 12, // 78: OpenIMServer.sdkws.PushMessages.NotificationMsgsEntry.value:type_name -> OpenIMServer.sdkws.PullMsgs - 64, // 79: OpenIMServer.sdkws.ExtendMsgSet.ExtendMsgsEntry.value:type_name -> OpenIMServer.sdkws.ExtendMsg - 65, // 80: OpenIMServer.sdkws.ExtendMsg.ReactionExtensionListEntry.value:type_name -> OpenIMServer.sdkws.KeyValue - 65, // 81: OpenIMServer.sdkws.ReactionMessageModifierNotification.SuccessReactionExtensionsEntry.value:type_name -> OpenIMServer.sdkws.KeyValue - 65, // 82: OpenIMServer.sdkws.ReactionMessageDeleteNotification.SuccessReactionExtensionsEntry.value:type_name -> OpenIMServer.sdkws.KeyValue - 83, // [83:83] is the sub-list for method output_type - 83, // [83:83] is the sub-list for method input_type - 83, // [83:83] is the sub-list for extension type_name - 83, // [83:83] is the sub-list for extension extendee - 0, // [0:83] is the sub-list for field type_name + 12, // 71: OpenIMServer.sdkws.PullMessageBySeqsResp.MsgsEntry.value:type_name -> OpenIMServer.sdkws.PullMsgs + 12, // 72: OpenIMServer.sdkws.PullMessageBySeqsResp.NotificationMsgsEntry.value:type_name -> OpenIMServer.sdkws.PullMsgs + 12, // 73: OpenIMServer.sdkws.PushMessages.MsgsEntry.value:type_name -> OpenIMServer.sdkws.PullMsgs + 12, // 74: OpenIMServer.sdkws.PushMessages.NotificationMsgsEntry.value:type_name -> OpenIMServer.sdkws.PullMsgs + 75, // [75:75] is the sub-list for method output_type + 75, // [75:75] is the sub-list for method input_type + 75, // [75:75] is the sub-list for extension type_name + 75, // [75:75] is the sub-list for extension extendee + 0, // [0:75] is the sub-list for field type_name } func init() { file_sdkws_sdkws_proto_init() } @@ -6907,66 +6353,6 @@ func file_sdkws_sdkws_proto_init() { } } file_sdkws_sdkws_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtendMsgSet); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_sdkws_sdkws_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtendMsg); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_sdkws_sdkws_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KeyValue); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_sdkws_sdkws_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReactionMessageModifierNotification); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_sdkws_sdkws_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReactionMessageDeleteNotification); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_sdkws_sdkws_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RequestPagination); i { case 0: return &v.state @@ -6985,7 +6371,7 @@ func file_sdkws_sdkws_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_sdkws_sdkws_proto_rawDesc, NumEnums: 1, - NumMessages: 79, + NumMessages: 70, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/proto/sdkws/sdkws.proto b/pkg/proto/sdkws/sdkws.proto index 4e81502d3..225172fe2 100644 --- a/pkg/proto/sdkws/sdkws.proto +++ b/pkg/proto/sdkws/sdkws.proto @@ -510,48 +510,6 @@ message SetAppBackgroundStatusReq { message SetAppBackgroundStatusResp { } -message ExtendMsgSet { - string conversationID = 1; - int32 sessionType = 2; - map extendMsgs = 3; - int64 MaxMsgUpdateTime = 4; - int32 extendMsgNum = 5; - int64 createTime = 6; -} - -message ExtendMsg { - map reactionExtensionList = 1; - string clientMsgID = 2; - int64 msgFirstModifyTime = 3; - string attachedInfo = 4; - string ex = 5; -} - -message KeyValue { - string typeKey = 1; - string value = 2; - int64 latestUpdateTime = 3; -} - -message ReactionMessageModifierNotification { - string conversationID = 1; - string opUserID = 2; - int32 sessionType = 3; - map successReactionExtensions = 4; - string clientMsgID = 5; - bool isReact = 6; - bool isExternalExtensions = 7; - int64 msgFirstModifyTime = 8; -} - -message ReactionMessageDeleteNotification { - string conversationID = 1; - string opUserID = 2; - int32 sessionType = 3; - map successReactionExtensions = 4; - string clientMsgID = 5; - int64 msgFirstModifyTime = 6; -} message RequestPagination { int32 pageNumber = 1; diff --git a/pkg/proto/third/third.pb.go b/pkg/proto/third/third.pb.go index a2512db38..1ba6c3a05 100644 --- a/pkg/proto/third/third.pb.go +++ b/pkg/proto/third/third.pb.go @@ -25,22 +25,17 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -type ApplyPutReq struct { +type KeyValues struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PutID string `protobuf:"bytes,1,opt,name=putID,proto3" json:"putID"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name"` - Size int64 `protobuf:"varint,3,opt,name=size,proto3" json:"size"` - Hash string `protobuf:"bytes,4,opt,name=hash,proto3" json:"hash"` - ContentType string `protobuf:"bytes,5,opt,name=contentType,proto3" json:"contentType"` - FragmentSize int64 `protobuf:"varint,6,opt,name=fragmentSize,proto3" json:"fragmentSize"` - ValidTime int64 `protobuf:"varint,7,opt,name=validTime,proto3" json:"validTime"` // 文件有效时间 + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key"` + Values []string `protobuf:"bytes,2,rep,name=values,proto3" json:"values"` } -func (x *ApplyPutReq) Reset() { - *x = ApplyPutReq{} +func (x *KeyValues) Reset() { + *x = KeyValues{} if protoimpl.UnsafeEnabled { mi := &file_third_third_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -48,13 +43,13 @@ func (x *ApplyPutReq) Reset() { } } -func (x *ApplyPutReq) String() string { +func (x *KeyValues) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ApplyPutReq) ProtoMessage() {} +func (*KeyValues) ProtoMessage() {} -func (x *ApplyPutReq) ProtoReflect() protoreflect.Message { +func (x *KeyValues) ProtoReflect() protoreflect.Message { mi := &file_third_third_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -66,90 +61,124 @@ func (x *ApplyPutReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ApplyPutReq.ProtoReflect.Descriptor instead. -func (*ApplyPutReq) Descriptor() ([]byte, []int) { +// Deprecated: Use KeyValues.ProtoReflect.Descriptor instead. +func (*KeyValues) Descriptor() ([]byte, []int) { return file_third_third_proto_rawDescGZIP(), []int{0} } -func (x *ApplyPutReq) GetPutID() string { +func (x *KeyValues) GetKey() string { if x != nil { - return x.PutID + return x.Key } return "" } -func (x *ApplyPutReq) GetName() string { +func (x *KeyValues) GetValues() []string { if x != nil { - return x.Name + return x.Values } - return "" + return nil } -func (x *ApplyPutReq) GetSize() int64 { - if x != nil { - return x.Size +type SignPart struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PartNumber int32 `protobuf:"varint,1,opt,name=partNumber,proto3" json:"partNumber"` + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url"` + Query []*KeyValues `protobuf:"bytes,3,rep,name=query,proto3" json:"query"` + Header []*KeyValues `protobuf:"bytes,4,rep,name=header,proto3" json:"header"` +} + +func (x *SignPart) Reset() { + *x = SignPart{} + if protoimpl.UnsafeEnabled { + mi := &file_third_third_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *ApplyPutReq) GetHash() string { +func (x *SignPart) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignPart) ProtoMessage() {} + +func (x *SignPart) ProtoReflect() protoreflect.Message { + mi := &file_third_third_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignPart.ProtoReflect.Descriptor instead. +func (*SignPart) Descriptor() ([]byte, []int) { + return file_third_third_proto_rawDescGZIP(), []int{1} +} + +func (x *SignPart) GetPartNumber() int32 { if x != nil { - return x.Hash + return x.PartNumber } - return "" + return 0 } -func (x *ApplyPutReq) GetContentType() string { +func (x *SignPart) GetUrl() string { if x != nil { - return x.ContentType + return x.Url } return "" } -func (x *ApplyPutReq) GetFragmentSize() int64 { +func (x *SignPart) GetQuery() []*KeyValues { if x != nil { - return x.FragmentSize + return x.Query } - return 0 + return nil } -func (x *ApplyPutReq) GetValidTime() int64 { +func (x *SignPart) GetHeader() []*KeyValues { if x != nil { - return x.ValidTime + return x.Header } - return 0 + return nil } -type ApplyPutResp struct { +type AuthSignParts struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url"` - PutID string `protobuf:"bytes,2,opt,name=putID,proto3" json:"putID"` - FragmentSize int64 `protobuf:"varint,3,opt,name=fragmentSize,proto3" json:"fragmentSize"` - ValidTime int64 `protobuf:"varint,4,opt,name=validTime,proto3" json:"validTime"` // 上传地址的有效时间 - PutURLsHash string `protobuf:"bytes,5,opt,name=putURLsHash,proto3" json:"putURLsHash"` - PutURLs []string `protobuf:"bytes,6,rep,name=putURLs,proto3" json:"putURLs"` + Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url"` + Query []*KeyValues `protobuf:"bytes,2,rep,name=query,proto3" json:"query"` + Header []*KeyValues `protobuf:"bytes,3,rep,name=header,proto3" json:"header"` + Parts []*SignPart `protobuf:"bytes,4,rep,name=parts,proto3" json:"parts"` } -func (x *ApplyPutResp) Reset() { - *x = ApplyPutResp{} +func (x *AuthSignParts) Reset() { + *x = AuthSignParts{} if protoimpl.UnsafeEnabled { - mi := &file_third_third_proto_msgTypes[1] + mi := &file_third_third_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ApplyPutResp) String() string { +func (x *AuthSignParts) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ApplyPutResp) ProtoMessage() {} +func (*AuthSignParts) ProtoMessage() {} -func (x *ApplyPutResp) ProtoReflect() protoreflect.Message { - mi := &file_third_third_proto_msgTypes[1] +func (x *AuthSignParts) ProtoReflect() protoreflect.Message { + mi := &file_third_third_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -160,78 +189,165 @@ func (x *ApplyPutResp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ApplyPutResp.ProtoReflect.Descriptor instead. -func (*ApplyPutResp) Descriptor() ([]byte, []int) { - return file_third_third_proto_rawDescGZIP(), []int{1} +// Deprecated: Use AuthSignParts.ProtoReflect.Descriptor instead. +func (*AuthSignParts) Descriptor() ([]byte, []int) { + return file_third_third_proto_rawDescGZIP(), []int{2} } -func (x *ApplyPutResp) GetUrl() string { +func (x *AuthSignParts) GetUrl() string { if x != nil { return x.Url } return "" } -func (x *ApplyPutResp) GetPutID() string { +func (x *AuthSignParts) GetQuery() []*KeyValues { if x != nil { - return x.PutID + return x.Query } - return "" + return nil } -func (x *ApplyPutResp) GetFragmentSize() int64 { +func (x *AuthSignParts) GetHeader() []*KeyValues { if x != nil { - return x.FragmentSize + return x.Header } - return 0 + return nil +} + +func (x *AuthSignParts) GetParts() []*SignPart { + if x != nil { + return x.Parts + } + return nil +} + +type PartLimitReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *PartLimitReq) Reset() { + *x = PartLimitReq{} + if protoimpl.UnsafeEnabled { + mi := &file_third_third_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PartLimitReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PartLimitReq) ProtoMessage() {} + +func (x *PartLimitReq) ProtoReflect() protoreflect.Message { + mi := &file_third_third_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PartLimitReq.ProtoReflect.Descriptor instead. +func (*PartLimitReq) Descriptor() ([]byte, []int) { + return file_third_third_proto_rawDescGZIP(), []int{3} +} + +type PartLimitResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MinPartSize int64 `protobuf:"varint,1,opt,name=minPartSize,proto3" json:"minPartSize"` + MaxPartSize int64 `protobuf:"varint,2,opt,name=maxPartSize,proto3" json:"maxPartSize"` + MaxNumSize int32 `protobuf:"varint,3,opt,name=maxNumSize,proto3" json:"maxNumSize"` +} + +func (x *PartLimitResp) Reset() { + *x = PartLimitResp{} + if protoimpl.UnsafeEnabled { + mi := &file_third_third_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PartLimitResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PartLimitResp) ProtoMessage() {} + +func (x *PartLimitResp) ProtoReflect() protoreflect.Message { + mi := &file_third_third_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -func (x *ApplyPutResp) GetValidTime() int64 { +// Deprecated: Use PartLimitResp.ProtoReflect.Descriptor instead. +func (*PartLimitResp) Descriptor() ([]byte, []int) { + return file_third_third_proto_rawDescGZIP(), []int{4} +} + +func (x *PartLimitResp) GetMinPartSize() int64 { if x != nil { - return x.ValidTime + return x.MinPartSize } return 0 } -func (x *ApplyPutResp) GetPutURLsHash() string { +func (x *PartLimitResp) GetMaxPartSize() int64 { if x != nil { - return x.PutURLsHash + return x.MaxPartSize } - return "" + return 0 } -func (x *ApplyPutResp) GetPutURLs() []string { +func (x *PartLimitResp) GetMaxNumSize() int32 { if x != nil { - return x.PutURLs + return x.MaxNumSize } - return nil + return 0 } -type ConfirmPutReq struct { +type PartSizeReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PutID string `protobuf:"bytes,1,opt,name=putID,proto3" json:"putID"` + Size int64 `protobuf:"varint,1,opt,name=size,proto3" json:"size"` } -func (x *ConfirmPutReq) Reset() { - *x = ConfirmPutReq{} +func (x *PartSizeReq) Reset() { + *x = PartSizeReq{} if protoimpl.UnsafeEnabled { - mi := &file_third_third_proto_msgTypes[2] + mi := &file_third_third_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ConfirmPutReq) String() string { +func (x *PartSizeReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ConfirmPutReq) ProtoMessage() {} +func (*PartSizeReq) ProtoMessage() {} -func (x *ConfirmPutReq) ProtoReflect() protoreflect.Message { - mi := &file_third_third_proto_msgTypes[2] +func (x *PartSizeReq) ProtoReflect() protoreflect.Message { + mi := &file_third_third_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -242,43 +358,43 @@ func (x *ConfirmPutReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ConfirmPutReq.ProtoReflect.Descriptor instead. -func (*ConfirmPutReq) Descriptor() ([]byte, []int) { - return file_third_third_proto_rawDescGZIP(), []int{2} +// Deprecated: Use PartSizeReq.ProtoReflect.Descriptor instead. +func (*PartSizeReq) Descriptor() ([]byte, []int) { + return file_third_third_proto_rawDescGZIP(), []int{5} } -func (x *ConfirmPutReq) GetPutID() string { +func (x *PartSizeReq) GetSize() int64 { if x != nil { - return x.PutID + return x.Size } - return "" + return 0 } -type ConfirmPutResp struct { +type PartSizeResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url"` + Size int64 `protobuf:"varint,2,opt,name=size,proto3" json:"size"` } -func (x *ConfirmPutResp) Reset() { - *x = ConfirmPutResp{} +func (x *PartSizeResp) Reset() { + *x = PartSizeResp{} if protoimpl.UnsafeEnabled { - mi := &file_third_third_proto_msgTypes[3] + mi := &file_third_third_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ConfirmPutResp) String() string { +func (x *PartSizeResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ConfirmPutResp) ProtoMessage() {} +func (*PartSizeResp) ProtoMessage() {} -func (x *ConfirmPutResp) ProtoReflect() protoreflect.Message { - mi := &file_third_third_proto_msgTypes[3] +func (x *PartSizeResp) ProtoReflect() protoreflect.Message { + mi := &file_third_third_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -289,45 +405,49 @@ func (x *ConfirmPutResp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ConfirmPutResp.ProtoReflect.Descriptor instead. -func (*ConfirmPutResp) Descriptor() ([]byte, []int) { - return file_third_third_proto_rawDescGZIP(), []int{3} +// Deprecated: Use PartSizeResp.ProtoReflect.Descriptor instead. +func (*PartSizeResp) Descriptor() ([]byte, []int) { + return file_third_third_proto_rawDescGZIP(), []int{6} } -func (x *ConfirmPutResp) GetUrl() string { +func (x *PartSizeResp) GetSize() int64 { if x != nil { - return x.Url + return x.Size } - return "" + return 0 } -type GetUrlReq struct { +type InitiateMultipartUploadReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name"` // 文件名 - Expires int64 `protobuf:"varint,2,opt,name=expires,proto3" json:"expires"` // url有效时间 - Attachment bool `protobuf:"varint,3,opt,name=attachment,proto3" json:"attachment"` // 是否是附件 + Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash"` + Size int64 `protobuf:"varint,2,opt,name=size,proto3" json:"size"` + PartSize int64 `protobuf:"varint,3,opt,name=partSize,proto3" json:"partSize"` + MaxParts int32 `protobuf:"varint,4,opt,name=maxParts,proto3" json:"maxParts"` + Cause string `protobuf:"bytes,5,opt,name=cause,proto3" json:"cause"` + Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name"` + ContentType string `protobuf:"bytes,7,opt,name=contentType,proto3" json:"contentType"` } -func (x *GetUrlReq) Reset() { - *x = GetUrlReq{} +func (x *InitiateMultipartUploadReq) Reset() { + *x = InitiateMultipartUploadReq{} if protoimpl.UnsafeEnabled { - mi := &file_third_third_proto_msgTypes[4] + mi := &file_third_third_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetUrlReq) String() string { +func (x *InitiateMultipartUploadReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetUrlReq) ProtoMessage() {} +func (*InitiateMultipartUploadReq) ProtoMessage() {} -func (x *GetUrlReq) ProtoReflect() protoreflect.Message { - mi := &file_third_third_proto_msgTypes[4] +func (x *InitiateMultipartUploadReq) ProtoReflect() protoreflect.Message { + mi := &file_third_third_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -338,59 +458,88 @@ func (x *GetUrlReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetUrlReq.ProtoReflect.Descriptor instead. -func (*GetUrlReq) Descriptor() ([]byte, []int) { - return file_third_third_proto_rawDescGZIP(), []int{4} +// Deprecated: Use InitiateMultipartUploadReq.ProtoReflect.Descriptor instead. +func (*InitiateMultipartUploadReq) Descriptor() ([]byte, []int) { + return file_third_third_proto_rawDescGZIP(), []int{7} } -func (x *GetUrlReq) GetName() string { +func (x *InitiateMultipartUploadReq) GetHash() string { if x != nil { - return x.Name + return x.Hash } return "" } -func (x *GetUrlReq) GetExpires() int64 { +func (x *InitiateMultipartUploadReq) GetSize() int64 { if x != nil { - return x.Expires + return x.Size } return 0 } -func (x *GetUrlReq) GetAttachment() bool { +func (x *InitiateMultipartUploadReq) GetPartSize() int64 { if x != nil { - return x.Attachment + return x.PartSize } - return false + return 0 } -type GetUrlResp struct { +func (x *InitiateMultipartUploadReq) GetMaxParts() int32 { + if x != nil { + return x.MaxParts + } + return 0 +} + +func (x *InitiateMultipartUploadReq) GetCause() string { + if x != nil { + return x.Cause + } + return "" +} + +func (x *InitiateMultipartUploadReq) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *InitiateMultipartUploadReq) GetContentType() string { + if x != nil { + return x.ContentType + } + return "" +} + +type UploadInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url"` - Size int64 `protobuf:"varint,2,opt,name=size,proto3" json:"size"` - Hash string `protobuf:"bytes,3,opt,name=hash,proto3" json:"hash"` + UploadID string `protobuf:"bytes,1,opt,name=uploadID,proto3" json:"uploadID"` + PartSize int64 `protobuf:"varint,2,opt,name=partSize,proto3" json:"partSize"` + Sign *AuthSignParts `protobuf:"bytes,3,opt,name=sign,proto3" json:"sign"` + ExpireTime int64 `protobuf:"varint,4,opt,name=expireTime,proto3" json:"expireTime"` } -func (x *GetUrlResp) Reset() { - *x = GetUrlResp{} +func (x *UploadInfo) Reset() { + *x = UploadInfo{} if protoimpl.UnsafeEnabled { - mi := &file_third_third_proto_msgTypes[5] + mi := &file_third_third_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetUrlResp) String() string { +func (x *UploadInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetUrlResp) ProtoMessage() {} +func (*UploadInfo) ProtoMessage() {} -func (x *GetUrlResp) ProtoReflect() protoreflect.Message { - mi := &file_third_third_proto_msgTypes[5] +func (x *UploadInfo) ProtoReflect() protoreflect.Message { + mi := &file_third_third_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -401,57 +550,65 @@ func (x *GetUrlResp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetUrlResp.ProtoReflect.Descriptor instead. -func (*GetUrlResp) Descriptor() ([]byte, []int) { - return file_third_third_proto_rawDescGZIP(), []int{5} +// Deprecated: Use UploadInfo.ProtoReflect.Descriptor instead. +func (*UploadInfo) Descriptor() ([]byte, []int) { + return file_third_third_proto_rawDescGZIP(), []int{8} } -func (x *GetUrlResp) GetUrl() string { +func (x *UploadInfo) GetUploadID() string { if x != nil { - return x.Url + return x.UploadID } return "" } -func (x *GetUrlResp) GetSize() int64 { +func (x *UploadInfo) GetPartSize() int64 { if x != nil { - return x.Size + return x.PartSize } return 0 } -func (x *GetUrlResp) GetHash() string { +func (x *UploadInfo) GetSign() *AuthSignParts { if x != nil { - return x.Hash + return x.Sign } - return "" + return nil } -type GetPutReq struct { +func (x *UploadInfo) GetExpireTime() int64 { + if x != nil { + return x.ExpireTime + } + return 0 +} + +type InitiateMultipartUploadResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PutID string `protobuf:"bytes,1,opt,name=putID,proto3" json:"putID"` + Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url"` + Upload *UploadInfo `protobuf:"bytes,2,opt,name=upload,proto3" json:"upload"` } -func (x *GetPutReq) Reset() { - *x = GetPutReq{} +func (x *InitiateMultipartUploadResp) Reset() { + *x = InitiateMultipartUploadResp{} if protoimpl.UnsafeEnabled { - mi := &file_third_third_proto_msgTypes[6] + mi := &file_third_third_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetPutReq) String() string { +func (x *InitiateMultipartUploadResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetPutReq) ProtoMessage() {} +func (*InitiateMultipartUploadResp) ProtoMessage() {} -func (x *GetPutReq) ProtoReflect() protoreflect.Message { - mi := &file_third_third_proto_msgTypes[6] +func (x *InitiateMultipartUploadResp) ProtoReflect() protoreflect.Message { + mi := &file_third_third_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -462,45 +619,51 @@ func (x *GetPutReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetPutReq.ProtoReflect.Descriptor instead. -func (*GetPutReq) Descriptor() ([]byte, []int) { - return file_third_third_proto_rawDescGZIP(), []int{6} +// Deprecated: Use InitiateMultipartUploadResp.ProtoReflect.Descriptor instead. +func (*InitiateMultipartUploadResp) Descriptor() ([]byte, []int) { + return file_third_third_proto_rawDescGZIP(), []int{9} } -func (x *GetPutReq) GetPutID() string { +func (x *InitiateMultipartUploadResp) GetUrl() string { if x != nil { - return x.PutID + return x.Url } return "" } -type GetPutFragment struct { +func (x *InitiateMultipartUploadResp) GetUpload() *UploadInfo { + if x != nil { + return x.Upload + } + return nil +} + +type AuthSignReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Size int64 `protobuf:"varint,1,opt,name=size,proto3" json:"size"` - Hash string `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash"` - Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url"` + UploadID string `protobuf:"bytes,1,opt,name=uploadID,proto3" json:"uploadID"` + PartNumbers []int32 `protobuf:"varint,2,rep,packed,name=partNumbers,proto3" json:"partNumbers"` } -func (x *GetPutFragment) Reset() { - *x = GetPutFragment{} +func (x *AuthSignReq) Reset() { + *x = AuthSignReq{} if protoimpl.UnsafeEnabled { - mi := &file_third_third_proto_msgTypes[7] + mi := &file_third_third_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetPutFragment) String() string { +func (x *AuthSignReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetPutFragment) ProtoMessage() {} +func (*AuthSignReq) ProtoMessage() {} -func (x *GetPutFragment) ProtoReflect() protoreflect.Message { - mi := &file_third_third_proto_msgTypes[7] +func (x *AuthSignReq) ProtoReflect() protoreflect.Message { + mi := &file_third_third_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -511,69 +674,125 @@ func (x *GetPutFragment) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetPutFragment.ProtoReflect.Descriptor instead. -func (*GetPutFragment) Descriptor() ([]byte, []int) { - return file_third_third_proto_rawDescGZIP(), []int{7} +// Deprecated: Use AuthSignReq.ProtoReflect.Descriptor instead. +func (*AuthSignReq) Descriptor() ([]byte, []int) { + return file_third_third_proto_rawDescGZIP(), []int{10} } -func (x *GetPutFragment) GetSize() int64 { +func (x *AuthSignReq) GetUploadID() string { if x != nil { - return x.Size + return x.UploadID } - return 0 + return "" } -func (x *GetPutFragment) GetHash() string { +func (x *AuthSignReq) GetPartNumbers() []int32 { if x != nil { - return x.Hash + return x.PartNumbers } - return "" + return nil +} + +type AuthSignResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url"` + Query []*KeyValues `protobuf:"bytes,2,rep,name=query,proto3" json:"query"` + Header []*KeyValues `protobuf:"bytes,3,rep,name=header,proto3" json:"header"` + Parts []*SignPart `protobuf:"bytes,4,rep,name=parts,proto3" json:"parts"` +} + +func (x *AuthSignResp) Reset() { + *x = AuthSignResp{} + if protoimpl.UnsafeEnabled { + mi := &file_third_third_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AuthSignResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AuthSignResp) ProtoMessage() {} + +func (x *AuthSignResp) ProtoReflect() protoreflect.Message { + mi := &file_third_third_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -func (x *GetPutFragment) GetUrl() string { +// Deprecated: Use AuthSignResp.ProtoReflect.Descriptor instead. +func (*AuthSignResp) Descriptor() ([]byte, []int) { + return file_third_third_proto_rawDescGZIP(), []int{11} +} + +func (x *AuthSignResp) GetUrl() string { if x != nil { return x.Url } return "" } -type GetPutResp struct { +func (x *AuthSignResp) GetQuery() []*KeyValues { + if x != nil { + return x.Query + } + return nil +} + +func (x *AuthSignResp) GetHeader() []*KeyValues { + if x != nil { + return x.Header + } + return nil +} + +func (x *AuthSignResp) GetParts() []*SignPart { + if x != nil { + return x.Parts + } + return nil +} + +type CompleteMultipartUploadReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name"` - Size int64 `protobuf:"varint,2,opt,name=size,proto3" json:"size"` - Hash string `protobuf:"bytes,3,opt,name=hash,proto3" json:"hash"` - FragmentSize int64 `protobuf:"varint,4,opt,name=fragmentSize,proto3" json:"fragmentSize"` - ContentType string `protobuf:"bytes,5,opt,name=contentType,proto3" json:"contentType"` - ValidTime int64 `protobuf:"varint,6,opt,name=validTime,proto3" json:"validTime"` // 上传地址的有效时间 - // repeated GetPutFragment fragments = 7; - // string putURLsHash = 8; - // string putID = 2; - // int64 fragmentSize = 3; - // int64 validTime = 4;// 上传地址的有效时间 - PutURLsHash string `protobuf:"bytes,7,opt,name=putURLsHash,proto3" json:"putURLsHash"` - Fragments []*GetPutFragment `protobuf:"bytes,8,rep,name=fragments,proto3" json:"fragments"` -} - -func (x *GetPutResp) Reset() { - *x = GetPutResp{} + UploadID string `protobuf:"bytes,1,opt,name=uploadID,proto3" json:"uploadID"` + Parts []string `protobuf:"bytes,2,rep,name=parts,proto3" json:"parts"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name"` + ContentType string `protobuf:"bytes,4,opt,name=contentType,proto3" json:"contentType"` + Cause string `protobuf:"bytes,5,opt,name=cause,proto3" json:"cause"` +} + +func (x *CompleteMultipartUploadReq) Reset() { + *x = CompleteMultipartUploadReq{} if protoimpl.UnsafeEnabled { - mi := &file_third_third_proto_msgTypes[8] + mi := &file_third_third_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetPutResp) String() string { +func (x *CompleteMultipartUploadReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetPutResp) ProtoMessage() {} +func (*CompleteMultipartUploadReq) ProtoMessage() {} -func (x *GetPutResp) ProtoReflect() protoreflect.Message { - mi := &file_third_third_proto_msgTypes[8] +func (x *CompleteMultipartUploadReq) ProtoReflect() protoreflect.Message { + mi := &file_third_third_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -584,92 +803,118 @@ func (x *GetPutResp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetPutResp.ProtoReflect.Descriptor instead. -func (*GetPutResp) Descriptor() ([]byte, []int) { - return file_third_third_proto_rawDescGZIP(), []int{8} +// Deprecated: Use CompleteMultipartUploadReq.ProtoReflect.Descriptor instead. +func (*CompleteMultipartUploadReq) Descriptor() ([]byte, []int) { + return file_third_third_proto_rawDescGZIP(), []int{12} } -func (x *GetPutResp) GetName() string { +func (x *CompleteMultipartUploadReq) GetUploadID() string { if x != nil { - return x.Name + return x.UploadID } return "" } -func (x *GetPutResp) GetSize() int64 { +func (x *CompleteMultipartUploadReq) GetParts() []string { if x != nil { - return x.Size + return x.Parts } - return 0 + return nil } -func (x *GetPutResp) GetHash() string { +func (x *CompleteMultipartUploadReq) GetName() string { if x != nil { - return x.Hash + return x.Name } return "" } -func (x *GetPutResp) GetFragmentSize() int64 { +func (x *CompleteMultipartUploadReq) GetContentType() string { if x != nil { - return x.FragmentSize + return x.ContentType } - return 0 + return "" } -func (x *GetPutResp) GetContentType() string { +func (x *CompleteMultipartUploadReq) GetCause() string { if x != nil { - return x.ContentType + return x.Cause } return "" } -func (x *GetPutResp) GetValidTime() int64 { - if x != nil { - return x.ValidTime +type CompleteMultipartUploadResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url"` +} + +func (x *CompleteMultipartUploadResp) Reset() { + *x = CompleteMultipartUploadResp{} + if protoimpl.UnsafeEnabled { + mi := &file_third_third_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *GetPutResp) GetPutURLsHash() string { - if x != nil { - return x.PutURLsHash +func (x *CompleteMultipartUploadResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CompleteMultipartUploadResp) ProtoMessage() {} + +func (x *CompleteMultipartUploadResp) ProtoReflect() protoreflect.Message { + mi := &file_third_third_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) +} + +// Deprecated: Use CompleteMultipartUploadResp.ProtoReflect.Descriptor instead. +func (*CompleteMultipartUploadResp) Descriptor() ([]byte, []int) { + return file_third_third_proto_rawDescGZIP(), []int{13} } -func (x *GetPutResp) GetFragments() []*GetPutFragment { +func (x *CompleteMultipartUploadResp) GetUrl() string { if x != nil { - return x.Fragments + return x.Url } - return nil + return "" } -type GetHashInfoReq struct { +type AccessURLReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name"` } -func (x *GetHashInfoReq) Reset() { - *x = GetHashInfoReq{} +func (x *AccessURLReq) Reset() { + *x = AccessURLReq{} if protoimpl.UnsafeEnabled { - mi := &file_third_third_proto_msgTypes[9] + mi := &file_third_third_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetHashInfoReq) String() string { +func (x *AccessURLReq) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetHashInfoReq) ProtoMessage() {} +func (*AccessURLReq) ProtoMessage() {} -func (x *GetHashInfoReq) ProtoReflect() protoreflect.Message { - mi := &file_third_third_proto_msgTypes[9] +func (x *AccessURLReq) ProtoReflect() protoreflect.Message { + mi := &file_third_third_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -680,44 +925,44 @@ func (x *GetHashInfoReq) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetHashInfoReq.ProtoReflect.Descriptor instead. -func (*GetHashInfoReq) Descriptor() ([]byte, []int) { - return file_third_third_proto_rawDescGZIP(), []int{9} +// Deprecated: Use AccessURLReq.ProtoReflect.Descriptor instead. +func (*AccessURLReq) Descriptor() ([]byte, []int) { + return file_third_third_proto_rawDescGZIP(), []int{14} } -func (x *GetHashInfoReq) GetHash() string { +func (x *AccessURLReq) GetName() string { if x != nil { - return x.Hash + return x.Name } return "" } -type GetHashInfoResp struct { +type AccessURLResp struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash"` - Size int64 `protobuf:"varint,2,opt,name=size,proto3" json:"size"` + Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url"` + ExpireTime int64 `protobuf:"varint,2,opt,name=expireTime,proto3" json:"expireTime"` } -func (x *GetHashInfoResp) Reset() { - *x = GetHashInfoResp{} +func (x *AccessURLResp) Reset() { + *x = AccessURLResp{} if protoimpl.UnsafeEnabled { - mi := &file_third_third_proto_msgTypes[10] + mi := &file_third_third_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetHashInfoResp) String() string { +func (x *AccessURLResp) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetHashInfoResp) ProtoMessage() {} +func (*AccessURLResp) ProtoMessage() {} -func (x *GetHashInfoResp) ProtoReflect() protoreflect.Message { - mi := &file_third_third_proto_msgTypes[10] +func (x *AccessURLResp) ProtoReflect() protoreflect.Message { + mi := &file_third_third_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -728,21 +973,21 @@ func (x *GetHashInfoResp) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetHashInfoResp.ProtoReflect.Descriptor instead. -func (*GetHashInfoResp) Descriptor() ([]byte, []int) { - return file_third_third_proto_rawDescGZIP(), []int{10} +// Deprecated: Use AccessURLResp.ProtoReflect.Descriptor instead. +func (*AccessURLResp) Descriptor() ([]byte, []int) { + return file_third_third_proto_rawDescGZIP(), []int{15} } -func (x *GetHashInfoResp) GetHash() string { +func (x *AccessURLResp) GetUrl() string { if x != nil { - return x.Hash + return x.Url } return "" } -func (x *GetHashInfoResp) GetSize() int64 { +func (x *AccessURLResp) GetExpireTime() int64 { if x != nil { - return x.Size + return x.ExpireTime } return 0 } @@ -761,7 +1006,7 @@ type FcmUpdateTokenReq struct { func (x *FcmUpdateTokenReq) Reset() { *x = FcmUpdateTokenReq{} if protoimpl.UnsafeEnabled { - mi := &file_third_third_proto_msgTypes[11] + mi := &file_third_third_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -774,7 +1019,7 @@ func (x *FcmUpdateTokenReq) String() string { func (*FcmUpdateTokenReq) ProtoMessage() {} func (x *FcmUpdateTokenReq) ProtoReflect() protoreflect.Message { - mi := &file_third_third_proto_msgTypes[11] + mi := &file_third_third_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -787,7 +1032,7 @@ func (x *FcmUpdateTokenReq) ProtoReflect() protoreflect.Message { // Deprecated: Use FcmUpdateTokenReq.ProtoReflect.Descriptor instead. func (*FcmUpdateTokenReq) Descriptor() ([]byte, []int) { - return file_third_third_proto_rawDescGZIP(), []int{11} + return file_third_third_proto_rawDescGZIP(), []int{16} } func (x *FcmUpdateTokenReq) GetPlatformID() int32 { @@ -827,7 +1072,7 @@ type FcmUpdateTokenResp struct { func (x *FcmUpdateTokenResp) Reset() { *x = FcmUpdateTokenResp{} if protoimpl.UnsafeEnabled { - mi := &file_third_third_proto_msgTypes[12] + mi := &file_third_third_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -840,7 +1085,7 @@ func (x *FcmUpdateTokenResp) String() string { func (*FcmUpdateTokenResp) ProtoMessage() {} func (x *FcmUpdateTokenResp) ProtoReflect() protoreflect.Message { - mi := &file_third_third_proto_msgTypes[12] + mi := &file_third_third_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -853,7 +1098,7 @@ func (x *FcmUpdateTokenResp) ProtoReflect() protoreflect.Message { // Deprecated: Use FcmUpdateTokenResp.ProtoReflect.Descriptor instead. func (*FcmUpdateTokenResp) Descriptor() ([]byte, []int) { - return file_third_third_proto_rawDescGZIP(), []int{12} + return file_third_third_proto_rawDescGZIP(), []int{17} } type SetAppBadgeReq struct { @@ -868,7 +1113,7 @@ type SetAppBadgeReq struct { func (x *SetAppBadgeReq) Reset() { *x = SetAppBadgeReq{} if protoimpl.UnsafeEnabled { - mi := &file_third_third_proto_msgTypes[13] + mi := &file_third_third_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -881,7 +1126,7 @@ func (x *SetAppBadgeReq) String() string { func (*SetAppBadgeReq) ProtoMessage() {} func (x *SetAppBadgeReq) ProtoReflect() protoreflect.Message { - mi := &file_third_third_proto_msgTypes[13] + mi := &file_third_third_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -894,7 +1139,7 @@ func (x *SetAppBadgeReq) ProtoReflect() protoreflect.Message { // Deprecated: Use SetAppBadgeReq.ProtoReflect.Descriptor instead. func (*SetAppBadgeReq) Descriptor() ([]byte, []int) { - return file_third_third_proto_rawDescGZIP(), []int{13} + return file_third_third_proto_rawDescGZIP(), []int{18} } func (x *SetAppBadgeReq) GetUserID() string { @@ -920,7 +1165,7 @@ type SetAppBadgeResp struct { func (x *SetAppBadgeResp) Reset() { *x = SetAppBadgeResp{} if protoimpl.UnsafeEnabled { - mi := &file_third_third_proto_msgTypes[14] + mi := &file_third_third_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -933,7 +1178,7 @@ func (x *SetAppBadgeResp) String() string { func (*SetAppBadgeResp) ProtoMessage() {} func (x *SetAppBadgeResp) ProtoReflect() protoreflect.Message { - mi := &file_third_third_proto_msgTypes[14] + mi := &file_third_third_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -946,7 +1191,7 @@ func (x *SetAppBadgeResp) ProtoReflect() protoreflect.Message { // Deprecated: Use SetAppBadgeResp.ProtoReflect.Descriptor instead. func (*SetAppBadgeResp) Descriptor() ([]byte, []int) { - return file_third_third_proto_rawDescGZIP(), []int{14} + return file_third_third_proto_rawDescGZIP(), []int{19} } var File_third_third_proto protoreflect.FileDescriptor @@ -954,133 +1199,180 @@ var File_third_third_proto protoreflect.FileDescriptor var file_third_third_proto_rawDesc = []byte{ 0x0a, 0x11, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2f, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x22, 0xc3, 0x01, 0x0a, 0x0b, 0x41, 0x70, 0x70, 0x6c, - 0x79, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x75, 0x74, 0x49, 0x44, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x75, 0x74, 0x49, 0x44, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x66, - 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0c, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xb4, 0x01, - 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, - 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x75, 0x74, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x75, 0x74, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x66, 0x72, - 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x75, 0x74, 0x55, - 0x52, 0x4c, 0x73, 0x48, 0x61, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, - 0x75, 0x74, 0x55, 0x52, 0x4c, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x75, - 0x74, 0x55, 0x52, 0x4c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x75, 0x74, - 0x55, 0x52, 0x4c, 0x73, 0x22, 0x25, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x50, - 0x75, 0x74, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x75, 0x74, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x75, 0x74, 0x49, 0x44, 0x22, 0x22, 0x0a, 0x0e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, - 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, - 0x59, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x55, 0x72, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, - 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x46, 0x0a, 0x0a, 0x47, 0x65, - 0x74, 0x55, 0x72, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, - 0x73, 0x68, 0x22, 0x21, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x12, - 0x14, 0x0a, 0x05, 0x70, 0x75, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x70, 0x75, 0x74, 0x49, 0x44, 0x22, 0x4a, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x74, 0x46, - 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, - 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, - 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, - 0x6c, 0x22, 0x90, 0x02, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0c, - 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, + 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x22, 0x35, 0x0a, 0x09, 0x4b, 0x65, 0x79, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa8, + 0x01, 0x0a, 0x08, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x70, + 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x33, 0x0a, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, + 0x64, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x35, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0xc1, 0x01, 0x0a, 0x0d, 0x41, 0x75, + 0x74, 0x68, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x72, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x33, 0x0a, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, + 0x64, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x35, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x05, 0x70, 0x61, 0x72, + 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, + 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x53, 0x69, + 0x67, 0x6e, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x22, 0x0e, 0x0a, + 0x0c, 0x50, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x22, 0x73, 0x0a, + 0x0d, 0x50, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x20, + 0x0a, 0x0b, 0x6d, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x74, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x50, 0x61, 0x72, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x50, 0x61, 0x72, 0x74, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x4e, 0x75, 0x6d, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x4e, 0x75, 0x6d, 0x53, 0x69, + 0x7a, 0x65, 0x22, 0x21, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x52, 0x65, + 0x71, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x22, 0x0a, 0x0c, 0x50, 0x61, 0x72, 0x74, 0x53, 0x69, 0x7a, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0xc8, 0x01, 0x0a, 0x1a, 0x49, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x08, 0x70, 0x61, 0x72, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x6d, 0x61, 0x78, 0x50, 0x61, 0x72, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x6d, 0x61, 0x78, 0x50, 0x61, 0x72, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x22, 0x9b, 0x01, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x08, 0x70, 0x61, 0x72, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x35, 0x0a, 0x04, 0x73, + 0x69, 0x67, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x41, + 0x75, 0x74, 0x68, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x72, 0x74, 0x73, 0x52, 0x04, 0x73, 0x69, + 0x67, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x22, 0x67, 0x0a, 0x1b, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x72, 0x6c, 0x12, 0x36, 0x0a, 0x06, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x4b, 0x0a, 0x0b, 0x41, + 0x75, 0x74, 0x68, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0xc0, 0x01, 0x0a, 0x0c, 0x41, 0x75, 0x74, + 0x68, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x33, 0x0a, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, + 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x35, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, + 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x53, 0x69, 0x67, 0x6e, + 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x1a, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, + 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x69, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x75, 0x74, 0x55, 0x52, 0x4c, 0x73, 0x48, 0x61, 0x73, 0x68, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x75, 0x74, 0x55, 0x52, 0x4c, 0x73, 0x48, 0x61, - 0x73, 0x68, 0x12, 0x40, 0x0a, 0x09, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, - 0x74, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x09, 0x66, 0x72, 0x61, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x22, 0x24, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x48, 0x61, 0x73, 0x68, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0x39, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x12, 0x0a, - 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, - 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x89, 0x01, 0x0a, 0x11, 0x46, 0x63, 0x6d, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x70, - 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x66, - 0x63, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, - 0x63, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x22, 0x14, 0x0a, 0x12, 0x46, 0x63, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x22, 0x50, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x41, 0x70, - 0x70, 0x42, 0x61, 0x64, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x44, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x55, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x61, 0x70, 0x70, 0x55, 0x6e, - 0x72, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x11, 0x0a, 0x0f, 0x53, 0x65, 0x74, - 0x41, 0x70, 0x70, 0x42, 0x61, 0x64, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x32, 0xce, 0x04, 0x0a, - 0x05, 0x74, 0x68, 0x69, 0x72, 0x64, 0x12, 0x4d, 0x0a, 0x08, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, - 0x75, 0x74, 0x12, 0x1f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x75, 0x74, - 0x52, 0x65, 0x71, 0x1a, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x75, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x47, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x50, 0x75, 0x74, 0x12, - 0x1d, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, - 0x68, 0x69, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1e, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x22, 0x2f, 0x0a, 0x1b, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x22, 0x0a, 0x0c, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x41, 0x0a, + 0x0d, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, + 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, + 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x22, 0x89, 0x01, 0x0a, 0x11, 0x46, 0x63, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, + 0x72, 0x6d, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x6c, 0x61, 0x74, + 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x63, 0x6d, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x63, 0x6d, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x14, 0x0a, 0x12, + 0x46, 0x63, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x22, 0x50, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x41, 0x70, 0x70, 0x42, 0x61, 0x64, 0x67, + 0x65, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x0e, + 0x61, 0x70, 0x70, 0x55, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x61, 0x70, 0x70, 0x55, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x11, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x41, 0x70, 0x70, 0x42, 0x61, + 0x64, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x32, 0xfa, 0x05, 0x0a, 0x05, 0x74, 0x68, 0x69, 0x72, + 0x64, 0x12, 0x50, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, - 0x69, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x53, - 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x50, 0x75, 0x74, 0x12, 0x21, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, - 0x64, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x1a, - 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, - 0x68, 0x69, 0x72, 0x64, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x50, 0x75, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x12, 0x47, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x1d, 0x2e, + 0x69, 0x72, 0x64, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, + 0x1a, 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x12, 0x4d, 0x0a, 0x08, 0x50, 0x61, 0x72, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x1f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, + 0x68, 0x69, 0x72, 0x64, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, + 0x1a, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x7a, 0x0a, 0x17, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, - 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x72, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x1e, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, - 0x64, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x72, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x56, 0x0a, 0x0b, - 0x47, 0x65, 0x74, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x4f, 0x70, + 0x72, 0x64, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x2f, 0x2e, + 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, + 0x72, 0x64, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x4d, + 0x0a, 0x08, 0x41, 0x75, 0x74, 0x68, 0x53, 0x69, 0x67, 0x6e, 0x12, 0x1f, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, + 0x41, 0x75, 0x74, 0x68, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, - 0x2e, 0x47, 0x65, 0x74, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, - 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, - 0x68, 0x69, 0x72, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x5f, 0x0a, 0x0e, 0x46, 0x63, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x25, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x46, 0x63, 0x6d, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x26, 0x2e, + 0x2e, 0x41, 0x75, 0x74, 0x68, 0x53, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x7a, 0x0a, + 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, + 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, + 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x2f, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, + 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x50, 0x0a, 0x09, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x55, 0x52, 0x4c, 0x12, 0x20, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x1a, 0x21, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, + 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5f, 0x0a, 0x0e, 0x46, + 0x63, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x25, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x46, 0x63, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x56, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x41, 0x70, 0x70, 0x42, - 0x61, 0x64, 0x67, 0x65, 0x12, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x70, 0x70, - 0x42, 0x61, 0x64, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, - 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x53, 0x65, - 0x74, 0x41, 0x70, 0x70, 0x42, 0x61, 0x64, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x42, 0x35, 0x5a, - 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x70, 0x65, 0x6e, - 0x49, 0x4d, 0x53, 0x44, 0x4b, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x2d, 0x49, 0x4d, 0x2d, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, - 0x68, 0x69, 0x72, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x26, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, 0x2e, 0x46, 0x63, 0x6d, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x56, 0x0a, 0x0b, + 0x53, 0x65, 0x74, 0x41, 0x70, 0x70, 0x42, 0x61, 0x64, 0x67, 0x65, 0x12, 0x22, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, 0x68, 0x69, 0x72, 0x64, + 0x2e, 0x53, 0x65, 0x74, 0x41, 0x70, 0x70, 0x42, 0x61, 0x64, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, + 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x74, + 0x68, 0x69, 0x72, 0x64, 0x2e, 0x53, 0x65, 0x74, 0x41, 0x70, 0x70, 0x42, 0x61, 0x64, 0x67, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x44, 0x4b, 0x2f, 0x4f, 0x70, 0x65, + 0x6e, 0x2d, 0x49, 0x4d, 0x2d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x6b, 0x67, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x68, 0x69, 0x72, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -1095,45 +1387,61 @@ func file_third_third_proto_rawDescGZIP() []byte { return file_third_third_proto_rawDescData } -var file_third_third_proto_msgTypes = make([]protoimpl.MessageInfo, 15) +var file_third_third_proto_msgTypes = make([]protoimpl.MessageInfo, 20) var file_third_third_proto_goTypes = []interface{}{ - (*ApplyPutReq)(nil), // 0: OpenIMServer.third.ApplyPutReq - (*ApplyPutResp)(nil), // 1: OpenIMServer.third.ApplyPutResp - (*ConfirmPutReq)(nil), // 2: OpenIMServer.third.ConfirmPutReq - (*ConfirmPutResp)(nil), // 3: OpenIMServer.third.ConfirmPutResp - (*GetUrlReq)(nil), // 4: OpenIMServer.third.GetUrlReq - (*GetUrlResp)(nil), // 5: OpenIMServer.third.GetUrlResp - (*GetPutReq)(nil), // 6: OpenIMServer.third.GetPutReq - (*GetPutFragment)(nil), // 7: OpenIMServer.third.GetPutFragment - (*GetPutResp)(nil), // 8: OpenIMServer.third.GetPutResp - (*GetHashInfoReq)(nil), // 9: OpenIMServer.third.GetHashInfoReq - (*GetHashInfoResp)(nil), // 10: OpenIMServer.third.GetHashInfoResp - (*FcmUpdateTokenReq)(nil), // 11: OpenIMServer.third.FcmUpdateTokenReq - (*FcmUpdateTokenResp)(nil), // 12: OpenIMServer.third.FcmUpdateTokenResp - (*SetAppBadgeReq)(nil), // 13: OpenIMServer.third.SetAppBadgeReq - (*SetAppBadgeResp)(nil), // 14: OpenIMServer.third.SetAppBadgeResp + (*KeyValues)(nil), // 0: OpenIMServer.third.KeyValues + (*SignPart)(nil), // 1: OpenIMServer.third.SignPart + (*AuthSignParts)(nil), // 2: OpenIMServer.third.AuthSignParts + (*PartLimitReq)(nil), // 3: OpenIMServer.third.PartLimitReq + (*PartLimitResp)(nil), // 4: OpenIMServer.third.PartLimitResp + (*PartSizeReq)(nil), // 5: OpenIMServer.third.PartSizeReq + (*PartSizeResp)(nil), // 6: OpenIMServer.third.PartSizeResp + (*InitiateMultipartUploadReq)(nil), // 7: OpenIMServer.third.InitiateMultipartUploadReq + (*UploadInfo)(nil), // 8: OpenIMServer.third.UploadInfo + (*InitiateMultipartUploadResp)(nil), // 9: OpenIMServer.third.InitiateMultipartUploadResp + (*AuthSignReq)(nil), // 10: OpenIMServer.third.AuthSignReq + (*AuthSignResp)(nil), // 11: OpenIMServer.third.AuthSignResp + (*CompleteMultipartUploadReq)(nil), // 12: OpenIMServer.third.CompleteMultipartUploadReq + (*CompleteMultipartUploadResp)(nil), // 13: OpenIMServer.third.CompleteMultipartUploadResp + (*AccessURLReq)(nil), // 14: OpenIMServer.third.AccessURLReq + (*AccessURLResp)(nil), // 15: OpenIMServer.third.AccessURLResp + (*FcmUpdateTokenReq)(nil), // 16: OpenIMServer.third.FcmUpdateTokenReq + (*FcmUpdateTokenResp)(nil), // 17: OpenIMServer.third.FcmUpdateTokenResp + (*SetAppBadgeReq)(nil), // 18: OpenIMServer.third.SetAppBadgeReq + (*SetAppBadgeResp)(nil), // 19: OpenIMServer.third.SetAppBadgeResp } var file_third_third_proto_depIdxs = []int32{ - 7, // 0: OpenIMServer.third.GetPutResp.fragments:type_name -> OpenIMServer.third.GetPutFragment - 0, // 1: OpenIMServer.third.third.ApplyPut:input_type -> OpenIMServer.third.ApplyPutReq - 6, // 2: OpenIMServer.third.third.GetPut:input_type -> OpenIMServer.third.GetPutReq - 2, // 3: OpenIMServer.third.third.ConfirmPut:input_type -> OpenIMServer.third.ConfirmPutReq - 4, // 4: OpenIMServer.third.third.GetUrl:input_type -> OpenIMServer.third.GetUrlReq - 9, // 5: OpenIMServer.third.third.GetHashInfo:input_type -> OpenIMServer.third.GetHashInfoReq - 11, // 6: OpenIMServer.third.third.FcmUpdateToken:input_type -> OpenIMServer.third.FcmUpdateTokenReq - 13, // 7: OpenIMServer.third.third.SetAppBadge:input_type -> OpenIMServer.third.SetAppBadgeReq - 1, // 8: OpenIMServer.third.third.ApplyPut:output_type -> OpenIMServer.third.ApplyPutResp - 8, // 9: OpenIMServer.third.third.GetPut:output_type -> OpenIMServer.third.GetPutResp - 3, // 10: OpenIMServer.third.third.ConfirmPut:output_type -> OpenIMServer.third.ConfirmPutResp - 5, // 11: OpenIMServer.third.third.GetUrl:output_type -> OpenIMServer.third.GetUrlResp - 10, // 12: OpenIMServer.third.third.GetHashInfo:output_type -> OpenIMServer.third.GetHashInfoResp - 12, // 13: OpenIMServer.third.third.FcmUpdateToken:output_type -> OpenIMServer.third.FcmUpdateTokenResp - 14, // 14: OpenIMServer.third.third.SetAppBadge:output_type -> OpenIMServer.third.SetAppBadgeResp - 8, // [8:15] is the sub-list for method output_type - 1, // [1:8] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name + 0, // 0: OpenIMServer.third.SignPart.query:type_name -> OpenIMServer.third.KeyValues + 0, // 1: OpenIMServer.third.SignPart.header:type_name -> OpenIMServer.third.KeyValues + 0, // 2: OpenIMServer.third.AuthSignParts.query:type_name -> OpenIMServer.third.KeyValues + 0, // 3: OpenIMServer.third.AuthSignParts.header:type_name -> OpenIMServer.third.KeyValues + 1, // 4: OpenIMServer.third.AuthSignParts.parts:type_name -> OpenIMServer.third.SignPart + 2, // 5: OpenIMServer.third.UploadInfo.sign:type_name -> OpenIMServer.third.AuthSignParts + 8, // 6: OpenIMServer.third.InitiateMultipartUploadResp.upload:type_name -> OpenIMServer.third.UploadInfo + 0, // 7: OpenIMServer.third.AuthSignResp.query:type_name -> OpenIMServer.third.KeyValues + 0, // 8: OpenIMServer.third.AuthSignResp.header:type_name -> OpenIMServer.third.KeyValues + 1, // 9: OpenIMServer.third.AuthSignResp.parts:type_name -> OpenIMServer.third.SignPart + 3, // 10: OpenIMServer.third.third.PartLimit:input_type -> OpenIMServer.third.PartLimitReq + 5, // 11: OpenIMServer.third.third.PartSize:input_type -> OpenIMServer.third.PartSizeReq + 7, // 12: OpenIMServer.third.third.InitiateMultipartUpload:input_type -> OpenIMServer.third.InitiateMultipartUploadReq + 10, // 13: OpenIMServer.third.third.AuthSign:input_type -> OpenIMServer.third.AuthSignReq + 12, // 14: OpenIMServer.third.third.CompleteMultipartUpload:input_type -> OpenIMServer.third.CompleteMultipartUploadReq + 14, // 15: OpenIMServer.third.third.AccessURL:input_type -> OpenIMServer.third.AccessURLReq + 16, // 16: OpenIMServer.third.third.FcmUpdateToken:input_type -> OpenIMServer.third.FcmUpdateTokenReq + 18, // 17: OpenIMServer.third.third.SetAppBadge:input_type -> OpenIMServer.third.SetAppBadgeReq + 4, // 18: OpenIMServer.third.third.PartLimit:output_type -> OpenIMServer.third.PartLimitResp + 6, // 19: OpenIMServer.third.third.PartSize:output_type -> OpenIMServer.third.PartSizeResp + 9, // 20: OpenIMServer.third.third.InitiateMultipartUpload:output_type -> OpenIMServer.third.InitiateMultipartUploadResp + 11, // 21: OpenIMServer.third.third.AuthSign:output_type -> OpenIMServer.third.AuthSignResp + 13, // 22: OpenIMServer.third.third.CompleteMultipartUpload:output_type -> OpenIMServer.third.CompleteMultipartUploadResp + 15, // 23: OpenIMServer.third.third.AccessURL:output_type -> OpenIMServer.third.AccessURLResp + 17, // 24: OpenIMServer.third.third.FcmUpdateToken:output_type -> OpenIMServer.third.FcmUpdateTokenResp + 19, // 25: OpenIMServer.third.third.SetAppBadge:output_type -> OpenIMServer.third.SetAppBadgeResp + 18, // [18:26] is the sub-list for method output_type + 10, // [10:18] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name } func init() { file_third_third_proto_init() } @@ -1143,7 +1451,7 @@ func file_third_third_proto_init() { } if !protoimpl.UnsafeEnabled { file_third_third_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApplyPutReq); i { + switch v := v.(*KeyValues); i { case 0: return &v.state case 1: @@ -1155,7 +1463,7 @@ func file_third_third_proto_init() { } } file_third_third_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApplyPutResp); i { + switch v := v.(*SignPart); i { case 0: return &v.state case 1: @@ -1167,7 +1475,7 @@ func file_third_third_proto_init() { } } file_third_third_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConfirmPutReq); i { + switch v := v.(*AuthSignParts); i { case 0: return &v.state case 1: @@ -1179,7 +1487,7 @@ func file_third_third_proto_init() { } } file_third_third_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConfirmPutResp); i { + switch v := v.(*PartLimitReq); i { case 0: return &v.state case 1: @@ -1191,7 +1499,7 @@ func file_third_third_proto_init() { } } file_third_third_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUrlReq); i { + switch v := v.(*PartLimitResp); i { case 0: return &v.state case 1: @@ -1203,7 +1511,7 @@ func file_third_third_proto_init() { } } file_third_third_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUrlResp); i { + switch v := v.(*PartSizeReq); i { case 0: return &v.state case 1: @@ -1215,7 +1523,7 @@ func file_third_third_proto_init() { } } file_third_third_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPutReq); i { + switch v := v.(*PartSizeResp); i { case 0: return &v.state case 1: @@ -1227,7 +1535,7 @@ func file_third_third_proto_init() { } } file_third_third_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPutFragment); i { + switch v := v.(*InitiateMultipartUploadReq); i { case 0: return &v.state case 1: @@ -1239,7 +1547,7 @@ func file_third_third_proto_init() { } } file_third_third_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPutResp); i { + switch v := v.(*UploadInfo); i { case 0: return &v.state case 1: @@ -1251,7 +1559,7 @@ func file_third_third_proto_init() { } } file_third_third_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetHashInfoReq); i { + switch v := v.(*InitiateMultipartUploadResp); i { case 0: return &v.state case 1: @@ -1263,7 +1571,7 @@ func file_third_third_proto_init() { } } file_third_third_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetHashInfoResp); i { + switch v := v.(*AuthSignReq); i { case 0: return &v.state case 1: @@ -1275,7 +1583,7 @@ func file_third_third_proto_init() { } } file_third_third_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FcmUpdateTokenReq); i { + switch v := v.(*AuthSignResp); i { case 0: return &v.state case 1: @@ -1287,7 +1595,7 @@ func file_third_third_proto_init() { } } file_third_third_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FcmUpdateTokenResp); i { + switch v := v.(*CompleteMultipartUploadReq); i { case 0: return &v.state case 1: @@ -1299,7 +1607,7 @@ func file_third_third_proto_init() { } } file_third_third_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetAppBadgeReq); i { + switch v := v.(*CompleteMultipartUploadResp); i { case 0: return &v.state case 1: @@ -1311,6 +1619,66 @@ func file_third_third_proto_init() { } } file_third_third_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccessURLReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_third_third_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AccessURLResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_third_third_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FcmUpdateTokenReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_third_third_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FcmUpdateTokenResp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_third_third_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetAppBadgeReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_third_third_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetAppBadgeResp); i { case 0: return &v.state @@ -1329,7 +1697,7 @@ func file_third_third_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_third_third_proto_rawDesc, NumEnums: 0, - NumMessages: 15, + NumMessages: 20, NumExtensions: 0, NumServices: 1, }, @@ -1355,11 +1723,12 @@ const _ = grpc.SupportPackageIsVersion6 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type ThirdClient interface { - ApplyPut(ctx context.Context, in *ApplyPutReq, opts ...grpc.CallOption) (*ApplyPutResp, error) - GetPut(ctx context.Context, in *GetPutReq, opts ...grpc.CallOption) (*GetPutResp, error) - ConfirmPut(ctx context.Context, in *ConfirmPutReq, opts ...grpc.CallOption) (*ConfirmPutResp, error) - GetUrl(ctx context.Context, in *GetUrlReq, opts ...grpc.CallOption) (*GetUrlResp, error) - GetHashInfo(ctx context.Context, in *GetHashInfoReq, opts ...grpc.CallOption) (*GetHashInfoResp, error) + PartLimit(ctx context.Context, in *PartLimitReq, opts ...grpc.CallOption) (*PartLimitResp, error) + PartSize(ctx context.Context, in *PartSizeReq, opts ...grpc.CallOption) (*PartSizeResp, error) + InitiateMultipartUpload(ctx context.Context, in *InitiateMultipartUploadReq, opts ...grpc.CallOption) (*InitiateMultipartUploadResp, error) + AuthSign(ctx context.Context, in *AuthSignReq, opts ...grpc.CallOption) (*AuthSignResp, error) + CompleteMultipartUpload(ctx context.Context, in *CompleteMultipartUploadReq, opts ...grpc.CallOption) (*CompleteMultipartUploadResp, error) + AccessURL(ctx context.Context, in *AccessURLReq, opts ...grpc.CallOption) (*AccessURLResp, error) FcmUpdateToken(ctx context.Context, in *FcmUpdateTokenReq, opts ...grpc.CallOption) (*FcmUpdateTokenResp, error) SetAppBadge(ctx context.Context, in *SetAppBadgeReq, opts ...grpc.CallOption) (*SetAppBadgeResp, error) } @@ -1372,45 +1741,54 @@ func NewThirdClient(cc grpc.ClientConnInterface) ThirdClient { return &thirdClient{cc} } -func (c *thirdClient) ApplyPut(ctx context.Context, in *ApplyPutReq, opts ...grpc.CallOption) (*ApplyPutResp, error) { - out := new(ApplyPutResp) - err := c.cc.Invoke(ctx, "/OpenIMServer.third.third/ApplyPut", in, out, opts...) +func (c *thirdClient) PartLimit(ctx context.Context, in *PartLimitReq, opts ...grpc.CallOption) (*PartLimitResp, error) { + out := new(PartLimitResp) + err := c.cc.Invoke(ctx, "/OpenIMServer.third.third/PartLimit", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *thirdClient) GetPut(ctx context.Context, in *GetPutReq, opts ...grpc.CallOption) (*GetPutResp, error) { - out := new(GetPutResp) - err := c.cc.Invoke(ctx, "/OpenIMServer.third.third/GetPut", in, out, opts...) +func (c *thirdClient) PartSize(ctx context.Context, in *PartSizeReq, opts ...grpc.CallOption) (*PartSizeResp, error) { + out := new(PartSizeResp) + err := c.cc.Invoke(ctx, "/OpenIMServer.third.third/PartSize", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *thirdClient) ConfirmPut(ctx context.Context, in *ConfirmPutReq, opts ...grpc.CallOption) (*ConfirmPutResp, error) { - out := new(ConfirmPutResp) - err := c.cc.Invoke(ctx, "/OpenIMServer.third.third/ConfirmPut", in, out, opts...) +func (c *thirdClient) InitiateMultipartUpload(ctx context.Context, in *InitiateMultipartUploadReq, opts ...grpc.CallOption) (*InitiateMultipartUploadResp, error) { + out := new(InitiateMultipartUploadResp) + err := c.cc.Invoke(ctx, "/OpenIMServer.third.third/InitiateMultipartUpload", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *thirdClient) GetUrl(ctx context.Context, in *GetUrlReq, opts ...grpc.CallOption) (*GetUrlResp, error) { - out := new(GetUrlResp) - err := c.cc.Invoke(ctx, "/OpenIMServer.third.third/GetUrl", in, out, opts...) +func (c *thirdClient) AuthSign(ctx context.Context, in *AuthSignReq, opts ...grpc.CallOption) (*AuthSignResp, error) { + out := new(AuthSignResp) + err := c.cc.Invoke(ctx, "/OpenIMServer.third.third/AuthSign", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *thirdClient) GetHashInfo(ctx context.Context, in *GetHashInfoReq, opts ...grpc.CallOption) (*GetHashInfoResp, error) { - out := new(GetHashInfoResp) - err := c.cc.Invoke(ctx, "/OpenIMServer.third.third/GetHashInfo", in, out, opts...) +func (c *thirdClient) CompleteMultipartUpload(ctx context.Context, in *CompleteMultipartUploadReq, opts ...grpc.CallOption) (*CompleteMultipartUploadResp, error) { + out := new(CompleteMultipartUploadResp) + err := c.cc.Invoke(ctx, "/OpenIMServer.third.third/CompleteMultipartUpload", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *thirdClient) AccessURL(ctx context.Context, in *AccessURLReq, opts ...grpc.CallOption) (*AccessURLResp, error) { + out := new(AccessURLResp) + err := c.cc.Invoke(ctx, "/OpenIMServer.third.third/AccessURL", in, out, opts...) if err != nil { return nil, err } @@ -1437,11 +1815,12 @@ func (c *thirdClient) SetAppBadge(ctx context.Context, in *SetAppBadgeReq, opts // ThirdServer is the server API for Third service. type ThirdServer interface { - ApplyPut(context.Context, *ApplyPutReq) (*ApplyPutResp, error) - GetPut(context.Context, *GetPutReq) (*GetPutResp, error) - ConfirmPut(context.Context, *ConfirmPutReq) (*ConfirmPutResp, error) - GetUrl(context.Context, *GetUrlReq) (*GetUrlResp, error) - GetHashInfo(context.Context, *GetHashInfoReq) (*GetHashInfoResp, error) + PartLimit(context.Context, *PartLimitReq) (*PartLimitResp, error) + PartSize(context.Context, *PartSizeReq) (*PartSizeResp, error) + InitiateMultipartUpload(context.Context, *InitiateMultipartUploadReq) (*InitiateMultipartUploadResp, error) + AuthSign(context.Context, *AuthSignReq) (*AuthSignResp, error) + CompleteMultipartUpload(context.Context, *CompleteMultipartUploadReq) (*CompleteMultipartUploadResp, error) + AccessURL(context.Context, *AccessURLReq) (*AccessURLResp, error) FcmUpdateToken(context.Context, *FcmUpdateTokenReq) (*FcmUpdateTokenResp, error) SetAppBadge(context.Context, *SetAppBadgeReq) (*SetAppBadgeResp, error) } @@ -1450,20 +1829,23 @@ type ThirdServer interface { type UnimplementedThirdServer struct { } -func (*UnimplementedThirdServer) ApplyPut(context.Context, *ApplyPutReq) (*ApplyPutResp, error) { - return nil, status.Errorf(codes.Unimplemented, "method ApplyPut not implemented") +func (*UnimplementedThirdServer) PartLimit(context.Context, *PartLimitReq) (*PartLimitResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method PartLimit not implemented") } -func (*UnimplementedThirdServer) GetPut(context.Context, *GetPutReq) (*GetPutResp, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetPut not implemented") +func (*UnimplementedThirdServer) PartSize(context.Context, *PartSizeReq) (*PartSizeResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method PartSize not implemented") } -func (*UnimplementedThirdServer) ConfirmPut(context.Context, *ConfirmPutReq) (*ConfirmPutResp, error) { - return nil, status.Errorf(codes.Unimplemented, "method ConfirmPut not implemented") +func (*UnimplementedThirdServer) InitiateMultipartUpload(context.Context, *InitiateMultipartUploadReq) (*InitiateMultipartUploadResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method InitiateMultipartUpload not implemented") } -func (*UnimplementedThirdServer) GetUrl(context.Context, *GetUrlReq) (*GetUrlResp, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetUrl not implemented") +func (*UnimplementedThirdServer) AuthSign(context.Context, *AuthSignReq) (*AuthSignResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method AuthSign not implemented") } -func (*UnimplementedThirdServer) GetHashInfo(context.Context, *GetHashInfoReq) (*GetHashInfoResp, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetHashInfo not implemented") +func (*UnimplementedThirdServer) CompleteMultipartUpload(context.Context, *CompleteMultipartUploadReq) (*CompleteMultipartUploadResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method CompleteMultipartUpload not implemented") +} +func (*UnimplementedThirdServer) AccessURL(context.Context, *AccessURLReq) (*AccessURLResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method AccessURL not implemented") } func (*UnimplementedThirdServer) FcmUpdateToken(context.Context, *FcmUpdateTokenReq) (*FcmUpdateTokenResp, error) { return nil, status.Errorf(codes.Unimplemented, "method FcmUpdateToken not implemented") @@ -1476,92 +1858,110 @@ func RegisterThirdServer(s *grpc.Server, srv ThirdServer) { s.RegisterService(&_Third_serviceDesc, srv) } -func _Third_ApplyPut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ApplyPutReq) +func _Third_PartLimit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PartLimitReq) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ThirdServer).PartLimit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/OpenIMServer.third.third/PartLimit", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ThirdServer).PartLimit(ctx, req.(*PartLimitReq)) + } + return interceptor(ctx, in, info, handler) +} + +func _Third_PartSize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PartSizeReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ThirdServer).ApplyPut(ctx, in) + return srv.(ThirdServer).PartSize(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/OpenIMServer.third.third/ApplyPut", + FullMethod: "/OpenIMServer.third.third/PartSize", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ThirdServer).ApplyPut(ctx, req.(*ApplyPutReq)) + return srv.(ThirdServer).PartSize(ctx, req.(*PartSizeReq)) } return interceptor(ctx, in, info, handler) } -func _Third_GetPut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetPutReq) +func _Third_InitiateMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(InitiateMultipartUploadReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ThirdServer).GetPut(ctx, in) + return srv.(ThirdServer).InitiateMultipartUpload(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/OpenIMServer.third.third/GetPut", + FullMethod: "/OpenIMServer.third.third/InitiateMultipartUpload", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ThirdServer).GetPut(ctx, req.(*GetPutReq)) + return srv.(ThirdServer).InitiateMultipartUpload(ctx, req.(*InitiateMultipartUploadReq)) } return interceptor(ctx, in, info, handler) } -func _Third_ConfirmPut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ConfirmPutReq) +func _Third_AuthSign_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AuthSignReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ThirdServer).ConfirmPut(ctx, in) + return srv.(ThirdServer).AuthSign(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/OpenIMServer.third.third/ConfirmPut", + FullMethod: "/OpenIMServer.third.third/AuthSign", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ThirdServer).ConfirmPut(ctx, req.(*ConfirmPutReq)) + return srv.(ThirdServer).AuthSign(ctx, req.(*AuthSignReq)) } return interceptor(ctx, in, info, handler) } -func _Third_GetUrl_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetUrlReq) +func _Third_CompleteMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CompleteMultipartUploadReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ThirdServer).GetUrl(ctx, in) + return srv.(ThirdServer).CompleteMultipartUpload(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/OpenIMServer.third.third/GetUrl", + FullMethod: "/OpenIMServer.third.third/CompleteMultipartUpload", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ThirdServer).GetUrl(ctx, req.(*GetUrlReq)) + return srv.(ThirdServer).CompleteMultipartUpload(ctx, req.(*CompleteMultipartUploadReq)) } return interceptor(ctx, in, info, handler) } -func _Third_GetHashInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetHashInfoReq) +func _Third_AccessURL_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AccessURLReq) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ThirdServer).GetHashInfo(ctx, in) + return srv.(ThirdServer).AccessURL(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/OpenIMServer.third.third/GetHashInfo", + FullMethod: "/OpenIMServer.third.third/AccessURL", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ThirdServer).GetHashInfo(ctx, req.(*GetHashInfoReq)) + return srv.(ThirdServer).AccessURL(ctx, req.(*AccessURLReq)) } return interceptor(ctx, in, info, handler) } @@ -1607,24 +2007,28 @@ var _Third_serviceDesc = grpc.ServiceDesc{ HandlerType: (*ThirdServer)(nil), Methods: []grpc.MethodDesc{ { - MethodName: "ApplyPut", - Handler: _Third_ApplyPut_Handler, + MethodName: "PartLimit", + Handler: _Third_PartLimit_Handler, + }, + { + MethodName: "PartSize", + Handler: _Third_PartSize_Handler, }, { - MethodName: "GetPut", - Handler: _Third_GetPut_Handler, + MethodName: "InitiateMultipartUpload", + Handler: _Third_InitiateMultipartUpload_Handler, }, { - MethodName: "ConfirmPut", - Handler: _Third_ConfirmPut_Handler, + MethodName: "AuthSign", + Handler: _Third_AuthSign_Handler, }, { - MethodName: "GetUrl", - Handler: _Third_GetUrl_Handler, + MethodName: "CompleteMultipartUpload", + Handler: _Third_CompleteMultipartUpload_Handler, }, { - MethodName: "GetHashInfo", - Handler: _Third_GetHashInfo_Handler, + MethodName: "AccessURL", + Handler: _Third_AccessURL_Handler, }, { MethodName: "FcmUpdateToken", diff --git a/pkg/proto/third/third.proto b/pkg/proto/third/third.proto index 8cdad7562..3b2456983 100644 --- a/pkg/proto/third/third.proto +++ b/pkg/proto/third/third.proto @@ -16,80 +16,95 @@ syntax = "proto3"; package OpenIMServer.third; option go_package = "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/third"; -message ApplyPutReq { - string putID = 1; - string name = 2; - int64 size = 3; - string hash = 4; - string contentType = 5; - int64 fragmentSize = 6; - int64 validTime = 7; // 文件有效时间 +message KeyValues { + string key = 1; + repeated string values = 2; } -message ApplyPutResp { +message SignPart { + int32 partNumber = 1; + string url = 2; + repeated KeyValues query = 3; + repeated KeyValues header = 4; +} + +message AuthSignParts { string url = 1; - string putID = 2; - int64 fragmentSize = 3; - int64 validTime = 4;// 上传地址的有效时间 - string putURLsHash = 5; - repeated string putURLs = 6; + repeated KeyValues query = 2; + repeated KeyValues header = 3; + repeated SignPart parts = 4; +} + +message PartLimitReq { +} + +message PartLimitResp { + int64 minPartSize = 1; + int64 maxPartSize = 2; + int32 maxNumSize = 3; +} + +message PartSizeReq { + int64 size = 1; +} + +message PartSizeResp { + int64 size = 2; +} + +message InitiateMultipartUploadReq { + string hash = 1; + int64 size = 2; + int64 partSize = 3; + int32 maxParts = 4; + string cause = 5; + string name = 6; + string contentType = 7; } -message ConfirmPutReq { - string putID = 1; +message UploadInfo { + string uploadID = 1; + int64 partSize = 2; + AuthSignParts sign = 3; + int64 expireTime = 4; } -message ConfirmPutResp { +message InitiateMultipartUploadResp { string url = 1; + UploadInfo upload = 2; } -message GetUrlReq { - string name = 1; // 文件名 - int64 expires = 2; // url有效时间 - bool attachment = 3;// 是否是附件 +message AuthSignReq { + string uploadID = 1; + repeated int32 partNumbers = 2; } -message GetUrlResp { +message AuthSignResp { string url = 1; - int64 size = 2; - string hash = 3; + repeated KeyValues query = 2; + repeated KeyValues header = 3; + repeated SignPart parts = 4; } -message GetPutReq { - string putID = 1; +message CompleteMultipartUploadReq { + string uploadID = 1; + repeated string parts = 2; + string name = 3; + string contentType = 4; + string cause = 5; } -message GetPutFragment{ - int64 size = 1; - string hash = 2; - string url = 3; +message CompleteMultipartUploadResp { + string url = 1; } -message GetPutResp { +message AccessURLReq { string name = 1; - int64 size = 2; - string hash = 3; - int64 fragmentSize = 4; - string contentType = 5; - int64 validTime = 6; // 上传地址的有效时间 - // repeated GetPutFragment fragments = 7; - // string putURLsHash = 8; - // string putID = 2; - // int64 fragmentSize = 3; - // int64 validTime = 4;// 上传地址的有效时间 - string putURLsHash = 7; - repeated GetPutFragment fragments = 8; - // repeated string putURLs = 6; - // repeated GetPutFragment fragments = 7; -} - -message GetHashInfoReq { - string hash = 1; } -message GetHashInfoResp { - string hash = 1; - int64 size = 2; +message AccessURLResp { + string url = 1; + int64 expireTime = 2; } message FcmUpdateTokenReq { @@ -111,11 +126,13 @@ message SetAppBadgeResp { } service third { - rpc ApplyPut(ApplyPutReq) returns(ApplyPutResp); - rpc GetPut(GetPutReq) returns(GetPutResp); - rpc ConfirmPut(ConfirmPutReq) returns(ConfirmPutResp); - rpc GetUrl(GetUrlReq) returns(GetUrlResp); - rpc GetHashInfo(GetHashInfoReq) returns(GetHashInfoResp); + rpc PartLimit(PartLimitReq) returns(PartLimitResp); + rpc PartSize(PartSizeReq) returns(PartSizeResp); + rpc InitiateMultipartUpload(InitiateMultipartUploadReq) returns(InitiateMultipartUploadResp); + rpc AuthSign(AuthSignReq) returns(AuthSignResp); + rpc CompleteMultipartUpload(CompleteMultipartUploadReq) returns(CompleteMultipartUploadResp); + rpc AccessURL(AccessURLReq) returns(AccessURLResp); + rpc FcmUpdateToken(FcmUpdateTokenReq) returns(FcmUpdateTokenResp); rpc SetAppBadge(SetAppBadgeReq) returns(SetAppBadgeResp); } diff --git a/pkg/proto/user/user.pb.go b/pkg/proto/user/user.pb.go index 86113ec05..c96acb4a4 100644 --- a/pkg/proto/user/user.pb.go +++ b/pkg/proto/user/user.pb.go @@ -1511,8 +1511,9 @@ type UserRegisterCountResp struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total"` - Count map[string]int64 `protobuf:"bytes,2,rep,name=count,proto3" json:"count" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total"` + Before int64 `protobuf:"varint,2,opt,name=before,proto3" json:"before"` + Count map[string]int64 `protobuf:"bytes,3,rep,name=count,proto3" json:"count" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` } func (x *UserRegisterCountResp) Reset() { @@ -1554,6 +1555,13 @@ func (x *UserRegisterCountResp) GetTotal() int64 { return 0 } +func (x *UserRegisterCountResp) GetBefore() int64 { + if x != nil { + return x.Before + } + return 0 +} + func (x *UserRegisterCountResp) GetCount() map[string]int64 { if x != nil { return x.Count @@ -1790,80 +1798,82 @@ var file_user_user_proto_rawDesc = []byte{ 0x73, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0xb2, 0x01, 0x0a, 0x15, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0xca, 0x01, 0x0a, 0x15, 0x75, 0x73, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x49, 0x0a, 0x05, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x38, 0x0a, 0x0a, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x32, 0x9f, 0x07, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x66, 0x0a, 0x11, 0x67, 0x65, 0x74, - 0x44, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x27, - 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x28, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x44, - 0x65, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x5d, 0x0a, 0x0e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x25, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x78, 0x0a, 0x17, 0x73, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x65, 0x63, - 0x76, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x12, 0x2d, 0x2e, 0x4f, 0x70, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x62, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x62, 0x65, 0x66, + 0x6f, 0x72, 0x65, 0x12, 0x49, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x38, + 0x0a, 0x0a, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x32, 0x9f, 0x07, 0x0a, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x12, 0x66, 0x0a, 0x11, 0x67, 0x65, 0x74, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x44, 0x65, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, + 0x28, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5d, 0x0a, 0x0e, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x24, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x73, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x2e, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x73, - 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x78, 0x0a, 0x17, 0x67, 0x65, - 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x4f, 0x70, 0x74, 0x12, 0x2d, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, - 0x74, 0x52, 0x65, 0x71, 0x1a, 0x2e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x12, 0x57, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x12, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, - 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x12, 0x69, 0x0a, - 0x12, 0x67, 0x65, 0x74, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x29, 0x2e, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x1a, 0x25, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x78, 0x0a, 0x17, 0x73, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x4f, 0x70, 0x74, 0x12, 0x2d, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x52, + 0x65, 0x71, 0x1a, 0x2e, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x73, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x52, 0x65, 0x63, 0x76, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x78, 0x0a, 0x17, 0x67, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, + 0x65, 0x63, 0x76, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x12, 0x2d, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, - 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x57, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, - 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x4f, + 0x72, 0x2e, 0x67, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x2e, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x67, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x57, 0x0a, 0x0c, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, - 0x2e, 0x75, 0x73, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x12, 0x57, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x49, - 0x44, 0x12, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, - 0x49, 0x44, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, - 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x12, 0x66, 0x0a, 0x11, 0x75, 0x73, - 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x28, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, - 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x44, 0x4b, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x2d, - 0x49, 0x4d, 0x2d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, + 0x1a, 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x52, 0x65, 0x73, 0x70, 0x12, 0x69, 0x0a, 0x12, 0x67, 0x65, 0x74, 0x50, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, + 0x67, 0x65, 0x74, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x29, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x50, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x12, 0x57, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x12, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x57, 0x0a, 0x0c, 0x67, 0x65, 0x74, + 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x22, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x67, 0x65, + 0x74, 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, + 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x52, 0x65, + 0x73, 0x70, 0x12, 0x66, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x1a, 0x28, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x4d, 0x53, + 0x44, 0x4b, 0x2f, 0x4f, 0x70, 0x65, 0x6e, 0x2d, 0x49, 0x4d, 0x2d, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x75, 0x73, 0x65, 0x72, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/proto/user/user.proto b/pkg/proto/user/user.proto index e63959aff..10035642c 100644 --- a/pkg/proto/user/user.proto +++ b/pkg/proto/user/user.proto @@ -54,7 +54,7 @@ message updateUserInfoResp{ message setGlobalRecvMessageOptReq{ string userID = 1; - int32 globalRecvMsgOpt = 3; + int32 globalRecvMsgOpt = 3; } message setGlobalRecvMessageOptResp{ } @@ -155,7 +155,8 @@ message userRegisterCountReq { message userRegisterCountResp { int64 total = 1; - map count = 2; + int64 before = 2; + map count = 3; } service user { diff --git a/pkg/rpcclient/conversation.go b/pkg/rpcclient/conversation.go index 5cab1d689..617446852 100644 --- a/pkg/rpcclient/conversation.go +++ b/pkg/rpcclient/conversation.go @@ -1,29 +1,14 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 rpcclient import ( "context" "fmt" - "google.golang.org/grpc" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config" "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry" "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" pbConversation "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/conversation" + "google.golang.org/grpc" ) type Conversation struct { @@ -47,18 +32,7 @@ func NewConversationRpcClient(discov discoveryregistry.SvcDiscoveryRegistry) Con return ConversationRpcClient(*NewConversation(discov)) } -func (c *ConversationRpcClient) ModifyConversationField( - ctx context.Context, - req *pbConversation.ModifyConversationFieldReq, -) error { - _, err := c.Client.ModifyConversationField(ctx, req) - return err -} - -func (c *ConversationRpcClient) GetSingleConversationRecvMsgOpt( - ctx context.Context, - userID, conversationID string, -) (int32, error) { +func (c *ConversationRpcClient) GetSingleConversationRecvMsgOpt(ctx context.Context, userID, conversationID string) (int32, error) { var req pbConversation.GetConversationReq req.OwnerUserID = userID req.ConversationID = conversationID @@ -70,51 +44,21 @@ func (c *ConversationRpcClient) GetSingleConversationRecvMsgOpt( } func (c *ConversationRpcClient) SingleChatFirstCreateConversation(ctx context.Context, recvID, sendID string) error { - _, err := c.Client.CreateSingleChatConversations( - ctx, - &pbConversation.CreateSingleChatConversationsReq{RecvID: recvID, SendID: sendID}, - ) + _, err := c.Client.CreateSingleChatConversations(ctx, &pbConversation.CreateSingleChatConversationsReq{RecvID: recvID, SendID: sendID}) return err } -func (c *ConversationRpcClient) GroupChatFirstCreateConversation( - ctx context.Context, - groupID string, - userIDs []string, -) error { - _, err := c.Client.CreateGroupChatConversations( - ctx, - &pbConversation.CreateGroupChatConversationsReq{UserIDs: userIDs, GroupID: groupID}, - ) +func (c *ConversationRpcClient) GroupChatFirstCreateConversation(ctx context.Context, groupID string, userIDs []string) error { + _, err := c.Client.CreateGroupChatConversations(ctx, &pbConversation.CreateGroupChatConversationsReq{UserIDs: userIDs, GroupID: groupID}) return err } -func (c *ConversationRpcClient) SetConversationMaxSeq( - ctx context.Context, - ownerUserIDs []string, - conversationID string, - maxSeq int64, -) error { - _, err := c.Client.SetConversationMaxSeq( - ctx, - &pbConversation.SetConversationMaxSeqReq{ - OwnerUserID: ownerUserIDs, - ConversationID: conversationID, - MaxSeq: maxSeq, - }, - ) +func (c *ConversationRpcClient) SetConversationMaxSeq(ctx context.Context, ownerUserIDs []string, conversationID string, maxSeq int64) error { + _, err := c.Client.SetConversationMaxSeq(ctx, &pbConversation.SetConversationMaxSeqReq{OwnerUserID: ownerUserIDs, ConversationID: conversationID, MaxSeq: maxSeq}) return err } - -func (c *ConversationRpcClient) SetConversations( - ctx context.Context, - userIDs []string, - conversation *pbConversation.ConversationReq, -) error { - _, err := c.Client.SetConversations( - ctx, - &pbConversation.SetConversationsReq{UserIDs: userIDs, Conversation: conversation}, - ) +func (c *ConversationRpcClient) SetConversations(ctx context.Context, userIDs []string, conversation *pbConversation.ConversationReq) error { + _, err := c.Client.SetConversations(ctx, &pbConversation.SetConversationsReq{UserIDs: userIDs, Conversation: conversation}) return err } @@ -126,28 +70,16 @@ func (c *ConversationRpcClient) GetConversationIDs(ctx context.Context, ownerUse return resp.ConversationIDs, nil } -func (c *ConversationRpcClient) GetConversation( - ctx context.Context, - ownerUserID, conversationID string, -) (*pbConversation.Conversation, error) { - resp, err := c.Client.GetConversation( - ctx, - &pbConversation.GetConversationReq{OwnerUserID: ownerUserID, ConversationID: conversationID}, - ) +func (c *ConversationRpcClient) GetConversation(ctx context.Context, ownerUserID, conversationID string) (*pbConversation.Conversation, error) { + resp, err := c.Client.GetConversation(ctx, &pbConversation.GetConversationReq{OwnerUserID: ownerUserID, ConversationID: conversationID}) if err != nil { return nil, err } return resp.Conversation, nil } -func (c *ConversationRpcClient) GetConversationsByConversationID( - ctx context.Context, - conversationIDs []string, -) ([]*pbConversation.Conversation, error) { - resp, err := c.Client.GetConversationsByConversationID( - ctx, - &pbConversation.GetConversationsByConversationIDReq{ConversationIDs: conversationIDs}, - ) +func (c *ConversationRpcClient) GetConversationsByConversationID(ctx context.Context, conversationIDs []string) ([]*pbConversation.Conversation, error) { + resp, err := c.Client.GetConversationsByConversationID(ctx, &pbConversation.GetConversationsByConversationIDReq{ConversationIDs: conversationIDs}) if err != nil { return nil, err } @@ -157,15 +89,8 @@ func (c *ConversationRpcClient) GetConversationsByConversationID( return resp.Conversations, nil } -func (c *ConversationRpcClient) GetConversations( - ctx context.Context, - ownerUserID string, - conversationIDs []string, -) ([]*pbConversation.Conversation, error) { - resp, err := c.Client.GetConversations( - ctx, - &pbConversation.GetConversationsReq{OwnerUserID: ownerUserID, ConversationIDs: conversationIDs}, - ) +func (c *ConversationRpcClient) GetConversations(ctx context.Context, ownerUserID string, conversationIDs []string) ([]*pbConversation.Conversation, error) { + resp, err := c.Client.GetConversations(ctx, &pbConversation.GetConversationsReq{OwnerUserID: ownerUserID, ConversationIDs: conversationIDs}) if err != nil { return nil, err } diff --git a/pkg/rpcclient/msg.go b/pkg/rpcclient/msg.go index aabc3768a..ca02ecc90 100644 --- a/pkg/rpcclient/msg.go +++ b/pkg/rpcclient/msg.go @@ -1,26 +1,9 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 rpcclient import ( "context" "encoding/json" - "google.golang.org/grpc" - "google.golang.org/protobuf/proto" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/config" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" @@ -28,6 +11,8 @@ import ( "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg" "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" + "google.golang.org/grpc" + "google.golang.org/protobuf/proto" // "google.golang.org/protobuf/proto" ) @@ -115,6 +100,8 @@ func newSessionTypeConf() map[int32]int32 { constant.ConversationChangeNotification: constant.SingleChatType, constant.ConversationUnreadNotification: constant.SingleChatType, constant.ConversationPrivateChatNotification: constant.SingleChatType, + // delete + constant.MsgDeleteNotification: constant.SingleChatType, } } @@ -149,10 +136,7 @@ func (m *MessageRpcClient) GetMaxSeq(ctx context.Context, req *sdkws.GetMaxSeqRe return resp, err } -func (m *MessageRpcClient) PullMessageBySeqList( - ctx context.Context, - req *sdkws.PullMessageBySeqsReq, -) (*sdkws.PullMessageBySeqsResp, error) { +func (m *MessageRpcClient) PullMessageBySeqList(ctx context.Context, req *sdkws.PullMessageBySeqsReq) (*sdkws.PullMessageBySeqsResp, error) { resp, err := m.Client.PullMessageBySeqs(ctx, req) return resp, err } @@ -169,62 +153,71 @@ type NotificationSender struct { contentTypeConf map[int32]config.NotificationConf sessionTypeConf map[int32]int32 sendMsg func(ctx context.Context, req *msg.SendMsgReq) (*msg.SendMsgResp, error) + getUserInfo func(ctx context.Context, userID string) (*sdkws.UserInfo, error) } -type NewNotificationSenderOptions func(*NotificationSender) +type NotificationSenderOptions func(*NotificationSender) -func WithLocalSendMsg( - sendMsg func(ctx context.Context, req *msg.SendMsgReq) (*msg.SendMsgResp, error), -) NewNotificationSenderOptions { +func WithLocalSendMsg(sendMsg func(ctx context.Context, req *msg.SendMsgReq) (*msg.SendMsgResp, error)) NotificationSenderOptions { return func(s *NotificationSender) { s.sendMsg = sendMsg } } -func WithRpcClient(msgRpcClient *MessageRpcClient) NewNotificationSenderOptions { +func WithRpcClient(msgRpcClient *MessageRpcClient) NotificationSenderOptions { return func(s *NotificationSender) { s.sendMsg = msgRpcClient.SendMsg } } -func NewNotificationSender(opts ...NewNotificationSenderOptions) *NotificationSender { - notificationSender := &NotificationSender{ - contentTypeConf: newContentTypeConf(), - sessionTypeConf: newSessionTypeConf(), +func WithUserRpcClient(userRpcClient *UserRpcClient) NotificationSenderOptions { + return func(s *NotificationSender) { + s.getUserInfo = userRpcClient.GetUserInfo } +} + +func NewNotificationSender(opts ...NotificationSenderOptions) *NotificationSender { + notificationSender := &NotificationSender{contentTypeConf: newContentTypeConf(), sessionTypeConf: newSessionTypeConf()} for _, opt := range opts { opt(notificationSender) } return notificationSender } -func (s *NotificationSender) NotificationWithSesstionType( - ctx context.Context, - sendID, recvID string, - contentType, sesstionType int32, - m proto.Message, - opts ...utils.OptionsOpt, -) (err error) { +type notificationOpt struct { + WithRpcGetUsername bool +} + +type NotificationOptions func(*notificationOpt) + +func WithRpcGetUserName() NotificationOptions { + return func(opt *notificationOpt) { + opt.WithRpcGetUsername = true + } +} + +func (s *NotificationSender) NotificationWithSesstionType(ctx context.Context, sendID, recvID string, contentType, sesstionType int32, m proto.Message, opts ...NotificationOptions) (err error) { n := sdkws.NotificationElem{Detail: utils.StructToJsonString(m)} content, err := json.Marshal(&n) if err != nil { - log.ZError( - ctx, - "MsgClient Notification json.Marshal failed", - err, - "sendID", - sendID, - "recvID", - recvID, - "contentType", - contentType, - "msg", - m, - ) + log.ZError(ctx, "MsgClient Notification json.Marshal failed", err, "sendID", sendID, "recvID", recvID, "contentType", contentType, "msg", m) return err } + notificationOpt := ¬ificationOpt{} + for _, opt := range opts { + opt(notificationOpt) + } var req msg.SendMsgReq var msg sdkws.MsgData + if notificationOpt.WithRpcGetUsername && s.getUserInfo != nil { + userInfo, err := s.getUserInfo(ctx, sendID) + if err != nil { + log.ZWarn(ctx, "getUserInfo failed", err, "sendID", sendID) + } else { + msg.SenderNickname = userInfo.Nickname + msg.SenderFaceURL = userInfo.FaceURL + } + } var offlineInfo sdkws.OfflinePushInfo var title, desc, ex string msg.SendID = sendID @@ -239,7 +232,6 @@ func (s *NotificationSender) NotificationWithSesstionType( msg.CreateTime = utils.GetCurrentTimestampByMill() msg.ClientMsgID = utils.GetMsgID(sendID) options := config.GetOptionsByNotification(s.contentTypeConf[contentType]) - options = utils.WithOptions(options, opts...) msg.Options = options offlineInfo.Title = title offlineInfo.Desc = desc @@ -255,12 +247,6 @@ func (s *NotificationSender) NotificationWithSesstionType( return err } -func (s *NotificationSender) Notification( - ctx context.Context, - sendID, recvID string, - contentType int32, - m proto.Message, - opts ...utils.OptionsOpt, -) error { +func (s *NotificationSender) Notification(ctx context.Context, sendID, recvID string, contentType int32, m proto.Message, opts ...NotificationOptions) error { return s.NotificationWithSesstionType(ctx, sendID, recvID, contentType, s.sessionTypeConf[contentType], m, opts...) } diff --git a/pkg/rpcclient/notification/extend_msg.go b/pkg/rpcclient/notification/extend_msg.go deleted file mode 100644 index 85e5b1903..000000000 --- a/pkg/rpcclient/notification/extend_msg.go +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 notification - -import ( - "context" - "encoding/json" - - "google.golang.org/protobuf/proto" - - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/mcontext" - "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry" - "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" - "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg" - "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" - "github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient" - "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" -) - -type ExtendMsgNotificationSender struct { - *rpcclient.MessageRpcClient -} - -func NewExtendMsgNotificationSender(client discoveryregistry.SvcDiscoveryRegistry) *ExtendMsgNotificationSender { - return &ExtendMsgNotificationSender{} -} - -func (e *ExtendMsgNotificationSender) ExtendMessageUpdatedNotification( - ctx context.Context, - sendID string, - conversationID string, - sessionType int32, - req *msg.SetMessageReactionExtensionsReq, - resp *msg.SetMessageReactionExtensionsResp, - isHistory bool, - isReactionFromCache bool, -) { - var content sdkws.ReactionMessageModifierNotification - content.ConversationID = req.ConversationID - content.OpUserID = mcontext.GetOpUserID(ctx) - content.SessionType = req.SessionType - keyMap := make(map[string]*sdkws.KeyValue) - for _, valueResp := range resp.Result { - if valueResp.ErrCode == 0 { - keyMap[valueResp.KeyValue.TypeKey] = valueResp.KeyValue - } - } - if len(keyMap) == 0 { - return - } - content.SuccessReactionExtensions = keyMap - content.ClientMsgID = req.ClientMsgID - content.IsReact = resp.IsReact - content.IsExternalExtensions = req.IsExternalExtensions - content.MsgFirstModifyTime = resp.MsgFirstModifyTime - e.messageReactionSender( - ctx, - sendID, - conversationID, - sessionType, - constant.ReactionMessageModifier, - &content, - isHistory, - isReactionFromCache, - ) -} - -func (e *ExtendMsgNotificationSender) ExtendMessageDeleteNotification( - ctx context.Context, - sendID string, - conversationID string, - sessionType int32, - req *msg.DeleteMessagesReactionExtensionsReq, - resp *msg.DeleteMessagesReactionExtensionsResp, - isHistory bool, - isReactionFromCache bool, -) { - var content sdkws.ReactionMessageDeleteNotification - content.ConversationID = req.ConversationID - content.OpUserID = req.OpUserID - content.SessionType = req.SessionType - keyMap := make(map[string]*sdkws.KeyValue) - for _, valueResp := range resp.Result { - if valueResp.ErrCode == 0 { - keyMap[valueResp.KeyValue.TypeKey] = valueResp.KeyValue - } - } - if len(keyMap) == 0 { - return - } - content.SuccessReactionExtensions = keyMap - content.ClientMsgID = req.ClientMsgID - content.MsgFirstModifyTime = req.MsgFirstModifyTime - e.messageReactionSender( - ctx, - sendID, - conversationID, - sessionType, - constant.ReactionMessageDeleter, - &content, - isHistory, - isReactionFromCache, - ) -} - -func (e *ExtendMsgNotificationSender) messageReactionSender( - ctx context.Context, - sendID string, - conversationID string, - sessionType, contentType int32, - m proto.Message, - isHistory bool, - isReactionFromCache bool, -) error { - options := make(map[string]bool, 5) - utils.SetSwitchFromOptions(options, constant.IsOfflinePush, false) - utils.SetSwitchFromOptions(options, constant.IsConversationUpdate, false) - utils.SetSwitchFromOptions(options, constant.IsSenderConversationUpdate, false) - utils.SetSwitchFromOptions(options, constant.IsUnreadCount, false) - utils.SetSwitchFromOptions(options, constant.IsReactionFromCache, isReactionFromCache) - if !isHistory { - utils.SetSwitchFromOptions(options, constant.IsHistory, false) - utils.SetSwitchFromOptions(options, constant.IsPersistent, false) - } - bytes, err := json.Marshal(m) - if err != nil { - return errs.ErrData.Wrap(err.Error()) - } - pbData := msg.SendMsgReq{ - MsgData: &sdkws.MsgData{ - SendID: sendID, - ClientMsgID: utils.GetMsgID(sendID), - SessionType: sessionType, - MsgFrom: constant.SysMsgType, - ContentType: contentType, - Content: bytes, - CreateTime: utils.GetCurrentTimestampByMill(), - Options: options, - }, - } - switch sessionType { - case constant.SingleChatType, constant.NotificationChatType: - pbData.MsgData.RecvID = conversationID - case constant.GroupChatType, constant.SuperGroupChatType: - pbData.MsgData.GroupID = conversationID - } - _, err = e.SendMsg(ctx, &pbData) - return err -} diff --git a/pkg/rpcclient/notification/group.go b/pkg/rpcclient/notification/group.go index fcc32b092..3efe76802 100644 --- a/pkg/rpcclient/notification/group.go +++ b/pkg/rpcclient/notification/group.go @@ -1,17 +1,3 @@ -// Copyright © 2023 OpenIM. All rights reserved. -// -// 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 notification import ( @@ -30,13 +16,9 @@ import ( "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" ) -func NewGroupNotificationSender( - db controller.GroupDatabase, - msgRpcClient *rpcclient.MessageRpcClient, - fn func(ctx context.Context, userIDs []string) ([]CommonUser, error), -) *GroupNotificationSender { +func NewGroupNotificationSender(db controller.GroupDatabase, msgRpcClient *rpcclient.MessageRpcClient, userRpcClient *rpcclient.UserRpcClient, fn func(ctx context.Context, userIDs []string) ([]CommonUser, error)) *GroupNotificationSender { return &GroupNotificationSender{ - NotificationSender: rpcclient.NewNotificationSender(rpcclient.WithRpcClient(msgRpcClient)), + NotificationSender: rpcclient.NewNotificationSender(rpcclient.WithRpcClient(msgRpcClient), rpcclient.WithUserRpcClient(userRpcClient)), getUsersInfo: fn, db: db, } @@ -98,11 +80,7 @@ func (g *GroupNotificationSender) getGroupInfo(ctx context.Context, groupID stri }, nil } -func (g *GroupNotificationSender) getGroupMembers( - ctx context.Context, - groupID string, - userIDs []string, -) ([]*sdkws.GroupMemberFullInfo, error) { +func (g *GroupNotificationSender) getGroupMembers(ctx context.Context, groupID string, userIDs []string) ([]*sdkws.GroupMemberFullInfo, error) { members, err := g.db.FindGroupMember(ctx, []string{groupID}, userIDs, nil) if err != nil { return nil, err @@ -117,9 +95,7 @@ func (g *GroupNotificationSender) getGroupMembers( for _, member := range members { user, ok := users[member.UserID] if !ok { - return nil, errs.ErrUserIDNotFound.Wrap( - fmt.Sprintf("group %s member %s not in user", member.GroupID, member.UserID), - ) + return nil, errs.ErrUserIDNotFound.Wrap(fmt.Sprintf("group %s member %s not in user", member.GroupID, member.UserID)) } if member.Nickname == "" { member.Nickname = user.Nickname @@ -141,11 +117,7 @@ func (g *GroupNotificationSender) getGroupMembers( return res, nil } -func (g *GroupNotificationSender) getGroupMemberMap( - ctx context.Context, - groupID string, - userIDs []string, -) (map[string]*sdkws.GroupMemberFullInfo, error) { +func (g *GroupNotificationSender) getGroupMemberMap(ctx context.Context, groupID string, userIDs []string) (map[string]*sdkws.GroupMemberFullInfo, error) { members, err := g.getGroupMembers(ctx, groupID, userIDs) if err != nil { return nil, err @@ -157,11 +129,7 @@ func (g *GroupNotificationSender) getGroupMemberMap( return m, nil } -func (g *GroupNotificationSender) getGroupMember( - ctx context.Context, - groupID string, - userID string, -) (*sdkws.GroupMemberFullInfo, error) { +func (g *GroupNotificationSender) getGroupMember(ctx context.Context, groupID string, userID string) (*sdkws.GroupMemberFullInfo, error) { members, err := g.getGroupMembers(ctx, groupID, []string{userID}) if err != nil { return nil, err @@ -181,11 +149,7 @@ func (g *GroupNotificationSender) getGroupOwnerAndAdminUserID(ctx context.Contex return utils.Slice(members, fn), nil } -func (g *GroupNotificationSender) groupDB2PB( - group *relation.GroupModel, - ownerUserID string, - memberCount uint32, -) *sdkws.GroupInfo { +func (g *GroupNotificationSender) groupDB2PB(group *relation.GroupModel, ownerUserID string, memberCount uint32) *sdkws.GroupInfo { return &sdkws.GroupInfo{ GroupID: group.GroupID, GroupName: group.GroupName, @@ -207,10 +171,7 @@ func (g *GroupNotificationSender) groupDB2PB( } } -func (g *GroupNotificationSender) groupMemberDB2PB( - member *relation.GroupMemberModel, - appMangerLevel int32, -) *sdkws.GroupMemberFullInfo { +func (g *GroupNotificationSender) groupMemberDB2PB(member *relation.GroupMemberModel, appMangerLevel int32) *sdkws.GroupMemberFullInfo { return &sdkws.GroupMemberFullInfo{ GroupID: member.GroupID, UserID: member.UserID, @@ -227,10 +188,7 @@ func (g *GroupNotificationSender) groupMemberDB2PB( } } -func (g *GroupNotificationSender) getUsersInfoMap( - ctx context.Context, - userIDs []string, -) (map[string]*sdkws.UserInfo, error) { +func (g *GroupNotificationSender) getUsersInfoMap(ctx context.Context, userIDs []string) (map[string]*sdkws.UserInfo, error) { users, err := g.getUsersInfo(ctx, userIDs) if err != nil { return nil, err @@ -242,11 +200,7 @@ func (g *GroupNotificationSender) getUsersInfoMap( return result, nil } -func (g *GroupNotificationSender) fillOpUser( - ctx context.Context, - opUser **sdkws.GroupMemberFullInfo, - groupID string, -) error { +func (g *GroupNotificationSender) fillOpUser(ctx context.Context, opUser **sdkws.GroupMemberFullInfo, groupID string) error { if opUser == nil { return errs.ErrInternalServer.Wrap("**sdkws.GroupMemberFullInfo is nil") } @@ -285,62 +239,35 @@ func (g *GroupNotificationSender) fillOpUser( return nil } -func (g *GroupNotificationSender) GroupCreatedNotification( - ctx context.Context, - tips *sdkws.GroupCreatedTips, -) (err error) { +func (g *GroupNotificationSender) GroupCreatedNotification(ctx context.Context, tips *sdkws.GroupCreatedTips) (err error) { if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil { return err } return g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupCreatedNotification, tips) } -func (g *GroupNotificationSender) GroupInfoSetNotification( - ctx context.Context, - tips *sdkws.GroupInfoSetTips, -) (err error) { +func (g *GroupNotificationSender) GroupInfoSetNotification(ctx context.Context, tips *sdkws.GroupInfoSetTips) (err error) { if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil { return err } - return g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupInfoSetNotification, tips) + return g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupInfoSetNotification, tips, rpcclient.WithRpcGetUserName()) } -func (g *GroupNotificationSender) GroupInfoSetNameNotification( - ctx context.Context, - tips *sdkws.GroupInfoSetNameTips, -) (err error) { +func (g *GroupNotificationSender) GroupInfoSetNameNotification(ctx context.Context, tips *sdkws.GroupInfoSetNameTips) (err error) { if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil { return err } - return g.Notification( - ctx, - mcontext.GetOpUserID(ctx), - tips.Group.GroupID, - constant.GroupInfoSetNameNotification, - tips, - ) + return g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupInfoSetNameNotification, tips) } -func (g *GroupNotificationSender) GroupInfoSetAnnouncementNotification( - ctx context.Context, - tips *sdkws.GroupInfoSetAnnouncementTips, -) (err error) { +func (g *GroupNotificationSender) GroupInfoSetAnnouncementNotification(ctx context.Context, tips *sdkws.GroupInfoSetAnnouncementTips) (err error) { if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil { return err } - return g.Notification( - ctx, - mcontext.GetOpUserID(ctx), - tips.Group.GroupID, - constant.GroupInfoSetAnnouncementNotification, - tips, - ) + return g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupInfoSetAnnouncementNotification, tips, rpcclient.WithRpcGetUserName()) } -func (g *GroupNotificationSender) JoinGroupApplicationNotification( - ctx context.Context, - req *pbGroup.JoinGroupReq, -) (err error) { +func (g *GroupNotificationSender) JoinGroupApplicationNotification(ctx context.Context, req *pbGroup.JoinGroupReq) (err error) { group, err := g.getGroupInfo(ctx, req.GroupID) if err != nil { return err @@ -364,10 +291,7 @@ func (g *GroupNotificationSender) JoinGroupApplicationNotification( return nil } -func (g *GroupNotificationSender) MemberQuitNotification( - ctx context.Context, - member *sdkws.GroupMemberFullInfo, -) (err error) { +func (g *GroupNotificationSender) MemberQuitNotification(ctx context.Context, member *sdkws.GroupMemberFullInfo) (err error) { defer log.ZDebug(ctx, "return") defer func() { if err != nil { @@ -382,10 +306,7 @@ func (g *GroupNotificationSender) MemberQuitNotification( return g.Notification(ctx, mcontext.GetOpUserID(ctx), member.GroupID, constant.MemberQuitNotification, tips) } -func (g *GroupNotificationSender) GroupApplicationAcceptedNotification( - ctx context.Context, - req *pbGroup.GroupApplicationResponseReq, -) (err error) { +func (g *GroupNotificationSender) GroupApplicationAcceptedNotification(ctx context.Context, req *pbGroup.GroupApplicationResponseReq) (err error) { defer log.ZDebug(ctx, "return") defer func() { if err != nil { @@ -405,13 +326,7 @@ func (g *GroupNotificationSender) GroupApplicationAcceptedNotification( return err } for _, userID := range append(userIDs, mcontext.GetOpUserID(ctx)) { - err = g.Notification( - ctx, - mcontext.GetOpUserID(ctx), - userID, - constant.GroupApplicationAcceptedNotification, - tips, - ) + err = g.Notification(ctx, mcontext.GetOpUserID(ctx), userID, constant.GroupApplicationAcceptedNotification, tips) if err != nil { log.ZError(ctx, "failed", err) } @@ -419,10 +334,7 @@ func (g *GroupNotificationSender) GroupApplicationAcceptedNotification( return nil } -func (g *GroupNotificationSender) GroupApplicationRejectedNotification( - ctx context.Context, - req *pbGroup.GroupApplicationResponseReq, -) (err error) { +func (g *GroupNotificationSender) GroupApplicationRejectedNotification(ctx context.Context, req *pbGroup.GroupApplicationResponseReq) (err error) { group, err := g.getGroupInfo(ctx, req.GroupID) if err != nil { return err @@ -436,13 +348,7 @@ func (g *GroupNotificationSender) GroupApplicationRejectedNotification( return err } for _, userID := range append(userIDs, mcontext.GetOpUserID(ctx)) { - err = g.Notification( - ctx, - mcontext.GetOpUserID(ctx), - userID, - constant.GroupApplicationRejectedNotification, - tips, - ) + err = g.Notification(ctx, mcontext.GetOpUserID(ctx), userID, constant.GroupApplicationRejectedNotification, tips) if err != nil { log.ZError(ctx, "failed", err) } @@ -450,10 +356,7 @@ func (g *GroupNotificationSender) GroupApplicationRejectedNotification( return nil } -func (g *GroupNotificationSender) GroupOwnerTransferredNotification( - ctx context.Context, - req *pbGroup.TransferGroupOwnerReq, -) (err error) { +func (g *GroupNotificationSender) GroupOwnerTransferredNotification(ctx context.Context, req *pbGroup.TransferGroupOwnerReq) (err error) { group, err := g.getGroupInfo(ctx, req.GroupID) if err != nil { return err @@ -463,38 +366,21 @@ func (g *GroupNotificationSender) GroupOwnerTransferredNotification( if err != nil { return err } - tips := &sdkws.GroupOwnerTransferredTips{ - Group: group, - OpUser: member[opUserID], - NewGroupOwner: member[req.NewOwnerUserID], - } + tips := &sdkws.GroupOwnerTransferredTips{Group: group, OpUser: member[opUserID], NewGroupOwner: member[req.NewOwnerUserID]} if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil { return err } - return g.Notification( - ctx, - mcontext.GetOpUserID(ctx), - group.GroupID, - constant.GroupOwnerTransferredNotification, - tips, - ) + return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.GroupOwnerTransferredNotification, tips) } -func (g *GroupNotificationSender) MemberKickedNotification( - ctx context.Context, - tips *sdkws.MemberKickedTips, -) (err error) { +func (g *GroupNotificationSender) MemberKickedNotification(ctx context.Context, tips *sdkws.MemberKickedTips) (err error) { if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil { return err } return g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.MemberKickedNotification, tips) } -func (g *GroupNotificationSender) MemberInvitedNotification( - ctx context.Context, - groupID, reason string, - invitedUserIDList []string, -) (err error) { +func (g *GroupNotificationSender) MemberInvitedNotification(ctx context.Context, groupID, reason string, invitedUserIDList []string) (err error) { group, err := g.getGroupInfo(ctx, groupID) if err != nil { return err @@ -513,10 +399,7 @@ func (g *GroupNotificationSender) MemberInvitedNotification( return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.MemberInvitedNotification, tips) } -func (g *GroupNotificationSender) MemberEnterNotification( - ctx context.Context, - req *pbGroup.GroupApplicationResponseReq, -) (err error) { +func (g *GroupNotificationSender) MemberEnterNotification(ctx context.Context, req *pbGroup.GroupApplicationResponseReq) (err error) { group, err := g.getGroupInfo(ctx, req.GroupID) if err != nil { return err @@ -529,21 +412,14 @@ func (g *GroupNotificationSender) MemberEnterNotification( return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.MemberEnterNotification, tips) } -func (g *GroupNotificationSender) GroupDismissedNotification( - ctx context.Context, - tips *sdkws.GroupDismissedTips, -) (err error) { +func (g *GroupNotificationSender) GroupDismissedNotification(ctx context.Context, tips *sdkws.GroupDismissedTips) (err error) { if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil { return err } return g.Notification(ctx, mcontext.GetOpUserID(ctx), tips.Group.GroupID, constant.GroupDismissedNotification, tips) } -func (g *GroupNotificationSender) GroupMemberMutedNotification( - ctx context.Context, - groupID, groupMemberUserID string, - mutedSeconds uint32, -) (err error) { +func (g *GroupNotificationSender) GroupMemberMutedNotification(ctx context.Context, groupID, groupMemberUserID string, mutedSeconds uint32) (err error) { group, err := g.getGroupInfo(ctx, groupID) if err != nil { return err @@ -560,10 +436,7 @@ func (g *GroupNotificationSender) GroupMemberMutedNotification( return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.GroupMemberMutedNotification, tips) } -func (g *GroupNotificationSender) GroupMemberCancelMutedNotification( - ctx context.Context, - groupID, groupMemberUserID string, -) (err error) { +func (g *GroupNotificationSender) GroupMemberCancelMutedNotification(ctx context.Context, groupID, groupMemberUserID string) (err error) { group, err := g.getGroupInfo(ctx, groupID) if err != nil { return err @@ -572,21 +445,11 @@ func (g *GroupNotificationSender) GroupMemberCancelMutedNotification( if err != nil { return err } - tips := &sdkws.GroupMemberCancelMutedTips{ - Group: group, - OpUser: user[mcontext.GetOpUserID(ctx)], - MutedUser: user[groupMemberUserID], - } + tips := &sdkws.GroupMemberCancelMutedTips{Group: group, OpUser: user[mcontext.GetOpUserID(ctx)], MutedUser: user[groupMemberUserID]} if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil { return err } - return g.Notification( - ctx, - mcontext.GetOpUserID(ctx), - group.GroupID, - constant.GroupMemberCancelMutedNotification, - tips, - ) + return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.GroupMemberCancelMutedNotification, tips) } func (g *GroupNotificationSender) GroupMutedNotification(ctx context.Context, groupID string) (err error) { @@ -627,10 +490,7 @@ func (g *GroupNotificationSender) GroupCancelMutedNotification(ctx context.Conte return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.GroupCancelMutedNotification, tips) } -func (g *GroupNotificationSender) GroupMemberInfoSetNotification( - ctx context.Context, - groupID, groupMemberUserID string, -) (err error) { +func (g *GroupNotificationSender) GroupMemberInfoSetNotification(ctx context.Context, groupID, groupMemberUserID string) (err error) { group, err := g.getGroupInfo(ctx, groupID) if err != nil { return err @@ -639,21 +499,14 @@ func (g *GroupNotificationSender) GroupMemberInfoSetNotification( if err != nil { return err } - tips := &sdkws.GroupMemberInfoSetTips{ - Group: group, - OpUser: user[mcontext.GetOpUserID(ctx)], - ChangedUser: user[groupMemberUserID], - } + tips := &sdkws.GroupMemberInfoSetTips{Group: group, OpUser: user[mcontext.GetOpUserID(ctx)], ChangedUser: user[groupMemberUserID]} if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil { return err } return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.GroupMemberInfoSetNotification, tips) } -func (g *GroupNotificationSender) GroupMemberSetToAdminNotification( - ctx context.Context, - groupID, groupMemberUserID string, -) (err error) { +func (g *GroupNotificationSender) GroupMemberSetToAdminNotification(ctx context.Context, groupID, groupMemberUserID string) (err error) { group, err := g.getGroupInfo(ctx, groupID) if err != nil { return err @@ -662,27 +515,14 @@ func (g *GroupNotificationSender) GroupMemberSetToAdminNotification( if err != nil { return err } - tips := &sdkws.GroupMemberInfoSetTips{ - Group: group, - OpUser: user[mcontext.GetOpUserID(ctx)], - ChangedUser: user[groupMemberUserID], - } + tips := &sdkws.GroupMemberInfoSetTips{Group: group, OpUser: user[mcontext.GetOpUserID(ctx)], ChangedUser: user[groupMemberUserID]} if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil { return err } - return g.Notification( - ctx, - mcontext.GetOpUserID(ctx), - group.GroupID, - constant.GroupMemberSetToAdminNotification, - tips, - ) + return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.GroupMemberSetToAdminNotification, tips) } -func (g *GroupNotificationSender) GroupMemberSetToOrdinaryUserNotification( - ctx context.Context, - groupID, groupMemberUserID string, -) (err error) { +func (g *GroupNotificationSender) GroupMemberSetToOrdinaryUserNotification(ctx context.Context, groupID, groupMemberUserID string) (err error) { group, err := g.getGroupInfo(ctx, groupID) if err != nil { return err @@ -691,28 +531,14 @@ func (g *GroupNotificationSender) GroupMemberSetToOrdinaryUserNotification( if err != nil { return err } - tips := &sdkws.GroupMemberInfoSetTips{ - Group: group, - OpUser: user[mcontext.GetOpUserID(ctx)], - ChangedUser: user[groupMemberUserID], - } + tips := &sdkws.GroupMemberInfoSetTips{Group: group, OpUser: user[mcontext.GetOpUserID(ctx)], ChangedUser: user[groupMemberUserID]} if err := g.fillOpUser(ctx, &tips.OpUser, tips.Group.GroupID); err != nil { return err } - return g.Notification( - ctx, - mcontext.GetOpUserID(ctx), - group.GroupID, - constant.GroupMemberSetToOrdinaryUserNotification, - tips, - ) + return g.Notification(ctx, mcontext.GetOpUserID(ctx), group.GroupID, constant.GroupMemberSetToOrdinaryUserNotification, tips) } -func (g *GroupNotificationSender) MemberEnterDirectlyNotification( - ctx context.Context, - groupID string, - entrantUserID string, -) (err error) { +func (g *GroupNotificationSender) MemberEnterDirectlyNotification(ctx context.Context, groupID string, entrantUserID string) (err error) { defer log.ZDebug(ctx, "return") defer func() { if err != nil { diff --git a/pkg/rpcclient/notification/msg.go b/pkg/rpcclient/notification/msg.go new file mode 100644 index 000000000..97724f727 --- /dev/null +++ b/pkg/rpcclient/notification/msg.go @@ -0,0 +1,36 @@ +package notification + +import ( + "context" + + "github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant" + "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" + "github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient" +) + +type MsgNotificationSender struct { + *rpcclient.NotificationSender +} + +func NewMsgNotificationSender(opts ...rpcclient.NotificationSenderOptions) *MsgNotificationSender { + return &MsgNotificationSender{rpcclient.NewNotificationSender(opts...)} +} + +func (m *MsgNotificationSender) UserDeleteMsgsNotification(ctx context.Context, userID, conversationID string, seqs []int64) error { + tips := sdkws.DeleteMsgsTips{ + UserID: userID, + ConversationID: conversationID, + Seqs: seqs, + } + return m.Notification(ctx, userID, userID, constant.MsgDeleteNotification, &tips) +} + +func (m *MsgNotificationSender) MarkAsReadNotification(ctx context.Context, conversationID string, sesstionType int32, sendID, recvID string, seqs []int64, hasReadSeq int64) error { + tips := &sdkws.MarkAsReadTips{ + MarkAsReadUserID: sendID, + ConversationID: conversationID, + Seqs: seqs, + HasReadSeq: hasReadSeq, + } + return m.NotificationWithSesstionType(ctx, sendID, recvID, constant.HasReadReceipt, sesstionType, tips) +} diff --git a/pkg/rpcclient/user.go b/pkg/rpcclient/user.go index 17dec167c..a88c061e2 100644 --- a/pkg/rpcclient/user.go +++ b/pkg/rpcclient/user.go @@ -17,7 +17,6 @@ package rpcclient import ( "context" "strings" - "time" "google.golang.org/grpc" @@ -33,17 +32,16 @@ import ( type User struct { conn grpc.ClientConnInterface Client user.UserClient - discov discoveryregistry.SvcDiscoveryRegistry + Discov discoveryregistry.SvcDiscoveryRegistry } func NewUser(discov discoveryregistry.SvcDiscoveryRegistry) *User { - ctx, _ := context.WithTimeout(context.Background(), time.Second*3) - conn, err := discov.GetConn(ctx, config.Config.RpcRegisterName.OpenImUserName) + conn, err := discov.GetConn(context.Background(), config.Config.RpcRegisterName.OpenImUserName) if err != nil { panic(err) } client := user.NewUserClient(conn) - return &User{discov: discov, Client: client, conn: conn} + return &User{Discov: discov, Client: client, conn: conn} } type UserRpcClient User diff --git a/pkg/utils/utils_v2.go b/pkg/utils/utils_v2.go index f4cc44871..dc14fe4e8 100644 --- a/pkg/utils/utils_v2.go +++ b/pkg/utils/utils_v2.go @@ -543,3 +543,15 @@ func Batch[T any, V any](fn func(T) V, ts []T) []V { } return res } + +func InitSlice[T any](val *[]T) { + if val != nil && *val == nil { + *val = []T{} + } +} + +func InitMap[K comparable, V any](val *map[K]V) { + if val != nil && *val == nil { + *val = map[K]V{} + } +}