1use std::sync::{RwLock};
2use std::collections::HashMap;
3use futures::channel::mpsc;
4use rtdlib::types::{RObject, TdType};
5
6lazy_static! {
7  static ref OBSERVER: Observer = {
8    Observer::new()
9  };
10}
11
12struct Observer {
13  channels: RwLock<HashMap<String, mpsc::Sender<TdType>>>,
14}
15
16impl Observer {
17  fn new() -> Self {
18    Self {
19      channels: RwLock::new(HashMap::new())
20    }
21  }
22
23  fn notify(&self, payload: TdType) {
24    let extra = match &payload {
25
26
27      TdType::TestUseUpdate(value) => value.extra(),
28
29      TdType::UpdateActiveNotifications(value) => value.extra(),
30
31      TdType::UpdateAnimatedEmojiMessageClicked(value) => value.extra(),
32
33      TdType::UpdateAnimationSearchParameters(value) => value.extra(),
34
35      TdType::UpdateAuthorizationState(value) => value.extra(),
36
37      TdType::UpdateBasicGroup(value) => value.extra(),
38
39      TdType::UpdateBasicGroupFullInfo(value) => value.extra(),
40
41      TdType::UpdateCall(value) => value.extra(),
42
43      TdType::UpdateChatAction(value) => value.extra(),
44
45      TdType::UpdateChatActionBar(value) => value.extra(),
46
47      TdType::UpdateChatDefaultDisableNotification(value) => value.extra(),
48
49      TdType::UpdateChatDraftMessage(value) => value.extra(),
50
51      TdType::UpdateChatFilters(value) => value.extra(),
52
53      TdType::UpdateChatHasProtectedContent(value) => value.extra(),
54
55      TdType::UpdateChatHasScheduledMessages(value) => value.extra(),
56
57      TdType::UpdateChatIsBlocked(value) => value.extra(),
58
59      TdType::UpdateChatIsMarkedAsUnread(value) => value.extra(),
60
61      TdType::UpdateChatLastMessage(value) => value.extra(),
62
63      TdType::UpdateChatMember(value) => value.extra(),
64
65      TdType::UpdateChatMessageSender(value) => value.extra(),
66
67      TdType::UpdateChatMessageTtl(value) => value.extra(),
68
69      TdType::UpdateChatNotificationSettings(value) => value.extra(),
70
71      TdType::UpdateChatOnlineMemberCount(value) => value.extra(),
72
73      TdType::UpdateChatPendingJoinRequests(value) => value.extra(),
74
75      TdType::UpdateChatPermissions(value) => value.extra(),
76
77      TdType::UpdateChatPhoto(value) => value.extra(),
78
79      TdType::UpdateChatPosition(value) => value.extra(),
80
81      TdType::UpdateChatReadInbox(value) => value.extra(),
82
83      TdType::UpdateChatReadOutbox(value) => value.extra(),
84
85      TdType::UpdateChatReplyMarkup(value) => value.extra(),
86
87      TdType::UpdateChatTheme(value) => value.extra(),
88
89      TdType::UpdateChatThemes(value) => value.extra(),
90
91      TdType::UpdateChatTitle(value) => value.extra(),
92
93      TdType::UpdateChatUnreadMentionCount(value) => value.extra(),
94
95      TdType::UpdateChatVideoChat(value) => value.extra(),
96
97      TdType::UpdateConnectionState(value) => value.extra(),
98
99      TdType::UpdateDeleteMessages(value) => value.extra(),
100
101      TdType::UpdateDiceEmojis(value) => value.extra(),
102
103      TdType::UpdateFavoriteStickers(value) => value.extra(),
104
105      TdType::UpdateFile(value) => value.extra(),
106
107      TdType::UpdateFileGenerationStart(value) => value.extra(),
108
109      TdType::UpdateFileGenerationStop(value) => value.extra(),
110
111      TdType::UpdateGroupCall(value) => value.extra(),
112
113      TdType::UpdateGroupCallParticipant(value) => value.extra(),
114
115      TdType::UpdateHavePendingNotifications(value) => value.extra(),
116
117      TdType::UpdateInstalledStickerSets(value) => value.extra(),
118
119      TdType::UpdateLanguagePackStrings(value) => value.extra(),
120
121      TdType::UpdateMessageContent(value) => value.extra(),
122
123      TdType::UpdateMessageContentOpened(value) => value.extra(),
124
125      TdType::UpdateMessageEdited(value) => value.extra(),
126
127      TdType::UpdateMessageInteractionInfo(value) => value.extra(),
128
129      TdType::UpdateMessageIsPinned(value) => value.extra(),
130
131      TdType::UpdateMessageLiveLocationViewed(value) => value.extra(),
132
133      TdType::UpdateMessageMentionRead(value) => value.extra(),
134
135      TdType::UpdateMessageSendAcknowledged(value) => value.extra(),
136
137      TdType::UpdateMessageSendFailed(value) => value.extra(),
138
139      TdType::UpdateMessageSendSucceeded(value) => value.extra(),
140
141      TdType::UpdateNewCallSignalingData(value) => value.extra(),
142
143      TdType::UpdateNewCallbackQuery(value) => value.extra(),
144
145      TdType::UpdateNewChat(value) => value.extra(),
146
147      TdType::UpdateNewChatJoinRequest(value) => value.extra(),
148
149      TdType::UpdateNewChosenInlineResult(value) => value.extra(),
150
151      TdType::UpdateNewCustomEvent(value) => value.extra(),
152
153      TdType::UpdateNewCustomQuery(value) => value.extra(),
154
155      TdType::UpdateNewInlineCallbackQuery(value) => value.extra(),
156
157      TdType::UpdateNewInlineQuery(value) => value.extra(),
158
159      TdType::UpdateNewMessage(value) => value.extra(),
160
161      TdType::UpdateNewPreCheckoutQuery(value) => value.extra(),
162
163      TdType::UpdateNewShippingQuery(value) => value.extra(),
164
165      TdType::UpdateNotification(value) => value.extra(),
166
167      TdType::UpdateNotificationGroup(value) => value.extra(),
168
169      TdType::UpdateOption(value) => value.extra(),
170
171      TdType::UpdatePoll(value) => value.extra(),
172
173      TdType::UpdatePollAnswer(value) => value.extra(),
174
175      TdType::UpdateRecentStickers(value) => value.extra(),
176
177      TdType::UpdateSavedAnimations(value) => value.extra(),
178
179      TdType::UpdateScopeNotificationSettings(value) => value.extra(),
180
181      TdType::UpdateSecretChat(value) => value.extra(),
182
183      TdType::UpdateSelectedBackground(value) => value.extra(),
184
185      TdType::UpdateServiceNotification(value) => value.extra(),
186
187      TdType::UpdateStickerSet(value) => value.extra(),
188
189      TdType::UpdateSuggestedActions(value) => value.extra(),
190
191      TdType::UpdateSupergroup(value) => value.extra(),
192
193      TdType::UpdateSupergroupFullInfo(value) => value.extra(),
194
195      TdType::UpdateTermsOfService(value) => value.extra(),
196
197      TdType::UpdateTrendingStickerSets(value) => value.extra(),
198
199      TdType::UpdateUnreadChatCount(value) => value.extra(),
200
201      TdType::UpdateUnreadMessageCount(value) => value.extra(),
202
203      TdType::UpdateUser(value) => value.extra(),
204
205      TdType::UpdateUserFullInfo(value) => value.extra(),
206
207      TdType::UpdateUserPrivacySettingRules(value) => value.extra(),
208
209      TdType::UpdateUserStatus(value) => value.extra(),
210
211      TdType::UpdateUsersNearby(value) => value.extra(),
212
213
214      TdType::AuthorizationState(value) => value.extra(),
215
216      TdType::CanTransferOwnershipResult(value) => value.extra(),
217
218      TdType::ChatStatistics(value) => value.extra(),
219
220      TdType::CheckChatUsernameResult(value) => value.extra(),
221
222      TdType::CheckStickerSetNameResult(value) => value.extra(),
223
224      TdType::InternalLinkType(value) => value.extra(),
225
226      TdType::JsonValue(value) => value.extra(),
227
228      TdType::LanguagePackStringValue(value) => value.extra(),
229
230      TdType::LogStream(value) => value.extra(),
231
232      TdType::LoginUrlInfo(value) => value.extra(),
233
234      TdType::MessageFileType(value) => value.extra(),
235
236      TdType::OptionValue(value) => value.extra(),
237
238      TdType::PassportElement(value) => value.extra(),
239
240      TdType::ResetPasswordResult(value) => value.extra(),
241
242      TdType::StatisticalGraph(value) => value.extra(),
243
244      TdType::Update(value) => value.extra(),
245
246      TdType::AccountTtl(value) => value.extra(),
247
248      TdType::AnimatedEmoji(value) => value.extra(),
249
250      TdType::Animations(value) => value.extra(),
251
252      TdType::AuthenticationCodeInfo(value) => value.extra(),
253
254      TdType::AutoDownloadSettingsPresets(value) => value.extra(),
255
256      TdType::Background(value) => value.extra(),
257
258      TdType::Backgrounds(value) => value.extra(),
259
260      TdType::BankCardInfo(value) => value.extra(),
261
262      TdType::BasicGroup(value) => value.extra(),
263
264      TdType::BasicGroupFullInfo(value) => value.extra(),
265
266      TdType::BotCommands(value) => value.extra(),
267
268      TdType::CallId(value) => value.extra(),
269
270      TdType::CallbackQueryAnswer(value) => value.extra(),
271
272      TdType::Chat(value) => value.extra(),
273
274      TdType::ChatAdministrators(value) => value.extra(),
275
276      TdType::ChatEvents(value) => value.extra(),
277
278      TdType::ChatFilter(value) => value.extra(),
279
280      TdType::ChatFilterInfo(value) => value.extra(),
281
282      TdType::ChatInviteLink(value) => value.extra(),
283
284      TdType::ChatInviteLinkCounts(value) => value.extra(),
285
286      TdType::ChatInviteLinkInfo(value) => value.extra(),
287
288      TdType::ChatInviteLinkMembers(value) => value.extra(),
289
290      TdType::ChatInviteLinks(value) => value.extra(),
291
292      TdType::ChatJoinRequests(value) => value.extra(),
293
294      TdType::ChatLists(value) => value.extra(),
295
296      TdType::ChatMember(value) => value.extra(),
297
298      TdType::ChatMembers(value) => value.extra(),
299
300      TdType::ChatPhotos(value) => value.extra(),
301
302      TdType::Chats(value) => value.extra(),
303
304      TdType::ChatsNearby(value) => value.extra(),
305
306      TdType::ConnectedWebsites(value) => value.extra(),
307
308      TdType::Count(value) => value.extra(),
309
310      TdType::Countries(value) => value.extra(),
311
312      TdType::CustomRequestResult(value) => value.extra(),
313
314      TdType::DatabaseStatistics(value) => value.extra(),
315
316      TdType::DeepLinkInfo(value) => value.extra(),
317
318      TdType::EmailAddressAuthenticationCodeInfo(value) => value.extra(),
319
320      TdType::Emojis(value) => value.extra(),
321
322      TdType::Error(value) => value.extra(),
323
324      TdType::File(value) => value.extra(),
325
326      TdType::FilePart(value) => value.extra(),
327
328      TdType::FormattedText(value) => value.extra(),
329
330      TdType::FoundMessages(value) => value.extra(),
331
332      TdType::GameHighScores(value) => value.extra(),
333
334      TdType::GroupCall(value) => value.extra(),
335
336      TdType::GroupCallId(value) => value.extra(),
337
338      TdType::Hashtags(value) => value.extra(),
339
340      TdType::HttpUrl(value) => value.extra(),
341
342      TdType::ImportedContacts(value) => value.extra(),
343
344      TdType::InlineQueryResults(value) => value.extra(),
345
346      TdType::LanguagePackInfo(value) => value.extra(),
347
348      TdType::LanguagePackStrings(value) => value.extra(),
349
350      TdType::LocalizationTargetInfo(value) => value.extra(),
351
352      TdType::LogTags(value) => value.extra(),
353
354      TdType::LogVerbosityLevel(value) => value.extra(),
355
356      TdType::Message(value) => value.extra(),
357
358      TdType::MessageCalendar(value) => value.extra(),
359
360      TdType::MessageLink(value) => value.extra(),
361
362      TdType::MessageLinkInfo(value) => value.extra(),
363
364      TdType::MessagePositions(value) => value.extra(),
365
366      TdType::MessageSenders(value) => value.extra(),
367
368      TdType::MessageStatistics(value) => value.extra(),
369
370      TdType::MessageThreadInfo(value) => value.extra(),
371
372      TdType::Messages(value) => value.extra(),
373
374      TdType::NetworkStatistics(value) => value.extra(),
375
376      TdType::Ok(value) => value.extra(),
377
378      TdType::OrderInfo(value) => value.extra(),
379
380      TdType::PassportAuthorizationForm(value) => value.extra(),
381
382      TdType::PassportElements(value) => value.extra(),
383
384      TdType::PassportElementsWithErrors(value) => value.extra(),
385
386      TdType::PasswordState(value) => value.extra(),
387
388      TdType::PaymentForm(value) => value.extra(),
389
390      TdType::PaymentReceipt(value) => value.extra(),
391
392      TdType::PaymentResult(value) => value.extra(),
393
394      TdType::PhoneNumberInfo(value) => value.extra(),
395
396      TdType::Proxies(value) => value.extra(),
397
398      TdType::Proxy(value) => value.extra(),
399
400      TdType::PushReceiverId(value) => value.extra(),
401
402      TdType::RecommendedChatFilters(value) => value.extra(),
403
404      TdType::RecoveryEmailAddress(value) => value.extra(),
405
406      TdType::ScopeNotificationSettings(value) => value.extra(),
407
408      TdType::Seconds(value) => value.extra(),
409
410      TdType::SecretChat(value) => value.extra(),
411
412      TdType::Session(value) => value.extra(),
413
414      TdType::Sessions(value) => value.extra(),
415
416      TdType::SponsoredMessage(value) => value.extra(),
417
418      TdType::Sticker(value) => value.extra(),
419
420      TdType::StickerSet(value) => value.extra(),
421
422      TdType::StickerSets(value) => value.extra(),
423
424      TdType::Stickers(value) => value.extra(),
425
426      TdType::StorageStatistics(value) => value.extra(),
427
428      TdType::StorageStatisticsFast(value) => value.extra(),
429
430      TdType::Supergroup(value) => value.extra(),
431
432      TdType::SupergroupFullInfo(value) => value.extra(),
433
434      TdType::TMeUrls(value) => value.extra(),
435
436      TdType::TemporaryPasswordState(value) => value.extra(),
437
438      TdType::TestBytes(value) => value.extra(),
439
440      TdType::TestInt(value) => value.extra(),
441
442      TdType::TestString(value) => value.extra(),
443
444      TdType::TestVectorInt(value) => value.extra(),
445
446      TdType::TestVectorIntObject(value) => value.extra(),
447
448      TdType::TestVectorString(value) => value.extra(),
449
450      TdType::TestVectorStringObject(value) => value.extra(),
451
452      TdType::Text(value) => value.extra(),
453
454      TdType::TextEntities(value) => value.extra(),
455
456      TdType::Updates(value) => value.extra(),
457
458      TdType::User(value) => value.extra(),
459
460      TdType::UserFullInfo(value) => value.extra(),
461
462      TdType::UserPrivacySettingRules(value) => value.extra(),
463
464      TdType::Users(value) => value.extra(),
465
466      TdType::ValidatedOrderInfo(value) => value.extra(),
467
468      TdType::WebPage(value) => value.extra(),
469
470      TdType::WebPageInstantView(value) => value.extra(),
471
472
473    };
474    match extra {
475      Some(extra) => {
476        let mut map = self.channels.write().unwrap();
477        if let Some(sender) = map.get_mut(&extra) {
478          sender.try_send(payload).unwrap();
479        }
480      },
481      None => {}
482    }
483  }
484
485  fn subscribe(&self, extra: String) -> mpsc::Receiver<TdType> {
486    let (sender, receiver) = mpsc::channel::<TdType>(1);
487    match self.channels.write() {
488      Ok(mut map) => {
489        map.insert(extra, sender);
490      }
491      _ => {}
492    };
493    receiver
494  }
495
496  fn unsubscribe(&self, extra: &str) {
497    match self.channels.write() {
498      Ok(mut map) => {
499        map.remove(extra);
500      }
501      _ => {}
502    };
503  }
504}
505
506
507pub fn notify(payload: TdType) {
508  OBSERVER.notify(payload)
509}
510
511pub fn subscribe<T: AsRef<str>>(extra: T) -> mpsc::Receiver<TdType>{
512  OBSERVER.subscribe(extra.as_ref().to_string())
513}
514
515pub fn unsubscribe<T: AsRef<str>>(extra: T) {
516  OBSERVER.unsubscribe(extra.as_ref())
517}
518