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