)>}]
شركة التطبيقات المتكاملة لتصميم وبرمجة البرمجيات الخاصة ش.ش.و.
Integrated Applications Programming Company
Home » Code Library » Chat (Ia.Ftn.Cl.Models.Telegram)

Public general use code classes and xml files that we've compiled and used over the years:

Telegram Chat/Group/User support class of Fixed Telecommunications Network (FTN) business and data model.

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