Stream Chat Unreal SDK
Loading...
Searching...
No Matches
ChatApi.h
1// Copyright 2026 Stream.IO, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "ChannelFlags.h"
6#include "CoreMinimal.h"
7#include "Request/Channel/ChannelRequestDto.h"
8#include "Request/Channel/MessagePaginationParamsRequestDto.h"
9#include "Request/Channel/PaginationParamsRequestDto.h"
10#include "Request/Message/MessageRequestDto.h"
11#include "Request/SortParamRequestDto.h"
12#include "RequestBuilder.h"
13#include "StreamJson.h"
14
15#include <type_traits>
16
17class FHttpClient;
18class FRequestBuilder;
19class FTokenManager;
20enum class EPushProvider : uint8;
29struct FFlagResponseDto;
35struct FHttpResponse;
47struct FResponseDto;
49struct FToken;
57
58template <class T>
59using TCallback = TFunction<void(const TResponse<T>&)>;
60
66class STREAMCHATAPI_API FChatApi : public TSharedFromThis<FChatApi>
67{
68public:
69 static TSharedRef<FChatApi> Create(const FString& InApiKey, const FString& InHost, const TSharedPtr<FTokenManager>&);
70
71#pragma region Moderation
90 void BanUser(
91 const FString& TargetUserId,
92 const FString& Type = {},
93 const FString& Id = {},
94 const TOptional<FTimespan>& Timeout = {},
95 const TOptional<FString>& Reason = {},
96 bool bShadow = false,
97 bool bIpBan = false,
98 TCallback<FResponseDto> Callback = {}) const;
99
107 void UnbanUser(const FString& TargetUserId, const FString& Type = {}, const FString& Id = {}, TCallback<FResponseDto> Callback = {}) const;
108
123 void QueryBannedUsers(
124 const TSharedRef<FJsonObject>& Filter,
125 const TArray<FSortParamRequestDto>& SortOptions = {},
126 const TOptional<FDateTime> CreatedAtAfterOrEqual = {},
127 const TOptional<FDateTime> CreatedAtAfter = {},
128 const TOptional<FDateTime> CreatedAtBeforeOrEqual = {},
129 const TOptional<FDateTime> CreatedAtBefore = {},
130 TOptional<uint32> Limit = {},
131 TOptional<uint32> Offset = {},
132 TCallback<FQueryBannedUsersResponseDto> Callback = {}) const;
133
142 void Flag(
143 const FString& TargetMessageId = {},
144 const FString& TargetUserId = {},
145 const FString& Reason = {},
146 const TMap<FString, FString>& CustomData = {},
147 TCallback<FFlagResponseDto> Callback = {}) const;
148
155 void Unflag(const FString& TargetMessageId = {}, const FString& TargetUserId = {}, TCallback<FFlagResponseDto> Callback = {}) const;
156
163 void MuteUsers(const TArray<FString>& TargetUserIds, TOptional<FTimespan> Timeout = {}, TCallback<FMuteUserResponseDto> Callback = {}) const;
164
170 void UnmuteUsers(const TArray<FString>& TargetUserIds, TCallback<FResponseDto> Callback = {}) const;
171
178 void MuteChannels(const TArray<FString>& TargetCids, TOptional<FTimespan> Timeout = {}, TCallback<FMuteChannelResponseDto> Callback = {}) const;
179
185 void UnmuteChannels(const TArray<FString>& TargetCids, TCallback<FResponseDto> Callback = {}) const;
186
196 void BlockUser(const FString& TargetUserId, TCallback<FBlockUserResponseDto> Callback = {}) const;
197
203 void UnblockUser(const FString& TargetUserId, TCallback<FResponseDto> Callback = {}) const;
204
209 void GetBlockedUsers(TCallback<FGetBlockedUsersResponseDto> Callback = {}) const;
210
212#pragma endregion Moderation
213
214#pragma region Channels
233 void QueryChannel(
234 const FString& ChannelType,
235 const FString& ConnectionId,
237 const FChannelRequestDto& Data = {},
238 const TOptional<FString>& ChannelId = {},
239 const TOptional<FMessagePaginationParamsRequestDto> MessagePagination = {},
240 const TOptional<FPaginationParamsRequestDto> MemberPagination = {},
241 const TOptional<FPaginationParamsRequestDto> WatcherPagination = {},
242 TCallback<FChannelStateResponseDto> Callback = {}) const;
243
250 void DeleteChannel(const FString& ChannelType, const FString& ChannelId, TCallback<FDeleteChannelResponseDto> Callback = {}) const;
251
260 void PartialUpdateChannel(
261 const FString& ChannelType,
262 const FString& ChannelId,
263 const TSharedRef<FJsonObject>& Set,
264 const TArray<FString>& Unset,
265 TCallback<FUpdateChannelPartialResponseDto> Callback = {}) const;
266
274 void UpdateChannel(
275 const FString& ChannelType,
276 const FString& ChannelId,
277 const FUpdateChannelRequestDto& Data,
278 TCallback<FUpdateChannelResponseDto> Callback = {}) const;
279
288 void HideChannel(const FString& ChannelType, const FString& ChannelId, bool bClearHistory = false, TCallback<FResponseDto> Callback = {}) const;
289
296 void ShowChannel(const FString& ChannelType, const FString& ChannelId, TCallback<FResponseDto> Callback = {}) const;
297
313 void QueryChannels(
314 const FString& ConnectionId,
316 const TOptional<TSharedRef<FJsonObject>>& Filter = {},
317 const TArray<FSortParamRequestDto>& SortOptions = {},
318 TOptional<uint32> MemberLimit = {},
319 TOptional<uint32> MessageLimit = {},
320 TOptional<uint32> Limit = {},
321 TOptional<uint32> Offset = {},
322 TCallback<FChannelsResponseDto> Callback = {}) const;
323
331 void StopWatchingChannel(const FString& ChannelType, const FString& ChannelId, const FString& ConnectionId, TCallback<FResponseDto> Callback = {}) const;
332
348 void SearchMessages(
349 const TSharedRef<FJsonObject>& ChannelFilter,
350 const TOptional<FString>& Query = {},
351 const TOptional<TSharedRef<FJsonObject>>& MessageFilter = {},
352 const TArray<FSortParamRequestDto>& Sort = {},
353 TOptional<uint32> MessageLimit = {},
354 TOptional<uint32> Offset = {},
355 TOptional<FString> Next = {},
356 TCallback<FSearchResponseDto> Callback = {}) const;
357
362 void MarkChannelsRead(TCallback<FMarkReadResponseDto> Callback = {}) const;
363
371 void MarkChannelRead(
372 const FString& ChannelType,
373 const FString& ChannelId,
374 const TOptional<FString>& MessageId = {},
375 TCallback<FMarkReadResponseDto> Callback = {}) const;
376
389 void QueryMembers(
390 const FString& ChannelType,
391 const TOptional<TSharedRef<FJsonObject>>& Filter = {},
392 const TOptional<FString>& ChannelId = {},
393 const TOptional<TArray<FString>>& Members = {},
394 const TArray<FSortParamRequestDto>& SortOptions = {},
395 const FMessagePaginationParamsRequestDto& Pagination = {},
396 TCallback<FMembersResponseDto> Callback = {}) const;
397
408 void TruncateChannel(
409 const FString& ChannelType,
410 const FString& ChannelId,
411 bool bHardDelete = false,
412 const TOptional<FDateTime>& TruncatedAt = {},
413 const TOptional<FMessageRequestDto>& Message = {},
414 bool bSkipPush = false,
415 TCallback<FTruncateChannelResponseDto> Callback = {}) const;
416
418#pragma endregion Channels
419
420#pragma region Messages
431 void GetMessage(const FString& MessageId, TCallback<FMessageResponseDto> Callback = {}) const;
432
441 void SendNewMessage(
442 const FString& ChannelType,
443 const FString& ChannelId,
444 const FMessageRequestDto& MessageRequest,
445 bool bSkipPush = false,
446 TCallback<FMessageResponseDto> Callback = {}) const;
447
453 void UpdateMessage(const FMessageRequestDto& MessageRequest, TCallback<FMessageResponseDto> Callback = {}) const;
454
461 void DeleteMessage(const FString& Id, bool bHard = false, TCallback<FMessageResponseDto> Callback = {}) const;
462
476 void SendFile(
477 const FString& ChannelType,
478 const FString& ChannelId,
479 const FString& FileName,
480 const TArray<uint8>& Content,
481 TCallback<FFileUploadResponseDto> Callback = {}) const;
482
496 void SendImage(
497 const FString& ChannelType,
498 const FString& ChannelId,
499 const FString& FileName,
500 const TArray<uint8>& Content,
501 TCallback<FFileUploadResponseDto> Callback = {}) const;
502
510 void DeleteFile(const FString& ChannelType, const FString& ChannelId, const FString& Url, TCallback<FResponseDto> Callback = {}) const;
511
519 void DeleteImage(const FString& ChannelType, const FString& ChannelId, const FString& Url, TCallback<FResponseDto> Callback = {}) const;
520
531 void SendReaction(
532 const FString& MessageId,
533 const FName& Type,
534 bool bEnforceUnique = true,
535 TOptional<uint32> Score = {},
536 bool bSkipPush = false,
537 TCallback<FReactionResponseDto> Callback = {}) const;
538
545 void DeleteReaction(const FString& MessageId, const FName& Type, TCallback<FReactionResponseDto> Callback = {}) const;
546
554 void GetReactions(const FString& MessageId, TOptional<uint32> Limit, TOptional<uint32> Offset, TCallback<FGetReactionsResponseDto> Callback = {}) const;
555
567 void GetReplies(const FString& ParentId, const FMessagePaginationParamsRequestDto& Pagination = {}, TCallback<FGetRepliesResponseDto> Callback = {}) const;
568
570#pragma endregion Messages
571
572#pragma region Threads
593 void QueryThreads(
594 const FString& ConnectionId = {},
595 const TOptional<TSharedRef<FJsonObject>>& Filter = {},
596 const TArray<FSortParamRequestDto>& SortOptions = {},
597 TOptional<uint32> Limit = {},
598 TOptional<uint32> ReplyLimit = {},
599 TOptional<uint32> ParticipantLimit = {},
600 TOptional<uint32> MemberLimit = {},
601 const TOptional<FString>& Next = {},
602 bool bWatch = false,
603 TCallback<FQueryThreadsResponseDto> Callback = {}) const;
604
617 void GetThread(
618 const FString& MessageId,
619 const FString& ConnectionId = {},
620 bool bWatch = false,
621 TOptional<uint32> ReplyLimit = {},
622 TOptional<uint32> ParticipantLimit = {},
623 TOptional<uint32> MemberLimit = {},
624 TCallback<FGetThreadResponseDto> Callback = {}) const;
625
627#pragma endregion Threads
628
629#pragma region Events
642 template <class TEvent>
643 void SendChannelEvent(const FString& ChannelType, const FString& ChannelId, const TEvent&, TCallback<FEventResponseDto> Callback = {});
644
646#pragma endregion Events
647
648#pragma region Files
655#pragma endregion Files
656
657#pragma region Users
674 void QueryUsers(
675 const FString& ConnectionId,
676 bool bPresence = true,
677 const TOptional<TSharedRef<FJsonObject>>& Filter = {},
678 const TArray<FSortParamRequestDto>& SortOptions = {},
679 TOptional<uint32> Limit = {},
680 TOptional<uint32> Offset = {},
681 TCallback<FUsersResponseDto> Callback = {}) const;
682
683 void CreateGuest(const FUserObjectRequestDto& User, TCallback<FGuestResponseDto> Callback = {}) const;
684
685 struct FPartialUpdateUser
686 {
687 const FString& UserId;
688 const TSharedRef<FJsonObject>& Set;
689 const TArray<FString>& Unset;
690 };
691
697 void PartialUpdateUsers(const TArray<FPartialUpdateUser>& Users, TCallback<FUpdateUsersResponseDto> Callback = {}) const;
698
704 void UpsertUsers(const TMap<FString, FUserObjectRequestDto>& Users, TCallback<FUpdateUsersResponseDto> Callback = {}) const;
705
707#pragma endregion Users
708
709#pragma region Devices
721 void AddDevice(const FString& DeviceId, EPushProvider PushProvider, TCallback<FResponseDto> Callback = {}) const;
722
728 void RemoveDevice(const FString& DeviceId, TCallback<FResponseDto> Callback = {}) const;
729
734 void ListDevices(TCallback<FListDevicesResponseDto> Callback = {}) const;
735
737#pragma endregion Devices
738
739private:
740 explicit FChatApi(const FString& InApiKey, const FString& InHost, const TSharedPtr<FTokenManager>&);
741 void SendChannelEventInternal(
742 const FString& ChannelType,
743 const FString& ChannelId,
744 const TSharedRef<FJsonObject>& Event,
745 TCallback<FEventResponseDto> Callback = {}) const;
746
747 FString BuildUrl(const FString& Path) const;
748
749 void AddAuth(FRequestBuilder&, const FToken& Token) const;
750 void OnRequest(FRequestBuilder&) const;
751 void OnError(const FHttpResponse&, FRequestBuilder&) const;
752
753 TSharedPtr<FTokenManager> TokenManager;
754 FString ApiKey;
755
756 TSharedPtr<FHttpClient> Client;
757 FString Scheme;
758 FString Host;
759};
760
761template <class TEvent>
762void FChatApi::SendChannelEvent(const FString& ChannelType, const FString& ChannelId, const TEvent& Event, const TCallback<FEventResponseDto> Callback)
763{
764 static_assert(
765 std::is_same_v<decltype(TEvent::StaticType()), FName>,
766 "TEvent must have a static method 'StaticType' which returns a FName to use with SendChannelEvent.");
767 SendChannelEventInternal(ChannelType, ChannelId, JsonObject::UStructToJsonObject<TEvent>(Event), Callback);
768}
All Stream Chat REST API requests can be made via this object.
Definition ChatApi.h:67
void SendChannelEvent(const FString &ChannelType, const FString &ChannelId, const TEvent &, TCallback< FEventResponseDto > Callback={})
Send a custom or built-in event on this channel.
Definition ChatApi.h:762
EChannelFlags
Additional channel actions to perform when requesting channel data from API.
Definition ChannelFlags.h:15
@ State
Return channel state in response.
@ Watch
Start watching the channel (receive events regarding this channel via WebSocket)
@ UserId
The user ID of the user that sent the message.
@ Id
Message ID.
@ Type
Type of the message.
@ ParentId
The parent message ID (if the message is a reply)
@ Query
Matches values by performing text search with the specified value.
@ Flag
The message was published, but sent to the dashboard for a moderator to review.
STREAMJSON_API TSharedRef< FJsonObject > UStructToJsonObject(const UStruct *StructDefinition, const void *Struct, ENamingConvention NamingConvention=ENamingConvention::SnakeCase)
Converts from a UStruct to a Json Object.
Definition StreamJson.cpp:8
#/components/schemas/BlockUsersResponse
Definition BlockUserResponseDto.h:16
#/components/schemas/ChannelRequest
Definition ChannelRequestDto.h:16
#/components/schemas/ChannelResponse Represents channel in chat
Definition ChannelResponseDto.h:20
The desired sort options for Channel API queries.
Definition ChannelSortOption.h:44
#/components/schemas/ChannelStateResponse
Definition ChannelStateResponseDto.h:16
#/components/schemas/ChannelsResponse
Definition ChannelsResponseDto.h:17
#/components/schemas/DeleteChannelResponse
Definition DeleteChannelResponseDto.h:17
#/components/schemas/EventResponse
Definition EventResponseDto.h:17
#/components/schemas/FileUploadResponse Returned by the file and image upload endpoints.
Definition FileUploadResponseDto.h:19
#/components/schemas/FlagResponse
Definition FlagResponseDto.h:17
#/components/schemas/GetBlockedUsersResponse
Definition GetBlockedUsersResponseDto.h:48
#/components/schemas/GetReactionsResponse
Definition GetReactionsResponseDto.h:17
#/components/schemas/GetRepliesResponse
Definition GetRepliesResponseDto.h:17
#/components/schemas/GetThreadResponse
Definition GetThreadResponseDto.h:17
#/components/schemas/GuestResponse
Definition GuestResponseDto.h:17
#/components/schemas/Response
Definition ListDevicesResponseDto.h:17
#/components/schemas/MarkReadRequest
Definition MarkReadRequestDto.h:18
#/components/schemas/MarkReadResponse
Definition MarkReadResponseDto.h:17
#/components/schemas/MembersResponse
Definition MembersResponseDto.h:17
#/components/schemas/MessagePaginationParamsRequest
Definition MessagePaginationParamsRequestDto.h:17
#/components/schemas/MessageRequest
Definition MessageRequestDto.h:18
#/components/schemas/MessageResponse
Definition MessageResponseDto.h:17
#/components/schemas/MuteChannelResponse
Definition MuteChannelResponseDto.h:18
#/components/schemas/MuteUserResponse
Definition MuteUserResponseDto.h:18
#/components/schemas/QueryBannedUsersResponse
Definition QueryBannedUsersResponseDto.h:17
#/components/schemas/QueryThreadsResponse
Definition QueryThreadsResponseDto.h:17
#/components/schemas/ReactionRequest Represents user reaction to a message
Definition ReactionRequestDto.h:16
#/components/schemas/ReactionResponse
Definition ReactionResponseDto.h:18
#/components/schemas/Response
Definition ResponseDto.h:15
#/components/schemas/SearchResponse
Definition SearchResponseDto.h:18
#/components/schemas/TruncateChannelResponse
Definition TruncateChannelResponseDto.h:18
#/components/schemas/UpdateChannelPartialResponse
Definition UpdateChannelPartialResponseDto.h:17
#/components/schemas/UpdateChannelRequest
Definition UpdateChannelRequestDto.h:19
#/components/schemas/UpdateChannelResponse
Definition UpdateChannelResponseDto.h:18
#/components/schemas/UpdateUsersResponse
Definition UpdateUsersResponseDto.h:17
#/components/schemas/UserObjectRequest
Definition UserObjectRequestDto.h:16
#/components/schemas/UsersResponse
Definition UsersResponseDto.h:17