Twitch SDK (Internal)
friendlist.h
Go to the documentation of this file.
1 /********************************************************************************************
2 * Twitch Broadcasting SDK
3 *
4 * This software is supplied under the terms of a license agreement with Twitch Interactive, Inc. and
5 * may not be copied or used except in accordance with the terms of that agreement
6 * Copyright (c) 2012-2016 Twitch Interactive, Inc.
7 *********************************************************************************************/
8 
9 #pragma once
10 
14 #include "twitchsdk/core/timer.h"
22 
23 #include <map>
24 #include <vector>
25 #include <memory>
26 #include <unordered_set>
27 
28 namespace ttv
29 {
30  class TaskRunner;
31  class Task;
32  class User;
33  class PagedRequestFetcher;
34 
35  namespace social
36  {
37  class FriendList;
39  class SocialGetFriendsTask;
41  class SocialGetUserInfoTask;
42  }
43 }
44 
45 
46 // https://twitch.quip.com/VRANAAv7nosa
47 
52 {
53 public:
54  using UpdateFriendshipCallback = std::function<void(TTV_ErrorCode ec, UpdateFriendResult result, FriendStatus status)>;
55  using FetchFriendListCallback = std::function<void(TTV_ErrorCode ec, const std::vector<Friend>& friends)>;
56  using FetchFriendStatusCallback = std::function<void(TTV_ErrorCode ec, FriendStatus status)>;
57  using FetchFriendRequestsCallback = std::function<void(TTV_ErrorCode ec, const std::vector<FriendRequest>& requests)>;
58  using FetchUnreadFriendRequestCountCallback = std::function<void(TTV_ErrorCode ec, uint32_t count)>;
59  using MarkAllFriendRequestsReadCallback = std::function<void(TTV_ErrorCode ec)>;
60  using FetchRecommendedFriendsCallback = std::function<void(TTV_ErrorCode ec, const std::vector<UserInfo>& recommendedFriends)>;
61  using DismissRecommendedFriendCallback = std::function<void(TTV_ErrorCode ec)>;
62 
63  class IListener
64  {
65  public:
66  virtual void OnFriendInfoChanged(FriendList* source, const std::vector<Friend>& friends) = 0;
67  virtual void OnFriendshipChanged(FriendList* source, const std::vector<Friend>& added, const std::vector<Friend>& removed) = 0;
68  virtual void OnRealtimeFriendRequestReceived(FriendList* source, const FriendRequest& requestList) = 0;
69  virtual void OnUnreadFriendRequestCountChanged(FriendList* source, uint32_t count) = 0;
70  virtual void OnFriendRequestRemoved(FriendList* source, UserId otherUserId, FriendRequestRemovalReason reason) = 0;
71  };
72 
73 public:
74  FriendList(const std::shared_ptr<User>& user, const FeatureFlags& enabledFeatures);
75  virtual ~FriendList();
76 
77  void SetUserRepository(std::shared_ptr<UserRepository> repository) { mUserRepository = repository; }
78 
79  std::shared_ptr<User> GetUser() { return mUser.lock(); }
80 
81  void AddListener(std::shared_ptr<IListener> listener);
82  void RemoveListener(std::shared_ptr<IListener> listener);
83 
84  virtual TTV_ErrorCode Initialize() override;
86 
87  TTV_ErrorCode UpdateFriendship(UserId otherUserId, FriendAction action, const UpdateFriendshipCallback& callback);
89 
92 
94 
97 
98  // Component overrides
99  virtual void SetTaskRunner(std::shared_ptr<TaskRunner> taskRunner) override;
100  virtual void Update() override;
101  virtual TTV_ErrorCode Shutdown() override;
102 
103  // UserComponent overrides
104  virtual std::string GetLoggerName() const override;
105 
106  static std::string GetComponentName() { return "ttv::social::FriendList"; }
107 
108 private:
110  {
111  public:
113 
114  // PubSubClient::ITopicListener implementation
115  virtual void OnTopicSubscribeStateChanged(PubSubClient* source, const std::string& topic, PubSubClient::SubscribeState::Enum state, TTV_ErrorCode ec) override;
116  virtual void OnTopicMessageReceived(PubSubClient* source, const std::string& topic, const json::Value& msg) override;
117  virtual void OnTopicListenerRemoved(PubSubClient* source, const std::string& topic, TTV_ErrorCode ec) override;
118 
119  private:
121  };
122 
123  struct FriendEntry
124  {
127  };
128 
129  typedef std::function<void(TTV_ErrorCode ec)> CompleteCallback;
130  typedef std::function<void(UserId localUserId, UserId otherUserId, TTV_ErrorCode ec)> UserIdsLookupCallback;
131 
132  typedef std::function<void(std::shared_ptr<SocialFriendRequestsTask> task)> FriendRequestsTaskSetupCallback;
133  typedef std::function<TTV_ErrorCode(std::shared_ptr<SocialFriendRequestsTask::Result> result)> FriendRequestsTaskProcessResultCallback;
134 
135  typedef std::function<void(TTV_ErrorCode ec)> GetUserInfoCompleteCallback;
136  typedef std::function<UserInfo*(UserId userId)> GetUserInfoTargetCallback;
137  typedef std::function<void(UserId ownerUserId, UserId otherUserId, TTV_ErrorCode ec)> FriendChangeSetupCallback;
138 
139  typedef std::map<UserId, FriendRequest> FriendRequestMap;
140 
141  // PubSubClient::ITopicListener implementation
142  void OnTopicSubscribeStateChanged(const std::string& topic, PubSubClient::SubscribeState::Enum state, TTV_ErrorCode ec);
143  void OnTopicMessageReceived(const std::string& topic, const json::Value& msg);
144 
145  // Component overrides
146  virtual bool CheckShutdown() override;
147  virtual void CompleteShutdown() override;
148 
149  // UserComponent overrides
150  virtual void OnUserInfoFetchComplete(TTV_ErrorCode ec) override;
151 
153  void SetFriendPresence(UserId userId, Timestamp updateTime, uint64_t index, PresenceUserAvailability availability, std::unique_ptr<PresenceActivity>&& activity);
154 
155  void RequestFriendsList();
156  void HandleFriendsList(std::vector<FriendEntry>&& list);
157 
158  void RequestFriendRequests();
160 
162 
165 
166  TTV_ErrorCode PerformFriendRequestListManagement(FriendRequestsTaskSetupCallback setupCallback, FriendRequestsTaskProcessResultCallback processCallback, CompleteCallback completeCallback);
167  void AddToPendingFriendAdds(UserId userId);
168  void AddToPendingFriendRemoves(const FriendEntry& entry);
173  void HandleFriendRemoved(UserId userId);
174 
175  void SetNumUnreadFriendRequests(uint32_t count);
176  std::vector<Friend> BuildSocialFriendListResult(const std::unordered_set<UserId>& ids);
177  std::vector<Friend> BuildSocialFriendListResult(const std::map<UserId, Friend>& users);
178 
179  std::shared_ptr<UserRepository> mUserRepository;
180 
181  std::shared_ptr<PubSubClient> mPubSub;
182  std::shared_ptr<PubSubTopicListener> mPubSubTopicListener;
183  std::shared_ptr<PubSubTopicListenerHelper> mPubSubTopicListenerHelper;
184 
185  std::unordered_set<UserId> mPendingAddedFriends;
186  std::map<UserId, Friend> mPendingRemovedFriends;
187 
188  std::unordered_set<UserId> mPendingInfoChanges;
189 
190  std::map<UserId, FriendEntry> mFriendMap;
191  std::vector<UserInfo> mRecommendedFriends;
196 
197  FriendRequestMap mFriendRequests;
199 
205  std::string mPresenceTopic;
206  std::string mFriendshipTopic;
207 
213  std::shared_ptr<PagedRequestFetcher> mFriendRequestFetcher;
214 };
215 
216 
221 {
222 public:
223  typedef std::function<void(FriendList* source, const std::vector<Friend>& list)> OnFriendInfoChangedFunc;
224  typedef std::function<void(FriendList* source, const std::vector<Friend>& added, const std::vector<Friend>& removed)> OnFriendshipChangedFunc;
225  typedef std::function<void(FriendList* source, const FriendRequest& request)> OnRealtimeFriendRequestReceivedFunc;
226  typedef std::function<void(FriendList* source, uint32_t count)> OnUnreadFriendRequestCountChangedFunc;
227  typedef std::function<void(FriendList* source, UserId otherUserId, FriendRequestRemovalReason reason)> OnFriendRequestRemovedFunc;
228 
229 public:
230  // FriendList::Listener implementation
231  virtual void OnFriendInfoChanged(FriendList* source, const std::vector<Friend>& list) override
232  {
233  if (mOnFriendInfoChangedFunc != nullptr)
234  {
235  mOnFriendInfoChangedFunc(source, list);
236  }
237  }
238 
239  virtual void OnFriendshipChanged(FriendList* source, const std::vector<Friend>& added, const std::vector<Friend>& removed) override
240  {
241  if (mOnFriendshipChangedFunc != nullptr)
242  {
243  mOnFriendshipChangedFunc(source, added, removed);
244  }
245  }
246 
247  virtual void OnRealtimeFriendRequestReceived(FriendList* source, const FriendRequest& request) override
248  {
249  if (mOnRealtimeFriendRequestReceivedFunc != nullptr)
250  {
251  mOnRealtimeFriendRequestReceivedFunc(source, request);
252  }
253  }
254 
255  virtual void OnUnreadFriendRequestCountChanged(FriendList* source, uint32_t count) override
256  {
257  if (mOnUnreadFriendRequestCountChangedFunc != nullptr)
258  {
259  mOnUnreadFriendRequestCountChangedFunc(source, count);
260  }
261  }
262 
263  virtual void OnFriendRequestRemoved(FriendList* source, UserId otherUserId, FriendRequestRemovalReason reason) override
264  {
265  if (mOnFriendRequestRemovedFunc != nullptr)
266  {
267  mOnFriendRequestRemovedFunc(source, otherUserId, reason);
268  }
269  }
270 
271 public:
274  OnRealtimeFriendRequestReceivedFunc mOnRealtimeFriendRequestReceivedFunc;
275  OnUnreadFriendRequestCountChangedFunc mOnUnreadFriendRequestCountChangedFunc;
276  OnFriendRequestRemovedFunc mOnFriendRequestRemovedFunc;
277 };
uint32_t UserId
Definition: coretypes.h:22
std::shared_ptr< PubSubTopicListener > mPubSubTopicListener
Definition: friendlist.h:182
Definition: socialtypes.h:20
void HandleFriendRemoved(UserId userId)
WaitForExpiry mRecommendedFriendsFetchTimer
Definition: friendlist.h:203
std::shared_ptr< User > GetUser()
Definition: friendlist.h:79
std::map< UserId, FriendRequest > FriendRequestMap
Definition: friendlist.h:139
std::function< void(std::shared_ptr< SocialFriendRequestsTask > task)> FriendRequestsTaskSetupCallback
Definition: friendlist.h:132
Definition: friendlist.h:220
void AddToPendingFriendAdds(UserId userId)
void RemoveListener(std::shared_ptr< IListener > listener)
virtual void OnUserInfoFetchComplete(TTV_ErrorCode ec) override
TTV_ErrorCode FetchUnreadFriendRequestCount(const FetchUnreadFriendRequestCountCallback &callback)
std::function< void(TTV_ErrorCode ec, const std::vector< FriendRequest > &requests)> FetchFriendRequestsCallback
Definition: friendlist.h:57
std::function< void(TTV_ErrorCode ec)> CompleteCallback
Definition: friendlist.h:129
std::vector< UserInfo > mRecommendedFriends
Definition: friendlist.h:191
std::string mPresenceTopic
Definition: friendlist.h:205
void AddToPendingFriendRemoves(const FriendEntry &entry)
virtual void Update() override
std::function< void(TTV_ErrorCode ec, UpdateFriendResult result, FriendStatus status)> UpdateFriendshipCallback
Definition: friendlist.h:54
std::function< void(TTV_ErrorCode ec, const std::vector< Friend > &friends)> FetchFriendListCallback
Definition: friendlist.h:55
FeatureFlags mEnabledFeatures
Definition: friendlist.h:208
OnUnreadFriendRequestCountChangedFunc mOnUnreadFriendRequestCountChangedFunc
Definition: friendlist.h:275
FriendAction
Definition: socialtypes.h:213
void SetFriendPresence(UserId userId, Timestamp updateTime, uint64_t index, PresenceUserAvailability availability, std::unique_ptr< PresenceActivity > &&activity)
TTV_ErrorCode DismissRecommendedFriend(UserId dismissUserId, const DismissRecommendedFriendCallback &callback)
Definition: friendlist.h:51
OnFriendRequestRemovedFunc mOnFriendRequestRemovedFunc
Definition: friendlist.h:276
virtual void OnUnreadFriendRequestCountChanged(FriendList *source, uint32_t count)=0
std::vector< Friend > BuildSocialFriendListResult(const std::unordered_set< UserId > &ids)
virtual void SetTaskRunner(std::shared_ptr< TaskRunner > taskRunner) override
OnRealtimeFriendRequestReceivedFunc mOnRealtimeFriendRequestReceivedFunc
Definition: friendlist.h:274
void AddListener(std::shared_ptr< IListener > listener)
TTV_ErrorCode PerformFriendRequestListManagement(FriendRequestsTaskSetupCallback setupCallback, FriendRequestsTaskProcessResultCallback processCallback, CompleteCallback completeCallback)
TTV_ErrorCode HandleRealtimeFriendRequestReceived(UserId userId)
bool mReceivedFirstFriendRequestUnreadCountFetch
Definition: friendlist.h:211
virtual void OnRealtimeFriendRequestReceived(FriendList *source, const FriendRequest &requestList)=0
uint32_t Timestamp
Definition: coretypes.h:27
Enum
Definition: pubsubclient.h:91
Definition: socialtypes.h:334
TTV_ErrorCode UpdateFriendship(UserId otherUserId, FriendAction action, const UpdateFriendshipCallback &callback)
std::function< void(UserId localUserId, UserId otherUserId, TTV_ErrorCode ec)> UserIdsLookupCallback
Definition: friendlist.h:130
FriendRequestRemovalReason
Definition: socialtypes.h:282
void OnTopicMessageReceived(const std::string &topic, const json::Value &msg)
FriendList(const std::shared_ptr< User > &user, const FeatureFlags &enabledFeatures)
virtual void OnFriendRequestRemoved(FriendList *source, UserId otherUserId, FriendRequestRemovalReason reason) override
Definition: friendlist.h:263
TTV_ErrorCode MarkAllFriendRequestsRead(const MarkAllFriendRequestsReadCallback &callback)
std::unordered_set< UserId > mPendingInfoChanges
The list of users who have had their info changed.
Definition: friendlist.h:188
std::function< void(FriendList *source, const std::vector< Friend > &added, const std::vector< Friend > &removed)> OnFriendshipChangedFunc
Definition: friendlist.h:224
WaitForExpiry mFriendRequestFetchTimer
Definition: friendlist.h:201
JSON (JavaScript Object Notation).
Definition: adsapi.h:16
virtual void CompleteShutdown() override
Definition: socialtypes.h:358
std::shared_ptr< PagedRequestFetcher > mFriendRequestFetcher
Definition: friendlist.h:213
TTV_ErrorCode FetchFriendRequests(const FetchFriendRequestsCallback &callback)
Definition: friendlist.h:63
std::function< void(FriendList *source, const std::vector< Friend > &list)> OnFriendInfoChangedFunc
Definition: friendlist.h:223
Represents a JSON value.
Definition: value.h:114
std::function< void(TTV_ErrorCode ec, FriendStatus status)> FetchFriendStatusCallback
Definition: friendlist.h:56
Definition: timer.h:52
bool mReceivedFirstFriendRequestsFetch
Definition: friendlist.h:210
WaitForExpiry mFriendListFetchTimer
Definition: friendlist.h:200
Definition: pubsubclient.h:86
std::map< UserId, Friend > mPendingRemovedFriends
The set of friends who were removed from the friend list.
Definition: friendlist.h:186
Friend friendData
Definition: friendlist.h:125
Definition: eventsource.h:18
TTV_ErrorCode HandleFriendRequestAccepted(UserId userId, FriendRequestRemovalReason reason)
EventSource< IListener > mListeners
Definition: friendlist.h:204
virtual void OnRealtimeFriendRequestReceived(FriendList *source, const FriendRequest &request) override
Definition: friendlist.h:247
PresenceUserAvailability
Definition: socialtypes.h:37
std::function< void(TTV_ErrorCode ec, const std::vector< UserInfo > &recommendedFriends)> FetchRecommendedFriendsCallback
Definition: friendlist.h:60
void RequestFriendRequestUnreadCount()
std::function< void(TTV_ErrorCode ec)> GetUserInfoCompleteCallback
Definition: friendlist.h:135
FriendList * mOwner
Definition: friendlist.h:120
std::function< void(FriendList *source, uint32_t count)> OnUnreadFriendRequestCountChangedFunc
Definition: friendlist.h:226
std::unordered_set< UserId > mPendingAddedFriends
The set of friends who were added via a friend request.
Definition: friendlist.h:185
virtual bool CheckShutdown() override
uint32_t mNumUnreadFriendRequests
The number of unread friend requests.
Definition: friendlist.h:198
bool mReceivedFirstFriendListFetch
Definition: friendlist.h:209
uint32_t TTV_ErrorCode
Definition: errortypes.h:30
Definition: component.h:87
uint64_t presenceUpdateIndex
Definition: friendlist.h:126
void OnTopicSubscribeStateChanged(const std::string &topic, PubSubClient::SubscribeState::Enum state, TTV_ErrorCode ec)
static std::string GetComponentName()
Definition: friendlist.h:106
virtual void OnUnreadFriendRequestCountChanged(FriendList *source, uint32_t count) override
Definition: friendlist.h:255
virtual TTV_ErrorCode Initialize() override
virtual void OnFriendInfoChanged(FriendList *source, const std::vector< Friend > &friends)=0
CallbackQueue< FetchFriendListCallback > mFetchFriendListCallbacks
Definition: friendlist.h:192
Definition: pubsubclient.h:117
TTV_ErrorCode FetchFriendList(const FetchFriendListCallback &callback)
OnFriendInfoChangedFunc mOnFriendInfoChangedFunc
Definition: friendlist.h:272
virtual void OnFriendshipChanged(FriendList *source, const std::vector< Friend > &added, const std::vector< Friend > &removed)=0
FriendRequestMap mFriendRequests
Definition: friendlist.h:197
TTV_ErrorCode FetchFriendStatus(UserId otherUserId, const FetchFriendStatusCallback &callback)
std::function< void(TTV_ErrorCode ec, uint32_t count)> FetchUnreadFriendRequestCountCallback
Definition: friendlist.h:58
std::function< TTV_ErrorCode(std::shared_ptr< SocialFriendRequestsTask::Result > result)> FriendRequestsTaskProcessResultCallback
Definition: friendlist.h:133
TTV_ErrorCode HandleFriendRequestRemoved(UserId userId, FriendRequestRemovalReason reason)
Definition: socialgetfriendspresencetask.h:23
virtual std::string GetLoggerName() const override
std::map< UserId, FriendEntry > mFriendMap
Definition: friendlist.h:190
bool mReceivedFirstRecommendedFriendsFetch
Definition: friendlist.h:212
std::function< void(FriendList *source, const FriendRequest &request)> OnRealtimeFriendRequestReceivedFunc
Definition: friendlist.h:225
OnFriendshipChangedFunc mOnFriendshipChangedFunc
Definition: friendlist.h:273
std::shared_ptr< UserRepository > mUserRepository
Definition: friendlist.h:179
std::shared_ptr< PubSubClient > mPubSub
Definition: friendlist.h:181
std::function< void(TTV_ErrorCode ec)> DismissRecommendedFriendCallback
Definition: friendlist.h:61
virtual void OnFriendRequestRemoved(FriendList *source, UserId otherUserId, FriendRequestRemovalReason reason)=0
CallbackQueue< FetchUnreadFriendRequestCountCallback > mFetchUnreadFriendRequestCountCallbacks
Definition: friendlist.h:194
std::function< void(UserId ownerUserId, UserId otherUserId, TTV_ErrorCode ec)> FriendChangeSetupCallback
Definition: friendlist.h:137
std::shared_ptr< PubSubTopicListenerHelper > mPubSubTopicListenerHelper
Definition: friendlist.h:183
Definition: friendlist.h:123
TTV_ErrorCode FetchRecommendedFriends(const FetchRecommendedFriendsCallback &callback)
virtual TTV_ErrorCode Shutdown() override
void HandleFriendsList(std::vector< FriendEntry > &&list)
void SetUserRepository(std::shared_ptr< UserRepository > repository)
Definition: friendlist.h:77
std::string mFriendshipTopic
Definition: friendlist.h:206
std::function< UserInfo *(UserId userId)> GetUserInfoTargetCallback
Definition: friendlist.h:136
CallbackQueue< FetchRecommendedFriendsCallback > mFetchRecommendedFriendsCallbacks
Definition: friendlist.h:195
TTV_ErrorCode SubscribeTopics()
std::weak_ptr< User > mUser
Definition: component.h:119
void SetNumUnreadFriendRequests(uint32_t count)
std::function< void(TTV_ErrorCode ec)> MarkAllFriendRequestsReadCallback
Definition: friendlist.h:59
std::function< void(FriendList *source, UserId otherUserId, FriendRequestRemovalReason reason)> OnFriendRequestRemovedFunc
Definition: friendlist.h:227
bool RemoveFriendRequest(UserId userId, FriendRequestRemovalReason reason)
virtual void OnFriendshipChanged(FriendList *source, const std::vector< Friend > &added, const std::vector< Friend > &removed) override
Definition: friendlist.h:239
WaitForExpiry mFriendRequestUnreadCountFetchTimer
Definition: friendlist.h:202
CallbackQueue< FetchFriendRequestsCallback > mFetchFriendRequestsCallbacks
Definition: friendlist.h:193
virtual void OnFriendInfoChanged(FriendList *source, const std::vector< Friend > &list) override
Definition: friendlist.h:231