Stream Chat Unreal SDK
Loading...
Searching...
No Matches
ChatSocketDetail.h
1// Copyright 2022 Stream.IO, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "JsonEventSubscription.h"
7
8namespace Detail
9{
10template <class TEvent>
11TJsonEventSubscription<TEvent>& GetSubscription(TMap<FName, FEventSubscriptionPtr>& Subscriptions)
12{
13 const FName& EventType = TEvent::StaticType();
14 const FEventSubscriptionPtr* Existing = Subscriptions.Find(EventType);
15 const FEventSubscriptionPtr& Subscription = Existing ? *Existing : Subscriptions.Emplace(EventType, MakeShared<TJsonEventSubscription<TEvent>>());
16 return StaticCast<TJsonEventSubscription<TEvent>&>(*Subscription);
17}
18
19template <class TEvent>
20FDelegateHandle SubscribeToEvent(TMap<FName, FEventSubscriptionPtr>& Subscriptions, TEventDelegate<TEvent> Callback)
21{
22 return Detail::GetSubscription<TEvent>(Subscriptions).Delegate.Add(MoveTemp(Callback));
23}
24
25template <class TEvent, class UserClass>
26FDelegateHandle SubscribeToUObjectEvent(
27 TMap<FName, FEventSubscriptionPtr>& Subscriptions,
28 UserClass* InObj,
29 TEventDelegateUObjectMethodPtr<TEvent, UserClass> InMethod)
30{
31 const TEventDelegate<TEvent> Delegate = TEventDelegate<TEvent>::CreateUObject(InObj, InMethod);
32 return Detail::SubscribeToEvent<TEvent>(Subscriptions, Delegate);
33}
34
35template <class TEvent, class UserClass>
36FDelegateHandle SubscribeToSpEvent(TMap<FName, FEventSubscriptionPtr>& Subscriptions, UserClass* InObj, TEventDelegateSpMethodPtr<TEvent, UserClass> InMethod)
37{
38 const TEventDelegate<TEvent> Delegate = TEventDelegate<TEvent>::CreateSP(InObj, InMethod);
39 return Detail::SubscribeToEvent<TEvent>(Subscriptions, Delegate);
40}
41
42template <class TEvent, typename FunctorType, typename... VarTypes>
43FDelegateHandle SubscribeToLambdaEvent(TMap<FName, FEventSubscriptionPtr>& Subscriptions, FunctorType&& InFunctor, VarTypes... Vars)
44{
45 const TEventDelegate<TEvent> Delegate = TEventDelegate<TEvent>::CreateLambda(Forward<FunctorType>(InFunctor), Vars...);
46 return Detail::SubscribeToEvent<TEvent>(Subscriptions, Delegate);
47}
48
49template <class TEvent>
50bool UnsubscribeFromEvent(TMap<FName, FEventSubscriptionPtr>& Subscriptions, FDelegateHandle DelegateHandle)
51{
52 return Detail::GetSubscription<TEvent>(Subscriptions).Delegate.Remove(DelegateHandle);
53}
54
55} // namespace Detail