)>}]
شركة التطبيقات المتكاملة لتصميم وبرمجة البرمجيات الخاصة ش.ش.و.
Integrated Applications Programming Company
Skip Navigation Links

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

Telegram Chat/Group/User support class of Optical Fiber Network (OFN) 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 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: }