github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/chat/types/types.go (about) 1 package types 2 3 import ( 4 "errors" 5 "fmt" 6 "io" 7 "os" 8 9 "github.com/keybase/client/go/chat/s3" 10 "github.com/keybase/client/go/libkb" 11 "github.com/keybase/client/go/protocol/chat1" 12 "github.com/keybase/client/go/protocol/gregor1" 13 "github.com/keybase/client/go/protocol/keybase1" 14 "github.com/keybase/client/go/protocol/stellar1" 15 context "golang.org/x/net/context" 16 ) 17 18 const ( 19 ActionNewConversation = "newConversation" 20 ActionNewMessage = "newMessage" 21 ActionReadMessage = "readMessage" 22 ActionSetStatus = "setStatus" 23 ActionSetAppNotificationSettings = "setAppNotificationSettings" 24 ActionTeamType = "teamType" 25 ActionExpunge = "expunge" 26 27 PushActivity = "chat.activity" 28 PushTyping = "chat.typing" 29 PushMembershipUpdate = "chat.membershipUpdate" 30 PushTLFFinalize = "chat.tlffinalize" 31 PushTLFResolve = "chat.tlfresolve" 32 PushKBFSUpgrade = "chat.kbfsupgrade" 33 PushConvRetention = "chat.convretention" 34 PushTeamRetention = "chat.teamretention" 35 PushConvSettings = "chat.convsettings" 36 PushSubteamRename = "chat.subteamrename" 37 PushConversationsUpdate = "chat.conversationsupdate" 38 39 MapsDomain = "keybasemaps" 40 ) 41 42 func NewAllCryptKeys() AllCryptKeys { 43 return make(AllCryptKeys) 44 } 45 46 type NameInfo struct { 47 ID chat1.TLFID 48 CanonicalName string 49 VerifiedMembers []gregor1.UID // may be empty if we couldn't satisfy the request 50 } 51 52 func NewNameInfo() *NameInfo { 53 return &NameInfo{} 54 } 55 56 type MembershipUpdateRes struct { 57 RoleUpdates []chat1.ConversationLocal 58 UserJoinedConvs []chat1.ConversationLocal 59 UserRemovedConvs []chat1.ConversationMember 60 UserResetConvs []chat1.ConversationMember 61 OthersJoinedConvs []chat1.ConversationMember 62 OthersRemovedConvs []chat1.ConversationMember 63 OthersResetConvs []chat1.ConversationMember 64 } 65 66 func (m MembershipUpdateRes) AllOtherUsers() (res []gregor1.UID) { 67 res = make([]gregor1.UID, 0, len(m.OthersResetConvs)+len(m.OthersJoinedConvs)+len(m.OthersRemovedConvs)) 68 for _, cm := range append(m.OthersResetConvs, append(m.OthersJoinedConvs, m.OthersRemovedConvs...)...) { 69 res = append(res, cm.Uid) 70 } 71 return res 72 } 73 74 type InboxSourceSearchEmptyMode int 75 76 const ( 77 InboxSourceSearchEmptyModeUnread InboxSourceSearchEmptyMode = iota 78 InboxSourceSearchEmptyModeAll 79 InboxSourceSearchEmptyModeAllBySendCtime 80 ) 81 82 type InboxSourceDataSourceTyp int 83 84 const ( 85 InboxSourceDataSourceAll InboxSourceDataSourceTyp = iota 86 InboxSourceDataSourceRemoteOnly 87 InboxSourceDataSourceLocalOnly 88 ) 89 90 type RemoteConversationMetadata struct { 91 Name string `codec:"n"` 92 TopicName string `codec:"t"` 93 Snippet string `codec:"s"` 94 SnippetDecoration chat1.SnippetDecoration `codec:"d"` 95 Headline string `codec:"h"` 96 HeadlineEmojis []chat1.HarvestedEmoji `codec:"e"` 97 WriterNames []string `codec:"w"` 98 FullNamesForSearch []*string `codec:"f"` 99 ResetParticipants []string `codec:"r"` 100 } 101 102 func (m RemoteConversationMetadata) DeepCopy() (res RemoteConversationMetadata) { 103 res.Name = m.Name 104 res.TopicName = m.TopicName 105 res.Snippet = m.Snippet 106 res.SnippetDecoration = m.SnippetDecoration 107 res.Headline = m.Headline 108 res.HeadlineEmojis = make([]chat1.HarvestedEmoji, len(m.HeadlineEmojis)) 109 copy(res.HeadlineEmojis, m.HeadlineEmojis) 110 res.WriterNames = make([]string, len(m.WriterNames)) 111 copy(res.WriterNames, m.WriterNames) 112 res.FullNamesForSearch = make([]*string, len(m.FullNamesForSearch)) 113 copy(res.FullNamesForSearch, m.FullNamesForSearch) 114 res.ResetParticipants = make([]string, len(m.ResetParticipants)) 115 copy(res.ResetParticipants, m.ResetParticipants) 116 return res 117 } 118 119 type RemoteConversation struct { 120 Conv chat1.Conversation `codec:"c"` 121 ConvIDStr chat1.ConvIDStr `codec:"i"` 122 LocalMetadata *RemoteConversationMetadata `codec:"l"` 123 LocalReadMsgID chat1.MessageID `codec:"r"` 124 LocalDraft *string `codec:"d"` 125 LocalMtime gregor1.Time `codec:"t"` 126 } 127 128 func NewEmptyRemoteConversation(convID chat1.ConversationID) RemoteConversation { 129 return RemoteConversation{ 130 Conv: chat1.Conversation{ 131 Metadata: chat1.ConversationMetadata{ 132 ConversationID: convID, 133 }, 134 }, 135 ConvIDStr: convID.ConvIDStr(), 136 } 137 } 138 139 func (rc RemoteConversation) DeepCopy() (res RemoteConversation) { 140 res.Conv = rc.Conv.DeepCopy() 141 res.ConvIDStr = rc.ConvIDStr 142 if rc.LocalMetadata != nil { 143 res.LocalMetadata = new(RemoteConversationMetadata) 144 *res.LocalMetadata = rc.LocalMetadata.DeepCopy() 145 } 146 res.LocalReadMsgID = rc.LocalReadMsgID 147 if rc.LocalDraft != nil { 148 res.LocalDraft = new(string) 149 *res.LocalDraft = *rc.LocalDraft 150 } 151 res.LocalMtime = rc.LocalMtime 152 return res 153 } 154 155 func (rc RemoteConversation) GetMtime() gregor1.Time { 156 res := rc.Conv.GetMtime() 157 if res > rc.LocalMtime { 158 return res 159 } 160 return rc.LocalMtime 161 } 162 163 func (rc RemoteConversation) GetReadMsgID() chat1.MessageID { 164 res := rc.Conv.ReaderInfo.ReadMsgid 165 if res > rc.LocalReadMsgID { 166 return res 167 } 168 return rc.LocalReadMsgID 169 } 170 171 func (rc RemoteConversation) GetConvID() chat1.ConversationID { 172 return rc.Conv.GetConvID() 173 } 174 175 func (rc RemoteConversation) GetVersion() chat1.ConversationVers { 176 return rc.Conv.Metadata.Version 177 } 178 179 func (rc RemoteConversation) GetMembersType() chat1.ConversationMembersType { 180 return rc.Conv.GetMembersType() 181 } 182 183 func (rc RemoteConversation) GetTeamType() chat1.TeamType { 184 return rc.Conv.GetTeamType() 185 } 186 187 func (rc RemoteConversation) CannotWrite() bool { 188 return rc.Conv.CannotWrite() 189 } 190 191 func (rc RemoteConversation) GetTopicName() string { 192 if rc.LocalMetadata != nil { 193 return rc.LocalMetadata.TopicName 194 } 195 return "" 196 } 197 198 func (rc RemoteConversation) GetMaxMessage(typ chat1.MessageType) (chat1.MessageSummary, error) { 199 return rc.Conv.GetMaxMessage(typ) 200 } 201 202 func (rc RemoteConversation) GetTopicType() chat1.TopicType { 203 return rc.Conv.GetTopicType() 204 } 205 206 func (rc RemoteConversation) IsLocallyRead() bool { 207 return rc.LocalReadMsgID >= rc.Conv.MaxVisibleMsgID() 208 } 209 210 func (rc RemoteConversation) MaxVisibleMsgID() chat1.MessageID { 211 return rc.Conv.MaxVisibleMsgID() 212 } 213 214 func (rc RemoteConversation) GetExpunge() *chat1.Expunge { 215 return rc.Conv.GetExpunge() 216 } 217 218 func (rc RemoteConversation) GetFinalizeInfo() *chat1.ConversationFinalizeInfo { 219 return rc.Conv.GetFinalizeInfo() 220 } 221 222 func (rc RemoteConversation) GetMaxDeletedUpTo() chat1.MessageID { 223 return rc.Conv.GetMaxDeletedUpTo() 224 } 225 226 func (rc RemoteConversation) IsPublic() bool { 227 return rc.Conv.IsPublic() 228 } 229 230 type UnboxMode int 231 232 const ( 233 UnboxModeFull UnboxMode = iota 234 UnboxModeQuick 235 ) 236 237 func (m UnboxMode) ShouldCache() bool { 238 switch m { 239 case UnboxModeFull: 240 return true 241 case UnboxModeQuick: 242 return false 243 } 244 return true 245 } 246 247 type Inbox struct { 248 Version chat1.InboxVers 249 ConvsUnverified []RemoteConversation 250 Convs []chat1.ConversationLocal 251 } 252 253 type InboxSyncRes struct { 254 FilteredConvs []RemoteConversation 255 TeamTypeChanged bool 256 MembersTypeChanged []chat1.ConversationID 257 Expunges []InboxSyncResExpunge 258 TopicNameChanged []chat1.ConversationID 259 } 260 261 type InboxSyncResExpunge struct { 262 ConvID chat1.ConversationID 263 Expunge chat1.Expunge 264 } 265 266 type ConvLoaderPriority int 267 268 var ( 269 ConvLoaderPriorityHighest ConvLoaderPriority = 10 270 ConvLoaderPriorityHigh ConvLoaderPriority = 7 271 ConvLoaderPriorityMedium ConvLoaderPriority = 5 272 ConvLoaderPriorityLow ConvLoaderPriority = 3 273 ConvLoaderPriorityLowest ConvLoaderPriority 274 ) 275 276 func (c ConvLoaderPriority) HigherThan(c2 ConvLoaderPriority) bool { 277 return int(c) > int(c2) 278 } 279 280 type ConvLoaderUniqueness int 281 282 const ( 283 ConvLoaderUnique ConvLoaderUniqueness = iota 284 ConvLoaderGeneric 285 ) 286 287 type ConvLoaderJob struct { 288 ConvID chat1.ConversationID 289 Pagination *chat1.Pagination 290 Priority ConvLoaderPriority 291 Uniqueness ConvLoaderUniqueness 292 PostLoadHook func(context.Context, chat1.ThreadView, ConvLoaderJob) 293 } 294 295 func (j ConvLoaderJob) HigherPriorityThan(j2 ConvLoaderJob) bool { 296 return j.Priority.HigherThan(j2.Priority) 297 } 298 299 func (j ConvLoaderJob) String() string { 300 return fmt.Sprintf("[convID: %s pagination: %s unique: %v]", j.ConvID, j.Pagination, j.Uniqueness) 301 } 302 303 func NewConvLoaderJob(convID chat1.ConversationID, pagination *chat1.Pagination, priority ConvLoaderPriority, 304 uniqueness ConvLoaderUniqueness, postLoadHook func(context.Context, chat1.ThreadView, ConvLoaderJob)) ConvLoaderJob { 305 return ConvLoaderJob{ 306 ConvID: convID, 307 Pagination: pagination, 308 Priority: priority, 309 Uniqueness: uniqueness, 310 PostLoadHook: postLoadHook, 311 } 312 } 313 314 type AsyncInboxResult struct { 315 Conv RemoteConversation 316 ConvLocal chat1.ConversationLocal 317 InboxRes *Inbox // set if we are returning the whole inbox 318 } 319 320 type ConversationLocalizerTyp int 321 322 const ( 323 ConversationLocalizerBlocking ConversationLocalizerTyp = iota 324 ConversationLocalizerNonblocking 325 ) 326 327 type AttachmentUploaderTaskStatus int 328 329 const ( 330 AttachmentUploaderTaskStatusUploading AttachmentUploaderTaskStatus = iota 331 AttachmentUploaderTaskStatusSuccess 332 AttachmentUploaderTaskStatusFailed 333 ) 334 335 type FlipSendStatus int 336 337 const ( 338 FlipSendStatusInProgress FlipSendStatus = iota 339 FlipSendStatusSent 340 FlipSendStatusError 341 ) 342 343 type AttachmentUploadResult struct { 344 Error *string 345 Object chat1.Asset 346 Preview *chat1.Asset 347 Metadata []byte 348 } 349 350 type BoxerEncryptionInfo struct { 351 Key CryptKey 352 SigningKeyPair libkb.NaclSigningKeyPair 353 EphemeralKey EphemeralCryptKey 354 PairwiseMACRecipients []keybase1.KID 355 Version chat1.MessageBoxedVersion 356 } 357 358 type SenderPrepareOptions struct { 359 SkipTopicNameState bool 360 } 361 362 type SenderPrepareResult struct { 363 Boxed chat1.MessageBoxed 364 EncryptionInfo BoxerEncryptionInfo 365 PendingAssetDeletes []chat1.Asset 366 DeleteFlipConv *chat1.ConversationID 367 AtMentions []gregor1.UID 368 ChannelMention chat1.ChannelMention 369 TopicNameState *chat1.TopicNameState 370 TopicNameStateConvs []chat1.ConversationID 371 } 372 373 type ParsedStellarPayment struct { 374 Username libkb.NormalizedUsername 375 Full string 376 Amount string 377 Currency string 378 } 379 380 func (p ParsedStellarPayment) ToMini() libkb.MiniChatPayment { 381 return libkb.MiniChatPayment{ 382 Username: p.Username, 383 Amount: p.Amount, 384 Currency: p.Currency, 385 } 386 } 387 388 type ParticipantResult struct { 389 Uids []gregor1.UID 390 Err error 391 } 392 393 type EmojiHarvestMode int 394 395 const ( 396 EmojiHarvestModeNormal EmojiHarvestMode = iota 397 EmojiHarvestModeFast 398 ) 399 400 type DummyAttachmentFetcher struct{} 401 402 var _ AttachmentFetcher = (*DummyAttachmentFetcher)(nil) 403 404 func (d DummyAttachmentFetcher) FetchAttachment(ctx context.Context, w io.Writer, 405 convID chat1.ConversationID, asset chat1.Asset, r func() chat1.RemoteInterface, signer s3.Signer, 406 progress ProgressReporter) error { 407 return nil 408 } 409 410 func (d DummyAttachmentFetcher) StreamAttachment(ctx context.Context, convID chat1.ConversationID, 411 asset chat1.Asset, ri func() chat1.RemoteInterface, signer s3.Signer) (io.ReadSeeker, error) { 412 return nil, nil 413 } 414 415 func (d DummyAttachmentFetcher) DeleteAssets(ctx context.Context, 416 convID chat1.ConversationID, assets []chat1.Asset, ri func() chat1.RemoteInterface, signer s3.Signer) (err error) { 417 return nil 418 } 419 420 func (d DummyAttachmentFetcher) PutUploadedAsset(ctx context.Context, filename string, asset chat1.Asset) error { 421 return nil 422 } 423 424 func (d DummyAttachmentFetcher) IsAssetLocal(ctx context.Context, asset chat1.Asset) (bool, error) { 425 return false, nil 426 } 427 func (d DummyAttachmentFetcher) OnDbNuke(mctx libkb.MetaContext) error { return nil } 428 func (d DummyAttachmentFetcher) OnStart(mctx libkb.MetaContext) {} 429 430 type DummyAttachmentHTTPSrv struct{} 431 432 var _ AttachmentURLSrv = (*DummyAttachmentHTTPSrv)(nil) 433 434 func (d DummyAttachmentHTTPSrv) GetURL(ctx context.Context, convID chat1.ConversationID, msgID chat1.MessageID, 435 preview, noAnim, isEmoji bool) string { 436 return "" 437 } 438 439 func (d DummyAttachmentHTTPSrv) GetPendingPreviewURL(ctx context.Context, outboxID chat1.OutboxID) string { 440 return "" 441 } 442 443 func (d DummyAttachmentHTTPSrv) GetUnfurlAssetURL(ctx context.Context, convID chat1.ConversationID, 444 asset chat1.Asset) string { 445 return "" 446 } 447 448 func (d DummyAttachmentHTTPSrv) GetAttachmentFetcher() AttachmentFetcher { 449 return DummyAttachmentFetcher{} 450 } 451 452 func (d DummyAttachmentHTTPSrv) GetGiphyURL(ctx context.Context, giphyURL string) string { 453 return "" 454 } 455 func (d DummyAttachmentHTTPSrv) GetGiphyGalleryURL(ctx context.Context, convID chat1.ConversationID, 456 tlfName string, results []chat1.GiphySearchResult) string { 457 return "" 458 } 459 func (d DummyAttachmentHTTPSrv) OnDbNuke(mctx libkb.MetaContext) error { return nil } 460 461 type DummyStellarLoader struct{} 462 463 var _ StellarLoader = (*DummyStellarLoader)(nil) 464 465 func (d DummyStellarLoader) LoadPayment(ctx context.Context, convID chat1.ConversationID, msgID chat1.MessageID, senderUsername string, paymentID stellar1.PaymentID) *chat1.UIPaymentInfo { 466 return nil 467 } 468 469 func (d DummyStellarLoader) LoadRequest(ctx context.Context, convID chat1.ConversationID, msgID chat1.MessageID, senderUsername string, requestID stellar1.KeybaseRequestID) *chat1.UIRequestInfo { 470 return nil 471 } 472 473 type DummyEphemeralPurger struct{} 474 475 var _ EphemeralPurger = (*DummyEphemeralPurger)(nil) 476 477 func (d DummyEphemeralPurger) Start(ctx context.Context, uid gregor1.UID) {} 478 func (d DummyEphemeralPurger) Stop(ctx context.Context) chan struct{} { 479 ch := make(chan struct{}) 480 close(ch) 481 return ch 482 } 483 func (d DummyEphemeralPurger) Queue(ctx context.Context, purgeInfo chat1.EphemeralPurgeInfo) error { 484 return nil 485 } 486 487 type DummyIndexer struct{} 488 489 var _ Indexer = (*DummyIndexer)(nil) 490 491 func (d DummyIndexer) Start(ctx context.Context, uid gregor1.UID) {} 492 func (d DummyIndexer) Stop(ctx context.Context) chan struct{} { 493 ch := make(chan struct{}) 494 close(ch) 495 return ch 496 } 497 func (d DummyIndexer) Suspend(ctx context.Context) bool { 498 return false 499 } 500 func (d DummyIndexer) Resume(ctx context.Context) bool { 501 return false 502 } 503 func (d DummyIndexer) Search(ctx context.Context, query, origQuery string, 504 opts chat1.SearchOpts, hitUICh chan chat1.ChatSearchInboxHit, indexUICh chan chat1.ChatSearchIndexStatus) (*chat1.ChatSearchInboxResults, error) { 505 return nil, nil 506 } 507 func (d DummyIndexer) Add(ctx context.Context, convID chat1.ConversationID, msg []chat1.MessageUnboxed) error { 508 return nil 509 } 510 func (d DummyIndexer) Remove(ctx context.Context, convID chat1.ConversationID, msg []chat1.MessageUnboxed) error { 511 return nil 512 } 513 func (d DummyIndexer) SearchableConvs(ctx context.Context, convID *chat1.ConversationID) ([]RemoteConversation, error) { 514 return nil, nil 515 } 516 func (d DummyIndexer) IndexInbox(ctx context.Context) (map[chat1.ConvIDStr]chat1.ProfileSearchConvStats, error) { 517 return nil, nil 518 } 519 func (d DummyIndexer) IsBackgroundActive() bool { return false } 520 func (d DummyIndexer) ClearCache() {} 521 func (d DummyIndexer) OnLogout(mctx libkb.MetaContext) error { 522 return nil 523 } 524 func (d DummyIndexer) OnDbNuke(mctx libkb.MetaContext) error { 525 return nil 526 } 527 func (d DummyIndexer) FullyIndexed(ctx context.Context, convID chat1.ConversationID) (bool, error) { 528 return false, nil 529 } 530 func (d DummyIndexer) PercentIndexed(ctx context.Context, convID chat1.ConversationID) (int, error) { 531 return 0, nil 532 } 533 func (d DummyIndexer) Clear(ctx context.Context, uid gregor1.UID, convID chat1.ConversationID) error { 534 return nil 535 } 536 537 type DummyNativeVideoHelper struct{} 538 539 var _ NativeVideoHelper = (*DummyNativeVideoHelper)(nil) 540 541 func (d DummyNativeVideoHelper) ThumbnailAndDuration(ctx context.Context, filename string) ([]byte, int, error) { 542 return nil, 0, nil 543 } 544 545 type UnfurlerTaskStatus int 546 547 const ( 548 UnfurlerTaskStatusUnfurling UnfurlerTaskStatus = iota 549 UnfurlerTaskStatusSuccess 550 UnfurlerTaskStatusFailed 551 UnfurlerTaskStatusPermFailed 552 ) 553 554 type DummyUnfurler struct{} 555 556 var _ Unfurler = (*DummyUnfurler)(nil) 557 558 func (d DummyUnfurler) UnfurlAndSend(ctx context.Context, uid gregor1.UID, convID chat1.ConversationID, 559 msg chat1.MessageUnboxed) { 560 } 561 func (d DummyUnfurler) Prefetch(ctx context.Context, uid gregor1.UID, convID chat1.ConversationID, msgText string) int { 562 return 0 563 } 564 func (d DummyUnfurler) Status(ctx context.Context, outboxID chat1.OutboxID) (UnfurlerTaskStatus, *chat1.UnfurlResult, error) { 565 return UnfurlerTaskStatusFailed, nil, nil 566 } 567 func (d DummyUnfurler) Retry(ctx context.Context, outboxID chat1.OutboxID) {} 568 func (d DummyUnfurler) Complete(ctx context.Context, outboxID chat1.OutboxID) {} 569 570 func (d DummyUnfurler) GetSettings(ctx context.Context, uid gregor1.UID) (res chat1.UnfurlSettings, err error) { 571 return res, nil 572 } 573 574 func (d DummyUnfurler) WhitelistAdd(ctx context.Context, uid gregor1.UID, domain string) error { 575 return nil 576 } 577 578 func (d DummyUnfurler) WhitelistRemove(ctx context.Context, uid gregor1.UID, domain string) error { 579 return nil 580 } 581 582 func (d DummyUnfurler) WhitelistAddExemption(ctx context.Context, uid gregor1.UID, 583 exemption WhitelistExemption) { 584 } 585 586 func (d DummyUnfurler) SetMode(ctx context.Context, uid gregor1.UID, mode chat1.UnfurlMode) error { 587 return nil 588 } 589 590 func (d DummyUnfurler) SetSettings(ctx context.Context, uid gregor1.UID, settings chat1.UnfurlSettings) error { 591 return nil 592 } 593 594 type DummyStellarSender struct{} 595 596 var _ StellarSender = (*DummyStellarSender)(nil) 597 598 func (d DummyStellarSender) ParsePayments(ctx context.Context, uid gregor1.UID, convID chat1.ConversationID, 599 body string, replyTo *chat1.MessageID) []ParsedStellarPayment { 600 return nil 601 } 602 603 func (d DummyStellarSender) DescribePayments(ctx context.Context, uid gregor1.UID, 604 convID chat1.ConversationID, payments []ParsedStellarPayment) (res chat1.UIChatPaymentSummary, toSend []ParsedStellarPayment, err error) { 605 return res, toSend, nil 606 } 607 608 func (d DummyStellarSender) SendPayments(ctx context.Context, convID chat1.ConversationID, payments []ParsedStellarPayment) ([]chat1.TextPayment, error) { 609 return nil, nil 610 } 611 612 func (d DummyStellarSender) DecorateWithPayments(ctx context.Context, body string, 613 payments []chat1.TextPayment) string { 614 return body 615 } 616 617 type DummyCoinFlipManager struct{} 618 619 var _ CoinFlipManager = (*DummyCoinFlipManager)(nil) 620 621 func (d DummyCoinFlipManager) Start(ctx context.Context, uid gregor1.UID) {} 622 func (d DummyCoinFlipManager) Stop(ctx context.Context) chan struct{} { 623 ch := make(chan struct{}) 624 close(ch) 625 return ch 626 } 627 func (d DummyCoinFlipManager) StartFlip(ctx context.Context, uid gregor1.UID, hostConvID chat1.ConversationID, tlfName, text string, outboxID *chat1.OutboxID) error { 628 return nil 629 } 630 func (d DummyCoinFlipManager) MaybeInjectFlipMessage(ctx context.Context, boxedMsg chat1.MessageBoxed, 631 inboxVers chat1.InboxVers, uid gregor1.UID, convID chat1.ConversationID, topicType chat1.TopicType) bool { 632 return false 633 } 634 635 func (d DummyCoinFlipManager) LoadFlip(ctx context.Context, uid gregor1.UID, hostConvID chat1.ConversationID, 636 hostMsgID chat1.MessageID, flipConvID chat1.ConversationID, gameID chat1.FlipGameID) (chan chat1.UICoinFlipStatus, chan error) { 637 return nil, nil 638 } 639 640 func (d DummyCoinFlipManager) DescribeFlipText(ctx context.Context, text string) string { return "" } 641 642 func (d DummyCoinFlipManager) HasActiveGames(ctx context.Context) bool { 643 return false 644 } 645 646 func (d DummyCoinFlipManager) IsFlipConversationCreated(ctx context.Context, outboxID chat1.OutboxID) (chat1.ConversationID, FlipSendStatus) { 647 return nil, FlipSendStatusError 648 } 649 650 type DummyTeamMentionLoader struct{} 651 652 func (d DummyTeamMentionLoader) Start(ctx context.Context, uid gregor1.UID) {} 653 func (d DummyTeamMentionLoader) Stop(ctx context.Context) chan struct{} { 654 ch := make(chan struct{}) 655 close(ch) 656 return ch 657 } 658 659 func (d DummyTeamMentionLoader) LoadTeamMention(ctx context.Context, uid gregor1.UID, 660 maybeMention chat1.MaybeMention, knownTeamMentions []chat1.KnownTeamMention, 661 forceRemote bool) error { 662 return nil 663 } 664 665 func (d DummyTeamMentionLoader) IsTeamMention(ctx context.Context, uid gregor1.UID, 666 maybeMention chat1.MaybeMention, knownTeamMentions []chat1.KnownTeamMention) bool { 667 return false 668 } 669 670 type DummyExternalAPIKeySource struct{} 671 672 func (d DummyExternalAPIKeySource) GetKey(ctx context.Context, typ chat1.ExternalAPIKeyTyp) (res chat1.ExternalAPIKey, err error) { 673 switch typ { 674 case chat1.ExternalAPIKeyTyp_GIPHY: 675 return chat1.NewExternalAPIKeyWithGiphy(""), nil 676 case chat1.ExternalAPIKeyTyp_GOOGLEMAPS: 677 return chat1.NewExternalAPIKeyWithGooglemaps(""), nil 678 } 679 return res, errors.New("dummy doesnt know about key typ") 680 } 681 682 func (d DummyExternalAPIKeySource) GetAllKeys(ctx context.Context) (res []chat1.ExternalAPIKey, err error) { 683 return res, nil 684 } 685 686 type DummyBotCommandManager struct{} 687 688 func (d DummyBotCommandManager) Advertise(ctx context.Context, alias *string, 689 ads []chat1.AdvertiseCommandsParam) error { 690 return nil 691 } 692 693 func (d DummyBotCommandManager) Clear(context.Context, *chat1.ClearBotCommandsFilter) error { 694 return nil 695 } 696 697 func (d DummyBotCommandManager) PublicCommandsConv(ctx context.Context, username string) (*chat1.ConversationID, error) { 698 return nil, nil 699 } 700 701 func (d DummyBotCommandManager) ListCommands(ctx context.Context, convID chat1.ConversationID) ([]chat1.UserBotCommandOutput, map[string]string, error) { 702 return nil, make(map[string]string), nil 703 } 704 705 func (d DummyBotCommandManager) UpdateCommands(ctx context.Context, convID chat1.ConversationID, 706 info *chat1.BotInfo) (chan error, error) { 707 ch := make(chan error, 1) 708 ch <- nil 709 return ch, nil 710 } 711 712 func (d DummyBotCommandManager) Start(ctx context.Context, uid gregor1.UID) {} 713 func (d DummyBotCommandManager) Stop(ctx context.Context) chan struct{} { 714 ch := make(chan struct{}) 715 close(ch) 716 return ch 717 } 718 719 type DummyUIInboxLoader struct{} 720 721 func (d DummyUIInboxLoader) Start(ctx context.Context, uid gregor1.UID) {} 722 func (d DummyUIInboxLoader) Stop(ctx context.Context) chan struct{} { 723 ch := make(chan struct{}) 724 close(ch) 725 return ch 726 } 727 728 func (d DummyUIInboxLoader) LoadNonblock(ctx context.Context, query *chat1.GetInboxLocalQuery, 729 maxUnbox *int, skipUnverified bool) error { 730 return nil 731 } 732 733 func (d DummyUIInboxLoader) UpdateLayout(ctx context.Context, reselectMode chat1.InboxLayoutReselectMode, 734 reason string) { 735 } 736 737 func (d DummyUIInboxLoader) UpdateConvs(ctx context.Context, convIDs []chat1.ConversationID) error { 738 return nil 739 } 740 741 func (d DummyUIInboxLoader) UpdateLayoutFromNewMessage(ctx context.Context, conv RemoteConversation) { 742 } 743 744 func (d DummyUIInboxLoader) UpdateLayoutFromSubteamRename(ctx context.Context, convs []RemoteConversation) { 745 } 746 747 func (d DummyUIInboxLoader) UpdateLayoutFromSmallIncrease(ctx context.Context) {} 748 func (d DummyUIInboxLoader) UpdateLayoutFromSmallReset(ctx context.Context) {} 749 750 type DummyAttachmentUploader struct{} 751 752 var _ AttachmentUploader = (*DummyAttachmentUploader)(nil) 753 754 func (d DummyAttachmentUploader) Register(ctx context.Context, uid gregor1.UID, convID chat1.ConversationID, 755 outboxID chat1.OutboxID, title, filename string, metadata []byte, 756 callerPreview *chat1.MakePreviewRes) (AttachmentUploaderResultCb, error) { 757 return nil, nil 758 } 759 func (d DummyAttachmentUploader) Status(ctx context.Context, outboxID chat1.OutboxID) (AttachmentUploaderTaskStatus, AttachmentUploadResult, error) { 760 return 0, AttachmentUploadResult{}, nil 761 } 762 func (d DummyAttachmentUploader) Retry(ctx context.Context, outboxID chat1.OutboxID) (AttachmentUploaderResultCb, error) { 763 return nil, nil 764 } 765 func (d DummyAttachmentUploader) Cancel(ctx context.Context, outboxID chat1.OutboxID) error { 766 return nil 767 } 768 func (d DummyAttachmentUploader) Complete(ctx context.Context, outboxID chat1.OutboxID) {} 769 func (d DummyAttachmentUploader) GetUploadTempFile(ctx context.Context, outboxID chat1.OutboxID, filename string) (string, error) { 770 return "", nil 771 } 772 func (d DummyAttachmentUploader) GetUploadTempSink(ctx context.Context, filename string) (*os.File, chat1.OutboxID, error) { 773 return nil, nil, nil 774 } 775 func (d DummyAttachmentUploader) CancelUploadTempFile(ctx context.Context, outboxID chat1.OutboxID) error { 776 return nil 777 } 778 func (d DummyAttachmentUploader) OnDbNuke(mctx libkb.MetaContext) error { return nil } 779 780 type DummyUIThreadLoader struct{} 781 782 var _ UIThreadLoader = (*DummyUIThreadLoader)(nil) 783 784 func (d DummyUIThreadLoader) LoadNonblock(ctx context.Context, chatUI libkb.ChatUI, uid gregor1.UID, 785 convID chat1.ConversationID, reason chat1.GetThreadReason, pgmode chat1.GetThreadNonblockPgMode, 786 cbmode chat1.GetThreadNonblockCbMode, knownRemote []string, 787 query *chat1.GetThreadQuery, uipagination *chat1.UIPagination) error { 788 return nil 789 } 790 791 func (d DummyUIThreadLoader) Load(ctx context.Context, uid gregor1.UID, convID chat1.ConversationID, 792 reason chat1.GetThreadReason, knownRemotes []string, query *chat1.GetThreadQuery, 793 pagination *chat1.Pagination) (chat1.ThreadView, error) { 794 return chat1.ThreadView{}, nil 795 } 796 797 func (d DummyUIThreadLoader) IsOffline(ctx context.Context) bool { return true } 798 func (d DummyUIThreadLoader) Connected(ctx context.Context) {} 799 func (d DummyUIThreadLoader) Disconnected(ctx context.Context) {} 800 801 type DummyParticipantSource struct{} 802 803 var _ ParticipantSource = (*DummyParticipantSource)(nil) 804 805 func (d DummyParticipantSource) Get(ctx context.Context, uid gregor1.UID, convID chat1.ConversationID, 806 dataSource InboxSourceDataSourceTyp) ([]gregor1.UID, error) { 807 return nil, nil 808 } 809 func (d DummyParticipantSource) GetNonblock(ctx context.Context, uid gregor1.UID, 810 convID chat1.ConversationID, dataSource InboxSourceDataSourceTyp) chan ParticipantResult { 811 ch := make(chan ParticipantResult) 812 close(ch) 813 return ch 814 } 815 func (d DummyParticipantSource) GetWithNotifyNonblock(ctx context.Context, uid gregor1.UID, 816 convID chat1.ConversationID, dataSource InboxSourceDataSourceTyp) { 817 } 818 func (d DummyParticipantSource) GetParticipantsFromUids( 819 ctx context.Context, 820 uids []gregor1.UID, 821 ) ([]chat1.ConversationLocalParticipant, error) { 822 return nil, nil 823 } 824 825 type DummyEmojiSource struct{} 826 827 var _ EmojiSource = (*DummyEmojiSource)(nil) 828 829 func (DummyEmojiSource) Add(ctx context.Context, uid gregor1.UID, convID chat1.ConversationID, 830 alias, filename string, allowOverwrite bool) (res chat1.EmojiRemoteSource, err error) { 831 return res, err 832 } 833 func (DummyEmojiSource) AddAlias(ctx context.Context, uid gregor1.UID, convID chat1.ConversationID, 834 newAlias, existingAlias string) (res chat1.EmojiRemoteSource, err error) { 835 return res, err 836 } 837 func (DummyEmojiSource) Remove(ctx context.Context, uid gregor1.UID, convID chat1.ConversationID, 838 alias string) error { 839 return nil 840 } 841 func (DummyEmojiSource) Get(ctx context.Context, uid gregor1.UID, convID *chat1.ConversationID, 842 opts chat1.EmojiFetchOpts) (chat1.UserEmojis, error) { 843 return chat1.UserEmojis{}, nil 844 } 845 func (DummyEmojiSource) Decorate(ctx context.Context, body string, uid gregor1.UID, 846 messageType chat1.MessageType, emojis []chat1.HarvestedEmoji) string { 847 return body 848 } 849 func (DummyEmojiSource) Harvest(ctx context.Context, body string, uid gregor1.UID, 850 convID chat1.ConversationID, mode EmojiHarvestMode) (res []chat1.HarvestedEmoji, err error) { 851 return res, err 852 } 853 func (DummyEmojiSource) IsStockEmoji(alias string) bool { return true } 854 func (DummyEmojiSource) RemoteToLocalSource(ctx context.Context, uid gregor1.UID, 855 remote chat1.EmojiRemoteSource) (source chat1.EmojiLoadSource, noAnimSource chat1.EmojiLoadSource, err error) { 856 return source, noAnimSource, nil 857 } 858 func (DummyEmojiSource) ToggleAnimations(ctx context.Context, uid gregor1.UID, enabled bool) error { 859 return nil 860 } 861 func (DummyEmojiSource) IsValidSize(size int64) bool { 862 return false 863 } 864 865 type ClearOpts struct { 866 SendLocalAdminNotification bool 867 Reason string 868 } 869 870 type DummyEphemeralTracker struct{} 871 872 var _ EphemeralTracker = (*DummyEphemeralTracker)(nil) 873 874 func (d DummyEphemeralTracker) Start(ctx context.Context, uid gregor1.UID) {} 875 func (d DummyEphemeralTracker) Stop(ctx context.Context) chan struct{} { 876 ch := make(chan struct{}) 877 close(ch) 878 return ch 879 } 880 func (d DummyEphemeralTracker) GetAllPurgeInfo(ctx context.Context, uid gregor1.UID) ([]chat1.EphemeralPurgeInfo, error) { 881 return nil, nil 882 } 883 func (d DummyEphemeralTracker) GetPurgeInfo(ctx context.Context, uid gregor1.UID, convID chat1.ConversationID) (chat1.EphemeralPurgeInfo, error) { 884 return chat1.EphemeralPurgeInfo{}, nil 885 } 886 func (d DummyEphemeralTracker) InactivatePurgeInfo(ctx context.Context, convID chat1.ConversationID, uid gregor1.UID) error { 887 return nil 888 } 889 func (d DummyEphemeralTracker) SetPurgeInfo(ctx context.Context, convID chat1.ConversationID, uid gregor1.UID, purgeInfo *chat1.EphemeralPurgeInfo) error { 890 return nil 891 } 892 func (d DummyEphemeralTracker) MaybeUpdatePurgeInfo(ctx context.Context, convID chat1.ConversationID, uid gregor1.UID, purgeInfo *chat1.EphemeralPurgeInfo) error { 893 return nil 894 } 895 func (d DummyEphemeralTracker) Clear(ctx context.Context, convID chat1.ConversationID, uid gregor1.UID) error { 896 return nil 897 } 898 func (d DummyEphemeralTracker) OnDbNuke(mctx libkb.MetaContext) error { return nil } 899 func (d DummyEphemeralTracker) OnLogout(mctx libkb.MetaContext) error { return nil } 900 901 type DummyCtxFactory struct{} 902 903 var _ ContextFactory = (*DummyCtxFactory)(nil) 904 905 func (d DummyCtxFactory) NewKeyFinder() KeyFinder { return nil } 906 func (d DummyCtxFactory) NewUPAKFinder() UPAKFinder { return nil }