1: using System;
2: using System.Collections.Generic;
3: using System.Configuration;
4: using System.Data;
5: using System.Linq;
6: using System.Web;
7: using Telegram.Bot;
8: using Telegram.Bot.Types.Enums;
9:
10: namespace Ia.Ngn.Cl.Model.Telegram
11: {
12: ////////////////////////////////////////////////////////////////////////////
13:
14: /// <summary publish="true">
15: /// Telegram Chat/Group/User support class of Optical Fiber Network (OFN) business and data model.
16: /// </summary>
17: ///
18: /// <remarks>
19: /// Copyright © 2018-2019 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
20: ///
21: /// This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
22: /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
23: ///
24: /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
25: /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
26: ///
27: /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
28: ///
29: /// Copyright notice: This notice may not be removed or altered from any source distribution.
30: /// </remarks>
31: public class Chat
32: {
33: private static List<int> usedImageIdList = new List<int>();
34: private static List<Ia.Ngn.Cl.Model.Telegram.Chat> chatList;
35: private static readonly object objectLock = new object();
36:
37: /// <summary/>
38: public enum ChatType { Unknown, PrivateGroup, PrivateChannel, PublicGroup, PublicChannel }
39:
40: /// <summary/>
41: public int ImageId { get; set; }
42:
43: /// <summary/>
44: public string NameId { get; set; }
45:
46: /// <summary/>
47: public long ChatId { get; set; }
48:
49: /// <summary/>
50: public string Name { get; set; }
51:
52: /// <summary/>
53: public string Description { get; set; }
54:
55: /// <summary/>
56: public Ia.Ngn.Cl.Model.Telegram.Chat.ChatType Type { get; set; }
57:
58: /// <summary/>
59: public bool RestrictedByFrameworkSite { get; set; }
60:
61: /// <summary/>
62: public string InviteLinkUrl { get { return "https://t.me/joinchat/" + ChatNameIdToInviteLinkUrlDictionary[this.NameId]; } }
63:
64: /// <summary/>
65: public Ia.Ngn.Cl.Model.Business.Administration.Framework Framework { get; set; }
66:
67: /// <summary/>
68: public string TelegramGroupUrl { get { return "https://web.telegram.org/#/im?p=g" + System.Math.Abs(this.ChatId) + ""; } }
69:
70: /// <summary/>
71: public string TelegramLogoImageUrl { get { return "~/image/telegram/logo.png"; } }
72:
73: /// <summary/>
74: public string TelegramLogoHtmlImageUrl { get { return TelegramLogoImageUrl.Replace("~", "../.."); ; } }
75:
76: /// <summary/>
77: public static string OfnUserBotApiToken { get { return ConfigurationManager.AppSettings["ofnUserBotApiToken"].ToString(); } }
78:
79: /// <summary/>
80: public static readonly string OfnUserBotNameId = "ofnUserBot"; // logo 32.png
81:
82: ////////////////////////////////////////////////////////////////////////////
83:
84: /// <summary>
85: ///
86: /// </summary>
87: public Chat() { }
88:
89: ////////////////////////////////////////////////////////////////////////////
90:
91: /// <summary>
92: ///
93: /// <see cref="https://stackoverflow.com/questions/9311857/convert-alphabetic-string-into-integer-in-c-sharp"/>
94: /// </summary>
95: private static long ConvertAlphabeticStringIntoLong(string line)
96: {
97: long l;
98: System.Text.Encoding ascii;
99: Byte[] encodedBytes;
100:
101: l = 0;
102: ascii = System.Text.Encoding.ASCII;
103: encodedBytes = ascii.GetBytes(line);
104:
105: foreach (Byte b in encodedBytes) l += b;
106:
107: return l;
108: }
109:
110: ////////////////////////////////////////////////////////////////////////////
111:
112: /// <summary>
113: ///
114: /// </summary>
115: public string LogoImageUrl
116: {
117: get
118: {
119: return "~/image/telegram/ftth-logo/" + this.ImageId + ".png";
120: }
121: }
122:
123: ////////////////////////////////////////////////////////////////////////////
124:
125: /// <summary>
126: ///
127: /// </summary>
128: public string LogoHtmlImageUrl
129: {
130: get
131: {
132: return "../../image/telegram/ftth-logo/" + this.ImageId + ".png";
133: }
134: }
135:
136: ////////////////////////////////////////////////////////////////////////////
137:
138: /// <summary>
139: ///
140: /// </summary>
141: public string LogoImageAbsolutePathUrl
142: {
143: get
144: {
145: return Ia.Cl.Model.Default.AbsolutePath() + @"image\telegram\ftth-logo\" + this.ImageId + ".png";
146: }
147: }
148:
149: ////////////////////////////////////////////////////////////////////////////
150:
151: /// <summary>
152: ///
153: /// </summary>
154: public static Ia.Ngn.Cl.Model.Telegram.Chat ReadFromFramework(Ia.Ngn.Cl.Model.Business.Administration.Framework framework)
155: {
156: var chat = (from t in Ia.Ngn.Cl.Model.Telegram.Chat.ChatList
157: where t.Framework == framework
158: select t).SingleOrDefault();
159:
160: return chat;
161: }
162:
163: ////////////////////////////////////////////////////////////////////////////
164:
165: /// <summary>
166: ///
167: /// </summary>
168: public static long ReadChatIdFromNameId(string nameId)
169: {
170: long chatId;
171:
172: chatId = ChatNameIdToChatIdDictionary.ContainsKey(nameId) ? ChatNameIdToChatIdDictionary[nameId] : 0;
173:
174: // chatId = (from c in List where c.NameId == nameId select c.ChatId).SingleOrDefault();
175:
176: return chatId;
177: }
178:
179: ////////////////////////////////////////////////////////////////////////////
180:
181: /// <summary>
182: ///
183: /// </summary>
184: public static Ia.Ngn.Cl.Model.Telegram.Chat Read(long chatId)
185: {
186: var chat = (from c in Ia.Ngn.Cl.Model.Telegram.Chat.ChatList where c.ChatId == chatId select c).SingleOrDefault();
187:
188: if (chat == null)
189: {
190: chat = new Chat() { Type = ChatType.Unknown };
191: }
192:
193: return chat;
194: }
195:
196: ////////////////////////////////////////////////////////////////////////////
197:
198: /// <summary>
199: ///
200: /// </summary>
201: public static List<Ia.Ngn.Cl.Model.Telegram.Chat> ChatList
202: {
203: get
204: {
205: if (chatList == null || chatList.Count == 0)
206: {
207: lock (objectLock)
208: {
209: chatList = Ia.Ngn.Cl.Model.Telegram.Chat._ChatList();
210: }
211: }
212:
213: return chatList;
214: }
215: }
216:
217: ////////////////////////////////////////////////////////////////////////////
218:
219: /// <summary>
220: ///
221: /// </summary>
222: private static List<Ia.Ngn.Cl.Model.Telegram.Chat> _ChatList()
223: {
224: long chatId;
225: string nameId;
226: Ia.Ngn.Cl.Model.Telegram.Chat chat;
227: Ia.Ngn.Cl.Model.Business.Administration.Framework framework;
228: List<Ia.Ngn.Cl.Model.Business.Administration.Framework> frameworkList;
229:
230: var list = new List<Ia.Ngn.Cl.Model.Telegram.Chat>(40);
231:
232:
233: string frameworkArabicName;
234:
235: // OFN department groups
236: frameworkArabicName = "إدارة شبكة الألياف الضوئية";
237: framework = (from f in Ia.Ngn.Cl.Model.Data.Administration.FrameworkList where f.ArabicName == frameworkArabicName select f).SingleOrDefault();
238: list.Add(new Ia.Ngn.Cl.Model.Telegram.Chat()
239: {
240: ImageId = ChatNameIdToLogoNameImageIdAndQrCodeImageIdDictionary["ofnGroupId"],
241: NameId = "ofnGroupId",
242: ChatId = ChatNameIdToChatIdDictionary["ofnGroupId"],
243: Name = NameText(frameworkArabicName),
244: Description = DescriptionText(frameworkArabicName),
245: Type = Ia.Ngn.Cl.Model.Telegram.Chat.ChatType.PrivateGroup,
246: RestrictedByFrameworkSite = false,
247: Framework = framework
248: });
249:
250: frameworkArabicName = "مراقبة تقنية المعلومات";
251: framework = (from f in Ia.Ngn.Cl.Model.Data.Administration.FrameworkList where f.ArabicName == frameworkArabicName select f).SingleOrDefault();
252: list.Add(new Ia.Ngn.Cl.Model.Telegram.Chat()
253: {
254: ImageId = ChatNameIdToLogoNameImageIdAndQrCodeImageIdDictionary["ofnItGroupId"],
255: NameId = "ofnItGroupId",
256: ChatId = ChatNameIdToChatIdDictionary["ofnItGroupId"],
257: Name = NameText(frameworkArabicName),
258: Description = DescriptionText(frameworkArabicName),
259: Type = Ia.Ngn.Cl.Model.Telegram.Chat.ChatType.PrivateGroup,
260: RestrictedByFrameworkSite = false,
261: Framework = framework
262: });
263:
264: frameworkArabicName = "مراقبة الدعم الفنى للشبكة";
265: framework = (from f in Ia.Ngn.Cl.Model.Data.Administration.FrameworkList where f.ArabicName == frameworkArabicName select f).SingleOrDefault();
266: list.Add(new Ia.Ngn.Cl.Model.Telegram.Chat()
267: {
268: ImageId = ChatNameIdToLogoNameImageIdAndQrCodeImageIdDictionary["ofnSupportGroupId"],
269: NameId = "ofnSupportGroupId",
270: ChatId = ChatNameIdToChatIdDictionary["ofnSupportGroupId"],
271: Name = NameText(frameworkArabicName),
272: Description = DescriptionText(frameworkArabicName),
273: Type = Ia.Ngn.Cl.Model.Telegram.Chat.ChatType.PrivateGroup,
274: RestrictedByFrameworkSite = false,
275: Framework = framework
276: });
277:
278: frameworkArabicName = "مراقبة تشغيل الشبكة";
279: framework = (from f in Ia.Ngn.Cl.Model.Data.Administration.FrameworkList where f.ArabicName == frameworkArabicName select f).SingleOrDefault();
280: list.Add(new Ia.Ngn.Cl.Model.Telegram.Chat()
281: {
282: ImageId = ChatNameIdToLogoNameImageIdAndQrCodeImageIdDictionary["ofnOperationGroupId"],
283: NameId = "ofnOperationGroupId",
284: ChatId = ChatNameIdToChatIdDictionary["ofnOperationGroupId"],
285: Name = NameText(frameworkArabicName),
286: Description = DescriptionText(frameworkArabicName),
287: Type = Ia.Ngn.Cl.Model.Telegram.Chat.ChatType.PrivateGroup,
288: RestrictedByFrameworkSite = false,
289: Framework = framework
290: });
291:
292: frameworkArabicName = "مراقبة خدمات الشبكة";
293: framework = (from f in Ia.Ngn.Cl.Model.Data.Administration.FrameworkList where f.ArabicName == frameworkArabicName select f).SingleOrDefault();
294: list.Add(new Ia.Ngn.Cl.Model.Telegram.Chat()
295: {
296: ImageId = ChatNameIdToLogoNameImageIdAndQrCodeImageIdDictionary["ofnServiceGroupId"],
297: NameId = "ofnServiceGroupId",
298: ChatId = ChatNameIdToChatIdDictionary["ofnServiceGroupId"],
299: Name = NameText(frameworkArabicName),
300: Description = DescriptionText(frameworkArabicName),
301: Type = Ia.Ngn.Cl.Model.Telegram.Chat.ChatType.PrivateGroup,
302: RestrictedByFrameworkSite = false,
303: Framework = framework
304: });
305:
306:
307: // OFN channel(s)
308: frameworkArabicName = "إدارة شبكة الألياف الضوئية";
309: framework = (from f in Ia.Ngn.Cl.Model.Data.Administration.FrameworkList where f.ArabicName == frameworkArabicName select f).SingleOrDefault();
310: list.Add(new Ia.Ngn.Cl.Model.Telegram.Chat()
311: {
312: ImageId = ChatNameIdToLogoNameImageIdAndQrCodeImageIdDictionary["ofnChannelId"],
313: NameId = "ofnChannelId",
314: ChatId = ChatNameIdToChatIdDictionary["ofnChannelId"],
315: Name = NameText(frameworkArabicName),
316: Description = ChannelDescriptionText(frameworkArabicName),
317: Type = Ia.Ngn.Cl.Model.Telegram.Chat.ChatType.PrivateChannel,
318: RestrictedByFrameworkSite = false,
319: Framework = framework
320: });
321:
322:
323: // groups: framework site restricted
324: foreach (KeyValuePair<string, long> kvp in ChatNameIdToChatIdDictionary)
325: {
326: nameId = kvp.Key;
327: chatId = kvp.Value;
328:
329: frameworkList = (from f in Ia.Ngn.Cl.Model.Data.Administration.FrameworkList
330: where f.Type == "division" && f.Sites.Count > 0 && f.Sites.Any(u => nameId.ToUpper().Contains(u.Name))
331: select f).ToList(); // division: مراقبة
332:
333: chat = new Ia.Ngn.Cl.Model.Telegram.Chat();
334:
335: if (frameworkList.Count > 0)
336: {
337: foreach (var f in frameworkList)
338: {
339: chat = new Ia.Ngn.Cl.Model.Telegram.Chat()
340: {
341: ImageId = ChatNameIdToLogoNameImageIdAndQrCodeImageIdDictionary[nameId],
342: NameId = nameId,
343: ChatId = chatId,
344: Name = NameText(f.ArabicName),
345: Description = DescriptionText(f.ArabicName),
346: Type = Ia.Ngn.Cl.Model.Telegram.Chat.ChatType.PrivateGroup,
347: RestrictedByFrameworkSite = true,
348: Framework = f
349: };
350: }
351:
352: list.Add(chat);
353: }
354: else
355: {
356: }
357: }
358:
359: return list;
360: }
361:
362: ////////////////////////////////////////////////////////////////////////////
363:
364: /// <summary>
365: ///
366: /// </summary>
367: private static string NameText(string frameworkArabicName)
368: {
369: var text = frameworkArabicName + ": موظفي وفنيي التواصل مع شبكة الألياف الضوئية";
370:
371: return text;
372: }
373:
374: ////////////////////////////////////////////////////////////////////////////
375:
376: /// <summary>
377: ///
378: /// </summary>
379: private static string DescriptionText(string frameworkArabicName)
380: {
381: var text = @"هذه مجموعة تيليجرام الخاصة بموظفي وفنيي " + frameworkArabicName + @" للتواصل مع خادم (سيرفر) إدارة شبكة الألياف الضوئية. للحصول على معلومات وقوائم تصليح، تراسَل مع المستخدم @" + Ia.Ngn.Cl.Model.Telegram.Chat.OfnUserBotNameId + @" معك في هذه المجموعة وسيرد عليك بالمعلومات المطلوبة.";
382:
383: return text;
384: }
385:
386: ////////////////////////////////////////////////////////////////////////////
387:
388: /// <summary>
389: ///
390: /// </summary>
391: private static string ChannelDescriptionText(string frameworkArabicName)
392: {
393: var text = @"هذه قناة تيليجرام الخاصة بموظفي وفنيي " + frameworkArabicName + @" لاستلام إشعارات خادم (سيرفر) إدارة شبكة الألياف الضوئية. للحصول على معلومات وقوائم تصليح، تراسَل مع المستخدم @" + Ia.Ngn.Cl.Model.Telegram.Chat.OfnUserBotNameId + @" معك في هذه المجموعة وسيرد عليك بالمعلومات المطلوبة.";
394:
395: return text;
396: }
397:
398: ////////////////////////////////////////////////////////////////////////////
399:
400: /// <summary>
401: ///
402: /// </summary>
403: public static Dictionary<string, long> ChatNameIdToChatIdDictionary
404: {
405: get
406: {
407: return new Dictionary<string, long>
408: {
409: ["ofnChannelId"] = -1001223248678,
410: ["ofnGroupId"] = -1001489353952,// - 261107707,
411:
412: // مراقبات الادارة
413: ["ofnItGroupId"] = -606519699,
414: ["ofnServiceGroupId"] = -456397807,
415: ["ofnOperationGroupId"] = -653210251,
416: ["ofnSupportGroupId"] = -648835158,
417:
418: ["ofnSurGroupId"] = -1001248403784, //- 270294758,
419: ["ofnSkbGroupId"] = -294568632,
420: ["ofnSlbGroupId"] = -391495618,
421: ["ofnQrnGroupId"] = -320056533,
422: ["ofnMsfGroupId"] = -1001235014246, //- 376519373,
423: ["ofnRslGroupId"] = -370905362,
424: ["ofnJlsGroupId"] = -389361722,
425: ["ofnArdGroupId"] = -377650856,
426: ["ofnRkkGroupId"] = -321982802,
427: ["ofnSbaGroupId"] = -353233683,
428: ["ofnMgfGroupId"] = -385099568,
429: ["ofnKhpGroupId"] = -193997759,
430: ["ofnKhrGroupId"] = -336590544,
431: ["ofnJhbGroupId"] = -261167826
432: };
433: }
434: }
435:
436: ////////////////////////////////////////////////////////////////////////////
437:
438: /// <summary>
439: ///
440: /// </summary>
441: public static Dictionary<string, int> ChatNameIdToLogoNameImageIdAndQrCodeImageIdDictionary
442: {
443: get
444: {
445: return new Dictionary<string, int>
446: {
447: ["ofnChannelId"] = 12,
448: ["ofnGroupId"] = 21,
449:
450: // مراقبات الادارة
451: ["ofnItGroupId"] = 20,
452: ["ofnServiceGroupId"] = 3,
453: ["ofnOperationGroupId"] = 8,
454: ["ofnSupportGroupId"] = 33,
455:
456: ["ofnSurGroupId"] = 1,
457: ["ofnSkbGroupId"] = 2,
458: ["ofnSlbGroupId"] = 30,
459: ["ofnQrnGroupId"] = 11,
460: ["ofnMsfGroupId"] = 8,
461: ["ofnRslGroupId"] = 3,
462: ["ofnJlsGroupId"] = 18,
463: ["ofnArdGroupId"] = 26,
464: ["ofnRkkGroupId"] = 33,
465: ["ofnSbaGroupId"] = 32,
466: ["ofnMgfGroupId"] = 24,
467: ["ofnRkkGroupId"] = 6,
468: ["ofnKhpGroupId"] = 10,
469: ["ofnKhrGroupId"] = 17,
470: ["ofnJhbGroupId"] = 20
471: };
472: }
473: }
474:
475: ////////////////////////////////////////////////////////////////////////////
476:
477: /// <summary>
478: ///
479: /// </summary>
480: public static Dictionary<string, string> ChatNameIdToInviteLinkUrlDictionary
481: {
482: get
483: {
484: return new Dictionary<string, string>
485: {
486: ["ofnChannelId"] = "AAAAAEjpSyZ67Ec6MO5_aA",
487: ["ofnGroupId"] = "EfaCvg-QL_vupSv7ZPE9LQ",
488:
489: // مراقبات الادارة
490: ["ofnItGroupId"] = "5toJDAjknBdhZmY0",
491: ["ofnServiceGroupId"] = "nbCOnl_im9Q1Zjg0",
492: ["ofnOperationGroupId"] = "33AbuBAefpE1YzA0",
493: ["ofnSupportGroupId"] = "KnINNjpSUPIyNjc0",
494:
495: ["ofnSurGroupId"] = "EfaCvkppIUjlz-XYvFjpTA",
496: ["ofnSkbGroupId"] = "EfaCvhGOwrjrcidLqUMK8g",
497: ["ofnSlbGroupId"] = "EfaCvhdVv8LeGFt4vAWGYQ",
498: ["ofnQrnGroupId"] = "EfaCvhMTrNUaYk2vYWm_nA",
499: ["ofnMsfGroupId"] = "EfaCvkmc0mb0D0zG05cGiw",
500: ["ofnRslGroupId"] = "EfaCvhYbkRI47_BrgPAduA",
501: ["ofnJlsGroupId"] = "EfaCvhc1MDqIKE7gN8sohw",
502: ["ofnArdGroupId"] = "EfaCvhaCfqj4aZuF2gC7vw",
503: ["ofnSbaGroupId"] = "EfaCvhUN6xNZF7FrzXhtTQ",
504: ["ofnMgfGroupId"] = "EfaCvhb0JzBdxp3ijYsY4Q",
505: ["ofnRkkGroupId"] = "EfaCvhMxEVLZ6nFfe2-pMw",
506: ["ofnKhpGroupId"] = "EfaCvguQK7_4V-ldpvau7w",
507: ["ofnKhrGroupId"] = "EfaCvhQP9tB9544rTJzhww",
508: ["ofnJhbGroupId"] = "EfaCvg-RGtKwNiEN7QA12g"
509: };
510: }
511: }
512: }
513:
514: ////////////////////////////////////////////////////////////////////////////
515: ////////////////////////////////////////////////////////////////////////////
516:
517:
518: ////////////////////////////////////////////////////////////////////////////
519:
520: /// <summary>
521: ///
522: /// </summary>
523: public class User
524: {
525: /// <summary/>
526: public int UserId { get; set; }
527: /// <summary/>
528: public List<Ia.Ngn.Cl.Model.Telegram.Chat> ChatList { get; set; }
529:
530: /// <summary/>
531: public bool IsRestrictedBySite
532: {
533: get
534: {
535: // a user is restricted by site if all his chats are restricted by site
536:
537: bool isRestrictedBySite;
538:
539: isRestrictedBySite = true;
540:
541: foreach (var c in this.ChatList)
542: {
543: isRestrictedBySite = isRestrictedBySite & c.RestrictedByFrameworkSite;
544: }
545:
546: return isRestrictedBySite;
547: }
548: }
549:
550: /// <summary/>
551: public Ia.Ngn.Cl.Model.Business.Administration.Framework Framework
552: {
553: get
554: {
555: // if a user is not restrected, framework will be null, otherwise I will take the first framework
556: Ia.Ngn.Cl.Model.Business.Administration.Framework framework;
557:
558: if (!this.IsRestrictedBySite) framework = null;
559: else
560: {
561: framework = (from c in this.ChatList select c.Framework).First();
562: }
563:
564: return framework;
565: }
566: }
567:
568: ////////////////////////////////////////////////////////////////////////////
569:
570: /// <summary>
571: ///
572: /// </summary>
573: public static List<Ia.Ngn.Cl.Model.Telegram.User> List()
574: {
575: int index;
576: User user;
577: List<int> list;
578: List<Ia.Ngn.Cl.Model.Telegram.User> userList;
579:
580: list = new List<int>();
581: userList = new List<Ia.Ngn.Cl.Model.Telegram.User>();
582:
583: foreach (var uccm in Ia.Ngn.Cl.Model.Telegram.UserIdChatIdChatMember.List())
584: {
585: if (!list.Contains(uccm.UserId))
586: {
587: list.Add(uccm.UserId);
588:
589: user = new Ia.Ngn.Cl.Model.Telegram.User();
590: user.ChatList = new List<Ia.Ngn.Cl.Model.Telegram.Chat>();
591:
592: user.UserId = uccm.UserId;
593: user.ChatList.Add(uccm.Chat);
594:
595: userList.Add(user);
596: }
597: else
598: {
599: index = userList.FindIndex(u => u.UserId == uccm.UserId);
600:
601: userList[index].ChatList.Add(uccm.Chat);
602: }
603: }
604:
605: return userList;
606: }
607:
608: ////////////////////////////////////////////////////////////////////////////
609:
610: /// <summary>
611: ///
612: /// </summary>
613: public static Ia.Ngn.Cl.Model.Telegram.User Read(TelegramBotClient telegramBotClient, int userId)
614: {
615: var user = (from u in Ia.Ngn.Cl.Model.Telegram.User.List() where u.UserId == userId select u).SingleOrDefault();
616:
617: if (user == null)
618: {
619: // update readings
620: Ia.Ngn.Cl.Model.Telegram.UserIdChatIdChatMember.UpdateAllChatListForUserId(telegramBotClient, userId);
621:
622: user = (from u in Ia.Ngn.Cl.Model.Telegram.User.List() where u.UserId == userId select u).SingleOrDefault();
623: }
624:
625: return user;
626: }
627:
628: ////////////////////////////////////////////////////////////////////////////
629: ////////////////////////////////////////////////////////////////////////////
630: }
631:
632: ////////////////////////////////////////////////////////////////////////////
633: ////////////////////////////////////////////////////////////////////////////
634:
635: /// <summary>
636: ///
637: /// </summary>
638: public class UserIdChatIdChatMember
639: {
640: private static List<UserIdChatIdChatMember> list = new List<UserIdChatIdChatMember>();
641:
642: /// <summary/>
643: public string Id { get; }
644: /// <summary/>
645: public int UserId { get; set; }
646: /// <summary/>
647: public long ChatId { get; set; }
648: /// <summary/>
649: public global::Telegram.Bot.Types.ChatMember ChatMember { get; set; }
650: /// <summary/>
651: public Ia.Ngn.Cl.Model.Telegram.Chat Chat { get; set; }
652:
653: ////////////////////////////////////////////////////////////////////////////
654:
655: /// <summary>
656: ///
657: /// </summary>
658: public UserIdChatIdChatMember(int userId, long chatId, global::Telegram.Bot.Types.ChatMember chatMember)
659: {
660: Id = userId + ":" + chatId;
661:
662: UserId = userId;
663: ChatId = chatId;
664: ChatMember = chatMember;
665:
666: Chat = (from c in Ia.Ngn.Cl.Model.Telegram.Chat.ChatList where c.ChatId == chatId select c).SingleOrDefault();
667: }
668:
669: ////////////////////////////////////////////////////////////////////////////
670:
671: /// <summary>
672: ///
673: /// </summary>
674: public static List<UserIdChatIdChatMember> List()
675: {
676: return list;
677: }
678:
679: ////////////////////////////////////////////////////////////////////////////
680:
681: /// <summary>
682: ///
683: /// </summary>
684: public static List<UserIdChatIdChatMember> List(int userId)
685: {
686: return (from l in list where l.UserId == userId select l).ToList();
687: }
688:
689: ////////////////////////////////////////////////////////////////////////////
690:
691: /// <summary>
692: ///
693: /// </summary>
694: public static List<UserIdChatIdChatMember> List(long chatId)
695: {
696: return (from l in list where l.ChatId == chatId select l).ToList();
697: }
698:
699: ////////////////////////////////////////////////////////////////////////////
700:
701: /// <summary>
702: ///
703: /// </summary>
704: public static UserIdChatIdChatMember List(int userId, long chatId)
705: {
706: return (from l in list where l.UserId == userId && l.ChatId == chatId select l).SingleOrDefault();
707: }
708:
709: ////////////////////////////////////////////////////////////////////////////
710:
711: /// <summary>
712: ///
713: /// </summary>
714: public static bool UpdateAllChatListForUserId(TelegramBotClient telegramBotClient, int userId)
715: {
716: bool isUpdated;
717: long chatId;
718: global::Telegram.Bot.Types.ChatMember chatMember;
719:
720: isUpdated = false;
721:
722: foreach (KeyValuePair<string, long> kvp in Ia.Ngn.Cl.Model.Telegram.Chat.ChatNameIdToChatIdDictionary)
723: {
724: chatId = kvp.Value;
725:
726: if (chatId != 0)
727: {
728: try
729: {
730: chatMember = telegramBotClient.GetChatMemberAsync(chatId, userId).Result;
731:
732: // chatMember.Status == ChatMemberStatus.Left is added due to a bug in Telegram I guess.
733: if (chatMember.Status == ChatMemberStatus.Creator || chatMember.Status == ChatMemberStatus.Administrator || chatMember.Status == ChatMemberStatus.Member || chatMember.Status == ChatMemberStatus.Left)
734: isUpdated = isUpdated | Update(userId, chatId, chatMember);
735: }
736: catch (Exception e)
737: {
738: }
739: }
740: }
741:
742: return isUpdated;
743: }
744:
745: ////////////////////////////////////////////////////////////////////////////
746:
747: /// <summary>
748: ///
749: /// </summary>
750: public static bool Update(int userId, long chatId, global::Telegram.Bot.Types.ChatMember chatMember)
751: {
752: bool isUpdated;
753: int index;
754:
755: index = list.FindIndex(c => c.UserId == userId && c.ChatId == chatId);
756:
757: if (index >= 0)
758: {
759: if (list[index].ChatMember == chatMember)
760: {
761: isUpdated = false;
762: }
763: else
764: {
765: list[index].ChatMember = chatMember;
766:
767: list[index].Chat = (from c in Ia.Ngn.Cl.Model.Telegram.Chat.ChatList where c.ChatId == chatId select c).SingleOrDefault();
768:
769: isUpdated = true;
770: }
771: }
772: else
773: {
774: list.Add(new UserIdChatIdChatMember(userId, chatId, chatMember));
775:
776: isUpdated = true;
777: }
778:
779: return isUpdated;
780: }
781: }
782:
783: ////////////////////////////////////////////////////////////////////////////
784: ////////////////////////////////////////////////////////////////////////////
785: }